diff --git a/node_modules/cssesc/package.json b/node_modules/cssesc/package.json
new file mode 100644
index 0000000..076c84d
--- /dev/null
+++ b/node_modules/cssesc/package.json
@@ -0,0 +1,51 @@
+{
+ "name": "cssesc",
+ "version": "3.0.0",
+ "description": "A JavaScript library for escaping CSS strings and identifiers while generating the shortest possible ASCII-only output.",
+ "homepage": "https://mths.be/cssesc",
+ "engines": {
+ "node": ">=4"
+ },
+ "main": "cssesc.js",
+ "bin": "bin/cssesc",
+ "man": "man/cssesc.1",
+ "keywords": [
+ "css",
+ "escape",
+ "identifier",
+ "string",
+ "tool"
+ ],
+ "license": "MIT",
+ "author": {
+ "name": "Mathias Bynens",
+ "url": "https://mathiasbynens.be/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/mathiasbynens/cssesc.git"
+ },
+ "bugs": "https://github.com/mathiasbynens/cssesc/issues",
+ "files": [
+ "LICENSE-MIT.txt",
+ "cssesc.js",
+ "bin/",
+ "man/"
+ ],
+ "scripts": {
+ "build": "grunt template && babel cssesc.js -o cssesc.js",
+ "test": "mocha tests",
+ "cover": "istanbul cover --report html node_modules/.bin/_mocha tests -- -u exports -R spec"
+ },
+ "devDependencies": {
+ "babel-cli": "^6.26.0",
+ "babel-preset-env": "^1.6.1",
+ "codecov": "^1.0.1",
+ "grunt": "^1.0.1",
+ "grunt-template": "^1.0.0",
+ "istanbul": "^0.4.4",
+ "mocha": "^2.5.3",
+ "regenerate": "^1.2.1",
+ "requirejs": "^2.1.16"
+ }
+}
diff --git a/node_modules/didyoumean/LICENSE b/node_modules/didyoumean/LICENSE
new file mode 100644
index 0000000..32c23db
--- /dev/null
+++ b/node_modules/didyoumean/LICENSE
@@ -0,0 +1,14 @@
+## License
+
+didYouMean.js copyright (c) 2013 Dave Porter.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License
+[here](http://www.apache.org/licenses/LICENSE-2.0).
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/node_modules/didyoumean/README.md b/node_modules/didyoumean/README.md
new file mode 100644
index 0000000..cd16698
--- /dev/null
+++ b/node_modules/didyoumean/README.md
@@ -0,0 +1,134 @@
+didYouMean.js - A simple JavaScript matching engine
+===================================================
+
+[Available on GitHub](https://github.com/dcporter/didyoumean.js).
+
+A super-simple, highly optimized JS library for matching human-quality input to a list of potential
+matches. You can use it to suggest a misspelled command-line utility option to a user, or to offer
+links to nearby valid URLs on your 404 page. (The examples below are taken from a personal project,
+my [HTML5 business card](http://dcporter.aws.af.cm/me), which uses didYouMean.js to suggest correct
+URLs from misspelled ones, such as [dcporter.aws.af.cm/me/instagarm](http://dcporter.aws.af.cm/me/instagarm).)
+Uses the [Levenshtein distance algorithm](https://en.wikipedia.org/wiki/Levenshtein_distance).
+
+didYouMean.js works in the browser as well as in node.js. To install it for use in node:
+
+```
+npm install didyoumean
+```
+
+
+Examples
+--------
+
+Matching against a list of strings:
+```
+var input = 'insargrm'
+var list = ['facebook', 'twitter', 'instagram', 'linkedin'];
+console.log(didYouMean(input, list));
+> 'instagram'
+// The method matches 'insargrm' to 'instagram'.
+
+input = 'google plus';
+console.log(didYouMean(input, list));
+> null
+// The method was unable to find 'google plus' in the list of options.
+```
+
+Matching against a list of objects:
+```
+var input = 'insargrm';
+var list = [ { id: 'facebook' }, { id: 'twitter' }, { id: 'instagram' }, { id: 'linkedin' } ];
+var key = 'id';
+console.log(didYouMean(input, list, key));
+> 'instagram'
+// The method returns the matching value.
+
+didYouMean.returnWinningObject = true;
+console.log(didYouMean(input, list, key));
+> { id: 'instagram' }
+// The method returns the matching object.
+```
+
+
+didYouMean(str, list, [key])
+----------------------------
+
+- str: The string input to match.
+- list: An array of strings or objects to match against.
+- key (OPTIONAL): If your list array contains objects, you must specify the key which contains the string
+ to match against.
+
+Returns: the closest matching string, or null if no strings exceed the threshold.
+
+
+Options
+-------
+
+Options are set on the didYouMean function object. You may change them at any time.
+
+### threshold
+
+ By default, the method will only return strings whose edit distance is less than 40% (0.4x) of their length.
+ For example, if a ten-letter string is five edits away from its nearest match, the method will return null.
+
+ You can control this by setting the "threshold" value on the didYouMean function. For example, to set the
+ edit distance threshold to 50% of the input string's length:
+
+ ```
+ didYouMean.threshold = 0.5;
+ ```
+
+ To return the nearest match no matter the threshold, set this value to null.
+
+### thresholdAbsolute
+
+ This option behaves the same as threshold, but instead takes an integer number of edit steps. For example,
+ if thresholdAbsolute is set to 20 (the default), then the method will only return strings whose edit distance
+ is less than 20. Both options apply.
+
+### caseSensitive
+
+ By default, the method will perform case-insensitive comparisons. If you wish to force case sensitivity, set
+ the "caseSensitive" value to true:
+
+ ```
+ didYouMean.caseSensitive = true;
+ ```
+
+### nullResultValue
+
+ By default, the method will return null if there is no sufficiently close match. You can change this value here.
+
+### returnWinningObject
+
+ By default, the method will return the winning string value (if any). If your list contains objects rather
+ than strings, you may set returnWinningObject to true.
+
+ ```
+ didYouMean.returnWinningObject = true;
+ ```
+
+ This option has no effect on lists of strings.
+
+### returnFirstMatch
+
+ By default, the method will search all values and return the closest match. If you're simply looking for a "good-
+ enough" match, you can set your thresholds appropriately and set returnFirstMatch to true to substantially speed
+ things up.
+
+
+License
+-------
+
+didYouMean copyright (c) 2013-2014 Dave Porter.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License
+[here](http://www.apache.org/licenses/LICENSE-2.0).
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/node_modules/didyoumean/didYouMean-1.2.1.js b/node_modules/didyoumean/didYouMean-1.2.1.js
new file mode 100644
index 0000000..febb30e
--- /dev/null
+++ b/node_modules/didyoumean/didYouMean-1.2.1.js
@@ -0,0 +1,274 @@
+/*
+
+didYouMean.js - A simple JavaScript matching engine
+===================================================
+
+[Available on GitHub](https://github.com/dcporter/didyoumean.js).
+
+A super-simple, highly optimized JS library for matching human-quality input to a list of potential
+matches. You can use it to suggest a misspelled command-line utility option to a user, or to offer
+links to nearby valid URLs on your 404 page. (The examples below are taken from a personal project,
+my [HTML5 business card](http://dcporter.aws.af.cm/me), which uses didYouMean.js to suggest correct
+URLs from misspelled ones, such as [dcporter.aws.af.cm/me/instagarm](http://dcporter.aws.af.cm/me/instagarm).)
+Uses the [Levenshtein distance algorithm](https://en.wikipedia.org/wiki/Levenshtein_distance).
+
+didYouMean.js works in the browser as well as in node.js. To install it for use in node:
+
+```
+npm install didyoumean
+```
+
+
+Examples
+--------
+
+Matching against a list of strings:
+```
+var input = 'insargrm'
+var list = ['facebook', 'twitter', 'instagram', 'linkedin'];
+console.log(didYouMean(input, list));
+> 'instagram'
+// The method matches 'insargrm' to 'instagram'.
+
+input = 'google plus';
+console.log(didYouMean(input, list));
+> null
+// The method was unable to find 'google plus' in the list of options.
+```
+
+Matching against a list of objects:
+```
+var input = 'insargrm';
+var list = [ { id: 'facebook' }, { id: 'twitter' }, { id: 'instagram' }, { id: 'linkedin' } ];
+var key = 'id';
+console.log(didYouMean(input, list, key));
+> 'instagram'
+// The method returns the matching value.
+
+didYouMean.returnWinningObject = true;
+console.log(didYouMean(input, list, key));
+> { id: 'instagram' }
+// The method returns the matching object.
+```
+
+
+didYouMean(str, list, [key])
+----------------------------
+
+- str: The string input to match.
+- list: An array of strings or objects to match against.
+- key (OPTIONAL): If your list array contains objects, you must specify the key which contains the string
+ to match against.
+
+Returns: the closest matching string, or null if no strings exceed the threshold.
+
+
+Options
+-------
+
+Options are set on the didYouMean function object. You may change them at any time.
+
+### threshold
+
+ By default, the method will only return strings whose edit distance is less than 40% (0.4x) of their length.
+ For example, if a ten-letter string is five edits away from its nearest match, the method will return null.
+
+ You can control this by setting the "threshold" value on the didYouMean function. For example, to set the
+ edit distance threshold to 50% of the input string's length:
+
+ ```
+ didYouMean.threshold = 0.5;
+ ```
+
+ To return the nearest match no matter the threshold, set this value to null.
+
+### thresholdAbsolute
+
+ This option behaves the same as threshold, but instead takes an integer number of edit steps. For example,
+ if thresholdAbsolute is set to 20 (the default), then the method will only return strings whose edit distance
+ is less than 20. Both options apply.
+
+### caseSensitive
+
+ By default, the method will perform case-insensitive comparisons. If you wish to force case sensitivity, set
+ the "caseSensitive" value to true:
+
+ ```
+ didYouMean.caseSensitive = true;
+ ```
+
+### nullResultValue
+
+ By default, the method will return null if there is no sufficiently close match. You can change this value here.
+
+### returnWinningObject
+
+ By default, the method will return the winning string value (if any). If your list contains objects rather
+ than strings, you may set returnWinningObject to true.
+
+ ```
+ didYouMean.returnWinningObject = true;
+ ```
+
+ This option has no effect on lists of strings.
+
+### returnFirstMatch
+
+ By default, the method will search all values and return the closest match. If you're simply looking for a "good-
+ enough" match, you can set your thresholds appropriately and set returnFirstMatch to true to substantially speed
+ things up.
+
+
+License
+-------
+
+didYouMean copyright (c) 2013-2014 Dave Porter.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License
+[here](http://www.apache.org/licenses/LICENSE-2.0).
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+*/
+(function() {
+ "use strict";
+
+ // The didYouMean method.
+ function didYouMean(str, list, key) {
+ if (!str) return null;
+
+ // If we're running a case-insensitive search, smallify str.
+ if (!didYouMean.caseSensitive) { str = str.toLowerCase(); }
+
+ // Calculate the initial value (the threshold) if present.
+ var thresholdRelative = didYouMean.threshold === null ? null : didYouMean.threshold * str.length,
+ thresholdAbsolute = didYouMean.thresholdAbsolute,
+ winningVal;
+ if (thresholdRelative !== null && thresholdAbsolute !== null) winningVal = Math.min(thresholdRelative, thresholdAbsolute);
+ else if (thresholdRelative !== null) winningVal = thresholdRelative;
+ else if (thresholdAbsolute !== null) winningVal = thresholdAbsolute;
+ else winningVal = null;
+
+ // Get the edit distance to each option. If the closest one is less than 40% (by default) of str's length,
+ // then return it.
+ var winner, candidate, testCandidate, val,
+ i, len = list.length;
+ for (i = 0; i < len; i++) {
+ // Get item.
+ candidate = list[i];
+ // If there's a key, get the candidate value out of the object.
+ if (key) { candidate = candidate[key]; }
+ // Gatekeep.
+ if (!candidate) { continue; }
+ // If we're running a case-insensitive search, smallify the candidate.
+ if (!didYouMean.caseSensitive) { testCandidate = candidate.toLowerCase(); }
+ else { testCandidate = candidate; }
+ // Get and compare edit distance.
+ val = getEditDistance(str, testCandidate, winningVal);
+ // If this value is smaller than our current winning value, OR if we have no winning val yet (i.e. the
+ // threshold option is set to null, meaning the caller wants a match back no matter how bad it is), then
+ // this is our new winner.
+ if (winningVal === null || val < winningVal) {
+ winningVal = val;
+ // Set the winner to either the value or its object, depending on the returnWinningObject option.
+ if (key && didYouMean.returnWinningObject) winner = list[i];
+ else winner = candidate;
+ // If we're returning the first match, return it now.
+ if (didYouMean.returnFirstMatch) return winner;
+ }
+ }
+
+ // If we have a winner, return it.
+ return winner || didYouMean.nullResultValue;
+ }
+
+ // Set default options.
+ didYouMean.threshold = 0.4;
+ didYouMean.thresholdAbsolute = 20;
+ didYouMean.caseSensitive = false;
+ didYouMean.nullResultValue = null;
+ didYouMean.returnWinningObject = null;
+ didYouMean.returnFirstMatch = false;
+
+ // Expose.
+ // In node...
+ if (typeof module !== 'undefined' && module.exports) {
+ module.exports = didYouMean;
+ }
+ // Otherwise...
+ else {
+ window.didYouMean = didYouMean;
+ }
+
+ var MAX_INT = Math.pow(2,32) - 1; // We could probably go higher than this, but for practical reasons let's not.
+ function getEditDistance(a, b, max) {
+ // Handle null or undefined max.
+ max = max || max === 0 ? max : MAX_INT;
+
+ var lena = a.length;
+ var lenb = b.length;
+
+ // Fast path - no A or B.
+ if (lena === 0) return Math.min(max + 1, lenb);
+ if (lenb === 0) return Math.min(max + 1, lena);
+
+ // Fast path - length diff larger than max.
+ if (Math.abs(lena - lenb) > max) return max + 1;
+
+ // Slow path.
+ var matrix = [],
+ i, j, colMin, minJ, maxJ;
+
+ // Set up the first row ([0, 1, 2, 3, etc]).
+ for (i = 0; i <= lenb; i++) { matrix[i] = [i]; }
+
+ // Set up the first column (same).
+ for (j = 0; j <= lena; j++) { matrix[0][j] = j; }
+
+ // Loop over the rest of the columns.
+ for (i = 1; i <= lenb; i++) {
+ colMin = MAX_INT;
+ minJ = 1;
+ if (i > max) minJ = i - max;
+ maxJ = lenb + 1;
+ if (maxJ > max + i) maxJ = max + i;
+ // Loop over the rest of the rows.
+ for (j = 1; j <= lena; j++) {
+ // If j is out of bounds, just put a large value in the slot.
+ if (j < minJ || j > maxJ) {
+ matrix[i][j] = max + 1;
+ }
+
+ // Otherwise do the normal Levenshtein thing.
+ else {
+ // If the characters are the same, there's no change in edit distance.
+ if (b.charAt(i - 1) === a.charAt(j - 1)) {
+ matrix[i][j] = matrix[i - 1][j - 1];
+ }
+ // Otherwise, see if we're substituting, inserting or deleting.
+ else {
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // Substitute
+ Math.min(matrix[i][j - 1] + 1, // Insert
+ matrix[i - 1][j] + 1)); // Delete
+ }
+ }
+
+ // Either way, update colMin.
+ if (matrix[i][j] < colMin) colMin = matrix[i][j];
+ }
+
+ // If this column's minimum is greater than the allowed maximum, there's no point
+ // in going on with life.
+ if (colMin > max) return max + 1;
+ }
+ // If we made it this far without running into the max, then return the final matrix value.
+ return matrix[lenb][lena];
+ }
+
+})();
diff --git a/node_modules/didyoumean/didYouMean-1.2.1.min.js b/node_modules/didyoumean/didYouMean-1.2.1.min.js
new file mode 100644
index 0000000..c41abd8
--- /dev/null
+++ b/node_modules/didyoumean/didYouMean-1.2.1.min.js
@@ -0,0 +1,17 @@
+/*
+ didYouMean.js copyright (c) 2013-2014 Dave Porter.
+
+ [Available on GitHub](https://github.com/dcporter/didyoumean.js).
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License
+ [here](http://www.apache.org/licenses/LICENSE-2.0).
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+(function(){"use strict";function e(t,r,i){if(!t)return null;if(!e.caseSensitive){t=t.toLowerCase()}var s=e.threshold===null?null:e.threshold*t.length,o=e.thresholdAbsolute,u;if(s!==null&&o!==null)u=Math.min(s,o);else if(s!==null)u=s;else if(o!==null)u=o;else u=null;var a,f,l,c,h,p=r.length;for(h=0;hr)return r+1;var o=[],u,a,f,l,c;for(u=0;u<=s;u++){o[u]=[u]}for(a=0;a<=i;a++){o[0][a]=a}for(u=1;u<=s;u++){f=t;l=1;if(u>r)l=u-r;c=s+1;if(c>r+u)c=r+u;for(a=1;a<=i;a++){if(ac){o[u][a]=r+1}else{if(n.charAt(u-1)===e.charAt(a-1)){o[u][a]=o[u-1][a-1]}else{o[u][a]=Math.min(o[u-1][a-1]+1,Math.min(o[u][a-1]+1,o[u-1][a]+1))}}if(o[u][a]r)return r+1}return o[s][i]}e.threshold=.4;e.thresholdAbsolute=20;e.caseSensitive=false;e.nullResultValue=null;e.returnWinningObject=null;e.returnFirstMatch=false;if(typeof module!=="undefined"&&module.exports){module.exports=e}else{window.didYouMean=e}var t=Math.pow(2,32)-1})();
\ No newline at end of file
diff --git a/node_modules/didyoumean/package.json b/node_modules/didyoumean/package.json
new file mode 100644
index 0000000..1301d03
--- /dev/null
+++ b/node_modules/didyoumean/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "didyoumean",
+ "version": "1.2.2",
+ "description": "Match human-quality input to potential matches by edit distance.",
+ "homepage": "https://github.com/dcporter/didyoumean.js",
+ "author": {
+ "name": "Dave Porter",
+ "email": "dcporter@gmail.com",
+ "url": "http://dcporter.net/"
+ },
+ "keywords": [
+ "didyoumean",
+ "mean",
+ "edit",
+ "distance",
+ "levenshtein"
+ ],
+ "main": "./didYouMean-1.2.1.js",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/dcporter/didyoumean.js.git"
+ },
+ "bugs": {
+ "url": "https://github.com/dcporter/didyoumean.js/issues"
+ },
+ "license": "Apache-2.0"
+}
diff --git a/node_modules/dlv/README.md b/node_modules/dlv/README.md
new file mode 100644
index 0000000..6a8429d
--- /dev/null
+++ b/node_modules/dlv/README.md
@@ -0,0 +1,76 @@
+# `dlv(obj, keypath)` [](https://npmjs.com/package/dlv) [](https://travis-ci.org/developit/dlv)
+
+> Safely get a dot-notated path within a nested object, with ability to return a default if the full key path does not exist or the value is undefined
+
+
+### Why?
+
+Smallest possible implementation: only **130 bytes.**
+
+You could write this yourself, but then you'd have to write [tests].
+
+Supports ES Modules, CommonJS and globals.
+
+
+### Installation
+
+`npm install --save dlv`
+
+
+### Usage
+
+`delve(object, keypath, [default])`
+
+```js
+import delve from 'dlv';
+
+let obj = {
+ a: {
+ b: {
+ c: 1,
+ d: undefined,
+ e: null
+ }
+ }
+};
+
+//use string dot notation for keys
+delve(obj, 'a.b.c') === 1;
+
+//or use an array key
+delve(obj, ['a', 'b', 'c']) === 1;
+
+delve(obj, 'a.b') === obj.a.b;
+
+//returns undefined if the full key path does not exist and no default is specified
+delve(obj, 'a.b.f') === undefined;
+
+//optional third parameter for default if the full key in path is missing
+delve(obj, 'a.b.f', 'foo') === 'foo';
+
+//or if the key exists but the value is undefined
+delve(obj, 'a.b.d', 'foo') === 'foo';
+
+//Non-truthy defined values are still returned if they exist at the full keypath
+delve(obj, 'a.b.e', 'foo') === null;
+
+//undefined obj or key returns undefined, unless a default is supplied
+delve(undefined, 'a.b.c') === undefined;
+delve(undefined, 'a.b.c', 'foo') === 'foo';
+delve(obj, undefined, 'foo') === 'foo';
+```
+
+
+### Setter Counterparts
+
+- [dset](https://github.com/lukeed/dset) by [@lukeed](https://github.com/lukeed) is the spiritual "set" counterpart of `dlv` and very fast.
+- [bury](https://github.com/kalmbach/bury) by [@kalmbach](https://github.com/kalmbach) does the opposite of `dlv` and is implemented in a very similar manner.
+
+
+### License
+
+[MIT](https://oss.ninja/mit/developit/)
+
+
+[preact]: https://github.com/developit/preact
+[tests]: https://github.com/developit/dlv/blob/master/test.js
diff --git a/node_modules/dlv/index.js b/node_modules/dlv/index.js
new file mode 100644
index 0000000..5d21277
--- /dev/null
+++ b/node_modules/dlv/index.js
@@ -0,0 +1,7 @@
+export default function dlv(obj, key, def, p, undef) {
+ key = key.split ? key.split('.') : key;
+ for (p = 0; p < key.length; p++) {
+ obj = obj ? obj[key[p]] : undef;
+ }
+ return obj === undef ? def : obj;
+}
diff --git a/node_modules/dlv/package.json b/node_modules/dlv/package.json
new file mode 100644
index 0000000..0aaeb6f
--- /dev/null
+++ b/node_modules/dlv/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "dlv",
+ "version": "1.1.3",
+ "description": "Safely get a dot-notated property within an object.",
+ "main": "dist/dlv.js",
+ "browser": "dist/dlv.umd.js",
+ "module": "dist/dlv.es.js",
+ "scripts": {
+ "dev": "microbundle watch",
+ "build": "microbundle",
+ "prepublish": "npm run build",
+ "test": "node test",
+ "release": "npm run build && npm test && git commit -am $npm_package_version && git tag $npm_package_version && git push && git push --tags && npm publish"
+ },
+ "keywords": [
+ "delve",
+ "dot notation",
+ "dot"
+ ],
+ "files": [
+ "index.js",
+ "dist"
+ ],
+ "author": "Jason Miller (http://jasonformat.com)",
+ "repository": "developit/dlv",
+ "license": "MIT",
+ "devDependencies": {
+ "microbundle": "^0.11.0"
+ }
+}
diff --git a/node_modules/eastasianwidth/README.md b/node_modules/eastasianwidth/README.md
new file mode 100644
index 0000000..a8b71ee
--- /dev/null
+++ b/node_modules/eastasianwidth/README.md
@@ -0,0 +1,32 @@
+# East Asian Width
+
+Get [East Asian Width](http://www.unicode.org/reports/tr11/) from a character.
+
+'F'(Fullwidth), 'H'(Halfwidth), 'W'(Wide), 'Na'(Narrow), 'A'(Ambiguous) or 'N'(Natural).
+
+Original Code is [東アジアの文字幅 (East Asian Width) の判定 - 中途](http://d.hatena.ne.jp/takenspc/20111126#1322252878).
+
+## Install
+
+ $ npm install eastasianwidth
+
+## Usage
+
+ var eaw = require('eastasianwidth');
+ console.log(eaw.eastAsianWidth('₩')) // 'F'
+ console.log(eaw.eastAsianWidth('。')) // 'H'
+ console.log(eaw.eastAsianWidth('뀀')) // 'W'
+ console.log(eaw.eastAsianWidth('a')) // 'Na'
+ console.log(eaw.eastAsianWidth('①')) // 'A'
+ console.log(eaw.eastAsianWidth('ف')) // 'N'
+
+ console.log(eaw.characterLength('₩')) // 2
+ console.log(eaw.characterLength('。')) // 1
+ console.log(eaw.characterLength('뀀')) // 2
+ console.log(eaw.characterLength('a')) // 1
+ console.log(eaw.characterLength('①')) // 2
+ console.log(eaw.characterLength('ف')) // 1
+
+ console.log(eaw.length('あいうえお')) // 10
+ console.log(eaw.length('abcdefg')) // 7
+ console.log(eaw.length('¢₩。ᅵㄅ뀀¢⟭a⊙①بف')) // 19
diff --git a/node_modules/eastasianwidth/eastasianwidth.js b/node_modules/eastasianwidth/eastasianwidth.js
new file mode 100644
index 0000000..7d0aa0f
--- /dev/null
+++ b/node_modules/eastasianwidth/eastasianwidth.js
@@ -0,0 +1,311 @@
+var eaw = {};
+
+if ('undefined' == typeof module) {
+ window.eastasianwidth = eaw;
+} else {
+ module.exports = eaw;
+}
+
+eaw.eastAsianWidth = function(character) {
+ var x = character.charCodeAt(0);
+ var y = (character.length == 2) ? character.charCodeAt(1) : 0;
+ var codePoint = x;
+ if ((0xD800 <= x && x <= 0xDBFF) && (0xDC00 <= y && y <= 0xDFFF)) {
+ x &= 0x3FF;
+ y &= 0x3FF;
+ codePoint = (x << 10) | y;
+ codePoint += 0x10000;
+ }
+
+ if ((0x3000 == codePoint) ||
+ (0xFF01 <= codePoint && codePoint <= 0xFF60) ||
+ (0xFFE0 <= codePoint && codePoint <= 0xFFE6)) {
+ return 'F';
+ }
+ if ((0x20A9 == codePoint) ||
+ (0xFF61 <= codePoint && codePoint <= 0xFFBE) ||
+ (0xFFC2 <= codePoint && codePoint <= 0xFFC7) ||
+ (0xFFCA <= codePoint && codePoint <= 0xFFCF) ||
+ (0xFFD2 <= codePoint && codePoint <= 0xFFD7) ||
+ (0xFFDA <= codePoint && codePoint <= 0xFFDC) ||
+ (0xFFE8 <= codePoint && codePoint <= 0xFFEE)) {
+ return 'H';
+ }
+ if ((0x1100 <= codePoint && codePoint <= 0x115F) ||
+ (0x11A3 <= codePoint && codePoint <= 0x11A7) ||
+ (0x11FA <= codePoint && codePoint <= 0x11FF) ||
+ (0x2329 <= codePoint && codePoint <= 0x232A) ||
+ (0x2E80 <= codePoint && codePoint <= 0x2E99) ||
+ (0x2E9B <= codePoint && codePoint <= 0x2EF3) ||
+ (0x2F00 <= codePoint && codePoint <= 0x2FD5) ||
+ (0x2FF0 <= codePoint && codePoint <= 0x2FFB) ||
+ (0x3001 <= codePoint && codePoint <= 0x303E) ||
+ (0x3041 <= codePoint && codePoint <= 0x3096) ||
+ (0x3099 <= codePoint && codePoint <= 0x30FF) ||
+ (0x3105 <= codePoint && codePoint <= 0x312D) ||
+ (0x3131 <= codePoint && codePoint <= 0x318E) ||
+ (0x3190 <= codePoint && codePoint <= 0x31BA) ||
+ (0x31C0 <= codePoint && codePoint <= 0x31E3) ||
+ (0x31F0 <= codePoint && codePoint <= 0x321E) ||
+ (0x3220 <= codePoint && codePoint <= 0x3247) ||
+ (0x3250 <= codePoint && codePoint <= 0x32FE) ||
+ (0x3300 <= codePoint && codePoint <= 0x4DBF) ||
+ (0x4E00 <= codePoint && codePoint <= 0xA48C) ||
+ (0xA490 <= codePoint && codePoint <= 0xA4C6) ||
+ (0xA960 <= codePoint && codePoint <= 0xA97C) ||
+ (0xAC00 <= codePoint && codePoint <= 0xD7A3) ||
+ (0xD7B0 <= codePoint && codePoint <= 0xD7C6) ||
+ (0xD7CB <= codePoint && codePoint <= 0xD7FB) ||
+ (0xF900 <= codePoint && codePoint <= 0xFAFF) ||
+ (0xFE10 <= codePoint && codePoint <= 0xFE19) ||
+ (0xFE30 <= codePoint && codePoint <= 0xFE52) ||
+ (0xFE54 <= codePoint && codePoint <= 0xFE66) ||
+ (0xFE68 <= codePoint && codePoint <= 0xFE6B) ||
+ (0x1B000 <= codePoint && codePoint <= 0x1B001) ||
+ (0x1F200 <= codePoint && codePoint <= 0x1F202) ||
+ (0x1F210 <= codePoint && codePoint <= 0x1F23A) ||
+ (0x1F240 <= codePoint && codePoint <= 0x1F248) ||
+ (0x1F250 <= codePoint && codePoint <= 0x1F251) ||
+ (0x20000 <= codePoint && codePoint <= 0x2F73F) ||
+ (0x2B740 <= codePoint && codePoint <= 0x2FFFD) ||
+ (0x30000 <= codePoint && codePoint <= 0x3FFFD)) {
+ return 'W';
+ }
+ if ((0x0020 <= codePoint && codePoint <= 0x007E) ||
+ (0x00A2 <= codePoint && codePoint <= 0x00A3) ||
+ (0x00A5 <= codePoint && codePoint <= 0x00A6) ||
+ (0x00AC == codePoint) ||
+ (0x00AF == codePoint) ||
+ (0x27E6 <= codePoint && codePoint <= 0x27ED) ||
+ (0x2985 <= codePoint && codePoint <= 0x2986)) {
+ return 'Na';
+ }
+ if ((0x00A1 == codePoint) ||
+ (0x00A4 == codePoint) ||
+ (0x00A7 <= codePoint && codePoint <= 0x00A8) ||
+ (0x00AA == codePoint) ||
+ (0x00AD <= codePoint && codePoint <= 0x00AE) ||
+ (0x00B0 <= codePoint && codePoint <= 0x00B4) ||
+ (0x00B6 <= codePoint && codePoint <= 0x00BA) ||
+ (0x00BC <= codePoint && codePoint <= 0x00BF) ||
+ (0x00C6 == codePoint) ||
+ (0x00D0 == codePoint) ||
+ (0x00D7 <= codePoint && codePoint <= 0x00D8) ||
+ (0x00DE <= codePoint && codePoint <= 0x00E1) ||
+ (0x00E6 == codePoint) ||
+ (0x00E8 <= codePoint && codePoint <= 0x00EA) ||
+ (0x00EC <= codePoint && codePoint <= 0x00ED) ||
+ (0x00F0 == codePoint) ||
+ (0x00F2 <= codePoint && codePoint <= 0x00F3) ||
+ (0x00F7 <= codePoint && codePoint <= 0x00FA) ||
+ (0x00FC == codePoint) ||
+ (0x00FE == codePoint) ||
+ (0x0101 == codePoint) ||
+ (0x0111 == codePoint) ||
+ (0x0113 == codePoint) ||
+ (0x011B == codePoint) ||
+ (0x0126 <= codePoint && codePoint <= 0x0127) ||
+ (0x012B == codePoint) ||
+ (0x0131 <= codePoint && codePoint <= 0x0133) ||
+ (0x0138 == codePoint) ||
+ (0x013F <= codePoint && codePoint <= 0x0142) ||
+ (0x0144 == codePoint) ||
+ (0x0148 <= codePoint && codePoint <= 0x014B) ||
+ (0x014D == codePoint) ||
+ (0x0152 <= codePoint && codePoint <= 0x0153) ||
+ (0x0166 <= codePoint && codePoint <= 0x0167) ||
+ (0x016B == codePoint) ||
+ (0x01CE == codePoint) ||
+ (0x01D0 == codePoint) ||
+ (0x01D2 == codePoint) ||
+ (0x01D4 == codePoint) ||
+ (0x01D6 == codePoint) ||
+ (0x01D8 == codePoint) ||
+ (0x01DA == codePoint) ||
+ (0x01DC == codePoint) ||
+ (0x0251 == codePoint) ||
+ (0x0261 == codePoint) ||
+ (0x02C4 == codePoint) ||
+ (0x02C7 == codePoint) ||
+ (0x02C9 <= codePoint && codePoint <= 0x02CB) ||
+ (0x02CD == codePoint) ||
+ (0x02D0 == codePoint) ||
+ (0x02D8 <= codePoint && codePoint <= 0x02DB) ||
+ (0x02DD == codePoint) ||
+ (0x02DF == codePoint) ||
+ (0x0300 <= codePoint && codePoint <= 0x036F) ||
+ (0x0391 <= codePoint && codePoint <= 0x03A1) ||
+ (0x03A3 <= codePoint && codePoint <= 0x03A9) ||
+ (0x03B1 <= codePoint && codePoint <= 0x03C1) ||
+ (0x03C3 <= codePoint && codePoint <= 0x03C9) ||
+ (0x0401 == codePoint) ||
+ (0x0410 <= codePoint && codePoint <= 0x044F) ||
+ (0x0451 == codePoint) ||
+ (0x2010 == codePoint) ||
+ (0x2013 <= codePoint && codePoint <= 0x2016) ||
+ (0x2018 <= codePoint && codePoint <= 0x2019) ||
+ (0x201C <= codePoint && codePoint <= 0x201D) ||
+ (0x2020 <= codePoint && codePoint <= 0x2022) ||
+ (0x2024 <= codePoint && codePoint <= 0x2027) ||
+ (0x2030 == codePoint) ||
+ (0x2032 <= codePoint && codePoint <= 0x2033) ||
+ (0x2035 == codePoint) ||
+ (0x203B == codePoint) ||
+ (0x203E == codePoint) ||
+ (0x2074 == codePoint) ||
+ (0x207F == codePoint) ||
+ (0x2081 <= codePoint && codePoint <= 0x2084) ||
+ (0x20AC == codePoint) ||
+ (0x2103 == codePoint) ||
+ (0x2105 == codePoint) ||
+ (0x2109 == codePoint) ||
+ (0x2113 == codePoint) ||
+ (0x2116 == codePoint) ||
+ (0x2121 <= codePoint && codePoint <= 0x2122) ||
+ (0x2126 == codePoint) ||
+ (0x212B == codePoint) ||
+ (0x2153 <= codePoint && codePoint <= 0x2154) ||
+ (0x215B <= codePoint && codePoint <= 0x215E) ||
+ (0x2160 <= codePoint && codePoint <= 0x216B) ||
+ (0x2170 <= codePoint && codePoint <= 0x2179) ||
+ (0x2189 == codePoint) ||
+ (0x2190 <= codePoint && codePoint <= 0x2199) ||
+ (0x21B8 <= codePoint && codePoint <= 0x21B9) ||
+ (0x21D2 == codePoint) ||
+ (0x21D4 == codePoint) ||
+ (0x21E7 == codePoint) ||
+ (0x2200 == codePoint) ||
+ (0x2202 <= codePoint && codePoint <= 0x2203) ||
+ (0x2207 <= codePoint && codePoint <= 0x2208) ||
+ (0x220B == codePoint) ||
+ (0x220F == codePoint) ||
+ (0x2211 == codePoint) ||
+ (0x2215 == codePoint) ||
+ (0x221A == codePoint) ||
+ (0x221D <= codePoint && codePoint <= 0x2220) ||
+ (0x2223 == codePoint) ||
+ (0x2225 == codePoint) ||
+ (0x2227 <= codePoint && codePoint <= 0x222C) ||
+ (0x222E == codePoint) ||
+ (0x2234 <= codePoint && codePoint <= 0x2237) ||
+ (0x223C <= codePoint && codePoint <= 0x223D) ||
+ (0x2248 == codePoint) ||
+ (0x224C == codePoint) ||
+ (0x2252 == codePoint) ||
+ (0x2260 <= codePoint && codePoint <= 0x2261) ||
+ (0x2264 <= codePoint && codePoint <= 0x2267) ||
+ (0x226A <= codePoint && codePoint <= 0x226B) ||
+ (0x226E <= codePoint && codePoint <= 0x226F) ||
+ (0x2282 <= codePoint && codePoint <= 0x2283) ||
+ (0x2286 <= codePoint && codePoint <= 0x2287) ||
+ (0x2295 == codePoint) ||
+ (0x2299 == codePoint) ||
+ (0x22A5 == codePoint) ||
+ (0x22BF == codePoint) ||
+ (0x2312 == codePoint) ||
+ (0x2460 <= codePoint && codePoint <= 0x24E9) ||
+ (0x24EB <= codePoint && codePoint <= 0x254B) ||
+ (0x2550 <= codePoint && codePoint <= 0x2573) ||
+ (0x2580 <= codePoint && codePoint <= 0x258F) ||
+ (0x2592 <= codePoint && codePoint <= 0x2595) ||
+ (0x25A0 <= codePoint && codePoint <= 0x25A1) ||
+ (0x25A3 <= codePoint && codePoint <= 0x25A9) ||
+ (0x25B2 <= codePoint && codePoint <= 0x25B3) ||
+ (0x25B6 <= codePoint && codePoint <= 0x25B7) ||
+ (0x25BC <= codePoint && codePoint <= 0x25BD) ||
+ (0x25C0 <= codePoint && codePoint <= 0x25C1) ||
+ (0x25C6 <= codePoint && codePoint <= 0x25C8) ||
+ (0x25CB == codePoint) ||
+ (0x25CE <= codePoint && codePoint <= 0x25D1) ||
+ (0x25E2 <= codePoint && codePoint <= 0x25E5) ||
+ (0x25EF == codePoint) ||
+ (0x2605 <= codePoint && codePoint <= 0x2606) ||
+ (0x2609 == codePoint) ||
+ (0x260E <= codePoint && codePoint <= 0x260F) ||
+ (0x2614 <= codePoint && codePoint <= 0x2615) ||
+ (0x261C == codePoint) ||
+ (0x261E == codePoint) ||
+ (0x2640 == codePoint) ||
+ (0x2642 == codePoint) ||
+ (0x2660 <= codePoint && codePoint <= 0x2661) ||
+ (0x2663 <= codePoint && codePoint <= 0x2665) ||
+ (0x2667 <= codePoint && codePoint <= 0x266A) ||
+ (0x266C <= codePoint && codePoint <= 0x266D) ||
+ (0x266F == codePoint) ||
+ (0x269E <= codePoint && codePoint <= 0x269F) ||
+ (0x26BE <= codePoint && codePoint <= 0x26BF) ||
+ (0x26C4 <= codePoint && codePoint <= 0x26CD) ||
+ (0x26CF <= codePoint && codePoint <= 0x26E1) ||
+ (0x26E3 == codePoint) ||
+ (0x26E8 <= codePoint && codePoint <= 0x26FF) ||
+ (0x273D == codePoint) ||
+ (0x2757 == codePoint) ||
+ (0x2776 <= codePoint && codePoint <= 0x277F) ||
+ (0x2B55 <= codePoint && codePoint <= 0x2B59) ||
+ (0x3248 <= codePoint && codePoint <= 0x324F) ||
+ (0xE000 <= codePoint && codePoint <= 0xF8FF) ||
+ (0xFE00 <= codePoint && codePoint <= 0xFE0F) ||
+ (0xFFFD == codePoint) ||
+ (0x1F100 <= codePoint && codePoint <= 0x1F10A) ||
+ (0x1F110 <= codePoint && codePoint <= 0x1F12D) ||
+ (0x1F130 <= codePoint && codePoint <= 0x1F169) ||
+ (0x1F170 <= codePoint && codePoint <= 0x1F19A) ||
+ (0xE0100 <= codePoint && codePoint <= 0xE01EF) ||
+ (0xF0000 <= codePoint && codePoint <= 0xFFFFD) ||
+ (0x100000 <= codePoint && codePoint <= 0x10FFFD)) {
+ return 'A';
+ }
+
+ return 'N';
+};
+
+eaw.characterLength = function(character) {
+ var code = this.eastAsianWidth(character);
+ if (code == 'F' || code == 'W' || code == 'A') {
+ return 2;
+ } else {
+ return 1;
+ }
+};
+
+// Split a string considering surrogate-pairs.
+function stringToArray(string) {
+ return string.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g) || [];
+}
+
+eaw.length = function(string) {
+ var characters = stringToArray(string);
+ var len = 0;
+ for (var i = 0; i < characters.length; i++) {
+ len = len + this.characterLength(characters[i]);
+ }
+ return len;
+};
+
+eaw.slice = function(text, start, end) {
+ textLen = eaw.length(text)
+ start = start ? start : 0;
+ end = end ? end : 1;
+ if (start < 0) {
+ start = textLen + start;
+ }
+ if (end < 0) {
+ end = textLen + end;
+ }
+ var result = '';
+ var eawLen = 0;
+ var chars = stringToArray(text);
+ for (var i = 0; i < chars.length; i++) {
+ var char = chars[i];
+ var charLen = eaw.length(char);
+ if (eawLen >= start - (charLen == 2 ? 1 : 0)) {
+ if (eawLen + charLen <= end) {
+ result += char;
+ } else {
+ break;
+ }
+ }
+ eawLen += charLen;
+ }
+ return result;
+};
diff --git a/node_modules/eastasianwidth/package.json b/node_modules/eastasianwidth/package.json
new file mode 100644
index 0000000..cb7ac6a
--- /dev/null
+++ b/node_modules/eastasianwidth/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "eastasianwidth",
+ "version": "0.2.0",
+ "description": "Get East Asian Width from a character.",
+ "main": "eastasianwidth.js",
+ "files": [
+ "eastasianwidth.js"
+ ],
+ "scripts": {
+ "test": "mocha"
+ },
+ "repository": "git://github.com/komagata/eastasianwidth.git",
+ "author": "Masaki Komagata",
+ "license": "MIT",
+ "devDependencies": {
+ "mocha": "~1.9.0"
+ }
+}
diff --git a/node_modules/emoji-regex/LICENSE-MIT.txt b/node_modules/emoji-regex/LICENSE-MIT.txt
new file mode 100644
index 0000000..a41e0a7
--- /dev/null
+++ b/node_modules/emoji-regex/LICENSE-MIT.txt
@@ -0,0 +1,20 @@
+Copyright Mathias Bynens
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/emoji-regex/README.md b/node_modules/emoji-regex/README.md
new file mode 100644
index 0000000..6d63082
--- /dev/null
+++ b/node_modules/emoji-regex/README.md
@@ -0,0 +1,137 @@
+# emoji-regex [](https://travis-ci.org/mathiasbynens/emoji-regex)
+
+_emoji-regex_ offers a regular expression to match all emoji symbols and sequences (including textual representations of emoji) as per the Unicode Standard.
+
+This repository contains a script that generates this regular expression based on [Unicode data](https://github.com/node-unicode/node-unicode-data). Because of this, the regular expression can easily be updated whenever new emoji are added to the Unicode standard.
+
+## Installation
+
+Via [npm](https://www.npmjs.com/):
+
+```bash
+npm install emoji-regex
+```
+
+In [Node.js](https://nodejs.org/):
+
+```js
+const emojiRegex = require('emoji-regex/RGI_Emoji.js');
+// Note: because the regular expression has the global flag set, this module
+// exports a function that returns the regex rather than exporting the regular
+// expression itself, to make it impossible to (accidentally) mutate the
+// original regular expression.
+
+const text = `
+\u{231A}: ⌚ default emoji presentation character (Emoji_Presentation)
+\u{2194}\u{FE0F}: ↔️ default text presentation character rendered as emoji
+\u{1F469}: 👩 emoji modifier base (Emoji_Modifier_Base)
+\u{1F469}\u{1F3FF}: 👩🏿 emoji modifier base followed by a modifier
+`;
+
+const regex = emojiRegex();
+let match;
+while (match = regex.exec(text)) {
+ const emoji = match[0];
+ console.log(`Matched sequence ${ emoji } — code points: ${ [...emoji].length }`);
+}
+```
+
+Console output:
+
+```
+Matched sequence ⌚ — code points: 1
+Matched sequence ⌚ — code points: 1
+Matched sequence ↔️ — code points: 2
+Matched sequence ↔️ — code points: 2
+Matched sequence 👩 — code points: 1
+Matched sequence 👩 — code points: 1
+Matched sequence 👩🏿 — code points: 2
+Matched sequence 👩🏿 — code points: 2
+```
+
+## Regular expression flavors
+
+The package comes with three distinct regular expressions:
+
+```js
+// This is the recommended regular expression to use. It matches all
+// emoji recommended for general interchange, as defined via the
+// `RGI_Emoji` property in the Unicode Standard.
+// https://unicode.org/reports/tr51/#def_rgi_set
+// When in doubt, use this!
+const emojiRegexRGI = require('emoji-regex/RGI_Emoji.js');
+
+// This is the old regular expression, prior to `RGI_Emoji` being
+// standardized. In addition to all `RGI_Emoji` sequences, it matches
+// some emoji you probably don’t want to match (such as emoji component
+// symbols that are not meant to be used separately).
+const emojiRegex = require('emoji-regex/index.js');
+
+// This regular expression matches even more emoji than the previous
+// one, including emoji that render as text instead of icons (i.e.
+// emoji that are not `Emoji_Presentation` symbols and that aren’t
+// forced to render as emoji by a variation selector).
+const emojiRegexText = require('emoji-regex/text.js');
+```
+
+Additionally, in environments which support ES2015 Unicode escapes, you may `require` ES2015-style versions of the regexes:
+
+```js
+const emojiRegexRGI = require('emoji-regex/es2015/RGI_Emoji.js');
+const emojiRegex = require('emoji-regex/es2015/index.js');
+const emojiRegexText = require('emoji-regex/es2015/text.js');
+```
+
+## For maintainers
+
+### How to update emoji-regex after new Unicode Standard releases
+
+1. Update the Unicode data dependency in `package.json` by running the following commands:
+
+ ```sh
+ # Example: updating from Unicode v12 to Unicode v13.
+ npm uninstall @unicode/unicode-12.0.0
+ npm install @unicode/unicode-13.0.0 --save-dev
+ ````
+
+1. Generate the new output:
+
+ ```sh
+ npm run build
+ ```
+
+1. Verify that tests still pass:
+
+ ```sh
+ npm test
+ ```
+
+1. Send a pull request with the changes, and get it reviewed & merged.
+
+1. On the `main` branch, bump the emoji-regex version number in `package.json`:
+
+ ```sh
+ npm version patch -m 'Release v%s'
+ ```
+
+ Instead of `patch`, use `minor` or `major` [as needed](https://semver.org/).
+
+ Note that this produces a Git commit + tag.
+
+1. Push the release commit and tag:
+
+ ```sh
+ git push
+ ```
+
+ Our CI then automatically publishes the new release to npm.
+
+## Author
+
+| [](https://twitter.com/mathias "Follow @mathias on Twitter") |
+|---|
+| [Mathias Bynens](https://mathiasbynens.be/) |
+
+## License
+
+_emoji-regex_ is available under the [MIT](https://mths.be/mit) license.
diff --git a/node_modules/emoji-regex/RGI_Emoji.d.ts b/node_modules/emoji-regex/RGI_Emoji.d.ts
new file mode 100644
index 0000000..89a651f
--- /dev/null
+++ b/node_modules/emoji-regex/RGI_Emoji.d.ts
@@ -0,0 +1,5 @@
+declare module 'emoji-regex/RGI_Emoji' {
+ function emojiRegex(): RegExp;
+
+ export = emojiRegex;
+}
diff --git a/node_modules/emoji-regex/RGI_Emoji.js b/node_modules/emoji-regex/RGI_Emoji.js
new file mode 100644
index 0000000..3fbe924
--- /dev/null
+++ b/node_modules/emoji-regex/RGI_Emoji.js
@@ -0,0 +1,6 @@
+"use strict";
+
+module.exports = function () {
+ // https://mths.be/emoji
+ return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]/g;
+};
diff --git a/node_modules/emoji-regex/es2015/RGI_Emoji.d.ts b/node_modules/emoji-regex/es2015/RGI_Emoji.d.ts
new file mode 100644
index 0000000..bf0f154
--- /dev/null
+++ b/node_modules/emoji-regex/es2015/RGI_Emoji.d.ts
@@ -0,0 +1,5 @@
+declare module 'emoji-regex/es2015/RGI_Emoji' {
+ function emojiRegex(): RegExp;
+
+ export = emojiRegex;
+}
diff --git a/node_modules/emoji-regex/es2015/RGI_Emoji.js b/node_modules/emoji-regex/es2015/RGI_Emoji.js
new file mode 100644
index 0000000..ecf32f1
--- /dev/null
+++ b/node_modules/emoji-regex/es2015/RGI_Emoji.js
@@ -0,0 +1,6 @@
+"use strict";
+
+module.exports = () => {
+ // https://mths.be/emoji
+ return /\u{1F3F4}\u{E0067}\u{E0062}(?:\u{E0077}\u{E006C}\u{E0073}|\u{E0073}\u{E0063}\u{E0074}|\u{E0065}\u{E006E}\u{E0067})\u{E007F}|(?:\u{1F9D1}\u{1F3FF}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FE}]|(?:\u{1F9D1}\u{1F3FE}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FD}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FC}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FB}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FB}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FC}-\u{1F3FF}]|\u{1F468}(?:\u{1F3FB}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F468}[\u{1F3FB}-\u{1F3FF}])|\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]|[\u2695\u2696\u2708]\uFE0F|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]))?|[\u{1F3FC}-\u{1F3FF}]\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F468}[\u{1F3FB}-\u{1F3FF}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u{1F466}\u{1F467}])|\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC})?|(?:\u{1F469}(?:\u{1F3FB}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F3FC}-\u{1F3FF}]\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}]))|\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]\u200D\u{1F91D}\u200D\u{1F9D1})[\u{1F3FB}-\u{1F3FF}]|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F469}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FE}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FD}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FC}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F9D1}(?:\u200D(?:\u{1F91D}\u200D\u{1F9D1}|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FE}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FD}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FC}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F9D1}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\u{1F469}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\u{1F636}\u200D\u{1F32B}|\u{1F3F3}\uFE0F\u200D\u26A7|\u{1F43B}\u200D\u2744|(?:[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\uFE0F\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u{1F3F4}\u200D\u2620|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}]\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F202}\u{1F237}\u{1F321}\u{1F324}-\u{1F32C}\u{1F336}\u{1F37D}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}\u{1F39F}\u{1F3CD}\u{1F3CE}\u{1F3D4}-\u{1F3DF}\u{1F3F5}\u{1F3F7}\u{1F43F}\u{1F4FD}\u{1F549}\u{1F54A}\u{1F56F}\u{1F570}\u{1F573}\u{1F576}-\u{1F579}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}\u{1F6CB}\u{1F6CD}-\u{1F6CF}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6F0}\u{1F6F3}])\uFE0F|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F469}\u200D\u{1F467}|\u{1F469}\u200D\u{1F466}|\u{1F635}\u200D\u{1F4AB}|\u{1F62E}\u200D\u{1F4A8}|\u{1F415}\u200D\u{1F9BA}|\u{1F9D1}(?:\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC}|\u{1F3FB})?|\u{1F469}(?:\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC}|\u{1F3FB})?|\u{1F1FD}\u{1F1F0}|\u{1F1F6}\u{1F1E6}|\u{1F1F4}\u{1F1F2}|\u{1F408}\u200D\u2B1B|\u2764\uFE0F\u200D[\u{1F525}\u{1FA79}]|\u{1F441}\uFE0F|\u{1F3F3}\uFE0F|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\uFE0F\u{1F3FB}-\u{1F3FF}]|\u{1F3F4}|[\u270A\u270B\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F57A}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F934}\u{1F936}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}\u{1F9D3}\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270C\u270D\u{1F574}\u{1F590}][\uFE0F\u{1F3FB}-\u{1F3FF}]|[\u270A\u270B\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F408}\u{1F415}\u{1F43B}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F57A}\u{1F595}\u{1F596}\u{1F62E}\u{1F635}\u{1F636}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F934}\u{1F936}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}\u{1F9D3}\u{1F9D5}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}]|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F384}\u{1F386}-\u{1F393}\u{1F3A0}-\u{1F3C1}\u{1F3C5}\u{1F3C6}\u{1F3C8}\u{1F3C9}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F8}-\u{1F407}\u{1F409}-\u{1F414}\u{1F416}-\u{1F43A}\u{1F43C}-\u{1F43E}\u{1F440}\u{1F444}\u{1F445}\u{1F451}-\u{1F465}\u{1F46A}\u{1F479}-\u{1F47B}\u{1F47D}-\u{1F480}\u{1F484}\u{1F488}-\u{1F48E}\u{1F490}\u{1F492}-\u{1F4A9}\u{1F4AB}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F5A4}\u{1F5FB}-\u{1F62D}\u{1F62F}-\u{1F634}\u{1F637}-\u{1F644}\u{1F648}-\u{1F64A}\u{1F680}-\u{1F6A2}\u{1F6A4}-\u{1F6B3}\u{1F6B7}-\u{1F6BF}\u{1F6C1}-\u{1F6C5}\u{1F6D0}-\u{1F6D2}\u{1F6D5}-\u{1F6D7}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FC}\u{1F7E0}-\u{1F7EB}\u{1F90D}\u{1F90E}\u{1F910}-\u{1F917}\u{1F91D}\u{1F920}-\u{1F925}\u{1F927}-\u{1F92F}\u{1F93A}\u{1F93F}-\u{1F945}\u{1F947}-\u{1F976}\u{1F978}\u{1F97A}-\u{1F9B4}\u{1F9B7}\u{1F9BA}\u{1F9BC}-\u{1F9CB}\u{1F9D0}\u{1F9E0}-\u{1F9FF}\u{1FA70}-\u{1FA74}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA86}\u{1FA90}-\u{1FAA8}\u{1FAB0}-\u{1FAB6}\u{1FAC0}-\u{1FAC2}\u{1FAD0}-\u{1FAD6}]/gu;
+};
diff --git a/node_modules/emoji-regex/es2015/index.d.ts b/node_modules/emoji-regex/es2015/index.d.ts
new file mode 100644
index 0000000..823dfa6
--- /dev/null
+++ b/node_modules/emoji-regex/es2015/index.d.ts
@@ -0,0 +1,5 @@
+declare module 'emoji-regex/es2015' {
+ function emojiRegex(): RegExp;
+
+ export = emojiRegex;
+}
diff --git a/node_modules/emoji-regex/es2015/index.js b/node_modules/emoji-regex/es2015/index.js
new file mode 100644
index 0000000..1a4fc8d
--- /dev/null
+++ b/node_modules/emoji-regex/es2015/index.js
@@ -0,0 +1,6 @@
+"use strict";
+
+module.exports = () => {
+ // https://mths.be/emoji
+ return /\u{1F3F4}\u{E0067}\u{E0062}(?:\u{E0077}\u{E006C}\u{E0073}|\u{E0073}\u{E0063}\u{E0074}|\u{E0065}\u{E006E}\u{E0067})\u{E007F}|(?:\u{1F9D1}\u{1F3FF}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FE}]|(?:\u{1F9D1}\u{1F3FE}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FD}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FC}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FB}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FB}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FC}-\u{1F3FF}]|\u{1F468}(?:\u{1F3FB}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F468}[\u{1F3FB}-\u{1F3FF}])|\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]|[\u2695\u2696\u2708]\uFE0F|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]))?|[\u{1F3FC}-\u{1F3FF}]\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F468}[\u{1F3FB}-\u{1F3FF}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u{1F466}\u{1F467}])|\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC})?|(?:\u{1F469}(?:\u{1F3FB}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F3FC}-\u{1F3FF}]\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}]))|\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]\u200D\u{1F91D}\u200D\u{1F9D1})[\u{1F3FB}-\u{1F3FF}]|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F469}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FE}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FD}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FC}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F9D1}(?:\u200D(?:\u{1F91D}\u200D\u{1F9D1}|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FE}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FD}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FC}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F9D1}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\u{1F469}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\u{1F636}\u200D\u{1F32B}|\u{1F3F3}\uFE0F\u200D\u26A7|\u{1F43B}\u200D\u2744|(?:[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\uFE0F\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u{1F3F4}\u200D\u2620|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}]\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F202}\u{1F237}\u{1F321}\u{1F324}-\u{1F32C}\u{1F336}\u{1F37D}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}\u{1F39F}\u{1F3CD}\u{1F3CE}\u{1F3D4}-\u{1F3DF}\u{1F3F5}\u{1F3F7}\u{1F43F}\u{1F4FD}\u{1F549}\u{1F54A}\u{1F56F}\u{1F570}\u{1F573}\u{1F576}-\u{1F579}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}\u{1F6CB}\u{1F6CD}-\u{1F6CF}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6F0}\u{1F6F3}])\uFE0F|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F469}\u200D\u{1F467}|\u{1F469}\u200D\u{1F466}|\u{1F635}\u200D\u{1F4AB}|\u{1F62E}\u200D\u{1F4A8}|\u{1F415}\u200D\u{1F9BA}|\u{1F9D1}(?:\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC}|\u{1F3FB})?|\u{1F469}(?:\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC}|\u{1F3FB})?|\u{1F1FD}\u{1F1F0}|\u{1F1F6}\u{1F1E6}|\u{1F1F4}\u{1F1F2}|\u{1F408}\u200D\u2B1B|\u2764\uFE0F\u200D[\u{1F525}\u{1FA79}]|\u{1F441}\uFE0F|\u{1F3F3}\uFE0F|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\uFE0F\u{1F3FB}-\u{1F3FF}]|\u{1F3F4}|[\u270A\u270B\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F57A}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F934}\u{1F936}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}\u{1F9D3}\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270C\u270D\u{1F574}\u{1F590}][\uFE0F\u{1F3FB}-\u{1F3FF}]|[\u270A\u270B\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F408}\u{1F415}\u{1F43B}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F57A}\u{1F595}\u{1F596}\u{1F62E}\u{1F635}\u{1F636}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F934}\u{1F936}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}\u{1F9D3}\u{1F9D5}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}]|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F384}\u{1F386}-\u{1F393}\u{1F3A0}-\u{1F3C1}\u{1F3C5}\u{1F3C6}\u{1F3C8}\u{1F3C9}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F8}-\u{1F407}\u{1F409}-\u{1F414}\u{1F416}-\u{1F43A}\u{1F43C}-\u{1F43E}\u{1F440}\u{1F444}\u{1F445}\u{1F451}-\u{1F465}\u{1F46A}\u{1F479}-\u{1F47B}\u{1F47D}-\u{1F480}\u{1F484}\u{1F488}-\u{1F48E}\u{1F490}\u{1F492}-\u{1F4A9}\u{1F4AB}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F5A4}\u{1F5FB}-\u{1F62D}\u{1F62F}-\u{1F634}\u{1F637}-\u{1F644}\u{1F648}-\u{1F64A}\u{1F680}-\u{1F6A2}\u{1F6A4}-\u{1F6B3}\u{1F6B7}-\u{1F6BF}\u{1F6C1}-\u{1F6C5}\u{1F6D0}-\u{1F6D2}\u{1F6D5}-\u{1F6D7}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FC}\u{1F7E0}-\u{1F7EB}\u{1F90D}\u{1F90E}\u{1F910}-\u{1F917}\u{1F91D}\u{1F920}-\u{1F925}\u{1F927}-\u{1F92F}\u{1F93A}\u{1F93F}-\u{1F945}\u{1F947}-\u{1F976}\u{1F978}\u{1F97A}-\u{1F9B4}\u{1F9B7}\u{1F9BA}\u{1F9BC}-\u{1F9CB}\u{1F9D0}\u{1F9E0}-\u{1F9FF}\u{1FA70}-\u{1FA74}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA86}\u{1FA90}-\u{1FAA8}\u{1FAB0}-\u{1FAB6}\u{1FAC0}-\u{1FAC2}\u{1FAD0}-\u{1FAD6}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6D5}-\u{1F6D7}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FC}\u{1F7E0}-\u{1F7EB}\u{1F90C}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F978}\u{1F97A}-\u{1F9CB}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA74}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA86}\u{1FA90}-\u{1FAA8}\u{1FAB0}-\u{1FAB6}\u{1FAC0}-\u{1FAC2}\u{1FAD0}-\u{1FAD6}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6D5}-\u{1F6D7}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6FC}\u{1F7E0}-\u{1F7EB}\u{1F90C}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F978}\u{1F97A}-\u{1F9CB}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA74}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA86}\u{1FA90}-\u{1FAA8}\u{1FAB0}-\u{1FAB6}\u{1FAC0}-\u{1FAC2}\u{1FAD0}-\u{1FAD6}]\uFE0F|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93C}-\u{1F93E}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9BB}\u{1F9CD}-\u{1F9CF}\u{1F9D1}-\u{1F9DD}]/gu;
+};
diff --git a/node_modules/emoji-regex/es2015/text.d.ts b/node_modules/emoji-regex/es2015/text.d.ts
new file mode 100644
index 0000000..ccc2f9a
--- /dev/null
+++ b/node_modules/emoji-regex/es2015/text.d.ts
@@ -0,0 +1,5 @@
+declare module 'emoji-regex/es2015/text' {
+ function emojiRegex(): RegExp;
+
+ export = emojiRegex;
+}
diff --git a/node_modules/emoji-regex/es2015/text.js b/node_modules/emoji-regex/es2015/text.js
new file mode 100644
index 0000000..8e9f985
--- /dev/null
+++ b/node_modules/emoji-regex/es2015/text.js
@@ -0,0 +1,6 @@
+"use strict";
+
+module.exports = () => {
+ // https://mths.be/emoji
+ return /\u{1F3F4}\u{E0067}\u{E0062}(?:\u{E0077}\u{E006C}\u{E0073}|\u{E0073}\u{E0063}\u{E0074}|\u{E0065}\u{E006E}\u{E0067})\u{E007F}|(?:\u{1F9D1}\u{1F3FF}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FE}]|(?:\u{1F9D1}\u{1F3FE}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FD}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FC}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FB}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FB}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FC}-\u{1F3FF}]|\u{1F468}(?:\u{1F3FB}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F468}[\u{1F3FB}-\u{1F3FF}])|\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]|[\u2695\u2696\u2708]\uFE0F|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]))?|[\u{1F3FC}-\u{1F3FF}]\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F468}[\u{1F3FB}-\u{1F3FF}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u{1F466}\u{1F467}])|\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC})?|(?:\u{1F469}(?:\u{1F3FB}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F3FC}-\u{1F3FF}]\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}]))|\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]\u200D\u{1F91D}\u200D\u{1F9D1})[\u{1F3FB}-\u{1F3FF}]|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F469}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FE}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FD}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FC}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F9D1}(?:\u200D(?:\u{1F91D}\u200D\u{1F9D1}|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FE}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FD}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FC}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F9D1}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\u{1F469}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\u{1F636}\u200D\u{1F32B}|\u{1F3F3}\uFE0F\u200D\u26A7|\u{1F43B}\u200D\u2744|(?:[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\uFE0F\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u{1F3F4}\u200D\u2620|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}]\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F202}\u{1F237}\u{1F321}\u{1F324}-\u{1F32C}\u{1F336}\u{1F37D}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}\u{1F39F}\u{1F3CD}\u{1F3CE}\u{1F3D4}-\u{1F3DF}\u{1F3F5}\u{1F3F7}\u{1F43F}\u{1F4FD}\u{1F549}\u{1F54A}\u{1F56F}\u{1F570}\u{1F573}\u{1F576}-\u{1F579}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}\u{1F6CB}\u{1F6CD}-\u{1F6CF}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6F0}\u{1F6F3}])\uFE0F|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F469}\u200D\u{1F467}|\u{1F469}\u200D\u{1F466}|\u{1F635}\u200D\u{1F4AB}|\u{1F62E}\u200D\u{1F4A8}|\u{1F415}\u200D\u{1F9BA}|\u{1F9D1}(?:\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC}|\u{1F3FB})?|\u{1F469}(?:\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC}|\u{1F3FB})?|\u{1F1FD}\u{1F1F0}|\u{1F1F6}\u{1F1E6}|\u{1F1F4}\u{1F1F2}|\u{1F408}\u200D\u2B1B|\u2764\uFE0F\u200D[\u{1F525}\u{1FA79}]|\u{1F441}\uFE0F|\u{1F3F3}\uFE0F|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\uFE0F\u{1F3FB}-\u{1F3FF}]|\u{1F3F4}|[\u270A\u270B\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F57A}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F934}\u{1F936}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}\u{1F9D3}\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270C\u270D\u{1F574}\u{1F590}][\uFE0F\u{1F3FB}-\u{1F3FF}]|[\u270A\u270B\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F408}\u{1F415}\u{1F43B}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F57A}\u{1F595}\u{1F596}\u{1F62E}\u{1F635}\u{1F636}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F934}\u{1F936}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}\u{1F9D3}\u{1F9D5}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}]|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F384}\u{1F386}-\u{1F393}\u{1F3A0}-\u{1F3C1}\u{1F3C5}\u{1F3C6}\u{1F3C8}\u{1F3C9}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F8}-\u{1F407}\u{1F409}-\u{1F414}\u{1F416}-\u{1F43A}\u{1F43C}-\u{1F43E}\u{1F440}\u{1F444}\u{1F445}\u{1F451}-\u{1F465}\u{1F46A}\u{1F479}-\u{1F47B}\u{1F47D}-\u{1F480}\u{1F484}\u{1F488}-\u{1F48E}\u{1F490}\u{1F492}-\u{1F4A9}\u{1F4AB}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F5A4}\u{1F5FB}-\u{1F62D}\u{1F62F}-\u{1F634}\u{1F637}-\u{1F644}\u{1F648}-\u{1F64A}\u{1F680}-\u{1F6A2}\u{1F6A4}-\u{1F6B3}\u{1F6B7}-\u{1F6BF}\u{1F6C1}-\u{1F6C5}\u{1F6D0}-\u{1F6D2}\u{1F6D5}-\u{1F6D7}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FC}\u{1F7E0}-\u{1F7EB}\u{1F90D}\u{1F90E}\u{1F910}-\u{1F917}\u{1F91D}\u{1F920}-\u{1F925}\u{1F927}-\u{1F92F}\u{1F93A}\u{1F93F}-\u{1F945}\u{1F947}-\u{1F976}\u{1F978}\u{1F97A}-\u{1F9B4}\u{1F9B7}\u{1F9BA}\u{1F9BC}-\u{1F9CB}\u{1F9D0}\u{1F9E0}-\u{1F9FF}\u{1FA70}-\u{1FA74}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA86}\u{1FA90}-\u{1FAA8}\u{1FAB0}-\u{1FAB6}\u{1FAC0}-\u{1FAC2}\u{1FAD0}-\u{1FAD6}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6D5}-\u{1F6D7}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6FC}\u{1F7E0}-\u{1F7EB}\u{1F90C}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F978}\u{1F97A}-\u{1F9CB}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA74}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA86}\u{1FA90}-\u{1FAA8}\u{1FAB0}-\u{1FAB6}\u{1FAC0}-\u{1FAC2}\u{1FAD0}-\u{1FAD6}]\uFE0F?/gu;
+};
diff --git a/node_modules/emoji-regex/index.d.ts b/node_modules/emoji-regex/index.d.ts
new file mode 100644
index 0000000..8f235c9
--- /dev/null
+++ b/node_modules/emoji-regex/index.d.ts
@@ -0,0 +1,5 @@
+declare module 'emoji-regex' {
+ function emojiRegex(): RegExp;
+
+ export = emojiRegex;
+}
diff --git a/node_modules/emoji-regex/index.js b/node_modules/emoji-regex/index.js
new file mode 100644
index 0000000..c0490d4
--- /dev/null
+++ b/node_modules/emoji-regex/index.js
@@ -0,0 +1,6 @@
+"use strict";
+
+module.exports = function () {
+ // https://mths.be/emoji
+ return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
+};
diff --git a/node_modules/emoji-regex/package.json b/node_modules/emoji-regex/package.json
new file mode 100644
index 0000000..eac892a
--- /dev/null
+++ b/node_modules/emoji-regex/package.json
@@ -0,0 +1,52 @@
+{
+ "name": "emoji-regex",
+ "version": "9.2.2",
+ "description": "A regular expression to match all Emoji-only symbols as per the Unicode Standard.",
+ "homepage": "https://mths.be/emoji-regex",
+ "main": "index.js",
+ "types": "index.d.ts",
+ "keywords": [
+ "unicode",
+ "regex",
+ "regexp",
+ "regular expressions",
+ "code points",
+ "symbols",
+ "characters",
+ "emoji"
+ ],
+ "license": "MIT",
+ "author": {
+ "name": "Mathias Bynens",
+ "url": "https://mathiasbynens.be/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/mathiasbynens/emoji-regex.git"
+ },
+ "bugs": "https://github.com/mathiasbynens/emoji-regex/issues",
+ "files": [
+ "LICENSE-MIT.txt",
+ "index.js",
+ "index.d.ts",
+ "RGI_Emoji.js",
+ "RGI_Emoji.d.ts",
+ "text.js",
+ "text.d.ts",
+ "es2015"
+ ],
+ "scripts": {
+ "build": "rm -rf -- es2015; babel src -d .; NODE_ENV=es2015 babel src es2015_types -D -d ./es2015; node script/inject-sequences.js",
+ "test": "mocha",
+ "test:watch": "npm run test -- --watch"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.4.4",
+ "@babel/core": "^7.4.4",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/preset-env": "^7.4.4",
+ "@unicode/unicode-13.0.0": "^1.0.3",
+ "mocha": "^6.1.4",
+ "regexgen": "^1.3.0"
+ }
+}
diff --git a/node_modules/emoji-regex/text.d.ts b/node_modules/emoji-regex/text.d.ts
new file mode 100644
index 0000000..c3a0125
--- /dev/null
+++ b/node_modules/emoji-regex/text.d.ts
@@ -0,0 +1,5 @@
+declare module 'emoji-regex/text' {
+ function emojiRegex(): RegExp;
+
+ export = emojiRegex;
+}
diff --git a/node_modules/emoji-regex/text.js b/node_modules/emoji-regex/text.js
new file mode 100644
index 0000000..9bc63ce
--- /dev/null
+++ b/node_modules/emoji-regex/text.js
@@ -0,0 +1,6 @@
+"use strict";
+
+module.exports = function () {
+ // https://mths.be/emoji
+ return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F?/g;
+};
diff --git a/node_modules/fast-glob/LICENSE b/node_modules/fast-glob/LICENSE
new file mode 100644
index 0000000..65a9994
--- /dev/null
+++ b/node_modules/fast-glob/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Denis Malinochkin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/fast-glob/README.md b/node_modules/fast-glob/README.md
new file mode 100644
index 0000000..62d5cb7
--- /dev/null
+++ b/node_modules/fast-glob/README.md
@@ -0,0 +1,830 @@
+# fast-glob
+
+> It's a very fast and efficient [glob][glob_definition] library for [Node.js][node_js].
+
+This package provides methods for traversing the file system and returning pathnames that matched a defined set of a specified pattern according to the rules used by the Unix Bash shell with some simplifications, meanwhile results are returned in **arbitrary order**. Quick, simple, effective.
+
+## Table of Contents
+
+
+Details
+
+* [Highlights](#highlights)
+* [Old and modern mode](#old-and-modern-mode)
+* [Pattern syntax](#pattern-syntax)
+ * [Basic syntax](#basic-syntax)
+ * [Advanced syntax](#advanced-syntax)
+* [Installation](#installation)
+* [API](#api)
+ * [Asynchronous](#asynchronous)
+ * [Synchronous](#synchronous)
+ * [Stream](#stream)
+ * [patterns](#patterns)
+ * [[options]](#options)
+ * [Helpers](#helpers)
+ * [generateTasks](#generatetaskspatterns-options)
+ * [isDynamicPattern](#isdynamicpatternpattern-options)
+ * [escapePath](#escapepathpath)
+ * [convertPathToPattern](#convertpathtopatternpath)
+* [Options](#options-3)
+ * [Common](#common)
+ * [concurrency](#concurrency)
+ * [cwd](#cwd)
+ * [deep](#deep)
+ * [followSymbolicLinks](#followsymboliclinks)
+ * [fs](#fs)
+ * [ignore](#ignore)
+ * [suppressErrors](#suppresserrors)
+ * [throwErrorOnBrokenSymbolicLink](#throwerroronbrokensymboliclink)
+ * [Output control](#output-control)
+ * [absolute](#absolute)
+ * [markDirectories](#markdirectories)
+ * [objectMode](#objectmode)
+ * [onlyDirectories](#onlydirectories)
+ * [onlyFiles](#onlyfiles)
+ * [stats](#stats)
+ * [unique](#unique)
+ * [Matching control](#matching-control)
+ * [braceExpansion](#braceexpansion)
+ * [caseSensitiveMatch](#casesensitivematch)
+ * [dot](#dot)
+ * [extglob](#extglob)
+ * [globstar](#globstar)
+ * [baseNameMatch](#basenamematch)
+* [FAQ](#faq)
+ * [What is a static or dynamic pattern?](#what-is-a-static-or-dynamic-pattern)
+ * [How to write patterns on Windows?](#how-to-write-patterns-on-windows)
+ * [Why are parentheses match wrong?](#why-are-parentheses-match-wrong)
+ * [How to exclude directory from reading?](#how-to-exclude-directory-from-reading)
+ * [How to use UNC path?](#how-to-use-unc-path)
+ * [Compatible with `node-glob`?](#compatible-with-node-glob)
+* [Benchmarks](#benchmarks)
+ * [Server](#server)
+ * [Nettop](#nettop)
+* [Changelog](#changelog)
+* [License](#license)
+
+
+
+## Highlights
+
+* Fast. Probably the fastest.
+* Supports multiple and negative patterns.
+* Synchronous, Promise and Stream API.
+* Object mode. Can return more than just strings.
+* Error-tolerant.
+
+## Old and modern mode
+
+This package works in two modes, depending on the environment in which it is used.
+
+* **Old mode**. Node.js below 10.10 or when the [`stats`](#stats) option is *enabled*.
+* **Modern mode**. Node.js 10.10+ and the [`stats`](#stats) option is *disabled*.
+
+The modern mode is faster. Learn more about the [internal mechanism][nodelib_fs_scandir_old_and_modern_modern].
+
+## Pattern syntax
+
+> :warning: Always use forward-slashes in glob expressions (patterns and [`ignore`](#ignore) option). Use backslashes for escaping characters.
+
+There is more than one form of syntax: basic and advanced. Below is a brief overview of the supported features. Also pay attention to our [FAQ](#faq).
+
+> :book: This package uses [`micromatch`][micromatch] as a library for pattern matching.
+
+### Basic syntax
+
+* An asterisk (`*`) — matches everything except slashes (path separators), hidden files (names starting with `.`).
+* A double star or globstar (`**`) — matches zero or more directories.
+* Question mark (`?`) – matches any single character except slashes (path separators).
+* Sequence (`[seq]`) — matches any character in sequence.
+
+> :book: A few additional words about the [basic matching behavior][picomatch_matching_behavior].
+
+Some examples:
+
+* `src/**/*.js` — matches all files in the `src` directory (any level of nesting) that have the `.js` extension.
+* `src/*.??` — matches all files in the `src` directory (only first level of nesting) that have a two-character extension.
+* `file-[01].js` — matches files: `file-0.js`, `file-1.js`.
+
+### Advanced syntax
+
+* [Escapes characters][micromatch_backslashes] (`\\`) — matching special characters (`$^*+?()[]`) as literals.
+* [POSIX character classes][picomatch_posix_brackets] (`[[:digit:]]`).
+* [Extended globs][micromatch_extglobs] (`?(pattern-list)`).
+* [Bash style brace expansions][micromatch_braces] (`{}`).
+* [Regexp character classes][micromatch_regex_character_classes] (`[1-5]`).
+* [Regex groups][regular_expressions_brackets] (`(a|b)`).
+
+> :book: A few additional words about the [advanced matching behavior][micromatch_extended_globbing].
+
+Some examples:
+
+* `src/**/*.{css,scss}` — matches all files in the `src` directory (any level of nesting) that have the `.css` or `.scss` extension.
+* `file-[[:digit:]].js` — matches files: `file-0.js`, `file-1.js`, …, `file-9.js`.
+* `file-{1..3}.js` — matches files: `file-1.js`, `file-2.js`, `file-3.js`.
+* `file-(1|2)` — matches files: `file-1.js`, `file-2.js`.
+
+## Installation
+
+```console
+npm install fast-glob
+```
+
+## API
+
+### Asynchronous
+
+```js
+fg(patterns, [options])
+fg.async(patterns, [options])
+fg.glob(patterns, [options])
+```
+
+Returns a `Promise` with an array of matching entries.
+
+```js
+const fg = require('fast-glob');
+
+const entries = await fg(['.editorconfig', '**/index.js'], { dot: true });
+
+// ['.editorconfig', 'services/index.js']
+```
+
+### Synchronous
+
+```js
+fg.sync(patterns, [options])
+fg.globSync(patterns, [options])
+```
+
+Returns an array of matching entries.
+
+```js
+const fg = require('fast-glob');
+
+const entries = fg.sync(['.editorconfig', '**/index.js'], { dot: true });
+
+// ['.editorconfig', 'services/index.js']
+```
+
+### Stream
+
+```js
+fg.stream(patterns, [options])
+fg.globStream(patterns, [options])
+```
+
+Returns a [`ReadableStream`][node_js_stream_readable_streams] when the `data` event will be emitted with matching entry.
+
+```js
+const fg = require('fast-glob');
+
+const stream = fg.stream(['.editorconfig', '**/index.js'], { dot: true });
+
+for await (const entry of stream) {
+ // .editorconfig
+ // services/index.js
+}
+```
+
+#### patterns
+
+* Required: `true`
+* Type: `string | string[]`
+
+Any correct pattern(s).
+
+> :1234: [Pattern syntax](#pattern-syntax)
+>
+> :warning: This package does not respect the order of patterns. First, all the negative patterns are applied, and only then the positive patterns. If you want to get a certain order of records, use sorting or split calls.
+
+#### [options]
+
+* Required: `false`
+* Type: [`Options`](#options-3)
+
+See [Options](#options-3) section.
+
+### Helpers
+
+#### `generateTasks(patterns, [options])`
+
+Returns the internal representation of patterns ([`Task`](./src/managers/tasks.ts) is a combining patterns by base directory).
+
+```js
+fg.generateTasks('*');
+
+[{
+ base: '.', // Parent directory for all patterns inside this task
+ dynamic: true, // Dynamic or static patterns are in this task
+ patterns: ['*'],
+ positive: ['*'],
+ negative: []
+}]
+```
+
+##### patterns
+
+* Required: `true`
+* Type: `string | string[]`
+
+Any correct pattern(s).
+
+##### [options]
+
+* Required: `false`
+* Type: [`Options`](#options-3)
+
+See [Options](#options-3) section.
+
+#### `isDynamicPattern(pattern, [options])`
+
+Returns `true` if the passed pattern is a dynamic pattern.
+
+> :1234: [What is a static or dynamic pattern?](#what-is-a-static-or-dynamic-pattern)
+
+```js
+fg.isDynamicPattern('*'); // true
+fg.isDynamicPattern('abc'); // false
+```
+
+##### pattern
+
+* Required: `true`
+* Type: `string`
+
+Any correct pattern.
+
+##### [options]
+
+* Required: `false`
+* Type: [`Options`](#options-3)
+
+See [Options](#options-3) section.
+
+#### `escapePath(path)`
+
+Returns the path with escaped special characters depending on the platform.
+
+* Posix:
+ * `*?|(){}[]`;
+ * `!` at the beginning of line;
+ * `@+!` before the opening parenthesis;
+ * `\\` before non-special characters;
+* Windows:
+ * `(){}[]`
+ * `!` at the beginning of line;
+ * `@+!` before the opening parenthesis;
+ * Characters like `*?|` cannot be used in the path ([windows_naming_conventions][windows_naming_conventions]), so they will not be escaped;
+
+```js
+fg.escapePath('!abc');
+// \\!abc
+fg.escapePath('[OpenSource] mrmlnc – fast-glob (Deluxe Edition) 2014') + '/*.flac'
+// \\[OpenSource\\] mrmlnc – fast-glob \\(Deluxe Edition\\) 2014/*.flac
+
+fg.posix.escapePath('C:\\Program Files (x86)\\**\\*');
+// C:\\\\Program Files \\(x86\\)\\*\\*\\*
+fg.win32.escapePath('C:\\Program Files (x86)\\**\\*');
+// Windows: C:\\Program Files \\(x86\\)\\**\\*
+```
+
+#### `convertPathToPattern(path)`
+
+Converts a path to a pattern depending on the platform, including special character escaping.
+
+* Posix. Works similarly to the `fg.posix.escapePath` method.
+* Windows. Works similarly to the `fg.win32.escapePath` method, additionally converting backslashes to forward slashes in cases where they are not escape characters (`!()+@{}[]`).
+
+```js
+fg.convertPathToPattern('[OpenSource] mrmlnc – fast-glob (Deluxe Edition) 2014') + '/*.flac';
+// \\[OpenSource\\] mrmlnc – fast-glob \\(Deluxe Edition\\) 2014/*.flac
+
+fg.convertPathToPattern('C:/Program Files (x86)/**/*');
+// Posix: C:/Program Files \\(x86\\)/\\*\\*/\\*
+// Windows: C:/Program Files \\(x86\\)/**/*
+
+fg.convertPathToPattern('C:\\Program Files (x86)\\**\\*');
+// Posix: C:\\\\Program Files \\(x86\\)\\*\\*\\*
+// Windows: C:/Program Files \\(x86\\)/**/*
+
+fg.posix.convertPathToPattern('\\\\?\\c:\\Program Files (x86)') + '/**/*';
+// Posix: \\\\\\?\\\\c:\\\\Program Files \\(x86\\)/**/* (broken pattern)
+fg.win32.convertPathToPattern('\\\\?\\c:\\Program Files (x86)') + '/**/*';
+// Windows: //?/c:/Program Files \\(x86\\)/**/*
+```
+
+## Options
+
+### Common options
+
+#### concurrency
+
+* Type: `number`
+* Default: `os.cpus().length`
+
+Specifies the maximum number of concurrent requests from a reader to read directories.
+
+> :book: The higher the number, the higher the performance and load on the file system. If you want to read in quiet mode, set the value to a comfortable number or `1`.
+
+
+
+More details
+
+In Node, there are [two types of threads][nodejs_thread_pool]: Event Loop (code) and a Thread Pool (fs, dns, …). The thread pool size controlled by the `UV_THREADPOOL_SIZE` environment variable. Its default size is 4 ([documentation][libuv_thread_pool]). The pool is one for all tasks within a single Node process.
+
+Any code can make 4 real concurrent accesses to the file system. The rest of the FS requests will wait in the queue.
+
+> :book: Each new instance of FG in the same Node process will use the same Thread pool.
+
+But this package also has the `concurrency` option. This option allows you to control the number of concurrent accesses to the FS at the package level. By default, this package has a value equal to the number of cores available for the current Node process. This allows you to set a value smaller than the pool size (`concurrency: 1`) or, conversely, to prepare tasks for the pool queue more quickly (`concurrency: Number.POSITIVE_INFINITY`).
+
+So, in fact, this package can **only make 4 concurrent requests to the FS**. You can increase this value by using an environment variable (`UV_THREADPOOL_SIZE`), but in practice this does not give a multiple advantage.
+
+
+
+#### cwd
+
+* Type: `string`
+* Default: `process.cwd()`
+
+The current working directory in which to search.
+
+#### deep
+
+* Type: `number`
+* Default: `Infinity`
+
+Specifies the maximum depth of a read directory relative to the start directory.
+
+For example, you have the following tree:
+
+```js
+dir/
+└── one/ // 1
+ └── two/ // 2
+ └── file.js // 3
+```
+
+```js
+// With base directory
+fg.sync('dir/**', { onlyFiles: false, deep: 1 }); // ['dir/one']
+fg.sync('dir/**', { onlyFiles: false, deep: 2 }); // ['dir/one', 'dir/one/two']
+
+// With cwd option
+fg.sync('**', { onlyFiles: false, cwd: 'dir', deep: 1 }); // ['one']
+fg.sync('**', { onlyFiles: false, cwd: 'dir', deep: 2 }); // ['one', 'one/two']
+```
+
+> :book: If you specify a pattern with some base directory, this directory will not participate in the calculation of the depth of the found directories. Think of it as a [`cwd`](#cwd) option.
+
+#### followSymbolicLinks
+
+* Type: `boolean`
+* Default: `true`
+
+Indicates whether to traverse descendants of symbolic link directories when expanding `**` patterns.
+
+> :book: Note that this option does not affect the base directory of the pattern. For example, if `./a` is a symlink to directory `./b` and you specified `['./a**', './b/**']` patterns, then directory `./a` will still be read.
+
+> :book: If the [`stats`](#stats) option is specified, the information about the symbolic link (`fs.lstat`) will be replaced with information about the entry (`fs.stat`) behind it.
+
+#### fs
+
+* Type: `FileSystemAdapter`
+* Default: `fs.*`
+
+Custom implementation of methods for working with the file system.
+
+```ts
+export interface FileSystemAdapter {
+ lstat?: typeof fs.lstat;
+ stat?: typeof fs.stat;
+ lstatSync?: typeof fs.lstatSync;
+ statSync?: typeof fs.statSync;
+ readdir?: typeof fs.readdir;
+ readdirSync?: typeof fs.readdirSync;
+}
+```
+
+#### ignore
+
+* Type: `string[]`
+* Default: `[]`
+
+An array of glob patterns to exclude matches. This is an alternative way to use negative patterns.
+
+```js
+dir/
+├── package-lock.json
+└── package.json
+```
+
+```js
+fg.sync(['*.json', '!package-lock.json']); // ['package.json']
+fg.sync('*.json', { ignore: ['package-lock.json'] }); // ['package.json']
+```
+
+#### suppressErrors
+
+* Type: `boolean`
+* Default: `false`
+
+By default this package suppress only `ENOENT` errors. Set to `true` to suppress any error.
+
+> :book: Can be useful when the directory has entries with a special level of access.
+
+#### throwErrorOnBrokenSymbolicLink
+
+* Type: `boolean`
+* Default: `false`
+
+Throw an error when symbolic link is broken if `true` or safely return `lstat` call if `false`.
+
+> :book: This option has no effect on errors when reading the symbolic link directory.
+
+### Output control
+
+#### absolute
+
+* Type: `boolean`
+* Default: `false`
+
+Return the absolute path for entries.
+
+```js
+fg.sync('*.js', { absolute: false }); // ['index.js']
+fg.sync('*.js', { absolute: true }); // ['/home/user/index.js']
+```
+
+> :book: This option is required if you want to use negative patterns with absolute path, for example, `!${__dirname}/*.js`.
+
+#### markDirectories
+
+* Type: `boolean`
+* Default: `false`
+
+Mark the directory path with the final slash.
+
+```js
+fg.sync('*', { onlyFiles: false, markDirectories: false }); // ['index.js', 'controllers']
+fg.sync('*', { onlyFiles: false, markDirectories: true }); // ['index.js', 'controllers/']
+```
+
+#### objectMode
+
+* Type: `boolean`
+* Default: `false`
+
+Returns objects (instead of strings) describing entries.
+
+```js
+fg.sync('*', { objectMode: false }); // ['src/index.js']
+fg.sync('*', { objectMode: true }); // [{ name: 'index.js', path: 'src/index.js', dirent: }]
+```
+
+The object has the following fields:
+
+* name (`string`) — the last part of the path (basename)
+* path (`string`) — full path relative to the pattern base directory
+* dirent ([`fs.Dirent`][node_js_fs_class_fs_dirent]) — instance of `fs.Dirent`
+
+> :book: An object is an internal representation of entry, so getting it does not affect performance.
+
+#### onlyDirectories
+
+* Type: `boolean`
+* Default: `false`
+
+Return only directories.
+
+```js
+fg.sync('*', { onlyDirectories: false }); // ['index.js', 'src']
+fg.sync('*', { onlyDirectories: true }); // ['src']
+```
+
+> :book: If `true`, the [`onlyFiles`](#onlyfiles) option is automatically `false`.
+
+#### onlyFiles
+
+* Type: `boolean`
+* Default: `true`
+
+Return only files.
+
+```js
+fg.sync('*', { onlyFiles: false }); // ['index.js', 'src']
+fg.sync('*', { onlyFiles: true }); // ['index.js']
+```
+
+#### stats
+
+* Type: `boolean`
+* Default: `false`
+
+Enables an [object mode](#objectmode) with an additional field:
+
+* stats ([`fs.Stats`][node_js_fs_class_fs_stats]) — instance of `fs.Stats`
+
+```js
+fg.sync('*', { stats: false }); // ['src/index.js']
+fg.sync('*', { stats: true }); // [{ name: 'index.js', path: 'src/index.js', dirent: , stats: }]
+```
+
+> :book: Returns `fs.stat` instead of `fs.lstat` for symbolic links when the [`followSymbolicLinks`](#followsymboliclinks) option is specified.
+>
+> :warning: Unlike [object mode](#objectmode) this mode requires additional calls to the file system. On average, this mode is slower at least twice. See [old and modern mode](#old-and-modern-mode) for more details.
+
+#### unique
+
+* Type: `boolean`
+* Default: `true`
+
+Ensures that the returned entries are unique.
+
+```js
+fg.sync(['*.json', 'package.json'], { unique: false }); // ['package.json', 'package.json']
+fg.sync(['*.json', 'package.json'], { unique: true }); // ['package.json']
+```
+
+If `true` and similar entries are found, the result is the first found.
+
+### Matching control
+
+#### braceExpansion
+
+* Type: `boolean`
+* Default: `true`
+
+Enables Bash-like brace expansion.
+
+> :1234: [Syntax description][bash_hackers_syntax_expansion_brace] or more [detailed description][micromatch_braces].
+
+```js
+dir/
+├── abd
+├── acd
+└── a{b,c}d
+```
+
+```js
+fg.sync('a{b,c}d', { braceExpansion: false }); // ['a{b,c}d']
+fg.sync('a{b,c}d', { braceExpansion: true }); // ['abd', 'acd']
+```
+
+#### caseSensitiveMatch
+
+* Type: `boolean`
+* Default: `true`
+
+Enables a [case-sensitive][wikipedia_case_sensitivity] mode for matching files.
+
+```js
+dir/
+├── file.txt
+└── File.txt
+```
+
+```js
+fg.sync('file.txt', { caseSensitiveMatch: false }); // ['file.txt', 'File.txt']
+fg.sync('file.txt', { caseSensitiveMatch: true }); // ['file.txt']
+```
+
+#### dot
+
+* Type: `boolean`
+* Default: `false`
+
+Allow patterns to match entries that begin with a period (`.`).
+
+> :book: Note that an explicit dot in a portion of the pattern will always match dot files.
+
+```js
+dir/
+├── .editorconfig
+└── package.json
+```
+
+```js
+fg.sync('*', { dot: false }); // ['package.json']
+fg.sync('*', { dot: true }); // ['.editorconfig', 'package.json']
+```
+
+#### extglob
+
+* Type: `boolean`
+* Default: `true`
+
+Enables Bash-like `extglob` functionality.
+
+> :1234: [Syntax description][micromatch_extglobs].
+
+```js
+dir/
+├── README.md
+└── package.json
+```
+
+```js
+fg.sync('*.+(json|md)', { extglob: false }); // []
+fg.sync('*.+(json|md)', { extglob: true }); // ['README.md', 'package.json']
+```
+
+#### globstar
+
+* Type: `boolean`
+* Default: `true`
+
+Enables recursively repeats a pattern containing `**`. If `false`, `**` behaves exactly like `*`.
+
+```js
+dir/
+└── a
+ └── b
+```
+
+```js
+fg.sync('**', { onlyFiles: false, globstar: false }); // ['a']
+fg.sync('**', { onlyFiles: false, globstar: true }); // ['a', 'a/b']
+```
+
+#### baseNameMatch
+
+* Type: `boolean`
+* Default: `false`
+
+If set to `true`, then patterns without slashes will be matched against the basename of the path if it contains slashes.
+
+```js
+dir/
+└── one/
+ └── file.md
+```
+
+```js
+fg.sync('*.md', { baseNameMatch: false }); // []
+fg.sync('*.md', { baseNameMatch: true }); // ['one/file.md']
+```
+
+## FAQ
+
+## What is a static or dynamic pattern?
+
+All patterns can be divided into two types:
+
+* **static**. A pattern is considered static if it can be used to get an entry on the file system without using matching mechanisms. For example, the `file.js` pattern is a static pattern because we can just verify that it exists on the file system.
+* **dynamic**. A pattern is considered dynamic if it cannot be used directly to find occurrences without using a matching mechanisms. For example, the `*` pattern is a dynamic pattern because we cannot use this pattern directly.
+
+A pattern is considered dynamic if it contains the following characters (`…` — any characters or their absence) or options:
+
+* The [`caseSensitiveMatch`](#casesensitivematch) option is disabled
+* `\\` (the escape character)
+* `*`, `?`, `!` (at the beginning of line)
+* `[…]`
+* `(…|…)`
+* `@(…)`, `!(…)`, `*(…)`, `?(…)`, `+(…)` (respects the [`extglob`](#extglob) option)
+* `{…,…}`, `{…..…}` (respects the [`braceExpansion`](#braceexpansion) option)
+
+## How to write patterns on Windows?
+
+Always use forward-slashes in glob expressions (patterns and [`ignore`](#ignore) option). Use backslashes for escaping characters. With the [`cwd`](#cwd) option use a convenient format.
+
+**Bad**
+
+```ts
+[
+ 'directory\\*',
+ path.join(process.cwd(), '**')
+]
+```
+
+**Good**
+
+```ts
+[
+ 'directory/*',
+ fg.convertPathToPattern(process.cwd()) + '/**'
+]
+```
+
+> :book: Use the [`.convertPathToPattern`](#convertpathtopatternpath) package to convert Windows-style path to a Unix-style path.
+
+Read more about [matching with backslashes][micromatch_backslashes].
+
+## Why are parentheses match wrong?
+
+```js
+dir/
+└── (special-*file).txt
+```
+
+```js
+fg.sync(['(special-*file).txt']) // []
+```
+
+Refers to Bash. You need to escape special characters:
+
+```js
+fg.sync(['\\(special-*file\\).txt']) // ['(special-*file).txt']
+```
+
+Read more about [matching special characters as literals][picomatch_matching_special_characters_as_literals]. Or use the [`.escapePath`](#escapepathpath).
+
+## How to exclude directory from reading?
+
+You can use a negative pattern like this: `!**/node_modules` or `!**/node_modules/**`. Also you can use [`ignore`](#ignore) option. Just look at the example below.
+
+```js
+first/
+├── file.md
+└── second/
+ └── file.txt
+```
+
+If you don't want to read the `second` directory, you must write the following pattern: `!**/second` or `!**/second/**`.
+
+```js
+fg.sync(['**/*.md', '!**/second']); // ['first/file.md']
+fg.sync(['**/*.md'], { ignore: ['**/second/**'] }); // ['first/file.md']
+```
+
+> :warning: When you write `!**/second/**/*` it means that the directory will be **read**, but all the entries will not be included in the results.
+
+You have to understand that if you write the pattern to exclude directories, then the directory will not be read under any circumstances.
+
+## How to use UNC path?
+
+You cannot use [Uniform Naming Convention (UNC)][unc_path] paths as patterns (due to syntax) directly, but you can use them as [`cwd`](#cwd) directory or use the `fg.convertPathToPattern` method.
+
+```ts
+// cwd
+fg.sync('*', { cwd: '\\\\?\\C:\\Python27' /* or //?/C:/Python27 */ });
+fg.sync('Python27/*', { cwd: '\\\\?\\C:\\' /* or //?/C:/ */ });
+
+// .convertPathToPattern
+fg.sync(fg.convertPathToPattern('\\\\?\\c:\\Python27') + '/*');
+```
+
+## Compatible with `node-glob`?
+
+| node-glob | fast-glob |
+| :----------: | :-------: |
+| `cwd` | [`cwd`](#cwd) |
+| `root` | – |
+| `dot` | [`dot`](#dot) |
+| `nomount` | – |
+| `mark` | [`markDirectories`](#markdirectories) |
+| `nosort` | – |
+| `nounique` | [`unique`](#unique) |
+| `nobrace` | [`braceExpansion`](#braceexpansion) |
+| `noglobstar` | [`globstar`](#globstar) |
+| `noext` | [`extglob`](#extglob) |
+| `nocase` | [`caseSensitiveMatch`](#casesensitivematch) |
+| `matchBase` | [`baseNameMatch`](#basenamematch) |
+| `nodir` | [`onlyFiles`](#onlyfiles) |
+| `ignore` | [`ignore`](#ignore) |
+| `follow` | [`followSymbolicLinks`](#followsymboliclinks) |
+| `realpath` | – |
+| `absolute` | [`absolute`](#absolute) |
+
+## Benchmarks
+
+You can see results [here](https://github.com/mrmlnc/fast-glob/actions/workflows/benchmark.yml?query=branch%3Amaster) for every commit into the `main` branch.
+
+* **Product benchmark** – comparison with the main competitors.
+* **Regress benchmark** – regression between the current version and the version from the npm registry.
+
+## Changelog
+
+See the [Releases section of our GitHub project][github_releases] for changelog for each release version.
+
+## License
+
+This software is released under the terms of the MIT license.
+
+[bash_hackers_syntax_expansion_brace]: https://wiki.bash-hackers.org/syntax/expansion/brace
+[github_releases]: https://github.com/mrmlnc/fast-glob/releases
+[glob_definition]: https://en.wikipedia.org/wiki/Glob_(programming)
+[glob_linux_man]: http://man7.org/linux/man-pages/man3/glob.3.html
+[micromatch_backslashes]: https://github.com/micromatch/micromatch#backslashes
+[micromatch_braces]: https://github.com/micromatch/braces
+[micromatch_extended_globbing]: https://github.com/micromatch/micromatch#extended-globbing
+[micromatch_extglobs]: https://github.com/micromatch/micromatch#extglobs
+[micromatch_regex_character_classes]: https://github.com/micromatch/micromatch#regex-character-classes
+[micromatch]: https://github.com/micromatch/micromatch
+[node_js_fs_class_fs_dirent]: https://nodejs.org/api/fs.html#fs_class_fs_dirent
+[node_js_fs_class_fs_stats]: https://nodejs.org/api/fs.html#fs_class_fs_stats
+[node_js_stream_readable_streams]: https://nodejs.org/api/stream.html#stream_readable_streams
+[node_js]: https://nodejs.org/en
+[nodelib_fs_scandir_old_and_modern_modern]: https://github.com/nodelib/nodelib/blob/master/packages/fs/fs.scandir/README.md#old-and-modern-mode
+[npm_normalize_path]: https://www.npmjs.com/package/normalize-path
+[npm_unixify]: https://www.npmjs.com/package/unixify
+[picomatch_matching_behavior]: https://github.com/micromatch/picomatch#matching-behavior-vs-bash
+[picomatch_matching_special_characters_as_literals]: https://github.com/micromatch/picomatch#matching-special-characters-as-literals
+[picomatch_posix_brackets]: https://github.com/micromatch/picomatch#posix-brackets
+[regular_expressions_brackets]: https://www.regular-expressions.info/brackets.html
+[unc_path]: https://learn.microsoft.com/openspecs/windows_protocols/ms-dtyp/62e862f4-2a51-452e-8eeb-dc4ff5ee33cc
+[wikipedia_case_sensitivity]: https://en.wikipedia.org/wiki/Case_sensitivity
+[nodejs_thread_pool]: https://nodejs.org/en/docs/guides/dont-block-the-event-loop
+[libuv_thread_pool]: http://docs.libuv.org/en/v1.x/threadpool.html
+[windows_naming_conventions]: https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions
diff --git a/node_modules/fast-glob/node_modules/glob-parent/CHANGELOG.md b/node_modules/fast-glob/node_modules/glob-parent/CHANGELOG.md
new file mode 100644
index 0000000..fb9de96
--- /dev/null
+++ b/node_modules/fast-glob/node_modules/glob-parent/CHANGELOG.md
@@ -0,0 +1,110 @@
+### [5.1.2](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) (2021-03-06)
+
+
+### Bug Fixes
+
+* eliminate ReDoS ([#36](https://github.com/gulpjs/glob-parent/issues/36)) ([f923116](https://github.com/gulpjs/glob-parent/commit/f9231168b0041fea3f8f954b3cceb56269fc6366))
+
+### [5.1.1](https://github.com/gulpjs/glob-parent/compare/v5.1.0...v5.1.1) (2021-01-27)
+
+
+### Bug Fixes
+
+* unescape exclamation mark ([#26](https://github.com/gulpjs/glob-parent/issues/26)) ([a98874f](https://github.com/gulpjs/glob-parent/commit/a98874f1a59e407f4fb1beb0db4efa8392da60bb))
+
+## [5.1.0](https://github.com/gulpjs/glob-parent/compare/v5.0.0...v5.1.0) (2021-01-27)
+
+
+### Features
+
+* add `flipBackslashes` option to disable auto conversion of slashes (closes [#24](https://github.com/gulpjs/glob-parent/issues/24)) ([#25](https://github.com/gulpjs/glob-parent/issues/25)) ([eecf91d](https://github.com/gulpjs/glob-parent/commit/eecf91d5e3834ed78aee39c4eaaae654d76b87b3))
+
+## [5.0.0](https://github.com/gulpjs/glob-parent/compare/v4.0.0...v5.0.0) (2021-01-27)
+
+
+### ⚠ BREAKING CHANGES
+
+* Drop support for node <6 & bump dependencies
+
+### Miscellaneous Chores
+
+* Drop support for node <6 & bump dependencies ([896c0c0](https://github.com/gulpjs/glob-parent/commit/896c0c00b4e7362f60b96e7fc295ae929245255a))
+
+## [4.0.0](https://github.com/gulpjs/glob-parent/compare/v3.1.0...v4.0.0) (2021-01-27)
+
+
+### ⚠ BREAKING CHANGES
+
+* question marks are valid path characters on Windows so avoid flagging as a glob when alone
+* Update is-glob dependency
+
+### Features
+
+* hoist regexps and strings for performance gains ([4a80667](https://github.com/gulpjs/glob-parent/commit/4a80667c69355c76a572a5892b0f133c8e1f457e))
+* question marks are valid path characters on Windows so avoid flagging as a glob when alone ([2a551dd](https://github.com/gulpjs/glob-parent/commit/2a551dd0dc3235e78bf3c94843d4107072d17841))
+* Update is-glob dependency ([e41fcd8](https://github.com/gulpjs/glob-parent/commit/e41fcd895d1f7bc617dba45c9d935a7949b9c281))
+
+## [3.1.0](https://github.com/gulpjs/glob-parent/compare/v3.0.1...v3.1.0) (2021-01-27)
+
+
+### Features
+
+* allow basic win32 backslash use ([272afa5](https://github.com/gulpjs/glob-parent/commit/272afa5fd070fc0f796386a5993d4ee4a846988b))
+* handle extglobs (parentheses) containing separators ([7db1bdb](https://github.com/gulpjs/glob-parent/commit/7db1bdb0756e55fd14619e8ce31aa31b17b117fd))
+* new approach to braces/brackets handling ([8269bd8](https://github.com/gulpjs/glob-parent/commit/8269bd89290d99fac9395a354fb56fdcdb80f0be))
+* pre-process braces/brackets sections ([9ef8a87](https://github.com/gulpjs/glob-parent/commit/9ef8a87f66b1a43d0591e7a8e4fc5a18415ee388))
+* preserve escaped brace/bracket at end of string ([8cfb0ba](https://github.com/gulpjs/glob-parent/commit/8cfb0ba84202d51571340dcbaf61b79d16a26c76))
+
+
+### Bug Fixes
+
+* trailing escaped square brackets ([99ec9fe](https://github.com/gulpjs/glob-parent/commit/99ec9fecc60ee488ded20a94dd4f18b4f55c4ccf))
+
+### [3.0.1](https://github.com/gulpjs/glob-parent/compare/v3.0.0...v3.0.1) (2021-01-27)
+
+
+### Features
+
+* use path-dirname ponyfill ([cdbea5f](https://github.com/gulpjs/glob-parent/commit/cdbea5f32a58a54e001a75ddd7c0fccd4776aacc))
+
+
+### Bug Fixes
+
+* unescape glob-escaped dirnames on output ([598c533](https://github.com/gulpjs/glob-parent/commit/598c533bdf49c1428bc063aa9b8db40c5a86b030))
+
+## [3.0.0](https://github.com/gulpjs/glob-parent/compare/v2.0.0...v3.0.0) (2021-01-27)
+
+
+### ⚠ BREAKING CHANGES
+
+* update is-glob dependency
+
+### Features
+
+* update is-glob dependency ([5c5f8ef](https://github.com/gulpjs/glob-parent/commit/5c5f8efcee362a8e7638cf8220666acd8784f6bd))
+
+## [2.0.0](https://github.com/gulpjs/glob-parent/compare/v1.3.0...v2.0.0) (2021-01-27)
+
+
+### Features
+
+* move up to dirname regardless of glob characters ([f97fb83](https://github.com/gulpjs/glob-parent/commit/f97fb83be2e0a9fc8d3b760e789d2ecadd6aa0c2))
+
+## [1.3.0](https://github.com/gulpjs/glob-parent/compare/v1.2.0...v1.3.0) (2021-01-27)
+
+## [1.2.0](https://github.com/gulpjs/glob-parent/compare/v1.1.0...v1.2.0) (2021-01-27)
+
+
+### Reverts
+
+* feat: make regex test strings smaller ([dc80fa9](https://github.com/gulpjs/glob-parent/commit/dc80fa9658dca20549cfeba44bbd37d5246fcce0))
+
+## [1.1.0](https://github.com/gulpjs/glob-parent/compare/v1.0.0...v1.1.0) (2021-01-27)
+
+
+### Features
+
+* make regex test strings smaller ([cd83220](https://github.com/gulpjs/glob-parent/commit/cd832208638f45169f986d80fcf66e401f35d233))
+
+## 1.0.0 (2021-01-27)
+
diff --git a/node_modules/fast-glob/node_modules/glob-parent/LICENSE b/node_modules/fast-glob/node_modules/glob-parent/LICENSE
new file mode 100644
index 0000000..63222d7
--- /dev/null
+++ b/node_modules/fast-glob/node_modules/glob-parent/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) 2015, 2019 Elan Shanker
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/fast-glob/node_modules/glob-parent/README.md b/node_modules/fast-glob/node_modules/glob-parent/README.md
new file mode 100644
index 0000000..36a2793
--- /dev/null
+++ b/node_modules/fast-glob/node_modules/glob-parent/README.md
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+# glob-parent
+
+[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Azure Pipelines Build Status][azure-pipelines-image]][azure-pipelines-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url]
+
+Extract the non-magic parent path from a glob string.
+
+## Usage
+
+```js
+var globParent = require('glob-parent');
+
+globParent('path/to/*.js'); // 'path/to'
+globParent('/root/path/to/*.js'); // '/root/path/to'
+globParent('/*.js'); // '/'
+globParent('*.js'); // '.'
+globParent('**/*.js'); // '.'
+globParent('path/{to,from}'); // 'path'
+globParent('path/!(to|from)'); // 'path'
+globParent('path/?(to|from)'); // 'path'
+globParent('path/+(to|from)'); // 'path'
+globParent('path/*(to|from)'); // 'path'
+globParent('path/@(to|from)'); // 'path'
+globParent('path/**/*'); // 'path'
+
+// if provided a non-glob path, returns the nearest dir
+globParent('path/foo/bar.js'); // 'path/foo'
+globParent('path/foo/'); // 'path/foo'
+globParent('path/foo'); // 'path' (see issue #3 for details)
+```
+
+## API
+
+### `globParent(maybeGlobString, [options])`
+
+Takes a string and returns the part of the path before the glob begins. Be aware of Escaping rules and Limitations below.
+
+#### options
+
+```js
+{
+ // Disables the automatic conversion of slashes for Windows
+ flipBackslashes: true
+}
+```
+
+## Escaping
+
+The following characters have special significance in glob patterns and must be escaped if you want them to be treated as regular path characters:
+
+- `?` (question mark) unless used as a path segment alone
+- `*` (asterisk)
+- `|` (pipe)
+- `(` (opening parenthesis)
+- `)` (closing parenthesis)
+- `{` (opening curly brace)
+- `}` (closing curly brace)
+- `[` (opening bracket)
+- `]` (closing bracket)
+
+**Example**
+
+```js
+globParent('foo/[bar]/') // 'foo'
+globParent('foo/\\[bar]/') // 'foo/[bar]'
+```
+
+## Limitations
+
+### Braces & Brackets
+This library attempts a quick and imperfect method of determining which path
+parts have glob magic without fully parsing/lexing the pattern. There are some
+advanced use cases that can trip it up, such as nested braces where the outer
+pair is escaped and the inner one contains a path separator. If you find
+yourself in the unlikely circumstance of being affected by this or need to
+ensure higher-fidelity glob handling in your library, it is recommended that you
+pre-process your input with [expand-braces] and/or [expand-brackets].
+
+### Windows
+Backslashes are not valid path separators for globs. If a path with backslashes
+is provided anyway, for simple cases, glob-parent will replace the path
+separator for you and return the non-glob parent path (now with
+forward-slashes, which are still valid as Windows path separators).
+
+This cannot be used in conjunction with escape characters.
+
+```js
+// BAD
+globParent('C:\\Program Files \\(x86\\)\\*.ext') // 'C:/Program Files /(x86/)'
+
+// GOOD
+globParent('C:/Program Files\\(x86\\)/*.ext') // 'C:/Program Files (x86)'
+```
+
+If you are using escape characters for a pattern without path parts (i.e.
+relative to `cwd`), prefix with `./` to avoid confusing glob-parent.
+
+```js
+// BAD
+globParent('foo \\[bar]') // 'foo '
+globParent('foo \\[bar]*') // 'foo '
+
+// GOOD
+globParent('./foo \\[bar]') // 'foo [bar]'
+globParent('./foo \\[bar]*') // '.'
+```
+
+## License
+
+ISC
+
+[expand-braces]: https://github.com/jonschlinkert/expand-braces
+[expand-brackets]: https://github.com/jonschlinkert/expand-brackets
+
+[downloads-image]: https://img.shields.io/npm/dm/glob-parent.svg
+[npm-url]: https://www.npmjs.com/package/glob-parent
+[npm-image]: https://img.shields.io/npm/v/glob-parent.svg
+
+[azure-pipelines-url]: https://dev.azure.com/gulpjs/gulp/_build/latest?definitionId=2&branchName=master
+[azure-pipelines-image]: https://dev.azure.com/gulpjs/gulp/_apis/build/status/glob-parent?branchName=master
+
+[travis-url]: https://travis-ci.org/gulpjs/glob-parent
+[travis-image]: https://img.shields.io/travis/gulpjs/glob-parent.svg?label=travis-ci
+
+[appveyor-url]: https://ci.appveyor.com/project/gulpjs/glob-parent
+[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/glob-parent.svg?label=appveyor
+
+[coveralls-url]: https://coveralls.io/r/gulpjs/glob-parent
+[coveralls-image]: https://img.shields.io/coveralls/gulpjs/glob-parent/master.svg
+
+[gitter-url]: https://gitter.im/gulpjs/gulp
+[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg
diff --git a/node_modules/fast-glob/node_modules/glob-parent/index.js b/node_modules/fast-glob/node_modules/glob-parent/index.js
new file mode 100644
index 0000000..09e257e
--- /dev/null
+++ b/node_modules/fast-glob/node_modules/glob-parent/index.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var isGlob = require('is-glob');
+var pathPosixDirname = require('path').posix.dirname;
+var isWin32 = require('os').platform() === 'win32';
+
+var slash = '/';
+var backslash = /\\/g;
+var enclosure = /[\{\[].*[\}\]]$/;
+var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/;
+var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g;
+
+/**
+ * @param {string} str
+ * @param {Object} opts
+ * @param {boolean} [opts.flipBackslashes=true]
+ * @returns {string}
+ */
+module.exports = function globParent(str, opts) {
+ var options = Object.assign({ flipBackslashes: true }, opts);
+
+ // flip windows path separators
+ if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) {
+ str = str.replace(backslash, slash);
+ }
+
+ // special case for strings ending in enclosure containing path separator
+ if (enclosure.test(str)) {
+ str += slash;
+ }
+
+ // preserves full path in case of trailing path separator
+ str += 'a';
+
+ // remove path parts that are globby
+ do {
+ str = pathPosixDirname(str);
+ } while (isGlob(str) || globby.test(str));
+
+ // remove escape chars and return result
+ return str.replace(escaped, '$1');
+};
diff --git a/node_modules/fast-glob/node_modules/glob-parent/package.json b/node_modules/fast-glob/node_modules/glob-parent/package.json
new file mode 100644
index 0000000..125c971
--- /dev/null
+++ b/node_modules/fast-glob/node_modules/glob-parent/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "glob-parent",
+ "version": "5.1.2",
+ "description": "Extract the non-magic parent path from a glob string.",
+ "author": "Gulp Team (https://gulpjs.com/)",
+ "contributors": [
+ "Elan Shanker (https://github.com/es128)",
+ "Blaine Bublitz "
+ ],
+ "repository": "gulpjs/glob-parent",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ },
+ "main": "index.js",
+ "files": [
+ "LICENSE",
+ "index.js"
+ ],
+ "scripts": {
+ "lint": "eslint .",
+ "pretest": "npm run lint",
+ "test": "nyc mocha --async-only",
+ "azure-pipelines": "nyc mocha --async-only --reporter xunit -O output=test.xunit",
+ "coveralls": "nyc report --reporter=text-lcov | coveralls"
+ },
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "devDependencies": {
+ "coveralls": "^3.0.11",
+ "eslint": "^2.13.1",
+ "eslint-config-gulp": "^3.0.1",
+ "expect": "^1.20.2",
+ "mocha": "^6.0.2",
+ "nyc": "^13.3.0"
+ },
+ "keywords": [
+ "glob",
+ "parent",
+ "strip",
+ "path",
+ "dirname",
+ "directory",
+ "base",
+ "wildcard"
+ ]
+}
diff --git a/node_modules/fast-glob/out/index.d.ts b/node_modules/fast-glob/out/index.d.ts
new file mode 100644
index 0000000..46823bb
--- /dev/null
+++ b/node_modules/fast-glob/out/index.d.ts
@@ -0,0 +1,40 @@
+///
+import * as taskManager from './managers/tasks';
+import { Options as OptionsInternal } from './settings';
+import { Entry as EntryInternal, FileSystemAdapter as FileSystemAdapterInternal, Pattern as PatternInternal } from './types';
+type EntryObjectModePredicate = {
+ [TKey in keyof Pick]-?: true;
+};
+type EntryStatsPredicate = {
+ [TKey in keyof Pick]-?: true;
+};
+type EntryObjectPredicate = EntryObjectModePredicate | EntryStatsPredicate;
+declare function FastGlob(source: PatternInternal | PatternInternal[], options: OptionsInternal & EntryObjectPredicate): Promise;
+declare function FastGlob(source: PatternInternal | PatternInternal[], options?: OptionsInternal): Promise;
+declare namespace FastGlob {
+ type Options = OptionsInternal;
+ type Entry = EntryInternal;
+ type Task = taskManager.Task;
+ type Pattern = PatternInternal;
+ type FileSystemAdapter = FileSystemAdapterInternal;
+ const glob: typeof FastGlob;
+ const globSync: typeof sync;
+ const globStream: typeof stream;
+ const async: typeof FastGlob;
+ function sync(source: PatternInternal | PatternInternal[], options: OptionsInternal & EntryObjectPredicate): EntryInternal[];
+ function sync(source: PatternInternal | PatternInternal[], options?: OptionsInternal): string[];
+ function stream(source: PatternInternal | PatternInternal[], options?: OptionsInternal): NodeJS.ReadableStream;
+ function generateTasks(source: PatternInternal | PatternInternal[], options?: OptionsInternal): Task[];
+ function isDynamicPattern(source: PatternInternal, options?: OptionsInternal): boolean;
+ function escapePath(source: string): PatternInternal;
+ function convertPathToPattern(source: string): PatternInternal;
+ namespace posix {
+ function escapePath(source: string): PatternInternal;
+ function convertPathToPattern(source: string): PatternInternal;
+ }
+ namespace win32 {
+ function escapePath(source: string): PatternInternal;
+ function convertPathToPattern(source: string): PatternInternal;
+ }
+}
+export = FastGlob;
diff --git a/node_modules/fast-glob/out/index.js b/node_modules/fast-glob/out/index.js
new file mode 100644
index 0000000..90365d4
--- /dev/null
+++ b/node_modules/fast-glob/out/index.js
@@ -0,0 +1,102 @@
+"use strict";
+const taskManager = require("./managers/tasks");
+const async_1 = require("./providers/async");
+const stream_1 = require("./providers/stream");
+const sync_1 = require("./providers/sync");
+const settings_1 = require("./settings");
+const utils = require("./utils");
+async function FastGlob(source, options) {
+ assertPatternsInput(source);
+ const works = getWorks(source, async_1.default, options);
+ const result = await Promise.all(works);
+ return utils.array.flatten(result);
+}
+// https://github.com/typescript-eslint/typescript-eslint/issues/60
+// eslint-disable-next-line no-redeclare
+(function (FastGlob) {
+ FastGlob.glob = FastGlob;
+ FastGlob.globSync = sync;
+ FastGlob.globStream = stream;
+ FastGlob.async = FastGlob;
+ function sync(source, options) {
+ assertPatternsInput(source);
+ const works = getWorks(source, sync_1.default, options);
+ return utils.array.flatten(works);
+ }
+ FastGlob.sync = sync;
+ function stream(source, options) {
+ assertPatternsInput(source);
+ const works = getWorks(source, stream_1.default, options);
+ /**
+ * The stream returned by the provider cannot work with an asynchronous iterator.
+ * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams.
+ * This affects performance (+25%). I don't see best solution right now.
+ */
+ return utils.stream.merge(works);
+ }
+ FastGlob.stream = stream;
+ function generateTasks(source, options) {
+ assertPatternsInput(source);
+ const patterns = [].concat(source);
+ const settings = new settings_1.default(options);
+ return taskManager.generate(patterns, settings);
+ }
+ FastGlob.generateTasks = generateTasks;
+ function isDynamicPattern(source, options) {
+ assertPatternsInput(source);
+ const settings = new settings_1.default(options);
+ return utils.pattern.isDynamicPattern(source, settings);
+ }
+ FastGlob.isDynamicPattern = isDynamicPattern;
+ function escapePath(source) {
+ assertPatternsInput(source);
+ return utils.path.escape(source);
+ }
+ FastGlob.escapePath = escapePath;
+ function convertPathToPattern(source) {
+ assertPatternsInput(source);
+ return utils.path.convertPathToPattern(source);
+ }
+ FastGlob.convertPathToPattern = convertPathToPattern;
+ let posix;
+ (function (posix) {
+ function escapePath(source) {
+ assertPatternsInput(source);
+ return utils.path.escapePosixPath(source);
+ }
+ posix.escapePath = escapePath;
+ function convertPathToPattern(source) {
+ assertPatternsInput(source);
+ return utils.path.convertPosixPathToPattern(source);
+ }
+ posix.convertPathToPattern = convertPathToPattern;
+ })(posix = FastGlob.posix || (FastGlob.posix = {}));
+ let win32;
+ (function (win32) {
+ function escapePath(source) {
+ assertPatternsInput(source);
+ return utils.path.escapeWindowsPath(source);
+ }
+ win32.escapePath = escapePath;
+ function convertPathToPattern(source) {
+ assertPatternsInput(source);
+ return utils.path.convertWindowsPathToPattern(source);
+ }
+ win32.convertPathToPattern = convertPathToPattern;
+ })(win32 = FastGlob.win32 || (FastGlob.win32 = {}));
+})(FastGlob || (FastGlob = {}));
+function getWorks(source, _Provider, options) {
+ const patterns = [].concat(source);
+ const settings = new settings_1.default(options);
+ const tasks = taskManager.generate(patterns, settings);
+ const provider = new _Provider(settings);
+ return tasks.map(provider.read, provider);
+}
+function assertPatternsInput(input) {
+ const source = [].concat(input);
+ const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item));
+ if (!isValidSource) {
+ throw new TypeError('Patterns must be a string (non empty) or an array of strings');
+ }
+}
+module.exports = FastGlob;
diff --git a/node_modules/fast-glob/out/managers/tasks.d.ts b/node_modules/fast-glob/out/managers/tasks.d.ts
new file mode 100644
index 0000000..59d2c42
--- /dev/null
+++ b/node_modules/fast-glob/out/managers/tasks.d.ts
@@ -0,0 +1,22 @@
+import Settings from '../settings';
+import { Pattern, PatternsGroup } from '../types';
+export type Task = {
+ base: string;
+ dynamic: boolean;
+ patterns: Pattern[];
+ positive: Pattern[];
+ negative: Pattern[];
+};
+export declare function generate(input: Pattern[], settings: Settings): Task[];
+/**
+ * Returns tasks grouped by basic pattern directories.
+ *
+ * Patterns that can be found inside (`./`) and outside (`../`) the current directory are handled separately.
+ * This is necessary because directory traversal starts at the base directory and goes deeper.
+ */
+export declare function convertPatternsToTasks(positive: Pattern[], negative: Pattern[], dynamic: boolean): Task[];
+export declare function getPositivePatterns(patterns: Pattern[]): Pattern[];
+export declare function getNegativePatternsAsPositive(patterns: Pattern[], ignore: Pattern[]): Pattern[];
+export declare function groupPatternsByBaseDirectory(patterns: Pattern[]): PatternsGroup;
+export declare function convertPatternGroupsToTasks(positive: PatternsGroup, negative: Pattern[], dynamic: boolean): Task[];
+export declare function convertPatternGroupToTask(base: string, positive: Pattern[], negative: Pattern[], dynamic: boolean): Task;
diff --git a/node_modules/fast-glob/out/managers/tasks.js b/node_modules/fast-glob/out/managers/tasks.js
new file mode 100644
index 0000000..335a765
--- /dev/null
+++ b/node_modules/fast-glob/out/managers/tasks.js
@@ -0,0 +1,110 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.convertPatternGroupToTask = exports.convertPatternGroupsToTasks = exports.groupPatternsByBaseDirectory = exports.getNegativePatternsAsPositive = exports.getPositivePatterns = exports.convertPatternsToTasks = exports.generate = void 0;
+const utils = require("../utils");
+function generate(input, settings) {
+ const patterns = processPatterns(input, settings);
+ const ignore = processPatterns(settings.ignore, settings);
+ const positivePatterns = getPositivePatterns(patterns);
+ const negativePatterns = getNegativePatternsAsPositive(patterns, ignore);
+ const staticPatterns = positivePatterns.filter((pattern) => utils.pattern.isStaticPattern(pattern, settings));
+ const dynamicPatterns = positivePatterns.filter((pattern) => utils.pattern.isDynamicPattern(pattern, settings));
+ const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false);
+ const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true);
+ return staticTasks.concat(dynamicTasks);
+}
+exports.generate = generate;
+function processPatterns(input, settings) {
+ let patterns = input;
+ /**
+ * The original pattern like `{,*,**,a/*}` can lead to problems checking the depth when matching entry
+ * and some problems with the micromatch package (see fast-glob issues: #365, #394).
+ *
+ * To solve this problem, we expand all patterns containing brace expansion. This can lead to a slight slowdown
+ * in matching in the case of a large set of patterns after expansion.
+ */
+ if (settings.braceExpansion) {
+ patterns = utils.pattern.expandPatternsWithBraceExpansion(patterns);
+ }
+ /**
+ * If the `baseNameMatch` option is enabled, we must add globstar to patterns, so that they can be used
+ * at any nesting level.
+ *
+ * We do this here, because otherwise we have to complicate the filtering logic. For example, we need to change
+ * the pattern in the filter before creating a regular expression. There is no need to change the patterns
+ * in the application. Only on the input.
+ */
+ if (settings.baseNameMatch) {
+ patterns = patterns.map((pattern) => pattern.includes('/') ? pattern : `**/${pattern}`);
+ }
+ /**
+ * This method also removes duplicate slashes that may have been in the pattern or formed as a result of expansion.
+ */
+ return patterns.map((pattern) => utils.pattern.removeDuplicateSlashes(pattern));
+}
+/**
+ * Returns tasks grouped by basic pattern directories.
+ *
+ * Patterns that can be found inside (`./`) and outside (`../`) the current directory are handled separately.
+ * This is necessary because directory traversal starts at the base directory and goes deeper.
+ */
+function convertPatternsToTasks(positive, negative, dynamic) {
+ const tasks = [];
+ const patternsOutsideCurrentDirectory = utils.pattern.getPatternsOutsideCurrentDirectory(positive);
+ const patternsInsideCurrentDirectory = utils.pattern.getPatternsInsideCurrentDirectory(positive);
+ const outsideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsOutsideCurrentDirectory);
+ const insideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsInsideCurrentDirectory);
+ tasks.push(...convertPatternGroupsToTasks(outsideCurrentDirectoryGroup, negative, dynamic));
+ /*
+ * For the sake of reducing future accesses to the file system, we merge all tasks within the current directory
+ * into a global task, if at least one pattern refers to the root (`.`). In this case, the global task covers the rest.
+ */
+ if ('.' in insideCurrentDirectoryGroup) {
+ tasks.push(convertPatternGroupToTask('.', patternsInsideCurrentDirectory, negative, dynamic));
+ }
+ else {
+ tasks.push(...convertPatternGroupsToTasks(insideCurrentDirectoryGroup, negative, dynamic));
+ }
+ return tasks;
+}
+exports.convertPatternsToTasks = convertPatternsToTasks;
+function getPositivePatterns(patterns) {
+ return utils.pattern.getPositivePatterns(patterns);
+}
+exports.getPositivePatterns = getPositivePatterns;
+function getNegativePatternsAsPositive(patterns, ignore) {
+ const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore);
+ const positive = negative.map(utils.pattern.convertToPositivePattern);
+ return positive;
+}
+exports.getNegativePatternsAsPositive = getNegativePatternsAsPositive;
+function groupPatternsByBaseDirectory(patterns) {
+ const group = {};
+ return patterns.reduce((collection, pattern) => {
+ const base = utils.pattern.getBaseDirectory(pattern);
+ if (base in collection) {
+ collection[base].push(pattern);
+ }
+ else {
+ collection[base] = [pattern];
+ }
+ return collection;
+ }, group);
+}
+exports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory;
+function convertPatternGroupsToTasks(positive, negative, dynamic) {
+ return Object.keys(positive).map((base) => {
+ return convertPatternGroupToTask(base, positive[base], negative, dynamic);
+ });
+}
+exports.convertPatternGroupsToTasks = convertPatternGroupsToTasks;
+function convertPatternGroupToTask(base, positive, negative, dynamic) {
+ return {
+ dynamic,
+ positive,
+ negative,
+ base,
+ patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern))
+ };
+}
+exports.convertPatternGroupToTask = convertPatternGroupToTask;
diff --git a/node_modules/fast-glob/out/providers/async.d.ts b/node_modules/fast-glob/out/providers/async.d.ts
new file mode 100644
index 0000000..2742616
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/async.d.ts
@@ -0,0 +1,9 @@
+import { Task } from '../managers/tasks';
+import { Entry, EntryItem, ReaderOptions } from '../types';
+import ReaderAsync from '../readers/async';
+import Provider from './provider';
+export default class ProviderAsync extends Provider> {
+ protected _reader: ReaderAsync;
+ read(task: Task): Promise;
+ api(root: string, task: Task, options: ReaderOptions): Promise;
+}
diff --git a/node_modules/fast-glob/out/providers/async.js b/node_modules/fast-glob/out/providers/async.js
new file mode 100644
index 0000000..0c5286e
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/async.js
@@ -0,0 +1,23 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const async_1 = require("../readers/async");
+const provider_1 = require("./provider");
+class ProviderAsync extends provider_1.default {
+ constructor() {
+ super(...arguments);
+ this._reader = new async_1.default(this._settings);
+ }
+ async read(task) {
+ const root = this._getRootDirectory(task);
+ const options = this._getReaderOptions(task);
+ const entries = await this.api(root, task, options);
+ return entries.map((entry) => options.transform(entry));
+ }
+ api(root, task, options) {
+ if (task.dynamic) {
+ return this._reader.dynamic(root, options);
+ }
+ return this._reader.static(task.patterns, options);
+ }
+}
+exports.default = ProviderAsync;
diff --git a/node_modules/fast-glob/out/providers/filters/deep.d.ts b/node_modules/fast-glob/out/providers/filters/deep.d.ts
new file mode 100644
index 0000000..377fab8
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/filters/deep.d.ts
@@ -0,0 +1,16 @@
+import { MicromatchOptions, EntryFilterFunction, Pattern } from '../../types';
+import Settings from '../../settings';
+export default class DeepFilter {
+ private readonly _settings;
+ private readonly _micromatchOptions;
+ constructor(_settings: Settings, _micromatchOptions: MicromatchOptions);
+ getFilter(basePath: string, positive: Pattern[], negative: Pattern[]): EntryFilterFunction;
+ private _getMatcher;
+ private _getNegativePatternsRe;
+ private _filter;
+ private _isSkippedByDeep;
+ private _getEntryLevel;
+ private _isSkippedSymbolicLink;
+ private _isSkippedByPositivePatterns;
+ private _isSkippedByNegativePatterns;
+}
diff --git a/node_modules/fast-glob/out/providers/filters/deep.js b/node_modules/fast-glob/out/providers/filters/deep.js
new file mode 100644
index 0000000..644bf41
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/filters/deep.js
@@ -0,0 +1,62 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const utils = require("../../utils");
+const partial_1 = require("../matchers/partial");
+class DeepFilter {
+ constructor(_settings, _micromatchOptions) {
+ this._settings = _settings;
+ this._micromatchOptions = _micromatchOptions;
+ }
+ getFilter(basePath, positive, negative) {
+ const matcher = this._getMatcher(positive);
+ const negativeRe = this._getNegativePatternsRe(negative);
+ return (entry) => this._filter(basePath, entry, matcher, negativeRe);
+ }
+ _getMatcher(patterns) {
+ return new partial_1.default(patterns, this._settings, this._micromatchOptions);
+ }
+ _getNegativePatternsRe(patterns) {
+ const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern);
+ return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions);
+ }
+ _filter(basePath, entry, matcher, negativeRe) {
+ if (this._isSkippedByDeep(basePath, entry.path)) {
+ return false;
+ }
+ if (this._isSkippedSymbolicLink(entry)) {
+ return false;
+ }
+ const filepath = utils.path.removeLeadingDotSegment(entry.path);
+ if (this._isSkippedByPositivePatterns(filepath, matcher)) {
+ return false;
+ }
+ return this._isSkippedByNegativePatterns(filepath, negativeRe);
+ }
+ _isSkippedByDeep(basePath, entryPath) {
+ /**
+ * Avoid unnecessary depth calculations when it doesn't matter.
+ */
+ if (this._settings.deep === Infinity) {
+ return false;
+ }
+ return this._getEntryLevel(basePath, entryPath) >= this._settings.deep;
+ }
+ _getEntryLevel(basePath, entryPath) {
+ const entryPathDepth = entryPath.split('/').length;
+ if (basePath === '') {
+ return entryPathDepth;
+ }
+ const basePathDepth = basePath.split('/').length;
+ return entryPathDepth - basePathDepth;
+ }
+ _isSkippedSymbolicLink(entry) {
+ return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink();
+ }
+ _isSkippedByPositivePatterns(entryPath, matcher) {
+ return !this._settings.baseNameMatch && !matcher.match(entryPath);
+ }
+ _isSkippedByNegativePatterns(entryPath, patternsRe) {
+ return !utils.pattern.matchAny(entryPath, patternsRe);
+ }
+}
+exports.default = DeepFilter;
diff --git a/node_modules/fast-glob/out/providers/filters/entry.d.ts b/node_modules/fast-glob/out/providers/filters/entry.d.ts
new file mode 100644
index 0000000..ee71281
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/filters/entry.d.ts
@@ -0,0 +1,16 @@
+import Settings from '../../settings';
+import { EntryFilterFunction, MicromatchOptions, Pattern } from '../../types';
+export default class EntryFilter {
+ private readonly _settings;
+ private readonly _micromatchOptions;
+ readonly index: Map;
+ constructor(_settings: Settings, _micromatchOptions: MicromatchOptions);
+ getFilter(positive: Pattern[], negative: Pattern[]): EntryFilterFunction;
+ private _filter;
+ private _isDuplicateEntry;
+ private _createIndexRecord;
+ private _onlyFileFilter;
+ private _onlyDirectoryFilter;
+ private _isSkippedByAbsoluteNegativePatterns;
+ private _isMatchToPatterns;
+}
diff --git a/node_modules/fast-glob/out/providers/filters/entry.js b/node_modules/fast-glob/out/providers/filters/entry.js
new file mode 100644
index 0000000..361a7b4
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/filters/entry.js
@@ -0,0 +1,63 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const utils = require("../../utils");
+class EntryFilter {
+ constructor(_settings, _micromatchOptions) {
+ this._settings = _settings;
+ this._micromatchOptions = _micromatchOptions;
+ this.index = new Map();
+ }
+ getFilter(positive, negative) {
+ const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions);
+ const negativeRe = utils.pattern.convertPatternsToRe(negative, Object.assign(Object.assign({}, this._micromatchOptions), { dot: true }));
+ return (entry) => this._filter(entry, positiveRe, negativeRe);
+ }
+ _filter(entry, positiveRe, negativeRe) {
+ const filepath = utils.path.removeLeadingDotSegment(entry.path);
+ if (this._settings.unique && this._isDuplicateEntry(filepath)) {
+ return false;
+ }
+ if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) {
+ return false;
+ }
+ if (this._isSkippedByAbsoluteNegativePatterns(filepath, negativeRe)) {
+ return false;
+ }
+ const isDirectory = entry.dirent.isDirectory();
+ const isMatched = this._isMatchToPatterns(filepath, positiveRe, isDirectory) && !this._isMatchToPatterns(filepath, negativeRe, isDirectory);
+ if (this._settings.unique && isMatched) {
+ this._createIndexRecord(filepath);
+ }
+ return isMatched;
+ }
+ _isDuplicateEntry(filepath) {
+ return this.index.has(filepath);
+ }
+ _createIndexRecord(filepath) {
+ this.index.set(filepath, undefined);
+ }
+ _onlyFileFilter(entry) {
+ return this._settings.onlyFiles && !entry.dirent.isFile();
+ }
+ _onlyDirectoryFilter(entry) {
+ return this._settings.onlyDirectories && !entry.dirent.isDirectory();
+ }
+ _isSkippedByAbsoluteNegativePatterns(entryPath, patternsRe) {
+ if (!this._settings.absolute) {
+ return false;
+ }
+ const fullpath = utils.path.makeAbsolute(this._settings.cwd, entryPath);
+ return utils.pattern.matchAny(fullpath, patternsRe);
+ }
+ _isMatchToPatterns(filepath, patternsRe, isDirectory) {
+ // Trying to match files and directories by patterns.
+ const isMatched = utils.pattern.matchAny(filepath, patternsRe);
+ // A pattern with a trailling slash can be used for directory matching.
+ // To apply such pattern, we need to add a tralling slash to the path.
+ if (!isMatched && isDirectory) {
+ return utils.pattern.matchAny(filepath + '/', patternsRe);
+ }
+ return isMatched;
+ }
+}
+exports.default = EntryFilter;
diff --git a/node_modules/fast-glob/out/providers/filters/error.d.ts b/node_modules/fast-glob/out/providers/filters/error.d.ts
new file mode 100644
index 0000000..170eb25
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/filters/error.d.ts
@@ -0,0 +1,8 @@
+import Settings from '../../settings';
+import { ErrorFilterFunction } from '../../types';
+export default class ErrorFilter {
+ private readonly _settings;
+ constructor(_settings: Settings);
+ getFilter(): ErrorFilterFunction;
+ private _isNonFatalError;
+}
diff --git a/node_modules/fast-glob/out/providers/filters/error.js b/node_modules/fast-glob/out/providers/filters/error.js
new file mode 100644
index 0000000..1c6f241
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/filters/error.js
@@ -0,0 +1,15 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const utils = require("../../utils");
+class ErrorFilter {
+ constructor(_settings) {
+ this._settings = _settings;
+ }
+ getFilter() {
+ return (error) => this._isNonFatalError(error);
+ }
+ _isNonFatalError(error) {
+ return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors;
+ }
+}
+exports.default = ErrorFilter;
diff --git a/node_modules/fast-glob/out/providers/matchers/matcher.d.ts b/node_modules/fast-glob/out/providers/matchers/matcher.d.ts
new file mode 100644
index 0000000..d04c232
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/matchers/matcher.d.ts
@@ -0,0 +1,33 @@
+import { Pattern, MicromatchOptions, PatternRe } from '../../types';
+import Settings from '../../settings';
+export type PatternSegment = StaticPatternSegment | DynamicPatternSegment;
+type StaticPatternSegment = {
+ dynamic: false;
+ pattern: Pattern;
+};
+type DynamicPatternSegment = {
+ dynamic: true;
+ pattern: Pattern;
+ patternRe: PatternRe;
+};
+export type PatternSection = PatternSegment[];
+export type PatternInfo = {
+ /**
+ * Indicates that the pattern has a globstar (more than a single section).
+ */
+ complete: boolean;
+ pattern: Pattern;
+ segments: PatternSegment[];
+ sections: PatternSection[];
+};
+export default abstract class Matcher {
+ private readonly _patterns;
+ private readonly _settings;
+ private readonly _micromatchOptions;
+ protected readonly _storage: PatternInfo[];
+ constructor(_patterns: Pattern[], _settings: Settings, _micromatchOptions: MicromatchOptions);
+ private _fillStorage;
+ private _getPatternSegments;
+ private _splitSegmentsIntoSections;
+}
+export {};
diff --git a/node_modules/fast-glob/out/providers/matchers/matcher.js b/node_modules/fast-glob/out/providers/matchers/matcher.js
new file mode 100644
index 0000000..eae67c9
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/matchers/matcher.js
@@ -0,0 +1,45 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const utils = require("../../utils");
+class Matcher {
+ constructor(_patterns, _settings, _micromatchOptions) {
+ this._patterns = _patterns;
+ this._settings = _settings;
+ this._micromatchOptions = _micromatchOptions;
+ this._storage = [];
+ this._fillStorage();
+ }
+ _fillStorage() {
+ for (const pattern of this._patterns) {
+ const segments = this._getPatternSegments(pattern);
+ const sections = this._splitSegmentsIntoSections(segments);
+ this._storage.push({
+ complete: sections.length <= 1,
+ pattern,
+ segments,
+ sections
+ });
+ }
+ }
+ _getPatternSegments(pattern) {
+ const parts = utils.pattern.getPatternParts(pattern, this._micromatchOptions);
+ return parts.map((part) => {
+ const dynamic = utils.pattern.isDynamicPattern(part, this._settings);
+ if (!dynamic) {
+ return {
+ dynamic: false,
+ pattern: part
+ };
+ }
+ return {
+ dynamic: true,
+ pattern: part,
+ patternRe: utils.pattern.makeRe(part, this._micromatchOptions)
+ };
+ });
+ }
+ _splitSegmentsIntoSections(segments) {
+ return utils.array.splitWhen(segments, (segment) => segment.dynamic && utils.pattern.hasGlobStar(segment.pattern));
+ }
+}
+exports.default = Matcher;
diff --git a/node_modules/fast-glob/out/providers/matchers/partial.d.ts b/node_modules/fast-glob/out/providers/matchers/partial.d.ts
new file mode 100644
index 0000000..91520f6
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/matchers/partial.d.ts
@@ -0,0 +1,4 @@
+import Matcher from './matcher';
+export default class PartialMatcher extends Matcher {
+ match(filepath: string): boolean;
+}
diff --git a/node_modules/fast-glob/out/providers/matchers/partial.js b/node_modules/fast-glob/out/providers/matchers/partial.js
new file mode 100644
index 0000000..1dfffeb
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/matchers/partial.js
@@ -0,0 +1,38 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const matcher_1 = require("./matcher");
+class PartialMatcher extends matcher_1.default {
+ match(filepath) {
+ const parts = filepath.split('/');
+ const levels = parts.length;
+ const patterns = this._storage.filter((info) => !info.complete || info.segments.length > levels);
+ for (const pattern of patterns) {
+ const section = pattern.sections[0];
+ /**
+ * In this case, the pattern has a globstar and we must read all directories unconditionally,
+ * but only if the level has reached the end of the first group.
+ *
+ * fixtures/{a,b}/**
+ * ^ true/false ^ always true
+ */
+ if (!pattern.complete && levels > section.length) {
+ return true;
+ }
+ const match = parts.every((part, index) => {
+ const segment = pattern.segments[index];
+ if (segment.dynamic && segment.patternRe.test(part)) {
+ return true;
+ }
+ if (!segment.dynamic && segment.pattern === part) {
+ return true;
+ }
+ return false;
+ });
+ if (match) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+exports.default = PartialMatcher;
diff --git a/node_modules/fast-glob/out/providers/provider.d.ts b/node_modules/fast-glob/out/providers/provider.d.ts
new file mode 100644
index 0000000..1053460
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/provider.d.ts
@@ -0,0 +1,19 @@
+import { Task } from '../managers/tasks';
+import Settings from '../settings';
+import { MicromatchOptions, ReaderOptions } from '../types';
+import DeepFilter from './filters/deep';
+import EntryFilter from './filters/entry';
+import ErrorFilter from './filters/error';
+import EntryTransformer from './transformers/entry';
+export default abstract class Provider {
+ protected readonly _settings: Settings;
+ readonly errorFilter: ErrorFilter;
+ readonly entryFilter: EntryFilter;
+ readonly deepFilter: DeepFilter;
+ readonly entryTransformer: EntryTransformer;
+ constructor(_settings: Settings);
+ abstract read(_task: Task): T;
+ protected _getRootDirectory(task: Task): string;
+ protected _getReaderOptions(task: Task): ReaderOptions;
+ protected _getMicromatchOptions(): MicromatchOptions;
+}
diff --git a/node_modules/fast-glob/out/providers/provider.js b/node_modules/fast-glob/out/providers/provider.js
new file mode 100644
index 0000000..da88ee0
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/provider.js
@@ -0,0 +1,48 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const path = require("path");
+const deep_1 = require("./filters/deep");
+const entry_1 = require("./filters/entry");
+const error_1 = require("./filters/error");
+const entry_2 = require("./transformers/entry");
+class Provider {
+ constructor(_settings) {
+ this._settings = _settings;
+ this.errorFilter = new error_1.default(this._settings);
+ this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions());
+ this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions());
+ this.entryTransformer = new entry_2.default(this._settings);
+ }
+ _getRootDirectory(task) {
+ return path.resolve(this._settings.cwd, task.base);
+ }
+ _getReaderOptions(task) {
+ const basePath = task.base === '.' ? '' : task.base;
+ return {
+ basePath,
+ pathSegmentSeparator: '/',
+ concurrency: this._settings.concurrency,
+ deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative),
+ entryFilter: this.entryFilter.getFilter(task.positive, task.negative),
+ errorFilter: this.errorFilter.getFilter(),
+ followSymbolicLinks: this._settings.followSymbolicLinks,
+ fs: this._settings.fs,
+ stats: this._settings.stats,
+ throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink,
+ transform: this.entryTransformer.getTransformer()
+ };
+ }
+ _getMicromatchOptions() {
+ return {
+ dot: this._settings.dot,
+ matchBase: this._settings.baseNameMatch,
+ nobrace: !this._settings.braceExpansion,
+ nocase: !this._settings.caseSensitiveMatch,
+ noext: !this._settings.extglob,
+ noglobstar: !this._settings.globstar,
+ posix: true,
+ strictSlashes: false
+ };
+ }
+}
+exports.default = Provider;
diff --git a/node_modules/fast-glob/out/providers/stream.d.ts b/node_modules/fast-glob/out/providers/stream.d.ts
new file mode 100644
index 0000000..3d02a1f
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/stream.d.ts
@@ -0,0 +1,11 @@
+///
+import { Readable } from 'stream';
+import { Task } from '../managers/tasks';
+import ReaderStream from '../readers/stream';
+import { ReaderOptions } from '../types';
+import Provider from './provider';
+export default class ProviderStream extends Provider {
+ protected _reader: ReaderStream;
+ read(task: Task): Readable;
+ api(root: string, task: Task, options: ReaderOptions): Readable;
+}
diff --git a/node_modules/fast-glob/out/providers/stream.js b/node_modules/fast-glob/out/providers/stream.js
new file mode 100644
index 0000000..85da62e
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/stream.js
@@ -0,0 +1,31 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const stream_1 = require("stream");
+const stream_2 = require("../readers/stream");
+const provider_1 = require("./provider");
+class ProviderStream extends provider_1.default {
+ constructor() {
+ super(...arguments);
+ this._reader = new stream_2.default(this._settings);
+ }
+ read(task) {
+ const root = this._getRootDirectory(task);
+ const options = this._getReaderOptions(task);
+ const source = this.api(root, task, options);
+ const destination = new stream_1.Readable({ objectMode: true, read: () => { } });
+ source
+ .once('error', (error) => destination.emit('error', error))
+ .on('data', (entry) => destination.emit('data', options.transform(entry)))
+ .once('end', () => destination.emit('end'));
+ destination
+ .once('close', () => source.destroy());
+ return destination;
+ }
+ api(root, task, options) {
+ if (task.dynamic) {
+ return this._reader.dynamic(root, options);
+ }
+ return this._reader.static(task.patterns, options);
+ }
+}
+exports.default = ProviderStream;
diff --git a/node_modules/fast-glob/out/providers/sync.d.ts b/node_modules/fast-glob/out/providers/sync.d.ts
new file mode 100644
index 0000000..9c0fe1e
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/sync.d.ts
@@ -0,0 +1,9 @@
+import { Task } from '../managers/tasks';
+import ReaderSync from '../readers/sync';
+import { Entry, EntryItem, ReaderOptions } from '../types';
+import Provider from './provider';
+export default class ProviderSync extends Provider {
+ protected _reader: ReaderSync;
+ read(task: Task): EntryItem[];
+ api(root: string, task: Task, options: ReaderOptions): Entry[];
+}
diff --git a/node_modules/fast-glob/out/providers/sync.js b/node_modules/fast-glob/out/providers/sync.js
new file mode 100644
index 0000000..d70aa1b
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/sync.js
@@ -0,0 +1,23 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const sync_1 = require("../readers/sync");
+const provider_1 = require("./provider");
+class ProviderSync extends provider_1.default {
+ constructor() {
+ super(...arguments);
+ this._reader = new sync_1.default(this._settings);
+ }
+ read(task) {
+ const root = this._getRootDirectory(task);
+ const options = this._getReaderOptions(task);
+ const entries = this.api(root, task, options);
+ return entries.map(options.transform);
+ }
+ api(root, task, options) {
+ if (task.dynamic) {
+ return this._reader.dynamic(root, options);
+ }
+ return this._reader.static(task.patterns, options);
+ }
+}
+exports.default = ProviderSync;
diff --git a/node_modules/fast-glob/out/providers/transformers/entry.d.ts b/node_modules/fast-glob/out/providers/transformers/entry.d.ts
new file mode 100644
index 0000000..e9b85fa
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/transformers/entry.d.ts
@@ -0,0 +1,8 @@
+import Settings from '../../settings';
+import { EntryTransformerFunction } from '../../types';
+export default class EntryTransformer {
+ private readonly _settings;
+ constructor(_settings: Settings);
+ getTransformer(): EntryTransformerFunction;
+ private _transform;
+}
diff --git a/node_modules/fast-glob/out/providers/transformers/entry.js b/node_modules/fast-glob/out/providers/transformers/entry.js
new file mode 100644
index 0000000..d11903c
--- /dev/null
+++ b/node_modules/fast-glob/out/providers/transformers/entry.js
@@ -0,0 +1,26 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const utils = require("../../utils");
+class EntryTransformer {
+ constructor(_settings) {
+ this._settings = _settings;
+ }
+ getTransformer() {
+ return (entry) => this._transform(entry);
+ }
+ _transform(entry) {
+ let filepath = entry.path;
+ if (this._settings.absolute) {
+ filepath = utils.path.makeAbsolute(this._settings.cwd, filepath);
+ filepath = utils.path.unixify(filepath);
+ }
+ if (this._settings.markDirectories && entry.dirent.isDirectory()) {
+ filepath += '/';
+ }
+ if (!this._settings.objectMode) {
+ return filepath;
+ }
+ return Object.assign(Object.assign({}, entry), { path: filepath });
+ }
+}
+exports.default = EntryTransformer;
diff --git a/node_modules/fast-glob/out/readers/async.d.ts b/node_modules/fast-glob/out/readers/async.d.ts
new file mode 100644
index 0000000..fbca428
--- /dev/null
+++ b/node_modules/fast-glob/out/readers/async.d.ts
@@ -0,0 +1,10 @@
+import * as fsWalk from '@nodelib/fs.walk';
+import { Entry, ReaderOptions, Pattern } from '../types';
+import Reader from './reader';
+import ReaderStream from './stream';
+export default class ReaderAsync extends Reader> {
+ protected _walkAsync: typeof fsWalk.walk;
+ protected _readerStream: ReaderStream;
+ dynamic(root: string, options: ReaderOptions): Promise;
+ static(patterns: Pattern[], options: ReaderOptions): Promise;
+}
diff --git a/node_modules/fast-glob/out/readers/async.js b/node_modules/fast-glob/out/readers/async.js
new file mode 100644
index 0000000..d024145
--- /dev/null
+++ b/node_modules/fast-glob/out/readers/async.js
@@ -0,0 +1,35 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const fsWalk = require("@nodelib/fs.walk");
+const reader_1 = require("./reader");
+const stream_1 = require("./stream");
+class ReaderAsync extends reader_1.default {
+ constructor() {
+ super(...arguments);
+ this._walkAsync = fsWalk.walk;
+ this._readerStream = new stream_1.default(this._settings);
+ }
+ dynamic(root, options) {
+ return new Promise((resolve, reject) => {
+ this._walkAsync(root, options, (error, entries) => {
+ if (error === null) {
+ resolve(entries);
+ }
+ else {
+ reject(error);
+ }
+ });
+ });
+ }
+ async static(patterns, options) {
+ const entries = [];
+ const stream = this._readerStream.static(patterns, options);
+ // After #235, replace it with an asynchronous iterator.
+ return new Promise((resolve, reject) => {
+ stream.once('error', reject);
+ stream.on('data', (entry) => entries.push(entry));
+ stream.once('end', () => resolve(entries));
+ });
+ }
+}
+exports.default = ReaderAsync;
diff --git a/node_modules/fast-glob/out/readers/reader.d.ts b/node_modules/fast-glob/out/readers/reader.d.ts
new file mode 100644
index 0000000..2af16b6
--- /dev/null
+++ b/node_modules/fast-glob/out/readers/reader.d.ts
@@ -0,0 +1,15 @@
+///
+import * as fs from 'fs';
+import * as fsStat from '@nodelib/fs.stat';
+import Settings from '../settings';
+import { Entry, ErrnoException, Pattern, ReaderOptions } from '../types';
+export default abstract class Reader {
+ protected readonly _settings: Settings;
+ protected readonly _fsStatSettings: fsStat.Settings;
+ constructor(_settings: Settings);
+ abstract dynamic(root: string, options: ReaderOptions): T;
+ abstract static(patterns: Pattern[], options: ReaderOptions): T;
+ protected _getFullEntryPath(filepath: string): string;
+ protected _makeEntry(stats: fs.Stats, pattern: Pattern): Entry;
+ protected _isFatalError(error: ErrnoException): boolean;
+}
diff --git a/node_modules/fast-glob/out/readers/reader.js b/node_modules/fast-glob/out/readers/reader.js
new file mode 100644
index 0000000..7b40255
--- /dev/null
+++ b/node_modules/fast-glob/out/readers/reader.js
@@ -0,0 +1,33 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const path = require("path");
+const fsStat = require("@nodelib/fs.stat");
+const utils = require("../utils");
+class Reader {
+ constructor(_settings) {
+ this._settings = _settings;
+ this._fsStatSettings = new fsStat.Settings({
+ followSymbolicLink: this._settings.followSymbolicLinks,
+ fs: this._settings.fs,
+ throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks
+ });
+ }
+ _getFullEntryPath(filepath) {
+ return path.resolve(this._settings.cwd, filepath);
+ }
+ _makeEntry(stats, pattern) {
+ const entry = {
+ name: pattern,
+ path: pattern,
+ dirent: utils.fs.createDirentFromStats(pattern, stats)
+ };
+ if (this._settings.stats) {
+ entry.stats = stats;
+ }
+ return entry;
+ }
+ _isFatalError(error) {
+ return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors;
+ }
+}
+exports.default = Reader;
diff --git a/node_modules/fast-glob/out/readers/stream.d.ts b/node_modules/fast-glob/out/readers/stream.d.ts
new file mode 100644
index 0000000..1c74cac
--- /dev/null
+++ b/node_modules/fast-glob/out/readers/stream.d.ts
@@ -0,0 +1,14 @@
+///
+import { Readable } from 'stream';
+import * as fsStat from '@nodelib/fs.stat';
+import * as fsWalk from '@nodelib/fs.walk';
+import { Pattern, ReaderOptions } from '../types';
+import Reader from './reader';
+export default class ReaderStream extends Reader {
+ protected _walkStream: typeof fsWalk.walkStream;
+ protected _stat: typeof fsStat.stat;
+ dynamic(root: string, options: ReaderOptions): Readable;
+ static(patterns: Pattern[], options: ReaderOptions): Readable;
+ private _getEntry;
+ private _getStat;
+}
diff --git a/node_modules/fast-glob/out/readers/stream.js b/node_modules/fast-glob/out/readers/stream.js
new file mode 100644
index 0000000..317c6d5
--- /dev/null
+++ b/node_modules/fast-glob/out/readers/stream.js
@@ -0,0 +1,55 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const stream_1 = require("stream");
+const fsStat = require("@nodelib/fs.stat");
+const fsWalk = require("@nodelib/fs.walk");
+const reader_1 = require("./reader");
+class ReaderStream extends reader_1.default {
+ constructor() {
+ super(...arguments);
+ this._walkStream = fsWalk.walkStream;
+ this._stat = fsStat.stat;
+ }
+ dynamic(root, options) {
+ return this._walkStream(root, options);
+ }
+ static(patterns, options) {
+ const filepaths = patterns.map(this._getFullEntryPath, this);
+ const stream = new stream_1.PassThrough({ objectMode: true });
+ stream._write = (index, _enc, done) => {
+ return this._getEntry(filepaths[index], patterns[index], options)
+ .then((entry) => {
+ if (entry !== null && options.entryFilter(entry)) {
+ stream.push(entry);
+ }
+ if (index === filepaths.length - 1) {
+ stream.end();
+ }
+ done();
+ })
+ .catch(done);
+ };
+ for (let i = 0; i < filepaths.length; i++) {
+ stream.write(i);
+ }
+ return stream;
+ }
+ _getEntry(filepath, pattern, options) {
+ return this._getStat(filepath)
+ .then((stats) => this._makeEntry(stats, pattern))
+ .catch((error) => {
+ if (options.errorFilter(error)) {
+ return null;
+ }
+ throw error;
+ });
+ }
+ _getStat(filepath) {
+ return new Promise((resolve, reject) => {
+ this._stat(filepath, this._fsStatSettings, (error, stats) => {
+ return error === null ? resolve(stats) : reject(error);
+ });
+ });
+ }
+}
+exports.default = ReaderStream;
diff --git a/node_modules/fast-glob/out/readers/sync.d.ts b/node_modules/fast-glob/out/readers/sync.d.ts
new file mode 100644
index 0000000..c96ffee
--- /dev/null
+++ b/node_modules/fast-glob/out/readers/sync.d.ts
@@ -0,0 +1,12 @@
+import * as fsStat from '@nodelib/fs.stat';
+import * as fsWalk from '@nodelib/fs.walk';
+import { Entry, Pattern, ReaderOptions } from '../types';
+import Reader from './reader';
+export default class ReaderSync extends Reader {
+ protected _walkSync: typeof fsWalk.walkSync;
+ protected _statSync: typeof fsStat.statSync;
+ dynamic(root: string, options: ReaderOptions): Entry[];
+ static(patterns: Pattern[], options: ReaderOptions): Entry[];
+ private _getEntry;
+ private _getStat;
+}
diff --git a/node_modules/fast-glob/out/readers/sync.js b/node_modules/fast-glob/out/readers/sync.js
new file mode 100644
index 0000000..4704d65
--- /dev/null
+++ b/node_modules/fast-glob/out/readers/sync.js
@@ -0,0 +1,43 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const fsStat = require("@nodelib/fs.stat");
+const fsWalk = require("@nodelib/fs.walk");
+const reader_1 = require("./reader");
+class ReaderSync extends reader_1.default {
+ constructor() {
+ super(...arguments);
+ this._walkSync = fsWalk.walkSync;
+ this._statSync = fsStat.statSync;
+ }
+ dynamic(root, options) {
+ return this._walkSync(root, options);
+ }
+ static(patterns, options) {
+ const entries = [];
+ for (const pattern of patterns) {
+ const filepath = this._getFullEntryPath(pattern);
+ const entry = this._getEntry(filepath, pattern, options);
+ if (entry === null || !options.entryFilter(entry)) {
+ continue;
+ }
+ entries.push(entry);
+ }
+ return entries;
+ }
+ _getEntry(filepath, pattern, options) {
+ try {
+ const stats = this._getStat(filepath);
+ return this._makeEntry(stats, pattern);
+ }
+ catch (error) {
+ if (options.errorFilter(error)) {
+ return null;
+ }
+ throw error;
+ }
+ }
+ _getStat(filepath) {
+ return this._statSync(filepath, this._fsStatSettings);
+ }
+}
+exports.default = ReaderSync;
diff --git a/node_modules/fast-glob/out/settings.d.ts b/node_modules/fast-glob/out/settings.d.ts
new file mode 100644
index 0000000..76a74f8
--- /dev/null
+++ b/node_modules/fast-glob/out/settings.d.ts
@@ -0,0 +1,164 @@
+import { FileSystemAdapter, Pattern } from './types';
+export declare const DEFAULT_FILE_SYSTEM_ADAPTER: FileSystemAdapter;
+export type Options = {
+ /**
+ * Return the absolute path for entries.
+ *
+ * @default false
+ */
+ absolute?: boolean;
+ /**
+ * If set to `true`, then patterns without slashes will be matched against
+ * the basename of the path if it contains slashes.
+ *
+ * @default false
+ */
+ baseNameMatch?: boolean;
+ /**
+ * Enables Bash-like brace expansion.
+ *
+ * @default true
+ */
+ braceExpansion?: boolean;
+ /**
+ * Enables a case-sensitive mode for matching files.
+ *
+ * @default true
+ */
+ caseSensitiveMatch?: boolean;
+ /**
+ * Specifies the maximum number of concurrent requests from a reader to read
+ * directories.
+ *
+ * @default os.cpus().length
+ */
+ concurrency?: number;
+ /**
+ * The current working directory in which to search.
+ *
+ * @default process.cwd()
+ */
+ cwd?: string;
+ /**
+ * Specifies the maximum depth of a read directory relative to the start
+ * directory.
+ *
+ * @default Infinity
+ */
+ deep?: number;
+ /**
+ * Allow patterns to match entries that begin with a period (`.`).
+ *
+ * @default false
+ */
+ dot?: boolean;
+ /**
+ * Enables Bash-like `extglob` functionality.
+ *
+ * @default true
+ */
+ extglob?: boolean;
+ /**
+ * Indicates whether to traverse descendants of symbolic link directories.
+ *
+ * @default true
+ */
+ followSymbolicLinks?: boolean;
+ /**
+ * Custom implementation of methods for working with the file system.
+ *
+ * @default fs.*
+ */
+ fs?: Partial;
+ /**
+ * Enables recursively repeats a pattern containing `**`.
+ * If `false`, `**` behaves exactly like `*`.
+ *
+ * @default true
+ */
+ globstar?: boolean;
+ /**
+ * An array of glob patterns to exclude matches.
+ * This is an alternative way to use negative patterns.
+ *
+ * @default []
+ */
+ ignore?: Pattern[];
+ /**
+ * Mark the directory path with the final slash.
+ *
+ * @default false
+ */
+ markDirectories?: boolean;
+ /**
+ * Returns objects (instead of strings) describing entries.
+ *
+ * @default false
+ */
+ objectMode?: boolean;
+ /**
+ * Return only directories.
+ *
+ * @default false
+ */
+ onlyDirectories?: boolean;
+ /**
+ * Return only files.
+ *
+ * @default true
+ */
+ onlyFiles?: boolean;
+ /**
+ * Enables an object mode (`objectMode`) with an additional `stats` field.
+ *
+ * @default false
+ */
+ stats?: boolean;
+ /**
+ * By default this package suppress only `ENOENT` errors.
+ * Set to `true` to suppress any error.
+ *
+ * @default false
+ */
+ suppressErrors?: boolean;
+ /**
+ * Throw an error when symbolic link is broken if `true` or safely
+ * return `lstat` call if `false`.
+ *
+ * @default false
+ */
+ throwErrorOnBrokenSymbolicLink?: boolean;
+ /**
+ * Ensures that the returned entries are unique.
+ *
+ * @default true
+ */
+ unique?: boolean;
+};
+export default class Settings {
+ private readonly _options;
+ readonly absolute: boolean;
+ readonly baseNameMatch: boolean;
+ readonly braceExpansion: boolean;
+ readonly caseSensitiveMatch: boolean;
+ readonly concurrency: number;
+ readonly cwd: string;
+ readonly deep: number;
+ readonly dot: boolean;
+ readonly extglob: boolean;
+ readonly followSymbolicLinks: boolean;
+ readonly fs: FileSystemAdapter;
+ readonly globstar: boolean;
+ readonly ignore: Pattern[];
+ readonly markDirectories: boolean;
+ readonly objectMode: boolean;
+ readonly onlyDirectories: boolean;
+ readonly onlyFiles: boolean;
+ readonly stats: boolean;
+ readonly suppressErrors: boolean;
+ readonly throwErrorOnBrokenSymbolicLink: boolean;
+ readonly unique: boolean;
+ constructor(_options?: Options);
+ private _getValue;
+ private _getFileSystemMethods;
+}
diff --git a/node_modules/fast-glob/out/settings.js b/node_modules/fast-glob/out/settings.js
new file mode 100644
index 0000000..23f916c
--- /dev/null
+++ b/node_modules/fast-glob/out/settings.js
@@ -0,0 +1,59 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0;
+const fs = require("fs");
+const os = require("os");
+/**
+ * The `os.cpus` method can return zero. We expect the number of cores to be greater than zero.
+ * https://github.com/nodejs/node/blob/7faeddf23a98c53896f8b574a6e66589e8fb1eb8/lib/os.js#L106-L107
+ */
+const CPU_COUNT = Math.max(os.cpus().length, 1);
+exports.DEFAULT_FILE_SYSTEM_ADAPTER = {
+ lstat: fs.lstat,
+ lstatSync: fs.lstatSync,
+ stat: fs.stat,
+ statSync: fs.statSync,
+ readdir: fs.readdir,
+ readdirSync: fs.readdirSync
+};
+class Settings {
+ constructor(_options = {}) {
+ this._options = _options;
+ this.absolute = this._getValue(this._options.absolute, false);
+ this.baseNameMatch = this._getValue(this._options.baseNameMatch, false);
+ this.braceExpansion = this._getValue(this._options.braceExpansion, true);
+ this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true);
+ this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT);
+ this.cwd = this._getValue(this._options.cwd, process.cwd());
+ this.deep = this._getValue(this._options.deep, Infinity);
+ this.dot = this._getValue(this._options.dot, false);
+ this.extglob = this._getValue(this._options.extglob, true);
+ this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true);
+ this.fs = this._getFileSystemMethods(this._options.fs);
+ this.globstar = this._getValue(this._options.globstar, true);
+ this.ignore = this._getValue(this._options.ignore, []);
+ this.markDirectories = this._getValue(this._options.markDirectories, false);
+ this.objectMode = this._getValue(this._options.objectMode, false);
+ this.onlyDirectories = this._getValue(this._options.onlyDirectories, false);
+ this.onlyFiles = this._getValue(this._options.onlyFiles, true);
+ this.stats = this._getValue(this._options.stats, false);
+ this.suppressErrors = this._getValue(this._options.suppressErrors, false);
+ this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false);
+ this.unique = this._getValue(this._options.unique, true);
+ if (this.onlyDirectories) {
+ this.onlyFiles = false;
+ }
+ if (this.stats) {
+ this.objectMode = true;
+ }
+ // Remove the cast to the array in the next major (#404).
+ this.ignore = [].concat(this.ignore);
+ }
+ _getValue(option, value) {
+ return option === undefined ? value : option;
+ }
+ _getFileSystemMethods(methods = {}) {
+ return Object.assign(Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER), methods);
+ }
+}
+exports.default = Settings;
diff --git a/node_modules/fast-glob/out/types/index.d.ts b/node_modules/fast-glob/out/types/index.d.ts
new file mode 100644
index 0000000..6506caf
--- /dev/null
+++ b/node_modules/fast-glob/out/types/index.d.ts
@@ -0,0 +1,31 @@
+///
+import * as fsWalk from '@nodelib/fs.walk';
+export type ErrnoException = NodeJS.ErrnoException;
+export type Entry = fsWalk.Entry;
+export type EntryItem = string | Entry;
+export type Pattern = string;
+export type PatternRe = RegExp;
+export type PatternsGroup = Record;
+export type ReaderOptions = fsWalk.Options & {
+ transform(entry: Entry): EntryItem;
+ deepFilter: DeepFilterFunction;
+ entryFilter: EntryFilterFunction;
+ errorFilter: ErrorFilterFunction;
+ fs: FileSystemAdapter;
+ stats: boolean;
+};
+export type ErrorFilterFunction = fsWalk.ErrorFilterFunction;
+export type EntryFilterFunction = fsWalk.EntryFilterFunction;
+export type DeepFilterFunction = fsWalk.DeepFilterFunction;
+export type EntryTransformerFunction = (entry: Entry) => EntryItem;
+export type MicromatchOptions = {
+ dot?: boolean;
+ matchBase?: boolean;
+ nobrace?: boolean;
+ nocase?: boolean;
+ noext?: boolean;
+ noglobstar?: boolean;
+ posix?: boolean;
+ strictSlashes?: boolean;
+};
+export type FileSystemAdapter = fsWalk.FileSystemAdapter;
diff --git a/node_modules/fast-glob/out/types/index.js b/node_modules/fast-glob/out/types/index.js
new file mode 100644
index 0000000..c8ad2e5
--- /dev/null
+++ b/node_modules/fast-glob/out/types/index.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/node_modules/fast-glob/out/utils/array.d.ts b/node_modules/fast-glob/out/utils/array.d.ts
new file mode 100644
index 0000000..98e7325
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/array.d.ts
@@ -0,0 +1,2 @@
+export declare function flatten(items: T[][]): T[];
+export declare function splitWhen(items: T[], predicate: (item: T) => boolean): T[][];
diff --git a/node_modules/fast-glob/out/utils/array.js b/node_modules/fast-glob/out/utils/array.js
new file mode 100644
index 0000000..50c406e
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/array.js
@@ -0,0 +1,22 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.splitWhen = exports.flatten = void 0;
+function flatten(items) {
+ return items.reduce((collection, item) => [].concat(collection, item), []);
+}
+exports.flatten = flatten;
+function splitWhen(items, predicate) {
+ const result = [[]];
+ let groupIndex = 0;
+ for (const item of items) {
+ if (predicate(item)) {
+ groupIndex++;
+ result[groupIndex] = [];
+ }
+ else {
+ result[groupIndex].push(item);
+ }
+ }
+ return result;
+}
+exports.splitWhen = splitWhen;
diff --git a/node_modules/fast-glob/out/utils/errno.d.ts b/node_modules/fast-glob/out/utils/errno.d.ts
new file mode 100644
index 0000000..1c08d3b
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/errno.d.ts
@@ -0,0 +1,2 @@
+import { ErrnoException } from '../types';
+export declare function isEnoentCodeError(error: ErrnoException): boolean;
diff --git a/node_modules/fast-glob/out/utils/errno.js b/node_modules/fast-glob/out/utils/errno.js
new file mode 100644
index 0000000..f0bd801
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/errno.js
@@ -0,0 +1,7 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isEnoentCodeError = void 0;
+function isEnoentCodeError(error) {
+ return error.code === 'ENOENT';
+}
+exports.isEnoentCodeError = isEnoentCodeError;
diff --git a/node_modules/fast-glob/out/utils/fs.d.ts b/node_modules/fast-glob/out/utils/fs.d.ts
new file mode 100644
index 0000000..64c61ce
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/fs.d.ts
@@ -0,0 +1,4 @@
+///
+import * as fs from 'fs';
+import { Dirent } from '@nodelib/fs.walk';
+export declare function createDirentFromStats(name: string, stats: fs.Stats): Dirent;
diff --git a/node_modules/fast-glob/out/utils/fs.js b/node_modules/fast-glob/out/utils/fs.js
new file mode 100644
index 0000000..ace7c74
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/fs.js
@@ -0,0 +1,19 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.createDirentFromStats = void 0;
+class DirentFromStats {
+ constructor(name, stats) {
+ this.name = name;
+ this.isBlockDevice = stats.isBlockDevice.bind(stats);
+ this.isCharacterDevice = stats.isCharacterDevice.bind(stats);
+ this.isDirectory = stats.isDirectory.bind(stats);
+ this.isFIFO = stats.isFIFO.bind(stats);
+ this.isFile = stats.isFile.bind(stats);
+ this.isSocket = stats.isSocket.bind(stats);
+ this.isSymbolicLink = stats.isSymbolicLink.bind(stats);
+ }
+}
+function createDirentFromStats(name, stats) {
+ return new DirentFromStats(name, stats);
+}
+exports.createDirentFromStats = createDirentFromStats;
diff --git a/node_modules/fast-glob/out/utils/index.d.ts b/node_modules/fast-glob/out/utils/index.d.ts
new file mode 100644
index 0000000..f634cad
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/index.d.ts
@@ -0,0 +1,8 @@
+import * as array from './array';
+import * as errno from './errno';
+import * as fs from './fs';
+import * as path from './path';
+import * as pattern from './pattern';
+import * as stream from './stream';
+import * as string from './string';
+export { array, errno, fs, path, pattern, stream, string };
diff --git a/node_modules/fast-glob/out/utils/index.js b/node_modules/fast-glob/out/utils/index.js
new file mode 100644
index 0000000..0f92c16
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/index.js
@@ -0,0 +1,17 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.string = exports.stream = exports.pattern = exports.path = exports.fs = exports.errno = exports.array = void 0;
+const array = require("./array");
+exports.array = array;
+const errno = require("./errno");
+exports.errno = errno;
+const fs = require("./fs");
+exports.fs = fs;
+const path = require("./path");
+exports.path = path;
+const pattern = require("./pattern");
+exports.pattern = pattern;
+const stream = require("./stream");
+exports.stream = stream;
+const string = require("./string");
+exports.string = string;
diff --git a/node_modules/fast-glob/out/utils/path.d.ts b/node_modules/fast-glob/out/utils/path.d.ts
new file mode 100644
index 0000000..0b13f4b
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/path.d.ts
@@ -0,0 +1,13 @@
+import { Pattern } from '../types';
+/**
+ * Designed to work only with simple paths: `dir\\file`.
+ */
+export declare function unixify(filepath: string): string;
+export declare function makeAbsolute(cwd: string, filepath: string): string;
+export declare function removeLeadingDotSegment(entry: string): string;
+export declare const escape: typeof escapeWindowsPath;
+export declare function escapeWindowsPath(pattern: Pattern): Pattern;
+export declare function escapePosixPath(pattern: Pattern): Pattern;
+export declare const convertPathToPattern: typeof convertWindowsPathToPattern;
+export declare function convertWindowsPathToPattern(filepath: string): Pattern;
+export declare function convertPosixPathToPattern(filepath: string): Pattern;
diff --git a/node_modules/fast-glob/out/utils/path.js b/node_modules/fast-glob/out/utils/path.js
new file mode 100644
index 0000000..7b53b39
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/path.js
@@ -0,0 +1,68 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.convertPosixPathToPattern = exports.convertWindowsPathToPattern = exports.convertPathToPattern = exports.escapePosixPath = exports.escapeWindowsPath = exports.escape = exports.removeLeadingDotSegment = exports.makeAbsolute = exports.unixify = void 0;
+const os = require("os");
+const path = require("path");
+const IS_WINDOWS_PLATFORM = os.platform() === 'win32';
+const LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\
+/**
+ * All non-escaped special characters.
+ * Posix: ()*?[]{|}, !+@ before (, ! at the beginning, \\ before non-special characters.
+ * Windows: (){}[], !+@ before (, ! at the beginning.
+ */
+const POSIX_UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()*?[\]{|}]|^!|[!+@](?=\()|\\(?![!()*+?@[\]{|}]))/g;
+const WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()[\]{}]|^!|[!+@](?=\())/g;
+/**
+ * The device path (\\.\ or \\?\).
+ * https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats#dos-device-paths
+ */
+const DOS_DEVICE_PATH_RE = /^\\\\([.?])/;
+/**
+ * All backslashes except those escaping special characters.
+ * Windows: !()+@{}
+ * https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions
+ */
+const WINDOWS_BACKSLASHES_RE = /\\(?![!()+@[\]{}])/g;
+/**
+ * Designed to work only with simple paths: `dir\\file`.
+ */
+function unixify(filepath) {
+ return filepath.replace(/\\/g, '/');
+}
+exports.unixify = unixify;
+function makeAbsolute(cwd, filepath) {
+ return path.resolve(cwd, filepath);
+}
+exports.makeAbsolute = makeAbsolute;
+function removeLeadingDotSegment(entry) {
+ // We do not use `startsWith` because this is 10x slower than current implementation for some cases.
+ // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with
+ if (entry.charAt(0) === '.') {
+ const secondCharactery = entry.charAt(1);
+ if (secondCharactery === '/' || secondCharactery === '\\') {
+ return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT);
+ }
+ }
+ return entry;
+}
+exports.removeLeadingDotSegment = removeLeadingDotSegment;
+exports.escape = IS_WINDOWS_PLATFORM ? escapeWindowsPath : escapePosixPath;
+function escapeWindowsPath(pattern) {
+ return pattern.replace(WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE, '\\$2');
+}
+exports.escapeWindowsPath = escapeWindowsPath;
+function escapePosixPath(pattern) {
+ return pattern.replace(POSIX_UNESCAPED_GLOB_SYMBOLS_RE, '\\$2');
+}
+exports.escapePosixPath = escapePosixPath;
+exports.convertPathToPattern = IS_WINDOWS_PLATFORM ? convertWindowsPathToPattern : convertPosixPathToPattern;
+function convertWindowsPathToPattern(filepath) {
+ return escapeWindowsPath(filepath)
+ .replace(DOS_DEVICE_PATH_RE, '//$1')
+ .replace(WINDOWS_BACKSLASHES_RE, '/');
+}
+exports.convertWindowsPathToPattern = convertWindowsPathToPattern;
+function convertPosixPathToPattern(filepath) {
+ return escapePosixPath(filepath);
+}
+exports.convertPosixPathToPattern = convertPosixPathToPattern;
diff --git a/node_modules/fast-glob/out/utils/pattern.d.ts b/node_modules/fast-glob/out/utils/pattern.d.ts
new file mode 100644
index 0000000..e7ff07b
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/pattern.d.ts
@@ -0,0 +1,47 @@
+import { MicromatchOptions, Pattern, PatternRe } from '../types';
+type PatternTypeOptions = {
+ braceExpansion?: boolean;
+ caseSensitiveMatch?: boolean;
+ extglob?: boolean;
+};
+export declare function isStaticPattern(pattern: Pattern, options?: PatternTypeOptions): boolean;
+export declare function isDynamicPattern(pattern: Pattern, options?: PatternTypeOptions): boolean;
+export declare function convertToPositivePattern(pattern: Pattern): Pattern;
+export declare function convertToNegativePattern(pattern: Pattern): Pattern;
+export declare function isNegativePattern(pattern: Pattern): boolean;
+export declare function isPositivePattern(pattern: Pattern): boolean;
+export declare function getNegativePatterns(patterns: Pattern[]): Pattern[];
+export declare function getPositivePatterns(patterns: Pattern[]): Pattern[];
+/**
+ * Returns patterns that can be applied inside the current directory.
+ *
+ * @example
+ * // ['./*', '*', 'a/*']
+ * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])
+ */
+export declare function getPatternsInsideCurrentDirectory(patterns: Pattern[]): Pattern[];
+/**
+ * Returns patterns to be expanded relative to (outside) the current directory.
+ *
+ * @example
+ * // ['../*', './../*']
+ * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])
+ */
+export declare function getPatternsOutsideCurrentDirectory(patterns: Pattern[]): Pattern[];
+export declare function isPatternRelatedToParentDirectory(pattern: Pattern): boolean;
+export declare function getBaseDirectory(pattern: Pattern): string;
+export declare function hasGlobStar(pattern: Pattern): boolean;
+export declare function endsWithSlashGlobStar(pattern: Pattern): boolean;
+export declare function isAffectDepthOfReadingPattern(pattern: Pattern): boolean;
+export declare function expandPatternsWithBraceExpansion(patterns: Pattern[]): Pattern[];
+export declare function expandBraceExpansion(pattern: Pattern): Pattern[];
+export declare function getPatternParts(pattern: Pattern, options: MicromatchOptions): Pattern[];
+export declare function makeRe(pattern: Pattern, options: MicromatchOptions): PatternRe;
+export declare function convertPatternsToRe(patterns: Pattern[], options: MicromatchOptions): PatternRe[];
+export declare function matchAny(entry: string, patternsRe: PatternRe[]): boolean;
+/**
+ * This package only works with forward slashes as a path separator.
+ * Because of this, we cannot use the standard `path.normalize` method, because on Windows platform it will use of backslashes.
+ */
+export declare function removeDuplicateSlashes(pattern: string): string;
+export {};
diff --git a/node_modules/fast-glob/out/utils/pattern.js b/node_modules/fast-glob/out/utils/pattern.js
new file mode 100644
index 0000000..d7d4e91
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/pattern.js
@@ -0,0 +1,188 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.removeDuplicateSlashes = exports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.isPatternRelatedToParentDirectory = exports.getPatternsOutsideCurrentDirectory = exports.getPatternsInsideCurrentDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0;
+const path = require("path");
+const globParent = require("glob-parent");
+const micromatch = require("micromatch");
+const GLOBSTAR = '**';
+const ESCAPE_SYMBOL = '\\';
+const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/;
+const REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\[[^[]*]/;
+const REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\([^(]*\|[^|]*\)/;
+const GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\([^(]*\)/;
+const BRACE_EXPANSION_SEPARATORS_RE = /,|\.\./;
+/**
+ * Matches a sequence of two or more consecutive slashes, excluding the first two slashes at the beginning of the string.
+ * The latter is due to the presence of the device path at the beginning of the UNC path.
+ */
+const DOUBLE_SLASH_RE = /(?!^)\/{2,}/g;
+function isStaticPattern(pattern, options = {}) {
+ return !isDynamicPattern(pattern, options);
+}
+exports.isStaticPattern = isStaticPattern;
+function isDynamicPattern(pattern, options = {}) {
+ /**
+ * A special case with an empty string is necessary for matching patterns that start with a forward slash.
+ * An empty string cannot be a dynamic pattern.
+ * For example, the pattern `/lib/*` will be spread into parts: '', 'lib', '*'.
+ */
+ if (pattern === '') {
+ return false;
+ }
+ /**
+ * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check
+ * filepath directly (without read directory).
+ */
+ if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) {
+ return true;
+ }
+ if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) {
+ return true;
+ }
+ if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) {
+ return true;
+ }
+ if (options.braceExpansion !== false && hasBraceExpansion(pattern)) {
+ return true;
+ }
+ return false;
+}
+exports.isDynamicPattern = isDynamicPattern;
+function hasBraceExpansion(pattern) {
+ const openingBraceIndex = pattern.indexOf('{');
+ if (openingBraceIndex === -1) {
+ return false;
+ }
+ const closingBraceIndex = pattern.indexOf('}', openingBraceIndex + 1);
+ if (closingBraceIndex === -1) {
+ return false;
+ }
+ const braceContent = pattern.slice(openingBraceIndex, closingBraceIndex);
+ return BRACE_EXPANSION_SEPARATORS_RE.test(braceContent);
+}
+function convertToPositivePattern(pattern) {
+ return isNegativePattern(pattern) ? pattern.slice(1) : pattern;
+}
+exports.convertToPositivePattern = convertToPositivePattern;
+function convertToNegativePattern(pattern) {
+ return '!' + pattern;
+}
+exports.convertToNegativePattern = convertToNegativePattern;
+function isNegativePattern(pattern) {
+ return pattern.startsWith('!') && pattern[1] !== '(';
+}
+exports.isNegativePattern = isNegativePattern;
+function isPositivePattern(pattern) {
+ return !isNegativePattern(pattern);
+}
+exports.isPositivePattern = isPositivePattern;
+function getNegativePatterns(patterns) {
+ return patterns.filter(isNegativePattern);
+}
+exports.getNegativePatterns = getNegativePatterns;
+function getPositivePatterns(patterns) {
+ return patterns.filter(isPositivePattern);
+}
+exports.getPositivePatterns = getPositivePatterns;
+/**
+ * Returns patterns that can be applied inside the current directory.
+ *
+ * @example
+ * // ['./*', '*', 'a/*']
+ * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])
+ */
+function getPatternsInsideCurrentDirectory(patterns) {
+ return patterns.filter((pattern) => !isPatternRelatedToParentDirectory(pattern));
+}
+exports.getPatternsInsideCurrentDirectory = getPatternsInsideCurrentDirectory;
+/**
+ * Returns patterns to be expanded relative to (outside) the current directory.
+ *
+ * @example
+ * // ['../*', './../*']
+ * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])
+ */
+function getPatternsOutsideCurrentDirectory(patterns) {
+ return patterns.filter(isPatternRelatedToParentDirectory);
+}
+exports.getPatternsOutsideCurrentDirectory = getPatternsOutsideCurrentDirectory;
+function isPatternRelatedToParentDirectory(pattern) {
+ return pattern.startsWith('..') || pattern.startsWith('./..');
+}
+exports.isPatternRelatedToParentDirectory = isPatternRelatedToParentDirectory;
+function getBaseDirectory(pattern) {
+ return globParent(pattern, { flipBackslashes: false });
+}
+exports.getBaseDirectory = getBaseDirectory;
+function hasGlobStar(pattern) {
+ return pattern.includes(GLOBSTAR);
+}
+exports.hasGlobStar = hasGlobStar;
+function endsWithSlashGlobStar(pattern) {
+ return pattern.endsWith('/' + GLOBSTAR);
+}
+exports.endsWithSlashGlobStar = endsWithSlashGlobStar;
+function isAffectDepthOfReadingPattern(pattern) {
+ const basename = path.basename(pattern);
+ return endsWithSlashGlobStar(pattern) || isStaticPattern(basename);
+}
+exports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern;
+function expandPatternsWithBraceExpansion(patterns) {
+ return patterns.reduce((collection, pattern) => {
+ return collection.concat(expandBraceExpansion(pattern));
+ }, []);
+}
+exports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion;
+function expandBraceExpansion(pattern) {
+ const patterns = micromatch.braces(pattern, { expand: true, nodupes: true, keepEscaping: true });
+ /**
+ * Sort the patterns by length so that the same depth patterns are processed side by side.
+ * `a/{b,}/{c,}/*` – `['a///*', 'a/b//*', 'a//c/*', 'a/b/c/*']`
+ */
+ patterns.sort((a, b) => a.length - b.length);
+ /**
+ * Micromatch can return an empty string in the case of patterns like `{a,}`.
+ */
+ return patterns.filter((pattern) => pattern !== '');
+}
+exports.expandBraceExpansion = expandBraceExpansion;
+function getPatternParts(pattern, options) {
+ let { parts } = micromatch.scan(pattern, Object.assign(Object.assign({}, options), { parts: true }));
+ /**
+ * The scan method returns an empty array in some cases.
+ * See micromatch/picomatch#58 for more details.
+ */
+ if (parts.length === 0) {
+ parts = [pattern];
+ }
+ /**
+ * The scan method does not return an empty part for the pattern with a forward slash.
+ * This is another part of micromatch/picomatch#58.
+ */
+ if (parts[0].startsWith('/')) {
+ parts[0] = parts[0].slice(1);
+ parts.unshift('');
+ }
+ return parts;
+}
+exports.getPatternParts = getPatternParts;
+function makeRe(pattern, options) {
+ return micromatch.makeRe(pattern, options);
+}
+exports.makeRe = makeRe;
+function convertPatternsToRe(patterns, options) {
+ return patterns.map((pattern) => makeRe(pattern, options));
+}
+exports.convertPatternsToRe = convertPatternsToRe;
+function matchAny(entry, patternsRe) {
+ return patternsRe.some((patternRe) => patternRe.test(entry));
+}
+exports.matchAny = matchAny;
+/**
+ * This package only works with forward slashes as a path separator.
+ * Because of this, we cannot use the standard `path.normalize` method, because on Windows platform it will use of backslashes.
+ */
+function removeDuplicateSlashes(pattern) {
+ return pattern.replace(DOUBLE_SLASH_RE, '/');
+}
+exports.removeDuplicateSlashes = removeDuplicateSlashes;
diff --git a/node_modules/fast-glob/out/utils/stream.d.ts b/node_modules/fast-glob/out/utils/stream.d.ts
new file mode 100644
index 0000000..4daf913
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/stream.d.ts
@@ -0,0 +1,4 @@
+///
+///
+import { Readable } from 'stream';
+export declare function merge(streams: Readable[]): NodeJS.ReadableStream;
diff --git a/node_modules/fast-glob/out/utils/stream.js b/node_modules/fast-glob/out/utils/stream.js
new file mode 100644
index 0000000..b32028c
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/stream.js
@@ -0,0 +1,17 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.merge = void 0;
+const merge2 = require("merge2");
+function merge(streams) {
+ const mergedStream = merge2(streams);
+ streams.forEach((stream) => {
+ stream.once('error', (error) => mergedStream.emit('error', error));
+ });
+ mergedStream.once('close', () => propagateCloseEventToSources(streams));
+ mergedStream.once('end', () => propagateCloseEventToSources(streams));
+ return mergedStream;
+}
+exports.merge = merge;
+function propagateCloseEventToSources(streams) {
+ streams.forEach((stream) => stream.emit('close'));
+}
diff --git a/node_modules/fast-glob/out/utils/string.d.ts b/node_modules/fast-glob/out/utils/string.d.ts
new file mode 100644
index 0000000..c884735
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/string.d.ts
@@ -0,0 +1,2 @@
+export declare function isString(input: unknown): input is string;
+export declare function isEmpty(input: string): boolean;
diff --git a/node_modules/fast-glob/out/utils/string.js b/node_modules/fast-glob/out/utils/string.js
new file mode 100644
index 0000000..76e7ea5
--- /dev/null
+++ b/node_modules/fast-glob/out/utils/string.js
@@ -0,0 +1,11 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isEmpty = exports.isString = void 0;
+function isString(input) {
+ return typeof input === 'string';
+}
+exports.isString = isString;
+function isEmpty(input) {
+ return input === '';
+}
+exports.isEmpty = isEmpty;
diff --git a/node_modules/fast-glob/package.json b/node_modules/fast-glob/package.json
new file mode 100644
index 0000000..770cc6e
--- /dev/null
+++ b/node_modules/fast-glob/package.json
@@ -0,0 +1,81 @@
+{
+ "name": "fast-glob",
+ "version": "3.3.2",
+ "description": "It's a very fast and efficient glob library for Node.js",
+ "license": "MIT",
+ "repository": "mrmlnc/fast-glob",
+ "author": {
+ "name": "Denis Malinochkin",
+ "url": "https://mrmlnc.com"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ },
+ "main": "out/index.js",
+ "typings": "out/index.d.ts",
+ "files": [
+ "out",
+ "!out/{benchmark,tests}",
+ "!out/**/*.map",
+ "!out/**/*.spec.*"
+ ],
+ "keywords": [
+ "glob",
+ "patterns",
+ "fast",
+ "implementation"
+ ],
+ "devDependencies": {
+ "@nodelib/fs.macchiato": "^1.0.1",
+ "@types/glob-parent": "^5.1.0",
+ "@types/merge2": "^1.1.4",
+ "@types/micromatch": "^4.0.0",
+ "@types/mocha": "^5.2.7",
+ "@types/node": "^14.18.53",
+ "@types/picomatch": "^2.3.0",
+ "@types/sinon": "^7.5.0",
+ "bencho": "^0.1.1",
+ "eslint": "^6.5.1",
+ "eslint-config-mrmlnc": "^1.1.0",
+ "execa": "^7.1.1",
+ "fast-glob": "^3.0.4",
+ "fdir": "^6.0.1",
+ "glob": "^10.0.0",
+ "hereby": "^1.8.1",
+ "mocha": "^6.2.1",
+ "rimraf": "^5.0.0",
+ "sinon": "^7.5.0",
+ "snap-shot-it": "^7.9.10",
+ "typescript": "^4.9.5"
+ },
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "scripts": {
+ "clean": "rimraf out",
+ "lint": "eslint \"src/**/*.ts\" --cache",
+ "compile": "tsc",
+ "test": "mocha \"out/**/*.spec.js\" -s 0",
+ "test:e2e": "mocha \"out/**/*.e2e.js\" -s 0",
+ "test:e2e:sync": "mocha \"out/**/*.e2e.js\" -s 0 --grep \"\\(sync\\)\"",
+ "test:e2e:async": "mocha \"out/**/*.e2e.js\" -s 0 --grep \"\\(async\\)\"",
+ "test:e2e:stream": "mocha \"out/**/*.e2e.js\" -s 0 --grep \"\\(stream\\)\"",
+ "build": "npm run clean && npm run compile && npm run lint && npm test",
+ "watch": "npm run clean && npm run compile -- --sourceMap --watch",
+ "bench:async": "npm run bench:product:async && npm run bench:regression:async",
+ "bench:stream": "npm run bench:product:stream && npm run bench:regression:stream",
+ "bench:sync": "npm run bench:product:sync && npm run bench:regression:sync",
+ "bench:product": "npm run bench:product:async && npm run bench:product:sync && npm run bench:product:stream",
+ "bench:product:async": "hereby bench:product:async",
+ "bench:product:sync": "hereby bench:product:sync",
+ "bench:product:stream": "hereby bench:product:stream",
+ "bench:regression": "npm run bench:regression:async && npm run bench:regression:sync && npm run bench:regression:stream",
+ "bench:regression:async": "hereby bench:regression:async",
+ "bench:regression:sync": "hereby bench:regression:sync",
+ "bench:regression:stream": "hereby bench:regression:stream"
+ }
+}
diff --git a/node_modules/fastq/.github/dependabot.yml b/node_modules/fastq/.github/dependabot.yml
new file mode 100644
index 0000000..7e7cbe1
--- /dev/null
+++ b/node_modules/fastq/.github/dependabot.yml
@@ -0,0 +1,11 @@
+version: 2
+updates:
+- package-ecosystem: npm
+ directory: "/"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ ignore:
+ - dependency-name: standard
+ versions:
+ - 16.0.3
diff --git a/node_modules/fastq/.github/workflows/ci.yml b/node_modules/fastq/.github/workflows/ci.yml
new file mode 100644
index 0000000..69521c4
--- /dev/null
+++ b/node_modules/fastq/.github/workflows/ci.yml
@@ -0,0 +1,75 @@
+name: ci
+
+on: [push, pull_request]
+
+jobs:
+ legacy:
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: ['0.10', '0.12', 4.x, 6.x, 8.x]
+
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ persist-credentials: false
+
+ - name: Use Node.js
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+
+ - name: Install
+ run: |
+ npm install --production && npm install tape
+
+ - name: Run tests
+ run: |
+ npm run legacy
+
+ test:
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [10.x, 12.x, 13.x, 14.x, 15.x, 16.x, 18.x, 20.x]
+
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ persist-credentials: false
+
+ - name: Use Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: ${{ matrix.node-version }}
+
+ - name: Install
+ run: |
+ npm install
+
+ - name: Run tests
+ run: |
+ npm run test
+
+ types:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ persist-credentials: false
+
+ - name: Use Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: 16
+
+ - name: Install
+ run: |
+ npm install
+
+ - name: Run types tests
+ run: |
+ npm run typescript
diff --git a/node_modules/fastq/LICENSE b/node_modules/fastq/LICENSE
new file mode 100644
index 0000000..27c7bb4
--- /dev/null
+++ b/node_modules/fastq/LICENSE
@@ -0,0 +1,13 @@
+Copyright (c) 2015-2020, Matteo Collina
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/fastq/README.md b/node_modules/fastq/README.md
new file mode 100644
index 0000000..af5feee
--- /dev/null
+++ b/node_modules/fastq/README.md
@@ -0,0 +1,306 @@
+# fastq
+
+![ci][ci-url]
+[![npm version][npm-badge]][npm-url]
+
+Fast, in memory work queue.
+
+Benchmarks (1 million tasks):
+
+* setImmediate: 812ms
+* fastq: 854ms
+* async.queue: 1298ms
+* neoAsync.queue: 1249ms
+
+Obtained on node 12.16.1, on a dedicated server.
+
+If you need zero-overhead series function call, check out
+[fastseries](http://npm.im/fastseries). For zero-overhead parallel
+function call, check out [fastparallel](http://npm.im/fastparallel).
+
+[](https://github.com/feross/standard)
+
+ * Installation
+ * Usage
+ * API
+ * Licence & copyright
+
+## Install
+
+`npm i fastq --save`
+
+## Usage (callback API)
+
+```js
+'use strict'
+
+const queue = require('fastq')(worker, 1)
+
+queue.push(42, function (err, result) {
+ if (err) { throw err }
+ console.log('the result is', result)
+})
+
+function worker (arg, cb) {
+ cb(null, arg * 2)
+}
+```
+
+## Usage (promise API)
+
+```js
+const queue = require('fastq').promise(worker, 1)
+
+async function worker (arg) {
+ return arg * 2
+}
+
+async function run () {
+ const result = await queue.push(42)
+ console.log('the result is', result)
+}
+
+run()
+```
+
+### Setting "this"
+
+```js
+'use strict'
+
+const that = { hello: 'world' }
+const queue = require('fastq')(that, worker, 1)
+
+queue.push(42, function (err, result) {
+ if (err) { throw err }
+ console.log(this)
+ console.log('the result is', result)
+})
+
+function worker (arg, cb) {
+ console.log(this)
+ cb(null, arg * 2)
+}
+```
+
+### Using with TypeScript (callback API)
+
+```ts
+'use strict'
+
+import * as fastq from "fastq";
+import type { queue, done } from "fastq";
+
+type Task = {
+ id: number
+}
+
+const q: queue = fastq(worker, 1)
+
+q.push({ id: 42})
+
+function worker (arg: Task, cb: done) {
+ console.log(arg.id)
+ cb(null)
+}
+```
+
+### Using with TypeScript (promise API)
+
+```ts
+'use strict'
+
+import * as fastq from "fastq";
+import type { queueAsPromised } from "fastq";
+
+type Task = {
+ id: number
+}
+
+const q: queueAsPromised = fastq.promise(asyncWorker, 1)
+
+q.push({ id: 42}).catch((err) => console.error(err))
+
+async function asyncWorker (arg: Task): Promise {
+ // No need for a try-catch block, fastq handles errors automatically
+ console.log(arg.id)
+}
+```
+
+## API
+
+* fastqueue()
+* queue#push()
+* queue#unshift()
+* queue#pause()
+* queue#resume()
+* queue#idle()
+* queue#length()
+* queue#getQueue()
+* queue#kill()
+* queue#killAndDrain()
+* queue#error()
+* queue#concurrency
+* queue#drain
+* queue#empty
+* queue#saturated
+* fastqueue.promise()
+
+-------------------------------------------------------
+
+### fastqueue([that], worker, concurrency)
+
+Creates a new queue.
+
+Arguments:
+
+* `that`, optional context of the `worker` function.
+* `worker`, worker function, it would be called with `that` as `this`,
+ if that is specified.
+* `concurrency`, number of concurrent tasks that could be executed in
+ parallel.
+
+-------------------------------------------------------
+
+### queue.push(task, done)
+
+Add a task at the end of the queue. `done(err, result)` will be called
+when the task was processed.
+
+-------------------------------------------------------
+
+### queue.unshift(task, done)
+
+Add a task at the beginning of the queue. `done(err, result)` will be called
+when the task was processed.
+
+-------------------------------------------------------
+
+### queue.pause()
+
+Pause the processing of tasks. Currently worked tasks are not
+stopped.
+
+-------------------------------------------------------
+
+### queue.resume()
+
+Resume the processing of tasks.
+
+-------------------------------------------------------
+
+### queue.idle()
+
+Returns `false` if there are tasks being processed or waiting to be processed.
+`true` otherwise.
+
+-------------------------------------------------------
+
+### queue.length()
+
+Returns the number of tasks waiting to be processed (in the queue).
+
+-------------------------------------------------------
+
+### queue.getQueue()
+
+Returns all the tasks be processed (in the queue). Returns empty array when there are no tasks
+
+-------------------------------------------------------
+
+### queue.kill()
+
+Removes all tasks waiting to be processed, and reset `drain` to an empty
+function.
+
+-------------------------------------------------------
+
+### queue.killAndDrain()
+
+Same than `kill` but the `drain` function will be called before reset to empty.
+
+-------------------------------------------------------
+
+### queue.error(handler)
+
+Set a global error handler. `handler(err, task)` will be called
+each time a task is completed, `err` will be not null if the task has thrown an error.
+
+-------------------------------------------------------
+
+### queue.concurrency
+
+Property that returns the number of concurrent tasks that could be executed in
+parallel. It can be altered at runtime.
+
+-------------------------------------------------------
+
+### queue.drain
+
+Function that will be called when the last
+item from the queue has been processed by a worker.
+It can be altered at runtime.
+
+-------------------------------------------------------
+
+### queue.empty
+
+Function that will be called when the last
+item from the queue has been assigned to a worker.
+It can be altered at runtime.
+
+-------------------------------------------------------
+
+### queue.saturated
+
+Function that will be called when the queue hits the concurrency
+limit.
+It can be altered at runtime.
+
+-------------------------------------------------------
+
+### fastqueue.promise([that], worker(arg), concurrency)
+
+Creates a new queue with `Promise` apis. It also offers all the methods
+and properties of the object returned by [`fastqueue`](#fastqueue) with the modified
+[`push`](#pushPromise) and [`unshift`](#unshiftPromise) methods.
+
+Node v10+ is required to use the promisified version.
+
+Arguments:
+* `that`, optional context of the `worker` function.
+* `worker`, worker function, it would be called with `that` as `this`,
+ if that is specified. It MUST return a `Promise`.
+* `concurrency`, number of concurrent tasks that could be executed in
+ parallel.
+
+
+#### queue.push(task) => Promise
+
+Add a task at the end of the queue. The returned `Promise` will be fulfilled (rejected)
+when the task is completed successfully (unsuccessfully).
+
+This promise could be ignored as it will not lead to a `'unhandledRejection'`.
+
+
+#### queue.unshift(task) => Promise
+
+Add a task at the beginning of the queue. The returned `Promise` will be fulfilled (rejected)
+when the task is completed successfully (unsuccessfully).
+
+This promise could be ignored as it will not lead to a `'unhandledRejection'`.
+
+
+#### queue.drained() => Promise
+
+Wait for the queue to be drained. The returned `Promise` will be resolved when all tasks in the queue have been processed by a worker.
+
+This promise could be ignored as it will not lead to a `'unhandledRejection'`.
+
+## License
+
+ISC
+
+[ci-url]: https://github.com/mcollina/fastq/workflows/ci/badge.svg
+[npm-badge]: https://badge.fury.io/js/fastq.svg
+[npm-url]: https://badge.fury.io/js/fastq
diff --git a/node_modules/fastq/bench.js b/node_modules/fastq/bench.js
new file mode 100644
index 0000000..4eaa829
--- /dev/null
+++ b/node_modules/fastq/bench.js
@@ -0,0 +1,66 @@
+'use strict'
+
+const max = 1000000
+const fastqueue = require('./')(worker, 1)
+const { promisify } = require('util')
+const immediate = promisify(setImmediate)
+const qPromise = require('./').promise(immediate, 1)
+const async = require('async')
+const neo = require('neo-async')
+const asyncqueue = async.queue(worker, 1)
+const neoqueue = neo.queue(worker, 1)
+
+function bench (func, done) {
+ const key = max + '*' + func.name
+ let count = -1
+
+ console.time(key)
+ end()
+
+ function end () {
+ if (++count < max) {
+ func(end)
+ } else {
+ console.timeEnd(key)
+ if (done) {
+ done()
+ }
+ }
+ }
+}
+
+function benchFastQ (done) {
+ fastqueue.push(42, done)
+}
+
+function benchAsyncQueue (done) {
+ asyncqueue.push(42, done)
+}
+
+function benchNeoQueue (done) {
+ neoqueue.push(42, done)
+}
+
+function worker (arg, cb) {
+ setImmediate(cb)
+}
+
+function benchSetImmediate (cb) {
+ worker(42, cb)
+}
+
+function benchFastQPromise (done) {
+ qPromise.push(42).then(function () { done() }, done)
+}
+
+function runBench (done) {
+ async.eachSeries([
+ benchSetImmediate,
+ benchFastQ,
+ benchNeoQueue,
+ benchAsyncQueue,
+ benchFastQPromise
+ ], bench, done)
+}
+
+runBench(runBench)
diff --git a/node_modules/fastq/example.js b/node_modules/fastq/example.js
new file mode 100644
index 0000000..665fdc8
--- /dev/null
+++ b/node_modules/fastq/example.js
@@ -0,0 +1,14 @@
+'use strict'
+
+/* eslint-disable no-var */
+
+var queue = require('./')(worker, 1)
+
+queue.push(42, function (err, result) {
+ if (err) { throw err }
+ console.log('the result is', result)
+})
+
+function worker (arg, cb) {
+ cb(null, 42 * 2)
+}
diff --git a/node_modules/fastq/example.mjs b/node_modules/fastq/example.mjs
new file mode 100644
index 0000000..81be789
--- /dev/null
+++ b/node_modules/fastq/example.mjs
@@ -0,0 +1,11 @@
+import { promise as queueAsPromised } from './queue.js'
+
+/* eslint-disable */
+
+const queue = queueAsPromised(worker, 1)
+
+console.log('the result is', await queue.push(42))
+
+async function worker (arg) {
+ return 42 * 2
+}
diff --git a/node_modules/fastq/index.d.ts b/node_modules/fastq/index.d.ts
new file mode 100644
index 0000000..327f399
--- /dev/null
+++ b/node_modules/fastq/index.d.ts
@@ -0,0 +1,38 @@
+declare function fastq(context: C, worker: fastq.worker, concurrency: number): fastq.queue
+declare function fastq(worker: fastq.worker, concurrency: number): fastq.queue
+
+declare namespace fastq {
+ type worker = (this: C, task: T, cb: fastq.done) => void
+ type asyncWorker = (this: C, task: T) => Promise
+ type done = (err: Error | null, result?: R) => void
+ type errorHandler = (err: Error, task: T) => void
+
+ interface queue {
+ push(task: T, done?: done): void
+ unshift(task: T, done?: done): void
+ pause(): any
+ resume(): any
+ running(): number
+ idle(): boolean
+ length(): number
+ getQueue(): T[]
+ kill(): any
+ killAndDrain(): any
+ error(handler: errorHandler): void
+ concurrency: number
+ drain(): any
+ empty: () => void
+ saturated: () => void
+ }
+
+ interface queueAsPromised extends queue {
+ push(task: T): Promise
+ unshift(task: T): Promise
+ drained(): Promise
+ }
+
+ function promise(context: C, worker: fastq.asyncWorker, concurrency: number): fastq.queueAsPromised
+ function promise(worker: fastq.asyncWorker, concurrency: number): fastq.queueAsPromised
+}
+
+export = fastq
diff --git a/node_modules/fastq/package.json b/node_modules/fastq/package.json
new file mode 100644
index 0000000..44655bc
--- /dev/null
+++ b/node_modules/fastq/package.json
@@ -0,0 +1,53 @@
+{
+ "name": "fastq",
+ "version": "1.17.1",
+ "description": "Fast, in memory work queue",
+ "main": "queue.js",
+ "scripts": {
+ "lint": "standard --verbose | snazzy",
+ "unit": "nyc --lines 100 --branches 100 --functions 100 --check-coverage --reporter=text tape test/test.js test/promise.js",
+ "coverage": "nyc --reporter=html --reporter=cobertura --reporter=text tape test/test.js test/promise.js",
+ "test:report": "npm run lint && npm run unit:report",
+ "test": "npm run lint && npm run unit",
+ "typescript": "tsc --project ./test/tsconfig.json",
+ "legacy": "tape test/test.js"
+ },
+ "pre-commit": [
+ "test",
+ "typescript"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/mcollina/fastq.git"
+ },
+ "keywords": [
+ "fast",
+ "queue",
+ "async",
+ "worker"
+ ],
+ "author": "Matteo Collina ",
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/mcollina/fastq/issues"
+ },
+ "homepage": "https://github.com/mcollina/fastq#readme",
+ "devDependencies": {
+ "async": "^3.1.0",
+ "neo-async": "^2.6.1",
+ "nyc": "^15.0.0",
+ "pre-commit": "^1.2.2",
+ "snazzy": "^9.0.0",
+ "standard": "^16.0.0",
+ "tape": "^5.0.0",
+ "typescript": "^5.0.4"
+ },
+ "dependencies": {
+ "reusify": "^1.0.4"
+ },
+ "standard": {
+ "ignore": [
+ "example.mjs"
+ ]
+ }
+}
diff --git a/node_modules/fastq/queue.js b/node_modules/fastq/queue.js
new file mode 100644
index 0000000..a9d0fa9
--- /dev/null
+++ b/node_modules/fastq/queue.js
@@ -0,0 +1,311 @@
+'use strict'
+
+/* eslint-disable no-var */
+
+var reusify = require('reusify')
+
+function fastqueue (context, worker, _concurrency) {
+ if (typeof context === 'function') {
+ _concurrency = worker
+ worker = context
+ context = null
+ }
+
+ if (!(_concurrency >= 1)) {
+ throw new Error('fastqueue concurrency must be equal to or greater than 1')
+ }
+
+ var cache = reusify(Task)
+ var queueHead = null
+ var queueTail = null
+ var _running = 0
+ var errorHandler = null
+
+ var self = {
+ push: push,
+ drain: noop,
+ saturated: noop,
+ pause: pause,
+ paused: false,
+
+ get concurrency () {
+ return _concurrency
+ },
+ set concurrency (value) {
+ if (!(value >= 1)) {
+ throw new Error('fastqueue concurrency must be equal to or greater than 1')
+ }
+ _concurrency = value
+
+ if (self.paused) return
+ for (; queueHead && _running < _concurrency;) {
+ _running++
+ release()
+ }
+ },
+
+ running: running,
+ resume: resume,
+ idle: idle,
+ length: length,
+ getQueue: getQueue,
+ unshift: unshift,
+ empty: noop,
+ kill: kill,
+ killAndDrain: killAndDrain,
+ error: error
+ }
+
+ return self
+
+ function running () {
+ return _running
+ }
+
+ function pause () {
+ self.paused = true
+ }
+
+ function length () {
+ var current = queueHead
+ var counter = 0
+
+ while (current) {
+ current = current.next
+ counter++
+ }
+
+ return counter
+ }
+
+ function getQueue () {
+ var current = queueHead
+ var tasks = []
+
+ while (current) {
+ tasks.push(current.value)
+ current = current.next
+ }
+
+ return tasks
+ }
+
+ function resume () {
+ if (!self.paused) return
+ self.paused = false
+ if (queueHead === null) {
+ _running++
+ release()
+ return
+ }
+ for (; queueHead && _running < _concurrency;) {
+ _running++
+ release()
+ }
+ }
+
+ function idle () {
+ return _running === 0 && self.length() === 0
+ }
+
+ function push (value, done) {
+ var current = cache.get()
+
+ current.context = context
+ current.release = release
+ current.value = value
+ current.callback = done || noop
+ current.errorHandler = errorHandler
+
+ if (_running >= _concurrency || self.paused) {
+ if (queueTail) {
+ queueTail.next = current
+ queueTail = current
+ } else {
+ queueHead = current
+ queueTail = current
+ self.saturated()
+ }
+ } else {
+ _running++
+ worker.call(context, current.value, current.worked)
+ }
+ }
+
+ function unshift (value, done) {
+ var current = cache.get()
+
+ current.context = context
+ current.release = release
+ current.value = value
+ current.callback = done || noop
+ current.errorHandler = errorHandler
+
+ if (_running >= _concurrency || self.paused) {
+ if (queueHead) {
+ current.next = queueHead
+ queueHead = current
+ } else {
+ queueHead = current
+ queueTail = current
+ self.saturated()
+ }
+ } else {
+ _running++
+ worker.call(context, current.value, current.worked)
+ }
+ }
+
+ function release (holder) {
+ if (holder) {
+ cache.release(holder)
+ }
+ var next = queueHead
+ if (next && _running <= _concurrency) {
+ if (!self.paused) {
+ if (queueTail === queueHead) {
+ queueTail = null
+ }
+ queueHead = next.next
+ next.next = null
+ worker.call(context, next.value, next.worked)
+ if (queueTail === null) {
+ self.empty()
+ }
+ } else {
+ _running--
+ }
+ } else if (--_running === 0) {
+ self.drain()
+ }
+ }
+
+ function kill () {
+ queueHead = null
+ queueTail = null
+ self.drain = noop
+ }
+
+ function killAndDrain () {
+ queueHead = null
+ queueTail = null
+ self.drain()
+ self.drain = noop
+ }
+
+ function error (handler) {
+ errorHandler = handler
+ }
+}
+
+function noop () {}
+
+function Task () {
+ this.value = null
+ this.callback = noop
+ this.next = null
+ this.release = noop
+ this.context = null
+ this.errorHandler = null
+
+ var self = this
+
+ this.worked = function worked (err, result) {
+ var callback = self.callback
+ var errorHandler = self.errorHandler
+ var val = self.value
+ self.value = null
+ self.callback = noop
+ if (self.errorHandler) {
+ errorHandler(err, val)
+ }
+ callback.call(self.context, err, result)
+ self.release(self)
+ }
+}
+
+function queueAsPromised (context, worker, _concurrency) {
+ if (typeof context === 'function') {
+ _concurrency = worker
+ worker = context
+ context = null
+ }
+
+ function asyncWrapper (arg, cb) {
+ worker.call(this, arg)
+ .then(function (res) {
+ cb(null, res)
+ }, cb)
+ }
+
+ var queue = fastqueue(context, asyncWrapper, _concurrency)
+
+ var pushCb = queue.push
+ var unshiftCb = queue.unshift
+
+ queue.push = push
+ queue.unshift = unshift
+ queue.drained = drained
+
+ return queue
+
+ function push (value) {
+ var p = new Promise(function (resolve, reject) {
+ pushCb(value, function (err, result) {
+ if (err) {
+ reject(err)
+ return
+ }
+ resolve(result)
+ })
+ })
+
+ // Let's fork the promise chain to
+ // make the error bubble up to the user but
+ // not lead to a unhandledRejection
+ p.catch(noop)
+
+ return p
+ }
+
+ function unshift (value) {
+ var p = new Promise(function (resolve, reject) {
+ unshiftCb(value, function (err, result) {
+ if (err) {
+ reject(err)
+ return
+ }
+ resolve(result)
+ })
+ })
+
+ // Let's fork the promise chain to
+ // make the error bubble up to the user but
+ // not lead to a unhandledRejection
+ p.catch(noop)
+
+ return p
+ }
+
+ function drained () {
+ if (queue.idle()) {
+ return new Promise(function (resolve) {
+ resolve()
+ })
+ }
+
+ var previousDrain = queue.drain
+
+ var p = new Promise(function (resolve) {
+ queue.drain = function () {
+ previousDrain()
+ resolve()
+ }
+ })
+
+ return p
+ }
+}
+
+module.exports = fastqueue
+module.exports.promise = queueAsPromised
diff --git a/node_modules/fastq/test/example.ts b/node_modules/fastq/test/example.ts
new file mode 100644
index 0000000..a47d441
--- /dev/null
+++ b/node_modules/fastq/test/example.ts
@@ -0,0 +1,83 @@
+import * as fastq from '../'
+import { promise as queueAsPromised } from '../'
+
+// Basic example
+
+const queue = fastq(worker, 1)
+
+queue.push('world', (err, result) => {
+ if (err) throw err
+ console.log('the result is', result)
+})
+
+queue.push('push without cb')
+
+queue.concurrency
+
+queue.drain()
+
+queue.empty = () => undefined
+
+console.log('the queue tasks are', queue.getQueue())
+
+queue.idle()
+
+queue.kill()
+
+queue.killAndDrain()
+
+queue.length
+
+queue.pause()
+
+queue.resume()
+
+queue.running()
+
+queue.saturated = () => undefined
+
+queue.unshift('world', (err, result) => {
+ if (err) throw err
+ console.log('the result is', result)
+})
+
+queue.unshift('unshift without cb')
+
+function worker(task: any, cb: fastq.done) {
+ cb(null, 'hello ' + task)
+}
+
+// Generics example
+
+interface GenericsContext {
+ base: number;
+}
+
+const genericsQueue = fastq({ base: 6 }, genericsWorker, 1)
+
+genericsQueue.push(7, (err, done) => {
+ if (err) throw err
+ console.log('the result is', done)
+})
+
+genericsQueue.unshift(7, (err, done) => {
+ if (err) throw err
+ console.log('the result is', done)
+})
+
+function genericsWorker(this: GenericsContext, task: number, cb: fastq.done) {
+ cb(null, 'the meaning of life is ' + (this.base * task))
+}
+
+const queue2 = queueAsPromised(asyncWorker, 1)
+
+async function asyncWorker(task: any) {
+ return 'hello ' + task
+}
+
+async function run () {
+ await queue.push(42)
+ await queue.unshift(42)
+}
+
+run()
diff --git a/node_modules/fastq/test/promise.js b/node_modules/fastq/test/promise.js
new file mode 100644
index 0000000..fe014ff
--- /dev/null
+++ b/node_modules/fastq/test/promise.js
@@ -0,0 +1,248 @@
+'use strict'
+
+const test = require('tape')
+const buildQueue = require('../').promise
+const { promisify } = require('util')
+const sleep = promisify(setTimeout)
+const immediate = promisify(setImmediate)
+
+test('concurrency', function (t) {
+ t.plan(2)
+ t.throws(buildQueue.bind(null, worker, 0))
+ t.doesNotThrow(buildQueue.bind(null, worker, 1))
+
+ async function worker (arg) {
+ return true
+ }
+})
+
+test('worker execution', async function (t) {
+ const queue = buildQueue(worker, 1)
+
+ const result = await queue.push(42)
+
+ t.equal(result, true, 'result matches')
+
+ async function worker (arg) {
+ t.equal(arg, 42)
+ return true
+ }
+})
+
+test('limit', async function (t) {
+ const queue = buildQueue(worker, 1)
+
+ const [res1, res2] = await Promise.all([queue.push(10), queue.push(0)])
+ t.equal(res1, 10, 'the result matches')
+ t.equal(res2, 0, 'the result matches')
+
+ async function worker (arg) {
+ await sleep(arg)
+ return arg
+ }
+})
+
+test('multiple executions', async function (t) {
+ const queue = buildQueue(worker, 1)
+ const toExec = [1, 2, 3, 4, 5]
+ const expected = ['a', 'b', 'c', 'd', 'e']
+ let count = 0
+
+ await Promise.all(toExec.map(async function (task, i) {
+ const result = await queue.push(task)
+ t.equal(result, expected[i], 'the result matches')
+ }))
+
+ async function worker (arg) {
+ t.equal(arg, toExec[count], 'arg matches')
+ return expected[count++]
+ }
+})
+
+test('drained', async function (t) {
+ const queue = buildQueue(worker, 2)
+
+ const toExec = new Array(10).fill(10)
+ let count = 0
+
+ async function worker (arg) {
+ await sleep(arg)
+ count++
+ }
+
+ toExec.forEach(function (i) {
+ queue.push(i)
+ })
+
+ await queue.drained()
+
+ t.equal(count, toExec.length)
+
+ toExec.forEach(function (i) {
+ queue.push(i)
+ })
+
+ await queue.drained()
+
+ t.equal(count, toExec.length * 2)
+})
+
+test('drained with exception should not throw', async function (t) {
+ const queue = buildQueue(worker, 2)
+
+ const toExec = new Array(10).fill(10)
+
+ async function worker () {
+ throw new Error('foo')
+ }
+
+ toExec.forEach(function (i) {
+ queue.push(i)
+ })
+
+ await queue.drained()
+})
+
+test('drained with drain function', async function (t) {
+ let drainCalled = false
+ const queue = buildQueue(worker, 2)
+
+ queue.drain = function () {
+ drainCalled = true
+ }
+
+ const toExec = new Array(10).fill(10)
+ let count = 0
+
+ async function worker (arg) {
+ await sleep(arg)
+ count++
+ }
+
+ toExec.forEach(function () {
+ queue.push()
+ })
+
+ await queue.drained()
+
+ t.equal(count, toExec.length)
+ t.equal(drainCalled, true)
+})
+
+test('drained while idle should resolve', async function (t) {
+ const queue = buildQueue(worker, 2)
+
+ async function worker (arg) {
+ await sleep(arg)
+ }
+
+ await queue.drained()
+})
+
+test('drained while idle should not call the drain function', async function (t) {
+ let drainCalled = false
+ const queue = buildQueue(worker, 2)
+
+ queue.drain = function () {
+ drainCalled = true
+ }
+
+ async function worker (arg) {
+ await sleep(arg)
+ }
+
+ await queue.drained()
+
+ t.equal(drainCalled, false)
+})
+
+test('set this', async function (t) {
+ t.plan(1)
+ const that = {}
+ const queue = buildQueue(that, worker, 1)
+
+ await queue.push(42)
+
+ async function worker (arg) {
+ t.equal(this, that, 'this matches')
+ }
+})
+
+test('unshift', async function (t) {
+ const queue = buildQueue(worker, 1)
+ const expected = [1, 2, 3, 4]
+
+ await Promise.all([
+ queue.push(1),
+ queue.push(4),
+ queue.unshift(3),
+ queue.unshift(2)
+ ])
+
+ t.is(expected.length, 0)
+
+ async function worker (arg) {
+ t.equal(expected.shift(), arg, 'tasks come in order')
+ }
+})
+
+test('push with worker throwing error', async function (t) {
+ t.plan(5)
+ const q = buildQueue(async function (task, cb) {
+ throw new Error('test error')
+ }, 1)
+ q.error(function (err, task) {
+ t.ok(err instanceof Error, 'global error handler should catch the error')
+ t.match(err.message, /test error/, 'error message should be "test error"')
+ t.equal(task, 42, 'The task executed should be passed')
+ })
+ try {
+ await q.push(42)
+ } catch (err) {
+ t.ok(err instanceof Error, 'push callback should catch the error')
+ t.match(err.message, /test error/, 'error message should be "test error"')
+ }
+})
+
+test('unshift with worker throwing error', async function (t) {
+ t.plan(2)
+ const q = buildQueue(async function (task, cb) {
+ throw new Error('test error')
+ }, 1)
+ try {
+ await q.unshift(42)
+ } catch (err) {
+ t.ok(err instanceof Error, 'push callback should catch the error')
+ t.match(err.message, /test error/, 'error message should be "test error"')
+ }
+})
+
+test('no unhandledRejection (push)', async function (t) {
+ function handleRejection () {
+ t.fail('unhandledRejection')
+ }
+ process.once('unhandledRejection', handleRejection)
+ const q = buildQueue(async function (task, cb) {
+ throw new Error('test error')
+ }, 1)
+
+ q.push(42)
+
+ await immediate()
+ process.removeListener('unhandledRejection', handleRejection)
+})
+
+test('no unhandledRejection (unshift)', async function (t) {
+ function handleRejection () {
+ t.fail('unhandledRejection')
+ }
+ process.once('unhandledRejection', handleRejection)
+ const q = buildQueue(async function (task, cb) {
+ throw new Error('test error')
+ }, 1)
+
+ q.unshift(42)
+
+ await immediate()
+ process.removeListener('unhandledRejection', handleRejection)
+})
diff --git a/node_modules/fastq/test/test.js b/node_modules/fastq/test/test.js
new file mode 100644
index 0000000..ceed7a7
--- /dev/null
+++ b/node_modules/fastq/test/test.js
@@ -0,0 +1,642 @@
+'use strict'
+
+/* eslint-disable no-var */
+
+var test = require('tape')
+var buildQueue = require('../')
+
+test('concurrency', function (t) {
+ t.plan(6)
+ t.throws(buildQueue.bind(null, worker, 0))
+ t.throws(buildQueue.bind(null, worker, NaN))
+ t.doesNotThrow(buildQueue.bind(null, worker, 1))
+
+ var queue = buildQueue(worker, 1)
+ t.throws(function () {
+ queue.concurrency = 0
+ })
+ t.throws(function () {
+ queue.concurrency = NaN
+ })
+ t.doesNotThrow(function () {
+ queue.concurrency = 2
+ })
+
+ function worker (arg, cb) {
+ cb(null, true)
+ }
+})
+
+test('worker execution', function (t) {
+ t.plan(3)
+
+ var queue = buildQueue(worker, 1)
+
+ queue.push(42, function (err, result) {
+ t.error(err, 'no error')
+ t.equal(result, true, 'result matches')
+ })
+
+ function worker (arg, cb) {
+ t.equal(arg, 42)
+ cb(null, true)
+ }
+})
+
+test('limit', function (t) {
+ t.plan(4)
+
+ var expected = [10, 0]
+ var queue = buildQueue(worker, 1)
+
+ queue.push(10, result)
+ queue.push(0, result)
+
+ function result (err, arg) {
+ t.error(err, 'no error')
+ t.equal(arg, expected.shift(), 'the result matches')
+ }
+
+ function worker (arg, cb) {
+ setTimeout(cb, arg, null, arg)
+ }
+})
+
+test('multiple executions', function (t) {
+ t.plan(15)
+
+ var queue = buildQueue(worker, 1)
+ var toExec = [1, 2, 3, 4, 5]
+ var count = 0
+
+ toExec.forEach(function (task) {
+ queue.push(task, done)
+ })
+
+ function done (err, result) {
+ t.error(err, 'no error')
+ t.equal(result, toExec[count - 1], 'the result matches')
+ }
+
+ function worker (arg, cb) {
+ t.equal(arg, toExec[count], 'arg matches')
+ count++
+ setImmediate(cb, null, arg)
+ }
+})
+
+test('multiple executions, one after another', function (t) {
+ t.plan(15)
+
+ var queue = buildQueue(worker, 1)
+ var toExec = [1, 2, 3, 4, 5]
+ var count = 0
+
+ queue.push(toExec[0], done)
+
+ function done (err, result) {
+ t.error(err, 'no error')
+ t.equal(result, toExec[count - 1], 'the result matches')
+ if (count < toExec.length) {
+ queue.push(toExec[count], done)
+ }
+ }
+
+ function worker (arg, cb) {
+ t.equal(arg, toExec[count], 'arg matches')
+ count++
+ setImmediate(cb, null, arg)
+ }
+})
+
+test('set this', function (t) {
+ t.plan(3)
+
+ var that = {}
+ var queue = buildQueue(that, worker, 1)
+
+ queue.push(42, function (err, result) {
+ t.error(err, 'no error')
+ t.equal(this, that, 'this matches')
+ })
+
+ function worker (arg, cb) {
+ t.equal(this, that, 'this matches')
+ cb(null, true)
+ }
+})
+
+test('drain', function (t) {
+ t.plan(4)
+
+ var queue = buildQueue(worker, 1)
+ var worked = false
+
+ queue.push(42, function (err, result) {
+ t.error(err, 'no error')
+ t.equal(result, true, 'result matches')
+ })
+
+ queue.drain = function () {
+ t.equal(true, worked, 'drained')
+ }
+
+ function worker (arg, cb) {
+ t.equal(arg, 42)
+ worked = true
+ setImmediate(cb, null, true)
+ }
+})
+
+test('pause && resume', function (t) {
+ t.plan(13)
+
+ var queue = buildQueue(worker, 1)
+ var worked = false
+ var expected = [42, 24]
+
+ t.notOk(queue.paused, 'it should not be paused')
+
+ queue.pause()
+
+ queue.push(42, function (err, result) {
+ t.error(err, 'no error')
+ t.equal(result, true, 'result matches')
+ })
+
+ queue.push(24, function (err, result) {
+ t.error(err, 'no error')
+ t.equal(result, true, 'result matches')
+ })
+
+ t.notOk(worked, 'it should be paused')
+ t.ok(queue.paused, 'it should be paused')
+
+ queue.resume()
+ queue.pause()
+ queue.resume()
+ queue.resume() // second resume is a no-op
+
+ function worker (arg, cb) {
+ t.notOk(queue.paused, 'it should not be paused')
+ t.ok(queue.running() <= queue.concurrency, 'should respect the concurrency')
+ t.equal(arg, expected.shift())
+ worked = true
+ process.nextTick(function () { cb(null, true) })
+ }
+})
+
+test('pause in flight && resume', function (t) {
+ t.plan(16)
+
+ var queue = buildQueue(worker, 1)
+ var expected = [42, 24, 12]
+
+ t.notOk(queue.paused, 'it should not be paused')
+
+ queue.push(42, function (err, result) {
+ t.error(err, 'no error')
+ t.equal(result, true, 'result matches')
+ t.ok(queue.paused, 'it should be paused')
+ process.nextTick(function () {
+ queue.resume()
+ queue.pause()
+ queue.resume()
+ })
+ })
+
+ queue.push(24, function (err, result) {
+ t.error(err, 'no error')
+ t.equal(result, true, 'result matches')
+ t.notOk(queue.paused, 'it should not be paused')
+ })
+
+ queue.push(12, function (err, result) {
+ t.error(err, 'no error')
+ t.equal(result, true, 'result matches')
+ t.notOk(queue.paused, 'it should not be paused')
+ })
+
+ queue.pause()
+
+ function worker (arg, cb) {
+ t.ok(queue.running() <= queue.concurrency, 'should respect the concurrency')
+ t.equal(arg, expected.shift())
+ process.nextTick(function () { cb(null, true) })
+ }
+})
+
+test('altering concurrency', function (t) {
+ t.plan(24)
+
+ var queue = buildQueue(worker, 1)
+
+ queue.push(24, workDone)
+ queue.push(24, workDone)
+ queue.push(24, workDone)
+
+ queue.pause()
+
+ queue.concurrency = 3 // concurrency changes are ignored while paused
+ queue.concurrency = 2
+
+ queue.resume()
+
+ t.equal(queue.running(), 2, '2 jobs running')
+
+ queue.concurrency = 3
+
+ t.equal(queue.running(), 3, '3 jobs running')
+
+ queue.concurrency = 1
+
+ t.equal(queue.running(), 3, '3 jobs running') // running jobs can't be killed
+
+ queue.push(24, workDone)
+ queue.push(24, workDone)
+ queue.push(24, workDone)
+ queue.push(24, workDone)
+
+ function workDone (err, result) {
+ t.error(err, 'no error')
+ t.equal(result, true, 'result matches')
+ }
+
+ function worker (arg, cb) {
+ t.ok(queue.running() <= queue.concurrency, 'should respect the concurrency')
+ setImmediate(function () {
+ cb(null, true)
+ })
+ }
+})
+
+test('idle()', function (t) {
+ t.plan(12)
+
+ var queue = buildQueue(worker, 1)
+
+ t.ok(queue.idle(), 'queue is idle')
+
+ queue.push(42, function (err, result) {
+ t.error(err, 'no error')
+ t.equal(result, true, 'result matches')
+ t.notOk(queue.idle(), 'queue is not idle')
+ })
+
+ queue.push(42, function (err, result) {
+ t.error(err, 'no error')
+ t.equal(result, true, 'result matches')
+ // it will go idle after executing this function
+ setImmediate(function () {
+ t.ok(queue.idle(), 'queue is now idle')
+ })
+ })
+
+ t.notOk(queue.idle(), 'queue is not idle')
+
+ function worker (arg, cb) {
+ t.notOk(queue.idle(), 'queue is not idle')
+ t.equal(arg, 42)
+ setImmediate(cb, null, true)
+ }
+})
+
+test('saturated', function (t) {
+ t.plan(9)
+
+ var queue = buildQueue(worker, 1)
+ var preworked = 0
+ var worked = 0
+
+ queue.saturated = function () {
+ t.pass('saturated')
+ t.equal(preworked, 1, 'started 1 task')
+ t.equal(worked, 0, 'worked zero task')
+ }
+
+ queue.push(42, done)
+ queue.push(42, done)
+
+ function done (err, result) {
+ t.error(err, 'no error')
+ t.equal(result, true, 'result matches')
+ }
+
+ function worker (arg, cb) {
+ t.equal(arg, 42)
+ preworked++
+ setImmediate(function () {
+ worked++
+ cb(null, true)
+ })
+ }
+})
+
+test('length', function (t) {
+ t.plan(7)
+
+ var queue = buildQueue(worker, 1)
+
+ t.equal(queue.length(), 0, 'nothing waiting')
+ queue.push(42, done)
+ t.equal(queue.length(), 0, 'nothing waiting')
+ queue.push(42, done)
+ t.equal(queue.length(), 1, 'one task waiting')
+ queue.push(42, done)
+ t.equal(queue.length(), 2, 'two tasks waiting')
+
+ function done (err, result) {
+ t.error(err, 'no error')
+ }
+
+ function worker (arg, cb) {
+ setImmediate(function () {
+ cb(null, true)
+ })
+ }
+})
+
+test('getQueue', function (t) {
+ t.plan(10)
+
+ var queue = buildQueue(worker, 1)
+
+ t.equal(queue.getQueue().length, 0, 'nothing waiting')
+ queue.push(42, done)
+ t.equal(queue.getQueue().length, 0, 'nothing waiting')
+ queue.push(42, done)
+ t.equal(queue.getQueue().length, 1, 'one task waiting')
+ t.equal(queue.getQueue()[0], 42, 'should be equal')
+ queue.push(43, done)
+ t.equal(queue.getQueue().length, 2, 'two tasks waiting')
+ t.equal(queue.getQueue()[0], 42, 'should be equal')
+ t.equal(queue.getQueue()[1], 43, 'should be equal')
+
+ function done (err, result) {
+ t.error(err, 'no error')
+ }
+
+ function worker (arg, cb) {
+ setImmediate(function () {
+ cb(null, true)
+ })
+ }
+})
+
+test('unshift', function (t) {
+ t.plan(8)
+
+ var queue = buildQueue(worker, 1)
+ var expected = [1, 2, 3, 4]
+
+ queue.push(1, done)
+ queue.push(4, done)
+ queue.unshift(3, done)
+ queue.unshift(2, done)
+
+ function done (err, result) {
+ t.error(err, 'no error')
+ }
+
+ function worker (arg, cb) {
+ t.equal(expected.shift(), arg, 'tasks come in order')
+ setImmediate(function () {
+ cb(null, true)
+ })
+ }
+})
+
+test('unshift && empty', function (t) {
+ t.plan(2)
+
+ var queue = buildQueue(worker, 1)
+ var completed = false
+
+ queue.pause()
+
+ queue.empty = function () {
+ t.notOk(completed, 'the task has not completed yet')
+ }
+
+ queue.unshift(1, done)
+
+ queue.resume()
+
+ function done (err, result) {
+ completed = true
+ t.error(err, 'no error')
+ }
+
+ function worker (arg, cb) {
+ setImmediate(function () {
+ cb(null, true)
+ })
+ }
+})
+
+test('push && empty', function (t) {
+ t.plan(2)
+
+ var queue = buildQueue(worker, 1)
+ var completed = false
+
+ queue.pause()
+
+ queue.empty = function () {
+ t.notOk(completed, 'the task has not completed yet')
+ }
+
+ queue.push(1, done)
+
+ queue.resume()
+
+ function done (err, result) {
+ completed = true
+ t.error(err, 'no error')
+ }
+
+ function worker (arg, cb) {
+ setImmediate(function () {
+ cb(null, true)
+ })
+ }
+})
+
+test('kill', function (t) {
+ t.plan(5)
+
+ var queue = buildQueue(worker, 1)
+ var expected = [1]
+
+ var predrain = queue.drain
+
+ queue.drain = function drain () {
+ t.fail('drain should never be called')
+ }
+
+ queue.push(1, done)
+ queue.push(4, done)
+ queue.unshift(3, done)
+ queue.unshift(2, done)
+ queue.kill()
+
+ function done (err, result) {
+ t.error(err, 'no error')
+ setImmediate(function () {
+ t.equal(queue.length(), 0, 'no queued tasks')
+ t.equal(queue.running(), 0, 'no running tasks')
+ t.equal(queue.drain, predrain, 'drain is back to default')
+ })
+ }
+
+ function worker (arg, cb) {
+ t.equal(expected.shift(), arg, 'tasks come in order')
+ setImmediate(function () {
+ cb(null, true)
+ })
+ }
+})
+
+test('killAndDrain', function (t) {
+ t.plan(6)
+
+ var queue = buildQueue(worker, 1)
+ var expected = [1]
+
+ var predrain = queue.drain
+
+ queue.drain = function drain () {
+ t.pass('drain has been called')
+ }
+
+ queue.push(1, done)
+ queue.push(4, done)
+ queue.unshift(3, done)
+ queue.unshift(2, done)
+ queue.killAndDrain()
+
+ function done (err, result) {
+ t.error(err, 'no error')
+ setImmediate(function () {
+ t.equal(queue.length(), 0, 'no queued tasks')
+ t.equal(queue.running(), 0, 'no running tasks')
+ t.equal(queue.drain, predrain, 'drain is back to default')
+ })
+ }
+
+ function worker (arg, cb) {
+ t.equal(expected.shift(), arg, 'tasks come in order')
+ setImmediate(function () {
+ cb(null, true)
+ })
+ }
+})
+
+test('pause && idle', function (t) {
+ t.plan(11)
+
+ var queue = buildQueue(worker, 1)
+ var worked = false
+
+ t.notOk(queue.paused, 'it should not be paused')
+ t.ok(queue.idle(), 'should be idle')
+
+ queue.pause()
+
+ queue.push(42, function (err, result) {
+ t.error(err, 'no error')
+ t.equal(result, true, 'result matches')
+ })
+
+ t.notOk(worked, 'it should be paused')
+ t.ok(queue.paused, 'it should be paused')
+ t.notOk(queue.idle(), 'should not be idle')
+
+ queue.resume()
+
+ t.notOk(queue.paused, 'it should not be paused')
+ t.notOk(queue.idle(), 'it should not be idle')
+
+ function worker (arg, cb) {
+ t.equal(arg, 42)
+ worked = true
+ process.nextTick(cb.bind(null, null, true))
+ process.nextTick(function () {
+ t.ok(queue.idle(), 'is should be idle')
+ })
+ }
+})
+
+test('push without cb', function (t) {
+ t.plan(1)
+
+ var queue = buildQueue(worker, 1)
+
+ queue.push(42)
+
+ function worker (arg, cb) {
+ t.equal(arg, 42)
+ cb()
+ }
+})
+
+test('unshift without cb', function (t) {
+ t.plan(1)
+
+ var queue = buildQueue(worker, 1)
+
+ queue.unshift(42)
+
+ function worker (arg, cb) {
+ t.equal(arg, 42)
+ cb()
+ }
+})
+
+test('push with worker throwing error', function (t) {
+ t.plan(5)
+ var q = buildQueue(function (task, cb) {
+ cb(new Error('test error'), null)
+ }, 1)
+ q.error(function (err, task) {
+ t.ok(err instanceof Error, 'global error handler should catch the error')
+ t.match(err.message, /test error/, 'error message should be "test error"')
+ t.equal(task, 42, 'The task executed should be passed')
+ })
+ q.push(42, function (err) {
+ t.ok(err instanceof Error, 'push callback should catch the error')
+ t.match(err.message, /test error/, 'error message should be "test error"')
+ })
+})
+
+test('unshift with worker throwing error', function (t) {
+ t.plan(5)
+ var q = buildQueue(function (task, cb) {
+ cb(new Error('test error'), null)
+ }, 1)
+ q.error(function (err, task) {
+ t.ok(err instanceof Error, 'global error handler should catch the error')
+ t.match(err.message, /test error/, 'error message should be "test error"')
+ t.equal(task, 42, 'The task executed should be passed')
+ })
+ q.unshift(42, function (err) {
+ t.ok(err instanceof Error, 'unshift callback should catch the error')
+ t.match(err.message, /test error/, 'error message should be "test error"')
+ })
+})
+
+test('pause/resume should trigger drain event', function (t) {
+ t.plan(1)
+
+ var queue = buildQueue(worker, 1)
+ queue.pause()
+ queue.drain = function () {
+ t.pass('drain should be called')
+ }
+
+ function worker (arg, cb) {
+ cb(null, true)
+ }
+
+ queue.resume()
+})
diff --git a/node_modules/fastq/test/tsconfig.json b/node_modules/fastq/test/tsconfig.json
new file mode 100644
index 0000000..66e16e9
--- /dev/null
+++ b/node_modules/fastq/test/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "compilerOptions": {
+ "target": "es6",
+ "module": "commonjs",
+ "noEmit": true,
+ "strict": true
+ },
+ "files": [
+ "./example.ts"
+ ]
+}
diff --git a/node_modules/fill-range/LICENSE b/node_modules/fill-range/LICENSE
new file mode 100644
index 0000000..9af4a67
--- /dev/null
+++ b/node_modules/fill-range/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-present, Jon Schlinkert.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/fill-range/README.md b/node_modules/fill-range/README.md
new file mode 100644
index 0000000..8d756fe
--- /dev/null
+++ b/node_modules/fill-range/README.md
@@ -0,0 +1,237 @@
+# fill-range [](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [](https://www.npmjs.com/package/fill-range) [](https://npmjs.org/package/fill-range) [](https://npmjs.org/package/fill-range) [](https://travis-ci.org/jonschlinkert/fill-range)
+
+> Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`
+
+Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/):
+
+```sh
+$ npm install --save fill-range
+```
+
+## Usage
+
+Expands numbers and letters, optionally using a `step` as the last argument. _(Numbers may be defined as JavaScript numbers or strings)_.
+
+```js
+const fill = require('fill-range');
+// fill(from, to[, step, options]);
+
+console.log(fill('1', '10')); //=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
+console.log(fill('1', '10', { toRegex: true })); //=> [1-9]|10
+```
+
+**Params**
+
+* `from`: **{String|Number}** the number or letter to start with
+* `to`: **{String|Number}** the number or letter to end with
+* `step`: **{String|Number|Object|Function}** Optionally pass a [step](#optionsstep) to use.
+* `options`: **{Object|Function}**: See all available [options](#options)
+
+## Examples
+
+By default, an array of values is returned.
+
+**Alphabetical ranges**
+
+```js
+console.log(fill('a', 'e')); //=> ['a', 'b', 'c', 'd', 'e']
+console.log(fill('A', 'E')); //=> [ 'A', 'B', 'C', 'D', 'E' ]
+```
+
+**Numerical ranges**
+
+Numbers can be defined as actual numbers or strings.
+
+```js
+console.log(fill(1, 5)); //=> [ 1, 2, 3, 4, 5 ]
+console.log(fill('1', '5')); //=> [ 1, 2, 3, 4, 5 ]
+```
+
+**Negative ranges**
+
+Numbers can be defined as actual numbers or strings.
+
+```js
+console.log(fill('-5', '-1')); //=> [ '-5', '-4', '-3', '-2', '-1' ]
+console.log(fill('-5', '5')); //=> [ '-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5' ]
+```
+
+**Steps (increments)**
+
+```js
+// numerical ranges with increments
+console.log(fill('0', '25', 4)); //=> [ '0', '4', '8', '12', '16', '20', '24' ]
+console.log(fill('0', '25', 5)); //=> [ '0', '5', '10', '15', '20', '25' ]
+console.log(fill('0', '25', 6)); //=> [ '0', '6', '12', '18', '24' ]
+
+// alphabetical ranges with increments
+console.log(fill('a', 'z', 4)); //=> [ 'a', 'e', 'i', 'm', 'q', 'u', 'y' ]
+console.log(fill('a', 'z', 5)); //=> [ 'a', 'f', 'k', 'p', 'u', 'z' ]
+console.log(fill('a', 'z', 6)); //=> [ 'a', 'g', 'm', 's', 'y' ]
+```
+
+## Options
+
+### options.step
+
+**Type**: `number` (formatted as a string or number)
+
+**Default**: `undefined`
+
+**Description**: The increment to use for the range. Can be used with letters or numbers.
+
+**Example(s)**
+
+```js
+// numbers
+console.log(fill('1', '10', 2)); //=> [ '1', '3', '5', '7', '9' ]
+console.log(fill('1', '10', 3)); //=> [ '1', '4', '7', '10' ]
+console.log(fill('1', '10', 4)); //=> [ '1', '5', '9' ]
+
+// letters
+console.log(fill('a', 'z', 5)); //=> [ 'a', 'f', 'k', 'p', 'u', 'z' ]
+console.log(fill('a', 'z', 7)); //=> [ 'a', 'h', 'o', 'v' ]
+console.log(fill('a', 'z', 9)); //=> [ 'a', 'j', 's' ]
+```
+
+### options.strictRanges
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Description**: By default, `null` is returned when an invalid range is passed. Enable this option to throw a `RangeError` on invalid ranges.
+
+**Example(s)**
+
+The following are all invalid:
+
+```js
+fill('1.1', '2'); // decimals not supported in ranges
+fill('a', '2'); // incompatible range values
+fill(1, 10, 'foo'); // invalid "step" argument
+```
+
+### options.stringify
+
+**Type**: `boolean`
+
+**Default**: `undefined`
+
+**Description**: Cast all returned values to strings. By default, integers are returned as numbers.
+
+**Example(s)**
+
+```js
+console.log(fill(1, 5)); //=> [ 1, 2, 3, 4, 5 ]
+console.log(fill(1, 5, { stringify: true })); //=> [ '1', '2', '3', '4', '5' ]
+```
+
+### options.toRegex
+
+**Type**: `boolean`
+
+**Default**: `undefined`
+
+**Description**: Create a regex-compatible source string, instead of expanding values to an array.
+
+**Example(s)**
+
+```js
+// alphabetical range
+console.log(fill('a', 'e', { toRegex: true })); //=> '[a-e]'
+// alphabetical with step
+console.log(fill('a', 'z', 3, { toRegex: true })); //=> 'a|d|g|j|m|p|s|v|y'
+// numerical range
+console.log(fill('1', '100', { toRegex: true })); //=> '[1-9]|[1-9][0-9]|100'
+// numerical range with zero padding
+console.log(fill('000001', '100000', { toRegex: true }));
+//=> '0{5}[1-9]|0{4}[1-9][0-9]|0{3}[1-9][0-9]{2}|0{2}[1-9][0-9]{3}|0[1-9][0-9]{4}|100000'
+```
+
+### options.transform
+
+**Type**: `function`
+
+**Default**: `undefined`
+
+**Description**: Customize each value in the returned array (or [string](#optionstoRegex)). _(you can also pass this function as the last argument to `fill()`)_.
+
+**Example(s)**
+
+```js
+// add zero padding
+console.log(fill(1, 5, value => String(value).padStart(4, '0')));
+//=> ['0001', '0002', '0003', '0004', '0005']
+```
+
+## About
+
+
+Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
+
+
+
+
+Running Tests
+
+Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
+
+```sh
+$ npm install && npm test
+```
+
+
+
+
+Building docs
+
+_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
+
+To generate the readme, run the following command:
+
+```sh
+$ npm install -g verbose/verb#dev verb-generate-readme && verb
+```
+
+
+
+### Contributors
+
+| **Commits** | **Contributor** |
+| --- | --- |
+| 116 | [jonschlinkert](https://github.com/jonschlinkert) |
+| 4 | [paulmillr](https://github.com/paulmillr) |
+| 2 | [realityking](https://github.com/realityking) |
+| 2 | [bluelovers](https://github.com/bluelovers) |
+| 1 | [edorivai](https://github.com/edorivai) |
+| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) |
+
+### Author
+
+**Jon Schlinkert**
+
+* [GitHub Profile](https://github.com/jonschlinkert)
+* [Twitter Profile](https://twitter.com/jonschlinkert)
+* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
+
+Please consider supporting me on Patreon, or [start your own Patreon page](https://patreon.com/invite/bxpbvm)!
+
+
+
+
+
+### License
+
+Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert).
+Released under the [MIT License](LICENSE).
+
+***
+
+_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 08, 2019._
\ No newline at end of file
diff --git a/node_modules/fill-range/index.js b/node_modules/fill-range/index.js
new file mode 100644
index 0000000..ddb212e
--- /dev/null
+++ b/node_modules/fill-range/index.js
@@ -0,0 +1,248 @@
+/*!
+ * fill-range
+ *
+ * Copyright (c) 2014-present, Jon Schlinkert.
+ * Licensed under the MIT License.
+ */
+
+'use strict';
+
+const util = require('util');
+const toRegexRange = require('to-regex-range');
+
+const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);
+
+const transform = toNumber => {
+ return value => toNumber === true ? Number(value) : String(value);
+};
+
+const isValidValue = value => {
+ return typeof value === 'number' || (typeof value === 'string' && value !== '');
+};
+
+const isNumber = num => Number.isInteger(+num);
+
+const zeros = input => {
+ let value = `${input}`;
+ let index = -1;
+ if (value[0] === '-') value = value.slice(1);
+ if (value === '0') return false;
+ while (value[++index] === '0');
+ return index > 0;
+};
+
+const stringify = (start, end, options) => {
+ if (typeof start === 'string' || typeof end === 'string') {
+ return true;
+ }
+ return options.stringify === true;
+};
+
+const pad = (input, maxLength, toNumber) => {
+ if (maxLength > 0) {
+ let dash = input[0] === '-' ? '-' : '';
+ if (dash) input = input.slice(1);
+ input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0'));
+ }
+ if (toNumber === false) {
+ return String(input);
+ }
+ return input;
+};
+
+const toMaxLen = (input, maxLength) => {
+ let negative = input[0] === '-' ? '-' : '';
+ if (negative) {
+ input = input.slice(1);
+ maxLength--;
+ }
+ while (input.length < maxLength) input = '0' + input;
+ return negative ? ('-' + input) : input;
+};
+
+const toSequence = (parts, options, maxLen) => {
+ parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
+ parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
+
+ let prefix = options.capture ? '' : '?:';
+ let positives = '';
+ let negatives = '';
+ let result;
+
+ if (parts.positives.length) {
+ positives = parts.positives.map(v => toMaxLen(String(v), maxLen)).join('|');
+ }
+
+ if (parts.negatives.length) {
+ negatives = `-(${prefix}${parts.negatives.map(v => toMaxLen(String(v), maxLen)).join('|')})`;
+ }
+
+ if (positives && negatives) {
+ result = `${positives}|${negatives}`;
+ } else {
+ result = positives || negatives;
+ }
+
+ if (options.wrap) {
+ return `(${prefix}${result})`;
+ }
+
+ return result;
+};
+
+const toRange = (a, b, isNumbers, options) => {
+ if (isNumbers) {
+ return toRegexRange(a, b, { wrap: false, ...options });
+ }
+
+ let start = String.fromCharCode(a);
+ if (a === b) return start;
+
+ let stop = String.fromCharCode(b);
+ return `[${start}-${stop}]`;
+};
+
+const toRegex = (start, end, options) => {
+ if (Array.isArray(start)) {
+ let wrap = options.wrap === true;
+ let prefix = options.capture ? '' : '?:';
+ return wrap ? `(${prefix}${start.join('|')})` : start.join('|');
+ }
+ return toRegexRange(start, end, options);
+};
+
+const rangeError = (...args) => {
+ return new RangeError('Invalid range arguments: ' + util.inspect(...args));
+};
+
+const invalidRange = (start, end, options) => {
+ if (options.strictRanges === true) throw rangeError([start, end]);
+ return [];
+};
+
+const invalidStep = (step, options) => {
+ if (options.strictRanges === true) {
+ throw new TypeError(`Expected step "${step}" to be a number`);
+ }
+ return [];
+};
+
+const fillNumbers = (start, end, step = 1, options = {}) => {
+ let a = Number(start);
+ let b = Number(end);
+
+ if (!Number.isInteger(a) || !Number.isInteger(b)) {
+ if (options.strictRanges === true) throw rangeError([start, end]);
+ return [];
+ }
+
+ // fix negative zero
+ if (a === 0) a = 0;
+ if (b === 0) b = 0;
+
+ let descending = a > b;
+ let startString = String(start);
+ let endString = String(end);
+ let stepString = String(step);
+ step = Math.max(Math.abs(step), 1);
+
+ let padded = zeros(startString) || zeros(endString) || zeros(stepString);
+ let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0;
+ let toNumber = padded === false && stringify(start, end, options) === false;
+ let format = options.transform || transform(toNumber);
+
+ if (options.toRegex && step === 1) {
+ return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options);
+ }
+
+ let parts = { negatives: [], positives: [] };
+ let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num));
+ let range = [];
+ let index = 0;
+
+ while (descending ? a >= b : a <= b) {
+ if (options.toRegex === true && step > 1) {
+ push(a);
+ } else {
+ range.push(pad(format(a, index), maxLen, toNumber));
+ }
+ a = descending ? a - step : a + step;
+ index++;
+ }
+
+ if (options.toRegex === true) {
+ return step > 1
+ ? toSequence(parts, options, maxLen)
+ : toRegex(range, null, { wrap: false, ...options });
+ }
+
+ return range;
+};
+
+const fillLetters = (start, end, step = 1, options = {}) => {
+ if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) {
+ return invalidRange(start, end, options);
+ }
+
+ let format = options.transform || (val => String.fromCharCode(val));
+ let a = `${start}`.charCodeAt(0);
+ let b = `${end}`.charCodeAt(0);
+
+ let descending = a > b;
+ let min = Math.min(a, b);
+ let max = Math.max(a, b);
+
+ if (options.toRegex && step === 1) {
+ return toRange(min, max, false, options);
+ }
+
+ let range = [];
+ let index = 0;
+
+ while (descending ? a >= b : a <= b) {
+ range.push(format(a, index));
+ a = descending ? a - step : a + step;
+ index++;
+ }
+
+ if (options.toRegex === true) {
+ return toRegex(range, null, { wrap: false, options });
+ }
+
+ return range;
+};
+
+const fill = (start, end, step, options = {}) => {
+ if (end == null && isValidValue(start)) {
+ return [start];
+ }
+
+ if (!isValidValue(start) || !isValidValue(end)) {
+ return invalidRange(start, end, options);
+ }
+
+ if (typeof step === 'function') {
+ return fill(start, end, 1, { transform: step });
+ }
+
+ if (isObject(step)) {
+ return fill(start, end, 0, step);
+ }
+
+ let opts = { ...options };
+ if (opts.capture === true) opts.wrap = true;
+ step = step || opts.step || 1;
+
+ if (!isNumber(step)) {
+ if (step != null && !isObject(step)) return invalidStep(step, opts);
+ return fill(start, end, 1, step);
+ }
+
+ if (isNumber(start) && isNumber(end)) {
+ return fillNumbers(start, end, step, opts);
+ }
+
+ return fillLetters(start, end, Math.max(Math.abs(step), 1), opts);
+};
+
+module.exports = fill;
diff --git a/node_modules/fill-range/package.json b/node_modules/fill-range/package.json
new file mode 100644
index 0000000..582357f
--- /dev/null
+++ b/node_modules/fill-range/package.json
@@ -0,0 +1,74 @@
+{
+ "name": "fill-range",
+ "description": "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`",
+ "version": "7.1.1",
+ "homepage": "https://github.com/jonschlinkert/fill-range",
+ "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
+ "contributors": [
+ "Edo Rivai (edo.rivai.nl)",
+ "Jon Schlinkert (http://twitter.com/jonschlinkert)",
+ "Paul Miller (paulmillr.com)",
+ "Rouven Weßling (www.rouvenwessling.de)",
+ "(https://github.com/wtgtybhertgeghgtwtg)"
+ ],
+ "repository": "jonschlinkert/fill-range",
+ "bugs": {
+ "url": "https://github.com/jonschlinkert/fill-range/issues"
+ },
+ "license": "MIT",
+ "files": [
+ "index.js"
+ ],
+ "main": "index.js",
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "lint": "eslint --cache --cache-location node_modules/.cache/.eslintcache --report-unused-disable-directives --ignore-path .gitignore .",
+ "mocha": "mocha --reporter dot",
+ "test": "npm run lint && npm run mocha",
+ "test:ci": "npm run test:cover",
+ "test:cover": "nyc npm run mocha"
+ },
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "devDependencies": {
+ "gulp-format-md": "^2.0.0",
+ "mocha": "^6.1.1",
+ "nyc": "^15.1.0"
+ },
+ "keywords": [
+ "alpha",
+ "alphabetical",
+ "array",
+ "bash",
+ "brace",
+ "expand",
+ "expansion",
+ "fill",
+ "glob",
+ "match",
+ "matches",
+ "matching",
+ "number",
+ "numerical",
+ "range",
+ "ranges",
+ "regex",
+ "sh"
+ ],
+ "verb": {
+ "toc": false,
+ "layout": "default",
+ "tasks": [
+ "readme"
+ ],
+ "plugins": [
+ "gulp-format-md"
+ ],
+ "lint": {
+ "reflinks": true
+ }
+ }
+}
diff --git a/node_modules/foreground-child/LICENSE b/node_modules/foreground-child/LICENSE
new file mode 100644
index 0000000..2d80720
--- /dev/null
+++ b/node_modules/foreground-child/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) 2015-2023 Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/foreground-child/README.md b/node_modules/foreground-child/README.md
new file mode 100644
index 0000000..477ca57
--- /dev/null
+++ b/node_modules/foreground-child/README.md
@@ -0,0 +1,128 @@
+# foreground-child
+
+Run a child as if it's the foreground process. Give it stdio. Exit
+when it exits.
+
+Mostly this module is here to support some use cases around
+wrapping child processes for test coverage and such. But it's
+also generally useful any time you want one program to execute
+another as if it's the "main" process, for example, if a program
+takes a `--cmd` argument to execute in some way.
+
+## USAGE
+
+```js
+import { foregroundChild } from 'foreground-child'
+// hybrid module, this also works:
+// const { foregroundChild } = require('foreground-child')
+
+// cats out this file
+const child = foregroundChild('cat', [__filename])
+
+// At this point, it's best to just do nothing else.
+// return or whatever.
+// If the child gets a signal, or just exits, then this
+// parent process will exit in the same way.
+```
+
+You can provide custom spawn options by passing an object after
+the program and arguments:
+
+```js
+const child = foregroundChild(`cat ${__filename}`, { shell: true })
+```
+
+A callback can optionally be provided, if you want to perform an
+action before your foreground-child exits:
+
+```js
+const child = foregroundChild('cat', [__filename], spawnOptions, () => {
+ doSomeActions()
+})
+```
+
+The callback can return a Promise in order to perform
+asynchronous actions. If the callback does not return a promise,
+then it must complete its actions within a single JavaScript
+tick.
+
+```js
+const child = foregroundChild('cat', [__filename], async () => {
+ await doSomeAsyncActions()
+})
+```
+
+If the callback throws or rejects, then it will be unhandled, and
+node will exit in error.
+
+If the callback returns a string value, then that will be used as
+the signal to exit the parent process. If it returns a number,
+then that number will be used as the parent exit status code. If
+it returns boolean `false`, then the parent process will not be
+terminated. If it returns `undefined`, then it will exit with the
+same signal/code as the child process.
+
+## Caveats
+
+The "normal" standard IO file descriptors (0, 1, and 2 for stdin,
+stdout, and stderr respectively) are shared with the child process.
+Additionally, if there is an IPC channel set up in the parent, then
+messages are proxied to the child on file descriptor 3.
+
+In Node, it's possible to also map arbitrary file descriptors
+into a child process. In these cases, foreground-child will not
+map the file descriptors into the child. If file descriptors 0,
+1, or 2 are used for the IPC channel, then strange behavior may
+happen (like printing IPC messages to stderr, for example).
+
+Note that a SIGKILL will always kill the parent process, but
+will not proxy the signal to the child process, because SIGKILL
+cannot be caught. In order to address this, a special "watchdog"
+child process is spawned which will send a SIGKILL to the child
+process if it does not terminate within half a second after the
+watchdog receives a SIGHUP due to its parent terminating.
+
+On Windows, issuing a `process.kill(process.pid, signal)` with a
+fatal termination signal may cause the process to exit with a `1`
+status code rather than reporting the signal properly. This
+module tries to do the right thing, but on Windows systems, you
+may see that incorrect result. There is as far as I'm aware no
+workaround for this.
+
+## util: `foreground-child/proxy-signals`
+
+If you just want to proxy the signals to a child process that the
+main process receives, you can use the `proxy-signals` export
+from this package.
+
+```js
+import { proxySignals } from 'foreground-child/proxy-signals'
+
+const childProcess = spawn('command', ['some', 'args'])
+proxySignals(childProcess)
+```
+
+Now, any fatal signal received by the current process will be
+proxied to the child process.
+
+It doesn't go in the other direction; ie, signals sent to the
+child process will not affect the parent. For that, listen to the
+child `exit` or `close` events, and handle them appropriately.
+
+## util: `foreground-child/watchdog`
+
+If you are spawning a child process, and want to ensure that it
+isn't left dangling if the parent process exits, you can use the
+watchdog utility exported by this module.
+
+```js
+import { watchdog } from 'foreground-child/watchdog'
+
+const childProcess = spawn('command', ['some', 'args'])
+const watchdogProcess = watchdog(childProcess)
+
+// watchdogProcess is a reference to the process monitoring the
+// parent and child. There's usually no reason to do anything
+// with it, as it's silent and will terminate
+// automatically when it's no longer needed.
+```
diff --git a/node_modules/foreground-child/package.json b/node_modules/foreground-child/package.json
new file mode 100644
index 0000000..980b7e8
--- /dev/null
+++ b/node_modules/foreground-child/package.json
@@ -0,0 +1,111 @@
+{
+ "name": "foreground-child",
+ "version": "3.3.0",
+ "description": "Run a child as if it's the foreground process. Give it stdio. Exit when it exits.",
+ "main": "./dist/commonjs/index.js",
+ "types": "./dist/commonjs/index.d.ts",
+ "exports": {
+ "./watchdog": {
+ "import": {
+ "source": "./src/watchdog.ts",
+ "types": "./dist/esm/watchdog.d.ts",
+ "default": "./dist/esm/watchdog.js"
+ },
+ "require": {
+ "source": "./src/watchdog.ts",
+ "types": "./dist/commonjs/watchdog.d.ts",
+ "default": "./dist/commonjs/watchdog.js"
+ }
+ },
+ "./proxy-signals": {
+ "import": {
+ "source": "./src/proxy-signals.ts",
+ "types": "./dist/esm/proxy-signals.d.ts",
+ "default": "./dist/esm/proxy-signals.js"
+ },
+ "require": {
+ "source": "./src/proxy-signals.ts",
+ "types": "./dist/commonjs/proxy-signals.d.ts",
+ "default": "./dist/commonjs/proxy-signals.js"
+ }
+ },
+ "./package.json": "./package.json",
+ ".": {
+ "import": {
+ "source": "./src/index.ts",
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "source": "./src/index.ts",
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ }
+ },
+ "files": [
+ "dist"
+ ],
+ "engines": {
+ "node": ">=14"
+ },
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "scripts": {
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "prepare": "tshy",
+ "pretest": "npm run prepare",
+ "presnap": "npm run prepare",
+ "test": "tap",
+ "snap": "tap",
+ "format": "prettier --write . --log-level warn",
+ "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts"
+ },
+ "prettier": {
+ "experimentalTernaries": true,
+ "semi": false,
+ "printWidth": 75,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf"
+ },
+ "tap": {
+ "typecheck": true
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/tapjs/foreground-child.git"
+ },
+ "author": "Isaac Z. Schlueter (http://blog.izs.me/)",
+ "license": "ISC",
+ "devDependencies": {
+ "@types/cross-spawn": "^6.0.2",
+ "@types/node": "^18.15.11",
+ "@types/tap": "^15.0.8",
+ "prettier": "^3.3.2",
+ "tap": "^19.2.5",
+ "tshy": "^1.15.1",
+ "typedoc": "^0.24.2",
+ "typescript": "^5.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "tshy": {
+ "exports": {
+ "./watchdog": "./src/watchdog.ts",
+ "./proxy-signals": "./src/proxy-signals.ts",
+ "./package.json": "./package.json",
+ ".": "./src/index.ts"
+ }
+ },
+ "type": "module"
+}
diff --git a/node_modules/function-bind/.eslintrc b/node_modules/function-bind/.eslintrc
new file mode 100644
index 0000000..71a054f
--- /dev/null
+++ b/node_modules/function-bind/.eslintrc
@@ -0,0 +1,21 @@
+{
+ "root": true,
+
+ "extends": "@ljharb",
+
+ "rules": {
+ "func-name-matching": 0,
+ "indent": [2, 4],
+ "no-new-func": [1],
+ },
+
+ "overrides": [
+ {
+ "files": "test/**",
+ "rules": {
+ "max-lines-per-function": 0,
+ "strict": [0]
+ },
+ },
+ ],
+}
diff --git a/node_modules/function-bind/.github/FUNDING.yml b/node_modules/function-bind/.github/FUNDING.yml
new file mode 100644
index 0000000..7448219
--- /dev/null
+++ b/node_modules/function-bind/.github/FUNDING.yml
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: [ljharb]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: npm/function-bind
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/node_modules/function-bind/.github/SECURITY.md b/node_modules/function-bind/.github/SECURITY.md
new file mode 100644
index 0000000..82e4285
--- /dev/null
+++ b/node_modules/function-bind/.github/SECURITY.md
@@ -0,0 +1,3 @@
+# Security
+
+Please email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.
diff --git a/node_modules/function-bind/.nycrc b/node_modules/function-bind/.nycrc
new file mode 100644
index 0000000..1826526
--- /dev/null
+++ b/node_modules/function-bind/.nycrc
@@ -0,0 +1,13 @@
+{
+ "all": true,
+ "check-coverage": false,
+ "reporter": ["text-summary", "text", "html", "json"],
+ "lines": 86,
+ "statements": 85.93,
+ "functions": 82.43,
+ "branches": 76.06,
+ "exclude": [
+ "coverage",
+ "test"
+ ]
+}
diff --git a/node_modules/function-bind/CHANGELOG.md b/node_modules/function-bind/CHANGELOG.md
new file mode 100644
index 0000000..f9e6cc0
--- /dev/null
+++ b/node_modules/function-bind/CHANGELOG.md
@@ -0,0 +1,136 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [v1.1.2](https://github.com/ljharb/function-bind/compare/v1.1.1...v1.1.2) - 2023-10-12
+
+### Merged
+
+- Point to the correct file [`#16`](https://github.com/ljharb/function-bind/pull/16)
+
+### Commits
+
+- [Tests] migrate tests to Github Actions [`4f8b57c`](https://github.com/ljharb/function-bind/commit/4f8b57c02f2011fe9ae353d5e74e8745f0988af8)
+- [Tests] remove `jscs` [`90eb2ed`](https://github.com/ljharb/function-bind/commit/90eb2edbeefd5b76cd6c3a482ea3454db169b31f)
+- [meta] update `.gitignore` [`53fcdc3`](https://github.com/ljharb/function-bind/commit/53fcdc371cd66634d6e9b71c836a50f437e89fed)
+- [Tests] up to `node` `v11.10`, `v10.15`, `v9.11`, `v8.15`, `v6.16`, `v4.9`; use `nvm install-latest-npm`; run audit script in tests [`1fe8f6e`](https://github.com/ljharb/function-bind/commit/1fe8f6e9aed0dfa8d8b3cdbd00c7f5ea0cd2b36e)
+- [meta] add `auto-changelog` [`1921fcb`](https://github.com/ljharb/function-bind/commit/1921fcb5b416b63ffc4acad051b6aad5722f777d)
+- [Robustness] remove runtime dependency on all builtins except `.apply` [`f743e61`](https://github.com/ljharb/function-bind/commit/f743e61aa6bb2360358c04d4884c9db853d118b7)
+- Docs: enable badges; update wording [`503cb12`](https://github.com/ljharb/function-bind/commit/503cb12d998b5f91822776c73332c7adcd6355dd)
+- [readme] update badges [`290c5db`](https://github.com/ljharb/function-bind/commit/290c5dbbbda7264efaeb886552a374b869a4bb48)
+- [Tests] switch to nyc for coverage [`ea360ba`](https://github.com/ljharb/function-bind/commit/ea360ba907fc2601ed18d01a3827fa2d3533cdf8)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` [`cae5e9e`](https://github.com/ljharb/function-bind/commit/cae5e9e07a5578dc6df26c03ee22851ce05b943c)
+- [meta] add `funding` field; create FUNDING.yml [`c9f4274`](https://github.com/ljharb/function-bind/commit/c9f4274aa80ea3aae9657a3938fdba41a3b04ca6)
+- [Tests] fix eslint errors from #15 [`f69aaa2`](https://github.com/ljharb/function-bind/commit/f69aaa2beb2fdab4415bfb885760a699d0b9c964)
+- [actions] fix permissions [`99a0cd9`](https://github.com/ljharb/function-bind/commit/99a0cd9f3b5bac223a0d572f081834cd73314be7)
+- [meta] use `npmignore` to autogenerate an npmignore file [`f03b524`](https://github.com/ljharb/function-bind/commit/f03b524ca91f75a109a5d062f029122c86ecd1ae)
+- [Dev Deps] update `@ljharb/eslint‑config`, `eslint`, `tape` [`7af9300`](https://github.com/ljharb/function-bind/commit/7af930023ae2ce7645489532821e4fbbcd7a2280)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `covert`, `tape` [`64a9127`](https://github.com/ljharb/function-bind/commit/64a9127ab0bd331b93d6572eaf6e9971967fc08c)
+- [Tests] use `aud` instead of `npm audit` [`e75069c`](https://github.com/ljharb/function-bind/commit/e75069c50010a8fcce2a9ce2324934c35fdb4386)
+- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape` [`d03555c`](https://github.com/ljharb/function-bind/commit/d03555ca59dea3b71ce710045e4303b9e2619e28)
+- [meta] add `safe-publish-latest` [`9c8f809`](https://github.com/ljharb/function-bind/commit/9c8f8092aed027d7e80c94f517aa892385b64f09)
+- [Dev Deps] update `@ljharb/eslint-config`, `tape` [`baf6893`](https://github.com/ljharb/function-bind/commit/baf6893e27f5b59abe88bc1995e6f6ed1e527397)
+- [meta] create SECURITY.md [`4db1779`](https://github.com/ljharb/function-bind/commit/4db17799f1f28ae294cb95e0081ca2b591c3911b)
+- [Tests] add `npm run audit` [`c8b38ec`](https://github.com/ljharb/function-bind/commit/c8b38ec40ed3f85dabdee40ed4148f1748375bc2)
+- Revert "Point to the correct file" [`05cdf0f`](https://github.com/ljharb/function-bind/commit/05cdf0fa205c6a3c5ba40bbedd1dfa9874f915c9)
+
+## [v1.1.1](https://github.com/ljharb/function-bind/compare/v1.1.0...v1.1.1) - 2017-08-28
+
+### Commits
+
+- [Tests] up to `node` `v8`; newer npm breaks on older node; fix scripts [`817f7d2`](https://github.com/ljharb/function-bind/commit/817f7d28470fdbff8ef608d4d565dd4d1430bc5e)
+- [Dev Deps] update `eslint`, `jscs`, `tape`, `@ljharb/eslint-config` [`854288b`](https://github.com/ljharb/function-bind/commit/854288b1b6f5c555f89aceb9eff1152510262084)
+- [Dev Deps] update `tape`, `jscs`, `eslint`, `@ljharb/eslint-config` [`83e639f`](https://github.com/ljharb/function-bind/commit/83e639ff74e6cd6921285bccec22c1bcf72311bd)
+- Only apps should have lockfiles [`5ed97f5`](https://github.com/ljharb/function-bind/commit/5ed97f51235c17774e0832e122abda0f3229c908)
+- Use a SPDX-compliant “license” field. [`5feefea`](https://github.com/ljharb/function-bind/commit/5feefea0dc0193993e83e5df01ded424403a5381)
+
+## [v1.1.0](https://github.com/ljharb/function-bind/compare/v1.0.2...v1.1.0) - 2016-02-14
+
+### Commits
+
+- Update `eslint`, `tape`; use my personal shared `eslint` config [`9c9062a`](https://github.com/ljharb/function-bind/commit/9c9062abbe9dd70b59ea2c3a3c3a81f29b457097)
+- Add `npm run eslint` [`dd96c56`](https://github.com/ljharb/function-bind/commit/dd96c56720034a3c1ffee10b8a59a6f7c53e24ad)
+- [New] return the native `bind` when available. [`82186e0`](https://github.com/ljharb/function-bind/commit/82186e03d73e580f95ff167e03f3582bed90ed72)
+- [Dev Deps] update `tape`, `jscs`, `eslint`, `@ljharb/eslint-config` [`a3dd767`](https://github.com/ljharb/function-bind/commit/a3dd76720c795cb7f4586b0544efabf8aa107b8b)
+- Update `eslint` [`3dae2f7`](https://github.com/ljharb/function-bind/commit/3dae2f7423de30a2d20313ddb1edc19660142fe9)
+- Update `tape`, `covert`, `jscs` [`a181eee`](https://github.com/ljharb/function-bind/commit/a181eee0cfa24eb229c6e843a971f36e060a2f6a)
+- [Tests] up to `node` `v5.6`, `v4.3` [`964929a`](https://github.com/ljharb/function-bind/commit/964929a6a4ddb36fb128de2bcc20af5e4f22e1ed)
+- Test up to `io.js` `v2.1` [`2be7310`](https://github.com/ljharb/function-bind/commit/2be7310f2f74886a7124ca925be411117d41d5ea)
+- Update `tape`, `jscs`, `eslint`, `@ljharb/eslint-config` [`45f3d68`](https://github.com/ljharb/function-bind/commit/45f3d6865c6ca93726abcef54febe009087af101)
+- [Dev Deps] update `tape`, `jscs` [`6e1340d`](https://github.com/ljharb/function-bind/commit/6e1340d94642deaecad3e717825db641af4f8b1f)
+- [Tests] up to `io.js` `v3.3`, `node` `v4.1` [`d9bad2b`](https://github.com/ljharb/function-bind/commit/d9bad2b778b1b3a6dd2876087b88b3acf319f8cc)
+- Update `eslint` [`935590c`](https://github.com/ljharb/function-bind/commit/935590caa024ab356102e4858e8fc315b2ccc446)
+- [Dev Deps] update `jscs`, `eslint`, `@ljharb/eslint-config` [`8c9a1ef`](https://github.com/ljharb/function-bind/commit/8c9a1efd848e5167887aa8501857a0940a480c57)
+- Test on `io.js` `v2.2` [`9a3a38c`](https://github.com/ljharb/function-bind/commit/9a3a38c92013aed6e108666e7bd40969b84ac86e)
+- Run `travis-ci` tests on `iojs` and `node` v0.12; speed up builds; allow 0.8 failures. [`69afc26`](https://github.com/ljharb/function-bind/commit/69afc2617405b147dd2a8d8ae73ca9e9283f18b4)
+- [Dev Deps] Update `tape`, `eslint` [`36c1be0`](https://github.com/ljharb/function-bind/commit/36c1be0ab12b45fe5df6b0fdb01a5d5137fd0115)
+- Update `tape`, `jscs` [`98d8303`](https://github.com/ljharb/function-bind/commit/98d8303cd5ca1c6b8f985469f86b0d44d7d45f6e)
+- Update `jscs` [`9633a4e`](https://github.com/ljharb/function-bind/commit/9633a4e9fbf82051c240855166e468ba8ba0846f)
+- Update `tape`, `jscs` [`c80ef0f`](https://github.com/ljharb/function-bind/commit/c80ef0f46efc9791e76fa50de4414092ac147831)
+- Test up to `io.js` `v3.0` [`7e2c853`](https://github.com/ljharb/function-bind/commit/7e2c8537d52ab9cf5a655755561d8917684c0df4)
+- Test on `io.js` `v2.4` [`5a199a2`](https://github.com/ljharb/function-bind/commit/5a199a27ba46795ba5eaf0845d07d4b8232895c9)
+- Test on `io.js` `v2.3` [`a511b88`](https://github.com/ljharb/function-bind/commit/a511b8896de0bddf3b56862daa416c701f4d0453)
+- Fixing a typo from 822b4e1938db02dc9584aa434fd3a45cb20caf43 [`732d6b6`](https://github.com/ljharb/function-bind/commit/732d6b63a9b33b45230e630dbcac7a10855d3266)
+- Update `jscs` [`da52a48`](https://github.com/ljharb/function-bind/commit/da52a4886c06d6490f46ae30b15e4163ba08905d)
+- Lock covert to v1.0.0. [`d6150fd`](https://github.com/ljharb/function-bind/commit/d6150fda1e6f486718ebdeff823333d9e48e7430)
+
+## [v1.0.2](https://github.com/ljharb/function-bind/compare/v1.0.1...v1.0.2) - 2014-10-04
+
+## [v1.0.1](https://github.com/ljharb/function-bind/compare/v1.0.0...v1.0.1) - 2014-10-03
+
+### Merged
+
+- make CI build faster [`#3`](https://github.com/ljharb/function-bind/pull/3)
+
+### Commits
+
+- Using my standard jscs.json [`d8ee94c`](https://github.com/ljharb/function-bind/commit/d8ee94c993eff0a84cf5744fe6a29627f5cffa1a)
+- Adding `npm run lint` [`7571ab7`](https://github.com/ljharb/function-bind/commit/7571ab7dfdbd99b25a1dbb2d232622bd6f4f9c10)
+- Using consistent indentation [`e91a1b1`](https://github.com/ljharb/function-bind/commit/e91a1b13a61e99ec1e530e299b55508f74218a95)
+- Updating jscs [`7e17892`](https://github.com/ljharb/function-bind/commit/7e1789284bc629bc9c1547a61c9b227bbd8c7a65)
+- Using consistent quotes [`c50b57f`](https://github.com/ljharb/function-bind/commit/c50b57fcd1c5ec38320979c837006069ebe02b77)
+- Adding keywords [`cb94631`](https://github.com/ljharb/function-bind/commit/cb946314eed35f21186a25fb42fc118772f9ee00)
+- Directly export a function expression instead of using a declaration, and relying on hoisting. [`5a33c5f`](https://github.com/ljharb/function-bind/commit/5a33c5f45642de180e0d207110bf7d1843ceb87c)
+- Naming npm URL and badge in README; use SVG [`2aef8fc`](https://github.com/ljharb/function-bind/commit/2aef8fcb79d54e63a58ae557c4e60949e05d5e16)
+- Naming deps URLs in README [`04228d7`](https://github.com/ljharb/function-bind/commit/04228d766670ee45ca24e98345c1f6a7621065b5)
+- Naming travis-ci URLs in README; using SVG [`62c810c`](https://github.com/ljharb/function-bind/commit/62c810c2f54ced956cd4d4ab7b793055addfe36e)
+- Make sure functions are invoked correctly (also passing coverage tests) [`2b289b4`](https://github.com/ljharb/function-bind/commit/2b289b4dfbf037ffcfa4dc95eb540f6165e9e43a)
+- Removing the strict mode pragmas; they make tests fail. [`1aa701d`](https://github.com/ljharb/function-bind/commit/1aa701d199ddc3782476e8f7eef82679be97b845)
+- Adding myself as a contributor [`85fd57b`](https://github.com/ljharb/function-bind/commit/85fd57b0860e5a7af42de9a287f3f265fc6d72fc)
+- Adding strict mode pragmas [`915b08e`](https://github.com/ljharb/function-bind/commit/915b08e084c86a722eafe7245e21db74aa21ca4c)
+- Adding devDeps URLs to README [`4ccc731`](https://github.com/ljharb/function-bind/commit/4ccc73112c1769859e4ca3076caf4086b3cba2cd)
+- Fixing the description. [`a7a472c`](https://github.com/ljharb/function-bind/commit/a7a472cf649af515c635cf560fc478fbe48999c8)
+- Using a function expression instead of a function declaration. [`b5d3e4e`](https://github.com/ljharb/function-bind/commit/b5d3e4ea6aaffc63888953eeb1fbc7ff45f1fa14)
+- Updating tape [`f086be6`](https://github.com/ljharb/function-bind/commit/f086be6029fb56dde61a258c1340600fa174d1e0)
+- Updating jscs [`5f9bdb3`](https://github.com/ljharb/function-bind/commit/5f9bdb375ab13ba48f30852aab94029520c54d71)
+- Updating jscs [`9b409ba`](https://github.com/ljharb/function-bind/commit/9b409ba6118e23395a4e5d83ef39152aab9d3bfc)
+- Run coverage as part of tests. [`8e1b6d4`](https://github.com/ljharb/function-bind/commit/8e1b6d459f047d1bd4fee814e01247c984c80bd0)
+- Run linter as part of tests [`c1ca83f`](https://github.com/ljharb/function-bind/commit/c1ca83f832df94587d09e621beba682fabfaa987)
+- Updating covert [`701e837`](https://github.com/ljharb/function-bind/commit/701e83774b57b4d3ef631e1948143f43a72f4bb9)
+
+## [v1.0.0](https://github.com/ljharb/function-bind/compare/v0.2.0...v1.0.0) - 2014-08-09
+
+### Commits
+
+- Make sure old and unstable nodes don't fail Travis [`27adca3`](https://github.com/ljharb/function-bind/commit/27adca34a4ab6ad67b6dfde43942a1b103ce4d75)
+- Fixing an issue when the bound function is called as a constructor in ES3. [`e20122d`](https://github.com/ljharb/function-bind/commit/e20122d267d92ce553859b280cbbea5d27c07731)
+- Adding `npm run coverage` [`a2e29c4`](https://github.com/ljharb/function-bind/commit/a2e29c4ecaef9e2f6cd1603e868c139073375502)
+- Updating tape [`b741168`](https://github.com/ljharb/function-bind/commit/b741168b12b235b1717ff696087645526b69213c)
+- Upgrading tape [`63631a0`](https://github.com/ljharb/function-bind/commit/63631a04c7fbe97cc2fa61829cc27246d6986f74)
+- Updating tape [`363cb46`](https://github.com/ljharb/function-bind/commit/363cb46dafb23cb3e347729a22f9448051d78464)
+
+## v0.2.0 - 2014-03-23
+
+### Commits
+
+- Updating test coverage to match es5-shim. [`aa94d44`](https://github.com/ljharb/function-bind/commit/aa94d44b8f9d7f69f10e060db7709aa7a694e5d4)
+- initial [`942ee07`](https://github.com/ljharb/function-bind/commit/942ee07e94e542d91798137bc4b80b926137e066)
+- Setting the bound function's length properly. [`079f46a`](https://github.com/ljharb/function-bind/commit/079f46a2d3515b7c0b308c2c13fceb641f97ca25)
+- Ensuring that some older browsers will throw when given a regex. [`36ac55b`](https://github.com/ljharb/function-bind/commit/36ac55b87f460d4330253c92870aa26fbfe8227f)
+- Removing npm scripts that don't have dependencies [`9d2be60`](https://github.com/ljharb/function-bind/commit/9d2be600002cb8bc8606f8f3585ad3e05868c750)
+- Updating tape [`297a4ac`](https://github.com/ljharb/function-bind/commit/297a4acc5464db381940aafb194d1c88f4e678f3)
+- Skipping length tests for now. [`d9891ea`](https://github.com/ljharb/function-bind/commit/d9891ea4d2aaffa69f408339cdd61ff740f70565)
+- don't take my tea [`dccd930`](https://github.com/ljharb/function-bind/commit/dccd930bfd60ea10cb178d28c97550c3bc8c1e07)
diff --git a/node_modules/function-bind/LICENSE b/node_modules/function-bind/LICENSE
new file mode 100644
index 0000000..62d6d23
--- /dev/null
+++ b/node_modules/function-bind/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2013 Raynos.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/node_modules/function-bind/README.md b/node_modules/function-bind/README.md
new file mode 100644
index 0000000..814c20b
--- /dev/null
+++ b/node_modules/function-bind/README.md
@@ -0,0 +1,46 @@
+# function-bind [![Version Badge][npm-version-svg]][package-url]
+
+[![github actions][actions-image]][actions-url]
+
+[![dependency status][deps-svg]][deps-url]
+[![dev dependency status][dev-deps-svg]][dev-deps-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][npm-badge-png]][package-url]
+
+Implementation of function.prototype.bind
+
+Old versions of phantomjs, Internet Explorer < 9, and node < 0.6 don't support `Function.prototype.bind`.
+
+## Example
+
+```js
+Function.prototype.bind = require("function-bind")
+```
+
+## Installation
+
+`npm install function-bind`
+
+## Contributors
+
+ - Raynos
+
+## MIT Licenced
+
+[package-url]: https://npmjs.org/package/function-bind
+[npm-version-svg]: https://versionbadg.es/Raynos/function-bind.svg
+[deps-svg]: https://david-dm.org/Raynos/function-bind.svg
+[deps-url]: https://david-dm.org/Raynos/function-bind
+[dev-deps-svg]: https://david-dm.org/Raynos/function-bind/dev-status.svg
+[dev-deps-url]: https://david-dm.org/Raynos/function-bind#info=devDependencies
+[npm-badge-png]: https://nodei.co/npm/function-bind.png?downloads=true&stars=true
+[license-image]: https://img.shields.io/npm/l/function-bind.svg
+[license-url]: LICENSE
+[downloads-image]: https://img.shields.io/npm/dm/function-bind.svg
+[downloads-url]: https://npm-stat.com/charts.html?package=function-bind
+[codecov-image]: https://codecov.io/gh/Raynos/function-bind/branch/main/graphs/badge.svg
+[codecov-url]: https://app.codecov.io/gh/Raynos/function-bind/
+[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/Raynos/function-bind
+[actions-url]: https://github.com/Raynos/function-bind/actions
diff --git a/node_modules/function-bind/implementation.js b/node_modules/function-bind/implementation.js
new file mode 100644
index 0000000..fd4384c
--- /dev/null
+++ b/node_modules/function-bind/implementation.js
@@ -0,0 +1,84 @@
+'use strict';
+
+/* eslint no-invalid-this: 1 */
+
+var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
+var toStr = Object.prototype.toString;
+var max = Math.max;
+var funcType = '[object Function]';
+
+var concatty = function concatty(a, b) {
+ var arr = [];
+
+ for (var i = 0; i < a.length; i += 1) {
+ arr[i] = a[i];
+ }
+ for (var j = 0; j < b.length; j += 1) {
+ arr[j + a.length] = b[j];
+ }
+
+ return arr;
+};
+
+var slicy = function slicy(arrLike, offset) {
+ var arr = [];
+ for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) {
+ arr[j] = arrLike[i];
+ }
+ return arr;
+};
+
+var joiny = function (arr, joiner) {
+ var str = '';
+ for (var i = 0; i < arr.length; i += 1) {
+ str += arr[i];
+ if (i + 1 < arr.length) {
+ str += joiner;
+ }
+ }
+ return str;
+};
+
+module.exports = function bind(that) {
+ var target = this;
+ if (typeof target !== 'function' || toStr.apply(target) !== funcType) {
+ throw new TypeError(ERROR_MESSAGE + target);
+ }
+ var args = slicy(arguments, 1);
+
+ var bound;
+ var binder = function () {
+ if (this instanceof bound) {
+ var result = target.apply(
+ this,
+ concatty(args, arguments)
+ );
+ if (Object(result) === result) {
+ return result;
+ }
+ return this;
+ }
+ return target.apply(
+ that,
+ concatty(args, arguments)
+ );
+
+ };
+
+ var boundLength = max(0, target.length - args.length);
+ var boundArgs = [];
+ for (var i = 0; i < boundLength; i++) {
+ boundArgs[i] = '$' + i;
+ }
+
+ bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder);
+
+ if (target.prototype) {
+ var Empty = function Empty() {};
+ Empty.prototype = target.prototype;
+ bound.prototype = new Empty();
+ Empty.prototype = null;
+ }
+
+ return bound;
+};
diff --git a/node_modules/function-bind/index.js b/node_modules/function-bind/index.js
new file mode 100644
index 0000000..3bb6b96
--- /dev/null
+++ b/node_modules/function-bind/index.js
@@ -0,0 +1,5 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = Function.prototype.bind || implementation;
diff --git a/node_modules/function-bind/package.json b/node_modules/function-bind/package.json
new file mode 100644
index 0000000..6185963
--- /dev/null
+++ b/node_modules/function-bind/package.json
@@ -0,0 +1,87 @@
+{
+ "name": "function-bind",
+ "version": "1.1.2",
+ "description": "Implementation of Function.prototype.bind",
+ "keywords": [
+ "function",
+ "bind",
+ "shim",
+ "es5"
+ ],
+ "author": "Raynos ",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/Raynos/function-bind.git"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "main": "index",
+ "homepage": "https://github.com/Raynos/function-bind",
+ "contributors": [
+ {
+ "name": "Raynos"
+ },
+ {
+ "name": "Jordan Harband",
+ "url": "https://github.com/ljharb"
+ }
+ ],
+ "bugs": {
+ "url": "https://github.com/Raynos/function-bind/issues",
+ "email": "raynos2@gmail.com"
+ },
+ "devDependencies": {
+ "@ljharb/eslint-config": "^21.1.0",
+ "aud": "^2.0.3",
+ "auto-changelog": "^2.4.0",
+ "eslint": "=8.8.0",
+ "in-publish": "^2.0.1",
+ "npmignore": "^0.3.0",
+ "nyc": "^10.3.2",
+ "safe-publish-latest": "^2.0.0",
+ "tape": "^5.7.1"
+ },
+ "license": "MIT",
+ "scripts": {
+ "prepublishOnly": "safe-publish-latest",
+ "prepublish": "not-in-publish || npm run prepublishOnly",
+ "prepack": "npmignore --auto --commentLines=autogenerated",
+ "pretest": "npm run lint",
+ "test": "npm run tests-only",
+ "posttest": "aud --production",
+ "tests-only": "nyc tape 'test/**/*.js'",
+ "lint": "eslint --ext=js,mjs .",
+ "version": "auto-changelog && git add CHANGELOG.md",
+ "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""
+ },
+ "testling": {
+ "files": "test/index.js",
+ "browsers": [
+ "ie/8..latest",
+ "firefox/16..latest",
+ "firefox/nightly",
+ "chrome/22..latest",
+ "chrome/canary",
+ "opera/12..latest",
+ "opera/next",
+ "safari/5.1..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2..latest"
+ ]
+ },
+ "auto-changelog": {
+ "output": "CHANGELOG.md",
+ "template": "keepachangelog",
+ "unreleased": false,
+ "commitLimit": false,
+ "backfillLimit": false,
+ "hideCredit": true
+ },
+ "publishConfig": {
+ "ignore": [
+ ".github/workflows"
+ ]
+ }
+}
diff --git a/node_modules/function-bind/test/.eslintrc b/node_modules/function-bind/test/.eslintrc
new file mode 100644
index 0000000..8a56d5b
--- /dev/null
+++ b/node_modules/function-bind/test/.eslintrc
@@ -0,0 +1,9 @@
+{
+ "rules": {
+ "array-bracket-newline": 0,
+ "array-element-newline": 0,
+ "max-statements-per-line": [2, { "max": 2 }],
+ "no-invalid-this": 0,
+ "no-magic-numbers": 0,
+ }
+}
diff --git a/node_modules/function-bind/test/index.js b/node_modules/function-bind/test/index.js
new file mode 100644
index 0000000..2edecce
--- /dev/null
+++ b/node_modules/function-bind/test/index.js
@@ -0,0 +1,252 @@
+// jscs:disable requireUseStrict
+
+var test = require('tape');
+
+var functionBind = require('../implementation');
+var getCurrentContext = function () { return this; };
+
+test('functionBind is a function', function (t) {
+ t.equal(typeof functionBind, 'function');
+ t.end();
+});
+
+test('non-functions', function (t) {
+ var nonFunctions = [true, false, [], {}, 42, 'foo', NaN, /a/g];
+ t.plan(nonFunctions.length);
+ for (var i = 0; i < nonFunctions.length; ++i) {
+ try { functionBind.call(nonFunctions[i]); } catch (ex) {
+ t.ok(ex instanceof TypeError, 'throws when given ' + String(nonFunctions[i]));
+ }
+ }
+ t.end();
+});
+
+test('without a context', function (t) {
+ t.test('binds properly', function (st) {
+ var args, context;
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ context = this;
+ })
+ };
+ namespace.func(1, 2, 3);
+ st.deepEqual(args, [1, 2, 3]);
+ st.equal(context, getCurrentContext.call());
+ st.end();
+ });
+
+ t.test('binds properly, and still supplies bound arguments', function (st) {
+ var args, context;
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ context = this;
+ }, undefined, 1, 2, 3)
+ };
+ namespace.func(4, 5, 6);
+ st.deepEqual(args, [1, 2, 3, 4, 5, 6]);
+ st.equal(context, getCurrentContext.call());
+ st.end();
+ });
+
+ t.test('returns properly', function (st) {
+ var args;
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ return this;
+ }, null)
+ };
+ var context = namespace.func(1, 2, 3);
+ st.equal(context, getCurrentContext.call(), 'returned context is namespaced context');
+ st.deepEqual(args, [1, 2, 3], 'passed arguments are correct');
+ st.end();
+ });
+
+ t.test('returns properly with bound arguments', function (st) {
+ var args;
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ return this;
+ }, null, 1, 2, 3)
+ };
+ var context = namespace.func(4, 5, 6);
+ st.equal(context, getCurrentContext.call(), 'returned context is namespaced context');
+ st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'passed arguments are correct');
+ st.end();
+ });
+
+ t.test('called as a constructor', function (st) {
+ var thunkify = function (value) {
+ return function () { return value; };
+ };
+ st.test('returns object value', function (sst) {
+ var expectedReturnValue = [1, 2, 3];
+ var Constructor = functionBind.call(thunkify(expectedReturnValue), null);
+ var result = new Constructor();
+ sst.equal(result, expectedReturnValue);
+ sst.end();
+ });
+
+ st.test('does not return primitive value', function (sst) {
+ var Constructor = functionBind.call(thunkify(42), null);
+ var result = new Constructor();
+ sst.notEqual(result, 42);
+ sst.end();
+ });
+
+ st.test('object from bound constructor is instance of original and bound constructor', function (sst) {
+ var A = function (x) {
+ this.name = x || 'A';
+ };
+ var B = functionBind.call(A, null, 'B');
+
+ var result = new B();
+ sst.ok(result instanceof B, 'result is instance of bound constructor');
+ sst.ok(result instanceof A, 'result is instance of original constructor');
+ sst.end();
+ });
+
+ st.end();
+ });
+
+ t.end();
+});
+
+test('with a context', function (t) {
+ t.test('with no bound arguments', function (st) {
+ var args, context;
+ var boundContext = {};
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ context = this;
+ }, boundContext)
+ };
+ namespace.func(1, 2, 3);
+ st.equal(context, boundContext, 'binds a context properly');
+ st.deepEqual(args, [1, 2, 3], 'supplies passed arguments');
+ st.end();
+ });
+
+ t.test('with bound arguments', function (st) {
+ var args, context;
+ var boundContext = {};
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ context = this;
+ }, boundContext, 1, 2, 3)
+ };
+ namespace.func(4, 5, 6);
+ st.equal(context, boundContext, 'binds a context properly');
+ st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'supplies bound and passed arguments');
+ st.end();
+ });
+
+ t.test('returns properly', function (st) {
+ var boundContext = {};
+ var args;
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ return this;
+ }, boundContext)
+ };
+ var context = namespace.func(1, 2, 3);
+ st.equal(context, boundContext, 'returned context is bound context');
+ st.notEqual(context, getCurrentContext.call(), 'returned context is not lexical context');
+ st.deepEqual(args, [1, 2, 3], 'passed arguments are correct');
+ st.end();
+ });
+
+ t.test('returns properly with bound arguments', function (st) {
+ var boundContext = {};
+ var args;
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ return this;
+ }, boundContext, 1, 2, 3)
+ };
+ var context = namespace.func(4, 5, 6);
+ st.equal(context, boundContext, 'returned context is bound context');
+ st.notEqual(context, getCurrentContext.call(), 'returned context is not lexical context');
+ st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'passed arguments are correct');
+ st.end();
+ });
+
+ t.test('passes the correct arguments when called as a constructor', function (st) {
+ var expected = { name: 'Correct' };
+ var namespace = {
+ Func: functionBind.call(function (arg) {
+ return arg;
+ }, { name: 'Incorrect' })
+ };
+ var returned = new namespace.Func(expected);
+ st.equal(returned, expected, 'returns the right arg when called as a constructor');
+ st.end();
+ });
+
+ t.test('has the new instance\'s context when called as a constructor', function (st) {
+ var actualContext;
+ var expectedContext = { foo: 'bar' };
+ var namespace = {
+ Func: functionBind.call(function () {
+ actualContext = this;
+ }, expectedContext)
+ };
+ var result = new namespace.Func();
+ st.equal(result instanceof namespace.Func, true);
+ st.notEqual(actualContext, expectedContext);
+ st.end();
+ });
+
+ t.end();
+});
+
+test('bound function length', function (t) {
+ t.test('sets a correct length without thisArg', function (st) {
+ var subject = functionBind.call(function (a, b, c) { return a + b + c; });
+ st.equal(subject.length, 3);
+ st.equal(subject(1, 2, 3), 6);
+ st.end();
+ });
+
+ t.test('sets a correct length with thisArg', function (st) {
+ var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {});
+ st.equal(subject.length, 3);
+ st.equal(subject(1, 2, 3), 6);
+ st.end();
+ });
+
+ t.test('sets a correct length without thisArg and first argument', function (st) {
+ var subject = functionBind.call(function (a, b, c) { return a + b + c; }, undefined, 1);
+ st.equal(subject.length, 2);
+ st.equal(subject(2, 3), 6);
+ st.end();
+ });
+
+ t.test('sets a correct length with thisArg and first argument', function (st) {
+ var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {}, 1);
+ st.equal(subject.length, 2);
+ st.equal(subject(2, 3), 6);
+ st.end();
+ });
+
+ t.test('sets a correct length without thisArg and too many arguments', function (st) {
+ var subject = functionBind.call(function (a, b, c) { return a + b + c; }, undefined, 1, 2, 3, 4);
+ st.equal(subject.length, 0);
+ st.equal(subject(), 6);
+ st.end();
+ });
+
+ t.test('sets a correct length with thisArg and too many arguments', function (st) {
+ var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {}, 1, 2, 3, 4);
+ st.equal(subject.length, 0);
+ st.equal(subject(), 6);
+ st.end();
+ });
+});
diff --git a/node_modules/glob-parent/LICENSE b/node_modules/glob-parent/LICENSE
new file mode 100644
index 0000000..d701b08
--- /dev/null
+++ b/node_modules/glob-parent/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) 2015, 2019 Elan Shanker, 2021 Blaine Bublitz , Eric Schoffstall and other contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/glob-parent/README.md b/node_modules/glob-parent/README.md
new file mode 100644
index 0000000..6ae18a1
--- /dev/null
+++ b/node_modules/glob-parent/README.md
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+# glob-parent
+
+[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Coveralls Status][coveralls-image]][coveralls-url]
+
+Extract the non-magic parent path from a glob string.
+
+## Usage
+
+```js
+var globParent = require('glob-parent');
+
+globParent('path/to/*.js'); // 'path/to'
+globParent('/root/path/to/*.js'); // '/root/path/to'
+globParent('/*.js'); // '/'
+globParent('*.js'); // '.'
+globParent('**/*.js'); // '.'
+globParent('path/{to,from}'); // 'path'
+globParent('path/!(to|from)'); // 'path'
+globParent('path/?(to|from)'); // 'path'
+globParent('path/+(to|from)'); // 'path'
+globParent('path/*(to|from)'); // 'path'
+globParent('path/@(to|from)'); // 'path'
+globParent('path/**/*'); // 'path'
+
+// if provided a non-glob path, returns the nearest dir
+globParent('path/foo/bar.js'); // 'path/foo'
+globParent('path/foo/'); // 'path/foo'
+globParent('path/foo'); // 'path' (see issue #3 for details)
+```
+
+## API
+
+### `globParent(maybeGlobString, [options])`
+
+Takes a string and returns the part of the path before the glob begins. Be aware of Escaping rules and Limitations below.
+
+#### options
+
+```js
+{
+ // Disables the automatic conversion of slashes for Windows
+ flipBackslashes: true;
+}
+```
+
+## Escaping
+
+The following characters have special significance in glob patterns and must be escaped if you want them to be treated as regular path characters:
+
+- `?` (question mark) unless used as a path segment alone
+- `*` (asterisk)
+- `|` (pipe)
+- `(` (opening parenthesis)
+- `)` (closing parenthesis)
+- `{` (opening curly brace)
+- `}` (closing curly brace)
+- `[` (opening bracket)
+- `]` (closing bracket)
+
+**Example**
+
+```js
+globParent('foo/[bar]/'); // 'foo'
+globParent('foo/\\[bar]/'); // 'foo/[bar]'
+```
+
+## Limitations
+
+### Braces & Brackets
+
+This library attempts a quick and imperfect method of determining which path
+parts have glob magic without fully parsing/lexing the pattern. There are some
+advanced use cases that can trip it up, such as nested braces where the outer
+pair is escaped and the inner one contains a path separator. If you find
+yourself in the unlikely circumstance of being affected by this or need to
+ensure higher-fidelity glob handling in your library, it is recommended that you
+pre-process your input with [expand-braces] and/or [expand-brackets].
+
+### Windows
+
+Backslashes are not valid path separators for globs. If a path with backslashes
+is provided anyway, for simple cases, glob-parent will replace the path
+separator for you and return the non-glob parent path (now with
+forward-slashes, which are still valid as Windows path separators).
+
+This cannot be used in conjunction with escape characters.
+
+```js
+// BAD
+globParent('C:\\Program Files \\(x86\\)\\*.ext'); // 'C:/Program Files /(x86/)'
+
+// GOOD
+globParent('C:/Program Files\\(x86\\)/*.ext'); // 'C:/Program Files (x86)'
+```
+
+If you are using escape characters for a pattern without path parts (i.e.
+relative to `cwd`), prefix with `./` to avoid confusing glob-parent.
+
+```js
+// BAD
+globParent('foo \\[bar]'); // 'foo '
+globParent('foo \\[bar]*'); // 'foo '
+
+// GOOD
+globParent('./foo \\[bar]'); // 'foo [bar]'
+globParent('./foo \\[bar]*'); // '.'
+```
+
+## License
+
+ISC
+
+
+[downloads-image]: https://img.shields.io/npm/dm/glob-parent.svg?style=flat-square
+[npm-url]: https://www.npmjs.com/package/glob-parent
+[npm-image]: https://img.shields.io/npm/v/glob-parent.svg?style=flat-square
+
+[ci-url]: https://github.com/gulpjs/glob-parent/actions?query=workflow:dev
+[ci-image]: https://img.shields.io/github/workflow/status/gulpjs/glob-parent/dev?style=flat-square
+
+[coveralls-url]: https://coveralls.io/r/gulpjs/glob-parent
+[coveralls-image]: https://img.shields.io/coveralls/gulpjs/glob-parent/master.svg?style=flat-square
+
+
+
+[expand-braces]: https://github.com/jonschlinkert/expand-braces
+[expand-brackets]: https://github.com/jonschlinkert/expand-brackets
+
diff --git a/node_modules/glob-parent/index.js b/node_modules/glob-parent/index.js
new file mode 100644
index 0000000..09dde64
--- /dev/null
+++ b/node_modules/glob-parent/index.js
@@ -0,0 +1,75 @@
+'use strict';
+
+var isGlob = require('is-glob');
+var pathPosixDirname = require('path').posix.dirname;
+var isWin32 = require('os').platform() === 'win32';
+
+var slash = '/';
+var backslash = /\\/g;
+var escaped = /\\([!*?|[\](){}])/g;
+
+/**
+ * @param {string} str
+ * @param {Object} opts
+ * @param {boolean} [opts.flipBackslashes=true]
+ */
+module.exports = function globParent(str, opts) {
+ var options = Object.assign({ flipBackslashes: true }, opts);
+
+ // flip windows path separators
+ if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) {
+ str = str.replace(backslash, slash);
+ }
+
+ // special case for strings ending in enclosure containing path separator
+ if (isEnclosure(str)) {
+ str += slash;
+ }
+
+ // preserves full path in case of trailing path separator
+ str += 'a';
+
+ // remove path parts that are globby
+ do {
+ str = pathPosixDirname(str);
+ } while (isGlobby(str));
+
+ // remove escape chars and return result
+ return str.replace(escaped, '$1');
+};
+
+function isEnclosure(str) {
+ var lastChar = str.slice(-1);
+
+ var enclosureStart;
+ switch (lastChar) {
+ case '}':
+ enclosureStart = '{';
+ break;
+ case ']':
+ enclosureStart = '[';
+ break;
+ default:
+ return false;
+ }
+
+ var foundIndex = str.indexOf(enclosureStart);
+ if (foundIndex < 0) {
+ return false;
+ }
+
+ return str.slice(foundIndex + 1, -1).includes(slash);
+}
+
+function isGlobby(str) {
+ if (/\([^()]+$/.test(str)) {
+ return true;
+ }
+ if (str[0] === '{' || str[0] === '[') {
+ return true;
+ }
+ if (/[^\\][{[]/.test(str)) {
+ return true;
+ }
+ return isGlob(str);
+}
diff --git a/node_modules/glob-parent/package.json b/node_modules/glob-parent/package.json
new file mode 100644
index 0000000..baeab42
--- /dev/null
+++ b/node_modules/glob-parent/package.json
@@ -0,0 +1,54 @@
+{
+ "name": "glob-parent",
+ "version": "6.0.2",
+ "description": "Extract the non-magic parent path from a glob string.",
+ "author": "Gulp Team (https://gulpjs.com/)",
+ "contributors": [
+ "Elan Shanker (https://github.com/es128)",
+ "Blaine Bublitz "
+ ],
+ "repository": "gulpjs/glob-parent",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "main": "index.js",
+ "files": [
+ "LICENSE",
+ "index.js"
+ ],
+ "scripts": {
+ "lint": "eslint .",
+ "pretest": "npm run lint",
+ "test": "nyc mocha --async-only"
+ },
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "devDependencies": {
+ "eslint": "^7.0.0",
+ "eslint-config-gulp": "^5.0.0",
+ "expect": "^26.0.1",
+ "mocha": "^7.1.2",
+ "nyc": "^15.0.1"
+ },
+ "nyc": {
+ "reporter": [
+ "lcov",
+ "text-summary"
+ ]
+ },
+ "prettier": {
+ "singleQuote": true
+ },
+ "keywords": [
+ "glob",
+ "parent",
+ "strip",
+ "path",
+ "dirname",
+ "directory",
+ "base",
+ "wildcard"
+ ]
+}
diff --git a/node_modules/glob/LICENSE b/node_modules/glob/LICENSE
new file mode 100644
index 0000000..ec7df93
--- /dev/null
+++ b/node_modules/glob/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) 2009-2023 Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/glob/README.md b/node_modules/glob/README.md
new file mode 100644
index 0000000..023cd77
--- /dev/null
+++ b/node_modules/glob/README.md
@@ -0,0 +1,1265 @@
+# Glob
+
+Match files using the patterns the shell uses.
+
+The most correct and second fastest glob implementation in
+JavaScript. (See **Comparison to Other JavaScript Glob
+Implementations** at the bottom of this readme.)
+
+
+
+## Usage
+
+Install with npm
+
+```
+npm i glob
+```
+
+**Note** the npm package name is _not_ `node-glob` that's a
+different thing that was abandoned years ago. Just `glob`.
+
+```js
+// load using import
+import { glob, globSync, globStream, globStreamSync, Glob } from 'glob'
+// or using commonjs, that's fine, too
+const {
+ glob,
+ globSync,
+ globStream,
+ globStreamSync,
+ Glob,
+} = require('glob')
+
+// the main glob() and globSync() resolve/return array of filenames
+
+// all js files, but don't look in node_modules
+const jsfiles = await glob('**/*.js', { ignore: 'node_modules/**' })
+
+// pass in a signal to cancel the glob walk
+const stopAfter100ms = await glob('**/*.css', {
+ signal: AbortSignal.timeout(100),
+})
+
+// multiple patterns supported as well
+const images = await glob(['css/*.{png,jpeg}', 'public/*.{png,jpeg}'])
+
+// but of course you can do that with the glob pattern also
+// the sync function is the same, just returns a string[] instead
+// of Promise
+const imagesAlt = globSync('{css,public}/*.{png,jpeg}')
+
+// you can also stream them, this is a Minipass stream
+const filesStream = globStream(['**/*.dat', 'logs/**/*.log'])
+
+// construct a Glob object if you wanna do it that way, which
+// allows for much faster walks if you have to look in the same
+// folder multiple times.
+const g = new Glob('**/foo', {})
+// glob objects are async iterators, can also do globIterate() or
+// g.iterate(), same deal
+for await (const file of g) {
+ console.log('found a foo file:', file)
+}
+// pass a glob as the glob options to reuse its settings and caches
+const g2 = new Glob('**/bar', g)
+// sync iteration works as well
+for (const file of g2) {
+ console.log('found a bar file:', file)
+}
+
+// you can also pass withFileTypes: true to get Path objects
+// these are like a Dirent, but with some more added powers
+// check out http://npm.im/path-scurry for more info on their API
+const g3 = new Glob('**/baz/**', { withFileTypes: true })
+g3.stream().on('data', path => {
+ console.log(
+ 'got a path object',
+ path.fullpath(),
+ path.isDirectory(),
+ path.readdirSync().map(e => e.name),
+ )
+})
+
+// if you use stat:true and withFileTypes, you can sort results
+// by things like modified time, filter by permission mode, etc.
+// All Stats fields will be available in that case. Slightly
+// slower, though.
+// For example:
+const results = await glob('**', { stat: true, withFileTypes: true })
+
+const timeSortedFiles = results
+ .sort((a, b) => a.mtimeMs - b.mtimeMs)
+ .map(path => path.fullpath())
+
+const groupReadableFiles = results
+ .filter(path => path.mode & 0o040)
+ .map(path => path.fullpath())
+
+// custom ignores can be done like this, for example by saying
+// you'll ignore all markdown files, and all folders named 'docs'
+const customIgnoreResults = await glob('**', {
+ ignore: {
+ ignored: p => /\.md$/.test(p.name),
+ childrenIgnored: p => p.isNamed('docs'),
+ },
+})
+
+// another fun use case, only return files with the same name as
+// their parent folder, plus either `.ts` or `.js`
+const folderNamedModules = await glob('**/*.{ts,js}', {
+ ignore: {
+ ignored: p => {
+ const pp = p.parent
+ return !(p.isNamed(pp.name + '.ts') || p.isNamed(pp.name + '.js'))
+ },
+ },
+})
+
+// find all files edited in the last hour, to do this, we ignore
+// all of them that are more than an hour old
+const newFiles = await glob('**', {
+ // need stat so we have mtime
+ stat: true,
+ // only want the files, not the dirs
+ nodir: true,
+ ignore: {
+ ignored: p => {
+ return new Date() - p.mtime > 60 * 60 * 1000
+ },
+ // could add similar childrenIgnored here as well, but
+ // directory mtime is inconsistent across platforms, so
+ // probably better not to, unless you know the system
+ // tracks this reliably.
+ },
+})
+```
+
+**Note** Glob patterns should always use `/` as a path separator,
+even on Windows systems, as `\` is used to escape glob
+characters. If you wish to use `\` as a path separator _instead
+of_ using it as an escape character on Windows platforms, you may
+set `windowsPathsNoEscape:true` in the options. In this mode,
+special glob characters cannot be escaped, making it impossible
+to match a literal `*` `?` and so on in filenames.
+
+## Command Line Interface
+
+```
+$ glob -h
+
+Usage:
+ glob [options] [ [ ...]]
+
+Expand the positional glob expression arguments into any matching file system
+paths found.
+
+ -c --cmd=
+ Run the command provided, passing the glob expression
+ matches as arguments.
+
+ -A --all By default, the glob cli command will not expand any
+ arguments that are an exact match to a file on disk.
+
+ This prevents double-expanding, in case the shell
+ expands an argument whose filename is a glob
+ expression.
+
+ For example, if 'app/*.ts' would match 'app/[id].ts',
+ then on Windows powershell or cmd.exe, 'glob app/*.ts'
+ will expand to 'app/[id].ts', as expected. However, in
+ posix shells such as bash or zsh, the shell will first
+ expand 'app/*.ts' to a list of filenames. Then glob
+ will look for a file matching 'app/[id].ts' (ie,
+ 'app/i.ts' or 'app/d.ts'), which is unexpected.
+
+ Setting '--all' prevents this behavior, causing glob to
+ treat ALL patterns as glob expressions to be expanded,
+ even if they are an exact match to a file on disk.
+
+ When setting this option, be sure to enquote arguments
+ so that the shell will not expand them prior to passing
+ them to the glob command process.
+
+ -a --absolute Expand to absolute paths
+ -d --dot-relative Prepend './' on relative matches
+ -m --mark Append a / on any directories matched
+ -x --posix Always resolve to posix style paths, using '/' as the
+ directory separator, even on Windows. Drive letter
+ absolute matches on Windows will be expanded to their
+ full resolved UNC maths, eg instead of 'C:\foo\bar', it
+ will expand to '//?/C:/foo/bar'.
+
+ -f --follow Follow symlinked directories when expanding '**'
+ -R --realpath Call 'fs.realpath' on all of the results. In the case
+ of an entry that cannot be resolved, the entry is
+ omitted. This incurs a slight performance penalty, of
+ course, because of the added system calls.
+
+ -s --stat Call 'fs.lstat' on all entries, whether required or not
+ to determine if it's a valid match.
+
+ -b --match-base Perform a basename-only match if the pattern does not
+ contain any slash characters. That is, '*.js' would be
+ treated as equivalent to '**/*.js', matching js files
+ in all directories.
+
+ --dot Allow patterns to match files/directories that start
+ with '.', even if the pattern does not start with '.'
+
+ --nobrace Do not expand {...} patterns
+ --nocase Perform a case-insensitive match. This defaults to
+ 'true' on macOS and Windows platforms, and false on all
+ others.
+
+ Note: 'nocase' should only be explicitly set when it is
+ known that the filesystem's case sensitivity differs
+ from the platform default. If set 'true' on
+ case-insensitive file systems, then the walk may return
+ more or less results than expected.
+
+ --nodir Do not match directories, only files.
+
+ Note: to *only* match directories, append a '/' at the
+ end of the pattern.
+
+ --noext Do not expand extglob patterns, such as '+(a|b)'
+ --noglobstar Do not expand '**' against multiple path portions. Ie,
+ treat it as a normal '*' instead.
+
+ --windows-path-no-escape
+ Use '\' as a path separator *only*, and *never* as an
+ escape character. If set, all '\' characters are
+ replaced with '/' in the pattern.
+
+ -D --max-depth= Maximum depth to traverse from the current working
+ directory
+
+ -C --cwd= Current working directory to execute/match in
+ -r --root= A string path resolved against the 'cwd', which is used
+ as the starting point for absolute patterns that start
+ with '/' (but not drive letters or UNC paths on
+ Windows).
+
+ Note that this *doesn't* necessarily limit the walk to
+ the 'root' directory, and doesn't affect the cwd
+ starting point for non-absolute patterns. A pattern
+ containing '..' will still be able to traverse out of
+ the root directory, if it is not an actual root
+ directory on the filesystem, and any non-absolute
+ patterns will still be matched in the 'cwd'.
+
+ To start absolute and non-absolute patterns in the same
+ path, you can use '--root=' to set it to the empty
+ string. However, be aware that on Windows systems, a
+ pattern like 'x:/*' or '//host/share/*' will *always*
+ start in the 'x:/' or '//host/share/' directory,
+ regardless of the --root setting.
+
+ --platform= Defaults to the value of 'process.platform' if
+ available, or 'linux' if not. Setting --platform=win32
+ on non-Windows systems may cause strange behavior!
+
+ -i --ignore=
+ Glob patterns to ignore Can be set multiple times
+ -v --debug Output a huge amount of noisy debug information about
+ patterns as they are parsed and used to match files.
+
+ -h --help Show this usage information
+```
+
+## `glob(pattern: string | string[], options?: GlobOptions) => Promise`
+
+Perform an asynchronous glob search for the pattern(s) specified.
+Returns
+[Path](https://isaacs.github.io/path-scurry/classes/PathBase)
+objects if the `withFileTypes` option is set to `true`. See below
+for full options field desciptions.
+
+## `globSync(pattern: string | string[], options?: GlobOptions) => string[] | Path[]`
+
+Synchronous form of `glob()`.
+
+Alias: `glob.sync()`
+
+## `globIterate(pattern: string | string[], options?: GlobOptions) => AsyncGenerator`
+
+Return an async iterator for walking glob pattern matches.
+
+Alias: `glob.iterate()`
+
+## `globIterateSync(pattern: string | string[], options?: GlobOptions) => Generator`
+
+Return a sync iterator for walking glob pattern matches.
+
+Alias: `glob.iterate.sync()`, `glob.sync.iterate()`
+
+## `globStream(pattern: string | string[], options?: GlobOptions) => Minipass`
+
+Return a stream that emits all the strings or `Path` objects and
+then emits `end` when completed.
+
+Alias: `glob.stream()`
+
+## `globStreamSync(pattern: string | string[], options?: GlobOptions) => Minipass`
+
+Syncronous form of `globStream()`. Will read all the matches as
+fast as you consume them, even all in a single tick if you
+consume them immediately, but will still respond to backpressure
+if they're not consumed immediately.
+
+Alias: `glob.stream.sync()`, `glob.sync.stream()`
+
+## `hasMagic(pattern: string | string[], options?: GlobOptions) => boolean`
+
+Returns `true` if the provided pattern contains any "magic" glob
+characters, given the options provided.
+
+Brace expansion is not considered "magic" unless the
+`magicalBraces` option is set, as brace expansion just turns one
+string into an array of strings. So a pattern like `'x{a,b}y'`
+would return `false`, because `'xay'` and `'xby'` both do not
+contain any magic glob characters, and it's treated the same as
+if you had called it on `['xay', 'xby']`. When
+`magicalBraces:true` is in the options, brace expansion _is_
+treated as a pattern having magic.
+
+## `escape(pattern: string, options?: GlobOptions) => string`
+
+Escape all magic characters in a glob pattern, so that it will
+only ever match literal strings
+
+If the `windowsPathsNoEscape` option is used, then characters are
+escaped by wrapping in `[]`, because a magic character wrapped in
+a character class can only be satisfied by that exact character.
+
+Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot
+be escaped or unescaped.
+
+## `unescape(pattern: string, options?: GlobOptions) => string`
+
+Un-escape a glob string that may contain some escaped characters.
+
+If the `windowsPathsNoEscape` option is used, then square-brace
+escapes are removed, but not backslash escapes. For example, it
+will turn the string `'[*]'` into `*`, but it will not turn
+`'\\*'` into `'*'`, because `\` is a path separator in
+`windowsPathsNoEscape` mode.
+
+When `windowsPathsNoEscape` is not set, then both brace escapes
+and backslash escapes are removed.
+
+Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot
+be escaped or unescaped.
+
+## Class `Glob`
+
+An object that can perform glob pattern traversals.
+
+### `const g = new Glob(pattern: string | string[], options: GlobOptions)`
+
+Options object is required.
+
+See full options descriptions below.
+
+Note that a previous `Glob` object can be passed as the
+`GlobOptions` to another `Glob` instantiation to re-use settings
+and caches with a new pattern.
+
+Traversal functions can be called multiple times to run the walk
+again.
+
+### `g.stream()`
+
+Stream results asynchronously,
+
+### `g.streamSync()`
+
+Stream results synchronously.
+
+### `g.iterate()`
+
+Default async iteration function. Returns an AsyncGenerator that
+iterates over the results.
+
+### `g.iterateSync()`
+
+Default sync iteration function. Returns a Generator that
+iterates over the results.
+
+### `g.walk()`
+
+Returns a Promise that resolves to the results array.
+
+### `g.walkSync()`
+
+Returns a results array.
+
+### Properties
+
+All options are stored as properties on the `Glob` object.
+
+- `opts` The options provided to the constructor.
+- `patterns` An array of parsed immutable `Pattern` objects.
+
+## Options
+
+Exported as `GlobOptions` TypeScript interface. A `GlobOptions`
+object may be provided to any of the exported methods, and must
+be provided to the `Glob` constructor.
+
+All options are optional, boolean, and false by default, unless
+otherwise noted.
+
+All resolved options are added to the Glob object as properties.
+
+If you are running many `glob` operations, you can pass a Glob
+object as the `options` argument to a subsequent operation to
+share the previously loaded cache.
+
+- `cwd` String path or `file://` string or URL object. The
+ current working directory in which to search. Defaults to
+ `process.cwd()`. See also: "Windows, CWDs, Drive Letters, and
+ UNC Paths", below.
+
+ This option may be either a string path or a `file://` URL
+ object or string.
+
+- `root` A string path resolved against the `cwd` option, which
+ is used as the starting point for absolute patterns that start
+ with `/`, (but not drive letters or UNC paths on Windows).
+
+ Note that this _doesn't_ necessarily limit the walk to the
+ `root` directory, and doesn't affect the cwd starting point for
+ non-absolute patterns. A pattern containing `..` will still be
+ able to traverse out of the root directory, if it is not an
+ actual root directory on the filesystem, and any non-absolute
+ patterns will be matched in the `cwd`. For example, the
+ pattern `/../*` with `{root:'/some/path'}` will return all
+ files in `/some`, not all files in `/some/path`. The pattern
+ `*` with `{root:'/some/path'}` will return all the entries in
+ the cwd, not the entries in `/some/path`.
+
+ To start absolute and non-absolute patterns in the same
+ path, you can use `{root:''}`. However, be aware that on
+ Windows systems, a pattern like `x:/*` or `//host/share/*` will
+ _always_ start in the `x:/` or `//host/share` directory,
+ regardless of the `root` setting.
+
+- `windowsPathsNoEscape` Use `\\` as a path separator _only_, and
+ _never_ as an escape character. If set, all `\\` characters are
+ replaced with `/` in the pattern.
+
+ Note that this makes it **impossible** to match against paths
+ containing literal glob pattern characters, but allows matching
+ with patterns constructed using `path.join()` and
+ `path.resolve()` on Windows platforms, mimicking the (buggy!)
+ behavior of Glob v7 and before on Windows. Please use with
+ caution, and be mindful of [the caveat below about Windows
+ paths](#windows). (For legacy reasons, this is also set if
+ `allowWindowsEscape` is set to the exact value `false`.)
+
+- `dot` Include `.dot` files in normal matches and `globstar`
+ matches. Note that an explicit dot in a portion of the pattern
+ will always match dot files.
+
+- `magicalBraces` Treat brace expansion like `{a,b}` as a "magic"
+ pattern. Has no effect if {@link nobrace} is set.
+
+ Only has effect on the {@link hasMagic} function, no effect on
+ glob pattern matching itself.
+
+- `dotRelative` Prepend all relative path strings with `./` (or
+ `.\` on Windows).
+
+ Without this option, returned relative paths are "bare", so
+ instead of returning `'./foo/bar'`, they are returned as
+ `'foo/bar'`.
+
+ Relative patterns starting with `'../'` are not prepended with
+ `./`, even if this option is set.
+
+- `mark` Add a `/` character to directory matches. Note that this
+ requires additional stat calls.
+
+- `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets.
+
+- `noglobstar` Do not match `**` against multiple filenames. (Ie,
+ treat it as a normal `*` instead.)
+
+- `noext` Do not match "extglob" patterns such as `+(a|b)`.
+
+- `nocase` Perform a case-insensitive match. This defaults to
+ `true` on macOS and Windows systems, and `false` on all others.
+
+ **Note** `nocase` should only be explicitly set when it is
+ known that the filesystem's case sensitivity differs from the
+ platform default. If set `true` on case-sensitive file
+ systems, or `false` on case-insensitive file systems, then the
+ walk may return more or less results than expected.
+
+- `maxDepth` Specify a number to limit the depth of the directory
+ traversal to this many levels below the `cwd`.
+
+- `matchBase` Perform a basename-only match if the pattern does
+ not contain any slash characters. That is, `*.js` would be
+ treated as equivalent to `**/*.js`, matching all js files in
+ all directories.
+
+- `nodir` Do not match directories, only files. (Note: to match
+ _only_ directories, put a `/` at the end of the pattern.)
+
+ Note: when `follow` and `nodir` are both set, then symbolic
+ links to directories are also omitted.
+
+- `stat` Call `lstat()` on all entries, whether required or not
+ to determine whether it's a valid match. When used with
+ `withFileTypes`, this means that matches will include data such
+ as modified time, permissions, and so on. Note that this will
+ incur a performance cost due to the added system calls.
+
+- `ignore` string or string[], or an object with `ignore` and
+ `ignoreChildren` methods.
+
+ If a string or string[] is provided, then this is treated as a
+ glob pattern or array of glob patterns to exclude from matches.
+ To ignore all children within a directory, as well as the entry
+ itself, append `'/**'` to the ignore pattern.
+
+ **Note** `ignore` patterns are _always_ in `dot:true` mode,
+ regardless of any other settings.
+
+ If an object is provided that has `ignored(path)` and/or
+ `childrenIgnored(path)` methods, then these methods will be
+ called to determine whether any Path is a match or if its
+ children should be traversed, respectively.
+
+- `follow` Follow symlinked directories when expanding `**`
+ patterns. This can result in a lot of duplicate references in
+ the presence of cyclic links, and make performance quite bad.
+
+ By default, a `**` in a pattern will follow 1 symbolic link if
+ it is not the first item in the pattern, or none if it is the
+ first item in the pattern, following the same behavior as Bash.
+
+ Note: when `follow` and `nodir` are both set, then symbolic
+ links to directories are also omitted.
+
+- `realpath` Set to true to call `fs.realpath` on all of the
+ results. In the case of an entry that cannot be resolved, the
+ entry is omitted. This incurs a slight performance penalty, of
+ course, because of the added system calls.
+
+- `absolute` Set to true to always receive absolute paths for
+ matched files. Set to `false` to always receive relative paths
+ for matched files.
+
+ By default, when this option is not set, absolute paths are
+ returned for patterns that are absolute, and otherwise paths
+ are returned that are relative to the `cwd` setting.
+
+ This does _not_ make an extra system call to get the realpath,
+ it only does string path resolution.
+
+ `absolute` may not be used along with `withFileTypes`.
+
+- `posix` Set to true to use `/` as the path separator in
+ returned results. On posix systems, this has no effect. On
+ Windows systems, this will return `/` delimited path results,
+ and absolute paths will be returned in their full resolved UNC
+ path form, eg insted of `'C:\\foo\\bar'`, it will return
+ `//?/C:/foo/bar`.
+
+- `platform` Defaults to value of `process.platform` if
+ available, or `'linux'` if not. Setting `platform:'win32'` on
+ non-Windows systems may cause strange behavior.
+
+- `withFileTypes` Return [PathScurry](http://npm.im/path-scurry)
+ `Path` objects instead of strings. These are similar to a
+ NodeJS `Dirent` object, but with additional methods and
+ properties.
+
+ `withFileTypes` may not be used along with `absolute`.
+
+- `signal` An AbortSignal which will cancel the Glob walk when
+ triggered.
+
+- `fs` An override object to pass in custom filesystem methods.
+ See [PathScurry docs](http://npm.im/path-scurry) for what can
+ be overridden.
+
+- `scurry` A [PathScurry](http://npm.im/path-scurry) object used
+ to traverse the file system. If the `nocase` option is set
+ explicitly, then any provided `scurry` object must match this
+ setting.
+
+- `includeChildMatches` boolean, default `true`. Do not match any
+ children of any matches. For example, the pattern `**\/foo`
+ would match `a/foo`, but not `a/foo/b/foo` in this mode.
+
+ This is especially useful for cases like "find all
+ `node_modules` folders, but not the ones in `node_modules`".
+
+ In order to support this, the `Ignore` implementation must
+ support an `add(pattern: string)` method. If using the default
+ `Ignore` class, then this is fine, but if this is set to
+ `false`, and a custom `Ignore` is provided that does not have
+ an `add()` method, then it will throw an error.
+
+ **Caveat** It _only_ ignores matches that would be a descendant
+ of a previous match, and only if that descendant is matched
+ _after_ the ancestor is encountered. Since the file system walk
+ happens in indeterminate order, it's possible that a match will
+ already be added before its ancestor, if multiple or braced
+ patterns are used.
+
+ For example:
+
+ ```js
+ const results = await glob(
+ [
+ // likely to match first, since it's just a stat
+ 'a/b/c/d/e/f',
+
+ // this pattern is more complicated! It must to various readdir()
+ // calls and test the results against a regular expression, and that
+ // is certainly going to take a little bit longer.
+ //
+ // So, later on, it encounters a match at 'a/b/c/d/e', but it's too
+ // late to ignore a/b/c/d/e/f, because it's already been emitted.
+ 'a/[bdf]/?/[a-z]/*',
+ ],
+ { includeChildMatches: false },
+ )
+ ```
+
+ It's best to only set this to `false` if you can be reasonably
+ sure that no components of the pattern will potentially match
+ one another's file system descendants, or if the occasional
+ included child entry will not cause problems.
+
+## Glob Primer
+
+Much more information about glob pattern expansion can be found
+by running `man bash` and searching for `Pattern Matching`.
+
+"Globs" are the patterns you type when you do stuff like `ls
+*.js` on the command line, or put `build/*` in a `.gitignore`
+file.
+
+Before parsing the path part patterns, braced sections are
+expanded into a set. Braced sections start with `{` and end with
+`}`, with 2 or more comma-delimited sections within. Braced
+sections may contain slash characters, so `a{/b/c,bcd}` would
+expand into `a/b/c` and `abcd`.
+
+The following characters have special magic meaning when used in
+a path portion. With the exception of `**`, none of these match
+path separators (ie, `/` on all platforms, and `\` on Windows).
+
+- `*` Matches 0 or more characters in a single path portion.
+ When alone in a path portion, it must match at least 1
+ character. If `dot:true` is not specified, then `*` will not
+ match against a `.` character at the start of a path portion.
+- `?` Matches 1 character. If `dot:true` is not specified, then
+ `?` will not match against a `.` character at the start of a
+ path portion.
+- `[...]` Matches a range of characters, similar to a RegExp
+ range. If the first character of the range is `!` or `^` then
+ it matches any character not in the range. If the first
+ character is `]`, then it will be considered the same as `\]`,
+ rather than the end of the character class.
+- `!(pattern|pattern|pattern)` Matches anything that does not
+ match any of the patterns provided. May _not_ contain `/`
+ characters. Similar to `*`, if alone in a path portion, then
+ the path portion must have at least one character.
+- `?(pattern|pattern|pattern)` Matches zero or one occurrence of
+ the patterns provided. May _not_ contain `/` characters.
+- `+(pattern|pattern|pattern)` Matches one or more occurrences of
+ the patterns provided. May _not_ contain `/` characters.
+- `*(a|b|c)` Matches zero or more occurrences of the patterns
+ provided. May _not_ contain `/` characters.
+- `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns
+ provided. May _not_ contain `/` characters.
+- `**` If a "globstar" is alone in a path portion, then it
+ matches zero or more directories and subdirectories searching
+ for matches. It does not crawl symlinked directories, unless
+ `{follow:true}` is passed in the options object. A pattern
+ like `a/b/**` will only match `a/b` if it is a directory.
+ Follows 1 symbolic link if not the first item in the pattern,
+ or 0 if it is the first item, unless `follow:true` is set, in
+ which case it follows all symbolic links.
+
+`[:class:]` patterns are supported by this implementation, but
+`[=c=]` and `[.symbol.]` style class patterns are not.
+
+### Dots
+
+If a file or directory path portion has a `.` as the first
+character, then it will not match any glob pattern unless that
+pattern's corresponding path part also has a `.` as its first
+character.
+
+For example, the pattern `a/.*/c` would match the file at
+`a/.b/c`. However the pattern `a/*/c` would not, because `*` does
+not start with a dot character.
+
+You can make glob treat dots as normal characters by setting
+`dot:true` in the options.
+
+### Basename Matching
+
+If you set `matchBase:true` in the options, and the pattern has
+no slashes in it, then it will seek for any file anywhere in the
+tree with a matching basename. For example, `*.js` would match
+`test/simple/basic.js`.
+
+### Empty Sets
+
+If no matching files are found, then an empty array is returned.
+This differs from the shell, where the pattern itself is
+returned. For example:
+
+```sh
+$ echo a*s*d*f
+a*s*d*f
+```
+
+## Comparisons to other fnmatch/glob implementations
+
+While strict compliance with the existing standards is a
+worthwhile goal, some discrepancies exist between node-glob and
+other implementations, and are intentional.
+
+The double-star character `**` is supported by default, unless
+the `noglobstar` flag is set. This is supported in the manner of
+bsdglob and bash 5, where `**` only has special significance if
+it is the only thing in a path part. That is, `a/**/b` will match
+`a/x/y/b`, but `a/**b` will not.
+
+Note that symlinked directories are not traversed as part of a
+`**`, though their contents may match against subsequent portions
+of the pattern. This prevents infinite loops and duplicates and
+the like. You can force glob to traverse symlinks with `**` by
+setting `{follow:true}` in the options.
+
+There is no equivalent of the `nonull` option. A pattern that
+does not find any matches simply resolves to nothing. (An empty
+array, immediately ended stream, etc.)
+
+If brace expansion is not disabled, then it is performed before
+any other interpretation of the glob pattern. Thus, a pattern
+like `+(a|{b),c)}`, which would not be valid in bash or zsh, is
+expanded **first** into the set of `+(a|b)` and `+(a|c)`, and
+those patterns are checked for validity. Since those two are
+valid, matching proceeds.
+
+The character class patterns `[:class:]` (posix standard named
+classes) style class patterns are supported and unicode-aware,
+but `[=c=]` (locale-specific character collation weight), and
+`[.symbol.]` (collating symbol), are not.
+
+### Repeated Slashes
+
+Unlike Bash and zsh, repeated `/` are always coalesced into a
+single path separator.
+
+### Comments and Negation
+
+Previously, this module let you mark a pattern as a "comment" if
+it started with a `#` character, or a "negated" pattern if it
+started with a `!` character.
+
+These options were deprecated in version 5, and removed in
+version 6.
+
+To specify things that should not match, use the `ignore` option.
+
+## Windows
+
+**Please only use forward-slashes in glob expressions.**
+
+Though windows uses either `/` or `\` as its path separator, only
+`/` characters are used by this glob implementation. You must use
+forward-slashes **only** in glob expressions. Back-slashes will
+always be interpreted as escape characters, not path separators.
+
+Results from absolute patterns such as `/foo/*` are mounted onto
+the root setting using `path.join`. On windows, this will by
+default result in `/foo/*` matching `C:\foo\bar.txt`.
+
+To automatically coerce all `\` characters to `/` in pattern
+strings, **thus making it impossible to escape literal glob
+characters**, you may set the `windowsPathsNoEscape` option to
+`true`.
+
+### Windows, CWDs, Drive Letters, and UNC Paths
+
+On posix systems, when a pattern starts with `/`, any `cwd`
+option is ignored, and the traversal starts at `/`, plus any
+non-magic path portions specified in the pattern.
+
+On Windows systems, the behavior is similar, but the concept of
+an "absolute path" is somewhat more involved.
+
+#### UNC Paths
+
+A UNC path may be used as the start of a pattern on Windows
+platforms. For example, a pattern like: `//?/x:/*` will return
+all file entries in the root of the `x:` drive. A pattern like
+`//ComputerName/Share/*` will return all files in the associated
+share.
+
+UNC path roots are always compared case insensitively.
+
+#### Drive Letters
+
+A pattern starting with a drive letter, like `c:/*`, will search
+in that drive, regardless of any `cwd` option provided.
+
+If the pattern starts with `/`, and is not a UNC path, and there
+is an explicit `cwd` option set with a drive letter, then the
+drive letter in the `cwd` is used as the root of the directory
+traversal.
+
+For example, `glob('/tmp', { cwd: 'c:/any/thing' })` will return
+`['c:/tmp']` as the result.
+
+If an explicit `cwd` option is not provided, and the pattern
+starts with `/`, then the traversal will run on the root of the
+drive provided as the `cwd` option. (That is, it is the result of
+`path.resolve('/')`.)
+
+## Race Conditions
+
+Glob searching, by its very nature, is susceptible to race
+conditions, since it relies on directory walking.
+
+As a result, it is possible that a file that exists when glob
+looks for it may have been deleted or modified by the time it
+returns the result.
+
+By design, this implementation caches all readdir calls that it
+makes, in order to cut down on system overhead. However, this
+also makes it even more susceptible to races, especially if the
+cache object is reused between glob calls.
+
+Users are thus advised not to use a glob result as a guarantee of
+filesystem state in the face of rapid changes. For the vast
+majority of operations, this is never a problem.
+
+### See Also:
+
+- `man sh`
+- `man bash` [Pattern
+ Matching](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html)
+- `man 3 fnmatch`
+- `man 5 gitignore`
+- [minimatch documentation](https://github.com/isaacs/minimatch)
+
+## Glob Logo
+
+Glob's logo was created by [Tanya
+Brassie](http://tanyabrassie.com/). Logo files can be found
+[here](https://github.com/isaacs/node-glob/tree/master/logo).
+
+The logo is licensed under a [Creative Commons
+Attribution-ShareAlike 4.0 International
+License](https://creativecommons.org/licenses/by-sa/4.0/).
+
+## Contributing
+
+Any change to behavior (including bugfixes) must come with a
+test.
+
+Patches that fail tests or reduce performance will be rejected.
+
+```sh
+# to run tests
+npm test
+
+# to re-generate test fixtures
+npm run test-regen
+
+# run the benchmarks
+npm run bench
+
+# to profile javascript
+npm run prof
+```
+
+## Comparison to Other JavaScript Glob Implementations
+
+**tl;dr**
+
+- If you want glob matching that is as faithful as possible to
+ Bash pattern expansion semantics, and as fast as possible
+ within that constraint, _use this module_.
+- If you are reasonably sure that the patterns you will encounter
+ are relatively simple, and want the absolutely fastest glob
+ matcher out there, _use [fast-glob](http://npm.im/fast-glob)_.
+- If you are reasonably sure that the patterns you will encounter
+ are relatively simple, and want the convenience of
+ automatically respecting `.gitignore` files, _use
+ [globby](http://npm.im/globby)_.
+
+There are some other glob matcher libraries on npm, but these
+three are (in my opinion, as of 2023) the best.
+
+---
+
+**full explanation**
+
+Every library reflects a set of opinions and priorities in the
+trade-offs it makes. Other than this library, I can personally
+recommend both [globby](http://npm.im/globby) and
+[fast-glob](http://npm.im/fast-glob), though they differ in their
+benefits and drawbacks.
+
+Both have very nice APIs and are reasonably fast.
+
+`fast-glob` is, as far as I am aware, the fastest glob
+implementation in JavaScript today. However, there are many
+cases where the choices that `fast-glob` makes in pursuit of
+speed mean that its results differ from the results returned by
+Bash and other sh-like shells, which may be surprising.
+
+In my testing, `fast-glob` is around 10-20% faster than this
+module when walking over 200k files nested 4 directories
+deep[1](#fn-webscale). However, there are some inconsistencies
+with Bash matching behavior that this module does not suffer
+from:
+
+- `**` only matches files, not directories
+- `..` path portions are not handled unless they appear at the
+ start of the pattern
+- `./!()` will not match any files that _start_ with
+ ``, even if they do not match ``. For
+ example, `!(9).txt` will not match `9999.txt`.
+- Some brace patterns in the middle of a pattern will result in
+ failing to find certain matches.
+- Extglob patterns are allowed to contain `/` characters.
+
+Globby exhibits all of the same pattern semantics as fast-glob,
+(as it is a wrapper around fast-glob) and is slightly slower than
+node-glob (by about 10-20% in the benchmark test set, or in other
+words, anywhere from 20-50% slower than fast-glob). However, it
+adds some API conveniences that may be worth the costs.
+
+- Support for `.gitignore` and other ignore files.
+- Support for negated globs (ie, patterns starting with `!`
+ rather than using a separate `ignore` option).
+
+The priority of this module is "correctness" in the sense of
+performing a glob pattern expansion as faithfully as possible to
+the behavior of Bash and other sh-like shells, with as much speed
+as possible.
+
+Note that prior versions of `node-glob` are _not_ on this list.
+Former versions of this module are far too slow for any cases
+where performance matters at all, and were designed with APIs
+that are extremely dated by current JavaScript standards.
+
+---
+
+[1]: In the cases where this module
+returns results and `fast-glob` doesn't, it's even faster, of
+course.
+
+
+
+### Benchmark Results
+
+First number is time, smaller is better.
+
+Second number is the count of results returned.
+
+```
+--- pattern: '**' ---
+~~ sync ~~
+node fast-glob sync 0m0.598s 200364
+node globby sync 0m0.765s 200364
+node current globSync mjs 0m0.683s 222656
+node current glob syncStream 0m0.649s 222656
+~~ async ~~
+node fast-glob async 0m0.350s 200364
+node globby async 0m0.509s 200364
+node current glob async mjs 0m0.463s 222656
+node current glob stream 0m0.411s 222656
+
+--- pattern: '**/..' ---
+~~ sync ~~
+node fast-glob sync 0m0.486s 0
+node globby sync 0m0.769s 200364
+node current globSync mjs 0m0.564s 2242
+node current glob syncStream 0m0.583s 2242
+~~ async ~~
+node fast-glob async 0m0.283s 0
+node globby async 0m0.512s 200364
+node current glob async mjs 0m0.299s 2242
+node current glob stream 0m0.312s 2242
+
+--- pattern: './**/0/**/0/**/0/**/0/**/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.490s 10
+node globby sync 0m0.517s 10
+node current globSync mjs 0m0.540s 10
+node current glob syncStream 0m0.550s 10
+~~ async ~~
+node fast-glob async 0m0.290s 10
+node globby async 0m0.296s 10
+node current glob async mjs 0m0.278s 10
+node current glob stream 0m0.302s 10
+
+--- pattern: './**/[01]/**/[12]/**/[23]/**/[45]/**/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.500s 160
+node globby sync 0m0.528s 160
+node current globSync mjs 0m0.556s 160
+node current glob syncStream 0m0.573s 160
+~~ async ~~
+node fast-glob async 0m0.283s 160
+node globby async 0m0.301s 160
+node current glob async mjs 0m0.306s 160
+node current glob stream 0m0.322s 160
+
+--- pattern: './**/0/**/0/**/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.502s 5230
+node globby sync 0m0.527s 5230
+node current globSync mjs 0m0.544s 5230
+node current glob syncStream 0m0.557s 5230
+~~ async ~~
+node fast-glob async 0m0.285s 5230
+node globby async 0m0.305s 5230
+node current glob async mjs 0m0.304s 5230
+node current glob stream 0m0.310s 5230
+
+--- pattern: '**/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.580s 200023
+node globby sync 0m0.771s 200023
+node current globSync mjs 0m0.685s 200023
+node current glob syncStream 0m0.649s 200023
+~~ async ~~
+node fast-glob async 0m0.349s 200023
+node globby async 0m0.509s 200023
+node current glob async mjs 0m0.427s 200023
+node current glob stream 0m0.388s 200023
+
+--- pattern: '{**/*.txt,**/?/**/*.txt,**/?/**/?/**/*.txt,**/?/**/?/**/?/**/*.txt,**/?/**/?/**/?/**/?/**/*.txt}' ---
+~~ sync ~~
+node fast-glob sync 0m0.589s 200023
+node globby sync 0m0.771s 200023
+node current globSync mjs 0m0.716s 200023
+node current glob syncStream 0m0.684s 200023
+~~ async ~~
+node fast-glob async 0m0.351s 200023
+node globby async 0m0.518s 200023
+node current glob async mjs 0m0.462s 200023
+node current glob stream 0m0.468s 200023
+
+--- pattern: '**/5555/0000/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.496s 1000
+node globby sync 0m0.519s 1000
+node current globSync mjs 0m0.539s 1000
+node current glob syncStream 0m0.567s 1000
+~~ async ~~
+node fast-glob async 0m0.285s 1000
+node globby async 0m0.299s 1000
+node current glob async mjs 0m0.305s 1000
+node current glob stream 0m0.301s 1000
+
+--- pattern: './**/0/**/../[01]/**/0/../**/0/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.484s 0
+node globby sync 0m0.507s 0
+node current globSync mjs 0m0.577s 4880
+node current glob syncStream 0m0.586s 4880
+~~ async ~~
+node fast-glob async 0m0.280s 0
+node globby async 0m0.298s 0
+node current glob async mjs 0m0.327s 4880
+node current glob stream 0m0.324s 4880
+
+--- pattern: '**/????/????/????/????/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.547s 100000
+node globby sync 0m0.673s 100000
+node current globSync mjs 0m0.626s 100000
+node current glob syncStream 0m0.618s 100000
+~~ async ~~
+node fast-glob async 0m0.315s 100000
+node globby async 0m0.414s 100000
+node current glob async mjs 0m0.366s 100000
+node current glob stream 0m0.345s 100000
+
+--- pattern: './{**/?{/**/?{/**/?{/**/?,,,,},,,,},,,,},,,}/**/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.588s 100000
+node globby sync 0m0.670s 100000
+node current globSync mjs 0m0.717s 200023
+node current glob syncStream 0m0.687s 200023
+~~ async ~~
+node fast-glob async 0m0.343s 100000
+node globby async 0m0.418s 100000
+node current glob async mjs 0m0.519s 200023
+node current glob stream 0m0.451s 200023
+
+--- pattern: '**/!(0|9).txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.573s 160023
+node globby sync 0m0.731s 160023
+node current globSync mjs 0m0.680s 180023
+node current glob syncStream 0m0.659s 180023
+~~ async ~~
+node fast-glob async 0m0.345s 160023
+node globby async 0m0.476s 160023
+node current glob async mjs 0m0.427s 180023
+node current glob stream 0m0.388s 180023
+
+--- pattern: './{*/**/../{*/**/../{*/**/../{*/**/../{*/**,,,,},,,,},,,,},,,,},,,,}/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.483s 0
+node globby sync 0m0.512s 0
+node current globSync mjs 0m0.811s 200023
+node current glob syncStream 0m0.773s 200023
+~~ async ~~
+node fast-glob async 0m0.280s 0
+node globby async 0m0.299s 0
+node current glob async mjs 0m0.617s 200023
+node current glob stream 0m0.568s 200023
+
+--- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.485s 0
+node globby sync 0m0.507s 0
+node current globSync mjs 0m0.759s 200023
+node current glob syncStream 0m0.740s 200023
+~~ async ~~
+node fast-glob async 0m0.281s 0
+node globby async 0m0.297s 0
+node current glob async mjs 0m0.544s 200023
+node current glob stream 0m0.464s 200023
+
+--- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.486s 0
+node globby sync 0m0.513s 0
+node current globSync mjs 0m0.734s 200023
+node current glob syncStream 0m0.696s 200023
+~~ async ~~
+node fast-glob async 0m0.286s 0
+node globby async 0m0.296s 0
+node current glob async mjs 0m0.506s 200023
+node current glob stream 0m0.483s 200023
+
+--- pattern: './0/**/../1/**/../2/**/../3/**/../4/**/../5/**/../6/**/../7/**/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.060s 0
+node globby sync 0m0.074s 0
+node current globSync mjs 0m0.067s 0
+node current glob syncStream 0m0.066s 0
+~~ async ~~
+node fast-glob async 0m0.060s 0
+node globby async 0m0.075s 0
+node current glob async mjs 0m0.066s 0
+node current glob stream 0m0.067s 0
+
+--- pattern: './**/?/**/?/**/?/**/?/**/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.568s 100000
+node globby sync 0m0.651s 100000
+node current globSync mjs 0m0.619s 100000
+node current glob syncStream 0m0.617s 100000
+~~ async ~~
+node fast-glob async 0m0.332s 100000
+node globby async 0m0.409s 100000
+node current glob async mjs 0m0.372s 100000
+node current glob stream 0m0.351s 100000
+
+--- pattern: '**/*/**/*/**/*/**/*/**' ---
+~~ sync ~~
+node fast-glob sync 0m0.603s 200113
+node globby sync 0m0.798s 200113
+node current globSync mjs 0m0.730s 222137
+node current glob syncStream 0m0.693s 222137
+~~ async ~~
+node fast-glob async 0m0.356s 200113
+node globby async 0m0.525s 200113
+node current glob async mjs 0m0.508s 222137
+node current glob stream 0m0.455s 222137
+
+--- pattern: './**/*/**/*/**/*/**/*/**/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.622s 200000
+node globby sync 0m0.792s 200000
+node current globSync mjs 0m0.722s 200000
+node current glob syncStream 0m0.695s 200000
+~~ async ~~
+node fast-glob async 0m0.369s 200000
+node globby async 0m0.527s 200000
+node current glob async mjs 0m0.502s 200000
+node current glob stream 0m0.481s 200000
+
+--- pattern: '**/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.588s 200023
+node globby sync 0m0.771s 200023
+node current globSync mjs 0m0.684s 200023
+node current glob syncStream 0m0.658s 200023
+~~ async ~~
+node fast-glob async 0m0.352s 200023
+node globby async 0m0.516s 200023
+node current glob async mjs 0m0.432s 200023
+node current glob stream 0m0.384s 200023
+
+--- pattern: './**/**/**/**/**/**/**/**/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.589s 200023
+node globby sync 0m0.766s 200023
+node current globSync mjs 0m0.682s 200023
+node current glob syncStream 0m0.652s 200023
+~~ async ~~
+node fast-glob async 0m0.352s 200023
+node globby async 0m0.523s 200023
+node current glob async mjs 0m0.436s 200023
+node current glob stream 0m0.380s 200023
+
+--- pattern: '**/*/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.592s 200023
+node globby sync 0m0.776s 200023
+node current globSync mjs 0m0.691s 200023
+node current glob syncStream 0m0.659s 200023
+~~ async ~~
+node fast-glob async 0m0.357s 200023
+node globby async 0m0.513s 200023
+node current glob async mjs 0m0.471s 200023
+node current glob stream 0m0.424s 200023
+
+--- pattern: '**/*/**/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.585s 200023
+node globby sync 0m0.766s 200023
+node current globSync mjs 0m0.694s 200023
+node current glob syncStream 0m0.664s 200023
+~~ async ~~
+node fast-glob async 0m0.350s 200023
+node globby async 0m0.514s 200023
+node current glob async mjs 0m0.472s 200023
+node current glob stream 0m0.424s 200023
+
+--- pattern: '**/[0-9]/**/*.txt' ---
+~~ sync ~~
+node fast-glob sync 0m0.544s 100000
+node globby sync 0m0.636s 100000
+node current globSync mjs 0m0.626s 100000
+node current glob syncStream 0m0.621s 100000
+~~ async ~~
+node fast-glob async 0m0.322s 100000
+node globby async 0m0.404s 100000
+node current glob async mjs 0m0.360s 100000
+node current glob stream 0m0.352s 100000
+```
diff --git a/node_modules/glob/package.json b/node_modules/glob/package.json
new file mode 100644
index 0000000..6d4893b
--- /dev/null
+++ b/node_modules/glob/package.json
@@ -0,0 +1,99 @@
+{
+ "author": "Isaac Z. Schlueter (https://blog.izs.me/)",
+ "publishConfig": {
+ "tag": "legacy-v10"
+ },
+ "name": "glob",
+ "description": "the most correct and second fastest glob implementation in JavaScript",
+ "version": "10.4.5",
+ "type": "module",
+ "tshy": {
+ "main": true,
+ "exports": {
+ "./package.json": "./package.json",
+ ".": "./src/index.ts"
+ }
+ },
+ "bin": "./dist/esm/bin.mjs",
+ "main": "./dist/commonjs/index.js",
+ "types": "./dist/commonjs/index.d.ts",
+ "exports": {
+ "./package.json": "./package.json",
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/node-glob.git"
+ },
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "prepare": "tshy",
+ "pretest": "npm run prepare",
+ "presnap": "npm run prepare",
+ "test": "tap",
+ "snap": "tap",
+ "format": "prettier --write . --log-level warn",
+ "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts",
+ "prepublish": "npm run benchclean",
+ "profclean": "rm -f v8.log profile.txt",
+ "test-regen": "npm run profclean && TEST_REGEN=1 node --no-warnings --loader ts-node/esm test/00-setup.ts",
+ "prebench": "npm run prepare",
+ "bench": "bash benchmark.sh",
+ "preprof": "npm run prepare",
+ "prof": "bash prof.sh",
+ "benchclean": "node benchclean.cjs"
+ },
+ "prettier": {
+ "experimentalTernaries": true,
+ "semi": false,
+ "printWidth": 75,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf"
+ },
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "devDependencies": {
+ "@types/node": "^20.11.30",
+ "memfs": "^3.4.13",
+ "mkdirp": "^3.0.1",
+ "prettier": "^3.2.5",
+ "rimraf": "^5.0.7",
+ "sync-content": "^1.0.2",
+ "tap": "^19.0.0",
+ "tshy": "^1.14.0",
+ "typedoc": "^0.25.12"
+ },
+ "tap": {
+ "before": "test/00-setup.ts"
+ },
+ "license": "ISC",
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "module": "./dist/esm/index.js"
+}
diff --git a/node_modules/hasown/.eslintrc b/node_modules/hasown/.eslintrc
new file mode 100644
index 0000000..3b5d9e9
--- /dev/null
+++ b/node_modules/hasown/.eslintrc
@@ -0,0 +1,5 @@
+{
+ "root": true,
+
+ "extends": "@ljharb",
+}
diff --git a/node_modules/hasown/.github/FUNDING.yml b/node_modules/hasown/.github/FUNDING.yml
new file mode 100644
index 0000000..d68c8b7
--- /dev/null
+++ b/node_modules/hasown/.github/FUNDING.yml
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: [ljharb]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: npm/hasown
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: # Replace with a single custom sponsorship URL
diff --git a/node_modules/hasown/.nycrc b/node_modules/hasown/.nycrc
new file mode 100644
index 0000000..1826526
--- /dev/null
+++ b/node_modules/hasown/.nycrc
@@ -0,0 +1,13 @@
+{
+ "all": true,
+ "check-coverage": false,
+ "reporter": ["text-summary", "text", "html", "json"],
+ "lines": 86,
+ "statements": 85.93,
+ "functions": 82.43,
+ "branches": 76.06,
+ "exclude": [
+ "coverage",
+ "test"
+ ]
+}
diff --git a/node_modules/hasown/CHANGELOG.md b/node_modules/hasown/CHANGELOG.md
new file mode 100644
index 0000000..2b0a980
--- /dev/null
+++ b/node_modules/hasown/CHANGELOG.md
@@ -0,0 +1,40 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [v2.0.2](https://github.com/inspect-js/hasOwn/compare/v2.0.1...v2.0.2) - 2024-03-10
+
+### Commits
+
+- [types] use shared config [`68e9d4d`](https://github.com/inspect-js/hasOwn/commit/68e9d4dab6facb4f05f02c6baea94a3f2a4e44b2)
+- [actions] remove redundant finisher; use reusable workflow [`241a68e`](https://github.com/inspect-js/hasOwn/commit/241a68e13ea1fe52bec5ba7f74144befc31fae7b)
+- [Tests] increase coverage [`4125c0d`](https://github.com/inspect-js/hasOwn/commit/4125c0d6121db56ae30e38346dfb0c000b04f0a7)
+- [Tests] skip `npm ls` in old node due to TS [`01b9282`](https://github.com/inspect-js/hasOwn/commit/01b92822f9971dea031eafdd14767df41d61c202)
+- [types] improve predicate type [`d340f85`](https://github.com/inspect-js/hasOwn/commit/d340f85ce02e286ef61096cbbb6697081d40a12b)
+- [Dev Deps] update `tape` [`70089fc`](https://github.com/inspect-js/hasOwn/commit/70089fcf544e64acc024cbe60f5a9b00acad86de)
+- [Tests] use `@arethetypeswrong/cli` [`50b272c`](https://github.com/inspect-js/hasOwn/commit/50b272c829f40d053a3dd91c9796e0ac0b2af084)
+
+## [v2.0.1](https://github.com/inspect-js/hasOwn/compare/v2.0.0...v2.0.1) - 2024-02-10
+
+### Commits
+
+- [types] use a handwritten d.ts file; fix exported type [`012b989`](https://github.com/inspect-js/hasOwn/commit/012b9898ccf91dc441e2ebf594ff70270a5fda58)
+- [Dev Deps] update `@types/function-bind`, `@types/mock-property`, `@types/tape`, `aud`, `mock-property`, `npmignore`, `tape`, `typescript` [`977a56f`](https://github.com/inspect-js/hasOwn/commit/977a56f51a1f8b20566f3c471612137894644025)
+- [meta] add `sideEffects` flag [`3a60b7b`](https://github.com/inspect-js/hasOwn/commit/3a60b7bf42fccd8c605e5f145a6fcc83b13cb46f)
+
+## [v2.0.0](https://github.com/inspect-js/hasOwn/compare/v1.0.1...v2.0.0) - 2023-10-19
+
+### Commits
+
+- revamped implementation, tests, readme [`72bf8b3`](https://github.com/inspect-js/hasOwn/commit/72bf8b338e77a638f0a290c63ffaed18339c36b4)
+- [meta] revamp package.json [`079775f`](https://github.com/inspect-js/hasOwn/commit/079775fb1ec72c1c6334069593617a0be3847458)
+- Only apps should have lockfiles [`6640e23`](https://github.com/inspect-js/hasOwn/commit/6640e233d1bb8b65260880f90787637db157d215)
+
+## v1.0.1 - 2023-10-10
+
+### Commits
+
+- Initial commit [`8dbfde6`](https://github.com/inspect-js/hasOwn/commit/8dbfde6e8fb0ebb076fab38d138f2984eb340a62)
diff --git a/node_modules/hasown/LICENSE b/node_modules/hasown/LICENSE
new file mode 100644
index 0000000..0314929
--- /dev/null
+++ b/node_modules/hasown/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) Jordan Harband and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/hasown/README.md b/node_modules/hasown/README.md
new file mode 100644
index 0000000..f759b8a
--- /dev/null
+++ b/node_modules/hasown/README.md
@@ -0,0 +1,40 @@
+# hasown [![Version Badge][npm-version-svg]][package-url]
+
+[![github actions][actions-image]][actions-url]
+[![coverage][codecov-image]][codecov-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][npm-badge-png]][package-url]
+
+A robust, ES3 compatible, "has own property" predicate.
+
+## Example
+
+```js
+const assert = require('assert');
+const hasOwn = require('hasown');
+
+assert.equal(hasOwn({}, 'toString'), false);
+assert.equal(hasOwn([], 'length'), true);
+assert.equal(hasOwn({ a: 42 }, 'a'), true);
+```
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+[package-url]: https://npmjs.org/package/hasown
+[npm-version-svg]: https://versionbadg.es/inspect-js/hasown.svg
+[deps-svg]: https://david-dm.org/inspect-js/hasOwn.svg
+[deps-url]: https://david-dm.org/inspect-js/hasOwn
+[dev-deps-svg]: https://david-dm.org/inspect-js/hasOwn/dev-status.svg
+[dev-deps-url]: https://david-dm.org/inspect-js/hasOwn#info=devDependencies
+[npm-badge-png]: https://nodei.co/npm/hasown.png?downloads=true&stars=true
+[license-image]: https://img.shields.io/npm/l/hasown.svg
+[license-url]: LICENSE
+[downloads-image]: https://img.shields.io/npm/dm/hasown.svg
+[downloads-url]: https://npm-stat.com/charts.html?package=hasown
+[codecov-image]: https://codecov.io/gh/inspect-js/hasOwn/branch/main/graphs/badge.svg
+[codecov-url]: https://app.codecov.io/gh/inspect-js/hasOwn/
+[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/inspect-js/hasOwn
+[actions-url]: https://github.com/inspect-js/hasOwn/actions
diff --git a/node_modules/hasown/index.d.ts b/node_modules/hasown/index.d.ts
new file mode 100644
index 0000000..aafdf3b
--- /dev/null
+++ b/node_modules/hasown/index.d.ts
@@ -0,0 +1,3 @@
+declare function hasOwn(o: O, p: K): o is O & Record;
+
+export = hasOwn;
diff --git a/node_modules/hasown/index.js b/node_modules/hasown/index.js
new file mode 100644
index 0000000..34e6059
--- /dev/null
+++ b/node_modules/hasown/index.js
@@ -0,0 +1,8 @@
+'use strict';
+
+var call = Function.prototype.call;
+var $hasOwn = Object.prototype.hasOwnProperty;
+var bind = require('function-bind');
+
+/** @type {import('.')} */
+module.exports = bind.call(call, $hasOwn);
diff --git a/node_modules/hasown/package.json b/node_modules/hasown/package.json
new file mode 100644
index 0000000..8502e13
--- /dev/null
+++ b/node_modules/hasown/package.json
@@ -0,0 +1,92 @@
+{
+ "name": "hasown",
+ "version": "2.0.2",
+ "description": "A robust, ES3 compatible, \"has own property\" predicate.",
+ "main": "index.js",
+ "exports": {
+ ".": "./index.js",
+ "./package.json": "./package.json"
+ },
+ "types": "index.d.ts",
+ "sideEffects": false,
+ "scripts": {
+ "prepack": "npmignore --auto --commentLines=autogenerated",
+ "prepublish": "not-in-publish || npm run prepublishOnly",
+ "prepublishOnly": "safe-publish-latest",
+ "prelint": "evalmd README.md",
+ "lint": "eslint --ext=js,mjs .",
+ "postlint": "npm run tsc",
+ "pretest": "npm run lint",
+ "tsc": "tsc -p .",
+ "posttsc": "attw -P",
+ "tests-only": "nyc tape 'test/**/*.js'",
+ "test": "npm run tests-only",
+ "posttest": "aud --production",
+ "version": "auto-changelog && git add CHANGELOG.md",
+ "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/inspect-js/hasOwn.git"
+ },
+ "keywords": [
+ "has",
+ "hasOwnProperty",
+ "hasOwn",
+ "has-own",
+ "own",
+ "has",
+ "property",
+ "in",
+ "javascript",
+ "ecmascript"
+ ],
+ "author": "Jordan Harband ",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/inspect-js/hasOwn/issues"
+ },
+ "homepage": "https://github.com/inspect-js/hasOwn#readme",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "devDependencies": {
+ "@arethetypeswrong/cli": "^0.15.1",
+ "@ljharb/eslint-config": "^21.1.0",
+ "@ljharb/tsconfig": "^0.2.0",
+ "@types/function-bind": "^1.1.10",
+ "@types/mock-property": "^1.0.2",
+ "@types/tape": "^5.6.4",
+ "aud": "^2.0.4",
+ "auto-changelog": "^2.4.0",
+ "eslint": "=8.8.0",
+ "evalmd": "^0.0.19",
+ "in-publish": "^2.0.1",
+ "mock-property": "^1.0.3",
+ "npmignore": "^0.3.1",
+ "nyc": "^10.3.2",
+ "safe-publish-latest": "^2.0.0",
+ "tape": "^5.7.5",
+ "typescript": "next"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "testling": {
+ "files": "test/index.js"
+ },
+ "auto-changelog": {
+ "output": "CHANGELOG.md",
+ "template": "keepachangelog",
+ "unreleased": false,
+ "commitLimit": false,
+ "backfillLimit": false,
+ "hideCredit": true
+ },
+ "publishConfig": {
+ "ignore": [
+ ".github/workflows",
+ "test"
+ ]
+ }
+}
diff --git a/node_modules/hasown/tsconfig.json b/node_modules/hasown/tsconfig.json
new file mode 100644
index 0000000..0930c56
--- /dev/null
+++ b/node_modules/hasown/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "extends": "@ljharb/tsconfig",
+ "exclude": [
+ "coverage",
+ ],
+}
diff --git a/node_modules/is-binary-path/index.d.ts b/node_modules/is-binary-path/index.d.ts
new file mode 100644
index 0000000..19dcd43
--- /dev/null
+++ b/node_modules/is-binary-path/index.d.ts
@@ -0,0 +1,17 @@
+/**
+Check if a file path is a binary file.
+
+@example
+```
+import isBinaryPath = require('is-binary-path');
+
+isBinaryPath('source/unicorn.png');
+//=> true
+
+isBinaryPath('source/unicorn.txt');
+//=> false
+```
+*/
+declare function isBinaryPath(filePath: string): boolean;
+
+export = isBinaryPath;
diff --git a/node_modules/is-binary-path/index.js b/node_modules/is-binary-path/index.js
new file mode 100644
index 0000000..ef7548c
--- /dev/null
+++ b/node_modules/is-binary-path/index.js
@@ -0,0 +1,7 @@
+'use strict';
+const path = require('path');
+const binaryExtensions = require('binary-extensions');
+
+const extensions = new Set(binaryExtensions);
+
+module.exports = filePath => extensions.has(path.extname(filePath).slice(1).toLowerCase());
diff --git a/node_modules/is-binary-path/license b/node_modules/is-binary-path/license
new file mode 100644
index 0000000..401b1c7
--- /dev/null
+++ b/node_modules/is-binary-path/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) 2019 Sindre Sorhus (https://sindresorhus.com), Paul Miller (https://paulmillr.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/is-binary-path/package.json b/node_modules/is-binary-path/package.json
new file mode 100644
index 0000000..a8d005a
--- /dev/null
+++ b/node_modules/is-binary-path/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "is-binary-path",
+ "version": "2.1.0",
+ "description": "Check if a file path is a binary file",
+ "license": "MIT",
+ "repository": "sindresorhus/is-binary-path",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "files": [
+ "index.js",
+ "index.d.ts"
+ ],
+ "keywords": [
+ "binary",
+ "extensions",
+ "extension",
+ "file",
+ "path",
+ "check",
+ "detect",
+ "is"
+ ],
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "tsd": "^0.7.2",
+ "xo": "^0.24.0"
+ }
+}
diff --git a/node_modules/is-binary-path/readme.md b/node_modules/is-binary-path/readme.md
new file mode 100644
index 0000000..b4ab025
--- /dev/null
+++ b/node_modules/is-binary-path/readme.md
@@ -0,0 +1,34 @@
+# is-binary-path [](https://travis-ci.org/sindresorhus/is-binary-path)
+
+> Check if a file path is a binary file
+
+
+## Install
+
+```
+$ npm install is-binary-path
+```
+
+
+## Usage
+
+```js
+const isBinaryPath = require('is-binary-path');
+
+isBinaryPath('source/unicorn.png');
+//=> true
+
+isBinaryPath('source/unicorn.txt');
+//=> false
+```
+
+
+## Related
+
+- [binary-extensions](https://github.com/sindresorhus/binary-extensions) - List of binary file extensions
+- [is-text-path](https://github.com/sindresorhus/is-text-path) - Check if a filepath is a text file
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com), [Paul Miller](https://paulmillr.com)
diff --git a/node_modules/is-core-module/.eslintrc b/node_modules/is-core-module/.eslintrc
new file mode 100644
index 0000000..f2e0726
--- /dev/null
+++ b/node_modules/is-core-module/.eslintrc
@@ -0,0 +1,18 @@
+{
+ "extends": "@ljharb",
+ "root": true,
+ "rules": {
+ "func-style": 1,
+ },
+ "overrides": [
+ {
+ "files": "test/**",
+ "rules": {
+ "global-require": 0,
+ "max-depth": 0,
+ "max-lines-per-function": 0,
+ "no-negated-condition": 0,
+ },
+ },
+ ],
+}
diff --git a/node_modules/is-core-module/.nycrc b/node_modules/is-core-module/.nycrc
new file mode 100644
index 0000000..bdd626c
--- /dev/null
+++ b/node_modules/is-core-module/.nycrc
@@ -0,0 +1,9 @@
+{
+ "all": true,
+ "check-coverage": false,
+ "reporter": ["text-summary", "text", "html", "json"],
+ "exclude": [
+ "coverage",
+ "test"
+ ]
+}
diff --git a/node_modules/is-core-module/CHANGELOG.md b/node_modules/is-core-module/CHANGELOG.md
new file mode 100644
index 0000000..ae847df
--- /dev/null
+++ b/node_modules/is-core-module/CHANGELOG.md
@@ -0,0 +1,205 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [v2.15.1](https://github.com/inspect-js/is-core-module/compare/v2.15.0...v2.15.1) - 2024-08-21
+
+### Commits
+
+- [Tests] add `process.getBuiltinModule` tests [`28c7791`](https://github.com/inspect-js/is-core-module/commit/28c7791c196d58c64cfdf638b7e68ed1b62a4da0)
+- [Fix] `test/mock_loader` is no longer exposed as of v22.7 [`68b08b0`](https://github.com/inspect-js/is-core-module/commit/68b08b0d7963447dbffa5142e8810dca550383af)
+- [Tests] replace `aud` with `npm audit` [`32f8060`](https://github.com/inspect-js/is-core-module/commit/32f806026dac14f9016be4401a643851240c76b9)
+- [Dev Deps] update `mock-property` [`f7d3c8f`](https://github.com/inspect-js/is-core-module/commit/f7d3c8f01e922be49621683eb41477c4f50522e1)
+- [Dev Deps] add missing peer dep [`eaee885`](https://github.com/inspect-js/is-core-module/commit/eaee885b67238819e9c8ed5bd2098766e1d05331)
+
+## [v2.15.0](https://github.com/inspect-js/is-core-module/compare/v2.14.0...v2.15.0) - 2024-07-17
+
+### Commits
+
+- [New] add `node:sea` [`2819fb3`](https://github.com/inspect-js/is-core-module/commit/2819fb3eae312fa64643bc5430ebd06ec0f3fb88)
+
+## [v2.14.0](https://github.com/inspect-js/is-core-module/compare/v2.13.1...v2.14.0) - 2024-06-20
+
+### Commits
+
+- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `mock-property`, `npmignore`, `tape` [`0e43200`](https://github.com/inspect-js/is-core-module/commit/0e432006d97237cc082d41e6a593e87c81068364)
+- [meta] add missing `engines.node` [`4ea3af8`](https://github.com/inspect-js/is-core-module/commit/4ea3af88891a1d4f96026f0ec0ef08c67cd1bd24)
+- [New] add `test/mock_loader` [`e9fbd29`](https://github.com/inspect-js/is-core-module/commit/e9fbd2951383be070aeffb9ebbf3715237282610)
+- [Deps] update `hasown` [`57f1940`](https://github.com/inspect-js/is-core-module/commit/57f1940947b3e368abdf529232d2f17d88909358)
+
+## [v2.13.1](https://github.com/inspect-js/is-core-module/compare/v2.13.0...v2.13.1) - 2023-10-20
+
+### Commits
+
+- [Refactor] use `hasown` instead of `has` [`0e52096`](https://github.com/inspect-js/is-core-module/commit/0e520968b0a725276b67420ab4b877486b243ae0)
+- [Dev Deps] update `mock-property`, `tape` [`8736b35`](https://github.com/inspect-js/is-core-module/commit/8736b35464d0f297b55da2c6b30deee04b8303c5)
+
+## [v2.13.0](https://github.com/inspect-js/is-core-module/compare/v2.12.1...v2.13.0) - 2023-08-05
+
+### Commits
+
+- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `semver`, `tape` [`c75b263`](https://github.com/inspect-js/is-core-module/commit/c75b263d047cb53430c3970107e5eb64d6cd6c0c)
+- [New] `node:test/reporters` and `wasi`/`node:wasi` are in v18.17 [`d76cbf8`](https://github.com/inspect-js/is-core-module/commit/d76cbf8e9b208acfd98913fed5a5f45cb15fe5dc)
+
+## [v2.12.1](https://github.com/inspect-js/is-core-module/compare/v2.12.0...v2.12.1) - 2023-05-16
+
+### Commits
+
+- [Fix] `test/reporters` now requires the `node:` prefix as of v20.2 [`12183d0`](https://github.com/inspect-js/is-core-module/commit/12183d0d8e4edf56b6ce18a1b3be54bfce10175b)
+
+## [v2.12.0](https://github.com/inspect-js/is-core-module/compare/v2.11.0...v2.12.0) - 2023-04-10
+
+### Commits
+
+- [actions] update rebase action to use reusable workflow [`c0a7251`](https://github.com/inspect-js/is-core-module/commit/c0a7251f734f3c621932c5fcdfd1bf966b42ca32)
+- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape` [`9ae8b7f`](https://github.com/inspect-js/is-core-module/commit/9ae8b7fac03c369861d0991b4a2ce8d4848e6a7d)
+- [New] `test/reporters` added in v19.9, `wasi` added in v20 [`9d5341a`](https://github.com/inspect-js/is-core-module/commit/9d5341ab32053f25b7fa7db3c0e18461db24a79c)
+- [Dev Deps] add missing `in-publish` dep [`5980245`](https://github.com/inspect-js/is-core-module/commit/59802456e9ac919fa748f53be9d8fbf304a197df)
+
+## [v2.11.0](https://github.com/inspect-js/is-core-module/compare/v2.10.0...v2.11.0) - 2022-10-18
+
+### Commits
+
+- [meta] use `npmignore` to autogenerate an npmignore file [`3360011`](https://github.com/inspect-js/is-core-module/commit/33600118857b46177178072fba2affcdeb009d12)
+- [Dev Deps] update `aud`, `tape` [`651c6b0`](https://github.com/inspect-js/is-core-module/commit/651c6b0cc2799d4130866cf43ad333dcade3d26c)
+- [New] `inspector/promises` and `node:inspector/promises` is now available in node 19 [`22d332f`](https://github.com/inspect-js/is-core-module/commit/22d332fe22ac050305444e0781ff85af819abcb0)
+
+## [v2.10.0](https://github.com/inspect-js/is-core-module/compare/v2.9.0...v2.10.0) - 2022-08-03
+
+### Commits
+
+- [New] `node:test` is now available in node ^16.17 [`e8fd36e`](https://github.com/inspect-js/is-core-module/commit/e8fd36e9b86c917775a07cc473b62a3294f459f2)
+- [Tests] improve skip message [`c014a4c`](https://github.com/inspect-js/is-core-module/commit/c014a4c0cd6eb15fff573ae4709191775e70cab4)
+
+## [v2.9.0](https://github.com/inspect-js/is-core-module/compare/v2.8.1...v2.9.0) - 2022-04-19
+
+### Commits
+
+- [New] add `node:test`, in node 18+ [`f853eca`](https://github.com/inspect-js/is-core-module/commit/f853eca801d0a7d4e1dbb670f1b6d9837d9533c5)
+- [Tests] use `mock-property` [`03b3644`](https://github.com/inspect-js/is-core-module/commit/03b3644dff4417f4ba5a7d0aa0138f5f6b3e5c46)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape` [`7c0e2d0`](https://github.com/inspect-js/is-core-module/commit/7c0e2d06ed2a89acf53abe2ab34d703ed5b03455)
+- [meta] simplify "exports" [`d6ed201`](https://github.com/inspect-js/is-core-module/commit/d6ed201eba7fbba0e59814a9050fc49a6e9878c8)
+
+## [v2.8.1](https://github.com/inspect-js/is-core-module/compare/v2.8.0...v2.8.1) - 2022-01-05
+
+### Commits
+
+- [actions] reuse common workflows [`cd2cf9b`](https://github.com/inspect-js/is-core-module/commit/cd2cf9b3b66c8d328f65610efe41e9325db7716d)
+- [Fix] update node 0.4 results [`062195d`](https://github.com/inspect-js/is-core-module/commit/062195d89f0876a88b95d378b43f7fcc1205bc5b)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape` [`0790b62`](https://github.com/inspect-js/is-core-module/commit/0790b6222848c6167132f9f73acc3520fa8d1298)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` [`7d139a6`](https://github.com/inspect-js/is-core-module/commit/7d139a6d767709eabf0a0251e074ec1fb230c06e)
+- [Tests] run `nyc` in `tests-only`, not `test` [`780e8a0`](https://github.com/inspect-js/is-core-module/commit/780e8a049951c71cf78b1707f0871c48a28bde14)
+
+## [v2.8.0](https://github.com/inspect-js/is-core-module/compare/v2.7.0...v2.8.0) - 2021-10-14
+
+### Commits
+
+- [actions] update codecov uploader [`0cfe94e`](https://github.com/inspect-js/is-core-module/commit/0cfe94e106a7d005ea03e008c0a21dec13a77904)
+- [New] add `readline/promises` to node v17+ [`4f78c30`](https://github.com/inspect-js/is-core-module/commit/4f78c3008b1b58b4db6dc91d99610b1bc859da7e)
+- [Tests] node ^14.18 supports `node:` prefixes for CJS [`43e2f17`](https://github.com/inspect-js/is-core-module/commit/43e2f177452cea2f0eaf34f61b5407217bbdb6f4)
+
+## [v2.7.0](https://github.com/inspect-js/is-core-module/compare/v2.6.0...v2.7.0) - 2021-09-27
+
+### Commits
+
+- [New] node `v14.18` added `node:`-prefixed core modules to `require` [`6d943ab`](https://github.com/inspect-js/is-core-module/commit/6d943abe81382b9bbe344384d80fbfebe1cc0526)
+- [Tests] add coverage for Object.prototype pollution [`c6baf5f`](https://github.com/inspect-js/is-core-module/commit/c6baf5f942311a1945c1af41167bb80b84df2af7)
+- [Dev Deps] update `@ljharb/eslint-config` [`6717f00`](https://github.com/inspect-js/is-core-module/commit/6717f000d063ea57beb772bded36c2f056ac404c)
+- [eslint] fix linter warning [`594c10b`](https://github.com/inspect-js/is-core-module/commit/594c10bb7d39d7eb00925c90924199ff596184b2)
+- [meta] add `sideEffects` flag [`c32cfa5`](https://github.com/inspect-js/is-core-module/commit/c32cfa5195632944c4dd4284a142b8476e75be13)
+
+## [v2.6.0](https://github.com/inspect-js/is-core-module/compare/v2.5.0...v2.6.0) - 2021-08-17
+
+### Commits
+
+- [Dev Deps] update `eslint`, `tape` [`6cc928f`](https://github.com/inspect-js/is-core-module/commit/6cc928f8a4bba66aeeccc4f6beeac736d4bd3081)
+- [New] add `stream/consumers` to node `>= 16.7` [`a1a423e`](https://github.com/inspect-js/is-core-module/commit/a1a423e467e4cc27df180234fad5bab45943e67d)
+- [Refactor] Remove duplicated `&&` operand [`86faea7`](https://github.com/inspect-js/is-core-module/commit/86faea738213a2433c62d1098488dc9314dca832)
+- [Tests] include prereleases [`a4da7a6`](https://github.com/inspect-js/is-core-module/commit/a4da7a6abf7568e2aa4fd98e69452179f1850963)
+
+## [v2.5.0](https://github.com/inspect-js/is-core-module/compare/v2.4.0...v2.5.0) - 2021-07-12
+
+### Commits
+
+- [Dev Deps] update `auto-changelog`, `eslint` [`6334cc9`](https://github.com/inspect-js/is-core-module/commit/6334cc94f3af7469685bd8f236740991baaf2705)
+- [New] add `stream/web` to node v16.5+ [`17ac59b`](https://github.com/inspect-js/is-core-module/commit/17ac59b662d63e220a2e5728625f005c24f177b2)
+
+## [v2.4.0](https://github.com/inspect-js/is-core-module/compare/v2.3.0...v2.4.0) - 2021-05-09
+
+### Commits
+
+- [readme] add actions and codecov badges [`82b7faa`](https://github.com/inspect-js/is-core-module/commit/82b7faa12b56dbe47fbea67e1a5b9e447027ba40)
+- [Dev Deps] update `@ljharb/eslint-config`, `aud` [`8096868`](https://github.com/inspect-js/is-core-module/commit/8096868c024a161ccd4d44110b136763e92eace8)
+- [Dev Deps] update `eslint` [`6726824`](https://github.com/inspect-js/is-core-module/commit/67268249b88230018c510f6532a8046d7326346f)
+- [New] add `diagnostics_channel` to node `^14.17` [`86c6563`](https://github.com/inspect-js/is-core-module/commit/86c65634201b8ff9b3e48a9a782594579c7f5c3c)
+- [meta] fix prepublish script [`697a01e`](https://github.com/inspect-js/is-core-module/commit/697a01e3c9c0be074066520954f30fb28532ec57)
+
+## [v2.3.0](https://github.com/inspect-js/is-core-module/compare/v2.2.0...v2.3.0) - 2021-04-24
+
+### Commits
+
+- [meta] do not publish github action workflow files [`060d4bb`](https://github.com/inspect-js/is-core-module/commit/060d4bb971a29451c19ff336eb56bee27f9fa95a)
+- [New] add support for `node:` prefix, in node 16+ [`7341223`](https://github.com/inspect-js/is-core-module/commit/73412230a769f6e81c05eea50b6520cebf54ed2f)
+- [actions] use `node/install` instead of `node/run`; use `codecov` action [`016269a`](https://github.com/inspect-js/is-core-module/commit/016269abae9f6657a5254adfbb813f09a05067f9)
+- [patch] remove unneeded `.0` in version ranges [`cb466a6`](https://github.com/inspect-js/is-core-module/commit/cb466a6d89e52b8389e5c12715efcd550c41cea3)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape` [`c9f9c39`](https://github.com/inspect-js/is-core-module/commit/c9f9c396ace60ef81906f98059c064e6452473ed)
+- [actions] update workflows [`3ee4a89`](https://github.com/inspect-js/is-core-module/commit/3ee4a89fd5a02fccd43882d905448ea6a98e9a3c)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config` [`dee4fed`](https://github.com/inspect-js/is-core-module/commit/dee4fed79690c1d43a22f7fa9426abebdc6d727f)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config` [`7d046ba`](https://github.com/inspect-js/is-core-module/commit/7d046ba07ae8c9292e43652694ca808d7b309de8)
+- [meta] use `prepublishOnly` script for npm 7+ [`149e677`](https://github.com/inspect-js/is-core-module/commit/149e6771a5ede6d097e71785b467a9c4b4977cc7)
+- [readme] remove travis badge [`903b51d`](https://github.com/inspect-js/is-core-module/commit/903b51d6b69b98abeabfbc3695c345b02646f19c)
+
+## [v2.2.0](https://github.com/inspect-js/is-core-module/compare/v2.1.0...v2.2.0) - 2020-11-26
+
+### Commits
+
+- [Tests] migrate tests to Github Actions [`c919f57`](https://github.com/inspect-js/is-core-module/commit/c919f573c0a92d10a0acad0b650b5aecb033d426)
+- [patch] `core.json`: %s/ /\t/g [`db3f685`](https://github.com/inspect-js/is-core-module/commit/db3f68581f53e73cc09cd675955eb1bdd6a5a39b)
+- [Tests] run `nyc` on all tests [`b2f925f`](https://github.com/inspect-js/is-core-module/commit/b2f925f8866f210ef441f39fcc8cc42692ab89b1)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`; add `safe-publish-latest` [`89f02a2`](https://github.com/inspect-js/is-core-module/commit/89f02a2b4162246dea303a6ee31bb9a550b05c72)
+- [New] add `path/posix`, `path/win32`, `util/types` [`77f94f1`](https://github.com/inspect-js/is-core-module/commit/77f94f1e90ffd7c0be2a3f1aa8574ebf7fd981b3)
+
+## [v2.1.0](https://github.com/inspect-js/is-core-module/compare/v2.0.0...v2.1.0) - 2020-11-04
+
+### Commits
+
+- [Dev Deps] update `eslint` [`5e0034e`](https://github.com/inspect-js/is-core-module/commit/5e0034eae57c09c8f1bd769f502486a00f56c6e4)
+- [New] Add `diagnostics_channel` [`c2d83d0`](https://github.com/inspect-js/is-core-module/commit/c2d83d0a0225a1a658945d9bab7036ea347d29ec)
+
+## [v2.0.0](https://github.com/inspect-js/is-core-module/compare/v1.0.2...v2.0.0) - 2020-09-29
+
+### Commits
+
+- v2 implementation [`865aeb5`](https://github.com/inspect-js/is-core-module/commit/865aeb5ca0e90248a3dfff5d7622e4751fdeb9cd)
+- Only apps should have lockfiles [`5a5e660`](https://github.com/inspect-js/is-core-module/commit/5a5e660d568e37eb44e17fb1ebb12a105205fc2b)
+- Initial commit for v2 [`5a51524`](https://github.com/inspect-js/is-core-module/commit/5a51524e06f92adece5fbb138c69b7b9748a2348)
+- Tests [`116eae4`](https://github.com/inspect-js/is-core-module/commit/116eae4fccd01bc72c1fd3cc4b7561c387afc496)
+- [meta] add `auto-changelog` [`c24388b`](https://github.com/inspect-js/is-core-module/commit/c24388bee828d223040519d1f5b226ca35beee63)
+- [actions] add "Automatic Rebase" and "require allow edits" actions [`34292db`](https://github.com/inspect-js/is-core-module/commit/34292dbcbadae0868aff03c22dbd8b7b8a11558a)
+- [Tests] add `npm run lint` [`4f9eeee`](https://github.com/inspect-js/is-core-module/commit/4f9eeee7ddff10698bbf528620f4dc8d4fa3e697)
+- [readme] fix travis badges, https all URLs [`e516a73`](https://github.com/inspect-js/is-core-module/commit/e516a73b0dccce20938c432b1ba512eae8eff9e9)
+- [meta] create FUNDING.yml [`1aabebc`](https://github.com/inspect-js/is-core-module/commit/1aabebca98d01f8a04e46bc2e2520fa93cf21ac6)
+- [Fix] `domain`: domain landed sometime > v0.7.7 and <= v0.7.12 [`2df7d37`](https://github.com/inspect-js/is-core-module/commit/2df7d37595d41b15eeada732b706b926c2771655)
+- [Fix] `sys`: worked in 0.6, not 0.7, and 0.8+ [`a75c134`](https://github.com/inspect-js/is-core-module/commit/a75c134229e1e9441801f6b73f6a52489346eb65)
+
+## [v1.0.2](https://github.com/inspect-js/is-core-module/compare/v1.0.1...v1.0.2) - 2014-09-28
+
+### Commits
+
+- simpler [`66fe90f`](https://github.com/inspect-js/is-core-module/commit/66fe90f9771581b9adc0c3900baa52c21b5baea2)
+
+## [v1.0.1](https://github.com/inspect-js/is-core-module/compare/v1.0.0...v1.0.1) - 2014-09-28
+
+### Commits
+
+- remove stupid [`f21f906`](https://github.com/inspect-js/is-core-module/commit/f21f906f882c2bd656a5fc5ed6fbe48ddaffb2ac)
+- update readme [`1eff0ec`](https://github.com/inspect-js/is-core-module/commit/1eff0ec69798d1ec65771552d1562911e90a8027)
+
+## v1.0.0 - 2014-09-28
+
+### Commits
+
+- init [`48e5e76`](https://github.com/inspect-js/is-core-module/commit/48e5e76cac378fddb8c1f7d4055b8dfc943d6b96)
diff --git a/node_modules/is-core-module/LICENSE b/node_modules/is-core-module/LICENSE
new file mode 100644
index 0000000..2e50287
--- /dev/null
+++ b/node_modules/is-core-module/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Dave Justice
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/is-core-module/README.md b/node_modules/is-core-module/README.md
new file mode 100644
index 0000000..062d906
--- /dev/null
+++ b/node_modules/is-core-module/README.md
@@ -0,0 +1,40 @@
+# is-core-module [![Version Badge][2]][1]
+
+[![github actions][actions-image]][actions-url]
+[![coverage][codecov-image]][codecov-url]
+[![dependency status][5]][6]
+[![dev dependency status][7]][8]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][11]][1]
+
+Is this specifier a node.js core module? Optionally provide a node version to check; defaults to the current node version.
+
+## Example
+
+```js
+var isCore = require('is-core-module');
+var assert = require('assert');
+assert(isCore('fs'));
+assert(!isCore('butts'));
+```
+
+## Tests
+Clone the repo, `npm install`, and run `npm test`
+
+[1]: https://npmjs.org/package/is-core-module
+[2]: https://versionbadg.es/inspect-js/is-core-module.svg
+[5]: https://david-dm.org/inspect-js/is-core-module.svg
+[6]: https://david-dm.org/inspect-js/is-core-module
+[7]: https://david-dm.org/inspect-js/is-core-module/dev-status.svg
+[8]: https://david-dm.org/inspect-js/is-core-module#info=devDependencies
+[11]: https://nodei.co/npm/is-core-module.png?downloads=true&stars=true
+[license-image]: https://img.shields.io/npm/l/is-core-module.svg
+[license-url]: LICENSE
+[downloads-image]: https://img.shields.io/npm/dm/is-core-module.svg
+[downloads-url]: https://npm-stat.com/charts.html?package=is-core-module
+[codecov-image]: https://codecov.io/gh/inspect-js/is-core-module/branch/main/graphs/badge.svg
+[codecov-url]: https://app.codecov.io/gh/inspect-js/is-core-module/
+[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/inspect-js/is-core-module
+[actions-url]: https://github.com/inspect-js/is-core-module/actions
diff --git a/node_modules/is-core-module/core.json b/node_modules/is-core-module/core.json
new file mode 100644
index 0000000..91890be
--- /dev/null
+++ b/node_modules/is-core-module/core.json
@@ -0,0 +1,161 @@
+{
+ "assert": true,
+ "node:assert": [">= 14.18 && < 15", ">= 16"],
+ "assert/strict": ">= 15",
+ "node:assert/strict": ">= 16",
+ "async_hooks": ">= 8",
+ "node:async_hooks": [">= 14.18 && < 15", ">= 16"],
+ "buffer_ieee754": ">= 0.5 && < 0.9.7",
+ "buffer": true,
+ "node:buffer": [">= 14.18 && < 15", ">= 16"],
+ "child_process": true,
+ "node:child_process": [">= 14.18 && < 15", ">= 16"],
+ "cluster": ">= 0.5",
+ "node:cluster": [">= 14.18 && < 15", ">= 16"],
+ "console": true,
+ "node:console": [">= 14.18 && < 15", ">= 16"],
+ "constants": true,
+ "node:constants": [">= 14.18 && < 15", ">= 16"],
+ "crypto": true,
+ "node:crypto": [">= 14.18 && < 15", ">= 16"],
+ "_debug_agent": ">= 1 && < 8",
+ "_debugger": "< 8",
+ "dgram": true,
+ "node:dgram": [">= 14.18 && < 15", ">= 16"],
+ "diagnostics_channel": [">= 14.17 && < 15", ">= 15.1"],
+ "node:diagnostics_channel": [">= 14.18 && < 15", ">= 16"],
+ "dns": true,
+ "node:dns": [">= 14.18 && < 15", ">= 16"],
+ "dns/promises": ">= 15",
+ "node:dns/promises": ">= 16",
+ "domain": ">= 0.7.12",
+ "node:domain": [">= 14.18 && < 15", ">= 16"],
+ "events": true,
+ "node:events": [">= 14.18 && < 15", ">= 16"],
+ "freelist": "< 6",
+ "fs": true,
+ "node:fs": [">= 14.18 && < 15", ">= 16"],
+ "fs/promises": [">= 10 && < 10.1", ">= 14"],
+ "node:fs/promises": [">= 14.18 && < 15", ">= 16"],
+ "_http_agent": ">= 0.11.1",
+ "node:_http_agent": [">= 14.18 && < 15", ">= 16"],
+ "_http_client": ">= 0.11.1",
+ "node:_http_client": [">= 14.18 && < 15", ">= 16"],
+ "_http_common": ">= 0.11.1",
+ "node:_http_common": [">= 14.18 && < 15", ">= 16"],
+ "_http_incoming": ">= 0.11.1",
+ "node:_http_incoming": [">= 14.18 && < 15", ">= 16"],
+ "_http_outgoing": ">= 0.11.1",
+ "node:_http_outgoing": [">= 14.18 && < 15", ">= 16"],
+ "_http_server": ">= 0.11.1",
+ "node:_http_server": [">= 14.18 && < 15", ">= 16"],
+ "http": true,
+ "node:http": [">= 14.18 && < 15", ">= 16"],
+ "http2": ">= 8.8",
+ "node:http2": [">= 14.18 && < 15", ">= 16"],
+ "https": true,
+ "node:https": [">= 14.18 && < 15", ">= 16"],
+ "inspector": ">= 8",
+ "node:inspector": [">= 14.18 && < 15", ">= 16"],
+ "inspector/promises": [">= 19"],
+ "node:inspector/promises": [">= 19"],
+ "_linklist": "< 8",
+ "module": true,
+ "node:module": [">= 14.18 && < 15", ">= 16"],
+ "net": true,
+ "node:net": [">= 14.18 && < 15", ">= 16"],
+ "node-inspect/lib/_inspect": ">= 7.6 && < 12",
+ "node-inspect/lib/internal/inspect_client": ">= 7.6 && < 12",
+ "node-inspect/lib/internal/inspect_repl": ">= 7.6 && < 12",
+ "os": true,
+ "node:os": [">= 14.18 && < 15", ">= 16"],
+ "path": true,
+ "node:path": [">= 14.18 && < 15", ">= 16"],
+ "path/posix": ">= 15.3",
+ "node:path/posix": ">= 16",
+ "path/win32": ">= 15.3",
+ "node:path/win32": ">= 16",
+ "perf_hooks": ">= 8.5",
+ "node:perf_hooks": [">= 14.18 && < 15", ">= 16"],
+ "process": ">= 1",
+ "node:process": [">= 14.18 && < 15", ">= 16"],
+ "punycode": ">= 0.5",
+ "node:punycode": [">= 14.18 && < 15", ">= 16"],
+ "querystring": true,
+ "node:querystring": [">= 14.18 && < 15", ">= 16"],
+ "readline": true,
+ "node:readline": [">= 14.18 && < 15", ">= 16"],
+ "readline/promises": ">= 17",
+ "node:readline/promises": ">= 17",
+ "repl": true,
+ "node:repl": [">= 14.18 && < 15", ">= 16"],
+ "node:sea": [">= 20.12 && < 21", ">= 21.7"],
+ "smalloc": ">= 0.11.5 && < 3",
+ "_stream_duplex": ">= 0.9.4",
+ "node:_stream_duplex": [">= 14.18 && < 15", ">= 16"],
+ "_stream_transform": ">= 0.9.4",
+ "node:_stream_transform": [">= 14.18 && < 15", ">= 16"],
+ "_stream_wrap": ">= 1.4.1",
+ "node:_stream_wrap": [">= 14.18 && < 15", ">= 16"],
+ "_stream_passthrough": ">= 0.9.4",
+ "node:_stream_passthrough": [">= 14.18 && < 15", ">= 16"],
+ "_stream_readable": ">= 0.9.4",
+ "node:_stream_readable": [">= 14.18 && < 15", ">= 16"],
+ "_stream_writable": ">= 0.9.4",
+ "node:_stream_writable": [">= 14.18 && < 15", ">= 16"],
+ "stream": true,
+ "node:stream": [">= 14.18 && < 15", ">= 16"],
+ "stream/consumers": ">= 16.7",
+ "node:stream/consumers": ">= 16.7",
+ "stream/promises": ">= 15",
+ "node:stream/promises": ">= 16",
+ "stream/web": ">= 16.5",
+ "node:stream/web": ">= 16.5",
+ "string_decoder": true,
+ "node:string_decoder": [">= 14.18 && < 15", ">= 16"],
+ "sys": [">= 0.4 && < 0.7", ">= 0.8"],
+ "node:sys": [">= 14.18 && < 15", ">= 16"],
+ "test/reporters": ">= 19.9 && < 20.2",
+ "node:test/reporters": [">= 18.17 && < 19", ">= 19.9", ">= 20"],
+ "test/mock_loader": ">= 22.3 && < 22.7",
+ "node:test/mock_loader": ">= 22.3 && < 22.7",
+ "node:test": [">= 16.17 && < 17", ">= 18"],
+ "timers": true,
+ "node:timers": [">= 14.18 && < 15", ">= 16"],
+ "timers/promises": ">= 15",
+ "node:timers/promises": ">= 16",
+ "_tls_common": ">= 0.11.13",
+ "node:_tls_common": [">= 14.18 && < 15", ">= 16"],
+ "_tls_legacy": ">= 0.11.3 && < 10",
+ "_tls_wrap": ">= 0.11.3",
+ "node:_tls_wrap": [">= 14.18 && < 15", ">= 16"],
+ "tls": true,
+ "node:tls": [">= 14.18 && < 15", ">= 16"],
+ "trace_events": ">= 10",
+ "node:trace_events": [">= 14.18 && < 15", ">= 16"],
+ "tty": true,
+ "node:tty": [">= 14.18 && < 15", ">= 16"],
+ "url": true,
+ "node:url": [">= 14.18 && < 15", ">= 16"],
+ "util": true,
+ "node:util": [">= 14.18 && < 15", ">= 16"],
+ "util/types": ">= 15.3",
+ "node:util/types": ">= 16",
+ "v8/tools/arguments": ">= 10 && < 12",
+ "v8/tools/codemap": [">= 4.4 && < 5", ">= 5.2 && < 12"],
+ "v8/tools/consarray": [">= 4.4 && < 5", ">= 5.2 && < 12"],
+ "v8/tools/csvparser": [">= 4.4 && < 5", ">= 5.2 && < 12"],
+ "v8/tools/logreader": [">= 4.4 && < 5", ">= 5.2 && < 12"],
+ "v8/tools/profile_view": [">= 4.4 && < 5", ">= 5.2 && < 12"],
+ "v8/tools/splaytree": [">= 4.4 && < 5", ">= 5.2 && < 12"],
+ "v8": ">= 1",
+ "node:v8": [">= 14.18 && < 15", ">= 16"],
+ "vm": true,
+ "node:vm": [">= 14.18 && < 15", ">= 16"],
+ "wasi": [">= 13.4 && < 13.5", ">= 18.17 && < 19", ">= 20"],
+ "node:wasi": [">= 18.17 && < 19", ">= 20"],
+ "worker_threads": ">= 11.7",
+ "node:worker_threads": [">= 14.18 && < 15", ">= 16"],
+ "zlib": ">= 0.5",
+ "node:zlib": [">= 14.18 && < 15", ">= 16"]
+}
diff --git a/node_modules/is-core-module/index.js b/node_modules/is-core-module/index.js
new file mode 100644
index 0000000..423e20c
--- /dev/null
+++ b/node_modules/is-core-module/index.js
@@ -0,0 +1,69 @@
+'use strict';
+
+var hasOwn = require('hasown');
+
+function specifierIncluded(current, specifier) {
+ var nodeParts = current.split('.');
+ var parts = specifier.split(' ');
+ var op = parts.length > 1 ? parts[0] : '=';
+ var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.');
+
+ for (var i = 0; i < 3; ++i) {
+ var cur = parseInt(nodeParts[i] || 0, 10);
+ var ver = parseInt(versionParts[i] || 0, 10);
+ if (cur === ver) {
+ continue; // eslint-disable-line no-restricted-syntax, no-continue
+ }
+ if (op === '<') {
+ return cur < ver;
+ }
+ if (op === '>=') {
+ return cur >= ver;
+ }
+ return false;
+ }
+ return op === '>=';
+}
+
+function matchesRange(current, range) {
+ var specifiers = range.split(/ ?&& ?/);
+ if (specifiers.length === 0) {
+ return false;
+ }
+ for (var i = 0; i < specifiers.length; ++i) {
+ if (!specifierIncluded(current, specifiers[i])) {
+ return false;
+ }
+ }
+ return true;
+}
+
+function versionIncluded(nodeVersion, specifierValue) {
+ if (typeof specifierValue === 'boolean') {
+ return specifierValue;
+ }
+
+ var current = typeof nodeVersion === 'undefined'
+ ? process.versions && process.versions.node
+ : nodeVersion;
+
+ if (typeof current !== 'string') {
+ throw new TypeError(typeof nodeVersion === 'undefined' ? 'Unable to determine current node version' : 'If provided, a valid node version is required');
+ }
+
+ if (specifierValue && typeof specifierValue === 'object') {
+ for (var i = 0; i < specifierValue.length; ++i) {
+ if (matchesRange(current, specifierValue[i])) {
+ return true;
+ }
+ }
+ return false;
+ }
+ return matchesRange(current, specifierValue);
+}
+
+var data = require('./core.json');
+
+module.exports = function isCore(x, nodeVersion) {
+ return hasOwn(data, x) && versionIncluded(nodeVersion, data[x]);
+};
diff --git a/node_modules/is-core-module/package.json b/node_modules/is-core-module/package.json
new file mode 100644
index 0000000..3aba4a0
--- /dev/null
+++ b/node_modules/is-core-module/package.json
@@ -0,0 +1,76 @@
+{
+ "name": "is-core-module",
+ "version": "2.15.1",
+ "description": "Is this specifier a node.js core module?",
+ "main": "index.js",
+ "sideEffects": false,
+ "exports": {
+ ".": "./index.js",
+ "./package.json": "./package.json"
+ },
+ "scripts": {
+ "prepack": "npmignore --auto --commentLines=autogenerated",
+ "prepublish": "not-in-publish || npm run prepublishOnly",
+ "prepublishOnly": "safe-publish-latest",
+ "lint": "eslint .",
+ "pretest": "npm run lint",
+ "tests-only": "nyc tape 'test/**/*.js'",
+ "test": "npm run tests-only",
+ "posttest": "npx npm@'>=10.2' audit --production",
+ "version": "auto-changelog && git add CHANGELOG.md",
+ "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/inspect-js/is-core-module.git"
+ },
+ "keywords": [
+ "core",
+ "modules",
+ "module",
+ "npm",
+ "node",
+ "dependencies"
+ ],
+ "author": "Jordan Harband ",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/inspect-js/is-core-module/issues"
+ },
+ "homepage": "https://github.com/inspect-js/is-core-module",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "devDependencies": {
+ "@ljharb/eslint-config": "^21.1.1",
+ "auto-changelog": "^2.4.0",
+ "encoding": "^0.1.13",
+ "eslint": "=8.8.0",
+ "in-publish": "^2.0.1",
+ "mock-property": "^1.1.0",
+ "npmignore": "^0.3.1",
+ "nyc": "^10.3.2",
+ "safe-publish-latest": "^2.0.0",
+ "semver": "^6.3.1",
+ "tape": "^5.8.1"
+ },
+ "auto-changelog": {
+ "output": "CHANGELOG.md",
+ "template": "keepachangelog",
+ "unreleased": false,
+ "commitLimit": false,
+ "backfillLimit": false,
+ "hideCredit": true
+ },
+ "publishConfig": {
+ "ignore": [
+ ".github"
+ ]
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+}
diff --git a/node_modules/is-core-module/test/index.js b/node_modules/is-core-module/test/index.js
new file mode 100644
index 0000000..746e72a
--- /dev/null
+++ b/node_modules/is-core-module/test/index.js
@@ -0,0 +1,154 @@
+'use strict';
+
+var test = require('tape');
+var keys = require('object-keys');
+var semver = require('semver');
+var mockProperty = require('mock-property');
+
+var isCore = require('../');
+var data = require('../core.json');
+
+var supportsNodePrefix = semver.satisfies(process.versions.node, '^14.18 || >= 16', { includePrerelease: true });
+
+test('core modules', function (t) {
+ t.test('isCore()', function (st) {
+ st.ok(isCore('fs'));
+ st.ok(isCore('net'));
+ st.ok(isCore('http'));
+
+ st.ok(!isCore('seq'));
+ st.ok(!isCore('../'));
+
+ st.ok(!isCore('toString'));
+
+ st.end();
+ });
+
+ t.test('core list', function (st) {
+ var cores = keys(data);
+ st.plan(cores.length);
+
+ for (var i = 0; i < cores.length; ++i) {
+ var mod = cores[i];
+ var requireFunc = function () { require(mod); }; // eslint-disable-line no-loop-func
+ if (isCore(mod)) {
+ st.doesNotThrow(requireFunc, mod + ' supported; requiring does not throw');
+ } else {
+ st['throws'](requireFunc, mod + ' not supported; requiring throws');
+ }
+ }
+
+ st.end();
+ });
+
+ t.test('core via repl module', { skip: !data.repl }, function (st) {
+ var libs = require('repl')._builtinLibs; // eslint-disable-line no-underscore-dangle
+ if (!libs) {
+ st.skip('repl._builtinLibs does not exist');
+ } else {
+ for (var i = 0; i < libs.length; ++i) {
+ var mod = libs[i];
+ st.ok(data[mod], mod + ' is a core module');
+ st.doesNotThrow(
+ function () { require(mod); }, // eslint-disable-line no-loop-func
+ 'requiring ' + mod + ' does not throw'
+ );
+ if (mod.slice(0, 5) !== 'node:') {
+ if (supportsNodePrefix) {
+ st.doesNotThrow(
+ function () { require('node:' + mod); }, // eslint-disable-line no-loop-func
+ 'requiring node:' + mod + ' does not throw'
+ );
+ } else {
+ st['throws'](
+ function () { require('node:' + mod); }, // eslint-disable-line no-loop-func
+ 'requiring node:' + mod + ' throws'
+ );
+ }
+ }
+ }
+ }
+ st.end();
+ });
+
+ t.test('core via builtinModules list', { skip: !data.module }, function (st) {
+ var Module = require('module');
+ var libs = Module.builtinModules;
+ if (!libs) {
+ st.skip('module.builtinModules does not exist');
+ } else {
+ var excludeList = [
+ '_debug_agent',
+ 'v8/tools/tickprocessor-driver',
+ 'v8/tools/SourceMap',
+ 'v8/tools/tickprocessor',
+ 'v8/tools/profile'
+ ];
+
+ // see https://github.com/nodejs/node/issues/42785
+ if (semver.satisfies(process.version, '>= 18')) {
+ libs = libs.concat('node:test');
+ }
+ if (semver.satisfies(process.version, '^20.12 || >= 21.7')) {
+ libs = libs.concat('node:sea');
+ }
+
+ for (var i = 0; i < libs.length; ++i) {
+ var mod = libs[i];
+ if (excludeList.indexOf(mod) === -1) {
+ st.ok(data[mod], mod + ' is a core module');
+
+ if (Module.isBuiltin) {
+ st.ok(Module.isBuiltin(mod), 'module.isBuiltin(' + mod + ') is true');
+ }
+
+ st.doesNotThrow(
+ function () { require(mod); }, // eslint-disable-line no-loop-func
+ 'requiring ' + mod + ' does not throw'
+ );
+
+ if (process.getBuiltinModule) {
+ st.equal(
+ process.getBuiltinModule(mod),
+ require(mod),
+ 'process.getBuiltinModule(' + mod + ') === require(' + mod + ')'
+ );
+ }
+
+ if (mod.slice(0, 5) !== 'node:') {
+ if (supportsNodePrefix) {
+ st.doesNotThrow(
+ function () { require('node:' + mod); }, // eslint-disable-line no-loop-func
+ 'requiring node:' + mod + ' does not throw'
+ );
+ } else {
+ st['throws'](
+ function () { require('node:' + mod); }, // eslint-disable-line no-loop-func
+ 'requiring node:' + mod + ' throws'
+ );
+ }
+ }
+ }
+ }
+ }
+
+ st.end();
+ });
+
+ t.test('Object.prototype pollution', function (st) {
+ var nonKey = 'not a core module';
+ st.teardown(mockProperty(Object.prototype, 'fs', { value: false }));
+ st.teardown(mockProperty(Object.prototype, 'path', { value: '>= 999999999' }));
+ st.teardown(mockProperty(Object.prototype, 'http', { value: data.http }));
+ st.teardown(mockProperty(Object.prototype, nonKey, { value: true }));
+
+ st.equal(isCore('fs'), true, 'fs is a core module even if Object.prototype lies');
+ st.equal(isCore('path'), true, 'path is a core module even if Object.prototype lies');
+ st.equal(isCore('http'), true, 'path is a core module even if Object.prototype matches data');
+ st.equal(isCore(nonKey), false, '"' + nonKey + '" is not a core module even if Object.prototype lies');
+
+ st.end();
+ });
+
+ t.end();
+});
diff --git a/node_modules/is-extglob/LICENSE b/node_modules/is-extglob/LICENSE
new file mode 100644
index 0000000..842218c
--- /dev/null
+++ b/node_modules/is-extglob/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2016, Jon Schlinkert
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/is-extglob/README.md b/node_modules/is-extglob/README.md
new file mode 100644
index 0000000..0416af5
--- /dev/null
+++ b/node_modules/is-extglob/README.md
@@ -0,0 +1,107 @@
+# is-extglob [](https://www.npmjs.com/package/is-extglob) [](https://npmjs.org/package/is-extglob) [](https://travis-ci.org/jonschlinkert/is-extglob)
+
+> Returns true if a string has an extglob.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/):
+
+```sh
+$ npm install --save is-extglob
+```
+
+## Usage
+
+```js
+var isExtglob = require('is-extglob');
+```
+
+**True**
+
+```js
+isExtglob('?(abc)');
+isExtglob('@(abc)');
+isExtglob('!(abc)');
+isExtglob('*(abc)');
+isExtglob('+(abc)');
+```
+
+**False**
+
+Escaped extglobs:
+
+```js
+isExtglob('\\?(abc)');
+isExtglob('\\@(abc)');
+isExtglob('\\!(abc)');
+isExtglob('\\*(abc)');
+isExtglob('\\+(abc)');
+```
+
+Everything else...
+
+```js
+isExtglob('foo.js');
+isExtglob('!foo.js');
+isExtglob('*.js');
+isExtglob('**/abc.js');
+isExtglob('abc/*.js');
+isExtglob('abc/(aaa|bbb).js');
+isExtglob('abc/[a-z].js');
+isExtglob('abc/{a,b}.js');
+isExtglob('abc/?.js');
+isExtglob('abc.js');
+isExtglob('abc/def/ghi.js');
+```
+
+## History
+
+**v2.0**
+
+Adds support for escaping. Escaped exglobs no longer return true.
+
+## About
+
+### Related projects
+
+* [has-glob](https://www.npmjs.com/package/has-glob): Returns `true` if an array has a glob pattern. | [homepage](https://github.com/jonschlinkert/has-glob "Returns `true` if an array has a glob pattern.")
+* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet")
+* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/jonschlinkert/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.")
+
+### Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
+
+### Building docs
+
+_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_
+
+To generate the readme and API documentation with [verb](https://github.com/verbose/verb):
+
+```sh
+$ npm install -g verb verb-generate-readme && verb
+```
+
+### Running tests
+
+Install dev dependencies:
+
+```sh
+$ npm install -d && npm test
+```
+
+### Author
+
+**Jon Schlinkert**
+
+* [github/jonschlinkert](https://github.com/jonschlinkert)
+* [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
+
+### License
+
+Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert).
+Released under the [MIT license](https://github.com/jonschlinkert/is-extglob/blob/master/LICENSE).
+
+***
+
+_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.1.31, on October 12, 2016._
\ No newline at end of file
diff --git a/node_modules/is-extglob/index.js b/node_modules/is-extglob/index.js
new file mode 100644
index 0000000..c1d986f
--- /dev/null
+++ b/node_modules/is-extglob/index.js
@@ -0,0 +1,20 @@
+/*!
+ * is-extglob
+ *
+ * Copyright (c) 2014-2016, Jon Schlinkert.
+ * Licensed under the MIT License.
+ */
+
+module.exports = function isExtglob(str) {
+ if (typeof str !== 'string' || str === '') {
+ return false;
+ }
+
+ var match;
+ while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(str))) {
+ if (match[2]) return true;
+ str = str.slice(match.index + match[0].length);
+ }
+
+ return false;
+};
diff --git a/node_modules/is-extglob/package.json b/node_modules/is-extglob/package.json
new file mode 100644
index 0000000..7a90836
--- /dev/null
+++ b/node_modules/is-extglob/package.json
@@ -0,0 +1,69 @@
+{
+ "name": "is-extglob",
+ "description": "Returns true if a string has an extglob.",
+ "version": "2.1.1",
+ "homepage": "https://github.com/jonschlinkert/is-extglob",
+ "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
+ "repository": "jonschlinkert/is-extglob",
+ "bugs": {
+ "url": "https://github.com/jonschlinkert/is-extglob/issues"
+ },
+ "license": "MIT",
+ "files": [
+ "index.js"
+ ],
+ "main": "index.js",
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "devDependencies": {
+ "gulp-format-md": "^0.1.10",
+ "mocha": "^3.0.2"
+ },
+ "keywords": [
+ "bash",
+ "braces",
+ "check",
+ "exec",
+ "expression",
+ "extglob",
+ "glob",
+ "globbing",
+ "globstar",
+ "is",
+ "match",
+ "matches",
+ "pattern",
+ "regex",
+ "regular",
+ "string",
+ "test"
+ ],
+ "verb": {
+ "toc": false,
+ "layout": "default",
+ "tasks": [
+ "readme"
+ ],
+ "plugins": [
+ "gulp-format-md"
+ ],
+ "related": {
+ "list": [
+ "has-glob",
+ "is-glob",
+ "micromatch"
+ ]
+ },
+ "reflinks": [
+ "verb",
+ "verb-generate-readme"
+ ],
+ "lint": {
+ "reflinks": true
+ }
+ }
+}
diff --git a/node_modules/is-fullwidth-code-point/index.d.ts b/node_modules/is-fullwidth-code-point/index.d.ts
new file mode 100644
index 0000000..729d202
--- /dev/null
+++ b/node_modules/is-fullwidth-code-point/index.d.ts
@@ -0,0 +1,17 @@
+/**
+Check if the character represented by a given [Unicode code point](https://en.wikipedia.org/wiki/Code_point) is [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms).
+
+@param codePoint - The [code point](https://en.wikipedia.org/wiki/Code_point) of a character.
+
+@example
+```
+import isFullwidthCodePoint from 'is-fullwidth-code-point';
+
+isFullwidthCodePoint('谢'.codePointAt(0));
+//=> true
+
+isFullwidthCodePoint('a'.codePointAt(0));
+//=> false
+```
+*/
+export default function isFullwidthCodePoint(codePoint: number): boolean;
diff --git a/node_modules/is-fullwidth-code-point/index.js b/node_modules/is-fullwidth-code-point/index.js
new file mode 100644
index 0000000..671f97f
--- /dev/null
+++ b/node_modules/is-fullwidth-code-point/index.js
@@ -0,0 +1,50 @@
+/* eslint-disable yoda */
+'use strict';
+
+const isFullwidthCodePoint = codePoint => {
+ if (Number.isNaN(codePoint)) {
+ return false;
+ }
+
+ // Code points are derived from:
+ // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt
+ if (
+ codePoint >= 0x1100 && (
+ codePoint <= 0x115F || // Hangul Jamo
+ codePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET
+ codePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET
+ // CJK Radicals Supplement .. Enclosed CJK Letters and Months
+ (0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F) ||
+ // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
+ (0x3250 <= codePoint && codePoint <= 0x4DBF) ||
+ // CJK Unified Ideographs .. Yi Radicals
+ (0x4E00 <= codePoint && codePoint <= 0xA4C6) ||
+ // Hangul Jamo Extended-A
+ (0xA960 <= codePoint && codePoint <= 0xA97C) ||
+ // Hangul Syllables
+ (0xAC00 <= codePoint && codePoint <= 0xD7A3) ||
+ // CJK Compatibility Ideographs
+ (0xF900 <= codePoint && codePoint <= 0xFAFF) ||
+ // Vertical Forms
+ (0xFE10 <= codePoint && codePoint <= 0xFE19) ||
+ // CJK Compatibility Forms .. Small Form Variants
+ (0xFE30 <= codePoint && codePoint <= 0xFE6B) ||
+ // Halfwidth and Fullwidth Forms
+ (0xFF01 <= codePoint && codePoint <= 0xFF60) ||
+ (0xFFE0 <= codePoint && codePoint <= 0xFFE6) ||
+ // Kana Supplement
+ (0x1B000 <= codePoint && codePoint <= 0x1B001) ||
+ // Enclosed Ideographic Supplement
+ (0x1F200 <= codePoint && codePoint <= 0x1F251) ||
+ // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
+ (0x20000 <= codePoint && codePoint <= 0x3FFFD)
+ )
+ ) {
+ return true;
+ }
+
+ return false;
+};
+
+module.exports = isFullwidthCodePoint;
+module.exports.default = isFullwidthCodePoint;
diff --git a/node_modules/is-fullwidth-code-point/license b/node_modules/is-fullwidth-code-point/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/is-fullwidth-code-point/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/is-fullwidth-code-point/package.json b/node_modules/is-fullwidth-code-point/package.json
new file mode 100644
index 0000000..2137e88
--- /dev/null
+++ b/node_modules/is-fullwidth-code-point/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "is-fullwidth-code-point",
+ "version": "3.0.0",
+ "description": "Check if the character represented by a given Unicode code point is fullwidth",
+ "license": "MIT",
+ "repository": "sindresorhus/is-fullwidth-code-point",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd-check"
+ },
+ "files": [
+ "index.js",
+ "index.d.ts"
+ ],
+ "keywords": [
+ "fullwidth",
+ "full-width",
+ "full",
+ "width",
+ "unicode",
+ "character",
+ "string",
+ "codepoint",
+ "code",
+ "point",
+ "is",
+ "detect",
+ "check"
+ ],
+ "devDependencies": {
+ "ava": "^1.3.1",
+ "tsd-check": "^0.5.0",
+ "xo": "^0.24.0"
+ }
+}
diff --git a/node_modules/is-fullwidth-code-point/readme.md b/node_modules/is-fullwidth-code-point/readme.md
new file mode 100644
index 0000000..4236bba
--- /dev/null
+++ b/node_modules/is-fullwidth-code-point/readme.md
@@ -0,0 +1,39 @@
+# is-fullwidth-code-point [](https://travis-ci.org/sindresorhus/is-fullwidth-code-point)
+
+> Check if the character represented by a given [Unicode code point](https://en.wikipedia.org/wiki/Code_point) is [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms)
+
+
+## Install
+
+```
+$ npm install is-fullwidth-code-point
+```
+
+
+## Usage
+
+```js
+const isFullwidthCodePoint = require('is-fullwidth-code-point');
+
+isFullwidthCodePoint('谢'.codePointAt(0));
+//=> true
+
+isFullwidthCodePoint('a'.codePointAt(0));
+//=> false
+```
+
+
+## API
+
+### isFullwidthCodePoint(codePoint)
+
+#### codePoint
+
+Type: `number`
+
+The [code point](https://en.wikipedia.org/wiki/Code_point) of a character.
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/is-glob/LICENSE b/node_modules/is-glob/LICENSE
new file mode 100644
index 0000000..3f2eca1
--- /dev/null
+++ b/node_modules/is-glob/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2017, Jon Schlinkert.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/is-glob/README.md b/node_modules/is-glob/README.md
new file mode 100644
index 0000000..740724b
--- /dev/null
+++ b/node_modules/is-glob/README.md
@@ -0,0 +1,206 @@
+# is-glob [](https://www.npmjs.com/package/is-glob) [](https://npmjs.org/package/is-glob) [](https://npmjs.org/package/is-glob) [](https://github.com/micromatch/is-glob/actions)
+
+> Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a better user experience.
+
+Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/):
+
+```sh
+$ npm install --save is-glob
+```
+
+You might also be interested in [is-valid-glob](https://github.com/jonschlinkert/is-valid-glob) and [has-glob](https://github.com/jonschlinkert/has-glob).
+
+## Usage
+
+```js
+var isGlob = require('is-glob');
+```
+
+### Default behavior
+
+**True**
+
+Patterns that have glob characters or regex patterns will return `true`:
+
+```js
+isGlob('!foo.js');
+isGlob('*.js');
+isGlob('**/abc.js');
+isGlob('abc/*.js');
+isGlob('abc/(aaa|bbb).js');
+isGlob('abc/[a-z].js');
+isGlob('abc/{a,b}.js');
+//=> true
+```
+
+Extglobs
+
+```js
+isGlob('abc/@(a).js');
+isGlob('abc/!(a).js');
+isGlob('abc/+(a).js');
+isGlob('abc/*(a).js');
+isGlob('abc/?(a).js');
+//=> true
+```
+
+**False**
+
+Escaped globs or extglobs return `false`:
+
+```js
+isGlob('abc/\\@(a).js');
+isGlob('abc/\\!(a).js');
+isGlob('abc/\\+(a).js');
+isGlob('abc/\\*(a).js');
+isGlob('abc/\\?(a).js');
+isGlob('\\!foo.js');
+isGlob('\\*.js');
+isGlob('\\*\\*/abc.js');
+isGlob('abc/\\*.js');
+isGlob('abc/\\(aaa|bbb).js');
+isGlob('abc/\\[a-z].js');
+isGlob('abc/\\{a,b}.js');
+//=> false
+```
+
+Patterns that do not have glob patterns return `false`:
+
+```js
+isGlob('abc.js');
+isGlob('abc/def/ghi.js');
+isGlob('foo.js');
+isGlob('abc/@.js');
+isGlob('abc/+.js');
+isGlob('abc/?.js');
+isGlob();
+isGlob(null);
+//=> false
+```
+
+Arrays are also `false` (If you want to check if an array has a glob pattern, use [has-glob](https://github.com/jonschlinkert/has-glob)):
+
+```js
+isGlob(['**/*.js']);
+isGlob(['foo.js']);
+//=> false
+```
+
+### Option strict
+
+When `options.strict === false` the behavior is less strict in determining if a pattern is a glob. Meaning that
+some patterns that would return `false` may return `true`. This is done so that matching libraries like [micromatch](https://github.com/micromatch/micromatch) have a chance at determining if the pattern is a glob or not.
+
+**True**
+
+Patterns that have glob characters or regex patterns will return `true`:
+
+```js
+isGlob('!foo.js', {strict: false});
+isGlob('*.js', {strict: false});
+isGlob('**/abc.js', {strict: false});
+isGlob('abc/*.js', {strict: false});
+isGlob('abc/(aaa|bbb).js', {strict: false});
+isGlob('abc/[a-z].js', {strict: false});
+isGlob('abc/{a,b}.js', {strict: false});
+//=> true
+```
+
+Extglobs
+
+```js
+isGlob('abc/@(a).js', {strict: false});
+isGlob('abc/!(a).js', {strict: false});
+isGlob('abc/+(a).js', {strict: false});
+isGlob('abc/*(a).js', {strict: false});
+isGlob('abc/?(a).js', {strict: false});
+//=> true
+```
+
+**False**
+
+Escaped globs or extglobs return `false`:
+
+```js
+isGlob('\\!foo.js', {strict: false});
+isGlob('\\*.js', {strict: false});
+isGlob('\\*\\*/abc.js', {strict: false});
+isGlob('abc/\\*.js', {strict: false});
+isGlob('abc/\\(aaa|bbb).js', {strict: false});
+isGlob('abc/\\[a-z].js', {strict: false});
+isGlob('abc/\\{a,b}.js', {strict: false});
+//=> false
+```
+
+## About
+
+
+Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
+
+
+
+
+Running Tests
+
+Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
+
+```sh
+$ npm install && npm test
+```
+
+
+
+
+Building docs
+
+_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
+
+To generate the readme, run the following command:
+
+```sh
+$ npm install -g verbose/verb#dev verb-generate-readme && verb
+```
+
+
+
+### Related projects
+
+You might also be interested in these projects:
+
+* [assemble](https://www.npmjs.com/package/assemble): Get the rocks out of your socks! Assemble makes you fast at creating web projects… [more](https://github.com/assemble/assemble) | [homepage](https://github.com/assemble/assemble "Get the rocks out of your socks! Assemble makes you fast at creating web projects. Assemble is used by thousands of projects for rapid prototyping, creating themes, scaffolds, boilerplates, e-books, UI components, API documentation, blogs, building websit")
+* [base](https://www.npmjs.com/package/base): Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks | [homepage](https://github.com/node-base/base "Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks")
+* [update](https://www.npmjs.com/package/update): Be scalable! Update is a new, open source developer framework and CLI for automating updates… [more](https://github.com/update/update) | [homepage](https://github.com/update/update "Be scalable! Update is a new, open source developer framework and CLI for automating updates of any kind in code projects.")
+* [verb](https://www.npmjs.com/package/verb): Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used… [more](https://github.com/verbose/verb) | [homepage](https://github.com/verbose/verb "Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used on hundreds of projects of all sizes to generate everything from API docs to readmes.")
+
+### Contributors
+
+| **Commits** | **Contributor** |
+| --- | --- |
+| 47 | [jonschlinkert](https://github.com/jonschlinkert) |
+| 5 | [doowb](https://github.com/doowb) |
+| 1 | [phated](https://github.com/phated) |
+| 1 | [danhper](https://github.com/danhper) |
+| 1 | [paulmillr](https://github.com/paulmillr) |
+
+### Author
+
+**Jon Schlinkert**
+
+* [GitHub Profile](https://github.com/jonschlinkert)
+* [Twitter Profile](https://twitter.com/jonschlinkert)
+* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
+
+### License
+
+Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert).
+Released under the [MIT License](LICENSE).
+
+***
+
+_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on March 27, 2019._
\ No newline at end of file
diff --git a/node_modules/is-glob/index.js b/node_modules/is-glob/index.js
new file mode 100644
index 0000000..620f563
--- /dev/null
+++ b/node_modules/is-glob/index.js
@@ -0,0 +1,150 @@
+/*!
+ * is-glob
+ *
+ * Copyright (c) 2014-2017, Jon Schlinkert.
+ * Released under the MIT License.
+ */
+
+var isExtglob = require('is-extglob');
+var chars = { '{': '}', '(': ')', '[': ']'};
+var strictCheck = function(str) {
+ if (str[0] === '!') {
+ return true;
+ }
+ var index = 0;
+ var pipeIndex = -2;
+ var closeSquareIndex = -2;
+ var closeCurlyIndex = -2;
+ var closeParenIndex = -2;
+ var backSlashIndex = -2;
+ while (index < str.length) {
+ if (str[index] === '*') {
+ return true;
+ }
+
+ if (str[index + 1] === '?' && /[\].+)]/.test(str[index])) {
+ return true;
+ }
+
+ if (closeSquareIndex !== -1 && str[index] === '[' && str[index + 1] !== ']') {
+ if (closeSquareIndex < index) {
+ closeSquareIndex = str.indexOf(']', index);
+ }
+ if (closeSquareIndex > index) {
+ if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {
+ return true;
+ }
+ backSlashIndex = str.indexOf('\\', index);
+ if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {
+ return true;
+ }
+ }
+ }
+
+ if (closeCurlyIndex !== -1 && str[index] === '{' && str[index + 1] !== '}') {
+ closeCurlyIndex = str.indexOf('}', index);
+ if (closeCurlyIndex > index) {
+ backSlashIndex = str.indexOf('\\', index);
+ if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) {
+ return true;
+ }
+ }
+ }
+
+ if (closeParenIndex !== -1 && str[index] === '(' && str[index + 1] === '?' && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ')') {
+ closeParenIndex = str.indexOf(')', index);
+ if (closeParenIndex > index) {
+ backSlashIndex = str.indexOf('\\', index);
+ if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {
+ return true;
+ }
+ }
+ }
+
+ if (pipeIndex !== -1 && str[index] === '(' && str[index + 1] !== '|') {
+ if (pipeIndex < index) {
+ pipeIndex = str.indexOf('|', index);
+ }
+ if (pipeIndex !== -1 && str[pipeIndex + 1] !== ')') {
+ closeParenIndex = str.indexOf(')', pipeIndex);
+ if (closeParenIndex > pipeIndex) {
+ backSlashIndex = str.indexOf('\\', pipeIndex);
+ if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {
+ return true;
+ }
+ }
+ }
+ }
+
+ if (str[index] === '\\') {
+ var open = str[index + 1];
+ index += 2;
+ var close = chars[open];
+
+ if (close) {
+ var n = str.indexOf(close, index);
+ if (n !== -1) {
+ index = n + 1;
+ }
+ }
+
+ if (str[index] === '!') {
+ return true;
+ }
+ } else {
+ index++;
+ }
+ }
+ return false;
+};
+
+var relaxedCheck = function(str) {
+ if (str[0] === '!') {
+ return true;
+ }
+ var index = 0;
+ while (index < str.length) {
+ if (/[*?{}()[\]]/.test(str[index])) {
+ return true;
+ }
+
+ if (str[index] === '\\') {
+ var open = str[index + 1];
+ index += 2;
+ var close = chars[open];
+
+ if (close) {
+ var n = str.indexOf(close, index);
+ if (n !== -1) {
+ index = n + 1;
+ }
+ }
+
+ if (str[index] === '!') {
+ return true;
+ }
+ } else {
+ index++;
+ }
+ }
+ return false;
+};
+
+module.exports = function isGlob(str, options) {
+ if (typeof str !== 'string' || str === '') {
+ return false;
+ }
+
+ if (isExtglob(str)) {
+ return true;
+ }
+
+ var check = strictCheck;
+
+ // optionally relax check
+ if (options && options.strict === false) {
+ check = relaxedCheck;
+ }
+
+ return check(str);
+};
diff --git a/node_modules/is-glob/package.json b/node_modules/is-glob/package.json
new file mode 100644
index 0000000..858af03
--- /dev/null
+++ b/node_modules/is-glob/package.json
@@ -0,0 +1,81 @@
+{
+ "name": "is-glob",
+ "description": "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a better user experience.",
+ "version": "4.0.3",
+ "homepage": "https://github.com/micromatch/is-glob",
+ "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
+ "contributors": [
+ "Brian Woodward (https://twitter.com/doowb)",
+ "Daniel Perez (https://tuvistavie.com)",
+ "Jon Schlinkert (http://twitter.com/jonschlinkert)"
+ ],
+ "repository": "micromatch/is-glob",
+ "bugs": {
+ "url": "https://github.com/micromatch/is-glob/issues"
+ },
+ "license": "MIT",
+ "files": [
+ "index.js"
+ ],
+ "main": "index.js",
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "test": "mocha && node benchmark.js"
+ },
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "devDependencies": {
+ "gulp-format-md": "^0.1.10",
+ "mocha": "^3.0.2"
+ },
+ "keywords": [
+ "bash",
+ "braces",
+ "check",
+ "exec",
+ "expression",
+ "extglob",
+ "glob",
+ "globbing",
+ "globstar",
+ "is",
+ "match",
+ "matches",
+ "pattern",
+ "regex",
+ "regular",
+ "string",
+ "test"
+ ],
+ "verb": {
+ "layout": "default",
+ "plugins": [
+ "gulp-format-md"
+ ],
+ "related": {
+ "list": [
+ "assemble",
+ "base",
+ "update",
+ "verb"
+ ]
+ },
+ "reflinks": [
+ "assemble",
+ "bach",
+ "base",
+ "composer",
+ "gulp",
+ "has-glob",
+ "is-valid-glob",
+ "micromatch",
+ "npm",
+ "scaffold",
+ "verb",
+ "vinyl"
+ ]
+ }
+}
diff --git a/node_modules/is-number/LICENSE b/node_modules/is-number/LICENSE
new file mode 100644
index 0000000..9af4a67
--- /dev/null
+++ b/node_modules/is-number/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-present, Jon Schlinkert.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/is-number/README.md b/node_modules/is-number/README.md
new file mode 100644
index 0000000..eb8149e
--- /dev/null
+++ b/node_modules/is-number/README.md
@@ -0,0 +1,187 @@
+# is-number [](https://www.npmjs.com/package/is-number) [](https://npmjs.org/package/is-number) [](https://npmjs.org/package/is-number) [](https://travis-ci.org/jonschlinkert/is-number)
+
+> Returns true if the value is a finite number.
+
+Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/):
+
+```sh
+$ npm install --save is-number
+```
+
+## Why is this needed?
+
+In JavaScript, it's not always as straightforward as it should be to reliably check if a value is a number. It's common for devs to use `+`, `-`, or `Number()` to cast a string value to a number (for example, when values are returned from user input, regex matches, parsers, etc). But there are many non-intuitive edge cases that yield unexpected results:
+
+```js
+console.log(+[]); //=> 0
+console.log(+''); //=> 0
+console.log(+' '); //=> 0
+console.log(typeof NaN); //=> 'number'
+```
+
+This library offers a performant way to smooth out edge cases like these.
+
+## Usage
+
+```js
+const isNumber = require('is-number');
+```
+
+See the [tests](./test.js) for more examples.
+
+### true
+
+```js
+isNumber(5e3); // true
+isNumber(0xff); // true
+isNumber(-1.1); // true
+isNumber(0); // true
+isNumber(1); // true
+isNumber(1.1); // true
+isNumber(10); // true
+isNumber(10.10); // true
+isNumber(100); // true
+isNumber('-1.1'); // true
+isNumber('0'); // true
+isNumber('012'); // true
+isNumber('0xff'); // true
+isNumber('1'); // true
+isNumber('1.1'); // true
+isNumber('10'); // true
+isNumber('10.10'); // true
+isNumber('100'); // true
+isNumber('5e3'); // true
+isNumber(parseInt('012')); // true
+isNumber(parseFloat('012')); // true
+```
+
+### False
+
+Everything else is false, as you would expect:
+
+```js
+isNumber(Infinity); // false
+isNumber(NaN); // false
+isNumber(null); // false
+isNumber(undefined); // false
+isNumber(''); // false
+isNumber(' '); // false
+isNumber('foo'); // false
+isNumber([1]); // false
+isNumber([]); // false
+isNumber(function () {}); // false
+isNumber({}); // false
+```
+
+## Release history
+
+### 7.0.0
+
+* Refactor. Now uses `.isFinite` if it exists.
+* Performance is about the same as v6.0 when the value is a string or number. But it's now 3x-4x faster when the value is not a string or number.
+
+### 6.0.0
+
+* Optimizations, thanks to @benaadams.
+
+### 5.0.0
+
+**Breaking changes**
+
+* removed support for `instanceof Number` and `instanceof String`
+
+## Benchmarks
+
+As with all benchmarks, take these with a grain of salt. See the [benchmarks](./benchmark/index.js) for more detail.
+
+```
+# all
+v7.0 x 413,222 ops/sec ±2.02% (86 runs sampled)
+v6.0 x 111,061 ops/sec ±1.29% (85 runs sampled)
+parseFloat x 317,596 ops/sec ±1.36% (86 runs sampled)
+fastest is 'v7.0'
+
+# string
+v7.0 x 3,054,496 ops/sec ±1.05% (89 runs sampled)
+v6.0 x 2,957,781 ops/sec ±0.98% (88 runs sampled)
+parseFloat x 3,071,060 ops/sec ±1.13% (88 runs sampled)
+fastest is 'parseFloat,v7.0'
+
+# number
+v7.0 x 3,146,895 ops/sec ±0.89% (89 runs sampled)
+v6.0 x 3,214,038 ops/sec ±1.07% (89 runs sampled)
+parseFloat x 3,077,588 ops/sec ±1.07% (87 runs sampled)
+fastest is 'v6.0'
+```
+
+## About
+
+
+Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
+
+
+
+
+Running Tests
+
+Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
+
+```sh
+$ npm install && npm test
+```
+
+
+
+
+Building docs
+
+_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
+
+To generate the readme, run the following command:
+
+```sh
+$ npm install -g verbose/verb#dev verb-generate-readme && verb
+```
+
+
+
+### Related projects
+
+You might also be interested in these projects:
+
+* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object "Returns true if an object was created by the `Object` constructor.")
+* [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive. | [homepage](https://github.com/jonschlinkert/is-primitive "Returns `true` if the value is a primitive. ")
+* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.")
+* [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of "Get the native type of a value.")
+
+### Contributors
+
+| **Commits** | **Contributor** |
+| --- | --- |
+| 49 | [jonschlinkert](https://github.com/jonschlinkert) |
+| 5 | [charlike-old](https://github.com/charlike-old) |
+| 1 | [benaadams](https://github.com/benaadams) |
+| 1 | [realityking](https://github.com/realityking) |
+
+### Author
+
+**Jon Schlinkert**
+
+* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
+* [GitHub Profile](https://github.com/jonschlinkert)
+* [Twitter Profile](https://twitter.com/jonschlinkert)
+
+### License
+
+Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert).
+Released under the [MIT License](LICENSE).
+
+***
+
+_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on June 15, 2018._
\ No newline at end of file
diff --git a/node_modules/is-number/index.js b/node_modules/is-number/index.js
new file mode 100644
index 0000000..27f19b7
--- /dev/null
+++ b/node_modules/is-number/index.js
@@ -0,0 +1,18 @@
+/*!
+ * is-number
+ *
+ * Copyright (c) 2014-present, Jon Schlinkert.
+ * Released under the MIT License.
+ */
+
+'use strict';
+
+module.exports = function(num) {
+ if (typeof num === 'number') {
+ return num - num === 0;
+ }
+ if (typeof num === 'string' && num.trim() !== '') {
+ return Number.isFinite ? Number.isFinite(+num) : isFinite(+num);
+ }
+ return false;
+};
diff --git a/node_modules/is-number/package.json b/node_modules/is-number/package.json
new file mode 100644
index 0000000..3715072
--- /dev/null
+++ b/node_modules/is-number/package.json
@@ -0,0 +1,82 @@
+{
+ "name": "is-number",
+ "description": "Returns true if a number or string value is a finite number. Useful for regex matches, parsing, user input, etc.",
+ "version": "7.0.0",
+ "homepage": "https://github.com/jonschlinkert/is-number",
+ "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
+ "contributors": [
+ "Jon Schlinkert (http://twitter.com/jonschlinkert)",
+ "Olsten Larck (https://i.am.charlike.online)",
+ "Rouven Weßling (www.rouvenwessling.de)"
+ ],
+ "repository": "jonschlinkert/is-number",
+ "bugs": {
+ "url": "https://github.com/jonschlinkert/is-number/issues"
+ },
+ "license": "MIT",
+ "files": [
+ "index.js"
+ ],
+ "main": "index.js",
+ "engines": {
+ "node": ">=0.12.0"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "devDependencies": {
+ "ansi": "^0.3.1",
+ "benchmark": "^2.1.4",
+ "gulp-format-md": "^1.0.0",
+ "mocha": "^3.5.3"
+ },
+ "keywords": [
+ "cast",
+ "check",
+ "coerce",
+ "coercion",
+ "finite",
+ "integer",
+ "is",
+ "isnan",
+ "is-nan",
+ "is-num",
+ "is-number",
+ "isnumber",
+ "isfinite",
+ "istype",
+ "kind",
+ "math",
+ "nan",
+ "num",
+ "number",
+ "numeric",
+ "parseFloat",
+ "parseInt",
+ "test",
+ "type",
+ "typeof",
+ "value"
+ ],
+ "verb": {
+ "toc": false,
+ "layout": "default",
+ "tasks": [
+ "readme"
+ ],
+ "related": {
+ "list": [
+ "is-plain-object",
+ "is-primitive",
+ "isobject",
+ "kind-of"
+ ]
+ },
+ "plugins": [
+ "gulp-format-md"
+ ],
+ "lint": {
+ "reflinks": true
+ }
+ }
+}
diff --git a/node_modules/isexe/.npmignore b/node_modules/isexe/.npmignore
new file mode 100644
index 0000000..c1cb757
--- /dev/null
+++ b/node_modules/isexe/.npmignore
@@ -0,0 +1,2 @@
+.nyc_output/
+coverage/
diff --git a/node_modules/isexe/LICENSE b/node_modules/isexe/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/isexe/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/isexe/README.md b/node_modules/isexe/README.md
new file mode 100644
index 0000000..35769e8
--- /dev/null
+++ b/node_modules/isexe/README.md
@@ -0,0 +1,51 @@
+# isexe
+
+Minimal module to check if a file is executable, and a normal file.
+
+Uses `fs.stat` and tests against the `PATHEXT` environment variable on
+Windows.
+
+## USAGE
+
+```javascript
+var isexe = require('isexe')
+isexe('some-file-name', function (err, isExe) {
+ if (err) {
+ console.error('probably file does not exist or something', err)
+ } else if (isExe) {
+ console.error('this thing can be run')
+ } else {
+ console.error('cannot be run')
+ }
+})
+
+// same thing but synchronous, throws errors
+var isExe = isexe.sync('some-file-name')
+
+// treat errors as just "not executable"
+isexe('maybe-missing-file', { ignoreErrors: true }, callback)
+var isExe = isexe.sync('maybe-missing-file', { ignoreErrors: true })
+```
+
+## API
+
+### `isexe(path, [options], [callback])`
+
+Check if the path is executable. If no callback provided, and a
+global `Promise` object is available, then a Promise will be returned.
+
+Will raise whatever errors may be raised by `fs.stat`, unless
+`options.ignoreErrors` is set to true.
+
+### `isexe.sync(path, [options])`
+
+Same as `isexe` but returns the value and throws any errors raised.
+
+### Options
+
+* `ignoreErrors` Treat all errors as "no, this is not executable", but
+ don't raise them.
+* `uid` Number to use as the user id
+* `gid` Number to use as the group id
+* `pathExt` List of path extensions to use instead of `PATHEXT`
+ environment variable on Windows.
diff --git a/node_modules/isexe/index.js b/node_modules/isexe/index.js
new file mode 100644
index 0000000..553fb32
--- /dev/null
+++ b/node_modules/isexe/index.js
@@ -0,0 +1,57 @@
+var fs = require('fs')
+var core
+if (process.platform === 'win32' || global.TESTING_WINDOWS) {
+ core = require('./windows.js')
+} else {
+ core = require('./mode.js')
+}
+
+module.exports = isexe
+isexe.sync = sync
+
+function isexe (path, options, cb) {
+ if (typeof options === 'function') {
+ cb = options
+ options = {}
+ }
+
+ if (!cb) {
+ if (typeof Promise !== 'function') {
+ throw new TypeError('callback not provided')
+ }
+
+ return new Promise(function (resolve, reject) {
+ isexe(path, options || {}, function (er, is) {
+ if (er) {
+ reject(er)
+ } else {
+ resolve(is)
+ }
+ })
+ })
+ }
+
+ core(path, options || {}, function (er, is) {
+ // ignore EACCES because that just means we aren't allowed to run it
+ if (er) {
+ if (er.code === 'EACCES' || options && options.ignoreErrors) {
+ er = null
+ is = false
+ }
+ }
+ cb(er, is)
+ })
+}
+
+function sync (path, options) {
+ // my kingdom for a filtered catch
+ try {
+ return core.sync(path, options || {})
+ } catch (er) {
+ if (options && options.ignoreErrors || er.code === 'EACCES') {
+ return false
+ } else {
+ throw er
+ }
+ }
+}
diff --git a/node_modules/isexe/mode.js b/node_modules/isexe/mode.js
new file mode 100644
index 0000000..1995ea4
--- /dev/null
+++ b/node_modules/isexe/mode.js
@@ -0,0 +1,41 @@
+module.exports = isexe
+isexe.sync = sync
+
+var fs = require('fs')
+
+function isexe (path, options, cb) {
+ fs.stat(path, function (er, stat) {
+ cb(er, er ? false : checkStat(stat, options))
+ })
+}
+
+function sync (path, options) {
+ return checkStat(fs.statSync(path), options)
+}
+
+function checkStat (stat, options) {
+ return stat.isFile() && checkMode(stat, options)
+}
+
+function checkMode (stat, options) {
+ var mod = stat.mode
+ var uid = stat.uid
+ var gid = stat.gid
+
+ var myUid = options.uid !== undefined ?
+ options.uid : process.getuid && process.getuid()
+ var myGid = options.gid !== undefined ?
+ options.gid : process.getgid && process.getgid()
+
+ var u = parseInt('100', 8)
+ var g = parseInt('010', 8)
+ var o = parseInt('001', 8)
+ var ug = u | g
+
+ var ret = (mod & o) ||
+ (mod & g) && gid === myGid ||
+ (mod & u) && uid === myUid ||
+ (mod & ug) && myUid === 0
+
+ return ret
+}
diff --git a/node_modules/isexe/package.json b/node_modules/isexe/package.json
new file mode 100644
index 0000000..e452689
--- /dev/null
+++ b/node_modules/isexe/package.json
@@ -0,0 +1,31 @@
+{
+ "name": "isexe",
+ "version": "2.0.0",
+ "description": "Minimal module to check if a file is executable.",
+ "main": "index.js",
+ "directories": {
+ "test": "test"
+ },
+ "devDependencies": {
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.0",
+ "tap": "^10.3.0"
+ },
+ "scripts": {
+ "test": "tap test/*.js --100",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "postpublish": "git push origin --all; git push origin --tags"
+ },
+ "author": "Isaac Z. Schlueter (http://blog.izs.me/)",
+ "license": "ISC",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/isexe.git"
+ },
+ "keywords": [],
+ "bugs": {
+ "url": "https://github.com/isaacs/isexe/issues"
+ },
+ "homepage": "https://github.com/isaacs/isexe#readme"
+}
diff --git a/node_modules/isexe/test/basic.js b/node_modules/isexe/test/basic.js
new file mode 100644
index 0000000..d926df6
--- /dev/null
+++ b/node_modules/isexe/test/basic.js
@@ -0,0 +1,221 @@
+var t = require('tap')
+var fs = require('fs')
+var path = require('path')
+var fixture = path.resolve(__dirname, 'fixtures')
+var meow = fixture + '/meow.cat'
+var mine = fixture + '/mine.cat'
+var ours = fixture + '/ours.cat'
+var fail = fixture + '/fail.false'
+var noent = fixture + '/enoent.exe'
+var mkdirp = require('mkdirp')
+var rimraf = require('rimraf')
+
+var isWindows = process.platform === 'win32'
+var hasAccess = typeof fs.access === 'function'
+var winSkip = isWindows && 'windows'
+var accessSkip = !hasAccess && 'no fs.access function'
+var hasPromise = typeof Promise === 'function'
+var promiseSkip = !hasPromise && 'no global Promise'
+
+function reset () {
+ delete require.cache[require.resolve('../')]
+ return require('../')
+}
+
+t.test('setup fixtures', function (t) {
+ rimraf.sync(fixture)
+ mkdirp.sync(fixture)
+ fs.writeFileSync(meow, '#!/usr/bin/env cat\nmeow\n')
+ fs.chmodSync(meow, parseInt('0755', 8))
+ fs.writeFileSync(fail, '#!/usr/bin/env false\n')
+ fs.chmodSync(fail, parseInt('0644', 8))
+ fs.writeFileSync(mine, '#!/usr/bin/env cat\nmine\n')
+ fs.chmodSync(mine, parseInt('0744', 8))
+ fs.writeFileSync(ours, '#!/usr/bin/env cat\nours\n')
+ fs.chmodSync(ours, parseInt('0754', 8))
+ t.end()
+})
+
+t.test('promise', { skip: promiseSkip }, function (t) {
+ var isexe = reset()
+ t.test('meow async', function (t) {
+ isexe(meow).then(function (is) {
+ t.ok(is)
+ t.end()
+ })
+ })
+ t.test('fail async', function (t) {
+ isexe(fail).then(function (is) {
+ t.notOk(is)
+ t.end()
+ })
+ })
+ t.test('noent async', function (t) {
+ isexe(noent).catch(function (er) {
+ t.ok(er)
+ t.end()
+ })
+ })
+ t.test('noent ignore async', function (t) {
+ isexe(noent, { ignoreErrors: true }).then(function (is) {
+ t.notOk(is)
+ t.end()
+ })
+ })
+ t.end()
+})
+
+t.test('no promise', function (t) {
+ global.Promise = null
+ var isexe = reset()
+ t.throws('try to meow a promise', function () {
+ isexe(meow)
+ })
+ t.end()
+})
+
+t.test('access', { skip: accessSkip || winSkip }, function (t) {
+ runTest(t)
+})
+
+t.test('mode', { skip: winSkip }, function (t) {
+ delete fs.access
+ delete fs.accessSync
+ var isexe = reset()
+ t.ok(isexe.sync(ours, { uid: 0, gid: 0 }))
+ t.ok(isexe.sync(mine, { uid: 0, gid: 0 }))
+ runTest(t)
+})
+
+t.test('windows', function (t) {
+ global.TESTING_WINDOWS = true
+ var pathExt = '.EXE;.CAT;.CMD;.COM'
+ t.test('pathExt option', function (t) {
+ runTest(t, { pathExt: '.EXE;.CAT;.CMD;.COM' })
+ })
+ t.test('pathExt env', function (t) {
+ process.env.PATHEXT = pathExt
+ runTest(t)
+ })
+ t.test('no pathExt', function (t) {
+ // with a pathExt of '', any filename is fine.
+ // so the "fail" one would still pass.
+ runTest(t, { pathExt: '', skipFail: true })
+ })
+ t.test('pathext with empty entry', function (t) {
+ // with a pathExt of '', any filename is fine.
+ // so the "fail" one would still pass.
+ runTest(t, { pathExt: ';' + pathExt, skipFail: true })
+ })
+ t.end()
+})
+
+t.test('cleanup', function (t) {
+ rimraf.sync(fixture)
+ t.end()
+})
+
+function runTest (t, options) {
+ var isexe = reset()
+
+ var optionsIgnore = Object.create(options || {})
+ optionsIgnore.ignoreErrors = true
+
+ if (!options || !options.skipFail) {
+ t.notOk(isexe.sync(fail, options))
+ }
+ t.notOk(isexe.sync(noent, optionsIgnore))
+ if (!options) {
+ t.ok(isexe.sync(meow))
+ } else {
+ t.ok(isexe.sync(meow, options))
+ }
+
+ t.ok(isexe.sync(mine, options))
+ t.ok(isexe.sync(ours, options))
+ t.throws(function () {
+ isexe.sync(noent, options)
+ })
+
+ t.test('meow async', function (t) {
+ if (!options) {
+ isexe(meow, function (er, is) {
+ if (er) {
+ throw er
+ }
+ t.ok(is)
+ t.end()
+ })
+ } else {
+ isexe(meow, options, function (er, is) {
+ if (er) {
+ throw er
+ }
+ t.ok(is)
+ t.end()
+ })
+ }
+ })
+
+ t.test('mine async', function (t) {
+ isexe(mine, options, function (er, is) {
+ if (er) {
+ throw er
+ }
+ t.ok(is)
+ t.end()
+ })
+ })
+
+ t.test('ours async', function (t) {
+ isexe(ours, options, function (er, is) {
+ if (er) {
+ throw er
+ }
+ t.ok(is)
+ t.end()
+ })
+ })
+
+ if (!options || !options.skipFail) {
+ t.test('fail async', function (t) {
+ isexe(fail, options, function (er, is) {
+ if (er) {
+ throw er
+ }
+ t.notOk(is)
+ t.end()
+ })
+ })
+ }
+
+ t.test('noent async', function (t) {
+ isexe(noent, options, function (er, is) {
+ t.ok(er)
+ t.notOk(is)
+ t.end()
+ })
+ })
+
+ t.test('noent ignore async', function (t) {
+ isexe(noent, optionsIgnore, function (er, is) {
+ if (er) {
+ throw er
+ }
+ t.notOk(is)
+ t.end()
+ })
+ })
+
+ t.test('directory is not executable', function (t) {
+ isexe(__dirname, options, function (er, is) {
+ if (er) {
+ throw er
+ }
+ t.notOk(is)
+ t.end()
+ })
+ })
+
+ t.end()
+}
diff --git a/node_modules/isexe/windows.js b/node_modules/isexe/windows.js
new file mode 100644
index 0000000..3499673
--- /dev/null
+++ b/node_modules/isexe/windows.js
@@ -0,0 +1,42 @@
+module.exports = isexe
+isexe.sync = sync
+
+var fs = require('fs')
+
+function checkPathExt (path, options) {
+ var pathext = options.pathExt !== undefined ?
+ options.pathExt : process.env.PATHEXT
+
+ if (!pathext) {
+ return true
+ }
+
+ pathext = pathext.split(';')
+ if (pathext.indexOf('') !== -1) {
+ return true
+ }
+ for (var i = 0; i < pathext.length; i++) {
+ var p = pathext[i].toLowerCase()
+ if (p && path.substr(-p.length).toLowerCase() === p) {
+ return true
+ }
+ }
+ return false
+}
+
+function checkStat (stat, path, options) {
+ if (!stat.isSymbolicLink() && !stat.isFile()) {
+ return false
+ }
+ return checkPathExt(path, options)
+}
+
+function isexe (path, options, cb) {
+ fs.stat(path, function (er, stat) {
+ cb(er, er ? false : checkStat(stat, path, options))
+ })
+}
+
+function sync (path, options) {
+ return checkStat(fs.statSync(path), path, options)
+}
diff --git a/node_modules/jackspeak/LICENSE.md b/node_modules/jackspeak/LICENSE.md
new file mode 100644
index 0000000..8cb5cc6
--- /dev/null
+++ b/node_modules/jackspeak/LICENSE.md
@@ -0,0 +1,55 @@
+# Blue Oak Model License
+
+Version 1.0.0
+
+## Purpose
+
+This license gives everyone as much permission to work with
+this software as possible, while protecting contributors
+from liability.
+
+## Acceptance
+
+In order to receive this license, you must agree to its
+rules. The rules of this license are both obligations
+under that agreement and conditions to your license.
+You must not do anything with this software that triggers
+a rule that you cannot or will not follow.
+
+## Copyright
+
+Each contributor licenses you to do everything with this
+software that would otherwise infringe that contributor's
+copyright in it.
+
+## Notices
+
+You must ensure that everyone who gets a copy of
+any part of this software from you, with or without
+changes, also gets the text of this license or a link to
+.
+
+## Excuse
+
+If anyone notifies you in writing that you have not
+complied with [Notices](#notices), you can keep your
+license by taking all practical steps to comply within 30
+days after the notice. If you do not do so, your license
+ends immediately.
+
+## Patent
+
+Each contributor licenses you to do everything with this
+software that would otherwise infringe any patent claims
+they can license or become able to license.
+
+## Reliability
+
+No contributor can revoke this license.
+
+## No Liability
+
+**_As far as the law allows, this software comes as is,
+without any warranty or condition, and no contributor
+will be liable to anyone for any damages related to this
+software or this license, under any kind of legal claim._**
diff --git a/node_modules/jackspeak/README.md b/node_modules/jackspeak/README.md
new file mode 100644
index 0000000..4ffea4b
--- /dev/null
+++ b/node_modules/jackspeak/README.md
@@ -0,0 +1,357 @@
+# jackspeak
+
+A very strict and proper argument parser.
+
+Validate string, boolean, and number options, from the command
+line and the environment.
+
+Call the `jack` method with a config object, and then chain
+methods off of it.
+
+At the end, call the `.parse()` method, and you'll get an object
+with `positionals` and `values` members.
+
+Any unrecognized configs or invalid values will throw an error.
+
+As long as you define configs using object literals, types will
+be properly inferred and TypeScript will know what kinds of
+things you got.
+
+If you give it a prefix for environment variables, then defaults
+will be read from the environment, and parsed values written back
+to it, so you can easily pass configs through to child processes.
+
+Automatically generates a `usage`/`help` banner by calling the
+`.usage()` method.
+
+Unless otherwise noted, all methods return the object itself.
+
+## USAGE
+
+```js
+import { jack } from 'jackspeak'
+// this works too:
+// const { jack } = require('jackspeak')
+
+const { positionals, values } = jack({ envPrefix: 'FOO' })
+ .flag({
+ asdf: { description: 'sets the asfd flag', short: 'a', default: true },
+ 'no-asdf': { description: 'unsets the asdf flag', short: 'A' },
+ foo: { description: 'another boolean', short: 'f' },
+ })
+ .optList({
+ 'ip-addrs': {
+ description: 'addresses to ip things',
+ delim: ',', // defaults to '\n'
+ default: ['127.0.0.1'],
+ },
+ })
+ .parse([
+ 'some',
+ 'positional',
+ '--ip-addrs',
+ '192.168.0.1',
+ '--ip-addrs',
+ '1.1.1.1',
+ 'args',
+ '--foo', // sets the foo flag
+ '-A', // short for --no-asdf, sets asdf flag to false
+ ])
+
+console.log(process.env.FOO_ASDF) // '0'
+console.log(process.env.FOO_FOO) // '1'
+console.log(values) // {
+// 'ip-addrs': ['192.168.0.1', '1.1.1.1'],
+// foo: true,
+// asdf: false,
+// }
+console.log(process.env.FOO_IP_ADDRS) // '192.168.0.1,1.1.1.1'
+console.log(positionals) // ['some', 'positional', 'args']
+```
+
+## `jack(options: JackOptions = {}) => Jack`
+
+Returns a `Jack` object that can be used to chain and add
+field definitions. The other methods (apart from `validate()`,
+`parse()`, and `usage()` obviously) return the same Jack object,
+updated with the new types, so they can be chained together as
+shown in the code examples.
+
+Options:
+
+- `allowPositionals` Defaults to true. Set to `false` to not
+ allow any positional arguments.
+
+- `envPrefix` Set to a string to write configs to and read
+ configs from the environment. For example, if set to `MY_APP`
+ then the `foo-bar` config will default based on the value of
+ `env.MY_APP_FOO_BAR` and will write back to that when parsed.
+
+ Boolean values are written as `'1'` and `'0'`, and will be
+ treated as `true` if they're `'1'` or false otherwise.
+
+ Number values are written with their `toString()`
+ representation.
+
+ Strings are just strings.
+
+ Any value with `multiple: true` will be represented in the
+ environment split by a delimiter, which defaults to `\n`.
+
+- `env` The place to read/write environment variables. Defaults
+ to `process.env`.
+
+- `usage` A short usage string to print at the top of the help
+ banner.
+
+- `stopAtPositional` Boolean, default false. Stop parsing opts
+ and flags at the first positional argument. This is useful if
+ you want to pass certain options to subcommands, like some
+ programs do, so you can stop parsing and pass the positionals
+ to the subcommand to parse.
+
+- `stopAtPositionalTest` Conditional `stopAtPositional`. Provide
+ a function that takes a positional argument string and returns
+ boolean. If it returns `true`, then parsing will stop. Useful
+ when _some_ subcommands should parse the rest of the command
+ line options, and others should not.
+
+### `Jack.heading(text: string, level?: 1 | 2 | 3 | 4 | 5 | 6)`
+
+Define a short string heading, used in the `usage()` output.
+
+Indentation of the heading and subsequent description/config
+usage entries (up until the next heading) is set by the heading
+level.
+
+If the first usage item defined is a heading, it is always
+treated as level 1, regardless of the argument provided.
+
+Headings level 1 and 2 will have a line of padding underneath
+them. Headings level 3 through 6 will not.
+
+### `Jack.description(text: string, { pre?: boolean } = {})`
+
+Define a long string description, used in the `usage()` output.
+
+If the `pre` option is set to `true`, then whitespace will not be
+normalized. However, if any line is too long for the width
+allotted, it will still be wrapped.
+
+## Option Definitions
+
+Configs are defined by calling the appropriate field definition
+method with an object where the keys are the long option name,
+and the value defines the config.
+
+Options:
+
+- `type` Only needed for the `addFields` method, as the others
+ set it implicitly. Can be `'string'`, `'boolean'`, or
+ `'number'`.
+- `multiple` Only needed for the `addFields` method, as the
+ others set it implicitly. Set to `true` to define an array
+ type. This means that it can be set on the CLI multiple times,
+ set as an array in the `values`
+ and it is represented in the environment as a delimited string.
+- `short` A one-character shorthand for the option.
+- `description` Some words to describe what this option is and
+ why you'd set it.
+- `hint` (Only relevant for non-boolean types) The thing to show
+ in the usage output, like `--option=`
+- `validate` A function that returns false (or throws) if an
+ option value is invalid.
+- `validOptions` An array of strings or numbers that define the
+ valid values that can be set. This is not allowed on `boolean`
+ (flag) options. May be used along with a `validate()` method.
+- `default` A default value for the field. Note that this may be
+ overridden by an environment variable, if present.
+
+### `Jack.flag({ [option: string]: definition, ... })`
+
+Define one or more boolean fields.
+
+Boolean options may be set to `false` by using a
+`--no-${optionName}` argument, which will be implicitly created
+if it's not defined to be something else.
+
+If a boolean option named `no-${optionName}` with the same
+`multiple` setting is in the configuration, then that will be
+treated as a negating flag.
+
+### `Jack.flagList({ [option: string]: definition, ... })`
+
+Define one or more boolean array fields.
+
+### `Jack.num({ [option: string]: definition, ... })`
+
+Define one or more number fields. These will be set in the
+environment as a stringified number, and included in the `values`
+object as a number.
+
+### `Jack.numList({ [option: string]: definition, ... })`
+
+Define one or more number list fields. These will be set in the
+environment as a delimited set of stringified numbers, and
+included in the `values` as a number array.
+
+### `Jack.opt({ [option: string]: definition, ... })`
+
+Define one or more string option fields.
+
+### `Jack.optList({ [option: string]: definition, ... })`
+
+Define one or more string list fields.
+
+### `Jack.addFields({ [option: string]: definition, ... })`
+
+Define one or more fields of any type. Note that `type` and
+`multiple` must be set explicitly on each definition when using
+this method.
+
+## Actions
+
+Use these methods on a Jack object that's already had its config
+fields defined.
+
+### `Jack.parse(args: string[] = process.argv): { positionals: string[], values: OptionsResults }`
+
+Parse the arguments list, write to the environment if `envPrefix`
+is set, and returned the parsed values and remaining positional
+arguments.
+
+### `Jack.validate(o: any): asserts o is OptionsResults`
+
+Throws an error if the object provided is not a valid result set,
+for the configurations defined thusfar.
+
+### `Jack.usage(): string`
+
+Returns the compiled `usage` string, with all option descriptions
+and heading/description text, wrapped to the appropriate width
+for the terminal.
+
+### `Jack.setConfigValues(options: OptionsResults, src?: string)`
+
+Validate the `options` argument, and set the default value for
+each field that appears in the options.
+
+Values provided will be overridden by environment variables or
+command line arguments.
+
+### `Jack.usageMarkdown(): string`
+
+Returns the compiled `usage` string, with all option descriptions
+and heading/description text, but as markdown instead of
+formatted for a terminal, for generating HTML documentation for
+your CLI.
+
+## Some Example Code
+
+Also see [the examples
+folder](https://github.com/isaacs/jackspeak/tree/master/examples)
+
+```js
+import { jack } from 'jackspeak'
+
+const j = jack({
+ // Optional
+ // This will be auto-generated from the descriptions if not supplied
+ // top level usage line, printed by -h
+ // will be auto-generated if not specified
+ usage: 'foo [options] ',
+})
+ .heading('The best Foo that ever Fooed')
+ .description(
+ `
+ Executes all the files and interprets their output as
+ TAP formatted test result data.
+
+ To parse TAP data from stdin, specify "-" as a filename.
+ `,
+ )
+
+ // flags don't take a value, they're boolean on or off, and can be
+ // turned off by prefixing with `--no-`
+ // so this adds support for -b to mean --bail, or -B to mean --no-bail
+ .flag({
+ flag: {
+ // specify a short value if you like. this must be a single char
+ short: 'f',
+ // description is optional as well.
+ description: `Make the flags wave`,
+ // default value for flags is 'false', unless you change it
+ default: true,
+ },
+ 'no-flag': {
+ // you can can always negate a flag with `--no-flag`
+ // specifying a negate option will let you define a short
+ // single-char option for negation.
+ short: 'F',
+ description: `Do not wave the flags`,
+ },
+ })
+
+ // Options that take a value are specified with `opt()`
+ .opt({
+ reporter: {
+ short: 'R',
+ description: 'the style of report to display',
+ },
+ })
+
+ // if you want a number, say so, and jackspeak will enforce it
+ .num({
+ jobs: {
+ short: 'j',
+ description: 'how many jobs to run in parallel',
+ default: 1,
+ },
+ })
+
+ // A list is an option that can be specified multiple times,
+ // to expand into an array of all the settings. Normal opts
+ // will just give you the last value specified.
+ .optList({
+ 'node-arg': {},
+ })
+
+ // a flagList is an array of booleans, so `-ddd` is [true, true, true]
+ // count the `true` values to treat it as a counter.
+ .flagList({
+ debug: { short: 'd' },
+ })
+
+ // opts take a value, and is set to the string in the results
+ // you can combine multiple short-form flags together, but
+ // an opt will end the combine chain, posix-style. So,
+ // -bofilename would be like --bail --output-file=filename
+ .opt({
+ 'output-file': {
+ short: 'o',
+ // optional: make it -o in the help output insead of -o
+ hint: 'file',
+ description: `Send the raw output to the specified file.`,
+ },
+ })
+
+// now we can parse argv like this:
+const { values, positionals } = j.parse(process.argv)
+
+// or decide to show the usage banner
+console.log(j.usage())
+
+// or validate an object config we got from somewhere else
+try {
+ j.validate(someConfig)
+} catch (er) {
+ console.error('someConfig is not valid!', er)
+}
+```
+
+## Name
+
+The inspiration for this module is [yargs](http://npm.im/yargs), which
+is pirate talk themed. Yargs has all the features, and is infinitely
+flexible. "Jackspeak" is the slang of the royal navy. This module
+does not have all the features. It is declarative and rigid by design.
diff --git a/node_modules/jackspeak/package.json b/node_modules/jackspeak/package.json
new file mode 100644
index 0000000..51eaabd
--- /dev/null
+++ b/node_modules/jackspeak/package.json
@@ -0,0 +1,95 @@
+{
+ "name": "jackspeak",
+ "publishConfig": {
+ "tag": "v3-legacy"
+ },
+ "version": "3.4.3",
+ "description": "A very strict and proper argument parser.",
+ "tshy": {
+ "main": true,
+ "exports": {
+ "./package.json": "./package.json",
+ ".": "./src/index.js"
+ }
+ },
+ "main": "./dist/commonjs/index.js",
+ "types": "./dist/commonjs/index.d.ts",
+ "type": "module",
+ "exports": {
+ "./package.json": "./package.json",
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ }
+ },
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "build-examples": "for i in examples/*.js ; do node $i -h > ${i/.js/.txt}; done",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "prepare": "tshy",
+ "pretest": "npm run prepare",
+ "presnap": "npm run prepare",
+ "test": "tap",
+ "snap": "tap",
+ "format": "prettier --write . --log-level warn",
+ "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts"
+ },
+ "license": "BlueOak-1.0.0",
+ "prettier": {
+ "experimentalTernaries": true,
+ "semi": false,
+ "printWidth": 75,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf"
+ },
+ "devDependencies": {
+ "@types/node": "^20.7.0",
+ "@types/pkgjs__parseargs": "^0.10.1",
+ "prettier": "^3.2.5",
+ "tap": "^18.8.0",
+ "tshy": "^1.14.0",
+ "typedoc": "^0.25.1",
+ "typescript": "^5.2.2"
+ },
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/jackspeak.git"
+ },
+ "keywords": [
+ "argument",
+ "parser",
+ "args",
+ "option",
+ "flag",
+ "cli",
+ "command",
+ "line",
+ "parse",
+ "parsing"
+ ],
+ "author": "Isaac Z. Schlueter ",
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+}
diff --git a/node_modules/jiti/LICENSE b/node_modules/jiti/LICENSE
new file mode 100644
index 0000000..e739abc
--- /dev/null
+++ b/node_modules/jiti/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) Pooya Parsa
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/jiti/README.md b/node_modules/jiti/README.md
new file mode 100644
index 0000000..2da8e4e
--- /dev/null
+++ b/node_modules/jiti/README.md
@@ -0,0 +1,164 @@
+# jiti
+
+[![npm version][npm-version-src]][npm-version-href]
+[![npm downloads][npm-downloads-src]][npm-downloads-href]
+[![bundle][bundle-src]][bundle-href]
+[![License][license-src]][license-href]
+
+Runtime Typescript and ESM support for Node.js.
+
+> [!IMPORTANT]
+> This is the support branch for jiti v1. Check out [jiti/main](https://github.com/unjs/jiti/tree/main) for the latest version and [unjs/jiti#174](https://github.com/unjs/jiti/issues/174) for the roadmap.
+
+## Features
+
+- Seamless typescript and ESM syntax support
+- Seamless interoperability between ESM and CommonJS
+- Synchronous API to replace `require`
+- Super slim and zero dependency
+- Smart syntax detection to avoid extra transforms
+- CommonJS cache integration
+- Filesystem transpile hard cache
+- V8 compile cache
+- Custom resolve alias
+
+## Usage
+
+### Programmatic
+
+```js
+const jiti = require("jiti")(__filename);
+
+jiti("./path/to/file.ts");
+```
+
+You can also pass options as second argument:
+
+```js
+const jiti = require("jiti")(__filename, { debug: true });
+```
+
+### CLI
+
+```bash
+jiti index.ts
+# or npx jiti index.ts
+```
+
+### Register require hook
+
+```bash
+node -r jiti/register index.ts
+```
+
+Alternatively, you can register `jiti` as a require hook programmatically:
+
+```js
+const jiti = require("jiti")();
+const unregister = jiti.register();
+```
+
+## Options
+
+### `debug`
+
+- Type: Boolean
+- Default: `false`
+- Environment Variable: `JITI_DEBUG`
+
+Enable debug to see which files are transpiled
+
+### `cache`
+
+- Type: Boolean | String
+- Default: `true`
+- Environment Variable: `JITI_CACHE`
+
+Use transpile cache
+
+If set to `true` will use `node_modules/.cache/jiti` (if exists) or `{TMP_DIR}/node-jiti`
+
+### `esmResolve`
+
+- Type: Boolean | String
+- Default: `false`
+- Environment Variable: `JITI_ESM_RESOLVE`
+
+Using esm resolution algorithm to support `import` condition.
+
+### `transform`
+
+- Type: Function
+- Default: Babel (lazy loaded)
+
+Transform function. See [src/babel](./src/babel.ts) for more details
+
+### `sourceMaps`
+
+- Type: Boolean
+- Default `false`
+- Environment Variable: `JITI_SOURCE_MAPS`
+
+Add inline source map to transformed source for better debugging.
+
+### `interopDefault`
+
+- Type: Boolean
+- Default: `false`
+
+Return the `.default` export of a module at the top-level.
+
+### `alias`
+
+- Type: Object
+- Default: -
+- Environment Variable: `JITI_ALIAS`
+
+Custom alias map used to resolve ids.
+
+### `nativeModules`
+
+- Type: Array
+- Default: ['typescript`]
+- Environment Variable: `JITI_NATIVE_MODULES`
+
+List of modules (within `node_modules`) to always use native require for them.
+
+### `transformModules`
+
+- Type: Array
+- Default: []
+- Environment Variable: `JITI_TRANSFORM_MODULES`
+
+List of modules (within `node_modules`) to transform them regardless of syntax.
+
+### `experimentalBun`
+
+- Type: Boolean
+- Default: Enabled if `process.versions.bun` exists (Bun runtime)
+- Environment Variable: `JITI_EXPERIMENTAL_BUN`
+
+Enable experimental native Bun support for transformations.
+
+## Development
+
+- Clone this repository
+- Enable [Corepack](https://github.com/nodejs/corepack) using `corepack enable`
+- Install dependencies using `pnpm install`
+- Run `pnpm dev`
+- Run `pnpm jiti ./test/path/to/file.ts`
+
+## License
+
+MIT. Made with 💖
+
+
+
+[npm-version-src]: https://img.shields.io/npm/v/jiti?style=flat&colorA=18181B&colorB=F0DB4F
+[npm-version-href]: https://npmjs.com/package/jiti
+[npm-downloads-src]: https://img.shields.io/npm/dm/jiti?style=flat&colorA=18181B&colorB=F0DB4F
+[npm-downloads-href]: https://npmjs.com/package/jiti
+[bundle-src]: https://img.shields.io/bundlephobia/minzip/jiti?style=flat&colorA=18181B&colorB=F0DB4F
+[bundle-href]: https://bundlephobia.com/result?p=h3
+[license-src]: https://img.shields.io/github/license/unjs/jiti.svg?style=flat&colorA=18181B&colorB=F0DB4F
+[license-href]: https://github.com/unjs/jiti/blob/main/LICENSE
diff --git a/node_modules/jiti/bin/jiti.js b/node_modules/jiti/bin/jiti.js
new file mode 100644
index 0000000..2867c64
--- /dev/null
+++ b/node_modules/jiti/bin/jiti.js
@@ -0,0 +1,16 @@
+#!/usr/bin/env node
+
+const { resolve } = require("node:path");
+
+const script = process.argv.splice(2, 1)[0];
+
+if (!script) {
+
+ console.error("Usage: jiti [...arguments]");
+ process.exit(1);
+}
+
+const pwd = process.cwd();
+const jiti = require("..")(pwd);
+const resolved = (process.argv[1] = jiti.resolve(resolve(pwd, script)));
+jiti(resolved);
diff --git a/node_modules/jiti/package.json b/node_modules/jiti/package.json
new file mode 100644
index 0000000..dbe7eee
--- /dev/null
+++ b/node_modules/jiti/package.json
@@ -0,0 +1,81 @@
+{
+ "name": "jiti",
+ "version": "1.21.6",
+ "description": "Runtime typescript and ESM support for Node.js",
+ "repository": "unjs/jiti",
+ "license": "MIT",
+ "main": "./lib/index.js",
+ "types": "dist/jiti.d.ts",
+ "bin": "bin/jiti.js",
+ "files": [
+ "lib",
+ "dist",
+ "register.js"
+ ],
+ "scripts": {
+ "build": "pnpm clean && NODE_ENV=production pnpm webpack",
+ "clean": "rm -rf dist",
+ "dev": "pnpm clean && pnpm webpack --watch",
+ "jiti": "JITI_DEBUG=1 JITI_CACHE=false JITI_REQUIRE_CACHE=false ./bin/jiti.js",
+ "jiti:legacy": "JITI_DEBUG=1 npx node@12 ./bin/jiti.js",
+ "lint": "eslint . && prettier -c src lib test stubs",
+ "lint:fix": "eslint --fix . && prettier -w src lib test stubs",
+ "release": "pnpm build && pnpm test && changelogen --release --push && npm publish",
+ "test": "pnpm lint && vitest run --coverage && pnpm test:bun",
+ "test:bun": "bun --bun test test/bun"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.24.7",
+ "@babel/plugin-proposal-decorators": "^7.24.7",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-import-assertions": "^7.24.7",
+ "@babel/plugin-transform-export-namespace-from": "^7.24.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.24.7",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+ "@babel/plugin-transform-optional-chaining": "^7.24.7",
+ "@babel/plugin-transform-typescript": "^7.24.7",
+ "@babel/preset-typescript": "^7.24.7",
+ "@babel/template": "^7.24.7",
+ "@babel/types": "^7.24.7",
+ "@types/babel__core": "^7.20.5",
+ "@types/babel__template": "^7.4.4",
+ "@types/node": "^20.14.2",
+ "@types/object-hash": "^3.0.6",
+ "@types/resolve": "^1.20.6",
+ "@types/semver": "^7.5.8",
+ "@vitest/coverage-v8": "^1.6.0",
+ "acorn": "^8.11.3",
+ "babel-plugin-dynamic-import-node": "^2.3.3",
+ "babel-plugin-parameter-decorator": "^1.0.16",
+ "babel-plugin-transform-typescript-metadata": "^0.3.2",
+ "changelogen": "^0.5.5",
+ "config": "^3.3.11",
+ "create-require": "^1.1.1",
+ "destr": "^2.0.3",
+ "escape-string-regexp": "^5.0.0",
+ "eslint": "^9.4.0",
+ "eslint-config-unjs": "^0.3.2",
+ "esm": "^3.2.25",
+ "estree-walker": "^3.0.3",
+ "execa": "^9.1.0",
+ "fast-glob": "^3.3.2",
+ "mlly": "^1.7.1",
+ "object-hash": "^3.0.0",
+ "pathe": "^1.1.2",
+ "pirates": "^4.0.6",
+ "pkg-types": "^1.1.1",
+ "prettier": "^3.3.1",
+ "reflect-metadata": "^0.2.1",
+ "semver": "^7.6.2",
+ "std-env": "^3.7.0",
+ "terser-webpack-plugin": "^5.3.10",
+ "ts-loader": "^9.5.1",
+ "tslib": "^2.6.3",
+ "typescript": "^5.4.5",
+ "vite": "^5.2.12",
+ "vitest": "^1.6.0",
+ "webpack": "^5.91.0",
+ "webpack-cli": "^5.1.4"
+ },
+ "packageManager": "pnpm@9.2.0"
+}
diff --git a/node_modules/jiti/register.js b/node_modules/jiti/register.js
new file mode 100644
index 0000000..60aaeb3
--- /dev/null
+++ b/node_modules/jiti/register.js
@@ -0,0 +1,3 @@
+const jiti = require(".")();
+
+jiti.register();
diff --git a/node_modules/lilconfig/LICENSE b/node_modules/lilconfig/LICENSE
new file mode 100644
index 0000000..fd866f4
--- /dev/null
+++ b/node_modules/lilconfig/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 Anton Kastritskiy
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/lilconfig/package.json b/node_modules/lilconfig/package.json
new file mode 100644
index 0000000..8e06d1f
--- /dev/null
+++ b/node_modules/lilconfig/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "lilconfig",
+ "version": "2.1.0",
+ "description": "A zero-dependency alternative to cosmiconfig",
+ "main": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "scripts": {
+ "prebuild": "npm run clean",
+ "build": "tsc --declaration",
+ "postbuild": "du -h ./dist/*",
+ "clean": "rm -rf ./dist",
+ "test": "jest --coverage",
+ "lint": "eslint ./src/*.ts"
+ },
+ "keywords": [
+ "cosmiconfig",
+ "config",
+ "configuration",
+ "search"
+ ],
+ "files": [
+ "dist/*"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/antonk52/lilconfig"
+ },
+ "bugs": "https://github.com/antonk52/lilconfig/issues",
+ "author": "antonk52",
+ "license": "MIT",
+ "devDependencies": {
+ "@types/jest": "^27.0.2",
+ "@types/node": "^14.18.36",
+ "@typescript-eslint/eslint-plugin": "^5.54.0",
+ "@typescript-eslint/parser": "^5.54.0",
+ "cosmiconfig": "^7.1.0",
+ "eslint": "^8.35.0",
+ "eslint-config-prettier": "^8.6.0",
+ "eslint-plugin-prettier": "^4.2.1",
+ "jest": "^27.3.1",
+ "prettier": "^2.8.4",
+ "ts-jest": "27.0.7",
+ "typescript": "4.4.4"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+}
diff --git a/node_modules/lilconfig/readme.md b/node_modules/lilconfig/readme.md
new file mode 100644
index 0000000..7b6610d
--- /dev/null
+++ b/node_modules/lilconfig/readme.md
@@ -0,0 +1,118 @@
+# Lilconfig ⚙️
+[](https://badge.fury.io/js/lilconfig)
+[](https://packagephobia.now.sh/result?p=lilconfig)
+[](https://coveralls.io/github/antonk52/lilconfig)
+
+A zero-dependency alternative to [cosmiconfig](https://www.npmjs.com/package/cosmiconfig) with the same API.
+
+## Installation
+
+```sh
+npm install lilconfig
+```
+
+## Usage
+
+```js
+import {lilconfig, lilconfigSync} from 'lilconfig';
+
+// all keys are optional
+const options = {
+ stopDir: '/Users/you/some/dir',
+ searchPlaces: ['package.json', 'myapp.conf.js'],
+ ignoreEmptySearchPlaces: false
+}
+
+lilconfig(
+ 'myapp',
+ options // optional
+).search() // Promise
+
+lilconfigSync(
+ 'myapp',
+ options // optional
+).load(pathToConfig) // LilconfigResult
+
+/**
+ * LilconfigResult
+ * {
+ * config: any; // your config
+ * filepath: string;
+ * }
+ */
+```
+
+## Difference to `cosmiconfig`
+Lilconfig does not intend to be 100% compatible with `cosmiconfig` but tries to mimic it where possible. The key differences are:
+- **no** support for yaml files out of the box(`lilconfig` attempts to parse files with no extension as JSON instead of YAML). You can still add the support for YAML files by providing a loader, see an [example](#yaml-loader) below.
+- **no** cache
+
+### Options difference between the two.
+
+|cosmiconfig option | lilconfig |
+|------------------------|-----------|
+|cache | ❌ |
+|loaders | ✅ |
+|ignoreEmptySearchPlaces | ✅ |
+|packageProp | ✅ |
+|searchPlaces | ✅ |
+|stopDir | ✅ |
+|transform | ✅ |
+
+## Loaders examples
+
+### Yaml loader
+
+If you need the YAML support you can provide your own loader
+
+```js
+import {lilconfig} from 'lilconfig';
+import yaml from 'yaml';
+
+function loadYaml(filepath, content) {
+ return yaml.parse(content);
+}
+
+const options = {
+ loaders: {
+ '.yaml': loadYaml,
+ '.yml': loadYaml,
+ // loader for files with no extension
+ noExt: loadYaml
+ }
+};
+
+lilconfig('myapp', options)
+ .search()
+ .then(result => {
+ result // {config, filepath}
+ });
+```
+
+### ESM loader
+
+Lilconfig v2 does not support ESM modules out of the box. However, you can support it with a custom a loader. Note that this will only work with the async `lilconfig` function and won't work with the sync `lilconfigSync`.
+
+```js
+import {lilconfig} from 'lilconfig';
+
+const loadEsm = filepath => import(filepath);
+
+lilconfig('myapp', {
+ loaders: {
+ '.js': loadEsm,
+ '.mjs': loadEsm,
+ }
+})
+ .search()
+ .then(result => {
+ result // {config, filepath}
+
+ result.config.default // if config uses `export default`
+ });
+```
+
+## Version correlation
+
+- lilconig v1 → cosmiconfig v6
+- lilconig v2 → cosmiconfig v7
diff --git a/node_modules/lines-and-columns/LICENSE b/node_modules/lines-and-columns/LICENSE
new file mode 100644
index 0000000..12978ec
--- /dev/null
+++ b/node_modules/lines-and-columns/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Brian Donovan
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/lines-and-columns/README.md b/node_modules/lines-and-columns/README.md
new file mode 100644
index 0000000..fa90223
--- /dev/null
+++ b/node_modules/lines-and-columns/README.md
@@ -0,0 +1,33 @@
+# lines-and-columns
+
+Maps lines and columns to character offsets and back. This is useful for parsers
+and other text processors that deal in character ranges but process text with
+meaningful lines and columns.
+
+## Install
+
+```
+$ npm install [--save] lines-and-columns
+```
+
+## Usage
+
+```js
+import { LinesAndColumns } from 'lines-and-columns'
+
+const lines = new LinesAndColumns(
+ `table {
+ border: 0
+}`
+)
+
+lines.locationForIndex(9)
+// { line: 1, column: 1 }
+
+lines.indexForLocation({ line: 1, column: 2 })
+// 10
+```
+
+## License
+
+MIT
diff --git a/node_modules/lines-and-columns/package.json b/node_modules/lines-and-columns/package.json
new file mode 100644
index 0000000..a12eb6b
--- /dev/null
+++ b/node_modules/lines-and-columns/package.json
@@ -0,0 +1,49 @@
+{
+ "name": "lines-and-columns",
+ "version": "1.2.4",
+ "description": "Maps lines and columns to character offsets and back.",
+ "keywords": [
+ "lines",
+ "columns",
+ "parser"
+ ],
+ "homepage": "https://github.com/eventualbuddha/lines-and-columns#readme",
+ "bugs": {
+ "url": "https://github.com/eventualbuddha/lines-and-columns/issues"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/eventualbuddha/lines-and-columns.git"
+ },
+ "license": "MIT",
+ "author": "Brian Donovan ",
+ "main": "./build/index.js",
+ "types": "./build/index.d.ts",
+ "files": [
+ "build"
+ ],
+ "scripts": {
+ "build:watch": "tsc --build tsconfig.build.json --watch",
+ "lint": "eslint .",
+ "lint:fix": "eslint . --fix",
+ "test": "is-ci test:coverage test:watch",
+ "test:coverage": "jest --coverage",
+ "test:watch": "jest --watch"
+ },
+ "devDependencies": {
+ "@types/jest": "^27.0.3",
+ "@types/node": "^16.11.9",
+ "@typescript-eslint/eslint-plugin": "^5.4.0",
+ "@typescript-eslint/parser": "^5.4.0",
+ "esbuild": "^0.13.15",
+ "esbuild-runner": "^2.2.1",
+ "eslint": "^8.2.0",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-prettier": "^4.0.0",
+ "is-ci-cli": "^2.2.0",
+ "jest": "^27.3.1",
+ "prettier": "^2.4.1",
+ "semantic-release": "^18.0.0",
+ "typescript": "^4.5.2"
+ }
+}
diff --git a/node_modules/lru-cache/LICENSE b/node_modules/lru-cache/LICENSE
new file mode 100644
index 0000000..f785757
--- /dev/null
+++ b/node_modules/lru-cache/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) 2010-2023 Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/lru-cache/README.md b/node_modules/lru-cache/README.md
new file mode 100644
index 0000000..931822f
--- /dev/null
+++ b/node_modules/lru-cache/README.md
@@ -0,0 +1,331 @@
+# lru-cache
+
+A cache object that deletes the least-recently-used items.
+
+Specify a max number of the most recently used items that you
+want to keep, and this cache will keep that many of the most
+recently accessed items.
+
+This is not primarily a TTL cache, and does not make strong TTL
+guarantees. There is no preemptive pruning of expired items by
+default, but you _may_ set a TTL on the cache or on a single
+`set`. If you do so, it will treat expired items as missing, and
+delete them when fetched. If you are more interested in TTL
+caching than LRU caching, check out
+[@isaacs/ttlcache](http://npm.im/@isaacs/ttlcache).
+
+As of version 7, this is one of the most performant LRU
+implementations available in JavaScript, and supports a wide
+diversity of use cases. However, note that using some of the
+features will necessarily impact performance, by causing the
+cache to have to do more work. See the "Performance" section
+below.
+
+## Installation
+
+```bash
+npm install lru-cache --save
+```
+
+## Usage
+
+```js
+// hybrid module, either works
+import { LRUCache } from 'lru-cache'
+// or:
+const { LRUCache } = require('lru-cache')
+// or in minified form for web browsers:
+import { LRUCache } from 'http://unpkg.com/lru-cache@9/dist/mjs/index.min.mjs'
+
+// At least one of 'max', 'ttl', or 'maxSize' is required, to prevent
+// unsafe unbounded storage.
+//
+// In most cases, it's best to specify a max for performance, so all
+// the required memory allocation is done up-front.
+//
+// All the other options are optional, see the sections below for
+// documentation on what each one does. Most of them can be
+// overridden for specific items in get()/set()
+const options = {
+ max: 500,
+
+ // for use with tracking overall storage size
+ maxSize: 5000,
+ sizeCalculation: (value, key) => {
+ return 1
+ },
+
+ // for use when you need to clean up something when objects
+ // are evicted from the cache
+ dispose: (value, key) => {
+ freeFromMemoryOrWhatever(value)
+ },
+
+ // how long to live in ms
+ ttl: 1000 * 60 * 5,
+
+ // return stale items before removing from cache?
+ allowStale: false,
+
+ updateAgeOnGet: false,
+ updateAgeOnHas: false,
+
+ // async method to use for cache.fetch(), for
+ // stale-while-revalidate type of behavior
+ fetchMethod: async (
+ key,
+ staleValue,
+ { options, signal, context }
+ ) => {},
+}
+
+const cache = new LRUCache(options)
+
+cache.set('key', 'value')
+cache.get('key') // "value"
+
+// non-string keys ARE fully supported
+// but note that it must be THE SAME object, not
+// just a JSON-equivalent object.
+var someObject = { a: 1 }
+cache.set(someObject, 'a value')
+// Object keys are not toString()-ed
+cache.set('[object Object]', 'a different value')
+assert.equal(cache.get(someObject), 'a value')
+// A similar object with same keys/values won't work,
+// because it's a different object identity
+assert.equal(cache.get({ a: 1 }), undefined)
+
+cache.clear() // empty the cache
+```
+
+If you put more stuff in the cache, then less recently used items
+will fall out. That's what an LRU cache is.
+
+For full description of the API and all options, please see [the
+LRUCache typedocs](https://isaacs.github.io/node-lru-cache/)
+
+## Storage Bounds Safety
+
+This implementation aims to be as flexible as possible, within
+the limits of safe memory consumption and optimal performance.
+
+At initial object creation, storage is allocated for `max` items.
+If `max` is set to zero, then some performance is lost, and item
+count is unbounded. Either `maxSize` or `ttl` _must_ be set if
+`max` is not specified.
+
+If `maxSize` is set, then this creates a safe limit on the
+maximum storage consumed, but without the performance benefits of
+pre-allocation. When `maxSize` is set, every item _must_ provide
+a size, either via the `sizeCalculation` method provided to the
+constructor, or via a `size` or `sizeCalculation` option provided
+to `cache.set()`. The size of every item _must_ be a positive
+integer.
+
+If neither `max` nor `maxSize` are set, then `ttl` tracking must
+be enabled. Note that, even when tracking item `ttl`, items are
+_not_ preemptively deleted when they become stale, unless
+`ttlAutopurge` is enabled. Instead, they are only purged the
+next time the key is requested. Thus, if `ttlAutopurge`, `max`,
+and `maxSize` are all not set, then the cache will potentially
+grow unbounded.
+
+In this case, a warning is printed to standard error. Future
+versions may require the use of `ttlAutopurge` if `max` and
+`maxSize` are not specified.
+
+If you truly wish to use a cache that is bound _only_ by TTL
+expiration, consider using a `Map` object, and calling
+`setTimeout` to delete entries when they expire. It will perform
+much better than an LRU cache.
+
+Here is an implementation you may use, under the same
+[license](./LICENSE) as this package:
+
+```js
+// a storage-unbounded ttl cache that is not an lru-cache
+const cache = {
+ data: new Map(),
+ timers: new Map(),
+ set: (k, v, ttl) => {
+ if (cache.timers.has(k)) {
+ clearTimeout(cache.timers.get(k))
+ }
+ cache.timers.set(
+ k,
+ setTimeout(() => cache.delete(k), ttl)
+ )
+ cache.data.set(k, v)
+ },
+ get: k => cache.data.get(k),
+ has: k => cache.data.has(k),
+ delete: k => {
+ if (cache.timers.has(k)) {
+ clearTimeout(cache.timers.get(k))
+ }
+ cache.timers.delete(k)
+ return cache.data.delete(k)
+ },
+ clear: () => {
+ cache.data.clear()
+ for (const v of cache.timers.values()) {
+ clearTimeout(v)
+ }
+ cache.timers.clear()
+ },
+}
+```
+
+If that isn't to your liking, check out
+[@isaacs/ttlcache](http://npm.im/@isaacs/ttlcache).
+
+## Storing Undefined Values
+
+This cache never stores undefined values, as `undefined` is used
+internally in a few places to indicate that a key is not in the
+cache.
+
+You may call `cache.set(key, undefined)`, but this is just
+an alias for `cache.delete(key)`. Note that this has the effect
+that `cache.has(key)` will return _false_ after setting it to
+undefined.
+
+```js
+cache.set(myKey, undefined)
+cache.has(myKey) // false!
+```
+
+If you need to track `undefined` values, and still note that the
+key is in the cache, an easy workaround is to use a sigil object
+of your own.
+
+```js
+import { LRUCache } from 'lru-cache'
+const undefinedValue = Symbol('undefined')
+const cache = new LRUCache(...)
+const mySet = (key, value) =>
+ cache.set(key, value === undefined ? undefinedValue : value)
+const myGet = (key, value) => {
+ const v = cache.get(key)
+ return v === undefinedValue ? undefined : v
+}
+```
+
+## Performance
+
+As of January 2022, version 7 of this library is one of the most
+performant LRU cache implementations in JavaScript.
+
+Benchmarks can be extremely difficult to get right. In
+particular, the performance of set/get/delete operations on
+objects will vary _wildly_ depending on the type of key used. V8
+is highly optimized for objects with keys that are short strings,
+especially integer numeric strings. Thus any benchmark which
+tests _solely_ using numbers as keys will tend to find that an
+object-based approach performs the best.
+
+Note that coercing _anything_ to strings to use as object keys is
+unsafe, unless you can be 100% certain that no other type of
+value will be used. For example:
+
+```js
+const myCache = {}
+const set = (k, v) => (myCache[k] = v)
+const get = k => myCache[k]
+
+set({}, 'please hang onto this for me')
+set('[object Object]', 'oopsie')
+```
+
+Also beware of "Just So" stories regarding performance. Garbage
+collection of large (especially: deep) object graphs can be
+incredibly costly, with several "tipping points" where it
+increases exponentially. As a result, putting that off until
+later can make it much worse, and less predictable. If a library
+performs well, but only in a scenario where the object graph is
+kept shallow, then that won't help you if you are using large
+objects as keys.
+
+In general, when attempting to use a library to improve
+performance (such as a cache like this one), it's best to choose
+an option that will perform well in the sorts of scenarios where
+you'll actually use it.
+
+This library is optimized for repeated gets and minimizing
+eviction time, since that is the expected need of a LRU. Set
+operations are somewhat slower on average than a few other
+options, in part because of that optimization. It is assumed
+that you'll be caching some costly operation, ideally as rarely
+as possible, so optimizing set over get would be unwise.
+
+If performance matters to you:
+
+1. If it's at all possible to use small integer values as keys,
+ and you can guarantee that no other types of values will be
+ used as keys, then do that, and use a cache such as
+ [lru-fast](https://npmjs.com/package/lru-fast), or
+ [mnemonist's
+ LRUCache](https://yomguithereal.github.io/mnemonist/lru-cache)
+ which uses an Object as its data store.
+
+2. Failing that, if at all possible, use short non-numeric
+ strings (ie, less than 256 characters) as your keys, and use
+ [mnemonist's
+ LRUCache](https://yomguithereal.github.io/mnemonist/lru-cache).
+
+3. If the types of your keys will be anything else, especially
+ long strings, strings that look like floats, objects, or some
+ mix of types, or if you aren't sure, then this library will
+ work well for you.
+
+ If you do not need the features that this library provides
+ (like asynchronous fetching, a variety of TTL staleness
+ options, and so on), then [mnemonist's
+ LRUMap](https://yomguithereal.github.io/mnemonist/lru-map) is
+ a very good option, and just slightly faster than this module
+ (since it does considerably less).
+
+4. Do not use a `dispose` function, size tracking, or especially
+ ttl behavior, unless absolutely needed. These features are
+ convenient, and necessary in some use cases, and every attempt
+ has been made to make the performance impact minimal, but it
+ isn't nothing.
+
+## Breaking Changes in Version 7
+
+This library changed to a different algorithm and internal data
+structure in version 7, yielding significantly better
+performance, albeit with some subtle changes as a result.
+
+If you were relying on the internals of LRUCache in version 6 or
+before, it probably will not work in version 7 and above.
+
+## Breaking Changes in Version 8
+
+- The `fetchContext` option was renamed to `context`, and may no
+ longer be set on the cache instance itself.
+- Rewritten in TypeScript, so pretty much all the types moved
+ around a lot.
+- The AbortController/AbortSignal polyfill was removed. For this
+ reason, **Node version 16.14.0 or higher is now required**.
+- Internal properties were moved to actual private class
+ properties.
+- Keys and values must not be `null` or `undefined`.
+- Minified export available at `'lru-cache/min'`, for both CJS
+ and MJS builds.
+
+## Breaking Changes in Version 9
+
+- Named export only, no default export.
+- AbortController polyfill returned, albeit with a warning when
+ used.
+
+## Breaking Changes in Version 10
+
+- `cache.fetch()` return type is now `Promise`
+ instead of `Promise`. This is an irrelevant change
+ practically speaking, but can require changes for TypeScript
+ users.
+
+For more info, see the [change log](CHANGELOG.md).
diff --git a/node_modules/lru-cache/package.json b/node_modules/lru-cache/package.json
new file mode 100644
index 0000000..f3cd4c0
--- /dev/null
+++ b/node_modules/lru-cache/package.json
@@ -0,0 +1,116 @@
+{
+ "name": "lru-cache",
+ "publishConfig": {
+ "tag": "legacy-v10"
+ },
+ "description": "A cache object that deletes the least-recently-used items.",
+ "version": "10.4.3",
+ "author": "Isaac Z. Schlueter ",
+ "keywords": [
+ "mru",
+ "lru",
+ "cache"
+ ],
+ "sideEffects": false,
+ "scripts": {
+ "build": "npm run prepare",
+ "prepare": "tshy && bash fixup.sh",
+ "pretest": "npm run prepare",
+ "presnap": "npm run prepare",
+ "test": "tap",
+ "snap": "tap",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "format": "prettier --write .",
+ "typedoc": "typedoc --tsconfig ./.tshy/esm.json ./src/*.ts",
+ "benchmark-results-typedoc": "bash scripts/benchmark-results-typedoc.sh",
+ "prebenchmark": "npm run prepare",
+ "benchmark": "make -C benchmark",
+ "preprofile": "npm run prepare",
+ "profile": "make -C benchmark profile"
+ },
+ "main": "./dist/commonjs/index.js",
+ "types": "./dist/commonjs/index.d.ts",
+ "tshy": {
+ "exports": {
+ ".": "./src/index.ts",
+ "./min": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.min.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.min.js"
+ }
+ }
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/node-lru-cache.git"
+ },
+ "devDependencies": {
+ "@types/node": "^20.2.5",
+ "@types/tap": "^15.0.6",
+ "benchmark": "^2.1.4",
+ "esbuild": "^0.17.11",
+ "eslint-config-prettier": "^8.5.0",
+ "marked": "^4.2.12",
+ "mkdirp": "^2.1.5",
+ "prettier": "^2.6.2",
+ "tap": "^20.0.3",
+ "tshy": "^2.0.0",
+ "tslib": "^2.4.0",
+ "typedoc": "^0.25.3",
+ "typescript": "^5.2.2"
+ },
+ "license": "ISC",
+ "files": [
+ "dist"
+ ],
+ "prettier": {
+ "semi": false,
+ "printWidth": 70,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf"
+ },
+ "tap": {
+ "node-arg": [
+ "--expose-gc"
+ ],
+ "plugin": [
+ "@tapjs/clock"
+ ]
+ },
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ },
+ "./min": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.min.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.min.js"
+ }
+ }
+ },
+ "type": "module",
+ "module": "./dist/esm/index.js"
+}
diff --git a/node_modules/merge2/LICENSE b/node_modules/merge2/LICENSE
new file mode 100644
index 0000000..31dd9c7
--- /dev/null
+++ b/node_modules/merge2/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2020 Teambition
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/merge2/README.md b/node_modules/merge2/README.md
new file mode 100644
index 0000000..27f8eb9
--- /dev/null
+++ b/node_modules/merge2/README.md
@@ -0,0 +1,144 @@
+# merge2
+
+Merge multiple streams into one stream in sequence or parallel.
+
+[![NPM version][npm-image]][npm-url]
+[![Build Status][travis-image]][travis-url]
+[![Downloads][downloads-image]][downloads-url]
+
+## Install
+
+Install with [npm](https://npmjs.org/package/merge2)
+
+```sh
+npm install merge2
+```
+
+## Usage
+
+```js
+const gulp = require('gulp')
+const merge2 = require('merge2')
+const concat = require('gulp-concat')
+const minifyHtml = require('gulp-minify-html')
+const ngtemplate = require('gulp-ngtemplate')
+
+gulp.task('app-js', function () {
+ return merge2(
+ gulp.src('static/src/tpl/*.html')
+ .pipe(minifyHtml({empty: true}))
+ .pipe(ngtemplate({
+ module: 'genTemplates',
+ standalone: true
+ })
+ ), gulp.src([
+ 'static/src/js/app.js',
+ 'static/src/js/locale_zh-cn.js',
+ 'static/src/js/router.js',
+ 'static/src/js/tools.js',
+ 'static/src/js/services.js',
+ 'static/src/js/filters.js',
+ 'static/src/js/directives.js',
+ 'static/src/js/controllers.js'
+ ])
+ )
+ .pipe(concat('app.js'))
+ .pipe(gulp.dest('static/dist/js/'))
+})
+```
+
+```js
+const stream = merge2([stream1, stream2], stream3, {end: false})
+//...
+stream.add(stream4, stream5)
+//..
+stream.end()
+```
+
+```js
+// equal to merge2([stream1, stream2], stream3)
+const stream = merge2()
+stream.add([stream1, stream2])
+stream.add(stream3)
+```
+
+```js
+// merge order:
+// 1. merge `stream1`;
+// 2. merge `stream2` and `stream3` in parallel after `stream1` merged;
+// 3. merge 'stream4' after `stream2` and `stream3` merged;
+const stream = merge2(stream1, [stream2, stream3], stream4)
+
+// merge order:
+// 1. merge `stream5` and `stream6` in parallel after `stream4` merged;
+// 2. merge 'stream7' after `stream5` and `stream6` merged;
+stream.add([stream5, stream6], stream7)
+```
+
+```js
+// nest merge
+// equal to merge2(stream1, stream2, stream6, stream3, [stream4, stream5]);
+const streamA = merge2(stream1, stream2)
+const streamB = merge2(stream3, [stream4, stream5])
+const stream = merge2(streamA, streamB)
+streamA.add(stream6)
+```
+
+## API
+
+```js
+const merge2 = require('merge2')
+```
+
+### merge2()
+
+### merge2(options)
+
+### merge2(stream1, stream2, ..., streamN)
+
+### merge2(stream1, stream2, ..., streamN, options)
+
+### merge2(stream1, [stream2, stream3, ...], streamN, options)
+
+return a duplex stream (mergedStream). streams in array will be merged in parallel.
+
+### mergedStream.add(stream)
+
+### mergedStream.add(stream1, [stream2, stream3, ...], ...)
+
+return the mergedStream.
+
+### mergedStream.on('queueDrain', function() {})
+
+It will emit 'queueDrain' when all streams merged. If you set `end === false` in options, this event give you a notice that should add more streams to merge or end the mergedStream.
+
+#### stream
+
+*option*
+Type: `Readable` or `Duplex` or `Transform` stream.
+
+#### options
+
+*option*
+Type: `Object`.
+
+* **end** - `Boolean` - if `end === false` then mergedStream will not be auto ended, you should end by yourself. **Default:** `undefined`
+
+* **pipeError** - `Boolean` - if `pipeError === true` then mergedStream will emit `error` event from source streams. **Default:** `undefined`
+
+* **objectMode** - `Boolean` . **Default:** `true`
+
+`objectMode` and other options(`highWaterMark`, `defaultEncoding` ...) is same as Node.js `Stream`.
+
+## License
+
+MIT © [Teambition](https://www.teambition.com)
+
+[npm-url]: https://npmjs.org/package/merge2
+[npm-image]: http://img.shields.io/npm/v/merge2.svg
+
+[travis-url]: https://travis-ci.org/teambition/merge2
+[travis-image]: http://img.shields.io/travis/teambition/merge2.svg
+
+[downloads-url]: https://npmjs.org/package/merge2
+[downloads-image]: http://img.shields.io/npm/dm/merge2.svg?style=flat-square
diff --git a/node_modules/merge2/index.js b/node_modules/merge2/index.js
new file mode 100644
index 0000000..78a61ed
--- /dev/null
+++ b/node_modules/merge2/index.js
@@ -0,0 +1,144 @@
+'use strict'
+/*
+ * merge2
+ * https://github.com/teambition/merge2
+ *
+ * Copyright (c) 2014-2020 Teambition
+ * Licensed under the MIT license.
+ */
+const Stream = require('stream')
+const PassThrough = Stream.PassThrough
+const slice = Array.prototype.slice
+
+module.exports = merge2
+
+function merge2 () {
+ const streamsQueue = []
+ const args = slice.call(arguments)
+ let merging = false
+ let options = args[args.length - 1]
+
+ if (options && !Array.isArray(options) && options.pipe == null) {
+ args.pop()
+ } else {
+ options = {}
+ }
+
+ const doEnd = options.end !== false
+ const doPipeError = options.pipeError === true
+ if (options.objectMode == null) {
+ options.objectMode = true
+ }
+ if (options.highWaterMark == null) {
+ options.highWaterMark = 64 * 1024
+ }
+ const mergedStream = PassThrough(options)
+
+ function addStream () {
+ for (let i = 0, len = arguments.length; i < len; i++) {
+ streamsQueue.push(pauseStreams(arguments[i], options))
+ }
+ mergeStream()
+ return this
+ }
+
+ function mergeStream () {
+ if (merging) {
+ return
+ }
+ merging = true
+
+ let streams = streamsQueue.shift()
+ if (!streams) {
+ process.nextTick(endStream)
+ return
+ }
+ if (!Array.isArray(streams)) {
+ streams = [streams]
+ }
+
+ let pipesCount = streams.length + 1
+
+ function next () {
+ if (--pipesCount > 0) {
+ return
+ }
+ merging = false
+ mergeStream()
+ }
+
+ function pipe (stream) {
+ function onend () {
+ stream.removeListener('merge2UnpipeEnd', onend)
+ stream.removeListener('end', onend)
+ if (doPipeError) {
+ stream.removeListener('error', onerror)
+ }
+ next()
+ }
+ function onerror (err) {
+ mergedStream.emit('error', err)
+ }
+ // skip ended stream
+ if (stream._readableState.endEmitted) {
+ return next()
+ }
+
+ stream.on('merge2UnpipeEnd', onend)
+ stream.on('end', onend)
+
+ if (doPipeError) {
+ stream.on('error', onerror)
+ }
+
+ stream.pipe(mergedStream, { end: false })
+ // compatible for old stream
+ stream.resume()
+ }
+
+ for (let i = 0; i < streams.length; i++) {
+ pipe(streams[i])
+ }
+
+ next()
+ }
+
+ function endStream () {
+ merging = false
+ // emit 'queueDrain' when all streams merged.
+ mergedStream.emit('queueDrain')
+ if (doEnd) {
+ mergedStream.end()
+ }
+ }
+
+ mergedStream.setMaxListeners(0)
+ mergedStream.add = addStream
+ mergedStream.on('unpipe', function (stream) {
+ stream.emit('merge2UnpipeEnd')
+ })
+
+ if (args.length) {
+ addStream.apply(null, args)
+ }
+ return mergedStream
+}
+
+// check and pause streams for pipe.
+function pauseStreams (streams, options) {
+ if (!Array.isArray(streams)) {
+ // Backwards-compat with old-style streams
+ if (!streams._readableState && streams.pipe) {
+ streams = streams.pipe(PassThrough(options))
+ }
+ if (!streams._readableState || !streams.pause || !streams.pipe) {
+ throw new Error('Only readable stream can be merged.')
+ }
+ streams.pause()
+ } else {
+ for (let i = 0, len = streams.length; i < len; i++) {
+ streams[i] = pauseStreams(streams[i], options)
+ }
+ }
+ return streams
+}
diff --git a/node_modules/merge2/package.json b/node_modules/merge2/package.json
new file mode 100644
index 0000000..7777307
--- /dev/null
+++ b/node_modules/merge2/package.json
@@ -0,0 +1,43 @@
+{
+ "name": "merge2",
+ "description": "Merge multiple streams into one stream in sequence or parallel.",
+ "authors": [
+ "Yan Qing "
+ ],
+ "license": "MIT",
+ "version": "1.4.1",
+ "main": "./index.js",
+ "repository": {
+ "type": "git",
+ "url": "git@github.com:teambition/merge2.git"
+ },
+ "homepage": "https://github.com/teambition/merge2",
+ "keywords": [
+ "merge2",
+ "multiple",
+ "sequence",
+ "parallel",
+ "merge",
+ "stream",
+ "merge stream",
+ "sync"
+ ],
+ "engines": {
+ "node": ">= 8"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "standard": "^14.3.4",
+ "through2": "^3.0.1",
+ "thunks": "^4.9.6",
+ "tman": "^1.10.0",
+ "to-through": "^2.0.0"
+ },
+ "scripts": {
+ "test": "standard && tman"
+ },
+ "files": [
+ "README.md",
+ "index.js"
+ ]
+}
diff --git a/node_modules/micromatch/LICENSE b/node_modules/micromatch/LICENSE
new file mode 100644
index 0000000..9af4a67
--- /dev/null
+++ b/node_modules/micromatch/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-present, Jon Schlinkert.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/micromatch/README.md b/node_modules/micromatch/README.md
new file mode 100644
index 0000000..d72a059
--- /dev/null
+++ b/node_modules/micromatch/README.md
@@ -0,0 +1,1024 @@
+# micromatch [](https://www.npmjs.com/package/micromatch) [](https://npmjs.org/package/micromatch) [](https://npmjs.org/package/micromatch) [](https://github.com/micromatch/micromatch/actions/workflows/test.yml)
+
+> Glob matching for javascript/node.js. A replacement and faster alternative to minimatch and multimatch.
+
+Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
+
+## Table of Contents
+
+
+Details
+
+ * [Install](#install)
+- [Sponsors](#sponsors)
+ * [Gold Sponsors](#gold-sponsors)
+ * [Quickstart](#quickstart)
+ * [Why use micromatch?](#why-use-micromatch)
+ + [Matching features](#matching-features)
+ * [Switching to micromatch](#switching-to-micromatch)
+ + [From minimatch](#from-minimatch)
+ + [From multimatch](#from-multimatch)
+ * [API](#api)
+ * [Options](#options)
+ * [Options Examples](#options-examples)
+ + [options.basename](#optionsbasename)
+ + [options.bash](#optionsbash)
+ + [options.expandRange](#optionsexpandrange)
+ + [options.format](#optionsformat)
+ + [options.ignore](#optionsignore)
+ + [options.matchBase](#optionsmatchbase)
+ + [options.noextglob](#optionsnoextglob)
+ + [options.nonegate](#optionsnonegate)
+ + [options.noglobstar](#optionsnoglobstar)
+ + [options.nonull](#optionsnonull)
+ + [options.nullglob](#optionsnullglob)
+ + [options.onIgnore](#optionsonignore)
+ + [options.onMatch](#optionsonmatch)
+ + [options.onResult](#optionsonresult)
+ + [options.posixSlashes](#optionsposixslashes)
+ + [options.unescape](#optionsunescape)
+ * [Extended globbing](#extended-globbing)
+ + [Extglobs](#extglobs)
+ + [Braces](#braces)
+ + [Regex character classes](#regex-character-classes)
+ + [Regex groups](#regex-groups)
+ + [POSIX bracket expressions](#posix-bracket-expressions)
+ * [Notes](#notes)
+ + [Bash 4.3 parity](#bash-43-parity)
+ + [Backslashes](#backslashes)
+ * [Benchmarks](#benchmarks)
+ + [Running benchmarks](#running-benchmarks)
+ + [Latest results](#latest-results)
+ * [Contributing](#contributing)
+ * [About](#about)
+
+
+
+## Install
+
+Install with [npm](https://www.npmjs.com/):
+
+```sh
+$ npm install --save micromatch
+```
+
+
+
+# Sponsors
+
+[Become a Sponsor](https://github.com/sponsors/jonschlinkert) to add your logo to this README, or any of [my other projects](https://github.com/jonschlinkert?tab=repositories&q=&type=&language=&sort=stargazers)
+
+
+
+## Quickstart
+
+```js
+const micromatch = require('micromatch');
+// micromatch(list, patterns[, options]);
+```
+
+The [main export](#micromatch) takes a list of strings and one or more glob patterns:
+
+```js
+console.log(micromatch(['foo', 'bar', 'baz', 'qux'], ['f*', 'b*'])) //=> ['foo', 'bar', 'baz']
+console.log(micromatch(['foo', 'bar', 'baz', 'qux'], ['*', '!b*'])) //=> ['foo', 'qux']
+```
+
+Use [.isMatch()](#ismatch) to for boolean matching:
+
+```js
+console.log(micromatch.isMatch('foo', 'f*')) //=> true
+console.log(micromatch.isMatch('foo', ['b*', 'f*'])) //=> true
+```
+
+[Switching](#switching-to-micromatch) from minimatch and multimatch is easy!
+
+
+
+## Why use micromatch?
+
+> micromatch is a [replacement](#switching-to-micromatch) for minimatch and multimatch
+
+* Supports all of the same matching features as [minimatch](https://github.com/isaacs/minimatch) and [multimatch](https://github.com/sindresorhus/multimatch)
+* More complete support for the Bash 4.3 specification than minimatch and multimatch. Micromatch passes _all of the spec tests_ from bash, including some that bash still fails.
+* **Fast & Performant** - Loads in about 5ms and performs [fast matches](#benchmarks).
+* **Glob matching** - Using wildcards (`*` and `?`), globstars (`**`) for nested directories
+* **[Advanced globbing](#extended-globbing)** - Supports [extglobs](#extglobs), [braces](#braces-1), and [POSIX brackets](#posix-bracket-expressions), and support for escaping special characters with `\` or quotes.
+* **Accurate** - Covers more scenarios [than minimatch](https://github.com/yarnpkg/yarn/pull/3339)
+* **Well tested** - More than 5,000 [test assertions](./test)
+* **Windows support** - More reliable windows support than minimatch and multimatch.
+* **[Safe](https://github.com/micromatch/braces#braces-is-safe)** - Micromatch is not subject to DoS with brace patterns like minimatch and multimatch.
+
+### Matching features
+
+* Support for multiple glob patterns (no need for wrappers like multimatch)
+* Wildcards (`**`, `*.js`)
+* Negation (`'!a/*.js'`, `'*!(b).js'`)
+* [extglobs](#extglobs) (`+(x|y)`, `!(a|b)`)
+* [POSIX character classes](#posix-bracket-expressions) (`[[:alpha:][:digit:]]`)
+* [brace expansion](https://github.com/micromatch/braces) (`foo/{1..5}.md`, `bar/{a,b,c}.js`)
+* regex character classes (`foo-[1-5].js`)
+* regex logical "or" (`foo/(abc|xyz).js`)
+
+You can mix and match these features to create whatever patterns you need!
+
+## Switching to micromatch
+
+_(There is one notable difference between micromatch and minimatch in regards to how backslashes are handled. See [the notes about backslashes](#backslashes) for more information.)_
+
+### From minimatch
+
+Use [micromatch.isMatch()](#ismatch) instead of `minimatch()`:
+
+```js
+console.log(micromatch.isMatch('foo', 'b*')); //=> false
+```
+
+Use [micromatch.match()](#match) instead of `minimatch.match()`:
+
+```js
+console.log(micromatch.match(['foo', 'bar'], 'b*')); //=> 'bar'
+```
+
+### From multimatch
+
+Same signature:
+
+```js
+console.log(micromatch(['foo', 'bar', 'baz'], ['f*', '*z'])); //=> ['foo', 'baz']
+```
+
+## API
+
+**Params**
+
+* `list` **{String|Array}**: List of strings to match.
+* `patterns` **{String|Array}**: One or more glob patterns to use for matching.
+* `options` **{Object}**: See available [options](#options)
+* `returns` **{Array}**: Returns an array of matches
+
+**Example**
+
+```js
+const mm = require('micromatch');
+// mm(list, patterns[, options]);
+
+console.log(mm(['a.js', 'a.txt'], ['*.js']));
+//=> [ 'a.js' ]
+```
+
+### [.matcher](index.js#L109)
+
+Returns a matcher function from the given glob `pattern` and `options`. The returned function takes a string to match as its only argument and returns true if the string is a match.
+
+**Params**
+
+* `pattern` **{String}**: Glob pattern
+* `options` **{Object}**
+* `returns` **{Function}**: Returns a matcher function.
+
+**Example**
+
+```js
+const mm = require('micromatch');
+// mm.matcher(pattern[, options]);
+
+const isMatch = mm.matcher('*.!(*a)');
+console.log(isMatch('a.a')); //=> false
+console.log(isMatch('a.b')); //=> true
+```
+
+### [.isMatch](index.js#L128)
+
+Returns true if **any** of the given glob `patterns` match the specified `string`.
+
+**Params**
+
+* `str` **{String}**: The string to test.
+* `patterns` **{String|Array}**: One or more glob patterns to use for matching.
+* `[options]` **{Object}**: See available [options](#options).
+* `returns` **{Boolean}**: Returns true if any patterns match `str`
+
+**Example**
+
+```js
+const mm = require('micromatch');
+// mm.isMatch(string, patterns[, options]);
+
+console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true
+console.log(mm.isMatch('a.a', 'b.*')); //=> false
+```
+
+### [.not](index.js#L153)
+
+Returns a list of strings that _**do not match any**_ of the given `patterns`.
+
+**Params**
+
+* `list` **{Array}**: Array of strings to match.
+* `patterns` **{String|Array}**: One or more glob pattern to use for matching.
+* `options` **{Object}**: See available [options](#options) for changing how matches are performed
+* `returns` **{Array}**: Returns an array of strings that **do not match** the given patterns.
+
+**Example**
+
+```js
+const mm = require('micromatch');
+// mm.not(list, patterns[, options]);
+
+console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a'));
+//=> ['b.b', 'c.c']
+```
+
+### [.contains](index.js#L193)
+
+Returns true if the given `string` contains the given pattern. Similar to [.isMatch](#isMatch) but the pattern can match any part of the string.
+
+**Params**
+
+* `str` **{String}**: The string to match.
+* `patterns` **{String|Array}**: Glob pattern to use for matching.
+* `options` **{Object}**: See available [options](#options) for changing how matches are performed
+* `returns` **{Boolean}**: Returns true if any of the patterns matches any part of `str`.
+
+**Example**
+
+```js
+var mm = require('micromatch');
+// mm.contains(string, pattern[, options]);
+
+console.log(mm.contains('aa/bb/cc', '*b'));
+//=> true
+console.log(mm.contains('aa/bb/cc', '*d'));
+//=> false
+```
+
+### [.matchKeys](index.js#L235)
+
+Filter the keys of the given object with the given `glob` pattern and `options`. Does not attempt to match nested keys. If you need this feature, use [glob-object](https://github.com/jonschlinkert/glob-object) instead.
+
+**Params**
+
+* `object` **{Object}**: The object with keys to filter.
+* `patterns` **{String|Array}**: One or more glob patterns to use for matching.
+* `options` **{Object}**: See available [options](#options) for changing how matches are performed
+* `returns` **{Object}**: Returns an object with only keys that match the given patterns.
+
+**Example**
+
+```js
+const mm = require('micromatch');
+// mm.matchKeys(object, patterns[, options]);
+
+const obj = { aa: 'a', ab: 'b', ac: 'c' };
+console.log(mm.matchKeys(obj, '*b'));
+//=> { ab: 'b' }
+```
+
+### [.some](index.js#L264)
+
+Returns true if some of the strings in the given `list` match any of the given glob `patterns`.
+
+**Params**
+
+* `list` **{String|Array}**: The string or array of strings to test. Returns as soon as the first match is found.
+* `patterns` **{String|Array}**: One or more glob patterns to use for matching.
+* `options` **{Object}**: See available [options](#options) for changing how matches are performed
+* `returns` **{Boolean}**: Returns true if any `patterns` matches any of the strings in `list`
+
+**Example**
+
+```js
+const mm = require('micromatch');
+// mm.some(list, patterns[, options]);
+
+console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js']));
+// true
+console.log(mm.some(['foo.js'], ['*.js', '!foo.js']));
+// false
+```
+
+### [.every](index.js#L300)
+
+Returns true if every string in the given `list` matches any of the given glob `patterns`.
+
+**Params**
+
+* `list` **{String|Array}**: The string or array of strings to test.
+* `patterns` **{String|Array}**: One or more glob patterns to use for matching.
+* `options` **{Object}**: See available [options](#options) for changing how matches are performed
+* `returns` **{Boolean}**: Returns true if all `patterns` matches all of the strings in `list`
+
+**Example**
+
+```js
+const mm = require('micromatch');
+// mm.every(list, patterns[, options]);
+
+console.log(mm.every('foo.js', ['foo.js']));
+// true
+console.log(mm.every(['foo.js', 'bar.js'], ['*.js']));
+// true
+console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js']));
+// false
+console.log(mm.every(['foo.js'], ['*.js', '!foo.js']));
+// false
+```
+
+### [.all](index.js#L339)
+
+Returns true if **all** of the given `patterns` match the specified string.
+
+**Params**
+
+* `str` **{String|Array}**: The string to test.
+* `patterns` **{String|Array}**: One or more glob patterns to use for matching.
+* `options` **{Object}**: See available [options](#options) for changing how matches are performed
+* `returns` **{Boolean}**: Returns true if any patterns match `str`
+
+**Example**
+
+```js
+const mm = require('micromatch');
+// mm.all(string, patterns[, options]);
+
+console.log(mm.all('foo.js', ['foo.js']));
+// true
+
+console.log(mm.all('foo.js', ['*.js', '!foo.js']));
+// false
+
+console.log(mm.all('foo.js', ['*.js', 'foo.js']));
+// true
+
+console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js']));
+// true
+```
+
+### [.capture](index.js#L366)
+
+Returns an array of matches captured by `pattern` in `string, or`null` if the pattern did not match.
+
+**Params**
+
+* `glob` **{String}**: Glob pattern to use for matching.
+* `input` **{String}**: String to match
+* `options` **{Object}**: See available [options](#options) for changing how matches are performed
+* `returns` **{Array|null}**: Returns an array of captures if the input matches the glob pattern, otherwise `null`.
+
+**Example**
+
+```js
+const mm = require('micromatch');
+// mm.capture(pattern, string[, options]);
+
+console.log(mm.capture('test/*.js', 'test/foo.js'));
+//=> ['foo']
+console.log(mm.capture('test/*.js', 'foo/bar.css'));
+//=> null
+```
+
+### [.makeRe](index.js#L392)
+
+Create a regular expression from the given glob `pattern`.
+
+**Params**
+
+* `pattern` **{String}**: A glob pattern to convert to regex.
+* `options` **{Object}**
+* `returns` **{RegExp}**: Returns a regex created from the given pattern.
+
+**Example**
+
+```js
+const mm = require('micromatch');
+// mm.makeRe(pattern[, options]);
+
+console.log(mm.makeRe('*.js'));
+//=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/
+```
+
+### [.scan](index.js#L408)
+
+Scan a glob pattern to separate the pattern into segments. Used by the [split](#split) method.
+
+**Params**
+
+* `pattern` **{String}**
+* `options` **{Object}**
+* `returns` **{Object}**: Returns an object with
+
+**Example**
+
+```js
+const mm = require('micromatch');
+const state = mm.scan(pattern[, options]);
+```
+
+### [.parse](index.js#L424)
+
+Parse a glob pattern to create the source string for a regular expression.
+
+**Params**
+
+* `glob` **{String}**
+* `options` **{Object}**
+* `returns` **{Object}**: Returns an object with useful properties and output to be used as regex source string.
+
+**Example**
+
+```js
+const mm = require('micromatch');
+const state = mm.parse(pattern[, options]);
+```
+
+### [.braces](index.js#L451)
+
+Process the given brace `pattern`.
+
+**Params**
+
+* `pattern` **{String}**: String with brace pattern to process.
+* `options` **{Object}**: Any [options](#options) to change how expansion is performed. See the [braces](https://github.com/micromatch/braces) library for all available options.
+* `returns` **{Array}**
+
+**Example**
+
+```js
+const { braces } = require('micromatch');
+console.log(braces('foo/{a,b,c}/bar'));
+//=> [ 'foo/(a|b|c)/bar' ]
+
+console.log(braces('foo/{a,b,c}/bar', { expand: true }));
+//=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ]
+```
+
+## Options
+
+| **Option** | **Type** | **Default value** | **Description** |
+| --- | --- | --- | --- |
+| `basename` | `boolean` | `false` | If set, then patterns without slashes will be matched against the basename of the path if it contains slashes. For example, `a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. |
+| `bash` | `boolean` | `false` | Follow bash matching rules more strictly - disallows backslashes as escape characters, and treats single stars as globstars (`**`). |
+| `capture` | `boolean` | `undefined` | Return regex matches in supporting methods. |
+| `contains` | `boolean` | `undefined` | Allows glob to match any part of the given string(s). |
+| `cwd` | `string` | `process.cwd()` | Current working directory. Used by `picomatch.split()` |
+| `debug` | `boolean` | `undefined` | Debug regular expressions when an error is thrown. |
+| `dot` | `boolean` | `false` | Match dotfiles. Otherwise dotfiles are ignored unless a `.` is explicitly defined in the pattern. |
+| `expandRange` | `function` | `undefined` | Custom function for expanding ranges in brace patterns, such as `{a..z}`. The function receives the range values as two arguments, and it must return a string to be used in the generated regex. It's recommended that returned strings be wrapped in parentheses. This option is overridden by the `expandBrace` option. |
+| `failglob` | `boolean` | `false` | Similar to the `failglob` behavior in Bash, throws an error when no matches are found. Based on the bash option of the same name. |
+| `fastpaths` | `boolean` | `true` | To speed up processing, full parsing is skipped for a handful common glob patterns. Disable this behavior by setting this option to `false`. |
+| `flags` | `boolean` | `undefined` | Regex flags to use in the generated regex. If defined, the `nocase` option will be overridden. |
+| [format](#optionsformat) | `function` | `undefined` | Custom function for formatting the returned string. This is useful for removing leading slashes, converting Windows paths to Posix paths, etc. |
+| `ignore` | `array\|string` | `undefined` | One or more glob patterns for excluding strings that should not be matched from the result. |
+| `keepQuotes` | `boolean` | `false` | Retain quotes in the generated regex, since quotes may also be used as an alternative to backslashes. |
+| `literalBrackets` | `boolean` | `undefined` | When `true`, brackets in the glob pattern will be escaped so that only literal brackets will be matched. |
+| `lookbehinds` | `boolean` | `true` | Support regex positive and negative lookbehinds. Note that you must be using Node 8.1.10 or higher to enable regex lookbehinds. |
+| `matchBase` | `boolean` | `false` | Alias for `basename` |
+| `maxLength` | `boolean` | `65536` | Limit the max length of the input string. An error is thrown if the input string is longer than this value. |
+| `nobrace` | `boolean` | `false` | Disable brace matching, so that `{a,b}` and `{1..3}` would be treated as literal characters. |
+| `nobracket` | `boolean` | `undefined` | Disable matching with regex brackets. |
+| `nocase` | `boolean` | `false` | Perform case-insensitive matching. Equivalent to the regex `i` flag. Note that this option is ignored when the `flags` option is defined. |
+| `nodupes` | `boolean` | `true` | Deprecated, use `nounique` instead. This option will be removed in a future major release. By default duplicates are removed. Disable uniquification by setting this option to false. |
+| `noext` | `boolean` | `false` | Alias for `noextglob` |
+| `noextglob` | `boolean` | `false` | Disable support for matching with [extglobs](#extglobs) (like `+(a\|b)`) |
+| `noglobstar` | `boolean` | `false` | Disable support for matching nested directories with globstars (`**`) |
+| `nonegate` | `boolean` | `false` | Disable support for negating with leading `!` |
+| `noquantifiers` | `boolean` | `false` | Disable support for regex quantifiers (like `a{1,2}`) and treat them as brace patterns to be expanded. |
+| [onIgnore](#optionsonIgnore) | `function` | `undefined` | Function to be called on ignored items. |
+| [onMatch](#optionsonMatch) | `function` | `undefined` | Function to be called on matched items. |
+| [onResult](#optionsonResult) | `function` | `undefined` | Function to be called on all items, regardless of whether or not they are matched or ignored. |
+| `posix` | `boolean` | `false` | Support [POSIX character classes](#posix-bracket-expressions) ("posix brackets"). |
+| `posixSlashes` | `boolean` | `undefined` | Convert all slashes in file paths to forward slashes. This does not convert slashes in the glob pattern itself |
+| `prepend` | `string` | `undefined` | String to prepend to the generated regex used for matching. |
+| `regex` | `boolean` | `false` | Use regular expression rules for `+` (instead of matching literal `+`), and for stars that follow closing parentheses or brackets (as in `)*` and `]*`). |
+| `strictBrackets` | `boolean` | `undefined` | Throw an error if brackets, braces, or parens are imbalanced. |
+| `strictSlashes` | `boolean` | `undefined` | When true, picomatch won't match trailing slashes with single stars. |
+| `unescape` | `boolean` | `undefined` | Remove preceding backslashes from escaped glob characters before creating the regular expression to perform matches. |
+| `unixify` | `boolean` | `undefined` | Alias for `posixSlashes`, for backwards compatitibility. |
+
+## Options Examples
+
+### options.basename
+
+Allow glob patterns without slashes to match a file path based on its basename. Same behavior as [minimatch](https://github.com/isaacs/minimatch) option `matchBase`.
+
+**Type**: `Boolean`
+
+**Default**: `false`
+
+**Example**
+
+```js
+micromatch(['a/b.js', 'a/c.md'], '*.js');
+//=> []
+
+micromatch(['a/b.js', 'a/c.md'], '*.js', { basename: true });
+//=> ['a/b.js']
+```
+
+### options.bash
+
+Enabled by default, this option enforces bash-like behavior with stars immediately following a bracket expression. Bash bracket expressions are similar to regex character classes, but unlike regex, a star following a bracket expression **does not repeat the bracketed characters**. Instead, the star is treated the same as any other star.
+
+**Type**: `Boolean`
+
+**Default**: `true`
+
+**Example**
+
+```js
+const files = ['abc', 'ajz'];
+console.log(micromatch(files, '[a-c]*'));
+//=> ['abc', 'ajz']
+
+console.log(micromatch(files, '[a-c]*', { bash: false }));
+```
+
+### options.expandRange
+
+**Type**: `function`
+
+**Default**: `undefined`
+
+Custom function for expanding ranges in brace patterns. The [fill-range](https://github.com/jonschlinkert/fill-range) library is ideal for this purpose, or you can use custom code to do whatever you need.
+
+**Example**
+
+The following example shows how to create a glob that matches a numeric folder name between `01` and `25`, with leading zeros.
+
+```js
+const fill = require('fill-range');
+const regex = micromatch.makeRe('foo/{01..25}/bar', {
+ expandRange(a, b) {
+ return `(${fill(a, b, { toRegex: true })})`;
+ }
+});
+
+console.log(regex)
+//=> /^(?:foo\/((?:0[1-9]|1[0-9]|2[0-5]))\/bar)$/
+
+console.log(regex.test('foo/00/bar')) // false
+console.log(regex.test('foo/01/bar')) // true
+console.log(regex.test('foo/10/bar')) // true
+console.log(regex.test('foo/22/bar')) // true
+console.log(regex.test('foo/25/bar')) // true
+console.log(regex.test('foo/26/bar')) // false
+```
+
+### options.format
+
+**Type**: `function`
+
+**Default**: `undefined`
+
+Custom function for formatting strings before they're matched.
+
+**Example**
+
+```js
+// strip leading './' from strings
+const format = str => str.replace(/^\.\//, '');
+const isMatch = picomatch('foo/*.js', { format });
+console.log(isMatch('./foo/bar.js')) //=> true
+```
+
+### options.ignore
+
+String or array of glob patterns to match files to ignore.
+
+**Type**: `String|Array`
+
+**Default**: `undefined`
+
+```js
+const isMatch = micromatch.matcher('*', { ignore: 'f*' });
+console.log(isMatch('foo')) //=> false
+console.log(isMatch('bar')) //=> true
+console.log(isMatch('baz')) //=> true
+```
+
+### options.matchBase
+
+Alias for [options.basename](#options-basename).
+
+### options.noextglob
+
+Disable extglob support, so that [extglobs](#extglobs) are regarded as literal characters.
+
+**Type**: `Boolean`
+
+**Default**: `undefined`
+
+**Examples**
+
+```js
+console.log(micromatch(['a/z', 'a/b', 'a/!(z)'], 'a/!(z)'));
+//=> ['a/b', 'a/!(z)']
+
+console.log(micromatch(['a/z', 'a/b', 'a/!(z)'], 'a/!(z)', { noextglob: true }));
+//=> ['a/!(z)'] (matches only as literal characters)
+```
+
+### options.nonegate
+
+Disallow negation (`!`) patterns, and treat leading `!` as a literal character to match.
+
+**Type**: `Boolean`
+
+**Default**: `undefined`
+
+### options.noglobstar
+
+Disable matching with globstars (`**`).
+
+**Type**: `Boolean`
+
+**Default**: `undefined`
+
+```js
+micromatch(['a/b', 'a/b/c', 'a/b/c/d'], 'a/**');
+//=> ['a/b', 'a/b/c', 'a/b/c/d']
+
+micromatch(['a/b', 'a/b/c', 'a/b/c/d'], 'a/**', {noglobstar: true});
+//=> ['a/b']
+```
+
+### options.nonull
+
+Alias for [options.nullglob](#options-nullglob).
+
+### options.nullglob
+
+If `true`, when no matches are found the actual (arrayified) glob pattern is returned instead of an empty array. Same behavior as [minimatch](https://github.com/isaacs/minimatch) option `nonull`.
+
+**Type**: `Boolean`
+
+**Default**: `undefined`
+
+### options.onIgnore
+
+```js
+const onIgnore = ({ glob, regex, input, output }) => {
+ console.log({ glob, regex, input, output });
+ // { glob: '*', regex: /^(?:(?!\.)(?=.)[^\/]*?\/?)$/, input: 'foo', output: 'foo' }
+};
+
+const isMatch = micromatch.matcher('*', { onIgnore, ignore: 'f*' });
+isMatch('foo');
+isMatch('bar');
+isMatch('baz');
+```
+
+### options.onMatch
+
+```js
+const onMatch = ({ glob, regex, input, output }) => {
+ console.log({ input, output });
+ // { input: 'some\\path', output: 'some/path' }
+ // { input: 'some\\path', output: 'some/path' }
+ // { input: 'some\\path', output: 'some/path' }
+};
+
+const isMatch = micromatch.matcher('**', { onMatch, posixSlashes: true });
+isMatch('some\\path');
+isMatch('some\\path');
+isMatch('some\\path');
+```
+
+### options.onResult
+
+```js
+const onResult = ({ glob, regex, input, output }) => {
+ console.log({ glob, regex, input, output });
+};
+
+const isMatch = micromatch('*', { onResult, ignore: 'f*' });
+isMatch('foo');
+isMatch('bar');
+isMatch('baz');
+```
+
+### options.posixSlashes
+
+Convert path separators on returned files to posix/unix-style forward slashes. Aliased as `unixify` for backwards compatibility.
+
+**Type**: `Boolean`
+
+**Default**: `true` on windows, `false` everywhere else.
+
+**Example**
+
+```js
+console.log(micromatch.match(['a\\b\\c'], 'a/**'));
+//=> ['a/b/c']
+
+console.log(micromatch.match(['a\\b\\c'], { posixSlashes: false }));
+//=> ['a\\b\\c']
+```
+
+### options.unescape
+
+Remove backslashes from escaped glob characters before creating the regular expression to perform matches.
+
+**Type**: `Boolean`
+
+**Default**: `undefined`
+
+**Example**
+
+In this example we want to match a literal `*`:
+
+```js
+console.log(micromatch.match(['abc', 'a\\*c'], 'a\\*c'));
+//=> ['a\\*c']
+
+console.log(micromatch.match(['abc', 'a\\*c'], 'a\\*c', { unescape: true }));
+//=> ['a*c']
+```
+
+
+
+
+## Extended globbing
+
+Micromatch supports the following extended globbing features.
+
+### Extglobs
+
+Extended globbing, as described by the bash man page:
+
+| **pattern** | **regex equivalent** | **description** |
+| --- | --- | --- |
+| `?(pattern)` | `(pattern)?` | Matches zero or one occurrence of the given patterns |
+| `*(pattern)` | `(pattern)*` | Matches zero or more occurrences of the given patterns |
+| `+(pattern)` | `(pattern)+` | Matches one or more occurrences of the given patterns |
+| `@(pattern)` | `(pattern)` * | Matches one of the given patterns |
+| `!(pattern)` | N/A (equivalent regex is much more complicated) | Matches anything except one of the given patterns |
+
+* Note that `@` isn't a regex character.
+
+### Braces
+
+Brace patterns can be used to match specific ranges or sets of characters.
+
+**Example**
+
+The pattern `{f,b}*/{1..3}/{b,q}*` would match any of following strings:
+
+```
+foo/1/bar
+foo/2/bar
+foo/3/bar
+baz/1/qux
+baz/2/qux
+baz/3/qux
+```
+
+Visit [braces](https://github.com/micromatch/braces) to see the full range of features and options related to brace expansion, or to create brace matching or expansion related issues.
+
+### Regex character classes
+
+Given the list: `['a.js', 'b.js', 'c.js', 'd.js', 'E.js']`:
+
+* `[ac].js`: matches both `a` and `c`, returning `['a.js', 'c.js']`
+* `[b-d].js`: matches from `b` to `d`, returning `['b.js', 'c.js', 'd.js']`
+* `a/[A-Z].js`: matches and uppercase letter, returning `['a/E.md']`
+
+Learn about [regex character classes](http://www.regular-expressions.info/charclass.html).
+
+### Regex groups
+
+Given `['a.js', 'b.js', 'c.js', 'd.js', 'E.js']`:
+
+* `(a|c).js`: would match either `a` or `c`, returning `['a.js', 'c.js']`
+* `(b|d).js`: would match either `b` or `d`, returning `['b.js', 'd.js']`
+* `(b|[A-Z]).js`: would match either `b` or an uppercase letter, returning `['b.js', 'E.js']`
+
+As with regex, parens can be nested, so patterns like `((a|b)|c)/b` will work. Although brace expansion might be friendlier to use, depending on preference.
+
+### POSIX bracket expressions
+
+POSIX brackets are intended to be more user-friendly than regex character classes. This of course is in the eye of the beholder.
+
+**Example**
+
+```js
+console.log(micromatch.isMatch('a1', '[[:alpha:][:digit:]]')) //=> true
+console.log(micromatch.isMatch('a1', '[[:alpha:][:alpha:]]')) //=> false
+```
+
+***
+
+## Notes
+
+### Bash 4.3 parity
+
+Whenever possible matching behavior is based on behavior Bash 4.3, which is mostly consistent with minimatch.
+
+However, it's suprising how many edge cases and rabbit holes there are with glob matching, and since there is no real glob specification, and micromatch is more accurate than both Bash and minimatch, there are cases where best-guesses were made for behavior. In a few cases where Bash had no answers, we used wildmatch (used by git) as a fallback.
+
+### Backslashes
+
+There is an important, notable difference between minimatch and micromatch _in regards to how backslashes are handled_ in glob patterns.
+
+* Micromatch exclusively and explicitly reserves backslashes for escaping characters in a glob pattern, even on windows, which is consistent with bash behavior. _More importantly, unescaping globs can result in unsafe regular expressions_.
+* Minimatch converts all backslashes to forward slashes, which means you can't use backslashes to escape any characters in your glob patterns.
+
+We made this decision for micromatch for a couple of reasons:
+
+* Consistency with bash conventions.
+* Glob patterns are not filepaths. They are a type of [regular language](https://en.wikipedia.org/wiki/Regular_language) that is converted to a JavaScript regular expression. Thus, when forward slashes are defined in a glob pattern, the resulting regular expression will match windows or POSIX path separators just fine.
+
+**A note about joining paths to globs**
+
+Note that when you pass something like `path.join('foo', '*')` to micromatch, you are creating a filepath and expecting it to still work as a glob pattern. This causes problems on windows, since the `path.sep` is `\\`.
+
+In other words, since `\\` is reserved as an escape character in globs, on windows `path.join('foo', '*')` would result in `foo\\*`, which tells micromatch to match `*` as a literal character. This is the same behavior as bash.
+
+To solve this, you might be inspired to do something like `'foo\\*'.replace(/\\/g, '/')`, but this causes another, potentially much more serious, problem.
+
+## Benchmarks
+
+### Running benchmarks
+
+Install dependencies for running benchmarks:
+
+```sh
+$ cd bench && npm install
+```
+
+Run the benchmarks:
+
+```sh
+$ npm run bench
+```
+
+### Latest results
+
+As of August 23, 2024 (longer bars are better):
+
+```sh
+# .makeRe star
+ micromatch x 2,232,802 ops/sec ±2.34% (89 runs sampled))
+ minimatch x 781,018 ops/sec ±6.74% (92 runs sampled))
+
+# .makeRe star; dot=true
+ micromatch x 1,863,453 ops/sec ±0.74% (93 runs sampled)
+ minimatch x 723,105 ops/sec ±0.75% (93 runs sampled)
+
+# .makeRe globstar
+ micromatch x 1,624,179 ops/sec ±2.22% (91 runs sampled)
+ minimatch x 1,117,230 ops/sec ±2.78% (86 runs sampled))
+
+# .makeRe globstars
+ micromatch x 1,658,642 ops/sec ±0.86% (92 runs sampled)
+ minimatch x 741,224 ops/sec ±1.24% (89 runs sampled))
+
+# .makeRe with leading star
+ micromatch x 1,525,014 ops/sec ±1.63% (90 runs sampled)
+ minimatch x 561,074 ops/sec ±3.07% (89 runs sampled)
+
+# .makeRe - braces
+ micromatch x 172,478 ops/sec ±2.37% (78 runs sampled)
+ minimatch x 96,087 ops/sec ±2.34% (88 runs sampled)))
+
+# .makeRe braces - range (expanded)
+ micromatch x 26,973 ops/sec ±0.84% (89 runs sampled)
+ minimatch x 3,023 ops/sec ±0.99% (90 runs sampled))
+
+# .makeRe braces - range (compiled)
+ micromatch x 152,892 ops/sec ±1.67% (83 runs sampled)
+ minimatch x 992 ops/sec ±3.50% (89 runs sampled)d))
+
+# .makeRe braces - nested ranges (expanded)
+ micromatch x 15,816 ops/sec ±13.05% (80 runs sampled)
+ minimatch x 2,953 ops/sec ±1.64% (91 runs sampled)
+
+# .makeRe braces - nested ranges (compiled)
+ micromatch x 110,881 ops/sec ±1.85% (82 runs sampled)
+ minimatch x 1,008 ops/sec ±1.51% (91 runs sampled)
+
+# .makeRe braces - set (compiled)
+ micromatch x 134,930 ops/sec ±3.54% (63 runs sampled))
+ minimatch x 43,242 ops/sec ±0.60% (93 runs sampled)
+
+# .makeRe braces - nested sets (compiled)
+ micromatch x 94,455 ops/sec ±1.74% (69 runs sampled))
+ minimatch x 27,720 ops/sec ±1.84% (93 runs sampled))
+```
+
+## Contributing
+
+All contributions are welcome! Please read [the contributing guide](.github/contributing.md) to get started.
+
+**Bug reports**
+
+Please create an issue if you encounter a bug or matching behavior that doesn't seem correct. If you find a matching-related issue, please:
+
+* [research existing issues first](../../issues) (open and closed)
+* visit the [GNU Bash documentation](https://www.gnu.org/software/bash/manual/) to see how Bash deals with the pattern
+* visit the [minimatch](https://github.com/isaacs/minimatch) documentation to cross-check expected behavior in node.js
+* if all else fails, since there is no real specification for globs we will probably need to discuss expected behavior and decide how to resolve it. which means any detail you can provide to help with this discussion would be greatly appreciated.
+
+**Platform issues**
+
+It's important to us that micromatch work consistently on all platforms. If you encounter any platform-specific matching or path related issues, please let us know (pull requests are also greatly appreciated).
+
+## About
+
+
+Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
+
+Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards.
+
+
+
+
+Running Tests
+
+Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
+
+```sh
+$ npm install && npm test
+```
+
+
+
+
+Building docs
+
+_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
+
+To generate the readme, run the following command:
+
+```sh
+$ npm install -g verbose/verb#dev verb-generate-readme && verb
+```
+
+
+
+### Related projects
+
+You might also be interested in these projects:
+
+* [braces](https://www.npmjs.com/package/braces): Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support… [more](https://github.com/micromatch/braces) | [homepage](https://github.com/micromatch/braces "Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed.")
+* [expand-brackets](https://www.npmjs.com/package/expand-brackets): Expand POSIX bracket expressions (character classes) in glob patterns. | [homepage](https://github.com/micromatch/expand-brackets "Expand POSIX bracket expressions (character classes) in glob patterns.")
+* [extglob](https://www.npmjs.com/package/extglob): Extended glob support for JavaScript. Adds (almost) the expressive power of regular expressions to glob… [more](https://github.com/micromatch/extglob) | [homepage](https://github.com/micromatch/extglob "Extended glob support for JavaScript. Adds (almost) the expressive power of regular expressions to glob patterns.")
+* [fill-range](https://www.npmjs.com/package/fill-range): Fill in a range of numbers or letters, optionally passing an increment or `step` to… [more](https://github.com/jonschlinkert/fill-range) | [homepage](https://github.com/jonschlinkert/fill-range "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`")
+* [nanomatch](https://www.npmjs.com/package/nanomatch): Fast, minimal glob matcher for node.js. Similar to micromatch, minimatch and multimatch, but complete Bash… [more](https://github.com/micromatch/nanomatch) | [homepage](https://github.com/micromatch/nanomatch "Fast, minimal glob matcher for node.js. Similar to micromatch, minimatch and multimatch, but complete Bash 4.3 wildcard support only (no support for exglobs, posix brackets or braces)")
+
+### Contributors
+
+| **Commits** | **Contributor** |
+| --- | --- |
+| 523 | [jonschlinkert](https://github.com/jonschlinkert) |
+| 12 | [es128](https://github.com/es128) |
+| 9 | [danez](https://github.com/danez) |
+| 8 | [doowb](https://github.com/doowb) |
+| 6 | [paulmillr](https://github.com/paulmillr) |
+| 5 | [mrmlnc](https://github.com/mrmlnc) |
+| 3 | [DrPizza](https://github.com/DrPizza) |
+| 2 | [Tvrqvoise](https://github.com/Tvrqvoise) |
+| 2 | [antonyk](https://github.com/antonyk) |
+| 2 | [MartinKolarik](https://github.com/MartinKolarik) |
+| 2 | [Glazy](https://github.com/Glazy) |
+| 2 | [mceIdo](https://github.com/mceIdo) |
+| 2 | [TrySound](https://github.com/TrySound) |
+| 1 | [yvele](https://github.com/yvele) |
+| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) |
+| 1 | [simlu](https://github.com/simlu) |
+| 1 | [curbengh](https://github.com/curbengh) |
+| 1 | [fidian](https://github.com/fidian) |
+| 1 | [tomByrer](https://github.com/tomByrer) |
+| 1 | [ZoomerTedJackson](https://github.com/ZoomerTedJackson) |
+| 1 | [styfle](https://github.com/styfle) |
+| 1 | [sebdeckers](https://github.com/sebdeckers) |
+| 1 | [muescha](https://github.com/muescha) |
+| 1 | [juszczykjakub](https://github.com/juszczykjakub) |
+| 1 | [joyceerhl](https://github.com/joyceerhl) |
+| 1 | [donatj](https://github.com/donatj) |
+| 1 | [frangio](https://github.com/frangio) |
+| 1 | [UltCombo](https://github.com/UltCombo) |
+| 1 | [DianeLooney](https://github.com/DianeLooney) |
+| 1 | [devongovett](https://github.com/devongovett) |
+| 1 | [Cslove](https://github.com/Cslove) |
+| 1 | [amilajack](https://github.com/amilajack) |
+
+### Author
+
+**Jon Schlinkert**
+
+* [GitHub Profile](https://github.com/jonschlinkert)
+* [Twitter Profile](https://twitter.com/jonschlinkert)
+* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
+
+### License
+
+Copyright © 2024, [Jon Schlinkert](https://github.com/jonschlinkert).
+Released under the [MIT License](LICENSE).
+
+***
+
+_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on August 23, 2024._
\ No newline at end of file
diff --git a/node_modules/micromatch/index.js b/node_modules/micromatch/index.js
new file mode 100644
index 0000000..cb9d9ef
--- /dev/null
+++ b/node_modules/micromatch/index.js
@@ -0,0 +1,474 @@
+'use strict';
+
+const util = require('util');
+const braces = require('braces');
+const picomatch = require('picomatch');
+const utils = require('picomatch/lib/utils');
+
+const isEmptyString = v => v === '' || v === './';
+const hasBraces = v => {
+ const index = v.indexOf('{');
+ return index > -1 && v.indexOf('}', index) > -1;
+};
+
+/**
+ * Returns an array of strings that match one or more glob patterns.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm(list, patterns[, options]);
+ *
+ * console.log(mm(['a.js', 'a.txt'], ['*.js']));
+ * //=> [ 'a.js' ]
+ * ```
+ * @param {String|Array} `list` List of strings to match.
+ * @param {String|Array} `patterns` One or more glob patterns to use for matching.
+ * @param {Object} `options` See available [options](#options)
+ * @return {Array} Returns an array of matches
+ * @summary false
+ * @api public
+ */
+
+const micromatch = (list, patterns, options) => {
+ patterns = [].concat(patterns);
+ list = [].concat(list);
+
+ let omit = new Set();
+ let keep = new Set();
+ let items = new Set();
+ let negatives = 0;
+
+ let onResult = state => {
+ items.add(state.output);
+ if (options && options.onResult) {
+ options.onResult(state);
+ }
+ };
+
+ for (let i = 0; i < patterns.length; i++) {
+ let isMatch = picomatch(String(patterns[i]), { ...options, onResult }, true);
+ let negated = isMatch.state.negated || isMatch.state.negatedExtglob;
+ if (negated) negatives++;
+
+ for (let item of list) {
+ let matched = isMatch(item, true);
+
+ let match = negated ? !matched.isMatch : matched.isMatch;
+ if (!match) continue;
+
+ if (negated) {
+ omit.add(matched.output);
+ } else {
+ omit.delete(matched.output);
+ keep.add(matched.output);
+ }
+ }
+ }
+
+ let result = negatives === patterns.length ? [...items] : [...keep];
+ let matches = result.filter(item => !omit.has(item));
+
+ if (options && matches.length === 0) {
+ if (options.failglob === true) {
+ throw new Error(`No matches found for "${patterns.join(', ')}"`);
+ }
+
+ if (options.nonull === true || options.nullglob === true) {
+ return options.unescape ? patterns.map(p => p.replace(/\\/g, '')) : patterns;
+ }
+ }
+
+ return matches;
+};
+
+/**
+ * Backwards compatibility
+ */
+
+micromatch.match = micromatch;
+
+/**
+ * Returns a matcher function from the given glob `pattern` and `options`.
+ * The returned function takes a string to match as its only argument and returns
+ * true if the string is a match.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.matcher(pattern[, options]);
+ *
+ * const isMatch = mm.matcher('*.!(*a)');
+ * console.log(isMatch('a.a')); //=> false
+ * console.log(isMatch('a.b')); //=> true
+ * ```
+ * @param {String} `pattern` Glob pattern
+ * @param {Object} `options`
+ * @return {Function} Returns a matcher function.
+ * @api public
+ */
+
+micromatch.matcher = (pattern, options) => picomatch(pattern, options);
+
+/**
+ * Returns true if **any** of the given glob `patterns` match the specified `string`.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.isMatch(string, patterns[, options]);
+ *
+ * console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true
+ * console.log(mm.isMatch('a.a', 'b.*')); //=> false
+ * ```
+ * @param {String} `str` The string to test.
+ * @param {String|Array} `patterns` One or more glob patterns to use for matching.
+ * @param {Object} `[options]` See available [options](#options).
+ * @return {Boolean} Returns true if any patterns match `str`
+ * @api public
+ */
+
+micromatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);
+
+/**
+ * Backwards compatibility
+ */
+
+micromatch.any = micromatch.isMatch;
+
+/**
+ * Returns a list of strings that _**do not match any**_ of the given `patterns`.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.not(list, patterns[, options]);
+ *
+ * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a'));
+ * //=> ['b.b', 'c.c']
+ * ```
+ * @param {Array} `list` Array of strings to match.
+ * @param {String|Array} `patterns` One or more glob pattern to use for matching.
+ * @param {Object} `options` See available [options](#options) for changing how matches are performed
+ * @return {Array} Returns an array of strings that **do not match** the given patterns.
+ * @api public
+ */
+
+micromatch.not = (list, patterns, options = {}) => {
+ patterns = [].concat(patterns).map(String);
+ let result = new Set();
+ let items = [];
+
+ let onResult = state => {
+ if (options.onResult) options.onResult(state);
+ items.push(state.output);
+ };
+
+ let matches = new Set(micromatch(list, patterns, { ...options, onResult }));
+
+ for (let item of items) {
+ if (!matches.has(item)) {
+ result.add(item);
+ }
+ }
+ return [...result];
+};
+
+/**
+ * Returns true if the given `string` contains the given pattern. Similar
+ * to [.isMatch](#isMatch) but the pattern can match any part of the string.
+ *
+ * ```js
+ * var mm = require('micromatch');
+ * // mm.contains(string, pattern[, options]);
+ *
+ * console.log(mm.contains('aa/bb/cc', '*b'));
+ * //=> true
+ * console.log(mm.contains('aa/bb/cc', '*d'));
+ * //=> false
+ * ```
+ * @param {String} `str` The string to match.
+ * @param {String|Array} `patterns` Glob pattern to use for matching.
+ * @param {Object} `options` See available [options](#options) for changing how matches are performed
+ * @return {Boolean} Returns true if any of the patterns matches any part of `str`.
+ * @api public
+ */
+
+micromatch.contains = (str, pattern, options) => {
+ if (typeof str !== 'string') {
+ throw new TypeError(`Expected a string: "${util.inspect(str)}"`);
+ }
+
+ if (Array.isArray(pattern)) {
+ return pattern.some(p => micromatch.contains(str, p, options));
+ }
+
+ if (typeof pattern === 'string') {
+ if (isEmptyString(str) || isEmptyString(pattern)) {
+ return false;
+ }
+
+ if (str.includes(pattern) || (str.startsWith('./') && str.slice(2).includes(pattern))) {
+ return true;
+ }
+ }
+
+ return micromatch.isMatch(str, pattern, { ...options, contains: true });
+};
+
+/**
+ * Filter the keys of the given object with the given `glob` pattern
+ * and `options`. Does not attempt to match nested keys. If you need this feature,
+ * use [glob-object][] instead.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.matchKeys(object, patterns[, options]);
+ *
+ * const obj = { aa: 'a', ab: 'b', ac: 'c' };
+ * console.log(mm.matchKeys(obj, '*b'));
+ * //=> { ab: 'b' }
+ * ```
+ * @param {Object} `object` The object with keys to filter.
+ * @param {String|Array} `patterns` One or more glob patterns to use for matching.
+ * @param {Object} `options` See available [options](#options) for changing how matches are performed
+ * @return {Object} Returns an object with only keys that match the given patterns.
+ * @api public
+ */
+
+micromatch.matchKeys = (obj, patterns, options) => {
+ if (!utils.isObject(obj)) {
+ throw new TypeError('Expected the first argument to be an object');
+ }
+ let keys = micromatch(Object.keys(obj), patterns, options);
+ let res = {};
+ for (let key of keys) res[key] = obj[key];
+ return res;
+};
+
+/**
+ * Returns true if some of the strings in the given `list` match any of the given glob `patterns`.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.some(list, patterns[, options]);
+ *
+ * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js']));
+ * // true
+ * console.log(mm.some(['foo.js'], ['*.js', '!foo.js']));
+ * // false
+ * ```
+ * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found.
+ * @param {String|Array} `patterns` One or more glob patterns to use for matching.
+ * @param {Object} `options` See available [options](#options) for changing how matches are performed
+ * @return {Boolean} Returns true if any `patterns` matches any of the strings in `list`
+ * @api public
+ */
+
+micromatch.some = (list, patterns, options) => {
+ let items = [].concat(list);
+
+ for (let pattern of [].concat(patterns)) {
+ let isMatch = picomatch(String(pattern), options);
+ if (items.some(item => isMatch(item))) {
+ return true;
+ }
+ }
+ return false;
+};
+
+/**
+ * Returns true if every string in the given `list` matches
+ * any of the given glob `patterns`.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.every(list, patterns[, options]);
+ *
+ * console.log(mm.every('foo.js', ['foo.js']));
+ * // true
+ * console.log(mm.every(['foo.js', 'bar.js'], ['*.js']));
+ * // true
+ * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js']));
+ * // false
+ * console.log(mm.every(['foo.js'], ['*.js', '!foo.js']));
+ * // false
+ * ```
+ * @param {String|Array} `list` The string or array of strings to test.
+ * @param {String|Array} `patterns` One or more glob patterns to use for matching.
+ * @param {Object} `options` See available [options](#options) for changing how matches are performed
+ * @return {Boolean} Returns true if all `patterns` matches all of the strings in `list`
+ * @api public
+ */
+
+micromatch.every = (list, patterns, options) => {
+ let items = [].concat(list);
+
+ for (let pattern of [].concat(patterns)) {
+ let isMatch = picomatch(String(pattern), options);
+ if (!items.every(item => isMatch(item))) {
+ return false;
+ }
+ }
+ return true;
+};
+
+/**
+ * Returns true if **all** of the given `patterns` match
+ * the specified string.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.all(string, patterns[, options]);
+ *
+ * console.log(mm.all('foo.js', ['foo.js']));
+ * // true
+ *
+ * console.log(mm.all('foo.js', ['*.js', '!foo.js']));
+ * // false
+ *
+ * console.log(mm.all('foo.js', ['*.js', 'foo.js']));
+ * // true
+ *
+ * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js']));
+ * // true
+ * ```
+ * @param {String|Array} `str` The string to test.
+ * @param {String|Array} `patterns` One or more glob patterns to use for matching.
+ * @param {Object} `options` See available [options](#options) for changing how matches are performed
+ * @return {Boolean} Returns true if any patterns match `str`
+ * @api public
+ */
+
+micromatch.all = (str, patterns, options) => {
+ if (typeof str !== 'string') {
+ throw new TypeError(`Expected a string: "${util.inspect(str)}"`);
+ }
+
+ return [].concat(patterns).every(p => picomatch(p, options)(str));
+};
+
+/**
+ * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.capture(pattern, string[, options]);
+ *
+ * console.log(mm.capture('test/*.js', 'test/foo.js'));
+ * //=> ['foo']
+ * console.log(mm.capture('test/*.js', 'foo/bar.css'));
+ * //=> null
+ * ```
+ * @param {String} `glob` Glob pattern to use for matching.
+ * @param {String} `input` String to match
+ * @param {Object} `options` See available [options](#options) for changing how matches are performed
+ * @return {Array|null} Returns an array of captures if the input matches the glob pattern, otherwise `null`.
+ * @api public
+ */
+
+micromatch.capture = (glob, input, options) => {
+ let posix = utils.isWindows(options);
+ let regex = picomatch.makeRe(String(glob), { ...options, capture: true });
+ let match = regex.exec(posix ? utils.toPosixSlashes(input) : input);
+
+ if (match) {
+ return match.slice(1).map(v => v === void 0 ? '' : v);
+ }
+};
+
+/**
+ * Create a regular expression from the given glob `pattern`.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.makeRe(pattern[, options]);
+ *
+ * console.log(mm.makeRe('*.js'));
+ * //=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/
+ * ```
+ * @param {String} `pattern` A glob pattern to convert to regex.
+ * @param {Object} `options`
+ * @return {RegExp} Returns a regex created from the given pattern.
+ * @api public
+ */
+
+micromatch.makeRe = (...args) => picomatch.makeRe(...args);
+
+/**
+ * Scan a glob pattern to separate the pattern into segments. Used
+ * by the [split](#split) method.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * const state = mm.scan(pattern[, options]);
+ * ```
+ * @param {String} `pattern`
+ * @param {Object} `options`
+ * @return {Object} Returns an object with
+ * @api public
+ */
+
+micromatch.scan = (...args) => picomatch.scan(...args);
+
+/**
+ * Parse a glob pattern to create the source string for a regular
+ * expression.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * const state = mm.parse(pattern[, options]);
+ * ```
+ * @param {String} `glob`
+ * @param {Object} `options`
+ * @return {Object} Returns an object with useful properties and output to be used as regex source string.
+ * @api public
+ */
+
+micromatch.parse = (patterns, options) => {
+ let res = [];
+ for (let pattern of [].concat(patterns || [])) {
+ for (let str of braces(String(pattern), options)) {
+ res.push(picomatch.parse(str, options));
+ }
+ }
+ return res;
+};
+
+/**
+ * Process the given brace `pattern`.
+ *
+ * ```js
+ * const { braces } = require('micromatch');
+ * console.log(braces('foo/{a,b,c}/bar'));
+ * //=> [ 'foo/(a|b|c)/bar' ]
+ *
+ * console.log(braces('foo/{a,b,c}/bar', { expand: true }));
+ * //=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ]
+ * ```
+ * @param {String} `pattern` String with brace pattern to process.
+ * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options.
+ * @return {Array}
+ * @api public
+ */
+
+micromatch.braces = (pattern, options) => {
+ if (typeof pattern !== 'string') throw new TypeError('Expected a string');
+ if ((options && options.nobrace === true) || !hasBraces(pattern)) {
+ return [pattern];
+ }
+ return braces(pattern, options);
+};
+
+/**
+ * Expand braces
+ */
+
+micromatch.braceExpand = (pattern, options) => {
+ if (typeof pattern !== 'string') throw new TypeError('Expected a string');
+ return micromatch.braces(pattern, { ...options, expand: true });
+};
+
+/**
+ * Expose micromatch
+ */
+
+// exposed for tests
+micromatch.hasBraces = hasBraces;
+module.exports = micromatch;
diff --git a/node_modules/micromatch/package.json b/node_modules/micromatch/package.json
new file mode 100644
index 0000000..d5558bb
--- /dev/null
+++ b/node_modules/micromatch/package.json
@@ -0,0 +1,119 @@
+{
+ "name": "micromatch",
+ "description": "Glob matching for javascript/node.js. A replacement and faster alternative to minimatch and multimatch.",
+ "version": "4.0.8",
+ "homepage": "https://github.com/micromatch/micromatch",
+ "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
+ "contributors": [
+ "(https://github.com/DianeLooney)",
+ "Amila Welihinda (amilajack.com)",
+ "Bogdan Chadkin (https://github.com/TrySound)",
+ "Brian Woodward (https://twitter.com/doowb)",
+ "Devon Govett (http://badassjs.com)",
+ "Elan Shanker (https://github.com/es128)",
+ "Fabrício Matté (https://ultcombo.js.org)",
+ "Jon Schlinkert (http://twitter.com/jonschlinkert)",
+ "Martin Kolárik (https://kolarik.sk)",
+ "Olsten Larck (https://i.am.charlike.online)",
+ "Paul Miller (paulmillr.com)",
+ "Tom Byrer (https://github.com/tomByrer)",
+ "Tyler Akins (http://rumkin.com)",
+ "Peter Bright (https://github.com/drpizza)",
+ "Kuba Juszczyk (https://github.com/ku8ar)"
+ ],
+ "repository": "micromatch/micromatch",
+ "bugs": {
+ "url": "https://github.com/micromatch/micromatch/issues"
+ },
+ "license": "MIT",
+ "files": [
+ "index.js"
+ ],
+ "main": "index.js",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "devDependencies": {
+ "fill-range": "^7.0.1",
+ "gulp-format-md": "^2.0.0",
+ "minimatch": "^5.0.1",
+ "mocha": "^9.2.2",
+ "time-require": "github:jonschlinkert/time-require"
+ },
+ "keywords": [
+ "bash",
+ "bracket",
+ "character-class",
+ "expand",
+ "expansion",
+ "expression",
+ "extglob",
+ "extglobs",
+ "file",
+ "files",
+ "filter",
+ "find",
+ "glob",
+ "globbing",
+ "globs",
+ "globstar",
+ "lookahead",
+ "lookaround",
+ "lookbehind",
+ "match",
+ "matcher",
+ "matches",
+ "matching",
+ "micromatch",
+ "minimatch",
+ "multimatch",
+ "negate",
+ "negation",
+ "path",
+ "pattern",
+ "patterns",
+ "posix",
+ "regex",
+ "regexp",
+ "regular",
+ "shell",
+ "star",
+ "wildcard"
+ ],
+ "verb": {
+ "toc": "collapsible",
+ "layout": "default",
+ "tasks": [
+ "readme"
+ ],
+ "plugins": [
+ "gulp-format-md"
+ ],
+ "lint": {
+ "reflinks": true
+ },
+ "related": {
+ "list": [
+ "braces",
+ "expand-brackets",
+ "extglob",
+ "fill-range",
+ "nanomatch"
+ ]
+ },
+ "reflinks": [
+ "extglob",
+ "fill-range",
+ "glob-object",
+ "minimatch",
+ "multimatch"
+ ]
+ }
+}
diff --git a/node_modules/minimatch/LICENSE b/node_modules/minimatch/LICENSE
new file mode 100644
index 0000000..1493534
--- /dev/null
+++ b/node_modules/minimatch/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) 2011-2023 Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/minimatch/README.md b/node_modules/minimatch/README.md
new file mode 100644
index 0000000..3c97a02
--- /dev/null
+++ b/node_modules/minimatch/README.md
@@ -0,0 +1,454 @@
+# minimatch
+
+A minimal matching utility.
+
+This is the matching library used internally by npm.
+
+It works by converting glob expressions into JavaScript `RegExp`
+objects.
+
+## Usage
+
+```js
+// hybrid module, load with require() or import
+import { minimatch } from 'minimatch'
+// or:
+const { minimatch } = require('minimatch')
+
+minimatch('bar.foo', '*.foo') // true!
+minimatch('bar.foo', '*.bar') // false!
+minimatch('bar.foo', '*.+(bar|foo)', { debug: true }) // true, and noisy!
+```
+
+## Features
+
+Supports these glob features:
+
+- Brace Expansion
+- Extended glob matching
+- "Globstar" `**` matching
+- [Posix character
+ classes](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html),
+ like `[[:alpha:]]`, supporting the full range of Unicode
+ characters. For example, `[[:alpha:]]` will match against
+ `'é'`, though `[a-zA-Z]` will not. Collating symbol and set
+ matching is not supported, so `[[=e=]]` will _not_ match `'é'`
+ and `[[.ch.]]` will not match `'ch'` in locales where `ch` is
+ considered a single character.
+
+See:
+
+- `man sh`
+- `man bash` [Pattern
+ Matching](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html)
+- `man 3 fnmatch`
+- `man 5 gitignore`
+
+## Windows
+
+**Please only use forward-slashes in glob expressions.**
+
+Though windows uses either `/` or `\` as its path separator, only `/`
+characters are used by this glob implementation. You must use
+forward-slashes **only** in glob expressions. Back-slashes in patterns
+will always be interpreted as escape characters, not path separators.
+
+Note that `\` or `/` _will_ be interpreted as path separators in paths on
+Windows, and will match against `/` in glob expressions.
+
+So just always use `/` in patterns.
+
+### UNC Paths
+
+On Windows, UNC paths like `//?/c:/...` or
+`//ComputerName/Share/...` are handled specially.
+
+- Patterns starting with a double-slash followed by some
+ non-slash characters will preserve their double-slash. As a
+ result, a pattern like `//*` will match `//x`, but not `/x`.
+- Patterns staring with `//?/:` will _not_ treat
+ the `?` as a wildcard character. Instead, it will be treated
+ as a normal string.
+- Patterns starting with `//?/:/...` will match
+ file paths starting with `:/...`, and vice versa,
+ as if the `//?/` was not present. This behavior only is
+ present when the drive letters are a case-insensitive match to
+ one another. The remaining portions of the path/pattern are
+ compared case sensitively, unless `nocase:true` is set.
+
+Note that specifying a UNC path using `\` characters as path
+separators is always allowed in the file path argument, but only
+allowed in the pattern argument when `windowsPathsNoEscape: true`
+is set in the options.
+
+## Minimatch Class
+
+Create a minimatch object by instantiating the `minimatch.Minimatch` class.
+
+```javascript
+var Minimatch = require('minimatch').Minimatch
+var mm = new Minimatch(pattern, options)
+```
+
+### Properties
+
+- `pattern` The original pattern the minimatch object represents.
+- `options` The options supplied to the constructor.
+- `set` A 2-dimensional array of regexp or string expressions.
+ Each row in the
+ array corresponds to a brace-expanded pattern. Each item in the row
+ corresponds to a single path-part. For example, the pattern
+ `{a,b/c}/d` would expand to a set of patterns like:
+
+ [ [ a, d ]
+ , [ b, c, d ] ]
+
+ If a portion of the pattern doesn't have any "magic" in it
+ (that is, it's something like `"foo"` rather than `fo*o?`), then it
+ will be left as a string rather than converted to a regular
+ expression.
+
+- `regexp` Created by the `makeRe` method. A single regular expression
+ expressing the entire pattern. This is useful in cases where you wish
+ to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.
+- `negate` True if the pattern is negated.
+- `comment` True if the pattern is a comment.
+- `empty` True if the pattern is `""`.
+
+### Methods
+
+- `makeRe()` Generate the `regexp` member if necessary, and return it.
+ Will return `false` if the pattern is invalid.
+- `match(fname)` Return true if the filename matches the pattern, or
+ false otherwise.
+- `matchOne(fileArray, patternArray, partial)` Take a `/`-split
+ filename, and match it against a single row in the `regExpSet`. This
+ method is mainly for internal use, but is exposed so that it can be
+ used by a glob-walker that needs to avoid excessive filesystem calls.
+- `hasMagic()` Returns true if the parsed pattern contains any
+ magic characters. Returns false if all comparator parts are
+ string literals. If the `magicalBraces` option is set on the
+ constructor, then it will consider brace expansions which are
+ not otherwise magical to be magic. If not set, then a pattern
+ like `a{b,c}d` will return `false`, because neither `abd` nor
+ `acd` contain any special glob characters.
+
+ This does **not** mean that the pattern string can be used as a
+ literal filename, as it may contain magic glob characters that
+ are escaped. For example, the pattern `\\*` or `[*]` would not
+ be considered to have magic, as the matching portion parses to
+ the literal string `'*'` and would match a path named `'*'`,
+ not `'\\*'` or `'[*]'`. The `minimatch.unescape()` method may
+ be used to remove escape characters.
+
+All other methods are internal, and will be called as necessary.
+
+### minimatch(path, pattern, options)
+
+Main export. Tests a path against the pattern using the options.
+
+```javascript
+var isJS = minimatch(file, '*.js', { matchBase: true })
+```
+
+### minimatch.filter(pattern, options)
+
+Returns a function that tests its
+supplied argument, suitable for use with `Array.filter`. Example:
+
+```javascript
+var javascripts = fileList.filter(minimatch.filter('*.js', { matchBase: true }))
+```
+
+### minimatch.escape(pattern, options = {})
+
+Escape all magic characters in a glob pattern, so that it will
+only ever match literal strings
+
+If the `windowsPathsNoEscape` option is used, then characters are
+escaped by wrapping in `[]`, because a magic character wrapped in
+a character class can only be satisfied by that exact character.
+
+Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot
+be escaped or unescaped.
+
+### minimatch.unescape(pattern, options = {})
+
+Un-escape a glob string that may contain some escaped characters.
+
+If the `windowsPathsNoEscape` option is used, then square-brace
+escapes are removed, but not backslash escapes. For example, it
+will turn the string `'[*]'` into `*`, but it will not turn
+`'\\*'` into `'*'`, because `\` is a path separator in
+`windowsPathsNoEscape` mode.
+
+When `windowsPathsNoEscape` is not set, then both brace escapes
+and backslash escapes are removed.
+
+Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot
+be escaped or unescaped.
+
+### minimatch.match(list, pattern, options)
+
+Match against the list of
+files, in the style of fnmatch or glob. If nothing is matched, and
+options.nonull is set, then return a list containing the pattern itself.
+
+```javascript
+var javascripts = minimatch.match(fileList, '*.js', { matchBase: true })
+```
+
+### minimatch.makeRe(pattern, options)
+
+Make a regular expression object from the pattern.
+
+## Options
+
+All options are `false` by default.
+
+### debug
+
+Dump a ton of stuff to stderr.
+
+### nobrace
+
+Do not expand `{a,b}` and `{1..3}` brace sets.
+
+### noglobstar
+
+Disable `**` matching against multiple folder names.
+
+### dot
+
+Allow patterns to match filenames starting with a period, even if
+the pattern does not explicitly have a period in that spot.
+
+Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`
+is set.
+
+### noext
+
+Disable "extglob" style patterns like `+(a|b)`.
+
+### nocase
+
+Perform a case-insensitive match.
+
+### nocaseMagicOnly
+
+When used with `{nocase: true}`, create regular expressions that
+are case-insensitive, but leave string match portions untouched.
+Has no effect when used without `{nocase: true}`
+
+Useful when some other form of case-insensitive matching is used,
+or if the original string representation is useful in some other
+way.
+
+### nonull
+
+When a match is not found by `minimatch.match`, return a list containing
+the pattern itself if this option is set. When not set, an empty list
+is returned if there are no matches.
+
+### magicalBraces
+
+This only affects the results of the `Minimatch.hasMagic` method.
+
+If the pattern contains brace expansions, such as `a{b,c}d`, but
+no other magic characters, then the `Minimatch.hasMagic()` method
+will return `false` by default. When this option set, it will
+return `true` for brace expansion as well as other magic glob
+characters.
+
+### matchBase
+
+If set, then patterns without slashes will be matched
+against the basename of the path if it contains slashes. For example,
+`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.
+
+### nocomment
+
+Suppress the behavior of treating `#` at the start of a pattern as a
+comment.
+
+### nonegate
+
+Suppress the behavior of treating a leading `!` character as negation.
+
+### flipNegate
+
+Returns from negate expressions the same as if they were not negated.
+(Ie, true on a hit, false on a miss.)
+
+### partial
+
+Compare a partial path to a pattern. As long as the parts of the path that
+are present are not contradicted by the pattern, it will be treated as a
+match. This is useful in applications where you're walking through a
+folder structure, and don't yet have the full path, but want to ensure that
+you do not walk down paths that can never be a match.
+
+For example,
+
+```js
+minimatch('/a/b', '/a/*/c/d', { partial: true }) // true, might be /a/b/c/d
+minimatch('/a/b', '/**/d', { partial: true }) // true, might be /a/b/.../d
+minimatch('/x/y/z', '/a/**/z', { partial: true }) // false, because x !== a
+```
+
+### windowsPathsNoEscape
+
+Use `\\` as a path separator _only_, and _never_ as an escape
+character. If set, all `\\` characters are replaced with `/` in
+the pattern. Note that this makes it **impossible** to match
+against paths containing literal glob pattern characters, but
+allows matching with patterns constructed using `path.join()` and
+`path.resolve()` on Windows platforms, mimicking the (buggy!)
+behavior of earlier versions on Windows. Please use with
+caution, and be mindful of [the caveat about Windows
+paths](#windows).
+
+For legacy reasons, this is also set if
+`options.allowWindowsEscape` is set to the exact value `false`.
+
+### windowsNoMagicRoot
+
+When a pattern starts with a UNC path or drive letter, and in
+`nocase:true` mode, do not convert the root portions of the
+pattern into a case-insensitive regular expression, and instead
+leave them as strings.
+
+This is the default when the platform is `win32` and
+`nocase:true` is set.
+
+### preserveMultipleSlashes
+
+By default, multiple `/` characters (other than the leading `//`
+in a UNC path, see "UNC Paths" above) are treated as a single
+`/`.
+
+That is, a pattern like `a///b` will match the file path `a/b`.
+
+Set `preserveMultipleSlashes: true` to suppress this behavior.
+
+### optimizationLevel
+
+A number indicating the level of optimization that should be done
+to the pattern prior to parsing and using it for matches.
+
+Globstar parts `**` are always converted to `*` when `noglobstar`
+is set, and multiple adjacent `**` parts are converted into a
+single `**` (ie, `a/**/**/b` will be treated as `a/**/b`, as this
+is equivalent in all cases).
+
+- `0` - Make no further changes. In this mode, `.` and `..` are
+ maintained in the pattern, meaning that they must also appear
+ in the same position in the test path string. Eg, a pattern
+ like `a/*/../c` will match the string `a/b/../c` but not the
+ string `a/c`.
+- `1` - (default) Remove cases where a double-dot `..` follows a
+ pattern portion that is not `**`, `.`, `..`, or empty `''`. For
+ example, the pattern `./a/b/../*` is converted to `./a/*`, and
+ so it will match the path string `./a/c`, but not the path
+ string `./a/b/../c`. Dots and empty path portions in the
+ pattern are preserved.
+- `2` (or higher) - Much more aggressive optimizations, suitable
+ for use with file-walking cases:
+
+ - Remove cases where a double-dot `..` follows a pattern
+ portion that is not `**`, `.`, or empty `''`. Remove empty
+ and `.` portions of the pattern, where safe to do so (ie,
+ anywhere other than the last position, the first position, or
+ the second position in a pattern starting with `/`, as this
+ may indicate a UNC path on Windows).
+ - Convert patterns containing `/**/..//` into the
+ equivalent `/{..,**}//`, where `` is a
+ a pattern portion other than `.`, `..`, `**`, or empty
+ `''`.
+ - Dedupe patterns where a `**` portion is present in one and
+ omitted in another, and it is not the final path portion, and
+ they are otherwise equivalent. So `{a/**/b,a/b}` becomes
+ `a/**/b`, because `**` matches against an empty path portion.
+ - Dedupe patterns where a `*` portion is present in one, and a
+ non-dot pattern other than `**`, `.`, `..`, or `''` is in the
+ same position in the other. So `a/{*,x}/b` becomes `a/*/b`,
+ because `*` can match against `x`.
+
+ While these optimizations improve the performance of
+ file-walking use cases such as [glob](http://npm.im/glob) (ie,
+ the reason this module exists), there are cases where it will
+ fail to match a literal string that would have been matched in
+ optimization level 1 or 0.
+
+ Specifically, while the `Minimatch.match()` method will
+ optimize the file path string in the same ways, resulting in
+ the same matches, it will fail when tested with the regular
+ expression provided by `Minimatch.makeRe()`, unless the path
+ string is first processed with
+ `minimatch.levelTwoFileOptimize()` or similar.
+
+### platform
+
+When set to `win32`, this will trigger all windows-specific
+behaviors (special handling for UNC paths, and treating `\` as
+separators in file paths for comparison.)
+
+Defaults to the value of `process.platform`.
+
+## Comparisons to other fnmatch/glob implementations
+
+While strict compliance with the existing standards is a
+worthwhile goal, some discrepancies exist between minimatch and
+other implementations. Some are intentional, and some are
+unavoidable.
+
+If the pattern starts with a `!` character, then it is negated. Set the
+`nonegate` flag to suppress this behavior, and treat leading `!`
+characters normally. This is perhaps relevant if you wish to start the
+pattern with a negative extglob pattern like `!(a|B)`. Multiple `!`
+characters at the start of a pattern will negate the pattern multiple
+times.
+
+If a pattern starts with `#`, then it is treated as a comment, and
+will not match anything. Use `\#` to match a literal `#` at the
+start of a line, or set the `nocomment` flag to suppress this behavior.
+
+The double-star character `**` is supported by default, unless the
+`noglobstar` flag is set. This is supported in the manner of bsdglob
+and bash 4.1, where `**` only has special significance if it is the only
+thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but
+`a/**b` will not.
+
+If an escaped pattern has no matches, and the `nonull` flag is set,
+then minimatch.match returns the pattern as-provided, rather than
+interpreting the character escapes. For example,
+`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
+`"*a?"`. This is akin to setting the `nullglob` option in bash, except
+that it does not resolve escaped pattern characters.
+
+If brace expansion is not disabled, then it is performed before any
+other interpretation of the glob pattern. Thus, a pattern like
+`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
+**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
+checked for validity. Since those two are valid, matching proceeds.
+
+Negated extglob patterns are handled as closely as possible to
+Bash semantics, but there are some cases with negative extglobs
+which are exceedingly difficult to express in a JavaScript
+regular expression. In particular the negated pattern
+`!(*|)*` will in bash match anything that does
+not start with ``. However,
+`!(*)*` _will_ match paths starting with
+``, because the empty string can match against
+the negated portion. In this library, `!(*|)*`
+will _not_ match any pattern starting with ``, due to a
+difference in precisely which patterns are considered "greedy" in
+Regular Expressions vs bash path expansion. This may be fixable,
+but not without incurring some complexity and performance costs,
+and the trade-off seems to not be worth pursuing.
+
+Note that `fnmatch(3)` in libc is an extremely naive string comparison
+matcher, which does not do anything special for slashes. This library is
+designed to be used in glob searching and file walkers, and so it does do
+special things with `/`. Thus, `foo*` will not match `foo/bar` in this
+library, even though it would in `fnmatch(3)`.
diff --git a/node_modules/minimatch/package.json b/node_modules/minimatch/package.json
new file mode 100644
index 0000000..01fc48e
--- /dev/null
+++ b/node_modules/minimatch/package.json
@@ -0,0 +1,82 @@
+{
+ "author": "Isaac Z. Schlueter (http://blog.izs.me)",
+ "name": "minimatch",
+ "description": "a glob matcher in javascript",
+ "version": "9.0.5",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/minimatch.git"
+ },
+ "main": "./dist/commonjs/index.js",
+ "types": "./dist/commonjs/index.d.ts",
+ "exports": {
+ "./package.json": "./package.json",
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ }
+ },
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "prepare": "tshy",
+ "pretest": "npm run prepare",
+ "presnap": "npm run prepare",
+ "test": "tap",
+ "snap": "tap",
+ "format": "prettier --write . --loglevel warn",
+ "benchmark": "node benchmark/index.js",
+ "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts"
+ },
+ "prettier": {
+ "semi": false,
+ "printWidth": 80,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "devDependencies": {
+ "@types/brace-expansion": "^1.1.0",
+ "@types/node": "^18.15.11",
+ "@types/tap": "^15.0.8",
+ "eslint-config-prettier": "^8.6.0",
+ "mkdirp": "1",
+ "prettier": "^2.8.2",
+ "tap": "^18.7.2",
+ "ts-node": "^10.9.1",
+ "tshy": "^1.12.0",
+ "typedoc": "^0.23.21",
+ "typescript": "^4.9.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "license": "ISC",
+ "tshy": {
+ "exports": {
+ "./package.json": "./package.json",
+ ".": "./src/index.ts"
+ }
+ },
+ "type": "module"
+}
diff --git a/node_modules/minipass/LICENSE b/node_modules/minipass/LICENSE
new file mode 100644
index 0000000..97f8e32
--- /dev/null
+++ b/node_modules/minipass/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) 2017-2023 npm, Inc., Isaac Z. Schlueter, and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/minipass/README.md b/node_modules/minipass/README.md
new file mode 100644
index 0000000..1126330
--- /dev/null
+++ b/node_modules/minipass/README.md
@@ -0,0 +1,825 @@
+# minipass
+
+A _very_ minimal implementation of a [PassThrough
+stream](https://nodejs.org/api/stream.html#stream_class_stream_passthrough)
+
+[It's very
+fast](https://docs.google.com/spreadsheets/d/1K_HR5oh3r80b8WVMWCPPjfuWXUgfkmhlX7FGI6JJ8tY/edit?usp=sharing)
+for objects, strings, and buffers.
+
+Supports `pipe()`ing (including multi-`pipe()` and backpressure
+transmission), buffering data until either a `data` event handler
+or `pipe()` is added (so you don't lose the first chunk), and
+most other cases where PassThrough is a good idea.
+
+There is a `read()` method, but it's much more efficient to
+consume data from this stream via `'data'` events or by calling
+`pipe()` into some other stream. Calling `read()` requires the
+buffer to be flattened in some cases, which requires copying
+memory.
+
+If you set `objectMode: true` in the options, then whatever is
+written will be emitted. Otherwise, it'll do a minimal amount of
+Buffer copying to ensure proper Streams semantics when `read(n)`
+is called.
+
+`objectMode` can only be set at instantiation. Attempting to
+write something other than a String or Buffer without having set
+`objectMode` in the options will throw an error.
+
+This is not a `through` or `through2` stream. It doesn't
+transform the data, it just passes it right through. If you want
+to transform the data, extend the class, and override the
+`write()` method. Once you're done transforming the data however
+you want, call `super.write()` with the transform output.
+
+For some examples of streams that extend Minipass in various
+ways, check out:
+
+- [minizlib](http://npm.im/minizlib)
+- [fs-minipass](http://npm.im/fs-minipass)
+- [tar](http://npm.im/tar)
+- [minipass-collect](http://npm.im/minipass-collect)
+- [minipass-flush](http://npm.im/minipass-flush)
+- [minipass-pipeline](http://npm.im/minipass-pipeline)
+- [tap](http://npm.im/tap)
+- [tap-parser](http://npm.im/tap-parser)
+- [treport](http://npm.im/treport)
+- [minipass-fetch](http://npm.im/minipass-fetch)
+- [pacote](http://npm.im/pacote)
+- [make-fetch-happen](http://npm.im/make-fetch-happen)
+- [cacache](http://npm.im/cacache)
+- [ssri](http://npm.im/ssri)
+- [npm-registry-fetch](http://npm.im/npm-registry-fetch)
+- [minipass-json-stream](http://npm.im/minipass-json-stream)
+- [minipass-sized](http://npm.im/minipass-sized)
+
+## Usage in TypeScript
+
+The `Minipass` class takes three type template definitions:
+
+- `RType` the type being read, which defaults to `Buffer`. If
+ `RType` is `string`, then the constructor _must_ get an options
+ object specifying either an `encoding` or `objectMode: true`.
+ If it's anything other than `string` or `Buffer`, then it
+ _must_ get an options object specifying `objectMode: true`.
+- `WType` the type being written. If `RType` is `Buffer` or
+ `string`, then this defaults to `ContiguousData` (Buffer,
+ string, ArrayBuffer, or ArrayBufferView). Otherwise, it
+ defaults to `RType`.
+- `Events` type mapping event names to the arguments emitted
+ with that event, which extends `Minipass.Events`.
+
+To declare types for custom events in subclasses, extend the
+third parameter with your own event signatures. For example:
+
+```js
+import { Minipass } from 'minipass'
+
+// a NDJSON stream that emits 'jsonError' when it can't stringify
+export interface Events extends Minipass.Events {
+ jsonError: [e: Error]
+}
+
+export class NDJSONStream extends Minipass {
+ constructor() {
+ super({ objectMode: true })
+ }
+
+ // data is type `any` because that's WType
+ write(data, encoding, cb) {
+ try {
+ const json = JSON.stringify(data)
+ return super.write(json + '\n', encoding, cb)
+ } catch (er) {
+ if (!er instanceof Error) {
+ er = Object.assign(new Error('json stringify failed'), {
+ cause: er,
+ })
+ }
+ // trying to emit with something OTHER than an error will
+ // fail, because we declared the event arguments type.
+ this.emit('jsonError', er)
+ }
+ }
+}
+
+const s = new NDJSONStream()
+s.on('jsonError', e => {
+ // here, TS knows that e is an Error
+})
+```
+
+Emitting/handling events that aren't declared in this way is
+fine, but the arguments will be typed as `unknown`.
+
+## Differences from Node.js Streams
+
+There are several things that make Minipass streams different
+from (and in some ways superior to) Node.js core streams.
+
+Please read these caveats if you are familiar with node-core
+streams and intend to use Minipass streams in your programs.
+
+You can avoid most of these differences entirely (for a very
+small performance penalty) by setting `{async: true}` in the
+constructor options.
+
+### Timing
+
+Minipass streams are designed to support synchronous use-cases.
+Thus, data is emitted as soon as it is available, always. It is
+buffered until read, but no longer. Another way to look at it is
+that Minipass streams are exactly as synchronous as the logic
+that writes into them.
+
+This can be surprising if your code relies on
+`PassThrough.write()` always providing data on the next tick
+rather than the current one, or being able to call `resume()` and
+not have the entire buffer disappear immediately.
+
+However, without this synchronicity guarantee, there would be no
+way for Minipass to achieve the speeds it does, or support the
+synchronous use cases that it does. Simply put, waiting takes
+time.
+
+This non-deferring approach makes Minipass streams much easier to
+reason about, especially in the context of Promises and other
+flow-control mechanisms.
+
+Example:
+
+```js
+// hybrid module, either works
+import { Minipass } from 'minipass'
+// or:
+const { Minipass } = require('minipass')
+
+const stream = new Minipass()
+stream.on('data', () => console.log('data event'))
+console.log('before write')
+stream.write('hello')
+console.log('after write')
+// output:
+// before write
+// data event
+// after write
+```
+
+### Exception: Async Opt-In
+
+If you wish to have a Minipass stream with behavior that more
+closely mimics Node.js core streams, you can set the stream in
+async mode either by setting `async: true` in the constructor
+options, or by setting `stream.async = true` later on.
+
+```js
+// hybrid module, either works
+import { Minipass } from 'minipass'
+// or:
+const { Minipass } = require('minipass')
+
+const asyncStream = new Minipass({ async: true })
+asyncStream.on('data', () => console.log('data event'))
+console.log('before write')
+asyncStream.write('hello')
+console.log('after write')
+// output:
+// before write
+// after write
+// data event <-- this is deferred until the next tick
+```
+
+Switching _out_ of async mode is unsafe, as it could cause data
+corruption, and so is not enabled. Example:
+
+```js
+import { Minipass } from 'minipass'
+const stream = new Minipass({ encoding: 'utf8' })
+stream.on('data', chunk => console.log(chunk))
+stream.async = true
+console.log('before writes')
+stream.write('hello')
+setStreamSyncAgainSomehow(stream) // <-- this doesn't actually exist!
+stream.write('world')
+console.log('after writes')
+// hypothetical output would be:
+// before writes
+// world
+// after writes
+// hello
+// NOT GOOD!
+```
+
+To avoid this problem, once set into async mode, any attempt to
+make the stream sync again will be ignored.
+
+```js
+const { Minipass } = require('minipass')
+const stream = new Minipass({ encoding: 'utf8' })
+stream.on('data', chunk => console.log(chunk))
+stream.async = true
+console.log('before writes')
+stream.write('hello')
+stream.async = false // <-- no-op, stream already async
+stream.write('world')
+console.log('after writes')
+// actual output:
+// before writes
+// after writes
+// hello
+// world
+```
+
+### No High/Low Water Marks
+
+Node.js core streams will optimistically fill up a buffer,
+returning `true` on all writes until the limit is hit, even if
+the data has nowhere to go. Then, they will not attempt to draw
+more data in until the buffer size dips below a minimum value.
+
+Minipass streams are much simpler. The `write()` method will
+return `true` if the data has somewhere to go (which is to say,
+given the timing guarantees, that the data is already there by
+the time `write()` returns).
+
+If the data has nowhere to go, then `write()` returns false, and
+the data sits in a buffer, to be drained out immediately as soon
+as anyone consumes it.
+
+Since nothing is ever buffered unnecessarily, there is much less
+copying data, and less bookkeeping about buffer capacity levels.
+
+### Hazards of Buffering (or: Why Minipass Is So Fast)
+
+Since data written to a Minipass stream is immediately written
+all the way through the pipeline, and `write()` always returns
+true/false based on whether the data was fully flushed,
+backpressure is communicated immediately to the upstream caller.
+This minimizes buffering.
+
+Consider this case:
+
+```js
+const { PassThrough } = require('stream')
+const p1 = new PassThrough({ highWaterMark: 1024 })
+const p2 = new PassThrough({ highWaterMark: 1024 })
+const p3 = new PassThrough({ highWaterMark: 1024 })
+const p4 = new PassThrough({ highWaterMark: 1024 })
+
+p1.pipe(p2).pipe(p3).pipe(p4)
+p4.on('data', () => console.log('made it through'))
+
+// this returns false and buffers, then writes to p2 on next tick (1)
+// p2 returns false and buffers, pausing p1, then writes to p3 on next tick (2)
+// p3 returns false and buffers, pausing p2, then writes to p4 on next tick (3)
+// p4 returns false and buffers, pausing p3, then emits 'data' and 'drain'
+// on next tick (4)
+// p3 sees p4's 'drain' event, and calls resume(), emitting 'resume' and
+// 'drain' on next tick (5)
+// p2 sees p3's 'drain', calls resume(), emits 'resume' and 'drain' on next tick (6)
+// p1 sees p2's 'drain', calls resume(), emits 'resume' and 'drain' on next
+// tick (7)
+
+p1.write(Buffer.alloc(2048)) // returns false
+```
+
+Along the way, the data was buffered and deferred at each stage,
+and multiple event deferrals happened, for an unblocked pipeline
+where it was perfectly safe to write all the way through!
+
+Furthermore, setting a `highWaterMark` of `1024` might lead
+someone reading the code to think an advisory maximum of 1KiB is
+being set for the pipeline. However, the actual advisory
+buffering level is the _sum_ of `highWaterMark` values, since
+each one has its own bucket.
+
+Consider the Minipass case:
+
+```js
+const m1 = new Minipass()
+const m2 = new Minipass()
+const m3 = new Minipass()
+const m4 = new Minipass()
+
+m1.pipe(m2).pipe(m3).pipe(m4)
+m4.on('data', () => console.log('made it through'))
+
+// m1 is flowing, so it writes the data to m2 immediately
+// m2 is flowing, so it writes the data to m3 immediately
+// m3 is flowing, so it writes the data to m4 immediately
+// m4 is flowing, so it fires the 'data' event immediately, returns true
+// m4's write returned true, so m3 is still flowing, returns true
+// m3's write returned true, so m2 is still flowing, returns true
+// m2's write returned true, so m1 is still flowing, returns true
+// No event deferrals or buffering along the way!
+
+m1.write(Buffer.alloc(2048)) // returns true
+```
+
+It is extremely unlikely that you _don't_ want to buffer any data
+written, or _ever_ buffer data that can be flushed all the way
+through. Neither node-core streams nor Minipass ever fail to
+buffer written data, but node-core streams do a lot of
+unnecessary buffering and pausing.
+
+As always, the faster implementation is the one that does less
+stuff and waits less time to do it.
+
+### Immediately emit `end` for empty streams (when not paused)
+
+If a stream is not paused, and `end()` is called before writing
+any data into it, then it will emit `end` immediately.
+
+If you have logic that occurs on the `end` event which you don't
+want to potentially happen immediately (for example, closing file
+descriptors, moving on to the next entry in an archive parse
+stream, etc.) then be sure to call `stream.pause()` on creation,
+and then `stream.resume()` once you are ready to respond to the
+`end` event.
+
+However, this is _usually_ not a problem because:
+
+### Emit `end` When Asked
+
+One hazard of immediately emitting `'end'` is that you may not
+yet have had a chance to add a listener. In order to avoid this
+hazard, Minipass streams safely re-emit the `'end'` event if a
+new listener is added after `'end'` has been emitted.
+
+Ie, if you do `stream.on('end', someFunction)`, and the stream
+has already emitted `end`, then it will call the handler right
+away. (You can think of this somewhat like attaching a new
+`.then(fn)` to a previously-resolved Promise.)
+
+To prevent calling handlers multiple times who would not expect
+multiple ends to occur, all listeners are removed from the
+`'end'` event whenever it is emitted.
+
+### Emit `error` When Asked
+
+The most recent error object passed to the `'error'` event is
+stored on the stream. If a new `'error'` event handler is added,
+and an error was previously emitted, then the event handler will
+be called immediately (or on `process.nextTick` in the case of
+async streams).
+
+This makes it much more difficult to end up trying to interact
+with a broken stream, if the error handler is added after an
+error was previously emitted.
+
+### Impact of "immediate flow" on Tee-streams
+
+A "tee stream" is a stream piping to multiple destinations:
+
+```js
+const tee = new Minipass()
+t.pipe(dest1)
+t.pipe(dest2)
+t.write('foo') // goes to both destinations
+```
+
+Since Minipass streams _immediately_ process any pending data
+through the pipeline when a new pipe destination is added, this
+can have surprising effects, especially when a stream comes in
+from some other function and may or may not have data in its
+buffer.
+
+```js
+// WARNING! WILL LOSE DATA!
+const src = new Minipass()
+src.write('foo')
+src.pipe(dest1) // 'foo' chunk flows to dest1 immediately, and is gone
+src.pipe(dest2) // gets nothing!
+```
+
+One solution is to create a dedicated tee-stream junction that
+pipes to both locations, and then pipe to _that_ instead.
+
+```js
+// Safe example: tee to both places
+const src = new Minipass()
+src.write('foo')
+const tee = new Minipass()
+tee.pipe(dest1)
+tee.pipe(dest2)
+src.pipe(tee) // tee gets 'foo', pipes to both locations
+```
+
+The same caveat applies to `on('data')` event listeners. The
+first one added will _immediately_ receive all of the data,
+leaving nothing for the second:
+
+```js
+// WARNING! WILL LOSE DATA!
+const src = new Minipass()
+src.write('foo')
+src.on('data', handler1) // receives 'foo' right away
+src.on('data', handler2) // nothing to see here!
+```
+
+Using a dedicated tee-stream can be used in this case as well:
+
+```js
+// Safe example: tee to both data handlers
+const src = new Minipass()
+src.write('foo')
+const tee = new Minipass()
+tee.on('data', handler1)
+tee.on('data', handler2)
+src.pipe(tee)
+```
+
+All of the hazards in this section are avoided by setting `{
+async: true }` in the Minipass constructor, or by setting
+`stream.async = true` afterwards. Note that this does add some
+overhead, so should only be done in cases where you are willing
+to lose a bit of performance in order to avoid having to refactor
+program logic.
+
+## USAGE
+
+It's a stream! Use it like a stream and it'll most likely do what
+you want.
+
+```js
+import { Minipass } from 'minipass'
+const mp = new Minipass(options) // options is optional
+mp.write('foo')
+mp.pipe(someOtherStream)
+mp.end('bar')
+```
+
+### OPTIONS
+
+- `encoding` How would you like the data coming _out_ of the
+ stream to be encoded? Accepts any values that can be passed to
+ `Buffer.toString()`.
+- `objectMode` Emit data exactly as it comes in. This will be
+ flipped on by default if you write() something other than a
+ string or Buffer at any point. Setting `objectMode: true` will
+ prevent setting any encoding value.
+- `async` Defaults to `false`. Set to `true` to defer data
+ emission until next tick. This reduces performance slightly,
+ but makes Minipass streams use timing behavior closer to Node
+ core streams. See [Timing](#timing) for more details.
+- `signal` An `AbortSignal` that will cause the stream to unhook
+ itself from everything and become as inert as possible. Note
+ that providing a `signal` parameter will make `'error'` events
+ no longer throw if they are unhandled, but they will still be
+ emitted to handlers if any are attached.
+
+### API
+
+Implements the user-facing portions of Node.js's `Readable` and
+`Writable` streams.
+
+### Methods
+
+- `write(chunk, [encoding], [callback])` - Put data in. (Note
+ that, in the base Minipass class, the same data will come out.)
+ Returns `false` if the stream will buffer the next write, or
+ true if it's still in "flowing" mode.
+- `end([chunk, [encoding]], [callback])` - Signal that you have
+ no more data to write. This will queue an `end` event to be
+ fired when all the data has been consumed.
+- `pause()` - No more data for a while, please. This also
+ prevents `end` from being emitted for empty streams until the
+ stream is resumed.
+- `resume()` - Resume the stream. If there's data in the buffer,
+ it is all discarded. Any buffered events are immediately
+ emitted.
+- `pipe(dest)` - Send all output to the stream provided. When
+ data is emitted, it is immediately written to any and all pipe
+ destinations. (Or written on next tick in `async` mode.)
+- `unpipe(dest)` - Stop piping to the destination stream. This is
+ immediate, meaning that any asynchronously queued data will
+ _not_ make it to the destination when running in `async` mode.
+ - `options.end` - Boolean, end the destination stream when the
+ source stream ends. Default `true`.
+ - `options.proxyErrors` - Boolean, proxy `error` events from
+ the source stream to the destination stream. Note that errors
+ are _not_ proxied after the pipeline terminates, either due
+ to the source emitting `'end'` or manually unpiping with
+ `src.unpipe(dest)`. Default `false`.
+- `on(ev, fn)`, `emit(ev, fn)` - Minipass streams are
+ EventEmitters. Some events are given special treatment,
+ however. (See below under "events".)
+- `promise()` - Returns a Promise that resolves when the stream
+ emits `end`, or rejects if the stream emits `error`.
+- `collect()` - Return a Promise that resolves on `end` with an
+ array containing each chunk of data that was emitted, or
+ rejects if the stream emits `error`. Note that this consumes
+ the stream data.
+- `concat()` - Same as `collect()`, but concatenates the data
+ into a single Buffer object. Will reject the returned promise
+ if the stream is in objectMode, or if it goes into objectMode
+ by the end of the data.
+- `read(n)` - Consume `n` bytes of data out of the buffer. If `n`
+ is not provided, then consume all of it. If `n` bytes are not
+ available, then it returns null. **Note** consuming streams in
+ this way is less efficient, and can lead to unnecessary Buffer
+ copying.
+- `destroy([er])` - Destroy the stream. If an error is provided,
+ then an `'error'` event is emitted. If the stream has a
+ `close()` method, and has not emitted a `'close'` event yet,
+ then `stream.close()` will be called. Any Promises returned by
+ `.promise()`, `.collect()` or `.concat()` will be rejected.
+ After being destroyed, writing to the stream will emit an
+ error. No more data will be emitted if the stream is destroyed,
+ even if it was previously buffered.
+
+### Properties
+
+- `bufferLength` Read-only. Total number of bytes buffered, or in
+ the case of objectMode, the total number of objects.
+- `encoding` Read-only. The encoding that has been set.
+- `flowing` Read-only. Boolean indicating whether a chunk written
+ to the stream will be immediately emitted.
+- `emittedEnd` Read-only. Boolean indicating whether the end-ish
+ events (ie, `end`, `prefinish`, `finish`) have been emitted.
+ Note that listening on any end-ish event will immediateyl
+ re-emit it if it has already been emitted.
+- `writable` Whether the stream is writable. Default `true`. Set
+ to `false` when `end()`
+- `readable` Whether the stream is readable. Default `true`.
+- `pipes` An array of Pipe objects referencing streams that this
+ stream is piping into.
+- `destroyed` A getter that indicates whether the stream was
+ destroyed.
+- `paused` True if the stream has been explicitly paused,
+ otherwise false.
+- `objectMode` Indicates whether the stream is in `objectMode`.
+- `aborted` Readonly property set when the `AbortSignal`
+ dispatches an `abort` event.
+
+### Events
+
+- `data` Emitted when there's data to read. Argument is the data
+ to read. This is never emitted while not flowing. If a listener
+ is attached, that will resume the stream.
+- `end` Emitted when there's no more data to read. This will be
+ emitted immediately for empty streams when `end()` is called.
+ If a listener is attached, and `end` was already emitted, then
+ it will be emitted again. All listeners are removed when `end`
+ is emitted.
+- `prefinish` An end-ish event that follows the same logic as
+ `end` and is emitted in the same conditions where `end` is
+ emitted. Emitted after `'end'`.
+- `finish` An end-ish event that follows the same logic as `end`
+ and is emitted in the same conditions where `end` is emitted.
+ Emitted after `'prefinish'`.
+- `close` An indication that an underlying resource has been
+ released. Minipass does not emit this event, but will defer it
+ until after `end` has been emitted, since it throws off some
+ stream libraries otherwise.
+- `drain` Emitted when the internal buffer empties, and it is
+ again suitable to `write()` into the stream.
+- `readable` Emitted when data is buffered and ready to be read
+ by a consumer.
+- `resume` Emitted when stream changes state from buffering to
+ flowing mode. (Ie, when `resume` is called, `pipe` is called,
+ or a `data` event listener is added.)
+
+### Static Methods
+
+- `Minipass.isStream(stream)` Returns `true` if the argument is a
+ stream, and false otherwise. To be considered a stream, the
+ object must be either an instance of Minipass, or an
+ EventEmitter that has either a `pipe()` method, or both
+ `write()` and `end()` methods. (Pretty much any stream in
+ node-land will return `true` for this.)
+
+## EXAMPLES
+
+Here are some examples of things you can do with Minipass
+streams.
+
+### simple "are you done yet" promise
+
+```js
+mp.promise().then(
+ () => {
+ // stream is finished
+ },
+ er => {
+ // stream emitted an error
+ }
+)
+```
+
+### collecting
+
+```js
+mp.collect().then(all => {
+ // all is an array of all the data emitted
+ // encoding is supported in this case, so
+ // so the result will be a collection of strings if
+ // an encoding is specified, or buffers/objects if not.
+ //
+ // In an async function, you may do
+ // const data = await stream.collect()
+})
+```
+
+### collecting into a single blob
+
+This is a bit slower because it concatenates the data into one
+chunk for you, but if you're going to do it yourself anyway, it's
+convenient this way:
+
+```js
+mp.concat().then(onebigchunk => {
+ // onebigchunk is a string if the stream
+ // had an encoding set, or a buffer otherwise.
+})
+```
+
+### iteration
+
+You can iterate over streams synchronously or asynchronously in
+platforms that support it.
+
+Synchronous iteration will end when the currently available data
+is consumed, even if the `end` event has not been reached. In
+string and buffer mode, the data is concatenated, so unless
+multiple writes are occurring in the same tick as the `read()`,
+sync iteration loops will generally only have a single iteration.
+
+To consume chunks in this way exactly as they have been written,
+with no flattening, create the stream with the `{ objectMode:
+true }` option.
+
+```js
+const mp = new Minipass({ objectMode: true })
+mp.write('a')
+mp.write('b')
+for (let letter of mp) {
+ console.log(letter) // a, b
+}
+mp.write('c')
+mp.write('d')
+for (let letter of mp) {
+ console.log(letter) // c, d
+}
+mp.write('e')
+mp.end()
+for (let letter of mp) {
+ console.log(letter) // e
+}
+for (let letter of mp) {
+ console.log(letter) // nothing
+}
+```
+
+Asynchronous iteration will continue until the end event is reached,
+consuming all of the data.
+
+```js
+const mp = new Minipass({ encoding: 'utf8' })
+
+// some source of some data
+let i = 5
+const inter = setInterval(() => {
+ if (i-- > 0) mp.write(Buffer.from('foo\n', 'utf8'))
+ else {
+ mp.end()
+ clearInterval(inter)
+ }
+}, 100)
+
+// consume the data with asynchronous iteration
+async function consume() {
+ for await (let chunk of mp) {
+ console.log(chunk)
+ }
+ return 'ok'
+}
+
+consume().then(res => console.log(res))
+// logs `foo\n` 5 times, and then `ok`
+```
+
+### subclass that `console.log()`s everything written into it
+
+```js
+class Logger extends Minipass {
+ write(chunk, encoding, callback) {
+ console.log('WRITE', chunk, encoding)
+ return super.write(chunk, encoding, callback)
+ }
+ end(chunk, encoding, callback) {
+ console.log('END', chunk, encoding)
+ return super.end(chunk, encoding, callback)
+ }
+}
+
+someSource.pipe(new Logger()).pipe(someDest)
+```
+
+### same thing, but using an inline anonymous class
+
+```js
+// js classes are fun
+someSource
+ .pipe(
+ new (class extends Minipass {
+ emit(ev, ...data) {
+ // let's also log events, because debugging some weird thing
+ console.log('EMIT', ev)
+ return super.emit(ev, ...data)
+ }
+ write(chunk, encoding, callback) {
+ console.log('WRITE', chunk, encoding)
+ return super.write(chunk, encoding, callback)
+ }
+ end(chunk, encoding, callback) {
+ console.log('END', chunk, encoding)
+ return super.end(chunk, encoding, callback)
+ }
+ })()
+ )
+ .pipe(someDest)
+```
+
+### subclass that defers 'end' for some reason
+
+```js
+class SlowEnd extends Minipass {
+ emit(ev, ...args) {
+ if (ev === 'end') {
+ console.log('going to end, hold on a sec')
+ setTimeout(() => {
+ console.log('ok, ready to end now')
+ super.emit('end', ...args)
+ }, 100)
+ return true
+ } else {
+ return super.emit(ev, ...args)
+ }
+ }
+}
+```
+
+### transform that creates newline-delimited JSON
+
+```js
+class NDJSONEncode extends Minipass {
+ write(obj, cb) {
+ try {
+ // JSON.stringify can throw, emit an error on that
+ return super.write(JSON.stringify(obj) + '\n', 'utf8', cb)
+ } catch (er) {
+ this.emit('error', er)
+ }
+ }
+ end(obj, cb) {
+ if (typeof obj === 'function') {
+ cb = obj
+ obj = undefined
+ }
+ if (obj !== undefined) {
+ this.write(obj)
+ }
+ return super.end(cb)
+ }
+}
+```
+
+### transform that parses newline-delimited JSON
+
+```js
+class NDJSONDecode extends Minipass {
+ constructor(options) {
+ // always be in object mode, as far as Minipass is concerned
+ super({ objectMode: true })
+ this._jsonBuffer = ''
+ }
+ write(chunk, encoding, cb) {
+ if (
+ typeof chunk === 'string' &&
+ typeof encoding === 'string' &&
+ encoding !== 'utf8'
+ ) {
+ chunk = Buffer.from(chunk, encoding).toString()
+ } else if (Buffer.isBuffer(chunk)) {
+ chunk = chunk.toString()
+ }
+ if (typeof encoding === 'function') {
+ cb = encoding
+ }
+ const jsonData = (this._jsonBuffer + chunk).split('\n')
+ this._jsonBuffer = jsonData.pop()
+ for (let i = 0; i < jsonData.length; i++) {
+ try {
+ // JSON.parse can throw, emit an error on that
+ super.write(JSON.parse(jsonData[i]))
+ } catch (er) {
+ this.emit('error', er)
+ continue
+ }
+ }
+ if (cb) cb()
+ }
+}
+```
diff --git a/node_modules/minipass/package.json b/node_modules/minipass/package.json
new file mode 100644
index 0000000..771969b
--- /dev/null
+++ b/node_modules/minipass/package.json
@@ -0,0 +1,82 @@
+{
+ "name": "minipass",
+ "version": "7.1.2",
+ "description": "minimal implementation of a PassThrough stream",
+ "main": "./dist/commonjs/index.js",
+ "types": "./dist/commonjs/index.d.ts",
+ "type": "module",
+ "tshy": {
+ "selfLink": false,
+ "main": true,
+ "exports": {
+ "./package.json": "./package.json",
+ ".": "./src/index.ts"
+ }
+ },
+ "exports": {
+ "./package.json": "./package.json",
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ }
+ },
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "prepare": "tshy",
+ "pretest": "npm run prepare",
+ "presnap": "npm run prepare",
+ "test": "tap",
+ "snap": "tap",
+ "format": "prettier --write . --loglevel warn",
+ "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts"
+ },
+ "prettier": {
+ "semi": false,
+ "printWidth": 75,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf"
+ },
+ "devDependencies": {
+ "@types/end-of-stream": "^1.4.2",
+ "@types/node": "^20.1.2",
+ "end-of-stream": "^1.4.0",
+ "node-abort-controller": "^3.1.1",
+ "prettier": "^2.6.2",
+ "tap": "^19.0.0",
+ "through2": "^2.0.3",
+ "tshy": "^1.14.0",
+ "typedoc": "^0.25.1"
+ },
+ "repository": "https://github.com/isaacs/minipass",
+ "keywords": [
+ "passthrough",
+ "stream"
+ ],
+ "author": "Isaac Z. Schlueter (http://blog.izs.me/)",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "tap": {
+ "typecheck": true,
+ "include": [
+ "test/*.ts"
+ ]
+ }
+}
diff --git a/node_modules/mz/HISTORY.md b/node_modules/mz/HISTORY.md
new file mode 100644
index 0000000..6ebee21
--- /dev/null
+++ b/node_modules/mz/HISTORY.md
@@ -0,0 +1,66 @@
+
+2.7.0 / 2017-09-13
+==================
+
+ * feat: support fs.copyFile (#58)
+
+2.6.0 / 2016-11-22
+==================
+
+ * Added fdatasync to fs api (#46)
+
+2.5.0 / 2016-11-04
+==================
+
+ * feat: support fs.mkdtemp
+
+2.4.0 / 2016-03-23
+==================
+
+ * add `fs.truncate()` [#34](https://github.com/normalize/mz/pull/34)
+
+2.3.1 / 2016-02-01
+==================
+
+ * update `any-promise@v1`
+
+2.3.0 / 2016-01-30
+==================
+
+ * feat(package): switch to `any-promise` to support more promise engines
+
+2.2.0 / 2016-01-24
+==================
+
+ * feat(package): add index.js to files
+
+2.1.0 / 2015-10-15
+==================
+
+ * support for readline library
+
+2.0.0 / 2015-05-24
+==================
+
+ * support callbacks as well
+
+1.2.0 / 2014-12-16
+==================
+
+ * refactor promisification to `thenify` and `thenify-all`
+
+1.1.0 / 2014-11-14
+==================
+
+ * use `graceful-fs` if available
+
+1.0.1 / 2014-08-18
+==================
+
+ * don't use `bluebird.promisify()` - unnecessarily wraps runtime errors, causing issues
+
+1.0.0 / 2014-06-18
+==================
+
+ * use `bluebird` by default if found
+ * support node 0.8
diff --git a/node_modules/mz/LICENSE b/node_modules/mz/LICENSE
new file mode 100644
index 0000000..1835f3d
--- /dev/null
+++ b/node_modules/mz/LICENSE
@@ -0,0 +1,22 @@
+
+The MIT License (MIT)
+
+Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/mz/README.md b/node_modules/mz/README.md
new file mode 100644
index 0000000..50d6557
--- /dev/null
+++ b/node_modules/mz/README.md
@@ -0,0 +1,106 @@
+
+# MZ - Modernize node.js
+
+[![NPM version][npm-image]][npm-url]
+[![Build status][travis-image]][travis-url]
+[![Test coverage][coveralls-image]][coveralls-url]
+[![Dependency Status][david-image]][david-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+Modernize node.js to current ECMAScript specifications!
+node.js will not update their API to ES6+ [for a while](https://github.com/joyent/node/issues/7549).
+This library is a wrapper for various aspects of node.js' API.
+
+## Installation and Usage
+
+Set `mz` as a dependency and install it.
+
+```bash
+npm i mz
+```
+
+Then prefix the relevant `require()`s with `mz/`:
+
+```js
+var fs = require('mz/fs')
+
+fs.exists(__filename).then(function (exists) {
+ if (exists) // do something
+})
+```
+
+With ES2017, this will allow you to use async functions cleanly with node's core API:
+
+```js
+const fs = require('mz/fs')
+
+
+async function doSomething () {
+ if (await fs.exists(__filename)) // do something
+}
+```
+
+## Promisification
+
+Many node methods are converted into promises.
+Any properties that are deprecated or aren't asynchronous will simply be proxied.
+The modules wrapped are:
+
+- `child_process`
+- `crypto`
+- `dns`
+- `fs` (uses `graceful-fs` if available)
+- `readline`
+- `zlib`
+
+```js
+var exec = require('mz/child_process').exec
+
+exec('node --version').then(function (stdout) {
+ console.log(stdout)
+})
+```
+
+## Promise Engine
+
+`mz` uses [`any-promise`](https://github.com/kevinbeaty/any-promise).
+
+## FAQ
+
+### Can I use this in production?
+
+Yes, Node 4.x ships with stable promises support. For older engines,
+you should probably install your own promise implementation and register it with
+`require('any-promise/register')('bluebird')`.
+
+### Will this make my app faster?
+
+Nope, probably slower actually.
+
+### Can I add more features?
+
+Sure.
+Open an issue.
+
+Currently, the plans are to eventually support:
+
+- New APIs in node.js that are not available in older versions of node
+- ECMAScript7 Streams
+
+[bluebird]: https://github.com/petkaantonov/bluebird
+
+[npm-image]: https://img.shields.io/npm/v/mz.svg?style=flat-square
+[npm-url]: https://npmjs.org/package/mz
+[github-tag]: http://img.shields.io/github/tag/normalize/mz.svg?style=flat-square
+[github-url]: https://github.com/normalize/mz/tags
+[travis-image]: https://img.shields.io/travis/normalize/mz.svg?style=flat-square
+[travis-url]: https://travis-ci.org/normalize/mz
+[coveralls-image]: https://img.shields.io/coveralls/normalize/mz.svg?style=flat-square
+[coveralls-url]: https://coveralls.io/r/normalize/mz?branch=master
+[david-image]: http://img.shields.io/david/normalize/mz.svg?style=flat-square
+[david-url]: https://david-dm.org/normalize/mz
+[license-image]: http://img.shields.io/npm/l/mz.svg?style=flat-square
+[license-url]: LICENSE
+[downloads-image]: http://img.shields.io/npm/dm/mz.svg?style=flat-square
+[downloads-url]: https://npmjs.org/package/mz
diff --git a/node_modules/mz/child_process.js b/node_modules/mz/child_process.js
new file mode 100644
index 0000000..06d5d9e
--- /dev/null
+++ b/node_modules/mz/child_process.js
@@ -0,0 +1,8 @@
+
+require('thenify-all').withCallback(
+ require('child_process'),
+ exports, [
+ 'exec',
+ 'execFile',
+ ]
+)
diff --git a/node_modules/mz/crypto.js b/node_modules/mz/crypto.js
new file mode 100644
index 0000000..d8cff57
--- /dev/null
+++ b/node_modules/mz/crypto.js
@@ -0,0 +1,9 @@
+
+require('thenify-all').withCallback(
+ require('crypto'),
+ exports, [
+ 'pbkdf2',
+ 'pseudoRandomBytes',
+ 'randomBytes'
+ ]
+)
diff --git a/node_modules/mz/dns.js b/node_modules/mz/dns.js
new file mode 100644
index 0000000..c103582
--- /dev/null
+++ b/node_modules/mz/dns.js
@@ -0,0 +1,16 @@
+
+require('thenify-all').withCallback(
+ require('dns'),
+ exports, [
+ 'lookup',
+ 'resolve',
+ 'resolve4',
+ 'resolve6',
+ 'resolveCname',
+ 'resolveMx',
+ 'resolveNs',
+ 'resolveSrv',
+ 'resolveTxt',
+ 'reverse'
+ ]
+)
diff --git a/node_modules/mz/fs.js b/node_modules/mz/fs.js
new file mode 100644
index 0000000..1cfd2d7
--- /dev/null
+++ b/node_modules/mz/fs.js
@@ -0,0 +1,62 @@
+
+var Promise = require('any-promise')
+var fs
+try {
+ fs = require('graceful-fs')
+} catch(err) {
+ fs = require('fs')
+}
+
+var api = [
+ 'appendFile',
+ 'chmod',
+ 'chown',
+ 'close',
+ 'fchmod',
+ 'fchown',
+ 'fdatasync',
+ 'fstat',
+ 'fsync',
+ 'ftruncate',
+ 'futimes',
+ 'lchown',
+ 'link',
+ 'lstat',
+ 'mkdir',
+ 'open',
+ 'read',
+ 'readFile',
+ 'readdir',
+ 'readlink',
+ 'realpath',
+ 'rename',
+ 'rmdir',
+ 'stat',
+ 'symlink',
+ 'truncate',
+ 'unlink',
+ 'utimes',
+ 'write',
+ 'writeFile'
+]
+
+typeof fs.access === 'function' && api.push('access')
+typeof fs.copyFile === 'function' && api.push('copyFile')
+typeof fs.mkdtemp === 'function' && api.push('mkdtemp')
+
+require('thenify-all').withCallback(fs, exports, api)
+
+exports.exists = function (filename, callback) {
+ // callback
+ if (typeof callback === 'function') {
+ return fs.stat(filename, function (err) {
+ callback(null, !err);
+ })
+ }
+ // or promise
+ return new Promise(function (resolve) {
+ fs.stat(filename, function (err) {
+ resolve(!err)
+ })
+ })
+}
diff --git a/node_modules/mz/index.js b/node_modules/mz/index.js
new file mode 100644
index 0000000..cef508d
--- /dev/null
+++ b/node_modules/mz/index.js
@@ -0,0 +1,8 @@
+module.exports = {
+ fs: require('./fs'),
+ dns: require('./dns'),
+ zlib: require('./zlib'),
+ crypto: require('./crypto'),
+ readline: require('./readline'),
+ child_process: require('./child_process')
+}
diff --git a/node_modules/mz/package.json b/node_modules/mz/package.json
new file mode 100644
index 0000000..de8d542
--- /dev/null
+++ b/node_modules/mz/package.json
@@ -0,0 +1,44 @@
+{
+ "name": "mz",
+ "description": "modernize node.js to current ECMAScript standards",
+ "version": "2.7.0",
+ "author": {
+ "name": "Jonathan Ong",
+ "email": "me@jongleberry.com",
+ "url": "http://jongleberry.com",
+ "twitter": "https://twitter.com/jongleberry"
+ },
+ "license": "MIT",
+ "repository": "normalize/mz",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ },
+ "devDependencies": {
+ "istanbul": "^0.4.0",
+ "bluebird": "^3.0.0",
+ "mocha": "^3.0.0"
+ },
+ "scripts": {
+ "test": "mocha --reporter spec",
+ "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot",
+ "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot"
+ },
+ "keywords": [
+ "promisify",
+ "promise",
+ "thenify",
+ "then",
+ "es6"
+ ],
+ "files": [
+ "index.js",
+ "child_process.js",
+ "crypto.js",
+ "dns.js",
+ "fs.js",
+ "readline.js",
+ "zlib.js"
+ ]
+}
diff --git a/node_modules/mz/readline.js b/node_modules/mz/readline.js
new file mode 100644
index 0000000..eb70c46
--- /dev/null
+++ b/node_modules/mz/readline.js
@@ -0,0 +1,64 @@
+var readline = require('readline')
+var Promise = require('any-promise')
+var objectAssign = require('object-assign')
+var Interface = readline.Interface
+
+function wrapCompleter (completer) {
+ if (completer.length === 2) return completer
+
+ return function (line, cb) {
+ var result = completer(line)
+
+ if (typeof result.then !== 'function') {
+ return cb(null, result)
+ }
+
+ result.catch(cb).then(function (result) {
+ process.nextTick(function () { cb(null, result) })
+ })
+ }
+}
+
+function InterfaceAsPromised (input, output, completer, terminal) {
+ if (arguments.length === 1) {
+ var options = input
+
+ if (typeof options.completer === 'function') {
+ options = objectAssign({}, options, {
+ completer: wrapCompleter(options.completer)
+ })
+ }
+
+ Interface.call(this, options)
+ } else {
+ if (typeof completer === 'function') {
+ completer = wrapCompleter(completer)
+ }
+
+ Interface.call(this, input, output, completer, terminal)
+ }
+}
+
+InterfaceAsPromised.prototype = Object.create(Interface.prototype)
+
+InterfaceAsPromised.prototype.question = function (question, callback) {
+ if (typeof callback === 'function') {
+ return Interface.prototype.question.call(this, question, callback)
+ }
+
+ var self = this
+ return new Promise(function (resolve) {
+ Interface.prototype.question.call(self, question, resolve)
+ })
+}
+
+objectAssign(exports, readline, {
+ Interface: InterfaceAsPromised,
+ createInterface: function (input, output, completer, terminal) {
+ if (arguments.length === 1) {
+ return new InterfaceAsPromised(input)
+ }
+
+ return new InterfaceAsPromised(input, output, completer, terminal)
+ }
+})
diff --git a/node_modules/mz/zlib.js b/node_modules/mz/zlib.js
new file mode 100644
index 0000000..a05c26a
--- /dev/null
+++ b/node_modules/mz/zlib.js
@@ -0,0 +1,13 @@
+
+require('thenify-all').withCallback(
+ require('zlib'),
+ exports, [
+ 'deflate',
+ 'deflateRaw',
+ 'gzip',
+ 'gunzip',
+ 'inflate',
+ 'inflateRaw',
+ 'unzip',
+ ]
+)
diff --git a/node_modules/nanoid/LICENSE b/node_modules/nanoid/LICENSE
new file mode 100644
index 0000000..37f56aa
--- /dev/null
+++ b/node_modules/nanoid/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright 2017 Andrey Sitnik
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/nanoid/README.md b/node_modules/nanoid/README.md
new file mode 100644
index 0000000..35abb57
--- /dev/null
+++ b/node_modules/nanoid/README.md
@@ -0,0 +1,39 @@
+# Nano ID
+
+
+
+**English** | [Русский](./README.ru.md) | [简体中文](./README.zh-CN.md) | [Bahasa Indonesia](./README.id-ID.md)
+
+A tiny, secure, URL-friendly, unique string ID generator for JavaScript.
+
+> “An amazing level of senseless perfectionism,
+> which is simply impossible not to respect.”
+
+* **Small.** 130 bytes (minified and gzipped). No dependencies.
+ [Size Limit] controls the size.
+* **Fast.** It is 2 times faster than UUID.
+* **Safe.** It uses hardware random generator. Can be used in clusters.
+* **Short IDs.** It uses a larger alphabet than UUID (`A-Za-z0-9_-`).
+ So ID size was reduced from 36 to 21 symbols.
+* **Portable.** Nano ID was ported
+ to [20 programming languages](#other-programming-languages).
+
+```js
+import { nanoid } from 'nanoid'
+model.id = nanoid() //=> "V1StGXR8_Z5jdHi6B-myT"
+```
+
+Supports modern browsers, IE [with Babel], Node.js and React Native.
+
+[online tool]: https://gitpod.io/#https://github.com/ai/nanoid/
+[with Babel]: https://developer.epages.com/blog/coding/how-to-transpile-node-modules-with-babel-and-webpack-in-a-monorepo/
+[Size Limit]: https://github.com/ai/size-limit
+
+
+
+
+
+## Docs
+Read full docs **[here](https://github.com/ai/nanoid#readme)**.
diff --git a/node_modules/nanoid/async/index.browser.cjs b/node_modules/nanoid/async/index.browser.cjs
new file mode 100644
index 0000000..7e5bba8
--- /dev/null
+++ b/node_modules/nanoid/async/index.browser.cjs
@@ -0,0 +1,34 @@
+let random = async bytes => crypto.getRandomValues(new Uint8Array(bytes))
+let customAlphabet = (alphabet, defaultSize = 21) => {
+ let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1
+ let step = -~((1.6 * mask * defaultSize) / alphabet.length)
+ return async (size = defaultSize) => {
+ let id = ''
+ while (true) {
+ let bytes = crypto.getRandomValues(new Uint8Array(step))
+ let i = step
+ while (i--) {
+ id += alphabet[bytes[i] & mask] || ''
+ if (id.length === size) return id
+ }
+ }
+ }
+}
+let nanoid = async (size = 21) => {
+ let id = ''
+ let bytes = crypto.getRandomValues(new Uint8Array(size))
+ while (size--) {
+ let byte = bytes[size] & 63
+ if (byte < 36) {
+ id += byte.toString(36)
+ } else if (byte < 62) {
+ id += (byte - 26).toString(36).toUpperCase()
+ } else if (byte < 63) {
+ id += '_'
+ } else {
+ id += '-'
+ }
+ }
+ return id
+}
+module.exports = { nanoid, customAlphabet, random }
diff --git a/node_modules/nanoid/async/index.browser.js b/node_modules/nanoid/async/index.browser.js
new file mode 100644
index 0000000..5ece04d
--- /dev/null
+++ b/node_modules/nanoid/async/index.browser.js
@@ -0,0 +1,34 @@
+let random = async bytes => crypto.getRandomValues(new Uint8Array(bytes))
+let customAlphabet = (alphabet, defaultSize = 21) => {
+ let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1
+ let step = -~((1.6 * mask * defaultSize) / alphabet.length)
+ return async (size = defaultSize) => {
+ let id = ''
+ while (true) {
+ let bytes = crypto.getRandomValues(new Uint8Array(step))
+ let i = step
+ while (i--) {
+ id += alphabet[bytes[i] & mask] || ''
+ if (id.length === size) return id
+ }
+ }
+ }
+}
+let nanoid = async (size = 21) => {
+ let id = ''
+ let bytes = crypto.getRandomValues(new Uint8Array(size))
+ while (size--) {
+ let byte = bytes[size] & 63
+ if (byte < 36) {
+ id += byte.toString(36)
+ } else if (byte < 62) {
+ id += (byte - 26).toString(36).toUpperCase()
+ } else if (byte < 63) {
+ id += '_'
+ } else {
+ id += '-'
+ }
+ }
+ return id
+}
+export { nanoid, customAlphabet, random }
diff --git a/node_modules/nanoid/async/index.cjs b/node_modules/nanoid/async/index.cjs
new file mode 100644
index 0000000..50db105
--- /dev/null
+++ b/node_modules/nanoid/async/index.cjs
@@ -0,0 +1,35 @@
+let crypto = require('crypto')
+let { urlAlphabet } = require('../url-alphabet/index.cjs')
+let random = bytes =>
+ new Promise((resolve, reject) => {
+ crypto.randomFill(Buffer.allocUnsafe(bytes), (err, buf) => {
+ if (err) {
+ reject(err)
+ } else {
+ resolve(buf)
+ }
+ })
+ })
+let customAlphabet = (alphabet, defaultSize = 21) => {
+ let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
+ let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)
+ let tick = (id, size = defaultSize) =>
+ random(step).then(bytes => {
+ let i = step
+ while (i--) {
+ id += alphabet[bytes[i] & mask] || ''
+ if (id.length === size) return id
+ }
+ return tick(id, size)
+ })
+ return size => tick('', size)
+}
+let nanoid = (size = 21) =>
+ random(size).then(bytes => {
+ let id = ''
+ while (size--) {
+ id += urlAlphabet[bytes[size] & 63]
+ }
+ return id
+ })
+module.exports = { nanoid, customAlphabet, random }
diff --git a/node_modules/nanoid/async/index.d.ts b/node_modules/nanoid/async/index.d.ts
new file mode 100644
index 0000000..9e91965
--- /dev/null
+++ b/node_modules/nanoid/async/index.d.ts
@@ -0,0 +1,56 @@
+/**
+ * Generate secure URL-friendly unique ID. The non-blocking version.
+ *
+ * By default, the ID will have 21 symbols to have a collision probability
+ * similar to UUID v4.
+ *
+ * ```js
+ * import { nanoid } from 'nanoid/async'
+ * nanoid().then(id => {
+ * model.id = id
+ * })
+ * ```
+ *
+ * @param size Size of the ID. The default size is 21.
+ * @returns A promise with a random string.
+ */
+export function nanoid(size?: number): Promise
+
+/**
+ * A low-level function.
+ * Generate secure unique ID with custom alphabet. The non-blocking version.
+ *
+ * Alphabet must contain 256 symbols or less. Otherwise, the generator
+ * will not be secure.
+ *
+ * @param alphabet Alphabet used to generate the ID.
+ * @param defaultSize Size of the ID. The default size is 21.
+ * @returns A function that returns a promise with a random string.
+ *
+ * ```js
+ * import { customAlphabet } from 'nanoid/async'
+ * const nanoid = customAlphabet('0123456789абвгдеё', 5)
+ * nanoid().then(id => {
+ * model.id = id //=> "8ё56а"
+ * })
+ * ```
+ */
+export function customAlphabet(
+ alphabet: string,
+ defaultSize?: number
+): (size?: number) => Promise
+
+/**
+ * Generate an array of random bytes collected from hardware noise.
+ *
+ * ```js
+ * import { random } from 'nanoid/async'
+ * random(5).then(bytes => {
+ * bytes //=> [10, 67, 212, 67, 89]
+ * })
+ * ```
+ *
+ * @param bytes Size of the array.
+ * @returns A promise with a random bytes array.
+ */
+export function random(bytes: number): Promise
diff --git a/node_modules/nanoid/async/index.js b/node_modules/nanoid/async/index.js
new file mode 100644
index 0000000..803fad6
--- /dev/null
+++ b/node_modules/nanoid/async/index.js
@@ -0,0 +1,35 @@
+import crypto from 'crypto'
+import { urlAlphabet } from '../url-alphabet/index.js'
+let random = bytes =>
+ new Promise((resolve, reject) => {
+ crypto.randomFill(Buffer.allocUnsafe(bytes), (err, buf) => {
+ if (err) {
+ reject(err)
+ } else {
+ resolve(buf)
+ }
+ })
+ })
+let customAlphabet = (alphabet, defaultSize = 21) => {
+ let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
+ let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)
+ let tick = (id, size = defaultSize) =>
+ random(step).then(bytes => {
+ let i = step
+ while (i--) {
+ id += alphabet[bytes[i] & mask] || ''
+ if (id.length === size) return id
+ }
+ return tick(id, size)
+ })
+ return size => tick('', size)
+}
+let nanoid = (size = 21) =>
+ random(size).then(bytes => {
+ let id = ''
+ while (size--) {
+ id += urlAlphabet[bytes[size] & 63]
+ }
+ return id
+ })
+export { nanoid, customAlphabet, random }
diff --git a/node_modules/nanoid/async/index.native.js b/node_modules/nanoid/async/index.native.js
new file mode 100644
index 0000000..5cb3d57
--- /dev/null
+++ b/node_modules/nanoid/async/index.native.js
@@ -0,0 +1,26 @@
+import { getRandomBytesAsync } from 'expo-random'
+import { urlAlphabet } from '../url-alphabet/index.js'
+let random = getRandomBytesAsync
+let customAlphabet = (alphabet, defaultSize = 21) => {
+ let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
+ let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)
+ let tick = (id, size = defaultSize) =>
+ random(step).then(bytes => {
+ let i = step
+ while (i--) {
+ id += alphabet[bytes[i] & mask] || ''
+ if (id.length === size) return id
+ }
+ return tick(id, size)
+ })
+ return size => tick('', size)
+}
+let nanoid = (size = 21) =>
+ random(size).then(bytes => {
+ let id = ''
+ while (size--) {
+ id += urlAlphabet[bytes[size] & 63]
+ }
+ return id
+ })
+export { nanoid, customAlphabet, random }
diff --git a/node_modules/nanoid/async/package.json b/node_modules/nanoid/async/package.json
new file mode 100644
index 0000000..578cdb4
--- /dev/null
+++ b/node_modules/nanoid/async/package.json
@@ -0,0 +1,12 @@
+{
+ "type": "module",
+ "main": "index.cjs",
+ "module": "index.js",
+ "react-native": {
+ "./index.js": "./index.native.js"
+ },
+ "browser": {
+ "./index.js": "./index.browser.js",
+ "./index.cjs": "./index.browser.cjs"
+ }
+}
\ No newline at end of file
diff --git a/node_modules/nanoid/bin/nanoid.cjs b/node_modules/nanoid/bin/nanoid.cjs
new file mode 100644
index 0000000..c76db0f
--- /dev/null
+++ b/node_modules/nanoid/bin/nanoid.cjs
@@ -0,0 +1,55 @@
+#!/usr/bin/env node
+
+let { nanoid, customAlphabet } = require('..')
+
+function print(msg) {
+ process.stdout.write(msg + '\n')
+}
+
+function error(msg) {
+ process.stderr.write(msg + '\n')
+ process.exit(1)
+}
+
+if (process.argv.includes('--help') || process.argv.includes('-h')) {
+ print(`
+ Usage
+ $ nanoid [options]
+
+ Options
+ -s, --size Generated ID size
+ -a, --alphabet Alphabet to use
+ -h, --help Show this help
+
+ Examples
+ $ nanoid --s 15
+ S9sBF77U6sDB8Yg
+
+ $ nanoid --size 10 --alphabet abc
+ bcabababca`)
+ process.exit()
+}
+
+let alphabet, size
+for (let i = 2; i < process.argv.length; i++) {
+ let arg = process.argv[i]
+ if (arg === '--size' || arg === '-s') {
+ size = Number(process.argv[i + 1])
+ i += 1
+ if (Number.isNaN(size) || size <= 0) {
+ error('Size must be positive integer')
+ }
+ } else if (arg === '--alphabet' || arg === '-a') {
+ alphabet = process.argv[i + 1]
+ i += 1
+ } else {
+ error('Unknown argument ' + arg)
+ }
+}
+
+if (alphabet) {
+ let customNanoid = customAlphabet(alphabet, size)
+ print(customNanoid())
+} else {
+ print(nanoid(size))
+}
diff --git a/node_modules/nanoid/index.browser.cjs b/node_modules/nanoid/index.browser.cjs
new file mode 100644
index 0000000..f800d6f
--- /dev/null
+++ b/node_modules/nanoid/index.browser.cjs
@@ -0,0 +1,34 @@
+let { urlAlphabet } = require('./url-alphabet/index.cjs')
+let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))
+let customRandom = (alphabet, defaultSize, getRandom) => {
+ let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1
+ let step = -~((1.6 * mask * defaultSize) / alphabet.length)
+ return (size = defaultSize) => {
+ let id = ''
+ while (true) {
+ let bytes = getRandom(step)
+ let j = step
+ while (j--) {
+ id += alphabet[bytes[j] & mask] || ''
+ if (id.length === size) return id
+ }
+ }
+ }
+}
+let customAlphabet = (alphabet, size = 21) =>
+ customRandom(alphabet, size, random)
+let nanoid = (size = 21) =>
+ crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {
+ byte &= 63
+ if (byte < 36) {
+ id += byte.toString(36)
+ } else if (byte < 62) {
+ id += (byte - 26).toString(36).toUpperCase()
+ } else if (byte > 62) {
+ id += '-'
+ } else {
+ id += '_'
+ }
+ return id
+ }, '')
+module.exports = { nanoid, customAlphabet, customRandom, urlAlphabet, random }
diff --git a/node_modules/nanoid/index.browser.js b/node_modules/nanoid/index.browser.js
new file mode 100644
index 0000000..8b3139b
--- /dev/null
+++ b/node_modules/nanoid/index.browser.js
@@ -0,0 +1,34 @@
+import { urlAlphabet } from './url-alphabet/index.js'
+let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))
+let customRandom = (alphabet, defaultSize, getRandom) => {
+ let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1
+ let step = -~((1.6 * mask * defaultSize) / alphabet.length)
+ return (size = defaultSize) => {
+ let id = ''
+ while (true) {
+ let bytes = getRandom(step)
+ let j = step
+ while (j--) {
+ id += alphabet[bytes[j] & mask] || ''
+ if (id.length === size) return id
+ }
+ }
+ }
+}
+let customAlphabet = (alphabet, size = 21) =>
+ customRandom(alphabet, size, random)
+let nanoid = (size = 21) =>
+ crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {
+ byte &= 63
+ if (byte < 36) {
+ id += byte.toString(36)
+ } else if (byte < 62) {
+ id += (byte - 26).toString(36).toUpperCase()
+ } else if (byte > 62) {
+ id += '-'
+ } else {
+ id += '_'
+ }
+ return id
+ }, '')
+export { nanoid, customAlphabet, customRandom, urlAlphabet, random }
diff --git a/node_modules/nanoid/index.cjs b/node_modules/nanoid/index.cjs
new file mode 100644
index 0000000..0fa85e9
--- /dev/null
+++ b/node_modules/nanoid/index.cjs
@@ -0,0 +1,45 @@
+let crypto = require('crypto')
+let { urlAlphabet } = require('./url-alphabet/index.cjs')
+const POOL_SIZE_MULTIPLIER = 128
+let pool, poolOffset
+let fillPool = bytes => {
+ if (!pool || pool.length < bytes) {
+ pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)
+ crypto.randomFillSync(pool)
+ poolOffset = 0
+ } else if (poolOffset + bytes > pool.length) {
+ crypto.randomFillSync(pool)
+ poolOffset = 0
+ }
+ poolOffset += bytes
+}
+let random = bytes => {
+ fillPool((bytes -= 0))
+ return pool.subarray(poolOffset - bytes, poolOffset)
+}
+let customRandom = (alphabet, defaultSize, getRandom) => {
+ let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
+ let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)
+ return (size = defaultSize) => {
+ let id = ''
+ while (true) {
+ let bytes = getRandom(step)
+ let i = step
+ while (i--) {
+ id += alphabet[bytes[i] & mask] || ''
+ if (id.length === size) return id
+ }
+ }
+ }
+}
+let customAlphabet = (alphabet, size = 21) =>
+ customRandom(alphabet, size, random)
+let nanoid = (size = 21) => {
+ fillPool((size -= 0))
+ let id = ''
+ for (let i = poolOffset - size; i < poolOffset; i++) {
+ id += urlAlphabet[pool[i] & 63]
+ }
+ return id
+}
+module.exports = { nanoid, customAlphabet, customRandom, urlAlphabet, random }
diff --git a/node_modules/nanoid/index.d.cts b/node_modules/nanoid/index.d.cts
new file mode 100644
index 0000000..3e111a3
--- /dev/null
+++ b/node_modules/nanoid/index.d.cts
@@ -0,0 +1,91 @@
+/**
+ * Generate secure URL-friendly unique ID.
+ *
+ * By default, the ID will have 21 symbols to have a collision probability
+ * similar to UUID v4.
+ *
+ * ```js
+ * import { nanoid } from 'nanoid'
+ * model.id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqL"
+ * ```
+ *
+ * @param size Size of the ID. The default size is 21.
+ * @returns A random string.
+ */
+export function nanoid(size?: number): string
+
+/**
+ * Generate secure unique ID with custom alphabet.
+ *
+ * Alphabet must contain 256 symbols or less. Otherwise, the generator
+ * will not be secure.
+ *
+ * @param alphabet Alphabet used to generate the ID.
+ * @param defaultSize Size of the ID. The default size is 21.
+ * @returns A random string generator.
+ *
+ * ```js
+ * const { customAlphabet } = require('nanoid')
+ * const nanoid = customAlphabet('0123456789абвгдеё', 5)
+ * nanoid() //=> "8ё56а"
+ * ```
+ */
+export function customAlphabet(
+ alphabet: string,
+ defaultSize?: number
+): (size?: number) => string
+
+/**
+ * Generate unique ID with custom random generator and alphabet.
+ *
+ * Alphabet must contain 256 symbols or less. Otherwise, the generator
+ * will not be secure.
+ *
+ * ```js
+ * import { customRandom } from 'nanoid/format'
+ *
+ * const nanoid = customRandom('abcdef', 5, size => {
+ * const random = []
+ * for (let i = 0; i < size; i++) {
+ * random.push(randomByte())
+ * }
+ * return random
+ * })
+ *
+ * nanoid() //=> "fbaef"
+ * ```
+ *
+ * @param alphabet Alphabet used to generate a random string.
+ * @param size Size of the random string.
+ * @param random A random bytes generator.
+ * @returns A random string generator.
+ */
+export function customRandom(
+ alphabet: string,
+ size: number,
+ random: (bytes: number) => Uint8Array
+): () => string
+
+/**
+ * URL safe symbols.
+ *
+ * ```js
+ * import { urlAlphabet } from 'nanoid'
+ * const nanoid = customAlphabet(urlAlphabet, 10)
+ * nanoid() //=> "Uakgb_J5m9"
+ * ```
+ */
+export const urlAlphabet: string
+
+/**
+ * Generate an array of random bytes collected from hardware noise.
+ *
+ * ```js
+ * import { customRandom, random } from 'nanoid'
+ * const nanoid = customRandom("abcdef", 5, random)
+ * ```
+ *
+ * @param bytes Size of the array.
+ * @returns An array of random bytes.
+ */
+export function random(bytes: number): Uint8Array
diff --git a/node_modules/nanoid/index.d.ts b/node_modules/nanoid/index.d.ts
new file mode 100644
index 0000000..3e111a3
--- /dev/null
+++ b/node_modules/nanoid/index.d.ts
@@ -0,0 +1,91 @@
+/**
+ * Generate secure URL-friendly unique ID.
+ *
+ * By default, the ID will have 21 symbols to have a collision probability
+ * similar to UUID v4.
+ *
+ * ```js
+ * import { nanoid } from 'nanoid'
+ * model.id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqL"
+ * ```
+ *
+ * @param size Size of the ID. The default size is 21.
+ * @returns A random string.
+ */
+export function nanoid(size?: number): string
+
+/**
+ * Generate secure unique ID with custom alphabet.
+ *
+ * Alphabet must contain 256 symbols or less. Otherwise, the generator
+ * will not be secure.
+ *
+ * @param alphabet Alphabet used to generate the ID.
+ * @param defaultSize Size of the ID. The default size is 21.
+ * @returns A random string generator.
+ *
+ * ```js
+ * const { customAlphabet } = require('nanoid')
+ * const nanoid = customAlphabet('0123456789абвгдеё', 5)
+ * nanoid() //=> "8ё56а"
+ * ```
+ */
+export function customAlphabet(
+ alphabet: string,
+ defaultSize?: number
+): (size?: number) => string
+
+/**
+ * Generate unique ID with custom random generator and alphabet.
+ *
+ * Alphabet must contain 256 symbols or less. Otherwise, the generator
+ * will not be secure.
+ *
+ * ```js
+ * import { customRandom } from 'nanoid/format'
+ *
+ * const nanoid = customRandom('abcdef', 5, size => {
+ * const random = []
+ * for (let i = 0; i < size; i++) {
+ * random.push(randomByte())
+ * }
+ * return random
+ * })
+ *
+ * nanoid() //=> "fbaef"
+ * ```
+ *
+ * @param alphabet Alphabet used to generate a random string.
+ * @param size Size of the random string.
+ * @param random A random bytes generator.
+ * @returns A random string generator.
+ */
+export function customRandom(
+ alphabet: string,
+ size: number,
+ random: (bytes: number) => Uint8Array
+): () => string
+
+/**
+ * URL safe symbols.
+ *
+ * ```js
+ * import { urlAlphabet } from 'nanoid'
+ * const nanoid = customAlphabet(urlAlphabet, 10)
+ * nanoid() //=> "Uakgb_J5m9"
+ * ```
+ */
+export const urlAlphabet: string
+
+/**
+ * Generate an array of random bytes collected from hardware noise.
+ *
+ * ```js
+ * import { customRandom, random } from 'nanoid'
+ * const nanoid = customRandom("abcdef", 5, random)
+ * ```
+ *
+ * @param bytes Size of the array.
+ * @returns An array of random bytes.
+ */
+export function random(bytes: number): Uint8Array
diff --git a/node_modules/nanoid/index.js b/node_modules/nanoid/index.js
new file mode 100644
index 0000000..21e155f
--- /dev/null
+++ b/node_modules/nanoid/index.js
@@ -0,0 +1,45 @@
+import crypto from 'crypto'
+import { urlAlphabet } from './url-alphabet/index.js'
+const POOL_SIZE_MULTIPLIER = 128
+let pool, poolOffset
+let fillPool = bytes => {
+ if (!pool || pool.length < bytes) {
+ pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)
+ crypto.randomFillSync(pool)
+ poolOffset = 0
+ } else if (poolOffset + bytes > pool.length) {
+ crypto.randomFillSync(pool)
+ poolOffset = 0
+ }
+ poolOffset += bytes
+}
+let random = bytes => {
+ fillPool((bytes -= 0))
+ return pool.subarray(poolOffset - bytes, poolOffset)
+}
+let customRandom = (alphabet, defaultSize, getRandom) => {
+ let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
+ let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)
+ return (size = defaultSize) => {
+ let id = ''
+ while (true) {
+ let bytes = getRandom(step)
+ let i = step
+ while (i--) {
+ id += alphabet[bytes[i] & mask] || ''
+ if (id.length === size) return id
+ }
+ }
+ }
+}
+let customAlphabet = (alphabet, size = 21) =>
+ customRandom(alphabet, size, random)
+let nanoid = (size = 21) => {
+ fillPool((size -= 0))
+ let id = ''
+ for (let i = poolOffset - size; i < poolOffset; i++) {
+ id += urlAlphabet[pool[i] & 63]
+ }
+ return id
+}
+export { nanoid, customAlphabet, customRandom, urlAlphabet, random }
diff --git a/node_modules/nanoid/nanoid.js b/node_modules/nanoid/nanoid.js
new file mode 100644
index 0000000..ec242ea
--- /dev/null
+++ b/node_modules/nanoid/nanoid.js
@@ -0,0 +1 @@
+export let nanoid=(t=21)=>crypto.getRandomValues(new Uint8Array(t)).reduce(((t,e)=>t+=(e&=63)<36?e.toString(36):e<62?(e-26).toString(36).toUpperCase():e<63?"_":"-"),"");
\ No newline at end of file
diff --git a/node_modules/nanoid/non-secure/index.cjs b/node_modules/nanoid/non-secure/index.cjs
new file mode 100644
index 0000000..09d57cd
--- /dev/null
+++ b/node_modules/nanoid/non-secure/index.cjs
@@ -0,0 +1,21 @@
+let urlAlphabet =
+ 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
+let customAlphabet = (alphabet, defaultSize = 21) => {
+ return (size = defaultSize) => {
+ let id = ''
+ let i = size
+ while (i--) {
+ id += alphabet[(Math.random() * alphabet.length) | 0]
+ }
+ return id
+ }
+}
+let nanoid = (size = 21) => {
+ let id = ''
+ let i = size
+ while (i--) {
+ id += urlAlphabet[(Math.random() * 64) | 0]
+ }
+ return id
+}
+module.exports = { nanoid, customAlphabet }
diff --git a/node_modules/nanoid/non-secure/index.d.ts b/node_modules/nanoid/non-secure/index.d.ts
new file mode 100644
index 0000000..4965322
--- /dev/null
+++ b/node_modules/nanoid/non-secure/index.d.ts
@@ -0,0 +1,33 @@
+/**
+ * Generate URL-friendly unique ID. This method uses the non-secure
+ * predictable random generator with bigger collision probability.
+ *
+ * ```js
+ * import { nanoid } from 'nanoid/non-secure'
+ * model.id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqL"
+ * ```
+ *
+ * @param size Size of the ID. The default size is 21.
+ * @returns A random string.
+ */
+export function nanoid(size?: number): string
+
+/**
+ * Generate a unique ID based on a custom alphabet.
+ * This method uses the non-secure predictable random generator
+ * with bigger collision probability.
+ *
+ * @param alphabet Alphabet used to generate the ID.
+ * @param defaultSize Size of the ID. The default size is 21.
+ * @returns A random string generator.
+ *
+ * ```js
+ * import { customAlphabet } from 'nanoid/non-secure'
+ * const nanoid = customAlphabet('0123456789абвгдеё', 5)
+ * model.id = //=> "8ё56а"
+ * ```
+ */
+export function customAlphabet(
+ alphabet: string,
+ defaultSize?: number
+): (size?: number) => string
diff --git a/node_modules/nanoid/non-secure/index.js b/node_modules/nanoid/non-secure/index.js
new file mode 100644
index 0000000..e7e19ad
--- /dev/null
+++ b/node_modules/nanoid/non-secure/index.js
@@ -0,0 +1,21 @@
+let urlAlphabet =
+ 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
+let customAlphabet = (alphabet, defaultSize = 21) => {
+ return (size = defaultSize) => {
+ let id = ''
+ let i = size
+ while (i--) {
+ id += alphabet[(Math.random() * alphabet.length) | 0]
+ }
+ return id
+ }
+}
+let nanoid = (size = 21) => {
+ let id = ''
+ let i = size
+ while (i--) {
+ id += urlAlphabet[(Math.random() * 64) | 0]
+ }
+ return id
+}
+export { nanoid, customAlphabet }
diff --git a/node_modules/nanoid/non-secure/package.json b/node_modules/nanoid/non-secure/package.json
new file mode 100644
index 0000000..9930d6a
--- /dev/null
+++ b/node_modules/nanoid/non-secure/package.json
@@ -0,0 +1,6 @@
+{
+ "type": "module",
+ "main": "index.cjs",
+ "module": "index.js",
+ "react-native": "index.js"
+}
\ No newline at end of file
diff --git a/node_modules/nanoid/package.json b/node_modules/nanoid/package.json
new file mode 100644
index 0000000..4f24d96
--- /dev/null
+++ b/node_modules/nanoid/package.json
@@ -0,0 +1,88 @@
+{
+ "name": "nanoid",
+ "version": "3.3.7",
+ "description": "A tiny (116 bytes), secure URL-friendly unique string ID generator",
+ "keywords": [
+ "uuid",
+ "random",
+ "id",
+ "url"
+ ],
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ },
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "author": "Andrey Sitnik ",
+ "license": "MIT",
+ "repository": "ai/nanoid",
+ "browser": {
+ "./index.js": "./index.browser.js",
+ "./async/index.js": "./async/index.browser.js",
+ "./async/index.cjs": "./async/index.browser.cjs",
+ "./index.cjs": "./index.browser.cjs"
+ },
+ "react-native": "index.js",
+ "bin": "./bin/nanoid.cjs",
+ "sideEffects": false,
+ "types": "./index.d.ts",
+ "type": "module",
+ "main": "index.cjs",
+ "module": "index.js",
+ "exports": {
+ ".": {
+ "browser": "./index.browser.js",
+ "require": {
+ "types": "./index.d.cts",
+ "default": "./index.cjs"
+ },
+ "import": {
+ "types": "./index.d.ts",
+ "default": "./index.js"
+ },
+ "default": "./index.js"
+ },
+ "./package.json": "./package.json",
+ "./async/package.json": "./async/package.json",
+ "./async": {
+ "browser": "./async/index.browser.js",
+ "require": {
+ "types": "./index.d.cts",
+ "default": "./async/index.cjs"
+ },
+ "import": {
+ "types": "./index.d.ts",
+ "default": "./async/index.js"
+ },
+ "default": "./async/index.js"
+ },
+ "./non-secure/package.json": "./non-secure/package.json",
+ "./non-secure": {
+ "require": {
+ "types": "./index.d.cts",
+ "default": "./non-secure/index.cjs"
+ },
+ "import": {
+ "types": "./index.d.ts",
+ "default": "./non-secure/index.js"
+ },
+ "default": "./non-secure/index.js"
+ },
+ "./url-alphabet/package.json": "./url-alphabet/package.json",
+ "./url-alphabet": {
+ "require": {
+ "types": "./index.d.cts",
+ "default": "./url-alphabet/index.cjs"
+ },
+ "import": {
+ "types": "./index.d.ts",
+ "default": "./url-alphabet/index.js"
+ },
+ "default": "./url-alphabet/index.js"
+ }
+ }
+}
\ No newline at end of file
diff --git a/node_modules/nanoid/url-alphabet/index.cjs b/node_modules/nanoid/url-alphabet/index.cjs
new file mode 100644
index 0000000..757b709
--- /dev/null
+++ b/node_modules/nanoid/url-alphabet/index.cjs
@@ -0,0 +1,3 @@
+let urlAlphabet =
+ 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
+module.exports = { urlAlphabet }
diff --git a/node_modules/nanoid/url-alphabet/index.js b/node_modules/nanoid/url-alphabet/index.js
new file mode 100644
index 0000000..c2782e5
--- /dev/null
+++ b/node_modules/nanoid/url-alphabet/index.js
@@ -0,0 +1,3 @@
+let urlAlphabet =
+ 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
+export { urlAlphabet }
diff --git a/node_modules/nanoid/url-alphabet/package.json b/node_modules/nanoid/url-alphabet/package.json
new file mode 100644
index 0000000..9930d6a
--- /dev/null
+++ b/node_modules/nanoid/url-alphabet/package.json
@@ -0,0 +1,6 @@
+{
+ "type": "module",
+ "main": "index.cjs",
+ "module": "index.js",
+ "react-native": "index.js"
+}
\ No newline at end of file
diff --git a/node_modules/normalize-path/LICENSE b/node_modules/normalize-path/LICENSE
new file mode 100644
index 0000000..d32ab44
--- /dev/null
+++ b/node_modules/normalize-path/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2018, Jon Schlinkert.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/normalize-path/README.md b/node_modules/normalize-path/README.md
new file mode 100644
index 0000000..726d4d6
--- /dev/null
+++ b/node_modules/normalize-path/README.md
@@ -0,0 +1,127 @@
+# normalize-path [](https://www.npmjs.com/package/normalize-path) [](https://npmjs.org/package/normalize-path) [](https://npmjs.org/package/normalize-path) [](https://travis-ci.org/jonschlinkert/normalize-path)
+
+> Normalize slashes in a file path to be posix/unix-like forward slashes. Also condenses repeat slashes to a single slash and removes and trailing slashes, unless disabled.
+
+Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/):
+
+```sh
+$ npm install --save normalize-path
+```
+
+## Usage
+
+```js
+const normalize = require('normalize-path');
+
+console.log(normalize('\\foo\\bar\\baz\\'));
+//=> '/foo/bar/baz'
+```
+
+**win32 namespaces**
+
+```js
+console.log(normalize('\\\\?\\UNC\\Server01\\user\\docs\\Letter.txt'));
+//=> '//?/UNC/Server01/user/docs/Letter.txt'
+
+console.log(normalize('\\\\.\\CdRomX'));
+//=> '//./CdRomX'
+```
+
+**Consecutive slashes**
+
+Condenses multiple consecutive forward slashes (except for leading slashes in win32 namespaces) to a single slash.
+
+```js
+console.log(normalize('.//foo//bar///////baz/'));
+//=> './foo/bar/baz'
+```
+
+### Trailing slashes
+
+By default trailing slashes are removed. Pass `false` as the last argument to disable this behavior and _**keep** trailing slashes_:
+
+```js
+console.log(normalize('foo\\bar\\baz\\', false)); //=> 'foo/bar/baz/'
+console.log(normalize('./foo/bar/baz/', false)); //=> './foo/bar/baz/'
+```
+
+## Release history
+
+### v3.0
+
+No breaking changes in this release.
+
+* a check was added to ensure that [win32 namespaces](https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces) are handled properly by win32 `path.parse()` after a path has been normalized by this library.
+* a minor optimization was made to simplify how the trailing separator was handled
+
+## About
+
+
+Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
+
+
+
+
+Running Tests
+
+Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
+
+```sh
+$ npm install && npm test
+```
+
+
+
+
+Building docs
+
+_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
+
+To generate the readme, run the following command:
+
+```sh
+$ npm install -g verbose/verb#dev verb-generate-readme && verb
+```
+
+
+
+### Related projects
+
+Other useful path-related libraries:
+
+* [contains-path](https://www.npmjs.com/package/contains-path): Return true if a file path contains the given path. | [homepage](https://github.com/jonschlinkert/contains-path "Return true if a file path contains the given path.")
+* [is-absolute](https://www.npmjs.com/package/is-absolute): Returns true if a file path is absolute. Does not rely on the path module… [more](https://github.com/jonschlinkert/is-absolute) | [homepage](https://github.com/jonschlinkert/is-absolute "Returns true if a file path is absolute. Does not rely on the path module and can be used as a polyfill for node.js native `path.isAbolute`.")
+* [is-relative](https://www.npmjs.com/package/is-relative): Returns `true` if the path appears to be relative. | [homepage](https://github.com/jonschlinkert/is-relative "Returns `true` if the path appears to be relative.")
+* [parse-filepath](https://www.npmjs.com/package/parse-filepath): Pollyfill for node.js `path.parse`, parses a filepath into an object. | [homepage](https://github.com/jonschlinkert/parse-filepath "Pollyfill for node.js `path.parse`, parses a filepath into an object.")
+* [path-ends-with](https://www.npmjs.com/package/path-ends-with): Return `true` if a file path ends with the given string/suffix. | [homepage](https://github.com/jonschlinkert/path-ends-with "Return `true` if a file path ends with the given string/suffix.")
+* [unixify](https://www.npmjs.com/package/unixify): Convert Windows file paths to unix paths. | [homepage](https://github.com/jonschlinkert/unixify "Convert Windows file paths to unix paths.")
+
+### Contributors
+
+| **Commits** | **Contributor** |
+| --- | --- |
+| 35 | [jonschlinkert](https://github.com/jonschlinkert) |
+| 1 | [phated](https://github.com/phated) |
+
+### Author
+
+**Jon Schlinkert**
+
+* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
+* [GitHub Profile](https://github.com/jonschlinkert)
+* [Twitter Profile](https://twitter.com/jonschlinkert)
+
+### License
+
+Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert).
+Released under the [MIT License](LICENSE).
+
+***
+
+_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on April 19, 2018._
\ No newline at end of file
diff --git a/node_modules/normalize-path/index.js b/node_modules/normalize-path/index.js
new file mode 100644
index 0000000..6fac553
--- /dev/null
+++ b/node_modules/normalize-path/index.js
@@ -0,0 +1,35 @@
+/*!
+ * normalize-path
+ *
+ * Copyright (c) 2014-2018, Jon Schlinkert.
+ * Released under the MIT License.
+ */
+
+module.exports = function(path, stripTrailing) {
+ if (typeof path !== 'string') {
+ throw new TypeError('expected path to be a string');
+ }
+
+ if (path === '\\' || path === '/') return '/';
+
+ var len = path.length;
+ if (len <= 1) return path;
+
+ // ensure that win32 namespaces has two leading slashes, so that the path is
+ // handled properly by the win32 version of path.parse() after being normalized
+ // https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces
+ var prefix = '';
+ if (len > 4 && path[3] === '\\') {
+ var ch = path[2];
+ if ((ch === '?' || ch === '.') && path.slice(0, 2) === '\\\\') {
+ path = path.slice(2);
+ prefix = '//';
+ }
+ }
+
+ var segs = path.split(/[/\\]+/);
+ if (stripTrailing !== false && segs[segs.length - 1] === '') {
+ segs.pop();
+ }
+ return prefix + segs.join('/');
+};
diff --git a/node_modules/normalize-path/package.json b/node_modules/normalize-path/package.json
new file mode 100644
index 0000000..ad61098
--- /dev/null
+++ b/node_modules/normalize-path/package.json
@@ -0,0 +1,77 @@
+{
+ "name": "normalize-path",
+ "description": "Normalize slashes in a file path to be posix/unix-like forward slashes. Also condenses repeat slashes to a single slash and removes and trailing slashes, unless disabled.",
+ "version": "3.0.0",
+ "homepage": "https://github.com/jonschlinkert/normalize-path",
+ "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
+ "contributors": [
+ "Blaine Bublitz (https://twitter.com/BlaineBublitz)",
+ "Jon Schlinkert (http://twitter.com/jonschlinkert)"
+ ],
+ "repository": "jonschlinkert/normalize-path",
+ "bugs": {
+ "url": "https://github.com/jonschlinkert/normalize-path/issues"
+ },
+ "license": "MIT",
+ "files": [
+ "index.js"
+ ],
+ "main": "index.js",
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "devDependencies": {
+ "gulp-format-md": "^1.0.0",
+ "minimist": "^1.2.0",
+ "mocha": "^3.5.3"
+ },
+ "keywords": [
+ "absolute",
+ "backslash",
+ "delimiter",
+ "file",
+ "file-path",
+ "filepath",
+ "fix",
+ "forward",
+ "fp",
+ "fs",
+ "normalize",
+ "path",
+ "relative",
+ "separator",
+ "slash",
+ "slashes",
+ "trailing",
+ "unix",
+ "urix"
+ ],
+ "verb": {
+ "toc": false,
+ "layout": "default",
+ "tasks": [
+ "readme"
+ ],
+ "plugins": [
+ "gulp-format-md"
+ ],
+ "related": {
+ "description": "Other useful path-related libraries:",
+ "list": [
+ "contains-path",
+ "is-absolute",
+ "is-relative",
+ "parse-filepath",
+ "path-ends-with",
+ "path-ends-with",
+ "unixify"
+ ]
+ },
+ "lint": {
+ "reflinks": true
+ }
+ }
+}
diff --git a/node_modules/object-assign/index.js b/node_modules/object-assign/index.js
new file mode 100644
index 0000000..0930cf8
--- /dev/null
+++ b/node_modules/object-assign/index.js
@@ -0,0 +1,90 @@
+/*
+object-assign
+(c) Sindre Sorhus
+@license MIT
+*/
+
+'use strict';
+/* eslint-disable no-unused-vars */
+var getOwnPropertySymbols = Object.getOwnPropertySymbols;
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+var propIsEnumerable = Object.prototype.propertyIsEnumerable;
+
+function toObject(val) {
+ if (val === null || val === undefined) {
+ throw new TypeError('Object.assign cannot be called with null or undefined');
+ }
+
+ return Object(val);
+}
+
+function shouldUseNative() {
+ try {
+ if (!Object.assign) {
+ return false;
+ }
+
+ // Detect buggy property enumeration order in older V8 versions.
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=4118
+ var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
+ test1[5] = 'de';
+ if (Object.getOwnPropertyNames(test1)[0] === '5') {
+ return false;
+ }
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=3056
+ var test2 = {};
+ for (var i = 0; i < 10; i++) {
+ test2['_' + String.fromCharCode(i)] = i;
+ }
+ var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
+ return test2[n];
+ });
+ if (order2.join('') !== '0123456789') {
+ return false;
+ }
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=3056
+ var test3 = {};
+ 'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
+ test3[letter] = letter;
+ });
+ if (Object.keys(Object.assign({}, test3)).join('') !==
+ 'abcdefghijklmnopqrst') {
+ return false;
+ }
+
+ return true;
+ } catch (err) {
+ // We don't expect any of the above to throw, but better to be safe.
+ return false;
+ }
+}
+
+module.exports = shouldUseNative() ? Object.assign : function (target, source) {
+ var from;
+ var to = toObject(target);
+ var symbols;
+
+ for (var s = 1; s < arguments.length; s++) {
+ from = Object(arguments[s]);
+
+ for (var key in from) {
+ if (hasOwnProperty.call(from, key)) {
+ to[key] = from[key];
+ }
+ }
+
+ if (getOwnPropertySymbols) {
+ symbols = getOwnPropertySymbols(from);
+ for (var i = 0; i < symbols.length; i++) {
+ if (propIsEnumerable.call(from, symbols[i])) {
+ to[symbols[i]] = from[symbols[i]];
+ }
+ }
+ }
+ }
+
+ return to;
+};
diff --git a/node_modules/object-assign/license b/node_modules/object-assign/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/object-assign/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/object-assign/package.json b/node_modules/object-assign/package.json
new file mode 100644
index 0000000..503eb1e
--- /dev/null
+++ b/node_modules/object-assign/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "object-assign",
+ "version": "4.1.1",
+ "description": "ES2015 `Object.assign()` ponyfill",
+ "license": "MIT",
+ "repository": "sindresorhus/object-assign",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "test": "xo && ava",
+ "bench": "matcha bench.js"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "object",
+ "assign",
+ "extend",
+ "properties",
+ "es2015",
+ "ecmascript",
+ "harmony",
+ "ponyfill",
+ "prollyfill",
+ "polyfill",
+ "shim",
+ "browser"
+ ],
+ "devDependencies": {
+ "ava": "^0.16.0",
+ "lodash": "^4.16.4",
+ "matcha": "^0.7.0",
+ "xo": "^0.16.0"
+ }
+}
diff --git a/node_modules/object-assign/readme.md b/node_modules/object-assign/readme.md
new file mode 100644
index 0000000..1be09d3
--- /dev/null
+++ b/node_modules/object-assign/readme.md
@@ -0,0 +1,61 @@
+# object-assign [](https://travis-ci.org/sindresorhus/object-assign)
+
+> ES2015 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) [ponyfill](https://ponyfill.com)
+
+
+## Use the built-in
+
+Node.js 4 and up, as well as every evergreen browser (Chrome, Edge, Firefox, Opera, Safari),
+support `Object.assign()` :tada:. If you target only those environments, then by all
+means, use `Object.assign()` instead of this package.
+
+
+## Install
+
+```
+$ npm install --save object-assign
+```
+
+
+## Usage
+
+```js
+const objectAssign = require('object-assign');
+
+objectAssign({foo: 0}, {bar: 1});
+//=> {foo: 0, bar: 1}
+
+// multiple sources
+objectAssign({foo: 0}, {bar: 1}, {baz: 2});
+//=> {foo: 0, bar: 1, baz: 2}
+
+// overwrites equal keys
+objectAssign({foo: 0}, {foo: 1}, {foo: 2});
+//=> {foo: 2}
+
+// ignores null and undefined sources
+objectAssign({foo: 0}, null, {bar: 1}, undefined);
+//=> {foo: 0, bar: 1}
+```
+
+
+## API
+
+### objectAssign(target, [source, ...])
+
+Assigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones.
+
+
+## Resources
+
+- [ES2015 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign)
+
+
+## Related
+
+- [deep-assign](https://github.com/sindresorhus/deep-assign) - Recursive `Object.assign()`
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/object-hash/LICENSE b/node_modules/object-hash/LICENSE
new file mode 100644
index 0000000..6ea185f
--- /dev/null
+++ b/node_modules/object-hash/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 object-hash contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/object-hash/index.js b/node_modules/object-hash/index.js
new file mode 100644
index 0000000..962bf62
--- /dev/null
+++ b/node_modules/object-hash/index.js
@@ -0,0 +1,453 @@
+'use strict';
+
+var crypto = require('crypto');
+
+/**
+ * Exported function
+ *
+ * Options:
+ *
+ * - `algorithm` hash algo to be used by this instance: *'sha1', 'md5'
+ * - `excludeValues` {true|*false} hash object keys, values ignored
+ * - `encoding` hash encoding, supports 'buffer', '*hex', 'binary', 'base64'
+ * - `ignoreUnknown` {true|*false} ignore unknown object types
+ * - `replacer` optional function that replaces values before hashing
+ * - `respectFunctionProperties` {*true|false} consider function properties when hashing
+ * - `respectFunctionNames` {*true|false} consider 'name' property of functions for hashing
+ * - `respectType` {*true|false} Respect special properties (prototype, constructor)
+ * when hashing to distinguish between types
+ * - `unorderedArrays` {true|*false} Sort all arrays before hashing
+ * - `unorderedSets` {*true|false} Sort `Set` and `Map` instances before hashing
+ * * = default
+ *
+ * @param {object} object value to hash
+ * @param {object} options hashing options
+ * @return {string} hash value
+ * @api public
+ */
+exports = module.exports = objectHash;
+
+function objectHash(object, options){
+ options = applyDefaults(object, options);
+
+ return hash(object, options);
+}
+
+/**
+ * Exported sugar methods
+ *
+ * @param {object} object value to hash
+ * @return {string} hash value
+ * @api public
+ */
+exports.sha1 = function(object){
+ return objectHash(object);
+};
+exports.keys = function(object){
+ return objectHash(object, {excludeValues: true, algorithm: 'sha1', encoding: 'hex'});
+};
+exports.MD5 = function(object){
+ return objectHash(object, {algorithm: 'md5', encoding: 'hex'});
+};
+exports.keysMD5 = function(object){
+ return objectHash(object, {algorithm: 'md5', encoding: 'hex', excludeValues: true});
+};
+
+// Internals
+var hashes = crypto.getHashes ? crypto.getHashes().slice() : ['sha1', 'md5'];
+hashes.push('passthrough');
+var encodings = ['buffer', 'hex', 'binary', 'base64'];
+
+function applyDefaults(object, sourceOptions){
+ sourceOptions = sourceOptions || {};
+
+ // create a copy rather than mutating
+ var options = {};
+ options.algorithm = sourceOptions.algorithm || 'sha1';
+ options.encoding = sourceOptions.encoding || 'hex';
+ options.excludeValues = sourceOptions.excludeValues ? true : false;
+ options.algorithm = options.algorithm.toLowerCase();
+ options.encoding = options.encoding.toLowerCase();
+ options.ignoreUnknown = sourceOptions.ignoreUnknown !== true ? false : true; // default to false
+ options.respectType = sourceOptions.respectType === false ? false : true; // default to true
+ options.respectFunctionNames = sourceOptions.respectFunctionNames === false ? false : true;
+ options.respectFunctionProperties = sourceOptions.respectFunctionProperties === false ? false : true;
+ options.unorderedArrays = sourceOptions.unorderedArrays !== true ? false : true; // default to false
+ options.unorderedSets = sourceOptions.unorderedSets === false ? false : true; // default to false
+ options.unorderedObjects = sourceOptions.unorderedObjects === false ? false : true; // default to true
+ options.replacer = sourceOptions.replacer || undefined;
+ options.excludeKeys = sourceOptions.excludeKeys || undefined;
+
+ if(typeof object === 'undefined') {
+ throw new Error('Object argument required.');
+ }
+
+ // if there is a case-insensitive match in the hashes list, accept it
+ // (i.e. SHA256 for sha256)
+ for (var i = 0; i < hashes.length; ++i) {
+ if (hashes[i].toLowerCase() === options.algorithm.toLowerCase()) {
+ options.algorithm = hashes[i];
+ }
+ }
+
+ if(hashes.indexOf(options.algorithm) === -1){
+ throw new Error('Algorithm "' + options.algorithm + '" not supported. ' +
+ 'supported values: ' + hashes.join(', '));
+ }
+
+ if(encodings.indexOf(options.encoding) === -1 &&
+ options.algorithm !== 'passthrough'){
+ throw new Error('Encoding "' + options.encoding + '" not supported. ' +
+ 'supported values: ' + encodings.join(', '));
+ }
+
+ return options;
+}
+
+/** Check if the given function is a native function */
+function isNativeFunction(f) {
+ if ((typeof f) !== 'function') {
+ return false;
+ }
+ var exp = /^function\s+\w*\s*\(\s*\)\s*{\s+\[native code\]\s+}$/i;
+ return exp.exec(Function.prototype.toString.call(f)) != null;
+}
+
+function hash(object, options) {
+ var hashingStream;
+
+ if (options.algorithm !== 'passthrough') {
+ hashingStream = crypto.createHash(options.algorithm);
+ } else {
+ hashingStream = new PassThrough();
+ }
+
+ if (typeof hashingStream.write === 'undefined') {
+ hashingStream.write = hashingStream.update;
+ hashingStream.end = hashingStream.update;
+ }
+
+ var hasher = typeHasher(options, hashingStream);
+ hasher.dispatch(object);
+ if (!hashingStream.update) {
+ hashingStream.end('');
+ }
+
+ if (hashingStream.digest) {
+ return hashingStream.digest(options.encoding === 'buffer' ? undefined : options.encoding);
+ }
+
+ var buf = hashingStream.read();
+ if (options.encoding === 'buffer') {
+ return buf;
+ }
+
+ return buf.toString(options.encoding);
+}
+
+/**
+ * Expose streaming API
+ *
+ * @param {object} object Value to serialize
+ * @param {object} options Options, as for hash()
+ * @param {object} stream A stream to write the serializiation to
+ * @api public
+ */
+exports.writeToStream = function(object, options, stream) {
+ if (typeof stream === 'undefined') {
+ stream = options;
+ options = {};
+ }
+
+ options = applyDefaults(object, options);
+
+ return typeHasher(options, stream).dispatch(object);
+};
+
+function typeHasher(options, writeTo, context){
+ context = context || [];
+ var write = function(str) {
+ if (writeTo.update) {
+ return writeTo.update(str, 'utf8');
+ } else {
+ return writeTo.write(str, 'utf8');
+ }
+ };
+
+ return {
+ dispatch: function(value){
+ if (options.replacer) {
+ value = options.replacer(value);
+ }
+
+ var type = typeof value;
+ if (value === null) {
+ type = 'null';
+ }
+
+ //console.log("[DEBUG] Dispatch: ", value, "->", type, " -> ", "_" + type);
+
+ return this['_' + type](value);
+ },
+ _object: function(object) {
+ var pattern = (/\[object (.*)\]/i);
+ var objString = Object.prototype.toString.call(object);
+ var objType = pattern.exec(objString);
+ if (!objType) { // object type did not match [object ...]
+ objType = 'unknown:[' + objString + ']';
+ } else {
+ objType = objType[1]; // take only the class name
+ }
+
+ objType = objType.toLowerCase();
+
+ var objectNumber = null;
+
+ if ((objectNumber = context.indexOf(object)) >= 0) {
+ return this.dispatch('[CIRCULAR:' + objectNumber + ']');
+ } else {
+ context.push(object);
+ }
+
+ if (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(object)) {
+ write('buffer:');
+ return write(object);
+ }
+
+ if(objType !== 'object' && objType !== 'function' && objType !== 'asyncfunction') {
+ if(this['_' + objType]) {
+ this['_' + objType](object);
+ } else if (options.ignoreUnknown) {
+ return write('[' + objType + ']');
+ } else {
+ throw new Error('Unknown object type "' + objType + '"');
+ }
+ }else{
+ var keys = Object.keys(object);
+ if (options.unorderedObjects) {
+ keys = keys.sort();
+ }
+ // Make sure to incorporate special properties, so
+ // Types with different prototypes will produce
+ // a different hash and objects derived from
+ // different functions (`new Foo`, `new Bar`) will
+ // produce different hashes.
+ // We never do this for native functions since some
+ // seem to break because of that.
+ if (options.respectType !== false && !isNativeFunction(object)) {
+ keys.splice(0, 0, 'prototype', '__proto__', 'constructor');
+ }
+
+ if (options.excludeKeys) {
+ keys = keys.filter(function(key) { return !options.excludeKeys(key); });
+ }
+
+ write('object:' + keys.length + ':');
+ var self = this;
+ return keys.forEach(function(key){
+ self.dispatch(key);
+ write(':');
+ if(!options.excludeValues) {
+ self.dispatch(object[key]);
+ }
+ write(',');
+ });
+ }
+ },
+ _array: function(arr, unordered){
+ unordered = typeof unordered !== 'undefined' ? unordered :
+ options.unorderedArrays !== false; // default to options.unorderedArrays
+
+ var self = this;
+ write('array:' + arr.length + ':');
+ if (!unordered || arr.length <= 1) {
+ return arr.forEach(function(entry) {
+ return self.dispatch(entry);
+ });
+ }
+
+ // the unordered case is a little more complicated:
+ // since there is no canonical ordering on objects,
+ // i.e. {a:1} < {a:2} and {a:1} > {a:2} are both false,
+ // we first serialize each entry using a PassThrough stream
+ // before sorting.
+ // also: we can’t use the same context array for all entries
+ // since the order of hashing should *not* matter. instead,
+ // we keep track of the additions to a copy of the context array
+ // and add all of them to the global context array when we’re done
+ var contextAdditions = [];
+ var entries = arr.map(function(entry) {
+ var strm = new PassThrough();
+ var localContext = context.slice(); // make copy
+ var hasher = typeHasher(options, strm, localContext);
+ hasher.dispatch(entry);
+ // take only what was added to localContext and append it to contextAdditions
+ contextAdditions = contextAdditions.concat(localContext.slice(context.length));
+ return strm.read().toString();
+ });
+ context = context.concat(contextAdditions);
+ entries.sort();
+ return this._array(entries, false);
+ },
+ _date: function(date){
+ return write('date:' + date.toJSON());
+ },
+ _symbol: function(sym){
+ return write('symbol:' + sym.toString());
+ },
+ _error: function(err){
+ return write('error:' + err.toString());
+ },
+ _boolean: function(bool){
+ return write('bool:' + bool.toString());
+ },
+ _string: function(string){
+ write('string:' + string.length + ':');
+ write(string.toString());
+ },
+ _function: function(fn){
+ write('fn:');
+ if (isNativeFunction(fn)) {
+ this.dispatch('[native]');
+ } else {
+ this.dispatch(fn.toString());
+ }
+
+ if (options.respectFunctionNames !== false) {
+ // Make sure we can still distinguish native functions
+ // by their name, otherwise String and Function will
+ // have the same hash
+ this.dispatch("function-name:" + String(fn.name));
+ }
+
+ if (options.respectFunctionProperties) {
+ this._object(fn);
+ }
+ },
+ _number: function(number){
+ return write('number:' + number.toString());
+ },
+ _xml: function(xml){
+ return write('xml:' + xml.toString());
+ },
+ _null: function() {
+ return write('Null');
+ },
+ _undefined: function() {
+ return write('Undefined');
+ },
+ _regexp: function(regex){
+ return write('regex:' + regex.toString());
+ },
+ _uint8array: function(arr){
+ write('uint8array:');
+ return this.dispatch(Array.prototype.slice.call(arr));
+ },
+ _uint8clampedarray: function(arr){
+ write('uint8clampedarray:');
+ return this.dispatch(Array.prototype.slice.call(arr));
+ },
+ _int8array: function(arr){
+ write('int8array:');
+ return this.dispatch(Array.prototype.slice.call(arr));
+ },
+ _uint16array: function(arr){
+ write('uint16array:');
+ return this.dispatch(Array.prototype.slice.call(arr));
+ },
+ _int16array: function(arr){
+ write('int16array:');
+ return this.dispatch(Array.prototype.slice.call(arr));
+ },
+ _uint32array: function(arr){
+ write('uint32array:');
+ return this.dispatch(Array.prototype.slice.call(arr));
+ },
+ _int32array: function(arr){
+ write('int32array:');
+ return this.dispatch(Array.prototype.slice.call(arr));
+ },
+ _float32array: function(arr){
+ write('float32array:');
+ return this.dispatch(Array.prototype.slice.call(arr));
+ },
+ _float64array: function(arr){
+ write('float64array:');
+ return this.dispatch(Array.prototype.slice.call(arr));
+ },
+ _arraybuffer: function(arr){
+ write('arraybuffer:');
+ return this.dispatch(new Uint8Array(arr));
+ },
+ _url: function(url) {
+ return write('url:' + url.toString(), 'utf8');
+ },
+ _map: function(map) {
+ write('map:');
+ var arr = Array.from(map);
+ return this._array(arr, options.unorderedSets !== false);
+ },
+ _set: function(set) {
+ write('set:');
+ var arr = Array.from(set);
+ return this._array(arr, options.unorderedSets !== false);
+ },
+ _file: function(file) {
+ write('file:');
+ return this.dispatch([file.name, file.size, file.type, file.lastModfied]);
+ },
+ _blob: function() {
+ if (options.ignoreUnknown) {
+ return write('[blob]');
+ }
+
+ throw Error('Hashing Blob objects is currently not supported\n' +
+ '(see https://github.com/puleos/object-hash/issues/26)\n' +
+ 'Use "options.replacer" or "options.ignoreUnknown"\n');
+ },
+ _domwindow: function() { return write('domwindow'); },
+ _bigint: function(number){
+ return write('bigint:' + number.toString());
+ },
+ /* Node.js standard native objects */
+ _process: function() { return write('process'); },
+ _timer: function() { return write('timer'); },
+ _pipe: function() { return write('pipe'); },
+ _tcp: function() { return write('tcp'); },
+ _udp: function() { return write('udp'); },
+ _tty: function() { return write('tty'); },
+ _statwatcher: function() { return write('statwatcher'); },
+ _securecontext: function() { return write('securecontext'); },
+ _connection: function() { return write('connection'); },
+ _zlib: function() { return write('zlib'); },
+ _context: function() { return write('context'); },
+ _nodescript: function() { return write('nodescript'); },
+ _httpparser: function() { return write('httpparser'); },
+ _dataview: function() { return write('dataview'); },
+ _signal: function() { return write('signal'); },
+ _fsevent: function() { return write('fsevent'); },
+ _tlswrap: function() { return write('tlswrap'); },
+ };
+}
+
+// Mini-implementation of stream.PassThrough
+// We are far from having need for the full implementation, and we can
+// make assumptions like "many writes, then only one final read"
+// and we can ignore encoding specifics
+function PassThrough() {
+ return {
+ buf: '',
+
+ write: function(b) {
+ this.buf += b;
+ },
+
+ end: function(b) {
+ this.buf += b;
+ },
+
+ read: function() {
+ return this.buf;
+ }
+ };
+}
diff --git a/node_modules/object-hash/package.json b/node_modules/object-hash/package.json
new file mode 100644
index 0000000..a72557f
--- /dev/null
+++ b/node_modules/object-hash/package.json
@@ -0,0 +1,53 @@
+{
+ "name": "object-hash",
+ "version": "3.0.0",
+ "description": "Generate hashes from javascript objects in node and the browser.",
+ "homepage": "https://github.com/puleos/object-hash",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/puleos/object-hash"
+ },
+ "keywords": [
+ "object",
+ "hash",
+ "sha1",
+ "md5"
+ ],
+ "bugs": {
+ "url": "https://github.com/puleos/object-hash/issues"
+ },
+ "scripts": {
+ "test": "node ./node_modules/.bin/mocha test",
+ "prepublish": "gulp dist"
+ },
+ "author": "Scott Puleo ",
+ "files": [
+ "index.js",
+ "dist/object_hash.js"
+ ],
+ "license": "MIT",
+ "devDependencies": {
+ "browserify": "^16.2.3",
+ "gulp": "^4.0.0",
+ "gulp-browserify": "^0.5.1",
+ "gulp-coveralls": "^0.1.4",
+ "gulp-exec": "^3.0.1",
+ "gulp-istanbul": "^1.1.3",
+ "gulp-jshint": "^2.0.0",
+ "gulp-mocha": "^5.0.0",
+ "gulp-rename": "^1.2.0",
+ "gulp-replace": "^1.0.0",
+ "gulp-uglify": "^3.0.0",
+ "jshint": "^2.8.0",
+ "jshint-stylish": "^2.1.0",
+ "karma": "^4.2.0",
+ "karma-chrome-launcher": "^2.2.0",
+ "karma-mocha": "^1.3.0",
+ "mocha": "^6.2.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "main": "./index.js",
+ "browser": "./dist/object_hash.js"
+}
diff --git a/node_modules/object-hash/readme.markdown b/node_modules/object-hash/readme.markdown
new file mode 100644
index 0000000..c507cf8
--- /dev/null
+++ b/node_modules/object-hash/readme.markdown
@@ -0,0 +1,198 @@
+# object-hash
+
+Generate hashes from objects and values in node and the browser. Uses node.js
+crypto module for hashing. Supports SHA1 and many others (depending on the platform)
+as well as custom streams (e.g. CRC32).
+
+[](https://www.npmjs.com/package/object-hash)
+
+[](https://secure.travis-ci.org/puleos/object-hash?branch=master)
+[](https://coveralls.io/github/puleos/object-hash?branch=master)
+
+* Hash values of any type.
+* Supports a keys only option for grouping similar objects with different values.
+
+```js
+var hash = require('object-hash');
+
+hash({foo: 'bar'}) // => '67b69634f9880a282c14a0f0cb7ba20cf5d677e9'
+hash([1, 2, 2.718, 3.14159]) // => '136b9b88375971dff9f1af09d7356e3e04281951'
+```
+
+## Versioning Disclaimer
+
+Starting with version `1.1.8` (released April 2017), new versions will consider
+the exact returned hash part of the API contract, i.e. changes that will affect
+hash values will be considered `semver-major`. Previous versions may violate
+that expectation.
+
+For more information, see [this discussion](https://github.com/puleos/object-hash/issues/30).
+
+## hash(value, options)
+
+Generate a hash from any object or type. Defaults to sha1 with hex encoding.
+
+* `algorithm` hash algo to be used: 'sha1', 'md5', 'passthrough'. default: sha1
+ * This supports the algorithms returned by `crypto.getHashes()`. Note that the default of SHA-1 is not considered secure, and a stronger algorithm should be used if a cryptographical hash is desired.
+ * This also supports the `passthrough` algorith, which will return the information that would otherwise have been hashed.
+* `excludeValues` {true|false} hash object keys, values ignored. default: false
+* `encoding` hash encoding, supports 'buffer', 'hex', 'binary', 'base64'. default: hex
+* `ignoreUnknown` {true|*false} ignore unknown object types. default: false
+* `replacer` optional function that replaces values before hashing. default: accept all values
+* `respectFunctionProperties` {true|false} Whether properties on functions are considered when hashing. default: true
+* `respectFunctionNames` {true|false} consider `name` property of functions for hashing. default: true
+* `respectType` {true|false} Whether special type attributes (`.prototype`, `.__proto__`, `.constructor`)
+ are hashed. default: true
+* `unorderedArrays` {true|false} Sort all arrays before hashing. Note that this affects *all* collections,
+ i.e. including typed arrays, Sets, Maps, etc. default: false
+* `unorderedSets` {true|false} Sort `Set` and `Map` instances before hashing, i.e. make
+ `hash(new Set([1, 2])) == hash(new Set([2, 1]))` return `true`. default: true
+* `unorderedObjects` {true|false} Sort objects before hashing, i.e. make `hash({ x: 1, y: 2 }) === hash({ y: 2, x: 1 })`. default: true
+* `excludeKeys` optional function for excluding specific key(s) from hashing, if true is returned then exclude from hash. default: include all keys
+
+## hash.sha1(value)
+
+Hash using the sha1 algorithm.
+
+Note that SHA-1 is not considered secure, and a stronger algorithm should be used if a cryptographical hash is desired.
+
+*Sugar method, equivalent to* `hash(value, {algorithm: 'sha1'})`
+
+## hash.keys(value)
+
+Hash object keys using the sha1 algorithm, values ignored.
+
+*Sugar method, equivalent to* `hash(value, {excludeValues: true})`
+
+## hash.MD5(value)
+
+Hash using the md5 algorithm.
+
+Note that the MD5 algorithm is not considered secure, and a stronger algorithm should be used if a cryptographical hash is desired.
+
+*Sugar method, equivalent to* `hash(value, {algorithm: 'md5'})`
+
+## hash.keysMD5(value)
+
+Hash object keys using the md5 algorithm, values ignored.
+
+Note that the MD5 algorithm is not considered secure, and a stronger algorithm should be used if a cryptographical hash is desired.
+
+*Sugar method, equivalent to* `hash(value, {algorithm: 'md5', excludeValues: true})`
+
+## hash.writeToStream(value, [options,] stream)
+
+Write the information that would otherwise have been hashed to a stream, e.g.:
+
+```js
+hash.writeToStream({foo: 'bar', a: 42}, {respectType: false}, process.stdout)
+// => e.g. 'object:a:number:42foo:string:bar'
+```
+
+## Installation
+
+node:
+
+```js
+npm install object-hash
+```
+
+browser: */dist/object_hash.js*
+
+```html
+
+
+
+```
+
+## Example usage
+
+```js
+var hash = require('object-hash');
+
+var peter = { name: 'Peter', stapler: false, friends: ['Joanna', 'Michael', 'Samir'] };
+var michael = { name: 'Michael', stapler: false, friends: ['Peter', 'Samir'] };
+var bob = { name: 'Bob', stapler: true, friends: [] };
+
+/***
+ * sha1 hex encoding (default)
+ */
+hash(peter);
+// 14fa461bf4b98155e82adc86532938553b4d33a9
+hash(michael);
+// 4b2b30e27699979ce46714253bc2213010db039c
+hash(bob);
+// 38d96106bc8ef3d8bd369b99bb6972702c9826d5
+
+/***
+ * hash object keys, values ignored
+ */
+hash(peter, { excludeValues: true });
+// 48f370a772c7496f6c9d2e6d92e920c87dd00a5c
+hash(michael, { excludeValues: true });
+// 48f370a772c7496f6c9d2e6d92e920c87dd00a5c
+hash.keys(bob);
+// 48f370a772c7496f6c9d2e6d92e920c87dd00a5c
+
+/***
+ * hash object, ignore specific key(s)
+ */
+hash(peter, { excludeKeys: function(key) {
+ if ( key === 'friends') {
+ return true;
+ }
+ return false;
+ }
+});
+// 66b7d7e64871aa9fda1bdc8e88a28df797648d80
+
+/***
+ * md5 base64 encoding
+ */
+hash(peter, { algorithm: 'md5', encoding: 'base64' });
+// 6rkWaaDiG3NynWw4svGH7g==
+hash(michael, { algorithm: 'md5', encoding: 'base64' });
+// djXaWpuWVJeOF8Sb6SFFNg==
+hash(bob, { algorithm: 'md5', encoding: 'base64' });
+// lFzkw/IJ8/12jZI0rQeS3w==
+```
+
+## Legacy Browser Support
+
+IE <= 8 and Opera <= 11 support dropped in version 0.3.0. If you require
+legacy browser support you must either use an ES5 shim or use version 0.2.5
+of this module.
+
+## Development
+
+```sh-session
+git clone https://github.com/puleos/object-hash
+```
+
+## Node Docker Wrapper
+
+If you want to stand this up in a docker container, you should take at look
+at the [](https://github.com/bean5/node-object-hash) project.
+
+### gulp tasks
+
+* `gulp watch` (default) watch files, test and lint on change/add
+* `gulp test` unit tests
+* `gulp karma` browser unit tests
+* `gulp lint` jshint
+* `gulp dist` create browser version in /dist
+
+## License
+
+MIT
+
+## Changelog
+
+### v2.0.0
+
+Only Node.js versions `>= 6.0.0` are being tested in CI now.
+No other breaking changes were introduced.
diff --git a/node_modules/package-json-from-dist/LICENSE.md b/node_modules/package-json-from-dist/LICENSE.md
new file mode 100644
index 0000000..881248b
--- /dev/null
+++ b/node_modules/package-json-from-dist/LICENSE.md
@@ -0,0 +1,63 @@
+All packages under `src/` are licensed according to the terms in
+their respective `LICENSE` or `LICENSE.md` files.
+
+The remainder of this project is licensed under the Blue Oak
+Model License, as follows:
+
+-----
+
+# Blue Oak Model License
+
+Version 1.0.0
+
+## Purpose
+
+This license gives everyone as much permission to work with
+this software as possible, while protecting contributors
+from liability.
+
+## Acceptance
+
+In order to receive this license, you must agree to its
+rules. The rules of this license are both obligations
+under that agreement and conditions to your license.
+You must not do anything with this software that triggers
+a rule that you cannot or will not follow.
+
+## Copyright
+
+Each contributor licenses you to do everything with this
+software that would otherwise infringe that contributor's
+copyright in it.
+
+## Notices
+
+You must ensure that everyone who gets a copy of
+any part of this software from you, with or without
+changes, also gets the text of this license or a link to
+.
+
+## Excuse
+
+If anyone notifies you in writing that you have not
+complied with [Notices](#notices), you can keep your
+license by taking all practical steps to comply within 30
+days after the notice. If you do not do so, your license
+ends immediately.
+
+## Patent
+
+Each contributor licenses you to do everything with this
+software that would otherwise infringe any patent claims
+they can license or become able to license.
+
+## Reliability
+
+No contributor can revoke this license.
+
+## No Liability
+
+***As far as the law allows, this software comes as is,
+without any warranty or condition, and no contributor
+will be liable to anyone for any damages related to this
+software or this license, under any kind of legal claim.***
diff --git a/node_modules/package-json-from-dist/README.md b/node_modules/package-json-from-dist/README.md
new file mode 100644
index 0000000..a9e1344
--- /dev/null
+++ b/node_modules/package-json-from-dist/README.md
@@ -0,0 +1,110 @@
+# package-json-from-dist
+
+Sometimes you want to load the `package.json` into your
+TypeScript program, and it's tempting to just `import
+'../package.json'`, since that seems to work.
+
+However, this requires `tsc` to make an entire copy of your
+`package.json` file into the `dist` folder, which is a problem if
+you're using something like
+[tshy](https://github.com/isaacs/tshy), which uses the
+`package.json` file in dist for another purpose. Even when that
+does work, it's asking the module system to do a bunch of extra
+fs system calls, just to load a version number or something. (See
+[this issue](https://github.com/isaacs/tshy/issues/61).)
+
+This module helps by just finding the package.json file
+appropriately, and reading and parsing it in the most normal
+fashion.
+
+## Caveats
+
+This _only_ works if your code builds into a target folder called
+`dist`, which is in the root of the package. It also requires
+that you do not have a folder named `node_modules` anywhere
+within your dev environment, or else it'll get the wrong answers
+there. (But, at least, that'll be in dev, so you're pretty likely
+to notice.)
+
+If you build to some other location, then you'll need a different
+approach. (Feel free to fork this module and make it your own, or
+just put the code right inline, there's not much of it.)
+
+## USAGE
+
+```js
+// src/index.ts
+import {
+ findPackageJson,
+ loadPackageJson,
+} from 'package-json-from-dist'
+
+const pj = findPackageJson(import.meta.url)
+console.log(`package.json found at ${pj}`)
+
+const pkg = loadPackageJson(import.meta.url)
+console.log(`Hello from ${pkg.name}@${pkg.version}`)
+```
+
+If your module is not directly in the `./src` folder, then you need
+to specify the path that you would expect to find the
+`package.json` when it's _not_ built to the `dist` folder.
+
+```js
+// src/components/something.ts
+import {
+ findPackageJson,
+ loadPackageJson,
+} from 'package-json-from-dist'
+
+const pj = findPackageJson(import.meta.url, '../../package.json')
+console.log(`package.json found at ${pj}`)
+
+const pkg = loadPackageJson(import.meta.url, '../../package.json')
+console.log(`Hello from ${pkg.name}@${pkg.version}`)
+```
+
+When running from CommmonJS, use `__filename` instead of
+`import.meta.url`.
+
+```js
+// src/index.cts
+import {
+ findPackageJson,
+ loadPackageJson,
+} from 'package-json-from-dist'
+
+const pj = findPackageJson(__filename)
+console.log(`package.json found at ${pj}`)
+
+const pkg = loadPackageJson(__filename)
+console.log(`Hello from ${pkg.name}@${pkg.version}`)
+```
+
+Since [tshy](https://github.com/isaacs/tshy) builds _both_
+CommonJS and ESM by default, you may find that you need a
+CommonJS override and some `//@ts-ignore` magic to make it work.
+
+`src/pkg.ts`:
+
+```js
+import {
+ findPackageJson,
+ loadPackageJson,
+} from 'package-json-from-dist'
+//@ts-ignore
+export const pkg = loadPackageJson(import.meta.url)
+//@ts-ignore
+export const pj = findPackageJson(import.meta.url)
+```
+
+`src/pkg-cjs.cts`:
+
+```js
+import {
+ findPackageJson,
+ loadPackageJson,
+} from 'package-json-from-dist'
+export const pkg = loadPackageJson(__filename)
+export const pj = findPackageJson(__filename)
+```
diff --git a/node_modules/package-json-from-dist/package.json b/node_modules/package-json-from-dist/package.json
new file mode 100644
index 0000000..a2d03c3
--- /dev/null
+++ b/node_modules/package-json-from-dist/package.json
@@ -0,0 +1,68 @@
+{
+ "name": "package-json-from-dist",
+ "version": "1.0.1",
+ "description": "Load the local package.json from either src or dist folder",
+ "main": "./dist/commonjs/index.js",
+ "exports": {
+ "./package.json": "./package.json",
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ }
+ },
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "prepare": "tshy",
+ "pretest": "npm run prepare",
+ "presnap": "npm run prepare",
+ "test": "tap",
+ "snap": "tap",
+ "format": "prettier --write . --log-level warn",
+ "typedoc": "typedoc"
+ },
+ "author": "Isaac Z. Schlueter (https://izs.me)",
+ "license": "BlueOak-1.0.0",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/package-json-from-dist.git"
+ },
+ "devDependencies": {
+ "@types/node": "^20.12.12",
+ "prettier": "^3.2.5",
+ "tap": "^18.5.3",
+ "typedoc": "^0.24.8",
+ "typescript": "^5.1.6",
+ "tshy": "^1.14.0"
+ },
+ "prettier": {
+ "semi": false,
+ "printWidth": 70,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf",
+ "experimentalTernaries": true
+ },
+ "tshy": {
+ "exports": {
+ "./package.json": "./package.json",
+ ".": "./src/index.ts"
+ }
+ },
+ "types": "./dist/commonjs/index.d.ts",
+ "type": "module"
+}
diff --git a/node_modules/path-key/index.d.ts b/node_modules/path-key/index.d.ts
new file mode 100644
index 0000000..7c575d1
--- /dev/null
+++ b/node_modules/path-key/index.d.ts
@@ -0,0 +1,40 @@
+///
+
+declare namespace pathKey {
+ interface Options {
+ /**
+ Use a custom environment variables object. Default: [`process.env`](https://nodejs.org/api/process.html#process_process_env).
+ */
+ readonly env?: {[key: string]: string | undefined};
+
+ /**
+ Get the PATH key for a specific platform. Default: [`process.platform`](https://nodejs.org/api/process.html#process_process_platform).
+ */
+ readonly platform?: NodeJS.Platform;
+ }
+}
+
+declare const pathKey: {
+ /**
+ Get the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) environment variable key cross-platform.
+
+ @example
+ ```
+ import pathKey = require('path-key');
+
+ const key = pathKey();
+ //=> 'PATH'
+
+ const PATH = process.env[key];
+ //=> '/usr/local/bin:/usr/bin:/bin'
+ ```
+ */
+ (options?: pathKey.Options): string;
+
+ // TODO: Remove this for the next major release, refactor the whole definition to:
+ // declare function pathKey(options?: pathKey.Options): string;
+ // export = pathKey;
+ default: typeof pathKey;
+};
+
+export = pathKey;
diff --git a/node_modules/path-key/index.js b/node_modules/path-key/index.js
new file mode 100644
index 0000000..0cf6415
--- /dev/null
+++ b/node_modules/path-key/index.js
@@ -0,0 +1,16 @@
+'use strict';
+
+const pathKey = (options = {}) => {
+ const environment = options.env || process.env;
+ const platform = options.platform || process.platform;
+
+ if (platform !== 'win32') {
+ return 'PATH';
+ }
+
+ return Object.keys(environment).reverse().find(key => key.toUpperCase() === 'PATH') || 'Path';
+};
+
+module.exports = pathKey;
+// TODO: Remove this for the next major release
+module.exports.default = pathKey;
diff --git a/node_modules/path-key/license b/node_modules/path-key/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/path-key/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/path-key/package.json b/node_modules/path-key/package.json
new file mode 100644
index 0000000..c8cbd38
--- /dev/null
+++ b/node_modules/path-key/package.json
@@ -0,0 +1,39 @@
+{
+ "name": "path-key",
+ "version": "3.1.1",
+ "description": "Get the PATH environment variable key cross-platform",
+ "license": "MIT",
+ "repository": "sindresorhus/path-key",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "files": [
+ "index.js",
+ "index.d.ts"
+ ],
+ "keywords": [
+ "path",
+ "key",
+ "environment",
+ "env",
+ "variable",
+ "var",
+ "get",
+ "cross-platform",
+ "windows"
+ ],
+ "devDependencies": {
+ "@types/node": "^11.13.0",
+ "ava": "^1.4.1",
+ "tsd": "^0.7.2",
+ "xo": "^0.24.0"
+ }
+}
diff --git a/node_modules/path-key/readme.md b/node_modules/path-key/readme.md
new file mode 100644
index 0000000..a9052d7
--- /dev/null
+++ b/node_modules/path-key/readme.md
@@ -0,0 +1,61 @@
+# path-key [](https://travis-ci.org/sindresorhus/path-key)
+
+> Get the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) environment variable key cross-platform
+
+It's usually `PATH`, but on Windows it can be any casing like `Path`...
+
+
+## Install
+
+```
+$ npm install path-key
+```
+
+
+## Usage
+
+```js
+const pathKey = require('path-key');
+
+const key = pathKey();
+//=> 'PATH'
+
+const PATH = process.env[key];
+//=> '/usr/local/bin:/usr/bin:/bin'
+```
+
+
+## API
+
+### pathKey(options?)
+
+#### options
+
+Type: `object`
+
+##### env
+
+Type: `object`
+Default: [`process.env`](https://nodejs.org/api/process.html#process_process_env)
+
+Use a custom environment variables object.
+
+#### platform
+
+Type: `string`
+Default: [`process.platform`](https://nodejs.org/api/process.html#process_process_platform)
+
+Get the PATH key for a specific platform.
+
+
+---
+
+
diff --git a/node_modules/path-parse/LICENSE b/node_modules/path-parse/LICENSE
new file mode 100644
index 0000000..810f3db
--- /dev/null
+++ b/node_modules/path-parse/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Javier Blanco
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/path-parse/README.md b/node_modules/path-parse/README.md
new file mode 100644
index 0000000..05097f8
--- /dev/null
+++ b/node_modules/path-parse/README.md
@@ -0,0 +1,42 @@
+# path-parse [](https://travis-ci.org/jbgutierrez/path-parse)
+
+> Node.js [`path.parse(pathString)`](https://nodejs.org/api/path.html#path_path_parse_pathstring) [ponyfill](https://ponyfill.com).
+
+## Install
+
+```
+$ npm install --save path-parse
+```
+
+## Usage
+
+```js
+var pathParse = require('path-parse');
+
+pathParse('/home/user/dir/file.txt');
+//=> {
+// root : "/",
+// dir : "/home/user/dir",
+// base : "file.txt",
+// ext : ".txt",
+// name : "file"
+// }
+```
+
+## API
+
+See [`path.parse(pathString)`](https://nodejs.org/api/path.html#path_path_parse_pathstring) docs.
+
+### pathParse(path)
+
+### pathParse.posix(path)
+
+The Posix specific version.
+
+### pathParse.win32(path)
+
+The Windows specific version.
+
+## License
+
+MIT © [Javier Blanco](http://jbgutierrez.info)
diff --git a/node_modules/path-parse/index.js b/node_modules/path-parse/index.js
new file mode 100644
index 0000000..f062d0a
--- /dev/null
+++ b/node_modules/path-parse/index.js
@@ -0,0 +1,75 @@
+'use strict';
+
+var isWindows = process.platform === 'win32';
+
+// Regex to split a windows path into into [dir, root, basename, name, ext]
+var splitWindowsRe =
+ /^(((?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?[\\\/]?)(?:[^\\\/]*[\\\/])*)((\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))[\\\/]*$/;
+
+var win32 = {};
+
+function win32SplitPath(filename) {
+ return splitWindowsRe.exec(filename).slice(1);
+}
+
+win32.parse = function(pathString) {
+ if (typeof pathString !== 'string') {
+ throw new TypeError(
+ "Parameter 'pathString' must be a string, not " + typeof pathString
+ );
+ }
+ var allParts = win32SplitPath(pathString);
+ if (!allParts || allParts.length !== 5) {
+ throw new TypeError("Invalid path '" + pathString + "'");
+ }
+ return {
+ root: allParts[1],
+ dir: allParts[0] === allParts[1] ? allParts[0] : allParts[0].slice(0, -1),
+ base: allParts[2],
+ ext: allParts[4],
+ name: allParts[3]
+ };
+};
+
+
+
+// Split a filename into [dir, root, basename, name, ext], unix version
+// 'root' is just a slash, or nothing.
+var splitPathRe =
+ /^((\/?)(?:[^\/]*\/)*)((\.{1,2}|[^\/]+?|)(\.[^.\/]*|))[\/]*$/;
+var posix = {};
+
+
+function posixSplitPath(filename) {
+ return splitPathRe.exec(filename).slice(1);
+}
+
+
+posix.parse = function(pathString) {
+ if (typeof pathString !== 'string') {
+ throw new TypeError(
+ "Parameter 'pathString' must be a string, not " + typeof pathString
+ );
+ }
+ var allParts = posixSplitPath(pathString);
+ if (!allParts || allParts.length !== 5) {
+ throw new TypeError("Invalid path '" + pathString + "'");
+ }
+
+ return {
+ root: allParts[1],
+ dir: allParts[0].slice(0, -1),
+ base: allParts[2],
+ ext: allParts[4],
+ name: allParts[3],
+ };
+};
+
+
+if (isWindows)
+ module.exports = win32.parse;
+else /* posix */
+ module.exports = posix.parse;
+
+module.exports.posix = posix.parse;
+module.exports.win32 = win32.parse;
diff --git a/node_modules/path-parse/package.json b/node_modules/path-parse/package.json
new file mode 100644
index 0000000..36c23f8
--- /dev/null
+++ b/node_modules/path-parse/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "path-parse",
+ "version": "1.0.7",
+ "description": "Node.js path.parse() ponyfill",
+ "main": "index.js",
+ "scripts": {
+ "test": "node test.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/jbgutierrez/path-parse.git"
+ },
+ "keywords": [
+ "path",
+ "paths",
+ "file",
+ "dir",
+ "parse",
+ "built-in",
+ "util",
+ "utils",
+ "core",
+ "ponyfill",
+ "polyfill",
+ "shim"
+ ],
+ "author": "Javier Blanco ",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/jbgutierrez/path-parse/issues"
+ },
+ "homepage": "https://github.com/jbgutierrez/path-parse#readme"
+}
diff --git a/node_modules/path-scurry/LICENSE.md b/node_modules/path-scurry/LICENSE.md
new file mode 100644
index 0000000..c5402b9
--- /dev/null
+++ b/node_modules/path-scurry/LICENSE.md
@@ -0,0 +1,55 @@
+# Blue Oak Model License
+
+Version 1.0.0
+
+## Purpose
+
+This license gives everyone as much permission to work with
+this software as possible, while protecting contributors
+from liability.
+
+## Acceptance
+
+In order to receive this license, you must agree to its
+rules. The rules of this license are both obligations
+under that agreement and conditions to your license.
+You must not do anything with this software that triggers
+a rule that you cannot or will not follow.
+
+## Copyright
+
+Each contributor licenses you to do everything with this
+software that would otherwise infringe that contributor's
+copyright in it.
+
+## Notices
+
+You must ensure that everyone who gets a copy of
+any part of this software from you, with or without
+changes, also gets the text of this license or a link to
+.
+
+## Excuse
+
+If anyone notifies you in writing that you have not
+complied with [Notices](#notices), you can keep your
+license by taking all practical steps to comply within 30
+days after the notice. If you do not do so, your license
+ends immediately.
+
+## Patent
+
+Each contributor licenses you to do everything with this
+software that would otherwise infringe any patent claims
+they can license or become able to license.
+
+## Reliability
+
+No contributor can revoke this license.
+
+## No Liability
+
+***As far as the law allows, this software comes as is,
+without any warranty or condition, and no contributor
+will be liable to anyone for any damages related to this
+software or this license, under any kind of legal claim.***
diff --git a/node_modules/path-scurry/README.md b/node_modules/path-scurry/README.md
new file mode 100644
index 0000000..b5cb495
--- /dev/null
+++ b/node_modules/path-scurry/README.md
@@ -0,0 +1,636 @@
+# path-scurry
+
+Extremely high performant utility for building tools that read
+the file system, minimizing filesystem and path string munging
+operations to the greatest degree possible.
+
+## Ugh, yet another file traversal thing on npm?
+
+Yes. None of the existing ones gave me exactly what I wanted.
+
+## Well what is it you wanted?
+
+While working on [glob](http://npm.im/glob), I found that I
+needed a module to very efficiently manage the traversal over a
+folder tree, such that:
+
+1. No `readdir()` or `stat()` would ever be called on the same
+ file or directory more than one time.
+2. No `readdir()` calls would be made if we can be reasonably
+ sure that the path is not a directory. (Ie, a previous
+ `readdir()` or `stat()` covered the path, and
+ `ent.isDirectory()` is false.)
+3. `path.resolve()`, `dirname()`, `basename()`, and other
+ string-parsing/munging operations are be minimized. This means
+ it has to track "provisional" child nodes that may not exist
+ (and if we find that they _don't_ exist, store that
+ information as well, so we don't have to ever check again).
+4. The API is not limited to use as a stream/iterator/etc. There
+ are many cases where an API like node's `fs` is preferrable.
+5. It's more important to prevent excess syscalls than to be up
+ to date, but it should be smart enough to know what it
+ _doesn't_ know, and go get it seamlessly when requested.
+6. Do not blow up the JS heap allocation if operating on a
+ directory with a huge number of entries.
+7. Handle all the weird aspects of Windows paths, like UNC paths
+ and drive letters and wrongway slashes, so that the consumer
+ can return canonical platform-specific paths without having to
+ parse or join or do any error-prone string munging.
+
+## PERFORMANCE
+
+JavaScript people throw around the word "blazing" a lot. I hope
+that this module doesn't blaze anyone. But it does go very fast,
+in the cases it's optimized for, if used properly.
+
+PathScurry provides ample opportunities to get extremely good
+performance, as well as several options to trade performance for
+convenience.
+
+Benchmarks can be run by executing `npm run bench`.
+
+As is always the case, doing more means going slower, doing less
+means going faster, and there are trade offs between speed and
+memory usage.
+
+PathScurry makes heavy use of [LRUCache](http://npm.im/lru-cache)
+to efficiently cache whatever it can, and `Path` objects remain
+in the graph for the lifetime of the walker, so repeated calls
+with a single PathScurry object will be extremely fast. However,
+adding items to a cold cache means "doing more", so in those
+cases, we pay a price. Nothing is free, but every effort has been
+made to reduce costs wherever possible.
+
+Also, note that a "cache as long as possible" approach means that
+changes to the filesystem may not be reflected in the results of
+repeated PathScurry operations.
+
+For resolving string paths, `PathScurry` ranges from 5-50 times
+faster than `path.resolve` on repeated resolutions, but around
+100 to 1000 times _slower_ on the first resolution. If your
+program is spending a lot of time resolving the _same_ paths
+repeatedly (like, thousands or millions of times), then this can
+be beneficial. But both implementations are pretty fast, and
+speeding up an infrequent operation from 4µs to 400ns is not
+going to move the needle on your app's performance.
+
+For walking file system directory trees, a lot depends on how
+often a given PathScurry object will be used, and also on the
+walk method used.
+
+With default settings on a folder tree of 100,000 items,
+consisting of around a 10-to-1 ratio of normal files to
+directories, PathScurry performs comparably to
+[@nodelib/fs.walk](http://npm.im/@nodelib/fs.walk), which is the
+fastest and most reliable file system walker I could find. As far
+as I can tell, it's almost impossible to go much faster in a
+Node.js program, just based on how fast you can push syscalls out
+to the fs thread pool.
+
+On my machine, that is about 1000-1200 completed walks per second
+for async or stream walks, and around 500-600 walks per second
+synchronously.
+
+In the warm cache state, PathScurry's performance increases
+around 4x for async `for await` iteration, 10-15x faster for
+streams and synchronous `for of` iteration, and anywhere from 30x
+to 80x faster for the rest.
+
+```
+# walk 100,000 fs entries, 10/1 file/dir ratio
+# operations / ms
+ New PathScurry object | Reuse PathScurry object
+ stream: 1112.589 | 13974.917
+sync stream: 492.718 | 15028.343
+ async walk: 1095.648 | 32706.395
+ sync walk: 527.632 | 46129.772
+ async iter: 1288.821 | 5045.510
+ sync iter: 498.496 | 17920.746
+```
+
+A hand-rolled walk calling `entry.readdir()` and recursing
+through the entries can benefit even more from caching, with
+greater flexibility and without the overhead of streams or
+generators.
+
+The cold cache state is still limited by the costs of file system
+operations, but with a warm cache, the only bottleneck is CPU
+speed and VM optimizations. Of course, in that case, some care
+must be taken to ensure that you don't lose performance as a
+result of silly mistakes, like calling `readdir()` on entries
+that you know are not directories.
+
+```
+# manual recursive iteration functions
+ cold cache | warm cache
+async: 1164.901 | 17923.320
+ cb: 1101.127 | 40999.344
+zalgo: 1082.240 | 66689.936
+ sync: 526.935 | 87097.591
+```
+
+In this case, the speed improves by around 10-20x in the async
+case, 40x in the case of using `entry.readdirCB` with protections
+against synchronous callbacks, and 50-100x with callback
+deferrals disabled, and _several hundred times faster_ for
+synchronous iteration.
+
+If you can think of a case that is not covered in these
+benchmarks, or an implementation that performs significantly
+better than PathScurry, please [let me
+know](https://github.com/isaacs/path-scurry/issues).
+
+## USAGE
+
+```ts
+// hybrid module, load with either method
+import { PathScurry, Path } from 'path-scurry'
+// or:
+const { PathScurry, Path } = require('path-scurry')
+
+// very simple example, say we want to find and
+// delete all the .DS_Store files in a given path
+// note that the API is very similar to just a
+// naive walk with fs.readdir()
+import { unlink } from 'fs/promises'
+
+// easy way, iterate over the directory and do the thing
+const pw = new PathScurry(process.cwd())
+for await (const entry of pw) {
+ if (entry.isFile() && entry.name === '.DS_Store') {
+ unlink(entry.fullpath())
+ }
+}
+
+// here it is as a manual recursive method
+const walk = async (entry: Path) => {
+ const promises: Promise = []
+ // readdir doesn't throw on non-directories, it just doesn't
+ // return any entries, to save stack trace costs.
+ // Items are returned in arbitrary unsorted order
+ for (const child of await pw.readdir(entry)) {
+ // each child is a Path object
+ if (child.name === '.DS_Store' && child.isFile()) {
+ // could also do pw.resolve(entry, child.name),
+ // just like fs.readdir walking, but .fullpath is
+ // a *slightly* more efficient shorthand.
+ promises.push(unlink(child.fullpath()))
+ } else if (child.isDirectory()) {
+ promises.push(walk(child))
+ }
+ }
+ return Promise.all(promises)
+}
+
+walk(pw.cwd).then(() => {
+ console.log('all .DS_Store files removed')
+})
+
+const pw2 = new PathScurry('/a/b/c') // pw2.cwd is the Path for /a/b/c
+const relativeDir = pw2.cwd.resolve('../x') // Path entry for '/a/b/x'
+const relative2 = pw2.cwd.resolve('/a/b/d/../x') // same path, same entry
+assert.equal(relativeDir, relative2)
+```
+
+## API
+
+[Full TypeDoc API](https://isaacs.github.io/path-scurry)
+
+There are platform-specific classes exported, but for the most
+part, the default `PathScurry` and `Path` exports are what you
+most likely need, unless you are testing behavior for other
+platforms.
+
+Intended public API is documented here, but the full
+documentation does include internal types, which should not be
+accessed directly.
+
+### Interface `PathScurryOpts`
+
+The type of the `options` argument passed to the `PathScurry`
+constructor.
+
+- `nocase`: Boolean indicating that file names should be compared
+ case-insensitively. Defaults to `true` on darwin and win32
+ implementations, `false` elsewhere.
+
+ **Warning** Performing case-insensitive matching on a
+ case-sensitive filesystem will result in occasionally very
+ bizarre behavior. Performing case-sensitive matching on a
+ case-insensitive filesystem may negatively impact performance.
+
+- `childrenCacheSize`: Number of child entries to cache, in order
+ to speed up `resolve()` and `readdir()` calls. Defaults to
+ `16 * 1024` (ie, `16384`).
+
+ Setting it to a higher value will run the risk of JS heap
+ allocation errors on large directory trees. Setting it to `256`
+ or smaller will significantly reduce the construction time and
+ data consumption overhead, but with the downside of operations
+ being slower on large directory trees. Setting it to `0` will
+ mean that effectively no operations are cached, and this module
+ will be roughly the same speed as `fs` for file system
+ operations, and _much_ slower than `path.resolve()` for
+ repeated path resolution.
+
+- `fs` An object that will be used to override the default `fs`
+ methods. Any methods that are not overridden will use Node's
+ built-in implementations.
+
+ - lstatSync
+ - readdir (callback `withFileTypes` Dirent variant, used for
+ readdirCB and most walks)
+ - readdirSync
+ - readlinkSync
+ - realpathSync
+ - promises: Object containing the following async methods:
+ - lstat
+ - readdir (Dirent variant only)
+ - readlink
+ - realpath
+
+### Interface `WalkOptions`
+
+The options object that may be passed to all walk methods.
+
+- `withFileTypes`: Boolean, default true. Indicates that `Path`
+ objects should be returned. Set to `false` to get string paths
+ instead.
+- `follow`: Boolean, default false. Attempt to read directory
+ entries from symbolic links. Otherwise, only actual directories
+ are traversed. Regardless of this setting, a given target path
+ will only ever be walked once, meaning that a symbolic link to
+ a previously traversed directory will never be followed.
+
+ Setting this imposes a slight performance penalty, because
+ `readlink` must be called on all symbolic links encountered, in
+ order to avoid infinite cycles.
+
+- `filter`: Function `(entry: Path) => boolean`. If provided,
+ will prevent the inclusion of any entry for which it returns a
+ falsey value. This will not prevent directories from being
+ traversed if they do not pass the filter, though it will
+ prevent the directories themselves from being included in the
+ results. By default, if no filter is provided, then all entries
+ are included in the results.
+- `walkFilter`: Function `(entry: Path) => boolean`. If provided,
+ will prevent the traversal of any directory (or in the case of
+ `follow:true` symbolic links to directories) for which the
+ function returns false. This will not prevent the directories
+ themselves from being included in the result set. Use `filter`
+ for that.
+
+Note that TypeScript return types will only be inferred properly
+from static analysis if the `withFileTypes` option is omitted, or
+a constant `true` or `false` value.
+
+### Class `PathScurry`
+
+The main interface. Defaults to an appropriate class based on the
+current platform.
+
+Use `PathScurryWin32`, `PathScurryDarwin`, or `PathScurryPosix`
+if implementation-specific behavior is desired.
+
+All walk methods may be called with a `WalkOptions` argument to
+walk over the object's current working directory with the
+supplied options.
+
+#### `async pw.walk(entry?: string | Path | WalkOptions, opts?: WalkOptions)`
+
+Walk the directory tree according to the options provided,
+resolving to an array of all entries found.
+
+#### `pw.walkSync(entry?: string | Path | WalkOptions, opts?: WalkOptions)`
+
+Walk the directory tree according to the options provided,
+returning an array of all entries found.
+
+#### `pw.iterate(entry?: string | Path | WalkOptions, opts?: WalkOptions)`
+
+Iterate over the directory asynchronously, for use with `for
+await of`. This is also the default async iterator method.
+
+#### `pw.iterateSync(entry?: string | Path | WalkOptions, opts?: WalkOptions)`
+
+Iterate over the directory synchronously, for use with `for of`.
+This is also the default sync iterator method.
+
+#### `pw.stream(entry?: string | Path | WalkOptions, opts?: WalkOptions)`
+
+Return a [Minipass](http://npm.im/minipass) stream that emits
+each entry or path string in the walk. Results are made available
+asynchronously.
+
+#### `pw.streamSync(entry?: string | Path | WalkOptions, opts?: WalkOptions)`
+
+Return a [Minipass](http://npm.im/minipass) stream that emits
+each entry or path string in the walk. Results are made available
+synchronously, meaning that the walk will complete in a single
+tick if the stream is fully consumed.
+
+#### `pw.cwd`
+
+Path object representing the current working directory for the
+PathScurry.
+
+#### `pw.chdir(path: string)`
+
+Set the new effective current working directory for the scurry
+object, so that `path.relative()` and `path.relativePosix()`
+return values relative to the new cwd path.
+
+#### `pw.depth(path?: Path | string): number`
+
+Return the depth of the specified path (or the PathScurry cwd)
+within the directory tree.
+
+Root entries have a depth of `0`.
+
+#### `pw.resolve(...paths: string[])`
+
+Caching `path.resolve()`.
+
+Significantly faster than `path.resolve()` if called repeatedly
+with the same paths. Significantly slower otherwise, as it builds
+out the cached Path entries.
+
+To get a `Path` object resolved from the `PathScurry`, use
+`pw.cwd.resolve(path)`. Note that `Path.resolve` only takes a
+single string argument, not multiple.
+
+#### `pw.resolvePosix(...paths: string[])`
+
+Caching `path.resolve()`, but always using posix style paths.
+
+This is identical to `pw.resolve(...paths)` on posix systems (ie,
+everywhere except Windows).
+
+On Windows, it returns the full absolute UNC path using `/`
+separators. Ie, instead of `'C:\\foo\\bar`, it would return
+`//?/C:/foo/bar`.
+
+#### `pw.relative(path: string | Path): string`
+
+Return the relative path from the PathWalker cwd to the supplied
+path string or entry.
+
+If the nearest common ancestor is the root, then an absolute path
+is returned.
+
+#### `pw.relativePosix(path: string | Path): string`
+
+Return the relative path from the PathWalker cwd to the supplied
+path string or entry, using `/` path separators.
+
+If the nearest common ancestor is the root, then an absolute path
+is returned.
+
+On posix platforms (ie, all platforms except Windows), this is
+identical to `pw.relative(path)`.
+
+On Windows systems, it returns the resulting string as a
+`/`-delimited path. If an absolute path is returned (because the
+target does not share a common ancestor with `pw.cwd`), then a
+full absolute UNC path will be returned. Ie, instead of
+`'C:\\foo\\bar`, it would return `//?/C:/foo/bar`.
+
+#### `pw.basename(path: string | Path): string`
+
+Return the basename of the provided string or Path.
+
+#### `pw.dirname(path: string | Path): string`
+
+Return the parent directory of the supplied string or Path.
+
+#### `async pw.readdir(dir = pw.cwd, opts = { withFileTypes: true })`
+
+Read the directory and resolve to an array of strings if
+`withFileTypes` is explicitly set to `false` or Path objects
+otherwise.
+
+Can be called as `pw.readdir({ withFileTypes: boolean })` as
+well.
+
+Returns `[]` if no entries are found, or if any error occurs.
+
+Note that TypeScript return types will only be inferred properly
+from static analysis if the `withFileTypes` option is omitted, or
+a constant `true` or `false` value.
+
+#### `pw.readdirSync(dir = pw.cwd, opts = { withFileTypes: true })`
+
+Synchronous `pw.readdir()`
+
+#### `async pw.readlink(link = pw.cwd, opts = { withFileTypes: false })`
+
+Call `fs.readlink` on the supplied string or Path object, and
+return the result.
+
+Can be called as `pw.readlink({ withFileTypes: boolean })` as
+well.
+
+Returns `undefined` if any error occurs (for example, if the
+argument is not a symbolic link), or a `Path` object if
+`withFileTypes` is explicitly set to `true`, or a string
+otherwise.
+
+Note that TypeScript return types will only be inferred properly
+from static analysis if the `withFileTypes` option is omitted, or
+a constant `true` or `false` value.
+
+#### `pw.readlinkSync(link = pw.cwd, opts = { withFileTypes: false })`
+
+Synchronous `pw.readlink()`
+
+#### `async pw.lstat(entry = pw.cwd)`
+
+Call `fs.lstat` on the supplied string or Path object, and fill
+in as much information as possible, returning the updated `Path`
+object.
+
+Returns `undefined` if the entry does not exist, or if any error
+is encountered.
+
+Note that some `Stats` data (such as `ino`, `dev`, and `mode`)
+will not be supplied. For those things, you'll need to call
+`fs.lstat` yourself.
+
+#### `pw.lstatSync(entry = pw.cwd)`
+
+Synchronous `pw.lstat()`
+
+#### `pw.realpath(entry = pw.cwd, opts = { withFileTypes: false })`
+
+Call `fs.realpath` on the supplied string or Path object, and
+return the realpath if available.
+
+Returns `undefined` if any error occurs.
+
+May be called as `pw.realpath({ withFileTypes: boolean })` to run
+on `pw.cwd`.
+
+#### `pw.realpathSync(entry = pw.cwd, opts = { withFileTypes: false })`
+
+Synchronous `pw.realpath()`
+
+### Class `Path` implements [fs.Dirent](https://nodejs.org/docs/latest/api/fs.html#class-fsdirent)
+
+Object representing a given path on the filesystem, which may or
+may not exist.
+
+Note that the actual class in use will be either `PathWin32` or
+`PathPosix`, depending on the implementation of `PathScurry` in
+use. They differ in the separators used to split and join path
+strings, and the handling of root paths.
+
+In `PathPosix` implementations, paths are split and joined using
+the `'/'` character, and `'/'` is the only root path ever in use.
+
+In `PathWin32` implementations, paths are split using either
+`'/'` or `'\\'` and joined using `'\\'`, and multiple roots may
+be in use based on the drives and UNC paths encountered. UNC
+paths such as `//?/C:/` that identify a drive letter, will be
+treated as an alias for the same root entry as their associated
+drive letter (in this case `'C:\\'`).
+
+#### `path.name`
+
+Name of this file system entry.
+
+**Important**: _always_ test the path name against any test
+string using the `isNamed` method, and not by directly comparing
+this string. Otherwise, unicode path strings that the system sees
+as identical will not be properly treated as the same path,
+leading to incorrect behavior and possible security issues.
+
+#### `path.isNamed(name: string): boolean`
+
+Return true if the path is a match for the given path name. This
+handles case sensitivity and unicode normalization.
+
+Note: even on case-sensitive systems, it is **not** safe to test
+the equality of the `.name` property to determine whether a given
+pathname matches, due to unicode normalization mismatches.
+
+Always use this method instead of testing the `path.name`
+property directly.
+
+#### `path.isCWD`
+
+Set to true if this `Path` object is the current working
+directory of the `PathScurry` collection that contains it.
+
+#### `path.getType()`
+
+Returns the type of the Path object, `'File'`, `'Directory'`,
+etc.
+
+#### `path.isType(t: type)`
+
+Returns true if `is{t}()` returns true.
+
+For example, `path.isType('Directory')` is equivalent to
+`path.isDirectory()`.
+
+#### `path.depth()`
+
+Return the depth of the Path entry within the directory tree.
+Root paths have a depth of `0`.
+
+#### `path.fullpath()`
+
+The fully resolved path to the entry.
+
+#### `path.fullpathPosix()`
+
+The fully resolved path to the entry, using `/` separators.
+
+On posix systems, this is identical to `path.fullpath()`. On
+windows, this will return a fully resolved absolute UNC path
+using `/` separators. Eg, instead of `'C:\\foo\\bar'`, it will
+return `'//?/C:/foo/bar'`.
+
+#### `path.isFile()`, `path.isDirectory()`, etc.
+
+Same as the identical `fs.Dirent.isX()` methods.
+
+#### `path.isUnknown()`
+
+Returns true if the path's type is unknown. Always returns true
+when the path is known to not exist.
+
+#### `path.resolve(p: string)`
+
+Return a `Path` object associated with the provided path string
+as resolved from the current Path object.
+
+#### `path.relative(): string`
+
+Return the relative path from the PathWalker cwd to the supplied
+path string or entry.
+
+If the nearest common ancestor is the root, then an absolute path
+is returned.
+
+#### `path.relativePosix(): string`
+
+Return the relative path from the PathWalker cwd to the supplied
+path string or entry, using `/` path separators.
+
+If the nearest common ancestor is the root, then an absolute path
+is returned.
+
+On posix platforms (ie, all platforms except Windows), this is
+identical to `pw.relative(path)`.
+
+On Windows systems, it returns the resulting string as a
+`/`-delimited path. If an absolute path is returned (because the
+target does not share a common ancestor with `pw.cwd`), then a
+full absolute UNC path will be returned. Ie, instead of
+`'C:\\foo\\bar`, it would return `//?/C:/foo/bar`.
+
+#### `async path.readdir()`
+
+Return an array of `Path` objects found by reading the associated
+path entry.
+
+If path is not a directory, or if any error occurs, returns `[]`,
+and marks all children as provisional and non-existent.
+
+#### `path.readdirSync()`
+
+Synchronous `path.readdir()`
+
+#### `async path.readlink()`
+
+Return the `Path` object referenced by the `path` as a symbolic
+link.
+
+If the `path` is not a symbolic link, or any error occurs,
+returns `undefined`.
+
+#### `path.readlinkSync()`
+
+Synchronous `path.readlink()`
+
+#### `async path.lstat()`
+
+Call `lstat` on the path object, and fill it in with details
+determined.
+
+If path does not exist, or any other error occurs, returns
+`undefined`, and marks the path as "unknown" type.
+
+#### `path.lstatSync()`
+
+Synchronous `path.lstat()`
+
+#### `async path.realpath()`
+
+Call `realpath` on the path, and return a Path object
+corresponding to the result, or `undefined` if any error occurs.
+
+#### `path.realpathSync()`
+
+Synchornous `path.realpath()`
diff --git a/node_modules/path-scurry/package.json b/node_modules/path-scurry/package.json
new file mode 100644
index 0000000..e176615
--- /dev/null
+++ b/node_modules/path-scurry/package.json
@@ -0,0 +1,89 @@
+{
+ "name": "path-scurry",
+ "version": "1.11.1",
+ "description": "walk paths fast and efficiently",
+ "author": "Isaac Z. Schlueter (https://blog.izs.me)",
+ "main": "./dist/commonjs/index.js",
+ "type": "module",
+ "exports": {
+ "./package.json": "./package.json",
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/commonjs/index.d.ts",
+ "default": "./dist/commonjs/index.js"
+ }
+ }
+ },
+ "files": [
+ "dist"
+ ],
+ "license": "BlueOak-1.0.0",
+ "scripts": {
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "prepare": "tshy",
+ "pretest": "npm run prepare",
+ "presnap": "npm run prepare",
+ "test": "tap",
+ "snap": "tap",
+ "format": "prettier --write . --loglevel warn",
+ "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts",
+ "bench": "bash ./scripts/bench.sh"
+ },
+ "prettier": {
+ "experimentalTernaries": true,
+ "semi": false,
+ "printWidth": 75,
+ "tabWidth": 2,
+ "useTabs": false,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "bracketSameLine": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf"
+ },
+ "devDependencies": {
+ "@nodelib/fs.walk": "^1.2.8",
+ "@types/node": "^20.12.11",
+ "c8": "^7.12.0",
+ "eslint-config-prettier": "^8.6.0",
+ "mkdirp": "^3.0.0",
+ "prettier": "^3.2.5",
+ "rimraf": "^5.0.1",
+ "tap": "^18.7.2",
+ "ts-node": "^10.9.2",
+ "tshy": "^1.14.0",
+ "typedoc": "^0.25.12",
+ "typescript": "^5.4.3"
+ },
+ "tap": {
+ "typecheck": true
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/path-scurry"
+ },
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "tshy": {
+ "selfLink": false,
+ "exports": {
+ "./package.json": "./package.json",
+ ".": "./src/index.ts"
+ }
+ },
+ "types": "./dist/commonjs/index.d.ts"
+}
diff --git a/node_modules/picocolors/LICENSE b/node_modules/picocolors/LICENSE
new file mode 100644
index 0000000..46c9b95
--- /dev/null
+++ b/node_modules/picocolors/LICENSE
@@ -0,0 +1,15 @@
+ISC License
+
+Copyright (c) 2021-2024 Oleksii Raspopov, Kostiantyn Denysov, Anton Verinov
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/picocolors/README.md b/node_modules/picocolors/README.md
new file mode 100644
index 0000000..8e47aa8
--- /dev/null
+++ b/node_modules/picocolors/README.md
@@ -0,0 +1,21 @@
+# picocolors
+
+The tiniest and the fastest library for terminal output formatting with ANSI colors.
+
+```javascript
+import pc from "picocolors"
+
+console.log(
+ pc.green(`How are ${pc.italic(`you`)} doing?`)
+)
+```
+
+- **No dependencies.**
+- **14 times** smaller and **2 times** faster than chalk.
+- Used by popular tools like PostCSS, SVGO, Stylelint, and Browserslist.
+- Node.js v6+ & browsers support. Support for both CJS and ESM projects.
+- TypeScript type declarations included.
+- [`NO_COLOR`](https://no-color.org/) friendly.
+
+## Docs
+Read **[full docs](https://github.com/alexeyraspopov/picocolors#readme)** on GitHub.
diff --git a/node_modules/picocolors/package.json b/node_modules/picocolors/package.json
new file mode 100644
index 0000000..372d4b6
--- /dev/null
+++ b/node_modules/picocolors/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "picocolors",
+ "version": "1.1.1",
+ "main": "./picocolors.js",
+ "types": "./picocolors.d.ts",
+ "browser": {
+ "./picocolors.js": "./picocolors.browser.js"
+ },
+ "sideEffects": false,
+ "description": "The tiniest and the fastest library for terminal output formatting with ANSI colors",
+ "files": [
+ "picocolors.*",
+ "types.d.ts"
+ ],
+ "keywords": [
+ "terminal",
+ "colors",
+ "formatting",
+ "cli",
+ "console"
+ ],
+ "author": "Alexey Raspopov",
+ "repository": "alexeyraspopov/picocolors",
+ "license": "ISC"
+}
diff --git a/node_modules/picocolors/picocolors.browser.js b/node_modules/picocolors/picocolors.browser.js
new file mode 100644
index 0000000..9dcf637
--- /dev/null
+++ b/node_modules/picocolors/picocolors.browser.js
@@ -0,0 +1,4 @@
+var x=String;
+var create=function() {return {isColorSupported:false,reset:x,bold:x,dim:x,italic:x,underline:x,inverse:x,hidden:x,strikethrough:x,black:x,red:x,green:x,yellow:x,blue:x,magenta:x,cyan:x,white:x,gray:x,bgBlack:x,bgRed:x,bgGreen:x,bgYellow:x,bgBlue:x,bgMagenta:x,bgCyan:x,bgWhite:x,blackBright:x,redBright:x,greenBright:x,yellowBright:x,blueBright:x,magentaBright:x,cyanBright:x,whiteBright:x,bgBlackBright:x,bgRedBright:x,bgGreenBright:x,bgYellowBright:x,bgBlueBright:x,bgMagentaBright:x,bgCyanBright:x,bgWhiteBright:x}};
+module.exports=create();
+module.exports.createColors = create;
diff --git a/node_modules/picocolors/picocolors.d.ts b/node_modules/picocolors/picocolors.d.ts
new file mode 100644
index 0000000..94e146a
--- /dev/null
+++ b/node_modules/picocolors/picocolors.d.ts
@@ -0,0 +1,5 @@
+import { Colors } from "./types"
+
+declare const picocolors: Colors & { createColors: (enabled?: boolean) => Colors }
+
+export = picocolors
diff --git a/node_modules/picocolors/picocolors.js b/node_modules/picocolors/picocolors.js
new file mode 100644
index 0000000..e32df85
--- /dev/null
+++ b/node_modules/picocolors/picocolors.js
@@ -0,0 +1,75 @@
+let p = process || {}, argv = p.argv || [], env = p.env || {}
+let isColorSupported =
+ !(!!env.NO_COLOR || argv.includes("--no-color")) &&
+ (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || ((p.stdout || {}).isTTY && env.TERM !== "dumb") || !!env.CI)
+
+let formatter = (open, close, replace = open) =>
+ input => {
+ let string = "" + input, index = string.indexOf(close, open.length)
+ return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close
+ }
+
+let replaceClose = (string, close, replace, index) => {
+ let result = "", cursor = 0
+ do {
+ result += string.substring(cursor, index) + replace
+ cursor = index + close.length
+ index = string.indexOf(close, cursor)
+ } while (~index)
+ return result + string.substring(cursor)
+}
+
+let createColors = (enabled = isColorSupported) => {
+ let f = enabled ? formatter : () => String
+ return {
+ isColorSupported: enabled,
+ reset: f("\x1b[0m", "\x1b[0m"),
+ bold: f("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m"),
+ dim: f("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m"),
+ italic: f("\x1b[3m", "\x1b[23m"),
+ underline: f("\x1b[4m", "\x1b[24m"),
+ inverse: f("\x1b[7m", "\x1b[27m"),
+ hidden: f("\x1b[8m", "\x1b[28m"),
+ strikethrough: f("\x1b[9m", "\x1b[29m"),
+
+ black: f("\x1b[30m", "\x1b[39m"),
+ red: f("\x1b[31m", "\x1b[39m"),
+ green: f("\x1b[32m", "\x1b[39m"),
+ yellow: f("\x1b[33m", "\x1b[39m"),
+ blue: f("\x1b[34m", "\x1b[39m"),
+ magenta: f("\x1b[35m", "\x1b[39m"),
+ cyan: f("\x1b[36m", "\x1b[39m"),
+ white: f("\x1b[37m", "\x1b[39m"),
+ gray: f("\x1b[90m", "\x1b[39m"),
+
+ bgBlack: f("\x1b[40m", "\x1b[49m"),
+ bgRed: f("\x1b[41m", "\x1b[49m"),
+ bgGreen: f("\x1b[42m", "\x1b[49m"),
+ bgYellow: f("\x1b[43m", "\x1b[49m"),
+ bgBlue: f("\x1b[44m", "\x1b[49m"),
+ bgMagenta: f("\x1b[45m", "\x1b[49m"),
+ bgCyan: f("\x1b[46m", "\x1b[49m"),
+ bgWhite: f("\x1b[47m", "\x1b[49m"),
+
+ blackBright: f("\x1b[90m", "\x1b[39m"),
+ redBright: f("\x1b[91m", "\x1b[39m"),
+ greenBright: f("\x1b[92m", "\x1b[39m"),
+ yellowBright: f("\x1b[93m", "\x1b[39m"),
+ blueBright: f("\x1b[94m", "\x1b[39m"),
+ magentaBright: f("\x1b[95m", "\x1b[39m"),
+ cyanBright: f("\x1b[96m", "\x1b[39m"),
+ whiteBright: f("\x1b[97m", "\x1b[39m"),
+
+ bgBlackBright: f("\x1b[100m", "\x1b[49m"),
+ bgRedBright: f("\x1b[101m", "\x1b[49m"),
+ bgGreenBright: f("\x1b[102m", "\x1b[49m"),
+ bgYellowBright: f("\x1b[103m", "\x1b[49m"),
+ bgBlueBright: f("\x1b[104m", "\x1b[49m"),
+ bgMagentaBright: f("\x1b[105m", "\x1b[49m"),
+ bgCyanBright: f("\x1b[106m", "\x1b[49m"),
+ bgWhiteBright: f("\x1b[107m", "\x1b[49m"),
+ }
+}
+
+module.exports = createColors()
+module.exports.createColors = createColors
diff --git a/node_modules/picocolors/types.d.ts b/node_modules/picocolors/types.d.ts
new file mode 100644
index 0000000..cd1aec4
--- /dev/null
+++ b/node_modules/picocolors/types.d.ts
@@ -0,0 +1,51 @@
+export type Formatter = (input: string | number | null | undefined) => string
+
+export interface Colors {
+ isColorSupported: boolean
+
+ reset: Formatter
+ bold: Formatter
+ dim: Formatter
+ italic: Formatter
+ underline: Formatter
+ inverse: Formatter
+ hidden: Formatter
+ strikethrough: Formatter
+
+ black: Formatter
+ red: Formatter
+ green: Formatter
+ yellow: Formatter
+ blue: Formatter
+ magenta: Formatter
+ cyan: Formatter
+ white: Formatter
+ gray: Formatter
+
+ bgBlack: Formatter
+ bgRed: Formatter
+ bgGreen: Formatter
+ bgYellow: Formatter
+ bgBlue: Formatter
+ bgMagenta: Formatter
+ bgCyan: Formatter
+ bgWhite: Formatter
+
+ blackBright: Formatter
+ redBright: Formatter
+ greenBright: Formatter
+ yellowBright: Formatter
+ blueBright: Formatter
+ magentaBright: Formatter
+ cyanBright: Formatter
+ whiteBright: Formatter
+
+ bgBlackBright: Formatter
+ bgRedBright: Formatter
+ bgGreenBright: Formatter
+ bgYellowBright: Formatter
+ bgBlueBright: Formatter
+ bgMagentaBright: Formatter
+ bgCyanBright: Formatter
+ bgWhiteBright: Formatter
+}
diff --git a/node_modules/picomatch/CHANGELOG.md b/node_modules/picomatch/CHANGELOG.md
new file mode 100644
index 0000000..8ccc6c1
--- /dev/null
+++ b/node_modules/picomatch/CHANGELOG.md
@@ -0,0 +1,136 @@
+# Release history
+
+**All notable changes to this project will be documented in this file.**
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
+
+
+ Guiding Principles
+
+- Changelogs are for humans, not machines.
+- There should be an entry for every single version.
+- The same types of changes should be grouped.
+- Versions and sections should be linkable.
+- The latest version comes first.
+- The release date of each versions is displayed.
+- Mention whether you follow Semantic Versioning.
+
+
+
+
+ Types of changes
+
+Changelog entries are classified using the following labels _(from [keep-a-changelog](http://keepachangelog.com/)_):
+
+- `Added` for new features.
+- `Changed` for changes in existing functionality.
+- `Deprecated` for soon-to-be removed features.
+- `Removed` for now removed features.
+- `Fixed` for any bug fixes.
+- `Security` in case of vulnerabilities.
+
+
+
+## 2.3.1 (2022-01-02)
+
+### Fixed
+
+* Fixes bug when a pattern containing an expression after the closing parenthesis (`/!(*.d).{ts,tsx}`) was incorrectly converted to regexp ([9f241ef](https://github.com/micromatch/picomatch/commit/9f241ef)).
+
+### Changed
+
+* Some documentation improvements ([f81d236](https://github.com/micromatch/picomatch/commit/f81d236), [421e0e7](https://github.com/micromatch/picomatch/commit/421e0e7)).
+
+## 2.3.0 (2021-05-21)
+
+### Fixed
+
+* Fixes bug where file names with two dots were not being matched consistently with negation extglobs containing a star ([56083ef](https://github.com/micromatch/picomatch/commit/56083ef))
+
+## 2.2.3 (2021-04-10)
+
+### Fixed
+
+* Do not skip pattern seperator for square brackets ([fb08a30](https://github.com/micromatch/picomatch/commit/fb08a30)).
+* Set negatedExtGlob also if it does not span the whole pattern ([032e3f5](https://github.com/micromatch/picomatch/commit/032e3f5)).
+
+## 2.2.2 (2020-03-21)
+
+### Fixed
+
+* Correctly handle parts of the pattern after parentheses in the `scan` method ([e15b920](https://github.com/micromatch/picomatch/commit/e15b920)).
+
+## 2.2.1 (2020-01-04)
+
+* Fixes [#49](https://github.com/micromatch/picomatch/issues/49), so that braces with no sets or ranges are now propertly treated as literals.
+
+## 2.2.0 (2020-01-04)
+
+* Disable fastpaths mode for the parse method ([5b8d33f](https://github.com/micromatch/picomatch/commit/5b8d33f))
+* Add `tokens`, `slashes`, and `parts` to the object returned by `picomatch.scan()`.
+
+## 2.1.0 (2019-10-31)
+
+* add benchmarks for scan ([4793b92](https://github.com/micromatch/picomatch/commit/4793b92))
+* Add eslint object-curly-spacing rule ([707c650](https://github.com/micromatch/picomatch/commit/707c650))
+* Add prefer-const eslint rule ([5c7501c](https://github.com/micromatch/picomatch/commit/5c7501c))
+* Add support for nonegate in scan API ([275c9b9](https://github.com/micromatch/picomatch/commit/275c9b9))
+* Change lets to consts. Move root import up. ([4840625](https://github.com/micromatch/picomatch/commit/4840625))
+* closes https://github.com/micromatch/picomatch/issues/21 ([766bcb0](https://github.com/micromatch/picomatch/commit/766bcb0))
+* Fix "Extglobs" table in readme ([eb19da8](https://github.com/micromatch/picomatch/commit/eb19da8))
+* fixes https://github.com/micromatch/picomatch/issues/20 ([9caca07](https://github.com/micromatch/picomatch/commit/9caca07))
+* fixes https://github.com/micromatch/picomatch/issues/26 ([fa58f45](https://github.com/micromatch/picomatch/commit/fa58f45))
+* Lint test ([d433a34](https://github.com/micromatch/picomatch/commit/d433a34))
+* lint unit tests ([0159b55](https://github.com/micromatch/picomatch/commit/0159b55))
+* Make scan work with noext ([6c02e03](https://github.com/micromatch/picomatch/commit/6c02e03))
+* minor linting ([c2a2b87](https://github.com/micromatch/picomatch/commit/c2a2b87))
+* minor parser improvements ([197671d](https://github.com/micromatch/picomatch/commit/197671d))
+* remove eslint since it... ([07876fa](https://github.com/micromatch/picomatch/commit/07876fa))
+* remove funding file ([8ebe96d](https://github.com/micromatch/picomatch/commit/8ebe96d))
+* Remove unused funks ([cbc6d54](https://github.com/micromatch/picomatch/commit/cbc6d54))
+* Run eslint during pretest, fix existing eslint findings ([0682367](https://github.com/micromatch/picomatch/commit/0682367))
+* support `noparen` in scan ([3d37569](https://github.com/micromatch/picomatch/commit/3d37569))
+* update changelog ([7b34e77](https://github.com/micromatch/picomatch/commit/7b34e77))
+* update travis ([777f038](https://github.com/micromatch/picomatch/commit/777f038))
+* Use eslint-disable-next-line instead of eslint-disable ([4e7c1fd](https://github.com/micromatch/picomatch/commit/4e7c1fd))
+
+## 2.0.7 (2019-05-14)
+
+* 2.0.7 ([9eb9a71](https://github.com/micromatch/picomatch/commit/9eb9a71))
+* supports lookbehinds ([1f63f7e](https://github.com/micromatch/picomatch/commit/1f63f7e))
+* update .verb.md file with typo change ([2741279](https://github.com/micromatch/picomatch/commit/2741279))
+* fix: typo in README ([0753e44](https://github.com/micromatch/picomatch/commit/0753e44))
+
+## 2.0.4 (2019-04-10)
+
+### Fixed
+
+- Readme link [fixed](https://github.com/micromatch/picomatch/pull/13/commits/a96ab3aa2b11b6861c23289964613d85563b05df) by @danez.
+- `options.capture` now works as expected when fastpaths are enabled. See https://github.com/micromatch/picomatch/pull/12/commits/26aefd71f1cfaf95c37f1c1fcab68a693b037304. Thanks to @DrPizza.
+
+## 2.0.0 (2019-04-10)
+
+### Added
+
+- Adds support for `options.onIgnore`. See the readme for details
+- Adds support for `options.onResult`. See the readme for details
+
+### Breaking changes
+
+- The unixify option was renamed to `windows`
+- caching and all related options and methods have been removed
+
+## 1.0.0 (2018-11-05)
+
+- adds `.onMatch` option
+- improvements to `.scan` method
+- numerous improvements and optimizations for matching and parsing
+- better windows path handling
+
+## 0.1.0 - 2017-04-13
+
+First release.
+
+
+[keep-a-changelog]: https://github.com/olivierlacan/keep-a-changelog
diff --git a/node_modules/picomatch/LICENSE b/node_modules/picomatch/LICENSE
new file mode 100644
index 0000000..3608dca
--- /dev/null
+++ b/node_modules/picomatch/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2017-present, Jon Schlinkert.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/picomatch/README.md b/node_modules/picomatch/README.md
new file mode 100644
index 0000000..b0526e2
--- /dev/null
+++ b/node_modules/picomatch/README.md
@@ -0,0 +1,708 @@
+Picomatch
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Blazing fast and accurate glob matcher written in JavaScript.
+No dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions.
+
+
+
+
+
+## Why picomatch?
+
+* **Lightweight** - No dependencies
+* **Minimal** - Tiny API surface. Main export is a function that takes a glob pattern and returns a matcher function.
+* **Fast** - Loads in about 2ms (that's several times faster than a [single frame of a HD movie](http://www.endmemo.com/sconvert/framespersecondframespermillisecond.php) at 60fps)
+* **Performant** - Use the returned matcher function to speed up repeat matching (like when watching files)
+* **Accurate matching** - Using wildcards (`*` and `?`), globstars (`**`) for nested directories, [advanced globbing](#advanced-globbing) with extglobs, braces, and POSIX brackets, and support for escaping special characters with `\` or quotes.
+* **Well tested** - Thousands of unit tests
+
+See the [library comparison](#library-comparisons) to other libraries.
+
+
+
+
+## Table of Contents
+
+ Click to expand
+
+- [Install](#install)
+- [Usage](#usage)
+- [API](#api)
+ * [picomatch](#picomatch)
+ * [.test](#test)
+ * [.matchBase](#matchbase)
+ * [.isMatch](#ismatch)
+ * [.parse](#parse)
+ * [.scan](#scan)
+ * [.compileRe](#compilere)
+ * [.makeRe](#makere)
+ * [.toRegex](#toregex)
+- [Options](#options)
+ * [Picomatch options](#picomatch-options)
+ * [Scan Options](#scan-options)
+ * [Options Examples](#options-examples)
+- [Globbing features](#globbing-features)
+ * [Basic globbing](#basic-globbing)
+ * [Advanced globbing](#advanced-globbing)
+ * [Braces](#braces)
+ * [Matching special characters as literals](#matching-special-characters-as-literals)
+- [Library Comparisons](#library-comparisons)
+- [Benchmarks](#benchmarks)
+- [Philosophies](#philosophies)
+- [About](#about)
+ * [Author](#author)
+ * [License](#license)
+
+_(TOC generated by [verb](https://github.com/verbose/verb) using [markdown-toc](https://github.com/jonschlinkert/markdown-toc))_
+
+
+
+
+
+
+## Install
+
+Install with [npm](https://www.npmjs.com/):
+
+```sh
+npm install --save picomatch
+```
+
+
+
+## Usage
+
+The main export is a function that takes a glob pattern and an options object and returns a function for matching strings.
+
+```js
+const pm = require('picomatch');
+const isMatch = pm('*.js');
+
+console.log(isMatch('abcd')); //=> false
+console.log(isMatch('a.js')); //=> true
+console.log(isMatch('a.md')); //=> false
+console.log(isMatch('a/b.js')); //=> false
+```
+
+
+
+## API
+
+### [picomatch](lib/picomatch.js#L32)
+
+Creates a matcher function from one or more glob patterns. The returned function takes a string to match as its first argument, and returns true if the string is a match. The returned matcher function also takes a boolean as the second argument that, when true, returns an object with additional information.
+
+**Params**
+
+* `globs` **{String|Array}**: One or more glob patterns.
+* `options` **{Object=}**
+* `returns` **{Function=}**: Returns a matcher function.
+
+**Example**
+
+```js
+const picomatch = require('picomatch');
+// picomatch(glob[, options]);
+
+const isMatch = picomatch('*.!(*a)');
+console.log(isMatch('a.a')); //=> false
+console.log(isMatch('a.b')); //=> true
+```
+
+### [.test](lib/picomatch.js#L117)
+
+Test `input` with the given `regex`. This is used by the main `picomatch()` function to test the input string.
+
+**Params**
+
+* `input` **{String}**: String to test.
+* `regex` **{RegExp}**
+* `returns` **{Object}**: Returns an object with matching info.
+
+**Example**
+
+```js
+const picomatch = require('picomatch');
+// picomatch.test(input, regex[, options]);
+
+console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/));
+// { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }
+```
+
+### [.matchBase](lib/picomatch.js#L161)
+
+Match the basename of a filepath.
+
+**Params**
+
+* `input` **{String}**: String to test.
+* `glob` **{RegExp|String}**: Glob pattern or regex created by [.makeRe](#makeRe).
+* `returns` **{Boolean}**
+
+**Example**
+
+```js
+const picomatch = require('picomatch');
+// picomatch.matchBase(input, glob[, options]);
+console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true
+```
+
+### [.isMatch](lib/picomatch.js#L183)
+
+Returns true if **any** of the given glob `patterns` match the specified `string`.
+
+**Params**
+
+* **{String|Array}**: str The string to test.
+* **{String|Array}**: patterns One or more glob patterns to use for matching.
+* **{Object}**: See available [options](#options).
+* `returns` **{Boolean}**: Returns true if any patterns match `str`
+
+**Example**
+
+```js
+const picomatch = require('picomatch');
+// picomatch.isMatch(string, patterns[, options]);
+
+console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true
+console.log(picomatch.isMatch('a.a', 'b.*')); //=> false
+```
+
+### [.parse](lib/picomatch.js#L199)
+
+Parse a glob pattern to create the source string for a regular expression.
+
+**Params**
+
+* `pattern` **{String}**
+* `options` **{Object}**
+* `returns` **{Object}**: Returns an object with useful properties and output to be used as a regex source string.
+
+**Example**
+
+```js
+const picomatch = require('picomatch');
+const result = picomatch.parse(pattern[, options]);
+```
+
+### [.scan](lib/picomatch.js#L231)
+
+Scan a glob pattern to separate the pattern into segments.
+
+**Params**
+
+* `input` **{String}**: Glob pattern to scan.
+* `options` **{Object}**
+* `returns` **{Object}**: Returns an object with
+
+**Example**
+
+```js
+const picomatch = require('picomatch');
+// picomatch.scan(input[, options]);
+
+const result = picomatch.scan('!./foo/*.js');
+console.log(result);
+{ prefix: '!./',
+ input: '!./foo/*.js',
+ start: 3,
+ base: 'foo',
+ glob: '*.js',
+ isBrace: false,
+ isBracket: false,
+ isGlob: true,
+ isExtglob: false,
+ isGlobstar: false,
+ negated: true }
+```
+
+### [.compileRe](lib/picomatch.js#L245)
+
+Compile a regular expression from the `state` object returned by the
+[parse()](#parse) method.
+
+**Params**
+
+* `state` **{Object}**
+* `options` **{Object}**
+* `returnOutput` **{Boolean}**: Intended for implementors, this argument allows you to return the raw output from the parser.
+* `returnState` **{Boolean}**: Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.
+* `returns` **{RegExp}**
+
+### [.makeRe](lib/picomatch.js#L286)
+
+Create a regular expression from a parsed glob pattern.
+
+**Params**
+
+* `state` **{String}**: The object returned from the `.parse` method.
+* `options` **{Object}**
+* `returnOutput` **{Boolean}**: Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.
+* `returnState` **{Boolean}**: Implementors may use this argument to return the state from the parsed glob with the returned regular expression.
+* `returns` **{RegExp}**: Returns a regex created from the given pattern.
+
+**Example**
+
+```js
+const picomatch = require('picomatch');
+const state = picomatch.parse('*.js');
+// picomatch.compileRe(state[, options]);
+
+console.log(picomatch.compileRe(state));
+//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
+```
+
+### [.toRegex](lib/picomatch.js#L321)
+
+Create a regular expression from the given regex source string.
+
+**Params**
+
+* `source` **{String}**: Regular expression source string.
+* `options` **{Object}**
+* `returns` **{RegExp}**
+
+**Example**
+
+```js
+const picomatch = require('picomatch');
+// picomatch.toRegex(source[, options]);
+
+const { output } = picomatch.parse('*.js');
+console.log(picomatch.toRegex(output));
+//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
+```
+
+
+
+## Options
+
+### Picomatch options
+
+The following options may be used with the main `picomatch()` function or any of the methods on the picomatch API.
+
+| **Option** | **Type** | **Default value** | **Description** |
+| --- | --- | --- | --- |
+| `basename` | `boolean` | `false` | If set, then patterns without slashes will be matched against the basename of the path if it contains slashes. For example, `a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. |
+| `bash` | `boolean` | `false` | Follow bash matching rules more strictly - disallows backslashes as escape characters, and treats single stars as globstars (`**`). |
+| `capture` | `boolean` | `undefined` | Return regex matches in supporting methods. |
+| `contains` | `boolean` | `undefined` | Allows glob to match any part of the given string(s). |
+| `cwd` | `string` | `process.cwd()` | Current working directory. Used by `picomatch.split()` |
+| `debug` | `boolean` | `undefined` | Debug regular expressions when an error is thrown. |
+| `dot` | `boolean` | `false` | Enable dotfile matching. By default, dotfiles are ignored unless a `.` is explicitly defined in the pattern, or `options.dot` is true |
+| `expandRange` | `function` | `undefined` | Custom function for expanding ranges in brace patterns, such as `{a..z}`. The function receives the range values as two arguments, and it must return a string to be used in the generated regex. It's recommended that returned strings be wrapped in parentheses. |
+| `failglob` | `boolean` | `false` | Throws an error if no matches are found. Based on the bash option of the same name. |
+| `fastpaths` | `boolean` | `true` | To speed up processing, full parsing is skipped for a handful common glob patterns. Disable this behavior by setting this option to `false`. |
+| `flags` | `string` | `undefined` | Regex flags to use in the generated regex. If defined, the `nocase` option will be overridden. |
+| [format](#optionsformat) | `function` | `undefined` | Custom function for formatting the returned string. This is useful for removing leading slashes, converting Windows paths to Posix paths, etc. |
+| `ignore` | `array\|string` | `undefined` | One or more glob patterns for excluding strings that should not be matched from the result. |
+| `keepQuotes` | `boolean` | `false` | Retain quotes in the generated regex, since quotes may also be used as an alternative to backslashes. |
+| `literalBrackets` | `boolean` | `undefined` | When `true`, brackets in the glob pattern will be escaped so that only literal brackets will be matched. |
+| `matchBase` | `boolean` | `false` | Alias for `basename` |
+| `maxLength` | `boolean` | `65536` | Limit the max length of the input string. An error is thrown if the input string is longer than this value. |
+| `nobrace` | `boolean` | `false` | Disable brace matching, so that `{a,b}` and `{1..3}` would be treated as literal characters. |
+| `nobracket` | `boolean` | `undefined` | Disable matching with regex brackets. |
+| `nocase` | `boolean` | `false` | Make matching case-insensitive. Equivalent to the regex `i` flag. Note that this option is overridden by the `flags` option. |
+| `nodupes` | `boolean` | `true` | Deprecated, use `nounique` instead. This option will be removed in a future major release. By default duplicates are removed. Disable uniquification by setting this option to false. |
+| `noext` | `boolean` | `false` | Alias for `noextglob` |
+| `noextglob` | `boolean` | `false` | Disable support for matching with extglobs (like `+(a\|b)`) |
+| `noglobstar` | `boolean` | `false` | Disable support for matching nested directories with globstars (`**`) |
+| `nonegate` | `boolean` | `false` | Disable support for negating with leading `!` |
+| `noquantifiers` | `boolean` | `false` | Disable support for regex quantifiers (like `a{1,2}`) and treat them as brace patterns to be expanded. |
+| [onIgnore](#optionsonIgnore) | `function` | `undefined` | Function to be called on ignored items. |
+| [onMatch](#optionsonMatch) | `function` | `undefined` | Function to be called on matched items. |
+| [onResult](#optionsonResult) | `function` | `undefined` | Function to be called on all items, regardless of whether or not they are matched or ignored. |
+| `posix` | `boolean` | `false` | Support POSIX character classes ("posix brackets"). |
+| `posixSlashes` | `boolean` | `undefined` | Convert all slashes in file paths to forward slashes. This does not convert slashes in the glob pattern itself |
+| `prepend` | `boolean` | `undefined` | String to prepend to the generated regex used for matching. |
+| `regex` | `boolean` | `false` | Use regular expression rules for `+` (instead of matching literal `+`), and for stars that follow closing parentheses or brackets (as in `)*` and `]*`). |
+| `strictBrackets` | `boolean` | `undefined` | Throw an error if brackets, braces, or parens are imbalanced. |
+| `strictSlashes` | `boolean` | `undefined` | When true, picomatch won't match trailing slashes with single stars. |
+| `unescape` | `boolean` | `undefined` | Remove backslashes preceding escaped characters in the glob pattern. By default, backslashes are retained. |
+| `unixify` | `boolean` | `undefined` | Alias for `posixSlashes`, for backwards compatibility. |
+
+picomatch has automatic detection for regex positive and negative lookbehinds. If the pattern contains a negative lookbehind, you must be using Node.js >= 8.10 or else picomatch will throw an error.
+
+### Scan Options
+
+In addition to the main [picomatch options](#picomatch-options), the following options may also be used with the [.scan](#scan) method.
+
+| **Option** | **Type** | **Default value** | **Description** |
+| --- | --- | --- | --- |
+| `tokens` | `boolean` | `false` | When `true`, the returned object will include an array of tokens (objects), representing each path "segment" in the scanned glob pattern |
+| `parts` | `boolean` | `false` | When `true`, the returned object will include an array of strings representing each path "segment" in the scanned glob pattern. This is automatically enabled when `options.tokens` is true |
+
+**Example**
+
+```js
+const picomatch = require('picomatch');
+const result = picomatch.scan('!./foo/*.js', { tokens: true });
+console.log(result);
+// {
+// prefix: '!./',
+// input: '!./foo/*.js',
+// start: 3,
+// base: 'foo',
+// glob: '*.js',
+// isBrace: false,
+// isBracket: false,
+// isGlob: true,
+// isExtglob: false,
+// isGlobstar: false,
+// negated: true,
+// maxDepth: 2,
+// tokens: [
+// { value: '!./', depth: 0, isGlob: false, negated: true, isPrefix: true },
+// { value: 'foo', depth: 1, isGlob: false },
+// { value: '*.js', depth: 1, isGlob: true }
+// ],
+// slashes: [ 2, 6 ],
+// parts: [ 'foo', '*.js' ]
+// }
+```
+
+
+
+### Options Examples
+
+#### options.expandRange
+
+**Type**: `function`
+
+**Default**: `undefined`
+
+Custom function for expanding ranges in brace patterns. The [fill-range](https://github.com/jonschlinkert/fill-range) library is ideal for this purpose, or you can use custom code to do whatever you need.
+
+**Example**
+
+The following example shows how to create a glob that matches a folder
+
+```js
+const fill = require('fill-range');
+const regex = pm.makeRe('foo/{01..25}/bar', {
+ expandRange(a, b) {
+ return `(${fill(a, b, { toRegex: true })})`;
+ }
+});
+
+console.log(regex);
+//=> /^(?:foo\/((?:0[1-9]|1[0-9]|2[0-5]))\/bar)$/
+
+console.log(regex.test('foo/00/bar')) // false
+console.log(regex.test('foo/01/bar')) // true
+console.log(regex.test('foo/10/bar')) // true
+console.log(regex.test('foo/22/bar')) // true
+console.log(regex.test('foo/25/bar')) // true
+console.log(regex.test('foo/26/bar')) // false
+```
+
+#### options.format
+
+**Type**: `function`
+
+**Default**: `undefined`
+
+Custom function for formatting strings before they're matched.
+
+**Example**
+
+```js
+// strip leading './' from strings
+const format = str => str.replace(/^\.\//, '');
+const isMatch = picomatch('foo/*.js', { format });
+console.log(isMatch('./foo/bar.js')); //=> true
+```
+
+#### options.onMatch
+
+```js
+const onMatch = ({ glob, regex, input, output }) => {
+ console.log({ glob, regex, input, output });
+};
+
+const isMatch = picomatch('*', { onMatch });
+isMatch('foo');
+isMatch('bar');
+isMatch('baz');
+```
+
+#### options.onIgnore
+
+```js
+const onIgnore = ({ glob, regex, input, output }) => {
+ console.log({ glob, regex, input, output });
+};
+
+const isMatch = picomatch('*', { onIgnore, ignore: 'f*' });
+isMatch('foo');
+isMatch('bar');
+isMatch('baz');
+```
+
+#### options.onResult
+
+```js
+const onResult = ({ glob, regex, input, output }) => {
+ console.log({ glob, regex, input, output });
+};
+
+const isMatch = picomatch('*', { onResult, ignore: 'f*' });
+isMatch('foo');
+isMatch('bar');
+isMatch('baz');
+```
+
+
+
+
+## Globbing features
+
+* [Basic globbing](#basic-globbing) (Wildcard matching)
+* [Advanced globbing](#advanced-globbing) (extglobs, posix brackets, brace matching)
+
+### Basic globbing
+
+| **Character** | **Description** |
+| --- | --- |
+| `*` | Matches any character zero or more times, excluding path separators. Does _not match_ path separators or hidden files or directories ("dotfiles"), unless explicitly enabled by setting the `dot` option to `true`. |
+| `**` | Matches any character zero or more times, including path separators. Note that `**` will only match path separators (`/`, and `\\` on Windows) when they are the only characters in a path segment. Thus, `foo**/bar` is equivalent to `foo*/bar`, and `foo/a**b/bar` is equivalent to `foo/a*b/bar`, and _more than two_ consecutive stars in a glob path segment are regarded as _a single star_. Thus, `foo/***/bar` is equivalent to `foo/*/bar`. |
+| `?` | Matches any character excluding path separators one time. Does _not match_ path separators or leading dots. |
+| `[abc]` | Matches any characters inside the brackets. For example, `[abc]` would match the characters `a`, `b` or `c`, and nothing else. |
+
+#### Matching behavior vs. Bash
+
+Picomatch's matching features and expected results in unit tests are based on Bash's unit tests and the Bash 4.3 specification, with the following exceptions:
+
+* Bash will match `foo/bar/baz` with `*`. Picomatch only matches nested directories with `**`.
+* Bash greedily matches with negated extglobs. For example, Bash 4.3 says that `!(foo)*` should match `foo` and `foobar`, since the trailing `*` bracktracks to match the preceding pattern. This is very memory-inefficient, and IMHO, also incorrect. Picomatch would return `false` for both `foo` and `foobar`.
+
+
+
+### Advanced globbing
+
+* [extglobs](#extglobs)
+* [POSIX brackets](#posix-brackets)
+* [Braces](#brace-expansion)
+
+#### Extglobs
+
+| **Pattern** | **Description** |
+| --- | --- |
+| `@(pattern)` | Match _only one_ consecutive occurrence of `pattern` |
+| `*(pattern)` | Match _zero or more_ consecutive occurrences of `pattern` |
+| `+(pattern)` | Match _one or more_ consecutive occurrences of `pattern` |
+| `?(pattern)` | Match _zero or **one**_ consecutive occurrences of `pattern` |
+| `!(pattern)` | Match _anything but_ `pattern` |
+
+**Examples**
+
+```js
+const pm = require('picomatch');
+
+// *(pattern) matches ZERO or more of "pattern"
+console.log(pm.isMatch('a', 'a*(z)')); // true
+console.log(pm.isMatch('az', 'a*(z)')); // true
+console.log(pm.isMatch('azzz', 'a*(z)')); // true
+
+// +(pattern) matches ONE or more of "pattern"
+console.log(pm.isMatch('a', 'a*(z)')); // true
+console.log(pm.isMatch('az', 'a*(z)')); // true
+console.log(pm.isMatch('azzz', 'a*(z)')); // true
+
+// supports multiple extglobs
+console.log(pm.isMatch('foo.bar', '!(foo).!(bar)')); // false
+
+// supports nested extglobs
+console.log(pm.isMatch('foo.bar', '!(!(foo)).!(!(bar))')); // true
+```
+
+#### POSIX brackets
+
+POSIX classes are disabled by default. Enable this feature by setting the `posix` option to true.
+
+**Enable POSIX bracket support**
+
+```js
+console.log(pm.makeRe('[[:word:]]+', { posix: true }));
+//=> /^(?:(?=.)[A-Za-z0-9_]+\/?)$/
+```
+
+**Supported POSIX classes**
+
+The following named POSIX bracket expressions are supported:
+
+* `[:alnum:]` - Alphanumeric characters, equ `[a-zA-Z0-9]`
+* `[:alpha:]` - Alphabetical characters, equivalent to `[a-zA-Z]`.
+* `[:ascii:]` - ASCII characters, equivalent to `[\\x00-\\x7F]`.
+* `[:blank:]` - Space and tab characters, equivalent to `[ \\t]`.
+* `[:cntrl:]` - Control characters, equivalent to `[\\x00-\\x1F\\x7F]`.
+* `[:digit:]` - Numerical digits, equivalent to `[0-9]`.
+* `[:graph:]` - Graph characters, equivalent to `[\\x21-\\x7E]`.
+* `[:lower:]` - Lowercase letters, equivalent to `[a-z]`.
+* `[:print:]` - Print characters, equivalent to `[\\x20-\\x7E ]`.
+* `[:punct:]` - Punctuation and symbols, equivalent to `[\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~]`.
+* `[:space:]` - Extended space characters, equivalent to `[ \\t\\r\\n\\v\\f]`.
+* `[:upper:]` - Uppercase letters, equivalent to `[A-Z]`.
+* `[:word:]` - Word characters (letters, numbers and underscores), equivalent to `[A-Za-z0-9_]`.
+* `[:xdigit:]` - Hexadecimal digits, equivalent to `[A-Fa-f0-9]`.
+
+See the [Bash Reference Manual](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html) for more information.
+
+### Braces
+
+Picomatch does not do brace expansion. For [brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html) and advanced matching with braces, use [micromatch](https://github.com/micromatch/micromatch) instead. Picomatch has very basic support for braces.
+
+### Matching special characters as literals
+
+If you wish to match the following special characters in a filepath, and you want to use these characters in your glob pattern, they must be escaped with backslashes or quotes:
+
+**Special Characters**
+
+Some characters that are used for matching in regular expressions are also regarded as valid file path characters on some platforms.
+
+To match any of the following characters as literals: `$^*+?()[]
+
+Examples:
+
+```js
+console.log(pm.makeRe('foo/bar \\(1\\)'));
+console.log(pm.makeRe('foo/bar \\(1\\)'));
+```
+
+
+
+
+## Library Comparisons
+
+The following table shows which features are supported by [minimatch](https://github.com/isaacs/minimatch), [micromatch](https://github.com/micromatch/micromatch), [picomatch](https://github.com/micromatch/picomatch), [nanomatch](https://github.com/micromatch/nanomatch), [extglob](https://github.com/micromatch/extglob), [braces](https://github.com/micromatch/braces), and [expand-brackets](https://github.com/micromatch/expand-brackets).
+
+| **Feature** | `minimatch` | `micromatch` | `picomatch` | `nanomatch` | `extglob` | `braces` | `expand-brackets` |
+| --- | --- | --- | --- | --- | --- | --- | --- |
+| Wildcard matching (`*?+`) | ✔ | ✔ | ✔ | ✔ | - | - | - |
+| Advancing globbing | ✔ | ✔ | ✔ | - | - | - | - |
+| Brace _matching_ | ✔ | ✔ | ✔ | - | - | ✔ | - |
+| Brace _expansion_ | ✔ | ✔ | - | - | - | ✔ | - |
+| Extglobs | partial | ✔ | ✔ | - | ✔ | - | - |
+| Posix brackets | - | ✔ | ✔ | - | - | - | ✔ |
+| Regular expression syntax | - | ✔ | ✔ | ✔ | ✔ | - | ✔ |
+| File system operations | - | - | - | - | - | - | - |
+
+
+
+
+## Benchmarks
+
+Performance comparison of picomatch and minimatch.
+
+```
+# .makeRe star
+ picomatch x 1,993,050 ops/sec ±0.51% (91 runs sampled)
+ minimatch x 627,206 ops/sec ±1.96% (87 runs sampled))
+
+# .makeRe star; dot=true
+ picomatch x 1,436,640 ops/sec ±0.62% (91 runs sampled)
+ minimatch x 525,876 ops/sec ±0.60% (88 runs sampled)
+
+# .makeRe globstar
+ picomatch x 1,592,742 ops/sec ±0.42% (90 runs sampled)
+ minimatch x 962,043 ops/sec ±1.76% (91 runs sampled)d)
+
+# .makeRe globstars
+ picomatch x 1,615,199 ops/sec ±0.35% (94 runs sampled)
+ minimatch x 477,179 ops/sec ±1.33% (91 runs sampled)
+
+# .makeRe with leading star
+ picomatch x 1,220,856 ops/sec ±0.40% (92 runs sampled)
+ minimatch x 453,564 ops/sec ±1.43% (94 runs sampled)
+
+# .makeRe - basic braces
+ picomatch x 392,067 ops/sec ±0.70% (90 runs sampled)
+ minimatch x 99,532 ops/sec ±2.03% (87 runs sampled))
+```
+
+
+
+
+## Philosophies
+
+The goal of this library is to be blazing fast, without compromising on accuracy.
+
+**Accuracy**
+
+The number one of goal of this library is accuracy. However, it's not unusual for different glob implementations to have different rules for matching behavior, even with simple wildcard matching. It gets increasingly more complicated when combinations of different features are combined, like when extglobs are combined with globstars, braces, slashes, and so on: `!(**/{a,b,*/c})`.
+
+Thus, given that there is no canonical glob specification to use as a single source of truth when differences of opinion arise regarding behavior, sometimes we have to implement our best judgement and rely on feedback from users to make improvements.
+
+**Performance**
+
+Although this library performs well in benchmarks, and in most cases it's faster than other popular libraries we benchmarked against, we will always choose accuracy over performance. It's not helpful to anyone if our library is faster at returning the wrong answer.
+
+
+
+
+## About
+
+
+Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
+
+Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards.
+
+
+
+
+Running Tests
+
+Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
+
+```sh
+npm install && npm test
+```
+
+
+
+
+Building docs
+
+_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
+
+To generate the readme, run the following command:
+
+```sh
+npm install -g verbose/verb#dev verb-generate-readme && verb
+```
+
+
+
+### Author
+
+**Jon Schlinkert**
+
+* [GitHub Profile](https://github.com/jonschlinkert)
+* [Twitter Profile](https://twitter.com/jonschlinkert)
+* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
+
+### License
+
+Copyright © 2017-present, [Jon Schlinkert](https://github.com/jonschlinkert).
+Released under the [MIT License](LICENSE).
diff --git a/node_modules/picomatch/index.js b/node_modules/picomatch/index.js
new file mode 100644
index 0000000..d2f2bc5
--- /dev/null
+++ b/node_modules/picomatch/index.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('./lib/picomatch');
diff --git a/node_modules/picomatch/package.json b/node_modules/picomatch/package.json
new file mode 100644
index 0000000..3db22d4
--- /dev/null
+++ b/node_modules/picomatch/package.json
@@ -0,0 +1,81 @@
+{
+ "name": "picomatch",
+ "description": "Blazing fast and accurate glob matcher written in JavaScript, with no dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions.",
+ "version": "2.3.1",
+ "homepage": "https://github.com/micromatch/picomatch",
+ "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
+ "funding": "https://github.com/sponsors/jonschlinkert",
+ "repository": "micromatch/picomatch",
+ "bugs": {
+ "url": "https://github.com/micromatch/picomatch/issues"
+ },
+ "license": "MIT",
+ "files": [
+ "index.js",
+ "lib"
+ ],
+ "main": "index.js",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "scripts": {
+ "lint": "eslint --cache --cache-location node_modules/.cache/.eslintcache --report-unused-disable-directives --ignore-path .gitignore .",
+ "mocha": "mocha --reporter dot",
+ "test": "npm run lint && npm run mocha",
+ "test:ci": "npm run test:cover",
+ "test:cover": "nyc npm run mocha"
+ },
+ "devDependencies": {
+ "eslint": "^6.8.0",
+ "fill-range": "^7.0.1",
+ "gulp-format-md": "^2.0.0",
+ "mocha": "^6.2.2",
+ "nyc": "^15.0.0",
+ "time-require": "github:jonschlinkert/time-require"
+ },
+ "keywords": [
+ "glob",
+ "match",
+ "picomatch"
+ ],
+ "nyc": {
+ "reporter": [
+ "html",
+ "lcov",
+ "text-summary"
+ ]
+ },
+ "verb": {
+ "toc": {
+ "render": true,
+ "method": "preWrite",
+ "maxdepth": 3
+ },
+ "layout": "empty",
+ "tasks": [
+ "readme"
+ ],
+ "plugins": [
+ "gulp-format-md"
+ ],
+ "lint": {
+ "reflinks": true
+ },
+ "related": {
+ "list": [
+ "braces",
+ "micromatch"
+ ]
+ },
+ "reflinks": [
+ "braces",
+ "expand-brackets",
+ "extglob",
+ "fill-range",
+ "micromatch",
+ "minimatch",
+ "nanomatch",
+ "picomatch"
+ ]
+ }
+}
diff --git a/node_modules/pify/index.js b/node_modules/pify/index.js
new file mode 100644
index 0000000..7c720eb
--- /dev/null
+++ b/node_modules/pify/index.js
@@ -0,0 +1,68 @@
+'use strict';
+
+var processFn = function (fn, P, opts) {
+ return function () {
+ var that = this;
+ var args = new Array(arguments.length);
+
+ for (var i = 0; i < arguments.length; i++) {
+ args[i] = arguments[i];
+ }
+
+ return new P(function (resolve, reject) {
+ args.push(function (err, result) {
+ if (err) {
+ reject(err);
+ } else if (opts.multiArgs) {
+ var results = new Array(arguments.length - 1);
+
+ for (var i = 1; i < arguments.length; i++) {
+ results[i - 1] = arguments[i];
+ }
+
+ resolve(results);
+ } else {
+ resolve(result);
+ }
+ });
+
+ fn.apply(that, args);
+ });
+ };
+};
+
+var pify = module.exports = function (obj, P, opts) {
+ if (typeof P !== 'function') {
+ opts = P;
+ P = Promise;
+ }
+
+ opts = opts || {};
+ opts.exclude = opts.exclude || [/.+Sync$/];
+
+ var filter = function (key) {
+ var match = function (pattern) {
+ return typeof pattern === 'string' ? key === pattern : pattern.test(key);
+ };
+
+ return opts.include ? opts.include.some(match) : !opts.exclude.some(match);
+ };
+
+ var ret = typeof obj === 'function' ? function () {
+ if (opts.excludeMain) {
+ return obj.apply(this, arguments);
+ }
+
+ return processFn(obj, P, opts).apply(this, arguments);
+ } : {};
+
+ return Object.keys(obj).reduce(function (ret, key) {
+ var x = obj[key];
+
+ ret[key] = typeof x === 'function' && filter(key) ? processFn(x, P, opts) : x;
+
+ return ret;
+ }, ret);
+};
+
+pify.all = pify;
diff --git a/node_modules/pify/license b/node_modules/pify/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/pify/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/pify/package.json b/node_modules/pify/package.json
new file mode 100644
index 0000000..311d198
--- /dev/null
+++ b/node_modules/pify/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "pify",
+ "version": "2.3.0",
+ "description": "Promisify a callback-style function",
+ "license": "MIT",
+ "repository": "sindresorhus/pify",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "test": "xo && ava && npm run optimization-test",
+ "optimization-test": "node --allow-natives-syntax optimization-test.js"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "promise",
+ "promises",
+ "promisify",
+ "denodify",
+ "denodeify",
+ "callback",
+ "cb",
+ "node",
+ "then",
+ "thenify",
+ "convert",
+ "transform",
+ "wrap",
+ "wrapper",
+ "bind",
+ "to",
+ "async",
+ "es2015"
+ ],
+ "devDependencies": {
+ "ava": "*",
+ "pinkie-promise": "^1.0.0",
+ "v8-natives": "0.0.2",
+ "xo": "*"
+ }
+}
diff --git a/node_modules/pify/readme.md b/node_modules/pify/readme.md
new file mode 100644
index 0000000..c79ca8b
--- /dev/null
+++ b/node_modules/pify/readme.md
@@ -0,0 +1,119 @@
+# pify [](https://travis-ci.org/sindresorhus/pify)
+
+> Promisify a callback-style function
+
+
+## Install
+
+```
+$ npm install --save pify
+```
+
+
+## Usage
+
+```js
+const fs = require('fs');
+const pify = require('pify');
+
+// promisify a single function
+
+pify(fs.readFile)('package.json', 'utf8').then(data => {
+ console.log(JSON.parse(data).name);
+ //=> 'pify'
+});
+
+// or promisify all methods in a module
+
+pify(fs).readFile('package.json', 'utf8').then(data => {
+ console.log(JSON.parse(data).name);
+ //=> 'pify'
+});
+```
+
+
+## API
+
+### pify(input, [promiseModule], [options])
+
+Returns a promise wrapped version of the supplied function or module.
+
+#### input
+
+Type: `function`, `object`
+
+Callback-style function or module whose methods you want to promisify.
+
+#### promiseModule
+
+Type: `function`
+
+Custom promise module to use instead of the native one.
+
+Check out [`pinkie-promise`](https://github.com/floatdrop/pinkie-promise) if you need a tiny promise polyfill.
+
+#### options
+
+##### multiArgs
+
+Type: `boolean`
+Default: `false`
+
+By default, the promisified function will only return the second argument from the callback, which works fine for most APIs. This option can be useful for modules like `request` that return multiple arguments. Turning this on will make it return an array of all arguments from the callback, excluding the error argument, instead of just the second argument.
+
+```js
+const request = require('request');
+const pify = require('pify');
+
+pify(request, {multiArgs: true})('https://sindresorhus.com').then(result => {
+ const [httpResponse, body] = result;
+});
+```
+
+##### include
+
+Type: `array` of (`string`|`regex`)
+
+Methods in a module to promisify. Remaining methods will be left untouched.
+
+##### exclude
+
+Type: `array` of (`string`|`regex`)
+Default: `[/.+Sync$/]`
+
+Methods in a module **not** to promisify. Methods with names ending with `'Sync'` are excluded by default.
+
+##### excludeMain
+
+Type: `boolean`
+Default: `false`
+
+By default, if given module is a function itself, this function will be promisified. Turn this option on if you want to promisify only methods of the module.
+
+```js
+const pify = require('pify');
+
+function fn() {
+ return true;
+}
+
+fn.method = (data, callback) => {
+ setImmediate(() => {
+ callback(data, null);
+ });
+};
+
+// promisify methods but not fn()
+const promiseFn = pify(fn, {excludeMain: true});
+
+if (promiseFn()) {
+ promiseFn.method('hi').then(data => {
+ console.log(data);
+ });
+}
+```
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/pirates/LICENSE b/node_modules/pirates/LICENSE
new file mode 100644
index 0000000..acc7a0e
--- /dev/null
+++ b/node_modules/pirates/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016-2018 Ari Porad
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/pirates/README.md b/node_modules/pirates/README.md
new file mode 100644
index 0000000..f61065e
--- /dev/null
+++ b/node_modules/pirates/README.md
@@ -0,0 +1,69 @@
+# Pirates [![Coverage][codecov-badge]][codecov-link]
+
+### Properly hijack require
+
+[codecov-badge]: https://img.shields.io/codecov/c/github/danez/pirates/master.svg?style=flat "codecov"
+[codecov-link]: https://codecov.io/gh/danez/pirates "codecov"
+
+## Why?
+
+Two reasons:
+1. Babel and istanbul were breaking each other.
+2. Everyone seemed to re-invent the wheel on this, and everyone wanted a solution that was DRY, simple, easy to use,
+and made everything Just Work™, while allowing multiple require hooks, in a fashion similar to calling `super`.
+
+For some context, see [the Babel issue thread][] which started this all, then [the nyc issue thread][], where
+discussion was moved (as we began to discuss just using the code nyc had developed), and finally to [#1][issue-1]
+where discussion was finally moved.
+
+[the Babel issue thread]: https://github.com/babel/babel/pull/3062 "Babel Issue Thread"
+[the nyc issue thread]: https://github.com/bcoe/nyc/issues/70 "NYC Issue Thread"
+[issue-1]: https://github.com/danez/pirates/issues/1 "Issue #1"
+
+## Installation
+
+ npm install --save pirates
+
+## Usage
+
+Using pirates is really easy:
+```javascript
+// my-module/register.js
+const addHook = require('pirates').addHook;
+// Or if you use ES modules
+// import { addHook } from 'pirates';
+
+function matcher(filename) {
+ // Here, you can inspect the filename to determine if it should be hooked or
+ // not. Just return a truthy/falsey. Files in node_modules are automatically ignored,
+ // unless otherwise specified in options (see below).
+
+ // TODO: Implement your logic here
+ return true;
+}
+
+const revert = addHook(
+ (code, filename) => code.replace('@@foo', 'console.log(\'foo\');'),
+ { exts: ['.js'], matcher }
+);
+
+// And later, if you want to un-hook require, you can just do:
+revert();
+```
+
+## API
+
+### pirates.addHook(hook, [opts={ [matcher: true], [exts: ['.js']], [ignoreNodeModules: true] }]);
+Add a require hook. `hook` must be a function that takes `(code, filename)`, and returns the modified code. `opts` is
+an optional options object. Available options are: `matcher`, which is a function that accepts a filename, and
+returns a truthy value if the file should be hooked (defaults to a function that always returns true), falsey if
+otherwise; `exts`, which is an array of extensions to hook, they should begin with `.` (defaults to `['.js']`);
+`ignoreNodeModules`, if true, any file in a `node_modules` folder wont be hooked (the matcher also wont be called),
+if false, then the matcher will be called for any files in `node_modules` (defaults to true).
+
+
+## Projects that use Pirates
+
+See the [wiki page](https://github.com/danez/pirates/wiki/Projects-using-Pirates). If you add Pirates to your project,
+(And you should! It works best if everyone uses it. Then we can have a happy world full of happy require hooks!), please
+add yourself to the wiki.
diff --git a/node_modules/pirates/index.d.ts b/node_modules/pirates/index.d.ts
new file mode 100644
index 0000000..b2d8ce6
--- /dev/null
+++ b/node_modules/pirates/index.d.ts
@@ -0,0 +1,82 @@
+/* (c) 2015 Ari Porad (@ariporad) . License: ariporad.mit-license.org */
+
+/**
+ * The hook. Accepts the code of the module and the filename.
+ */
+declare type Hook = (code: string, filename: string) => string;
+
+/**
+ * A matcher function, will be called with path to a file.
+ *
+ * Should return truthy if the file should be hooked, falsy otherwise.
+ */
+declare type Matcher = (path: string) => boolean;
+
+/**
+ * Reverts the hook when called.
+ */
+declare type RevertFunction = () => void;
+interface Options {
+ /**
+ * The extensions to hook. Should start with '.' (ex. ['.js']).
+ *
+ * Takes precedence over `exts`, `extension` and `ext`.
+ *
+ * @alias exts
+ * @alias extension
+ * @alias ext
+ * @default ['.js']
+ */
+ extensions?: ReadonlyArray | string;
+
+ /**
+ * The extensions to hook. Should start with '.' (ex. ['.js']).
+ *
+ * Takes precedence over `extension` and `ext`.
+ *
+ * @alias extension
+ * @alias ext
+ * @default ['.js']
+ */
+ exts?: ReadonlyArray | string;
+
+ /**
+ * The extensions to hook. Should start with '.' (ex. ['.js']).
+ *
+ * Takes precedence over `ext`.
+ *
+ * @alias ext
+ * @default ['.js']
+ */
+ extension?: ReadonlyArray | string;
+
+ /**
+ * The extensions to hook. Should start with '.' (ex. ['.js']).
+ *
+ * @default ['.js']
+ */
+ ext?: ReadonlyArray | string;
+
+ /**
+ * A matcher function, will be called with path to a file.
+ *
+ * Should return truthy if the file should be hooked, falsy otherwise.
+ */
+ matcher?: Matcher | null;
+
+ /**
+ * Auto-ignore node_modules. Independent of any matcher.
+ *
+ * @default true
+ */
+ ignoreNodeModules?: boolean;
+}
+
+/**
+ * Add a require hook.
+ *
+ * @param hook The hook. Accepts the code of the module and the filename. Required.
+ * @returns The `revert` function. Reverts the hook when called.
+ */
+export declare function addHook(hook: Hook, opts?: Options): RevertFunction;
+export {};
diff --git a/node_modules/pirates/package.json b/node_modules/pirates/package.json
new file mode 100644
index 0000000..331ed0e
--- /dev/null
+++ b/node_modules/pirates/package.json
@@ -0,0 +1,74 @@
+{
+ "name": "pirates",
+ "description": "Properly hijack require, i.e., properly define require hooks and customizations",
+ "main": "lib/index.js",
+ "types": "index.d.ts",
+ "scripts": {
+ "clean": "rimraf lib",
+ "build": "babel src -d lib",
+ "test": "cross-env BABEL_ENV=test yarn run build && nyc ava",
+ "lint": "eslint --report-unused-disable-directives .",
+ "prepublishOnly": "yarn run build"
+ },
+ "files": [
+ "lib",
+ "index.d.ts"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/danez/pirates.git"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "author": {
+ "name": "Ari Porad",
+ "email": "ari@ariporad.com",
+ "url": "http://ariporad.com"
+ },
+ "devDependencies": {
+ "@babel/cli": "7.21.0",
+ "@babel/core": "7.21.4",
+ "@babel/preset-env": "7.21.4",
+ "ava": "1.4.1",
+ "babel-core": "7.0.0-bridge.0",
+ "babel-eslint": "10.1.0",
+ "babel-plugin-istanbul": "5.2.0",
+ "cross-env": "5.2.1",
+ "decache": "4.6.1",
+ "eslint": "5.16.0",
+ "eslint-config-prettier": "4.3.0",
+ "eslint-plugin-import": "2.27.5",
+ "eslint-plugin-prettier": "3.4.1",
+ "mock-require": "3.0.3",
+ "nyc": "13.3.0",
+ "prettier": "1.19.1",
+ "rewire": "4.0.1",
+ "rimraf": "3.0.2"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/danez/pirates/issues"
+ },
+ "homepage": "https://github.com/danez/pirates#readme",
+ "ava": {
+ "files": [
+ "test/*.js"
+ ],
+ "sources": [
+ "lib/**/*.js"
+ ]
+ },
+ "nyc": {
+ "include": [
+ "src/*.js"
+ ],
+ "reporter": [
+ "json",
+ "text"
+ ],
+ "sourceMap": false,
+ "instrument": false
+ },
+ "version": "4.0.6"
+}
diff --git a/node_modules/postcss-import/LICENSE b/node_modules/postcss-import/LICENSE
new file mode 100644
index 0000000..13983fb
--- /dev/null
+++ b/node_modules/postcss-import/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Maxime Thirouin, Jason Campbell & Kevin Mårtensson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/postcss-import/README.md b/node_modules/postcss-import/README.md
new file mode 100644
index 0000000..ac0148e
--- /dev/null
+++ b/node_modules/postcss-import/README.md
@@ -0,0 +1,244 @@
+# postcss-import
+
+[](https://travis-ci.org/postcss/postcss-import)
+[](https://github.com/postcss/postcss-import/blob/master/CHANGELOG.md)
+[](https://postcss.org/)
+
+> [PostCSS](https://github.com/postcss/postcss) plugin to transform `@import`
+rules by inlining content.
+
+This plugin can consume local files, node modules or web_modules.
+To resolve path of an `@import` rule, it can look into root directory
+(by default `process.cwd()`), `web_modules`, `node_modules`
+or local modules.
+_When importing a module, it will look for `index.css` or file referenced in
+`package.json` in the `style` or `main` fields._
+You can also provide manually multiples paths where to look at.
+
+**Notes:**
+
+- **This plugin should probably be used as the first plugin of your list.
+This way, other plugins will work on the AST as if there were only a single file
+to process, and will probably work as you can expect**.
+- This plugin works great with
+[postcss-url](https://github.com/postcss/postcss-url) plugin,
+which will allow you to adjust assets `url()` (or even inline them) after
+inlining imported files.
+- In order to optimize output, **this plugin will only import a file once** on
+a given scope (root, media query...).
+Tests are made from the path & the content of imported files (using a hash
+table).
+If this behavior is not what you want, look at `skipDuplicates` option
+- If you are looking for **Glob Imports**, you can use [postcss-import-ext-glob](https://github.com/dimitrinicolas/postcss-import-ext-glob) to extend postcss-import.
+- Imports which are not modified (by `options.filter` or because they are remote
+ imports) are moved to the top of the output.
+- **This plugin attempts to follow the CSS `@import` spec**; `@import`
+ statements must precede all other statements (besides `@charset`).
+
+## Installation
+
+```console
+$ npm install -D postcss-import
+```
+
+## Usage
+
+Unless your stylesheet is in the same place where you run postcss
+(`process.cwd()`), you will need to use `from` option to make relative imports
+work.
+
+```js
+// dependencies
+const fs = require("fs")
+const postcss = require("postcss")
+const atImport = require("postcss-import")
+
+// css to be processed
+const css = fs.readFileSync("css/input.css", "utf8")
+
+// process css
+postcss()
+ .use(atImport())
+ .process(css, {
+ // `from` option is needed here
+ from: "css/input.css"
+ })
+ .then((result) => {
+ const output = result.css
+
+ console.log(output)
+ })
+```
+
+`css/input.css`:
+
+```css
+/* can consume `node_modules`, `web_modules` or local modules */
+@import "cssrecipes-defaults"; /* == @import "../node_modules/cssrecipes-defaults/index.css"; */
+@import "normalize.css"; /* == @import "../node_modules/normalize.css/normalize.css"; */
+
+@import "foo.css"; /* relative to css/ according to `from` option above */
+
+@import "bar.css" (min-width: 25em);
+
+@import 'baz.css' layer(baz-layer);
+
+body {
+ background: black;
+}
+```
+
+will give you:
+
+```css
+/* ... content of ../node_modules/cssrecipes-defaults/index.css */
+/* ... content of ../node_modules/normalize.css/normalize.css */
+
+/* ... content of css/foo.css */
+
+@media (min-width: 25em) {
+/* ... content of css/bar.css */
+}
+
+@layer baz-layer {
+/* ... content of css/baz.css */
+}
+
+body {
+ background: black;
+}
+```
+
+Checkout the [tests](test) for more examples.
+
+### Options
+
+### `filter`
+Type: `Function`
+Default: `() => true`
+
+Only transform imports for which the test function returns `true`. Imports for
+which the test function returns `false` will be left as is. The function gets
+the path to import as an argument and should return a boolean.
+
+#### `root`
+
+Type: `String`
+Default: `process.cwd()` or _dirname of
+[the postcss `from`](https://github.com/postcss/postcss#node-source)_
+
+Define the root where to resolve path (eg: place where `node_modules` are).
+Should not be used that much.
+_Note: nested `@import` will additionally benefit of the relative dirname of
+imported files._
+
+#### `path`
+
+Type: `String|Array`
+Default: `[]`
+
+A string or an array of paths in where to look for files.
+
+#### `plugins`
+
+Type: `Array`
+Default: `undefined`
+
+An array of plugins to be applied on each imported files.
+
+#### `resolve`
+
+Type: `Function`
+Default: `null`
+
+You can provide a custom path resolver with this option. This function gets
+`(id, basedir, importOptions)` arguments and should return a path, an array of
+paths or a promise resolving to the path(s). If you do not return an absolute
+path, your path will be resolved to an absolute path using the default
+resolver.
+You can use [resolve](https://github.com/substack/node-resolve) for this.
+
+#### `load`
+
+Type: `Function`
+Default: null
+
+You can overwrite the default loading way by setting this option.
+This function gets `(filename, importOptions)` arguments and returns content or
+promised content.
+
+#### `skipDuplicates`
+
+Type: `Boolean`
+Default: `true`
+
+By default, similar files (based on the same content) are being skipped.
+It's to optimize output and skip similar files like `normalize.css` for example.
+If this behavior is not what you want, just set this option to `false` to
+disable it.
+
+#### `addModulesDirectories`
+
+Type: `Array`
+Default: `[]`
+
+An array of folder names to add to [Node's resolver](https://github.com/substack/node-resolve).
+Values will be appended to the default resolve directories:
+`["node_modules", "web_modules"]`.
+
+This option is only for adding additional directories to default resolver. If
+you provide your own resolver via the `resolve` configuration option above, then
+this value will be ignored.
+
+#### `nameLayer`
+
+Type: `Function`
+Default: `null`
+
+You can provide a custom naming function for anonymous layers (`@import 'baz.css' layer;`).
+This function gets `(index, rootFilename)` arguments and should return a unique string.
+
+This option only influences imports without a layer name.
+Without this option the plugin will warn on anonymous layers.
+
+#### Example with some options
+
+```js
+const postcss = require("postcss")
+const atImport = require("postcss-import")
+
+postcss()
+ .use(atImport({
+ path: ["src/css"],
+ }))
+ .process(cssString)
+ .then((result) => {
+ const { css } = result
+ })
+```
+
+## `dependency` Message Support
+
+`postcss-import` adds a message to `result.messages` for each `@import`. Messages are in the following format:
+
+```
+{
+ type: 'dependency',
+ file: absoluteFilePath,
+ parent: fileContainingTheImport
+}
+```
+
+This is mainly for use by postcss runners that implement file watching.
+
+---
+
+## CONTRIBUTING
+
+* ⇄ Pull requests and ★ Stars are always welcome.
+* For bugs and feature requests, please create an issue.
+* Pull requests must be accompanied by passing automated tests (`$ npm test`).
+
+## [Changelog](CHANGELOG.md)
+
+## [License](LICENSE)
diff --git a/node_modules/postcss-import/index.js b/node_modules/postcss-import/index.js
new file mode 100644
index 0000000..d324a7e
--- /dev/null
+++ b/node_modules/postcss-import/index.js
@@ -0,0 +1,420 @@
+"use strict"
+// builtin tooling
+const path = require("path")
+
+// internal tooling
+const joinMedia = require("./lib/join-media")
+const joinLayer = require("./lib/join-layer")
+const resolveId = require("./lib/resolve-id")
+const loadContent = require("./lib/load-content")
+const processContent = require("./lib/process-content")
+const parseStatements = require("./lib/parse-statements")
+const assignLayerNames = require("./lib/assign-layer-names")
+const dataURL = require("./lib/data-url")
+
+function AtImport(options) {
+ options = {
+ root: process.cwd(),
+ path: [],
+ skipDuplicates: true,
+ resolve: resolveId,
+ load: loadContent,
+ plugins: [],
+ addModulesDirectories: [],
+ nameLayer: null,
+ ...options,
+ }
+
+ options.root = path.resolve(options.root)
+
+ // convert string to an array of a single element
+ if (typeof options.path === "string") options.path = [options.path]
+
+ if (!Array.isArray(options.path)) options.path = []
+
+ options.path = options.path.map(p => path.resolve(options.root, p))
+
+ return {
+ postcssPlugin: "postcss-import",
+ Once(styles, { result, atRule, postcss }) {
+ const state = {
+ importedFiles: {},
+ hashFiles: {},
+ rootFilename: null,
+ anonymousLayerCounter: 0,
+ }
+
+ if (styles.source?.input?.file) {
+ state.rootFilename = styles.source.input.file
+ state.importedFiles[styles.source.input.file] = {}
+ }
+
+ if (options.plugins && !Array.isArray(options.plugins)) {
+ throw new Error("plugins option must be an array")
+ }
+
+ if (options.nameLayer && typeof options.nameLayer !== "function") {
+ throw new Error("nameLayer option must be a function")
+ }
+
+ return parseStyles(result, styles, options, state, [], []).then(
+ bundle => {
+ applyRaws(bundle)
+ applyMedia(bundle)
+ applyStyles(bundle, styles)
+ }
+ )
+
+ function applyRaws(bundle) {
+ bundle.forEach((stmt, index) => {
+ if (index === 0) return
+
+ if (stmt.parent) {
+ const { before } = stmt.parent.node.raws
+ if (stmt.type === "nodes") stmt.nodes[0].raws.before = before
+ else stmt.node.raws.before = before
+ } else if (stmt.type === "nodes") {
+ stmt.nodes[0].raws.before = stmt.nodes[0].raws.before || "\n"
+ }
+ })
+ }
+
+ function applyMedia(bundle) {
+ bundle.forEach(stmt => {
+ if (
+ (!stmt.media.length && !stmt.layer.length) ||
+ stmt.type === "charset"
+ ) {
+ return
+ }
+
+ if (stmt.layer.length > 1) {
+ assignLayerNames(stmt.layer, stmt.node, state, options)
+ }
+
+ if (stmt.type === "import") {
+ const parts = [stmt.fullUri]
+
+ const media = stmt.media.join(", ")
+
+ if (stmt.layer.length) {
+ const layerName = stmt.layer.join(".")
+
+ let layerParams = "layer"
+ if (layerName) {
+ layerParams = `layer(${layerName})`
+ }
+
+ parts.push(layerParams)
+ }
+
+ if (media) {
+ parts.push(media)
+ }
+
+ stmt.node.params = parts.join(" ")
+ } else if (stmt.type === "media") {
+ if (stmt.layer.length) {
+ const layerNode = atRule({
+ name: "layer",
+ params: stmt.layer.join("."),
+ source: stmt.node.source,
+ })
+
+ if (stmt.parentMedia?.length) {
+ const mediaNode = atRule({
+ name: "media",
+ params: stmt.parentMedia.join(", "),
+ source: stmt.node.source,
+ })
+
+ mediaNode.append(layerNode)
+ layerNode.append(stmt.node)
+ stmt.node = mediaNode
+ } else {
+ layerNode.append(stmt.node)
+ stmt.node = layerNode
+ }
+ } else {
+ stmt.node.params = stmt.media.join(", ")
+ }
+ } else {
+ const { nodes } = stmt
+ const { parent } = nodes[0]
+
+ let outerAtRule
+ let innerAtRule
+ if (stmt.media.length && stmt.layer.length) {
+ const mediaNode = atRule({
+ name: "media",
+ params: stmt.media.join(", "),
+ source: parent.source,
+ })
+
+ const layerNode = atRule({
+ name: "layer",
+ params: stmt.layer.join("."),
+ source: parent.source,
+ })
+
+ mediaNode.append(layerNode)
+ innerAtRule = layerNode
+ outerAtRule = mediaNode
+ } else if (stmt.media.length) {
+ const mediaNode = atRule({
+ name: "media",
+ params: stmt.media.join(", "),
+ source: parent.source,
+ })
+
+ innerAtRule = mediaNode
+ outerAtRule = mediaNode
+ } else if (stmt.layer.length) {
+ const layerNode = atRule({
+ name: "layer",
+ params: stmt.layer.join("."),
+ source: parent.source,
+ })
+
+ innerAtRule = layerNode
+ outerAtRule = layerNode
+ }
+
+ parent.insertBefore(nodes[0], outerAtRule)
+
+ // remove nodes
+ nodes.forEach(node => {
+ node.parent = undefined
+ })
+
+ // better output
+ nodes[0].raws.before = nodes[0].raws.before || "\n"
+
+ // wrap new rules with media query and/or layer at rule
+ innerAtRule.append(nodes)
+
+ stmt.type = "media"
+ stmt.node = outerAtRule
+ delete stmt.nodes
+ }
+ })
+ }
+
+ function applyStyles(bundle, styles) {
+ styles.nodes = []
+
+ // Strip additional statements.
+ bundle.forEach(stmt => {
+ if (["charset", "import", "media"].includes(stmt.type)) {
+ stmt.node.parent = undefined
+ styles.append(stmt.node)
+ } else if (stmt.type === "nodes") {
+ stmt.nodes.forEach(node => {
+ node.parent = undefined
+ styles.append(node)
+ })
+ }
+ })
+ }
+
+ function parseStyles(result, styles, options, state, media, layer) {
+ const statements = parseStatements(result, styles)
+
+ return Promise.resolve(statements)
+ .then(stmts => {
+ // process each statement in series
+ return stmts.reduce((promise, stmt) => {
+ return promise.then(() => {
+ stmt.media = joinMedia(media, stmt.media || [])
+ stmt.parentMedia = media
+ stmt.layer = joinLayer(layer, stmt.layer || [])
+
+ // skip protocol base uri (protocol://url) or protocol-relative
+ if (
+ stmt.type !== "import" ||
+ /^(?:[a-z]+:)?\/\//i.test(stmt.uri)
+ ) {
+ return
+ }
+
+ if (options.filter && !options.filter(stmt.uri)) {
+ // rejected by filter
+ return
+ }
+
+ return resolveImportId(result, stmt, options, state)
+ })
+ }, Promise.resolve())
+ })
+ .then(() => {
+ let charset
+ const imports = []
+ const bundle = []
+
+ function handleCharset(stmt) {
+ if (!charset) charset = stmt
+ // charsets aren't case-sensitive, so convert to lower case to compare
+ else if (
+ stmt.node.params.toLowerCase() !==
+ charset.node.params.toLowerCase()
+ ) {
+ throw new Error(
+ `Incompatable @charset statements:
+ ${stmt.node.params} specified in ${stmt.node.source.input.file}
+ ${charset.node.params} specified in ${charset.node.source.input.file}`
+ )
+ }
+ }
+
+ // squash statements and their children
+ statements.forEach(stmt => {
+ if (stmt.type === "charset") handleCharset(stmt)
+ else if (stmt.type === "import") {
+ if (stmt.children) {
+ stmt.children.forEach((child, index) => {
+ if (child.type === "import") imports.push(child)
+ else if (child.type === "charset") handleCharset(child)
+ else bundle.push(child)
+ // For better output
+ if (index === 0) child.parent = stmt
+ })
+ } else imports.push(stmt)
+ } else if (stmt.type === "media" || stmt.type === "nodes") {
+ bundle.push(stmt)
+ }
+ })
+
+ return charset
+ ? [charset, ...imports.concat(bundle)]
+ : imports.concat(bundle)
+ })
+ }
+
+ function resolveImportId(result, stmt, options, state) {
+ if (dataURL.isValid(stmt.uri)) {
+ return loadImportContent(result, stmt, stmt.uri, options, state).then(
+ result => {
+ stmt.children = result
+ }
+ )
+ }
+
+ const atRule = stmt.node
+ let sourceFile
+ if (atRule.source?.input?.file) {
+ sourceFile = atRule.source.input.file
+ }
+ const base = sourceFile
+ ? path.dirname(atRule.source.input.file)
+ : options.root
+
+ return Promise.resolve(options.resolve(stmt.uri, base, options))
+ .then(paths => {
+ if (!Array.isArray(paths)) paths = [paths]
+ // Ensure that each path is absolute:
+ return Promise.all(
+ paths.map(file => {
+ return !path.isAbsolute(file)
+ ? resolveId(file, base, options)
+ : file
+ })
+ )
+ })
+ .then(resolved => {
+ // Add dependency messages:
+ resolved.forEach(file => {
+ result.messages.push({
+ type: "dependency",
+ plugin: "postcss-import",
+ file,
+ parent: sourceFile,
+ })
+ })
+
+ return Promise.all(
+ resolved.map(file => {
+ return loadImportContent(result, stmt, file, options, state)
+ })
+ )
+ })
+ .then(result => {
+ // Merge loaded statements
+ stmt.children = result.reduce((result, statements) => {
+ return statements ? result.concat(statements) : result
+ }, [])
+ })
+ }
+
+ function loadImportContent(result, stmt, filename, options, state) {
+ const atRule = stmt.node
+ const { media, layer } = stmt
+
+ assignLayerNames(layer, atRule, state, options)
+
+ if (options.skipDuplicates) {
+ // skip files already imported at the same scope
+ if (state.importedFiles[filename]?.[media]?.[layer]) {
+ return
+ }
+
+ // save imported files to skip them next time
+ if (!state.importedFiles[filename]) {
+ state.importedFiles[filename] = {}
+ }
+ if (!state.importedFiles[filename][media]) {
+ state.importedFiles[filename][media] = {}
+ }
+ state.importedFiles[filename][media][layer] = true
+ }
+
+ return Promise.resolve(options.load(filename, options)).then(
+ content => {
+ if (content.trim() === "") {
+ result.warn(`${filename} is empty`, { node: atRule })
+ return
+ }
+
+ // skip previous imported files not containing @import rules
+ if (state.hashFiles[content]?.[media]?.[layer]) {
+ return
+ }
+
+ return processContent(
+ result,
+ content,
+ filename,
+ options,
+ postcss
+ ).then(importedResult => {
+ const styles = importedResult.root
+ result.messages = result.messages.concat(importedResult.messages)
+
+ if (options.skipDuplicates) {
+ const hasImport = styles.some(child => {
+ return child.type === "atrule" && child.name === "import"
+ })
+ if (!hasImport) {
+ // save hash files to skip them next time
+ if (!state.hashFiles[content]) {
+ state.hashFiles[content] = {}
+ }
+ if (!state.hashFiles[content][media]) {
+ state.hashFiles[content][media] = {}
+ }
+ state.hashFiles[content][media][layer] = true
+ }
+ }
+
+ // recursion: import @import from imported file
+ return parseStyles(result, styles, options, state, media, layer)
+ })
+ }
+ )
+ }
+ },
+ }
+}
+
+AtImport.postcss = true
+
+module.exports = AtImport
diff --git a/node_modules/postcss-import/package.json b/node_modules/postcss-import/package.json
new file mode 100644
index 0000000..a81ea5f
--- /dev/null
+++ b/node_modules/postcss-import/package.json
@@ -0,0 +1,65 @@
+{
+ "name": "postcss-import",
+ "version": "15.1.0",
+ "description": "PostCSS plugin to import CSS files",
+ "keywords": [
+ "css",
+ "postcss",
+ "postcss-plugin",
+ "import",
+ "node modules",
+ "npm"
+ ],
+ "author": "Maxime Thirouin",
+ "license": "MIT",
+ "repository": "https://github.com/postcss/postcss-import.git",
+ "files": [
+ "index.js",
+ "lib"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "devDependencies": {
+ "ava": "^5.0.0",
+ "eslint": "^8.2.0",
+ "eslint-config-problems": "^7.0.0",
+ "eslint-plugin-prettier": "^4.0.0",
+ "postcss": "^8.0.0",
+ "postcss-scss": "^4.0.0",
+ "prettier": "~2.8.0",
+ "sugarss": "^4.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ },
+ "scripts": {
+ "ci": "eslint . && ava",
+ "lint": "eslint . --fix",
+ "pretest": "npm run lint",
+ "test": "ava"
+ },
+ "eslintConfig": {
+ "extends": "eslint-config-problems",
+ "env": {
+ "node": true
+ },
+ "plugins": [
+ "prettier"
+ ],
+ "rules": {
+ "prettier/prettier": [
+ "error",
+ {
+ "semi": false,
+ "arrowParens": "avoid"
+ }
+ ]
+ }
+ }
+}
diff --git a/node_modules/postcss-js/LICENSE b/node_modules/postcss-js/LICENSE
new file mode 100644
index 0000000..d3bd672
--- /dev/null
+++ b/node_modules/postcss-js/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright 2015 Andrey Sitnik
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/postcss-js/README.md b/node_modules/postcss-js/README.md
new file mode 100644
index 0000000..a29e3b0
--- /dev/null
+++ b/node_modules/postcss-js/README.md
@@ -0,0 +1,22 @@
+# PostCSS JS
+
+
+
+[PostCSS] for CSS-in-JS and styles in JS objects.
+
+For example, to use [Stylelint] or [RTLCSS] plugins in your workflow.
+
+
+
+
+
+[Stylelint]: https://github.com/stylelint/stylelint
+[PostCSS]: https://github.com/postcss/postcss
+[RTLCSS]: https://github.com/MohammadYounes/rtlcss
+
+
+## Docs
+Read full docs **[here](https://github.com/postcss/postcss-js#readme)**.
diff --git a/node_modules/postcss-js/async.js b/node_modules/postcss-js/async.js
new file mode 100644
index 0000000..4c2f3c6
--- /dev/null
+++ b/node_modules/postcss-js/async.js
@@ -0,0 +1,15 @@
+let postcss = require('postcss')
+
+let processResult = require('./process-result')
+let parse = require('./parser')
+
+module.exports = function async(plugins) {
+ let processor = postcss(plugins)
+ return async input => {
+ let result = await processor.process(input, {
+ parser: parse,
+ from: undefined
+ })
+ return processResult(result)
+ }
+}
diff --git a/node_modules/postcss-js/index.js b/node_modules/postcss-js/index.js
new file mode 100644
index 0000000..8a4274e
--- /dev/null
+++ b/node_modules/postcss-js/index.js
@@ -0,0 +1,11 @@
+let objectify = require('./objectifier')
+let parse = require('./parser')
+let async = require('./async')
+let sync = require('./sync')
+
+module.exports = {
+ objectify,
+ parse,
+ async,
+ sync
+}
diff --git a/node_modules/postcss-js/index.mjs b/node_modules/postcss-js/index.mjs
new file mode 100644
index 0000000..d14b61c
--- /dev/null
+++ b/node_modules/postcss-js/index.mjs
@@ -0,0 +1,8 @@
+import index from './index.js'
+
+export default index
+
+export const objectify = index.objectify
+export const parse = index.parse
+export const async = index.async
+export const sync = index.sync
diff --git a/node_modules/postcss-js/objectifier.js b/node_modules/postcss-js/objectifier.js
new file mode 100644
index 0000000..a4708b8
--- /dev/null
+++ b/node_modules/postcss-js/objectifier.js
@@ -0,0 +1,85 @@
+let camelcase = require('camelcase-css')
+
+let UNITLESS = {
+ boxFlex: true,
+ boxFlexGroup: true,
+ columnCount: true,
+ flex: true,
+ flexGrow: true,
+ flexPositive: true,
+ flexShrink: true,
+ flexNegative: true,
+ fontWeight: true,
+ lineClamp: true,
+ lineHeight: true,
+ opacity: true,
+ order: true,
+ orphans: true,
+ tabSize: true,
+ widows: true,
+ zIndex: true,
+ zoom: true,
+ fillOpacity: true,
+ strokeDashoffset: true,
+ strokeOpacity: true,
+ strokeWidth: true
+}
+
+function atRule(node) {
+ if (typeof node.nodes === 'undefined') {
+ return true
+ } else {
+ return process(node)
+ }
+}
+
+function process(node) {
+ let name
+ let result = {}
+
+ node.each(child => {
+ if (child.type === 'atrule') {
+ name = '@' + child.name
+ if (child.params) name += ' ' + child.params
+ if (typeof result[name] === 'undefined') {
+ result[name] = atRule(child)
+ } else if (Array.isArray(result[name])) {
+ result[name].push(atRule(child))
+ } else {
+ result[name] = [result[name], atRule(child)]
+ }
+ } else if (child.type === 'rule') {
+ let body = process(child)
+ if (result[child.selector]) {
+ for (let i in body) {
+ result[child.selector][i] = body[i]
+ }
+ } else {
+ result[child.selector] = body
+ }
+ } else if (child.type === 'decl') {
+ if (child.prop[0] === '-' && child.prop[1] === '-') {
+ name = child.prop
+ } else if (child.parent && child.parent.selector === ':export') {
+ name = child.prop
+ } else {
+ name = camelcase(child.prop)
+ }
+ let value = child.value
+ if (!isNaN(child.value) && UNITLESS[name]) {
+ value = parseFloat(child.value)
+ }
+ if (child.important) value += ' !important'
+ if (typeof result[name] === 'undefined') {
+ result[name] = value
+ } else if (Array.isArray(result[name])) {
+ result[name].push(value)
+ } else {
+ result[name] = [result[name], value]
+ }
+ }
+ })
+ return result
+}
+
+module.exports = process
diff --git a/node_modules/postcss-js/package.json b/node_modules/postcss-js/package.json
new file mode 100644
index 0000000..ce0ff35
--- /dev/null
+++ b/node_modules/postcss-js/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "postcss-js",
+ "version": "4.0.1",
+ "description": "PostCSS for CSS-in-JS and styles in JS objects",
+ "keywords": [
+ "postcss",
+ "postcss-runner",
+ "js",
+ "inline",
+ "react",
+ "css",
+ "cssinjs"
+ ],
+ "author": "Andrey Sitnik ",
+ "license": "MIT",
+ "repository": "postcss/postcss-js",
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "exports": {
+ ".": {
+ "require": "./index.js",
+ "import": "./index.mjs"
+ },
+ "./package.json": "./package.json",
+ "./async": "./async.js",
+ "./objectifier": "./objectifier.js",
+ "./parser": "./parser.js",
+ "./process-result": "./process-result.js",
+ "./sync": "./sync.js"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ },
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ }
+}
diff --git a/node_modules/postcss-js/parser.js b/node_modules/postcss-js/parser.js
new file mode 100644
index 0000000..17ae264
--- /dev/null
+++ b/node_modules/postcss-js/parser.js
@@ -0,0 +1,104 @@
+let postcss = require('postcss')
+
+let IMPORTANT = /\s*!important\s*$/i
+
+let UNITLESS = {
+ 'box-flex': true,
+ 'box-flex-group': true,
+ 'column-count': true,
+ 'flex': true,
+ 'flex-grow': true,
+ 'flex-positive': true,
+ 'flex-shrink': true,
+ 'flex-negative': true,
+ 'font-weight': true,
+ 'line-clamp': true,
+ 'line-height': true,
+ 'opacity': true,
+ 'order': true,
+ 'orphans': true,
+ 'tab-size': true,
+ 'widows': true,
+ 'z-index': true,
+ 'zoom': true,
+ 'fill-opacity': true,
+ 'stroke-dashoffset': true,
+ 'stroke-opacity': true,
+ 'stroke-width': true
+}
+
+function dashify(str) {
+ return str
+ .replace(/([A-Z])/g, '-$1')
+ .replace(/^ms-/, '-ms-')
+ .toLowerCase()
+}
+
+function decl(parent, name, value) {
+ if (value === false || value === null) return
+
+ if (!name.startsWith('--')) {
+ name = dashify(name)
+ }
+
+ if (typeof value === 'number') {
+ if (value === 0 || UNITLESS[name]) {
+ value = value.toString()
+ } else {
+ value += 'px'
+ }
+ }
+
+ if (name === 'css-float') name = 'float'
+
+ if (IMPORTANT.test(value)) {
+ value = value.replace(IMPORTANT, '')
+ parent.push(postcss.decl({ prop: name, value, important: true }))
+ } else {
+ parent.push(postcss.decl({ prop: name, value }))
+ }
+}
+
+function atRule(parent, parts, value) {
+ let node = postcss.atRule({ name: parts[1], params: parts[3] || '' })
+ if (typeof value === 'object') {
+ node.nodes = []
+ parse(value, node)
+ }
+ parent.push(node)
+}
+
+function parse(obj, parent) {
+ let name, value, node
+ for (name in obj) {
+ value = obj[name]
+ if (value === null || typeof value === 'undefined') {
+ continue
+ } else if (name[0] === '@') {
+ let parts = name.match(/@(\S+)(\s+([\W\w]*)\s*)?/)
+ if (Array.isArray(value)) {
+ for (let i of value) {
+ atRule(parent, parts, i)
+ }
+ } else {
+ atRule(parent, parts, value)
+ }
+ } else if (Array.isArray(value)) {
+ for (let i of value) {
+ decl(parent, name, i)
+ }
+ } else if (typeof value === 'object') {
+ node = postcss.rule({ selector: name })
+ parse(value, node)
+ parent.push(node)
+ } else {
+ decl(parent, name, value)
+ }
+ }
+}
+
+module.exports = function (obj) {
+ let root = postcss.root()
+ parse(obj, root)
+ return root
+}
diff --git a/node_modules/postcss-js/process-result.js b/node_modules/postcss-js/process-result.js
new file mode 100644
index 0000000..215a95c
--- /dev/null
+++ b/node_modules/postcss-js/process-result.js
@@ -0,0 +1,11 @@
+let objectify = require('./objectifier')
+
+module.exports = function processResult(result) {
+ if (console && console.warn) {
+ result.warnings().forEach(warn => {
+ let source = warn.plugin || 'PostCSS'
+ console.warn(source + ': ' + warn.text)
+ })
+ }
+ return objectify(result.root)
+}
diff --git a/node_modules/postcss-js/sync.js b/node_modules/postcss-js/sync.js
new file mode 100644
index 0000000..745bd27
--- /dev/null
+++ b/node_modules/postcss-js/sync.js
@@ -0,0 +1,12 @@
+let postcss = require('postcss')
+
+let processResult = require('./process-result')
+let parse = require('./parser')
+
+module.exports = function (plugins) {
+ let processor = postcss(plugins)
+ return input => {
+ let result = processor.process(input, { parser: parse, from: undefined })
+ return processResult(result)
+ }
+}
diff --git a/node_modules/postcss-load-config/LICENSE b/node_modules/postcss-load-config/LICENSE
new file mode 100644
index 0000000..458e8a3
--- /dev/null
+++ b/node_modules/postcss-load-config/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright Michael Ciniawsky
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/postcss-load-config/README.md b/node_modules/postcss-load-config/README.md
new file mode 100644
index 0000000..9de4de2
--- /dev/null
+++ b/node_modules/postcss-load-config/README.md
@@ -0,0 +1,466 @@
+
+
+
+

+
+
+
+

+
Load Config
+
+
+Install
+
+```bash
+npm i -D postcss-load-config
+```
+
+Usage
+
+```bash
+npm i -S|-D postcss-plugin
+```
+
+Install all required PostCSS plugins and save them to your **package.json** `dependencies`/`devDependencies`
+
+Then create a PostCSS config file by choosing one of the following formats
+
+### `package.json`
+
+Create a **`postcss`** section in your project's **`package.json`**
+
+```
+Project (Root)
+ |– client
+ |– public
+ |
+ |- package.json
+```
+
+```json
+{
+ "postcss": {
+ "parser": "sugarss",
+ "map": false,
+ "plugins": {
+ "postcss-plugin": {}
+ }
+ }
+}
+```
+
+### `.postcssrc`
+
+Create a **`.postcssrc`** file in JSON or YAML format
+
+> ℹ️ It's recommended to use an extension (e.g **`.postcssrc.json`** or **`.postcssrc.yml`**) instead of `.postcssrc`
+
+```
+Project (Root)
+ |– client
+ |– public
+ |
+ |- (.postcssrc|.postcssrc.json|.postcssrc.yml)
+ |- package.json
+```
+
+**`.postcssrc.json`**
+```json
+{
+ "parser": "sugarss",
+ "map": false,
+ "plugins": {
+ "postcss-plugin": {}
+ }
+}
+```
+
+**`.postcssrc.yml`**
+```yaml
+parser: sugarss
+map: false
+plugins:
+ postcss-plugin: {}
+```
+
+### `.postcssrc.js` or `postcss.config.js`
+
+You may need some logic within your config.
+In this case create JS file named:
+- `.postcssrc.js`
+- `.postcssrc.mjs`
+- `.postcssrc.cjs`
+- `.postcssrc.ts`
+- `.postcssrc.cts`
+- `postcss.config.js`
+- `postcss.config.mjs`
+- `postcss.config.cjs`
+- `postcss.config.ts`
+- `postcss.config.cts`
+
+```
+Project (Root)
+ |– client
+ |– public
+ |- (.postcssrc|postcss.config).(js|mjs|cjs|ts|cts)
+ |- package.json
+```
+
+You can export the config as an `{Object}`
+
+**.postcssrc.js**
+```js
+module.exports = {
+ parser: 'sugarss',
+ map: false,
+ plugins: {
+ 'postcss-plugin': {}
+ }
+}
+```
+
+Or export a `{Function}` that returns the config (more about the `ctx` param below)
+
+**.postcssrc.js**
+```js
+module.exports = (ctx) => ({
+ parser: ctx.parser ? 'sugarss' : false,
+ map: ctx.env === 'development' ? ctx.map : false,
+ plugins: {
+ 'postcss-plugin': ctx.options.plugin
+ }
+})
+```
+
+Plugins can be loaded either using an `{Object}` or an `{Array}`
+
+#### `{Object}`
+
+**.postcssrc.js**
+```js
+module.exports = ({ env }) => ({
+ ...options,
+ plugins: {
+ 'postcss-plugin': env === 'production' ? {} : false
+ }
+})
+```
+
+> ℹ️ When using an `{Object}`, the key can be a Node.js module name, a path to a JavaScript file that is relative to the directory of the PostCSS config file, or an absolute path to a JavaScript file.
+
+#### `{Array}`
+
+**.postcssrc.js**
+```js
+module.exports = ({ env }) => ({
+ ...options,
+ plugins: [
+ env === 'production' ? require('postcss-plugin')() : false
+ ]
+})
+```
+> :warning: When using an `{Array}`, make sure to `require()` each plugin
+
+Options
+
+|Name|Type|Default|Description|
+|:--:|:--:|:-----:|:----------|
+|[**`to`**](#to)|`{String}`|`undefined`|Destination File Path|
+|[**`map`**](#map)|`{String\|Object}`|`false`|Enable/Disable Source Maps|
+|[**`from`**](#from)|`{String}`|`undefined`|Source File Path|
+|[**`parser`**](#parser)|`{String\|Function}`|`false`|Custom PostCSS Parser|
+|[**`syntax`**](#syntax)|`{String\|Function}`|`false`|Custom PostCSS Syntax|
+|[**`stringifier`**](#stringifier)|`{String\|Function}`|`false`|Custom PostCSS Stringifier|
+
+### `parser`
+
+**.postcssrc.js**
+```js
+module.exports = {
+ parser: 'sugarss'
+}
+```
+
+### `syntax`
+
+**.postcssrc.js**
+```js
+module.exports = {
+ syntax: 'postcss-scss'
+}
+```
+
+### `stringifier`
+
+**.postcssrc.js**
+```js
+module.exports = {
+ stringifier: 'midas'
+}
+```
+
+### [**`map`**](https://github.com/postcss/postcss/blob/master/docs/source-maps.md)
+
+**.postcssrc.js**
+```js
+module.exports = {
+ map: 'inline'
+}
+```
+
+> :warning: In most cases `options.from` && `options.to` are set by the third-party which integrates this package (CLI, gulp, webpack). It's unlikely one needs to set/use `options.from` && `options.to` within a config file. Unless you're a third-party plugin author using this module and its Node API directly **dont't set `options.from` && `options.to` yourself**
+
+### `to`
+
+```js
+module.exports = {
+ to: 'path/to/dest.css'
+}
+```
+
+### `from`
+
+```js
+module.exports = {
+ from: 'path/to/src.css'
+}
+```
+
+Plugins
+
+### `{} || null`
+
+The plugin will be loaded with defaults
+
+```js
+'postcss-plugin': {} || null
+```
+
+**.postcssrc.js**
+```js
+module.exports = {
+ plugins: {
+ 'postcss-plugin': {} || null
+ }
+}
+```
+
+> :warning: `{}` must be an **empty** `{Object}` literal
+
+### `{Object}`
+
+The plugin will be loaded with given options
+
+```js
+'postcss-plugin': { option: '', option: '' }
+```
+
+**.postcssrc.js**
+```js
+module.exports = {
+ plugins: {
+ 'postcss-plugin': { option: '', option: '' }
+ }
+}
+```
+
+### `false`
+
+The plugin will not be loaded
+
+```js
+'postcss-plugin': false
+```
+
+**.postcssrc.js**
+```js
+module.exports = {
+ plugins: {
+ 'postcss-plugin': false
+ }
+}
+```
+
+### `Ordering`
+
+Plugin **execution order** is determined by declaration in the plugins section (**top-down**)
+
+```js
+{
+ plugins: {
+ 'postcss-plugin': {}, // [0]
+ 'postcss-plugin': {}, // [1]
+ 'postcss-plugin': {} // [2]
+ }
+}
+```
+
+Context
+
+When using a `{Function}` (`postcss.config.js` or `.postcssrc.js`), it's possible to pass context to `postcss-load-config`, which will be evaluated while loading your config. By default `ctx.env (process.env.NODE_ENV)` and `ctx.cwd (process.cwd())` are available on the `ctx` `{Object}`
+
+> ℹ️ Most third-party integrations add additional properties to the `ctx` (e.g `postcss-loader`). Check the specific module's README for more information about what is available on the respective `ctx`
+
+Examples
+
+**postcss.config.js**
+
+```js
+module.exports = (ctx) => ({
+ parser: ctx.parser ? 'sugarss' : false,
+ map: ctx.env === 'development' ? ctx.map : false,
+ plugins: {
+ 'postcss-import': {},
+ 'postcss-nested': {},
+ cssnano: ctx.env === 'production' ? {} : false
+ }
+})
+```
+
+
+

+
+
+```json
+"scripts": {
+ "build": "NODE_ENV=production node postcss",
+ "start": "NODE_ENV=development node postcss"
+}
+```
+
+```js
+const { readFileSync } = require('fs')
+
+const postcss = require('postcss')
+const postcssrc = require('postcss-load-config')
+
+const css = readFileSync('index.sss', 'utf8')
+
+const ctx = { parser: true, map: 'inline' }
+
+postcssrc(ctx).then(({ plugins, options }) => {
+ postcss(plugins)
+ .process(css, options)
+ .then((result) => console.log(result.css))
+})
+```
+
+
+

+
+
+```json
+"scripts": {
+ "build": "NODE_ENV=production gulp",
+ "start": "NODE_ENV=development gulp"
+}
+```
+
+```js
+const { task, src, dest, series, watch } = require('gulp')
+
+const postcss = require('gulp-postcssrc')
+
+const css = () => {
+ src('src/*.css')
+ .pipe(postcss())
+ .pipe(dest('dest'))
+})
+
+task('watch', () => {
+ watch(['src/*.css', 'postcss.config.js'], css)
+})
+
+task('default', series(css, 'watch'))
+```
+
+
+

+
+
+```json
+"scripts": {
+ "build": "NODE_ENV=production webpack",
+ "start": "NODE_ENV=development webpack-dev-server"
+}
+```
+
+**webpack.config.js**
+```js
+module.exports = (env) => ({
+ module: {
+ rules: [
+ {
+ test: /\.css$/,
+ use: [
+ 'style-loader',
+ 'css-loader',
+ 'postcss-loader'
+ ]
+ }
+ ]
+ }
+})
+```
+
+Maintainers
+
+
+
+Contributors
+
+=14"
+ }
+}
diff --git a/node_modules/postcss-load-config/node_modules/lilconfig/readme.md b/node_modules/postcss-load-config/node_modules/lilconfig/readme.md
new file mode 100644
index 0000000..99c4262
--- /dev/null
+++ b/node_modules/postcss-load-config/node_modules/lilconfig/readme.md
@@ -0,0 +1,98 @@
+# Lilconfig ⚙️
+[](https://badge.fury.io/js/lilconfig)
+[](https://packagephobia.now.sh/result?p=lilconfig)
+[](https://coveralls.io/github/antonk52/lilconfig)
+
+A zero-dependency alternative to [cosmiconfig](https://www.npmjs.com/package/cosmiconfig) with the same API.
+
+## Installation
+
+```sh
+npm install lilconfig
+```
+
+## Usage
+
+```js
+import {lilconfig, lilconfigSync} from 'lilconfig';
+
+// all keys are optional
+const options = {
+ stopDir: '/Users/you/some/dir',
+ searchPlaces: ['package.json', 'myapp.conf.js'],
+ ignoreEmptySearchPlaces: false
+}
+
+lilconfig(
+ 'myapp',
+ options // optional
+).search() // Promise
+
+lilconfigSync(
+ 'myapp',
+ options // optional
+).load(pathToConfig) // LilconfigResult
+
+/**
+ * LilconfigResult
+ * {
+ * config: any; // your config
+ * filepath: string;
+ * }
+ */
+```
+
+## ESM
+
+ESM configs can be loaded with **async API only**. Specifically `js` files in projects with `"type": "module"` in `package.json` or `mjs` files.
+
+## Difference to `cosmiconfig`
+Lilconfig does not intend to be 100% compatible with `cosmiconfig` but tries to mimic it where possible. The key difference is **no** support for yaml files out of the box(`lilconfig` attempts to parse files with no extension as JSON instead of YAML). You can still add the support for YAML files by providing a loader, see an [example](#yaml-loader) below.
+
+### Options difference between the two.
+
+|cosmiconfig option | lilconfig |
+|------------------------|-----------|
+|cache | ✅ |
+|loaders | ✅ |
+|ignoreEmptySearchPlaces | ✅ |
+|packageProp | ✅ |
+|searchPlaces | ✅ |
+|stopDir | ✅ |
+|transform | ✅ |
+
+## Loaders examples
+
+### Yaml loader
+
+If you need the YAML support you can provide your own loader
+
+```js
+import {lilconfig} from 'lilconfig';
+import yaml from 'yaml';
+
+function loadYaml(filepath, content) {
+ return yaml.parse(content);
+}
+
+const options = {
+ loaders: {
+ '.yaml': loadYaml,
+ '.yml': loadYaml,
+ // loader for files with no extension
+ noExt: loadYaml
+ }
+};
+
+lilconfig('myapp', options)
+ .search()
+ .then(result => {
+ result // {config, filepath}
+ });
+```
+
+## Version correlation
+
+- lilconig v1 → cosmiconfig v6
+- lilconig v2 → cosmiconfig v7
+- lilconig v3 → cosmiconfig v8
diff --git a/node_modules/postcss-load-config/node_modules/lilconfig/src/index.d.ts b/node_modules/postcss-load-config/node_modules/lilconfig/src/index.d.ts
new file mode 100644
index 0000000..fa1146b
--- /dev/null
+++ b/node_modules/postcss-load-config/node_modules/lilconfig/src/index.d.ts
@@ -0,0 +1,54 @@
+export type LilconfigResult = null | {
+ filepath: string;
+ config: any;
+ isEmpty?: boolean;
+};
+interface OptionsBase {
+ cache?: boolean;
+ stopDir?: string;
+ searchPlaces?: string[];
+ ignoreEmptySearchPlaces?: boolean;
+ packageProp?: string | string[];
+}
+export type Transform =
+ | TransformSync
+ | ((result: LilconfigResult) => Promise);
+export type TransformSync = (result: LilconfigResult) => LilconfigResult;
+type LoaderResult = any;
+export type LoaderSync = (filepath: string, content: string) => LoaderResult;
+export type Loader =
+ | LoaderSync
+ | ((filepath: string, content: string) => Promise);
+export type Loaders = Record;
+export type LoadersSync = Record;
+export interface Options extends OptionsBase {
+ loaders?: Loaders;
+ transform?: Transform;
+}
+export interface OptionsSync extends OptionsBase {
+ loaders?: LoadersSync;
+ transform?: TransformSync;
+}
+export declare const defaultLoadersSync: LoadersSync;
+export declare const defaultLoaders: Loaders;
+type ClearCaches = {
+ clearLoadCache: () => void;
+ clearSearchCache: () => void;
+ clearCaches: () => void;
+};
+type AsyncSearcher = {
+ search(searchFrom?: string): Promise;
+ load(filepath: string): Promise;
+} & ClearCaches;
+export declare function lilconfig(
+ name: string,
+ options?: Partial,
+): AsyncSearcher;
+type SyncSearcher = {
+ search(searchFrom?: string): LilconfigResult;
+ load(filepath: string): LilconfigResult;
+} & ClearCaches;
+export declare function lilconfigSync(
+ name: string,
+ options?: OptionsSync,
+): SyncSearcher;
diff --git a/node_modules/postcss-load-config/node_modules/lilconfig/src/index.js b/node_modules/postcss-load-config/node_modules/lilconfig/src/index.js
new file mode 100644
index 0000000..c4d055b
--- /dev/null
+++ b/node_modules/postcss-load-config/node_modules/lilconfig/src/index.js
@@ -0,0 +1,457 @@
+// @ts-check
+const path = require('path');
+const fs = require('fs');
+const os = require('os');
+
+const fsReadFileAsync = fs.promises.readFile;
+
+/** @type {(name: string, sync: boolean) => string[]} */
+function getDefaultSearchPlaces(name, sync) {
+ return [
+ 'package.json',
+ `.${name}rc.json`,
+ `.${name}rc.js`,
+ `.${name}rc.cjs`,
+ ...(sync ? [] : [`.${name}rc.mjs`]),
+ `.config/${name}rc`,
+ `.config/${name}rc.json`,
+ `.config/${name}rc.js`,
+ `.config/${name}rc.cjs`,
+ ...(sync ? [] : [`.config/${name}rc.mjs`]),
+ `${name}.config.js`,
+ `${name}.config.cjs`,
+ ...(sync ? [] : [`${name}.config.mjs`]),
+ ];
+}
+
+/**
+ * @type {(p: string) => string}
+ *
+ * see #17
+ * On *nix, if cwd is not under homedir,
+ * the last path will be '', ('/build' -> '')
+ * but it should be '/' actually.
+ * And on Windows, this will never happen. ('C:\build' -> 'C:')
+ */
+function parentDir(p) {
+ return path.dirname(p) || path.sep;
+}
+
+/** @type {import('./index').LoaderSync} */
+const jsonLoader = (_, content) => JSON.parse(content);
+// Use plain require in webpack context for dynamic import
+const requireFunc = typeof __webpack_require__ === "function" ? __non_webpack_require__ : require;
+/** @type {import('./index').LoadersSync} */
+const defaultLoadersSync = Object.freeze({
+ '.js': requireFunc,
+ '.json': requireFunc,
+ '.cjs': requireFunc,
+ noExt: jsonLoader,
+});
+module.exports.defaultLoadersSync = defaultLoadersSync;
+
+/** @type {import('./index').Loader} */
+const dynamicImport = async id => {
+ try {
+ const mod = await import(/* webpackIgnore: true */ id);
+
+ return mod.default;
+ } catch (e) {
+ try {
+ return requireFunc(id);
+ } catch (/** @type {any} */ requireE) {
+ if (
+ requireE.code === 'ERR_REQUIRE_ESM' ||
+ (requireE instanceof SyntaxError &&
+ requireE
+ .toString()
+ .includes('Cannot use import statement outside a module'))
+ ) {
+ throw e;
+ }
+ throw requireE;
+ }
+ }
+};
+
+/** @type {import('./index').Loaders} */
+const defaultLoaders = Object.freeze({
+ '.js': dynamicImport,
+ '.mjs': dynamicImport,
+ '.cjs': dynamicImport,
+ '.json': jsonLoader,
+ noExt: jsonLoader,
+});
+module.exports.defaultLoaders = defaultLoaders;
+
+/**
+ * @param {string} name
+ * @param {import('./index').Options | import('./index').OptionsSync} options
+ * @param {boolean} sync
+ * @returns {Required}
+ */
+function getOptions(name, options, sync) {
+ /** @type {Required} */
+ const conf = {
+ stopDir: os.homedir(),
+ searchPlaces: getDefaultSearchPlaces(name, sync),
+ ignoreEmptySearchPlaces: true,
+ cache: true,
+ transform: x => x,
+ packageProp: [name],
+ ...options,
+ loaders: {
+ ...(sync ? defaultLoadersSync : defaultLoaders),
+ ...options.loaders,
+ },
+ };
+ conf.searchPlaces.forEach(place => {
+ const key = path.extname(place) || 'noExt';
+ const loader = conf.loaders[key];
+ if (!loader) {
+ throw new Error(`Missing loader for extension "${place}"`);
+ }
+
+ if (typeof loader !== 'function') {
+ throw new Error(
+ `Loader for extension "${place}" is not a function: Received ${typeof loader}.`,
+ );
+ }
+ });
+
+ return conf;
+}
+
+/** @type {(props: string | string[], obj: Record) => unknown} */
+function getPackageProp(props, obj) {
+ if (typeof props === 'string' && props in obj) return obj[props];
+ return (
+ (Array.isArray(props) ? props : props.split('.')).reduce(
+ (acc, prop) => (acc === undefined ? acc : acc[prop]),
+ obj,
+ ) || null
+ );
+}
+
+/** @param {string} filepath */
+function validateFilePath(filepath) {
+ if (!filepath) throw new Error('load must pass a non-empty string');
+}
+
+/** @type {(loader: import('./index').Loader, ext: string) => void} */
+function validateLoader(loader, ext) {
+ if (!loader) throw new Error(`No loader specified for extension "${ext}"`);
+ if (typeof loader !== 'function') throw new Error('loader is not a function');
+}
+
+/** @type {(enableCache: boolean) => (c: Map, filepath: string, res: T) => T} */
+const makeEmplace = enableCache => (c, filepath, res) => {
+ if (enableCache) c.set(filepath, res);
+ return res;
+};
+
+/** @type {import('./index').lilconfig} */
+module.exports.lilconfig = function lilconfig(name, options) {
+ const {
+ ignoreEmptySearchPlaces,
+ loaders,
+ packageProp,
+ searchPlaces,
+ stopDir,
+ transform,
+ cache,
+ } = getOptions(name, options ?? {}, false);
+ const searchCache = new Map();
+ const loadCache = new Map();
+ const emplace = makeEmplace(cache);
+
+ return {
+ async search(searchFrom = process.cwd()) {
+ /** @type {import('./index').LilconfigResult} */
+ const result = {
+ config: null,
+ filepath: '',
+ };
+
+ /** @type {Set} */
+ const visited = new Set();
+ let dir = searchFrom;
+ dirLoop: while (true) {
+ if (cache) {
+ const r = searchCache.get(dir);
+ if (r !== undefined) {
+ for (const p of visited) searchCache.set(p, r);
+ return r;
+ }
+ visited.add(dir);
+ }
+
+ for (const searchPlace of searchPlaces) {
+ const filepath = path.join(dir, searchPlace);
+ try {
+ await fs.promises.access(filepath);
+ } catch {
+ continue;
+ }
+ const content = String(await fsReadFileAsync(filepath));
+ const loaderKey = path.extname(searchPlace) || 'noExt';
+ const loader = loaders[loaderKey];
+
+ // handle package.json
+ if (searchPlace === 'package.json') {
+ const pkg = await loader(filepath, content);
+ const maybeConfig = getPackageProp(packageProp, pkg);
+ if (maybeConfig != null) {
+ result.config = maybeConfig;
+ result.filepath = filepath;
+ break dirLoop;
+ }
+
+ continue;
+ }
+
+ // handle other type of configs
+ const isEmpty = content.trim() === '';
+ if (isEmpty && ignoreEmptySearchPlaces) continue;
+
+ if (isEmpty) {
+ result.isEmpty = true;
+ result.config = undefined;
+ } else {
+ validateLoader(loader, loaderKey);
+ result.config = await loader(filepath, content);
+ }
+ result.filepath = filepath;
+ break dirLoop;
+ }
+ if (dir === stopDir || dir === parentDir(dir)) break dirLoop;
+ dir = parentDir(dir);
+ }
+
+ const transformed =
+ // not found
+ result.filepath === '' && result.config === null
+ ? transform(null)
+ : transform(result);
+
+ if (cache) {
+ for (const p of visited) searchCache.set(p, transformed);
+ }
+
+ return transformed;
+ },
+ async load(filepath) {
+ validateFilePath(filepath);
+ const absPath = path.resolve(process.cwd(), filepath);
+ if (cache && loadCache.has(absPath)) {
+ return loadCache.get(absPath);
+ }
+ const {base, ext} = path.parse(absPath);
+ const loaderKey = ext || 'noExt';
+ const loader = loaders[loaderKey];
+ validateLoader(loader, loaderKey);
+ const content = String(await fsReadFileAsync(absPath));
+
+ if (base === 'package.json') {
+ const pkg = await loader(absPath, content);
+ return emplace(
+ loadCache,
+ absPath,
+ transform({
+ config: getPackageProp(packageProp, pkg),
+ filepath: absPath,
+ }),
+ );
+ }
+ /** @type {import('./index').LilconfigResult} */
+ const result = {
+ config: null,
+ filepath: absPath,
+ };
+ // handle other type of configs
+ const isEmpty = content.trim() === '';
+ if (isEmpty && ignoreEmptySearchPlaces)
+ return emplace(
+ loadCache,
+ absPath,
+ transform({
+ config: undefined,
+ filepath: absPath,
+ isEmpty: true,
+ }),
+ );
+
+ // cosmiconfig returns undefined for empty files
+ result.config = isEmpty ? undefined : await loader(absPath, content);
+
+ return emplace(
+ loadCache,
+ absPath,
+ transform(isEmpty ? {...result, isEmpty, config: undefined} : result),
+ );
+ },
+ clearLoadCache() {
+ if (cache) loadCache.clear();
+ },
+ clearSearchCache() {
+ if (cache) searchCache.clear();
+ },
+ clearCaches() {
+ if (cache) {
+ loadCache.clear();
+ searchCache.clear();
+ }
+ },
+ };
+};
+
+/** @type {import('./index').lilconfigSync} */
+module.exports.lilconfigSync = function lilconfigSync(name, options) {
+ const {
+ ignoreEmptySearchPlaces,
+ loaders,
+ packageProp,
+ searchPlaces,
+ stopDir,
+ transform,
+ cache,
+ } = getOptions(name, options ?? {}, true);
+ const searchCache = new Map();
+ const loadCache = new Map();
+ const emplace = makeEmplace(cache);
+
+ return {
+ search(searchFrom = process.cwd()) {
+ /** @type {import('./index').LilconfigResult} */
+ const result = {
+ config: null,
+ filepath: '',
+ };
+
+ /** @type {Set} */
+ const visited = new Set();
+ let dir = searchFrom;
+ dirLoop: while (true) {
+ if (cache) {
+ const r = searchCache.get(dir);
+ if (r !== undefined) {
+ for (const p of visited) searchCache.set(p, r);
+ return r;
+ }
+ visited.add(dir);
+ }
+
+ for (const searchPlace of searchPlaces) {
+ const filepath = path.join(dir, searchPlace);
+ try {
+ fs.accessSync(filepath);
+ } catch {
+ continue;
+ }
+ const loaderKey = path.extname(searchPlace) || 'noExt';
+ const loader = loaders[loaderKey];
+ const content = String(fs.readFileSync(filepath));
+
+ // handle package.json
+ if (searchPlace === 'package.json') {
+ const pkg = loader(filepath, content);
+ const maybeConfig = getPackageProp(packageProp, pkg);
+ if (maybeConfig != null) {
+ result.config = maybeConfig;
+ result.filepath = filepath;
+ break dirLoop;
+ }
+
+ continue;
+ }
+
+ // handle other type of configs
+ const isEmpty = content.trim() === '';
+ if (isEmpty && ignoreEmptySearchPlaces) continue;
+
+ if (isEmpty) {
+ result.isEmpty = true;
+ result.config = undefined;
+ } else {
+ validateLoader(loader, loaderKey);
+ result.config = loader(filepath, content);
+ }
+ result.filepath = filepath;
+ break dirLoop;
+ }
+ if (dir === stopDir || dir === parentDir(dir)) break dirLoop;
+ dir = parentDir(dir);
+ }
+
+ const transformed =
+ // not found
+ result.filepath === '' && result.config === null
+ ? transform(null)
+ : transform(result);
+
+ if (cache) {
+ for (const p of visited) searchCache.set(p, transformed);
+ }
+
+ return transformed;
+ },
+ load(filepath) {
+ validateFilePath(filepath);
+ const absPath = path.resolve(process.cwd(), filepath);
+ if (cache && loadCache.has(absPath)) {
+ return loadCache.get(absPath);
+ }
+ const {base, ext} = path.parse(absPath);
+ const loaderKey = ext || 'noExt';
+ const loader = loaders[loaderKey];
+ validateLoader(loader, loaderKey);
+
+ const content = String(fs.readFileSync(absPath));
+
+ if (base === 'package.json') {
+ const pkg = loader(absPath, content);
+ return transform({
+ config: getPackageProp(packageProp, pkg),
+ filepath: absPath,
+ });
+ }
+ const result = {
+ config: null,
+ filepath: absPath,
+ };
+ // handle other type of configs
+ const isEmpty = content.trim() === '';
+ if (isEmpty && ignoreEmptySearchPlaces)
+ return emplace(
+ loadCache,
+ absPath,
+ transform({
+ filepath: absPath,
+ config: undefined,
+ isEmpty: true,
+ }),
+ );
+
+ // cosmiconfig returns undefined for empty files
+ result.config = isEmpty ? undefined : loader(absPath, content);
+
+ return emplace(
+ loadCache,
+ absPath,
+ transform(isEmpty ? {...result, isEmpty, config: undefined} : result),
+ );
+ },
+ clearLoadCache() {
+ if (cache) loadCache.clear();
+ },
+ clearSearchCache() {
+ if (cache) searchCache.clear();
+ },
+ clearCaches() {
+ if (cache) {
+ loadCache.clear();
+ searchCache.clear();
+ }
+ },
+ };
+};
diff --git a/node_modules/postcss-load-config/package.json b/node_modules/postcss-load-config/package.json
new file mode 100644
index 0000000..80b4116
--- /dev/null
+++ b/node_modules/postcss-load-config/package.json
@@ -0,0 +1,54 @@
+{
+ "name": "postcss-load-config",
+ "version": "4.0.2",
+ "description": "Autoload Config for PostCSS",
+ "main": "src/index.js",
+ "types": "src/index.d.ts",
+ "files": [
+ "src"
+ ],
+ "engines": {
+ "node": ">= 14"
+ },
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ts-node": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ }
+ },
+ "keywords": [
+ "postcss",
+ "postcssrc",
+ "postcss.config.js"
+ ],
+ "author": "Michael Ciniawky ",
+ "contributors": [
+ "Ryan Dunckel",
+ "Mateusz Derks",
+ "Dalton Santos",
+ "Patrick Gilday",
+ "François Wouts"
+ ],
+ "repository": "postcss/postcss-load-config",
+ "license": "MIT"
+}
diff --git a/node_modules/postcss-load-config/src/index.d.ts b/node_modules/postcss-load-config/src/index.d.ts
new file mode 100644
index 0000000..4979220
--- /dev/null
+++ b/node_modules/postcss-load-config/src/index.d.ts
@@ -0,0 +1,65 @@
+// based on @types/postcss-load-config@2.0.1
+// Type definitions for postcss-load-config 2.1
+import Processor from 'postcss/lib/processor';
+import { Plugin, ProcessOptions, Transformer } from 'postcss';
+import { Options as ConfigOptions } from "lilconfig";
+
+declare function postcssrc(
+ ctx?: postcssrc.ConfigContext,
+ path?: string,
+ options?: ConfigOptions
+): Promise;
+
+declare namespace postcssrc {
+ // In the ConfigContext, these three options can be instances of the
+ // appropriate class, or strings. If they are strings, postcss-load-config will
+ // require() them and pass the instances along.
+ export interface ProcessOptionsPreload {
+ parser?: string | ProcessOptions['parser'];
+ stringifier?: string | ProcessOptions['stringifier'];
+ syntax?: string | ProcessOptions['syntax'];
+ }
+
+ // The remaining ProcessOptions, sans the three above.
+ export type RemainingProcessOptions = Pick<
+ ProcessOptions,
+ Exclude
+ >;
+
+ // Additional context options that postcss-load-config understands.
+ export interface Context {
+ cwd?: string;
+ env?: string;
+ }
+
+ // The full shape of the ConfigContext.
+ export type ConfigContext = Context &
+ ProcessOptionsPreload &
+ RemainingProcessOptions;
+
+ // Result of postcssrc is a Promise containing the filename plus the options
+ // and plugins that are ready to pass on to postcss.
+ export type ResultPlugin = Plugin | Transformer | Processor;
+
+ export interface Result {
+ file: string;
+ options: ProcessOptions;
+ plugins: ResultPlugin[];
+ }
+
+ export type ConfigPlugin = Transformer | Plugin | Processor;
+
+ export interface Config {
+ parser?: string | ProcessOptions['parser'] | false;
+ stringifier?: string | ProcessOptions['stringifier'] | false;
+ syntax?: string | ProcessOptions['syntax'] | false;
+ map?: string | false;
+ from?: string;
+ to?: string;
+ plugins?: Array | Record;
+ }
+
+ export type ConfigFn = (ctx: ConfigContext) => Config | Promise;
+}
+
+export = postcssrc;
diff --git a/node_modules/postcss-load-config/src/index.js b/node_modules/postcss-load-config/src/index.js
new file mode 100644
index 0000000..ce86aaa
--- /dev/null
+++ b/node_modules/postcss-load-config/src/index.js
@@ -0,0 +1,185 @@
+'use strict'
+
+const resolve = require('path').resolve
+const url = require('url')
+
+const config = require('lilconfig')
+const yaml = require('yaml')
+
+const loadOptions = require('./options.js')
+const loadPlugins = require('./plugins.js')
+
+/* istanbul ignore next */
+const interopRequireDefault = (obj) => obj && obj.__esModule ? obj : { default: obj }
+
+/**
+ * Process the result from cosmiconfig
+ *
+ * @param {Object} ctx Config Context
+ * @param {Object} result Cosmiconfig result
+ *
+ * @return {Object} PostCSS Config
+ */
+const processResult = (ctx, result) => {
+ const file = result.filepath || ''
+ let config = interopRequireDefault(result.config).default || {}
+
+ if (typeof config === 'function') {
+ config = config(ctx)
+ } else {
+ config = Object.assign({}, config, ctx)
+ }
+
+ if (!config.plugins) {
+ config.plugins = []
+ }
+
+ return {
+ plugins: loadPlugins(config, file),
+ options: loadOptions(config, file),
+ file
+ }
+}
+
+/**
+ * Builds the Config Context
+ *
+ * @param {Object} ctx Config Context
+ *
+ * @return {Object} Config Context
+ */
+const createContext = (ctx) => {
+ /**
+ * @type {Object}
+ *
+ * @prop {String} cwd=process.cwd() Config search start location
+ * @prop {String} env=process.env.NODE_ENV Config Enviroment, will be set to `development` by `postcss-load-config` if `process.env.NODE_ENV` is `undefined`
+ */
+ ctx = Object.assign({
+ cwd: process.cwd(),
+ env: process.env.NODE_ENV
+ }, ctx)
+
+ if (!ctx.env) {
+ process.env.NODE_ENV = 'development'
+ }
+
+ return ctx
+}
+
+const importDefault = async filepath => {
+ const module = await import(url.pathToFileURL(filepath).href)
+ return module.default
+}
+
+const addTypeScriptLoader = (options = {}, loader) => {
+ const moduleName = 'postcss'
+
+ return {
+ ...options,
+ searchPlaces: [
+ ...(options.searchPlaces || []),
+ 'package.json',
+ `.${moduleName}rc`,
+ `.${moduleName}rc.json`,
+ `.${moduleName}rc.yaml`,
+ `.${moduleName}rc.yml`,
+ `.${moduleName}rc.ts`,
+ `.${moduleName}rc.cts`,
+ `.${moduleName}rc.js`,
+ `.${moduleName}rc.cjs`,
+ `.${moduleName}rc.mjs`,
+ `${moduleName}.config.ts`,
+ `${moduleName}.config.cts`,
+ `${moduleName}.config.js`,
+ `${moduleName}.config.cjs`,
+ `${moduleName}.config.mjs`
+ ],
+ loaders: {
+ ...options.loaders,
+ '.yaml': (filepath, content) => yaml.parse(content),
+ '.yml': (filepath, content) => yaml.parse(content),
+ '.js': importDefault,
+ '.cjs': importDefault,
+ '.mjs': importDefault,
+ '.ts': loader,
+ '.cts': loader
+ }
+ }
+}
+
+const withTypeScriptLoader = (rcFunc) => {
+ return (ctx, path, options) => {
+ return rcFunc(ctx, path, addTypeScriptLoader(options, (configFile) => {
+ let registerer = { enabled () {} }
+
+ try {
+ // Register TypeScript compiler instance
+ registerer = require('ts-node').register({
+ // transpile to cjs even if compilerOptions.module in tsconfig is not Node16/NodeNext.
+ moduleTypes: { '**/*.cts': 'cjs' }
+ })
+
+ return require(configFile)
+ } catch (err) {
+ if (err.code === 'MODULE_NOT_FOUND') {
+ throw new Error(
+ `'ts-node' is required for the TypeScript configuration files. Make sure it is installed\nError: ${err.message}`
+ )
+ }
+
+ throw err
+ } finally {
+ registerer.enabled(false)
+ }
+ }))
+ }
+}
+
+/**
+ * Load Config
+ *
+ * @method rc
+ *
+ * @param {Object} ctx Config Context
+ * @param {String} path Config Path
+ * @param {Object} options Config Options
+ *
+ * @return {Promise} config PostCSS Config
+ */
+const rc = withTypeScriptLoader((ctx, path, options) => {
+ /**
+ * @type {Object} The full Config Context
+ */
+ ctx = createContext(ctx)
+
+ /**
+ * @type {String} `process.cwd()`
+ */
+ path = path ? resolve(path) : process.cwd()
+
+ return config.lilconfig('postcss', options)
+ .search(path)
+ .then((result) => {
+ if (!result) {
+ throw new Error(`No PostCSS Config found in: ${path}`)
+ }
+
+ return processResult(ctx, result)
+ })
+})
+
+/**
+ * Autoload Config for PostCSS
+ *
+ * @author Michael Ciniawsky @michael-ciniawsky
+ * @license MIT
+ *
+ * @module postcss-load-config
+ * @version 2.1.0
+ *
+ * @requires comsiconfig
+ * @requires ./options
+ * @requires ./plugins
+ */
+module.exports = rc
diff --git a/node_modules/postcss-load-config/src/options.js b/node_modules/postcss-load-config/src/options.js
new file mode 100644
index 0000000..d3ef2d6
--- /dev/null
+++ b/node_modules/postcss-load-config/src/options.js
@@ -0,0 +1,47 @@
+'use strict'
+
+const req = require('./req.js')
+
+/**
+ * Load Options
+ *
+ * @private
+ * @method options
+ *
+ * @param {Object} config PostCSS Config
+ *
+ * @return {Object} options PostCSS Options
+ */
+const options = (config, file) => {
+ if (config.parser && typeof config.parser === 'string') {
+ try {
+ config.parser = req(config.parser, file)
+ } catch (err) {
+ throw new Error(`Loading PostCSS Parser failed: ${err.message}\n\n(@${file})`)
+ }
+ }
+
+ if (config.syntax && typeof config.syntax === 'string') {
+ try {
+ config.syntax = req(config.syntax, file)
+ } catch (err) {
+ throw new Error(`Loading PostCSS Syntax failed: ${err.message}\n\n(@${file})`)
+ }
+ }
+
+ if (config.stringifier && typeof config.stringifier === 'string') {
+ try {
+ config.stringifier = req(config.stringifier, file)
+ } catch (err) {
+ throw new Error(`Loading PostCSS Stringifier failed: ${err.message}\n\n(@${file})`)
+ }
+ }
+
+ if (config.plugins) {
+ delete config.plugins
+ }
+
+ return config
+}
+
+module.exports = options
diff --git a/node_modules/postcss-load-config/src/plugins.js b/node_modules/postcss-load-config/src/plugins.js
new file mode 100644
index 0000000..6cb994b
--- /dev/null
+++ b/node_modules/postcss-load-config/src/plugins.js
@@ -0,0 +1,85 @@
+'use strict'
+
+const req = require('./req.js')
+
+/**
+ * Plugin Loader
+ *
+ * @private
+ * @method load
+ *
+ * @param {String} plugin PostCSS Plugin Name
+ * @param {Object} options PostCSS Plugin Options
+ *
+ * @return {Function} PostCSS Plugin
+ */
+const load = (plugin, options, file) => {
+ try {
+ if (
+ options === null ||
+ options === undefined ||
+ Object.keys(options).length === 0
+ ) {
+ return req(plugin, file)
+ } else {
+ return req(plugin, file)(options)
+ }
+ } catch (err) {
+ throw new Error(`Loading PostCSS Plugin failed: ${err.message}\n\n(@${file})`)
+ }
+}
+
+/**
+ * Load Plugins
+ *
+ * @private
+ * @method plugins
+ *
+ * @param {Object} config PostCSS Config Plugins
+ *
+ * @return {Array} plugins PostCSS Plugins
+ */
+const plugins = (config, file) => {
+ let plugins = []
+
+ if (Array.isArray(config.plugins)) {
+ plugins = config.plugins.filter(Boolean)
+ } else {
+ plugins = Object.keys(config.plugins)
+ .filter((plugin) => {
+ return config.plugins[plugin] !== false ? plugin : ''
+ })
+ .map((plugin) => {
+ return load(plugin, config.plugins[plugin], file)
+ })
+ }
+
+ if (plugins.length && plugins.length > 0) {
+ plugins.forEach((plugin, i) => {
+ if (plugin.default) {
+ plugin = plugin.default
+ }
+
+ if (plugin.postcss === true) {
+ plugin = plugin()
+ } else if (plugin.postcss) {
+ plugin = plugin.postcss
+ }
+
+ if (
+ // eslint-disable-next-line
+ !(
+ (typeof plugin === 'object' && Array.isArray(plugin.plugins)) ||
+ (typeof plugin === 'object' && plugin.postcssPlugin) ||
+ (typeof plugin === 'function')
+ )
+ ) {
+ throw new TypeError(`Invalid PostCSS Plugin found at: plugins[${i}]\n\n(@${file})`)
+ }
+ })
+ }
+
+ return plugins
+}
+
+module.exports = plugins
diff --git a/node_modules/postcss-load-config/src/req.js b/node_modules/postcss-load-config/src/req.js
new file mode 100644
index 0000000..42020c9
--- /dev/null
+++ b/node_modules/postcss-load-config/src/req.js
@@ -0,0 +1,10 @@
+// eslint-disable-next-line n/no-deprecated-api
+const { createRequire, createRequireFromPath } = require('module')
+
+function req (name, rootFile) {
+ const create = createRequire || createRequireFromPath
+ const require = create(rootFile)
+ return require(name)
+}
+
+module.exports = req
diff --git a/node_modules/postcss-nested/LICENSE b/node_modules/postcss-nested/LICENSE
new file mode 100644
index 0000000..1ae47a2
--- /dev/null
+++ b/node_modules/postcss-nested/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright 2014 Andrey Sitnik
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/postcss-nested/README.md b/node_modules/postcss-nested/README.md
new file mode 100644
index 0000000..c65988d
--- /dev/null
+++ b/node_modules/postcss-nested/README.md
@@ -0,0 +1,85 @@
+# PostCSS Nested
+
+
+
+[PostCSS] plugin to unwrap nested rules closer to Sass syntax.
+
+```css
+.phone {
+ &_title {
+ width: 500px;
+ @media (max-width: 500px) {
+ width: auto;
+ }
+ body.is_dark & {
+ color: white;
+ }
+ }
+ img {
+ display: block;
+ }
+}
+
+.title {
+ font-size: var(--font);
+
+ @at-root html {
+ --font: 16px;
+ }
+}
+```
+
+will be processed to:
+
+```css
+.phone_title {
+ width: 500px;
+}
+@media (max-width: 500px) {
+ .phone_title {
+ width: auto;
+ }
+}
+body.is_dark .phone_title {
+ color: white;
+}
+.phone img {
+ display: block;
+}
+
+.title {
+ font-size: var(--font);
+}
+html {
+ --font: 16px;
+}
+```
+
+Related plugins:
+
+- Use [`postcss-current-selector`] **after** this plugin if you want
+ to use current selector in properties or variables values.
+- Use [`postcss-nested-ancestors`] **before** this plugin if you want
+ to reference any ancestor element directly in your selectors with `^&`.
+
+Alternatives:
+
+- See also [`postcss-nesting`], which implements [CSSWG draft].
+- [`postcss-nested-props`] for nested properties like `font-size`.
+
+
+
+
+
+[`postcss-current-selector`]: https://github.com/komlev/postcss-current-selector
+[`postcss-nested-ancestors`]: https://github.com/toomuchdesign/postcss-nested-ancestors
+[`postcss-nested-props`]: https://github.com/jedmao/postcss-nested-props
+[`postcss-nesting`]: https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-nesting
+[CSSWG draft]: https://drafts.csswg.org/css-nesting-1/
+[PostCSS]: https://github.com/postcss/postcss
+
+## Docs
+Read full docs **[here](https://github.com/postcss/postcss-nested#readme)**.
diff --git a/node_modules/postcss-nested/index.d.ts b/node_modules/postcss-nested/index.d.ts
new file mode 100644
index 0000000..5367682
--- /dev/null
+++ b/node_modules/postcss-nested/index.d.ts
@@ -0,0 +1,41 @@
+// Original definitions (@types/postcss-nested)
+// by Maxim Vorontsov
+
+import { PluginCreator } from 'postcss'
+
+declare namespace nested {
+ interface Options {
+ /**
+ * By default, plugin will bubble only `@media`, `@supports` and `@layer`
+ * at-rules. Use this option to add your custom at-rules to this list.
+ */
+ bubble?: string[]
+
+ /**
+ * By default, plugin will unwrap only `@font-face`, `@keyframes`,
+ * and `@document` at-rules. You can add your custom at-rules
+ * to this list by this option.
+ */
+ unwrap?: string[]
+
+ /**
+ * By default, plugin will strip out any empty selector generated
+ * by intermediate nesting levels. You can set this option to `true`
+ * to preserve them.
+ */
+ preserveEmpty?: boolean
+
+ /**
+ * The plugin supports the SCSS custom at-rule `@at-root` which breaks
+ * rule blocks out of their nested position. If you want, you can choose
+ * a new custom name for this rule in your code.
+ */
+ rootRuleName?: string
+ }
+
+ type Nested = PluginCreator
+}
+
+declare const nested: nested.Nested
+
+export = nested
diff --git a/node_modules/postcss-nested/index.js b/node_modules/postcss-nested/index.js
new file mode 100644
index 0000000..79831b6
--- /dev/null
+++ b/node_modules/postcss-nested/index.js
@@ -0,0 +1,361 @@
+const { AtRule, Rule } = require('postcss')
+let parser = require('postcss-selector-parser')
+
+/**
+ * Run a selector string through postcss-selector-parser
+ */
+function parse(rawSelector, rule) {
+ let nodes
+ try {
+ parser(parsed => {
+ nodes = parsed
+ }).processSync(rawSelector)
+ } catch (e) {
+ if (rawSelector.includes(':')) {
+ throw rule ? rule.error('Missed semicolon') : e
+ } else {
+ throw rule ? rule.error(e.message) : e
+ }
+ }
+ return nodes.at(0)
+}
+
+/**
+ * Replaces the "&" token in a node's selector with the parent selector
+ * similar to what SCSS does.
+ *
+ * Mutates the nodes list
+ */
+function interpolateAmpInSelector(nodes, parent) {
+ let replaced = false
+ nodes.each(node => {
+ if (node.type === 'nesting') {
+ let clonedParent = parent.clone({})
+ if (node.value !== '&') {
+ node.replaceWith(
+ parse(node.value.replace('&', clonedParent.toString()))
+ )
+ } else {
+ node.replaceWith(clonedParent)
+ }
+ replaced = true
+ } else if ('nodes' in node && node.nodes) {
+ if (interpolateAmpInSelector(node, parent)) {
+ replaced = true
+ }
+ }
+ })
+ return replaced
+}
+
+/**
+ * Combines parent and child selectors, in a SCSS-like way
+ */
+function mergeSelectors(parent, child) {
+ let merged = []
+ parent.selectors.forEach(sel => {
+ let parentNode = parse(sel, parent)
+
+ child.selectors.forEach(selector => {
+ if (!selector) {
+ return
+ }
+ let node = parse(selector, child)
+ let replaced = interpolateAmpInSelector(node, parentNode)
+ if (!replaced) {
+ node.prepend(parser.combinator({ value: ' ' }))
+ node.prepend(parentNode.clone({}))
+ }
+ merged.push(node.toString())
+ })
+ })
+ return merged
+}
+
+/**
+ * Move a child and its preceeding comment(s) to after "after"
+ */
+function breakOut(child, after) {
+ let prev = child.prev()
+ after.after(child)
+ while (prev && prev.type === 'comment') {
+ let nextPrev = prev.prev()
+ after.after(prev)
+ prev = nextPrev
+ }
+ return child
+}
+
+function createFnAtruleChilds(bubble) {
+ return function atruleChilds(rule, atrule, bubbling, mergeSels = bubbling) {
+ let children = []
+ atrule.each(child => {
+ if (child.type === 'rule' && bubbling) {
+ if (mergeSels) {
+ child.selectors = mergeSelectors(rule, child)
+ }
+ } else if (child.type === 'atrule' && child.nodes) {
+ if (bubble[child.name]) {
+ atruleChilds(rule, child, mergeSels)
+ } else if (atrule[rootRuleMergeSel] !== false) {
+ children.push(child)
+ }
+ } else {
+ children.push(child)
+ }
+ })
+ if (bubbling) {
+ if (children.length) {
+ let clone = rule.clone({ nodes: [] })
+ for (let child of children) {
+ clone.append(child)
+ }
+ atrule.prepend(clone)
+ }
+ }
+ }
+}
+
+function pickDeclarations(selector, declarations, after) {
+ let parent = new Rule({
+ nodes: [],
+ selector
+ })
+ parent.append(declarations)
+ after.after(parent)
+ return parent
+}
+
+function atruleNames(defaults, custom) {
+ let list = {}
+ for (let name of defaults) {
+ list[name] = true
+ }
+ if (custom) {
+ for (let name of custom) {
+ list[name.replace(/^@/, '')] = true
+ }
+ }
+ return list
+}
+
+function parseRootRuleParams(params) {
+ params = params.trim()
+ let braceBlock = params.match(/^\((.*)\)$/)
+ if (!braceBlock) {
+ return { selector: params, type: 'basic' }
+ }
+ let bits = braceBlock[1].match(/^(with(?:out)?):(.+)$/)
+ if (bits) {
+ let allowlist = bits[1] === 'with'
+ let rules = Object.fromEntries(
+ bits[2]
+ .trim()
+ .split(/\s+/)
+ .map(name => [name, true])
+ )
+ if (allowlist && rules.all) {
+ return { type: 'noop' }
+ }
+ let escapes = rule => !!rules[rule]
+ if (rules.all) {
+ escapes = () => true
+ } else if (allowlist) {
+ escapes = rule => (rule === 'all' ? false : !rules[rule])
+ }
+
+ return {
+ escapes,
+ type: 'withrules'
+ }
+ }
+ // Unrecognized brace block
+ return { type: 'unknown' }
+}
+
+function getAncestorRules(leaf) {
+ let lineage = []
+ let parent = leaf.parent
+
+ while (parent && parent instanceof AtRule) {
+ lineage.push(parent)
+ parent = parent.parent
+ }
+ return lineage
+}
+
+function unwrapRootRule(rule) {
+ let escapes = rule[rootRuleEscapes]
+
+ if (!escapes) {
+ rule.after(rule.nodes)
+ } else {
+ let nodes = rule.nodes
+
+ let topEscaped
+ let topEscapedIdx = -1
+ let breakoutLeaf
+ let breakoutRoot
+ let clone
+
+ let lineage = getAncestorRules(rule)
+ lineage.forEach((parent, i) => {
+ if (escapes(parent.name)) {
+ topEscaped = parent
+ topEscapedIdx = i
+ breakoutRoot = clone
+ } else {
+ let oldClone = clone
+ clone = parent.clone({ nodes: [] })
+ oldClone && clone.append(oldClone)
+ breakoutLeaf = breakoutLeaf || clone
+ }
+ })
+
+ if (!topEscaped) {
+ rule.after(nodes)
+ } else if (!breakoutRoot) {
+ topEscaped.after(nodes)
+ } else {
+ let leaf = breakoutLeaf
+ leaf.append(nodes)
+ topEscaped.after(breakoutRoot)
+ }
+
+ if (rule.next() && topEscaped) {
+ let restRoot
+ lineage.slice(0, topEscapedIdx + 1).forEach((parent, i, arr) => {
+ let oldRoot = restRoot
+ restRoot = parent.clone({ nodes: [] })
+ oldRoot && restRoot.append(oldRoot)
+
+ let nextSibs = []
+ let _child = arr[i - 1] || rule
+ let next = _child.next()
+ while (next) {
+ nextSibs.push(next)
+ next = next.next()
+ }
+ restRoot.append(nextSibs)
+ })
+ restRoot && (breakoutRoot || nodes[nodes.length - 1]).after(restRoot)
+ }
+ }
+
+ rule.remove()
+}
+
+const rootRuleMergeSel = Symbol('rootRuleMergeSel')
+const rootRuleEscapes = Symbol('rootRuleEscapes')
+
+function normalizeRootRule(rule) {
+ let { params } = rule
+ let { escapes, selector, type } = parseRootRuleParams(params)
+ if (type === 'unknown') {
+ throw rule.error(
+ `Unknown @${rule.name} parameter ${JSON.stringify(params)}`
+ )
+ }
+ if (type === 'basic' && selector) {
+ let selectorBlock = new Rule({ nodes: rule.nodes, selector })
+ rule.removeAll()
+ rule.append(selectorBlock)
+ }
+ rule[rootRuleEscapes] = escapes
+ rule[rootRuleMergeSel] = escapes ? !escapes('all') : type === 'noop'
+}
+
+const hasRootRule = Symbol('hasRootRule')
+
+module.exports = (opts = {}) => {
+ let bubble = atruleNames(
+ ['media', 'supports', 'layer', 'container', 'starting-style'],
+ opts.bubble
+ )
+ let atruleChilds = createFnAtruleChilds(bubble)
+ let unwrap = atruleNames(
+ [
+ 'document',
+ 'font-face',
+ 'keyframes',
+ '-webkit-keyframes',
+ '-moz-keyframes'
+ ],
+ opts.unwrap
+ )
+ let rootRuleName = (opts.rootRuleName || 'at-root').replace(/^@/, '')
+ let preserveEmpty = opts.preserveEmpty
+
+ return {
+ Once(root) {
+ root.walkAtRules(rootRuleName, node => {
+ normalizeRootRule(node)
+ root[hasRootRule] = true
+ })
+ },
+
+ postcssPlugin: 'postcss-nested',
+
+ RootExit(root) {
+ if (root[hasRootRule]) {
+ root.walkAtRules(rootRuleName, unwrapRootRule)
+ root[hasRootRule] = false
+ }
+ },
+
+ Rule(rule) {
+ let unwrapped = false
+ let after = rule
+ let copyDeclarations = false
+ let declarations = []
+
+ rule.each(child => {
+ if (child.type === 'rule') {
+ if (declarations.length) {
+ after = pickDeclarations(rule.selector, declarations, after)
+ declarations = []
+ }
+
+ copyDeclarations = true
+ unwrapped = true
+ child.selectors = mergeSelectors(rule, child)
+ after = breakOut(child, after)
+ } else if (child.type === 'atrule') {
+ if (declarations.length) {
+ after = pickDeclarations(rule.selector, declarations, after)
+ declarations = []
+ }
+ if (child.name === rootRuleName) {
+ unwrapped = true
+ atruleChilds(rule, child, true, child[rootRuleMergeSel])
+ after = breakOut(child, after)
+ } else if (bubble[child.name]) {
+ copyDeclarations = true
+ unwrapped = true
+ atruleChilds(rule, child, true)
+ after = breakOut(child, after)
+ } else if (unwrap[child.name]) {
+ copyDeclarations = true
+ unwrapped = true
+ atruleChilds(rule, child, false)
+ after = breakOut(child, after)
+ } else if (copyDeclarations) {
+ declarations.push(child)
+ }
+ } else if (child.type === 'decl' && copyDeclarations) {
+ declarations.push(child)
+ }
+ })
+
+ if (declarations.length) {
+ after = pickDeclarations(rule.selector, declarations, after)
+ }
+
+ if (unwrapped && preserveEmpty !== true) {
+ rule.raws.semicolon = true
+ if (rule.nodes.length === 0) rule.remove()
+ }
+ }
+ }
+}
+module.exports.postcss = true
diff --git a/node_modules/postcss-nested/package.json b/node_modules/postcss-nested/package.json
new file mode 100644
index 0000000..abc8e6c
--- /dev/null
+++ b/node_modules/postcss-nested/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "postcss-nested",
+ "version": "6.2.0",
+ "description": "PostCSS plugin to unwrap nested rules like how Sass does it",
+ "keywords": [
+ "postcss",
+ "css",
+ "postcss-plugin",
+ "sass",
+ "nested"
+ ],
+ "author": "Andrey Sitnik ",
+ "license": "MIT",
+ "repository": "postcss/postcss-nested",
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ },
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ }
+}
diff --git a/node_modules/postcss-selector-parser/API.md b/node_modules/postcss-selector-parser/API.md
new file mode 100644
index 0000000..c8e55ee
--- /dev/null
+++ b/node_modules/postcss-selector-parser/API.md
@@ -0,0 +1,872 @@
+# API Documentation
+
+*Please use only this documented API when working with the parser. Methods
+not documented here are subject to change at any point.*
+
+## `parser` function
+
+This is the module's main entry point.
+
+```js
+const parser = require('postcss-selector-parser');
+```
+
+### `parser([transform], [options])`
+
+Creates a new `processor` instance
+
+```js
+const processor = parser();
+```
+
+Or, with optional transform function
+
+```js
+const transform = selectors => {
+ selectors.walkUniversals(selector => {
+ selector.remove();
+ });
+};
+
+const processor = parser(transform)
+
+// Example
+const result = processor.processSync('*.class');
+// => .class
+```
+
+[See processor documentation](#processor)
+
+Arguments:
+
+* `transform (function)`: Provide a function to work with the parsed AST.
+* `options (object)`: Provide default options for all calls on the returned `Processor`.
+
+### `parser.attribute([props])`
+
+Creates a new attribute selector.
+
+```js
+parser.attribute({attribute: 'href'});
+// => [href]
+```
+
+Arguments:
+
+* `props (object)`: The new node's properties.
+
+### `parser.className([props])`
+
+Creates a new class selector.
+
+```js
+parser.className({value: 'button'});
+// => .button
+```
+
+Arguments:
+
+* `props (object)`: The new node's properties.
+
+### `parser.combinator([props])`
+
+Creates a new selector combinator.
+
+```js
+parser.combinator({value: '+'});
+// => +
+```
+
+Arguments:
+
+* `props (object)`: The new node's properties.
+
+Notes:
+* **Descendant Combinators** The value of descendant combinators created by the
+ parser always just a single space (`" "`). For descendant selectors with no
+ comments, additional space is now stored in `node.spaces.before`. Depending
+ on the location of comments, additional spaces may be stored in
+ `node.raws.spaces.before`, `node.raws.spaces.after`, or `node.raws.value`.
+* **Named Combinators** Although, nonstandard and unlikely to ever become a standard,
+ named combinators like `/deep/` and `/for/` are parsed as combinators. The
+ `node.value` is name after being unescaped and normalized as lowercase. The
+ original value for the combinator name is stored in `node.raws.value`.
+
+
+### `parser.comment([props])`
+
+Creates a new comment.
+
+```js
+parser.comment({value: '/* Affirmative, Dave. I read you. */'});
+// => /* Affirmative, Dave. I read you. */
+```
+
+Arguments:
+
+* `props (object)`: The new node's properties.
+
+### `parser.id([props])`
+
+Creates a new id selector.
+
+```js
+parser.id({value: 'search'});
+// => #search
+```
+
+Arguments:
+
+* `props (object)`: The new node's properties.
+
+### `parser.nesting([props])`
+
+Creates a new nesting selector.
+
+```js
+parser.nesting();
+// => &
+```
+
+Arguments:
+
+* `props (object)`: The new node's properties.
+
+### `parser.pseudo([props])`
+
+Creates a new pseudo selector.
+
+```js
+parser.pseudo({value: '::before'});
+// => ::before
+```
+
+Arguments:
+
+* `props (object)`: The new node's properties.
+
+### `parser.root([props])`
+
+Creates a new root node.
+
+```js
+parser.root();
+// => (empty)
+```
+
+Arguments:
+
+* `props (object)`: The new node's properties.
+
+### `parser.selector([props])`
+
+Creates a new selector node.
+
+```js
+parser.selector();
+// => (empty)
+```
+
+Arguments:
+
+* `props (object)`: The new node's properties.
+
+### `parser.string([props])`
+
+Creates a new string node.
+
+```js
+parser.string();
+// => (empty)
+```
+
+Arguments:
+
+* `props (object)`: The new node's properties.
+
+### `parser.tag([props])`
+
+Creates a new tag selector.
+
+```js
+parser.tag({value: 'button'});
+// => button
+```
+
+Arguments:
+
+* `props (object)`: The new node's properties.
+
+### `parser.universal([props])`
+
+Creates a new universal selector.
+
+```js
+parser.universal();
+// => *
+```
+
+Arguments:
+
+* `props (object)`: The new node's properties.
+
+## Node types
+
+### `node.type`
+
+A string representation of the selector type. It can be one of the following;
+`attribute`, `class`, `combinator`, `comment`, `id`, `nesting`, `pseudo`,
+`root`, `selector`, `string`, `tag`, or `universal`. Note that for convenience,
+these constants are exposed on the main `parser` as uppercased keys. So for
+example you can get `id` by querying `parser.ID`.
+
+```js
+parser.attribute({attribute: 'href'}).type;
+// => 'attribute'
+```
+
+### `node.parent`
+
+Returns the parent node.
+
+```js
+root.nodes[0].parent === root;
+```
+
+### `node.toString()`, `String(node)`, or `'' + node`
+
+Returns a string representation of the node.
+
+```js
+const id = parser.id({value: 'search'});
+console.log(String(id));
+// => #search
+```
+
+### `node.next()` & `node.prev()`
+
+Returns the next/previous child of the parent node.
+
+```js
+const next = id.next();
+if (next && next.type !== 'combinator') {
+ throw new Error('Qualified IDs are not allowed!');
+}
+```
+
+### `node.replaceWith(node)`
+
+Replace a node with another.
+
+```js
+const attr = selectors.first.first;
+const className = parser.className({value: 'test'});
+attr.replaceWith(className);
+```
+
+Arguments:
+
+* `node`: The node to substitute the original with.
+
+### `node.remove()`
+
+Removes the node from its parent node.
+
+```js
+if (node.type === 'id') {
+ node.remove();
+}
+```
+
+### `node.clone([opts])`
+
+Returns a copy of a node, detached from any parent containers that the
+original might have had.
+
+```js
+const cloned = node.clone();
+```
+
+### `node.isAtPosition(line, column)`
+
+Return a `boolean` indicating whether this node includes the character at the
+position of the given line and column. Returns `undefined` if the nodes lack
+sufficient source metadata to determine the position.
+
+Arguments:
+
+* `line`: 1-index based line number relative to the start of the selector.
+* `column`: 1-index based column number relative to the start of the selector.
+
+### `node.spaces`
+
+Extra whitespaces around the node will be moved into `node.spaces.before` and
+`node.spaces.after`. So for example, these spaces will be moved as they have
+no semantic meaning:
+
+```css
+ h1 , h2 {}
+```
+
+For descendent selectors, the value is always a single space.
+
+```css
+h1 h2 {}
+```
+
+Additional whitespace is found in either the `node.spaces.before` and `node.spaces.after` depending on the presence of comments or other whitespace characters. If the actual whitespace does not start or end with a single space, the node's raw value is set to the actual space(s) found in the source.
+
+### `node.source`
+
+An object describing the node's start/end, line/column source position.
+
+Within the following CSS, the `.bar` class node ...
+
+```css
+.foo,
+ .bar {}
+```
+
+... will contain the following `source` object.
+
+```js
+source: {
+ start: {
+ line: 2,
+ column: 3
+ },
+ end: {
+ line: 2,
+ column: 6
+ }
+}
+```
+
+### `node.sourceIndex`
+
+The zero-based index of the node within the original source string.
+
+Within the following CSS, the `.baz` class node will have a `sourceIndex` of `12`.
+
+```css
+.foo, .bar, .baz {}
+```
+
+## Container types
+
+The `root`, `selector`, and `pseudo` nodes have some helper methods for working
+with their children.
+
+### `container.nodes`
+
+An array of the container's children.
+
+```js
+// Input: h1 h2
+selectors.at(0).nodes.length // => 3
+selectors.at(0).nodes[0].value // => 'h1'
+selectors.at(0).nodes[1].value // => ' '
+```
+
+### `container.first` & `container.last`
+
+The first/last child of the container.
+
+```js
+selector.first === selector.nodes[0];
+selector.last === selector.nodes[selector.nodes.length - 1];
+```
+
+### `container.at(index)`
+
+Returns the node at position `index`.
+
+```js
+selector.at(0) === selector.first;
+selector.at(0) === selector.nodes[0];
+```
+
+Arguments:
+
+* `index`: The index of the node to return.
+
+### `container.atPosition(line, column)`
+
+Returns the node at the source position `line` and `column`.
+
+```js
+// Input: :not(.foo),\n#foo > :matches(ol, ul)
+selector.atPosition(1, 1); // => :not(.foo)
+selector.atPosition(2, 1); // => \n#foo
+```
+
+Arguments:
+
+* `line`: The line number of the node to return.
+* `column`: The column number of the node to return.
+
+### `container.index(node)`
+
+Return the index of the node within its container.
+
+```js
+selector.index(selector.nodes[2]) // => 2
+```
+
+Arguments:
+
+* `node`: A node within the current container.
+
+### `container.length`
+
+Proxy to the length of the container's nodes.
+
+```js
+container.length === container.nodes.length
+```
+
+### `container` Array iterators
+
+The container class provides proxies to certain Array methods; these are:
+
+* `container.map === container.nodes.map`
+* `container.reduce === container.nodes.reduce`
+* `container.every === container.nodes.every`
+* `container.some === container.nodes.some`
+* `container.filter === container.nodes.filter`
+* `container.sort === container.nodes.sort`
+
+Note that these methods only work on a container's immediate children; recursive
+iteration is provided by `container.walk`.
+
+### `container.each(callback)`
+
+Iterate the container's immediate children, calling `callback` for each child.
+You may return `false` within the callback to break the iteration.
+
+```js
+let className;
+selectors.each((selector, index) => {
+ if (selector.type === 'class') {
+ className = selector.value;
+ return false;
+ }
+});
+```
+
+Note that unlike `Array#forEach()`, this iterator is safe to use whilst adding
+or removing nodes from the container.
+
+Arguments:
+
+* `callback (function)`: A function to call for each node, which receives `node`
+ and `index` arguments.
+
+### `container.walk(callback)`
+
+Like `container#each`, but will also iterate child nodes as long as they are
+`container` types.
+
+```js
+selectors.walk((selector, index) => {
+ // all nodes
+});
+```
+
+Arguments:
+
+* `callback (function)`: A function to call for each node, which receives `node`
+ and `index` arguments.
+
+This iterator is safe to use whilst mutating `container.nodes`,
+like `container#each`.
+
+### `container.walk` proxies
+
+The container class provides proxy methods for iterating over types of nodes,
+so that it is easier to write modules that target specific selectors. Those
+methods are:
+
+* `container.walkAttributes`
+* `container.walkClasses`
+* `container.walkCombinators`
+* `container.walkComments`
+* `container.walkIds`
+* `container.walkNesting`
+* `container.walkPseudos`
+* `container.walkTags`
+* `container.walkUniversals`
+
+### `container.split(callback)`
+
+This method allows you to split a group of nodes by returning `true` from
+a callback. It returns an array of arrays, where each inner array corresponds
+to the groups that you created via the callback.
+
+```js
+// (input) => h1 h2>>h3
+const list = selectors.first.split(selector => {
+ return selector.type === 'combinator';
+});
+
+// (node values) => [['h1', ' '], ['h2', '>>'], ['h3']]
+```
+
+Arguments:
+
+* `callback (function)`: A function to call for each node, which receives `node`
+ as an argument.
+
+### `container.prepend(node)` & `container.append(node)`
+
+Add a node to the start/end of the container. Note that doing so will set
+the parent property of the node to this container.
+
+```js
+const id = parser.id({value: 'search'});
+selector.append(id);
+```
+
+Arguments:
+
+* `node`: The node to add.
+
+### `container.insertBefore(old, new)` & `container.insertAfter(old, new)`
+
+Add a node before or after an existing node in a container:
+
+```js
+selectors.walk(selector => {
+ if (selector.type !== 'class') {
+ const className = parser.className({value: 'theme-name'});
+ selector.parent.insertAfter(selector, className);
+ }
+});
+```
+
+Arguments:
+
+* `old`: The existing node in the container.
+* `new`: The new node to add before/after the existing node.
+
+### `container.removeChild(node)`
+
+Remove the node from the container. Note that you can also use
+`node.remove()` if you would like to remove just a single node.
+
+```js
+selector.length // => 2
+selector.remove(id)
+selector.length // => 1;
+id.parent // undefined
+```
+
+Arguments:
+
+* `node`: The node to remove.
+
+### `container.removeAll()` or `container.empty()`
+
+Remove all children from the container.
+
+```js
+selector.removeAll();
+selector.length // => 0
+```
+
+## Root nodes
+
+A root node represents a comma separated list of selectors. Indeed, all
+a root's `toString()` method does is join its selector children with a ','.
+Other than this, it has no special functionality and acts like a container.
+
+### `root.trailingComma`
+
+This will be set to `true` if the input has a trailing comma, in order to
+support parsing of legacy CSS hacks.
+
+## Selector nodes
+
+A selector node represents a single complex selector. For example, this
+selector string `h1 h2 h3, [href] > p`, is represented as two selector nodes.
+It has no special functionality of its own.
+
+## Pseudo nodes
+
+A pseudo selector extends a container node; if it has any parameters of its
+own (such as `h1:not(h2, h3)`), they will be its children. Note that the pseudo
+`value` will always contain the colons preceding the pseudo identifier. This
+is so that both `:before` and `::before` are properly represented in the AST.
+
+## Attribute nodes
+
+### `attribute.quoted`
+
+Returns `true` if the attribute's value is wrapped in quotation marks, false if it is not.
+Remains `undefined` if there is no attribute value.
+
+```css
+[href=foo] /* false */
+[href='foo'] /* true */
+[href="foo"] /* true */
+[href] /* undefined */
+```
+
+### `attribute.qualifiedAttribute`
+
+Returns the attribute name qualified with the namespace if one is given.
+
+### `attribute.offsetOf(part)`
+
+ Returns the offset of the attribute part specified relative to the
+ start of the node of the output string. This is useful in raising
+ error messages about a specific part of the attribute, especially
+ in combination with `attribute.sourceIndex`.
+
+ Returns `-1` if the name is invalid or the value doesn't exist in this
+ attribute.
+
+ The legal values for `part` are:
+
+ * `"ns"` - alias for "namespace"
+ * `"namespace"` - the namespace if it exists.
+ * `"attribute"` - the attribute name
+ * `"attributeNS"` - the start of the attribute or its namespace
+ * `"operator"` - the match operator of the attribute
+ * `"value"` - The value (string or identifier)
+ * `"insensitive"` - the case insensitivity flag
+
+### `attribute.raws.unquoted`
+
+Returns the unquoted content of the attribute's value.
+Remains `undefined` if there is no attribute value.
+
+```css
+[href=foo] /* foo */
+[href='foo'] /* foo */
+[href="foo"] /* foo */
+[href] /* undefined */
+```
+
+### `attribute.spaces`
+
+Like `node.spaces` with the `before` and `after` values containing the spaces
+around the element, the parts of the attribute can also have spaces before
+and after them. The for each of `attribute`, `operator`, `value` and
+`insensitive` there is corresponding property of the same nam in
+`node.spaces` that has an optional `before` or `after` string containing only
+whitespace.
+
+Note that corresponding values in `attributes.raws.spaces` contain values
+including any comments. If set, these values will override the
+`attribute.spaces` value. Take care to remove them if changing
+`attribute.spaces`.
+
+### `attribute.raws`
+
+The raws object stores comments and other information necessary to re-render
+the node exactly as it was in the source.
+
+If a comment is embedded within the identifiers for the `namespace`, `attribute`
+or `value` then a property is placed in the raws for that value containing the full source of the propery including comments.
+
+If a comment is embedded within the space between parts of the attribute
+then the raw for that space is set accordingly.
+
+Setting an attribute's property `raws` value to be deleted.
+
+For now, changing the spaces required also updating or removing any of the
+raws values that override them.
+
+Example: `[ /*before*/ href /* after-attr */ = /* after-operator */ te/*inside-value*/st/* wow */ /*omg*/i/*bbq*/ /*whodoesthis*/]` would parse as:
+
+```js
+{
+ attribute: "href",
+ operator: "=",
+ value: "test",
+ spaces: {
+ before: '',
+ after: '',
+ attribute: { before: ' ', after: ' ' },
+ operator: { after: ' ' },
+ value: { after: ' ' },
+ insensitive: { after: ' ' }
+ },
+ raws: {
+ spaces: {
+ attribute: { before: ' /*before*/ ', after: ' /* after-attr */ ' },
+ operator: { after: ' /* after-operator */ ' },
+ value: { after: '/* wow */ /*omg*/' },
+ insensitive: { after: '/*bbq*/ /*whodoesthis*/' }
+ },
+ unquoted: 'test',
+ value: 'te/*inside-value*/st'
+ }
+}
+```
+
+## `Processor`
+
+### `ProcessorOptions`
+
+* `lossless` - When `true`, whitespace is preserved. Defaults to `true`.
+* `updateSelector` - When `true`, if any processor methods are passed a postcss
+ `Rule` node instead of a string, then that Rule's selector is updated
+ with the results of the processing. Defaults to `true`.
+
+### `process|processSync(selectors, [options])`
+
+Processes the `selectors`, returning a string from the result of processing.
+
+Note: when the `updateSelector` option is set, the rule's selector
+will be updated with the resulting string.
+
+**Example:**
+
+```js
+const parser = require("postcss-selector-parser");
+const processor = parser();
+
+let result = processor.processSync(' .class');
+console.log(result);
+// => .class
+
+// Asynchronous operation
+let promise = processor.process(' .class').then(result => {
+ console.log(result)
+ // => .class
+});
+
+// To have the parser normalize whitespace values, utilize the options
+result = processor.processSync(' .class ', {lossless: false});
+console.log(result);
+// => .class
+
+// For better syntax errors, pass a PostCSS Rule node.
+const postcss = require('postcss');
+rule = postcss.rule({selector: ' #foo > a, .class '});
+processor.process(rule, {lossless: false, updateSelector: true}).then(result => {
+ console.log(result);
+ // => #foo>a,.class
+ console.log("rule:", rule.selector);
+ // => rule: #foo>a,.class
+})
+```
+
+Arguments:
+
+* `selectors (string|postcss.Rule)`: Either a selector string or a PostCSS Rule
+ node.
+* `[options] (object)`: Process options
+
+
+### `ast|astSync(selectors, [options])`
+
+Like `process()` and `processSync()` but after
+processing the `selectors` these methods return the `Root` node of the result
+instead of a string.
+
+Note: when the `updateSelector` option is set, the rule's selector
+will be updated with the resulting string.
+
+### `transform|transformSync(selectors, [options])`
+
+Like `process()` and `processSync()` but after
+processing the `selectors` these methods return the value returned by the
+processor callback.
+
+Note: when the `updateSelector` option is set, the rule's selector
+will be updated with the resulting string.
+
+### Error Handling Within Selector Processors
+
+The root node passed to the selector processor callback
+has a method `error(message, options)` that returns an
+error object. This method should always be used to raise
+errors relating to the syntax of selectors. The options
+to this method are passed to postcss's error constructor
+([documentation](http://postcss.org/api/#container-error)).
+
+#### Async Error Example
+
+```js
+let processor = (root) => {
+ return new Promise((resolve, reject) => {
+ root.walkClasses((classNode) => {
+ if (/^(.*)[-_]/.test(classNode.value)) {
+ let msg = "classes may not have underscores or dashes in them";
+ reject(root.error(msg, {
+ index: classNode.sourceIndex + RegExp.$1.length + 1,
+ word: classNode.value
+ }));
+ }
+ });
+ resolve();
+ });
+};
+
+const postcss = require("postcss");
+const parser = require("postcss-selector-parser");
+const selectorProcessor = parser(processor);
+const plugin = postcss.plugin('classValidator', (options) => {
+ return (root) => {
+ let promises = [];
+ root.walkRules(rule => {
+ promises.push(selectorProcessor.process(rule));
+ });
+ return Promise.all(promises);
+ };
+});
+postcss(plugin()).process(`
+.foo-bar {
+ color: red;
+}
+`.trim(), {from: 'test.css'}).catch((e) => console.error(e.toString()));
+
+// CssSyntaxError: classValidator: ./test.css:1:5: classes may not have underscores or dashes in them
+//
+// > 1 | .foo-bar {
+// | ^
+// 2 | color: red;
+// 3 | }
+```
+
+#### Synchronous Error Example
+
+```js
+let processor = (root) => {
+ root.walkClasses((classNode) => {
+ if (/.*[-_]/.test(classNode.value)) {
+ let msg = "classes may not have underscores or dashes in them";
+ throw root.error(msg, {
+ index: classNode.sourceIndex,
+ word: classNode.value
+ });
+ }
+ });
+};
+
+const postcss = require("postcss");
+const parser = require("postcss-selector-parser");
+const selectorProcessor = parser(processor);
+const plugin = postcss.plugin('classValidator', (options) => {
+ return (root) => {
+ root.walkRules(rule => {
+ selectorProcessor.processSync(rule);
+ });
+ };
+});
+postcss(plugin()).process(`
+.foo-bar {
+ color: red;
+}
+`.trim(), {from: 'test.css'}).catch((e) => console.error(e.toString()));
+
+// CssSyntaxError: classValidator: ./test.css:1:5: classes may not have underscores or dashes in them
+//
+// > 1 | .foo-bar {
+// | ^
+// 2 | color: red;
+// 3 | }
+```
diff --git a/node_modules/postcss-selector-parser/CHANGELOG.md b/node_modules/postcss-selector-parser/CHANGELOG.md
new file mode 100644
index 0000000..14ffadc
--- /dev/null
+++ b/node_modules/postcss-selector-parser/CHANGELOG.md
@@ -0,0 +1,549 @@
+# 6.1.2
+
+- Fixed: erroneous trailing combinators in pseudos
+
+# 6.1.1
+
+- Fixed: improve typings of constructor helpers (#292)
+
+# 6.1.0
+
+- Feature: add `sourceIndex` to `Selector` nodes (#290)
+
+# 6.0.16
+
+- Fixed: add missing `index` argument to `each`/`walk` callback types (#289)
+
+# 6.0.15
+
+- Fixed: Node#prev and Node#next type for the first/last node
+
+# 6.0.14
+
+- Fixed: type definitions
+
+# 6.0.13
+
+- Fixed: throw on unexpected pipe symbols
+
+# 6.0.12
+
+- Fixed: `clone` arguments should be optional
+
+# 6.0.11
+
+- Fixed: parse attribute case insensitivity flag
+
+# 6.0.10
+
+- Fixed: `isPseudoElement()` supports `:first-letter` and `:first-line`
+
+# 6.0.9
+
+- Fixed: `Combinator.raws` property type
+
+# 6.0.8
+
+- Fixed: reduced size
+
+# 6.0.7
+
+- Fixed: parse animation percents
+
+# 6.0.6
+
+- Fixed: parse quoted attributes containing a newline correctly
+
+# 6.0.5
+
+- Perf: rework unesc for a 63+% performance boost
+
+# 6.0.4
+
+- Fixed: ts errors
+
+# 6.0.3
+
+- Fixed: replace node built-in "util" module with "util-deprecate"
+- Fixed: handle uppercase pseudo elements
+- Fixed: do not create invalid combinator before comment
+
+# 6.0.2
+
+- Fixed an issue with parsing and stringifying an empty attribute value
+
+# 6.0.1
+
+- Fixed an issue with unicode surrogate pair parsing
+
+# 6.0.0
+
+- Updated: `cssesc` to 3.0.0 (major)
+- Fixed: Issues with escaped `id` and `class` selectors
+
+# 5.0.0
+
+- Allow escaped dot within class name.
+- Update PostCSS to 7.0.7 (patch)
+
+# 5.0.0-rc.4
+
+- Fixed an issue where comments immediately after an insensitive (in attribute)
+ were not parsed correctly.
+- Updated `cssesc` to 2.0.0 (major).
+- Removed outdated integration tests.
+- Added tests for custom selectors, tags with attributes, the universal
+ selector with pseudos, and tokens after combinators.
+
+# 5.0.0-rc.1
+
+To ease adoption of the v5.0 release, we have relaxed the node version
+check performed by npm at installation time to allow for node 4, which
+remains officially unsupported, but likely to continue working for the
+time being.
+
+# 5.0.0-rc.0
+
+This release has **BREAKING CHANGES** that were required to fix regressions
+in 4.0.0 and to make the Combinator Node API consistent for all combinator
+types. Please read carefully.
+
+## Summary of Changes
+
+* The way a descendent combinator that isn't a single space character (E.g. `.a .b`) is stored in the AST has changed.
+* Named Combinators (E.g. `.a /for/ .b`) are now properly parsed as a combinator.
+* It is now possible to look up a node based on the source location of a character in that node and to query nodes if they contain some character.
+* Several bug fixes that caused the parser to hang and run out of memory when a `/` was encountered have been fixed.
+* The minimum supported version of Node is now `v6.0.0`.
+
+### Changes to the Descendent Combinator
+
+In prior releases, the value of a descendant combinator with multiple spaces included all the spaces.
+
+* `.a .b`: Extra spaces are now stored as space before.
+ - Old & Busted:
+ - `combinator.value === " "`
+ - New hotness:
+ - `combinator.value === " " && combinator.spaces.before === " "`
+* `.a /*comment*/.b`: A comment at the end of the combinator causes extra space to become after space.
+ - Old & Busted:
+ - `combinator.value === " "`
+ - `combinator.raws.value === " /*comment/"`
+ - New hotness:
+ - `combinator.value === " "`
+ - `combinator.spaces.after === " "`
+ - `combinator.raws.spaces.after === " /*comment*/"`
+* `.a.b`: whitespace that doesn't start or end with a single space character is stored as a raw value.
+ - Old & Busted:
+ - `combinator.value === "\n"`
+ - `combinator.raws.value === undefined`
+ - New hotness:
+ - `combinator.value === " "`
+ - `combinator.raws.value === "\n"`
+
+### Support for "Named Combinators"
+
+Although, nonstandard and unlikely to ever become a standard, combinators like `/deep/` and `/for/` are now properly supported.
+
+Because they've been taken off the standardization track, there is no spec-official name for combinators of the form `//`. However, I talked to [Tab Atkins](https://twitter.com/tabatkins) and we agreed to call them "named combinators" so now they are called that.
+
+Before this release such named combinators were parsed without intention and generated three nodes of type `"tag"` where the first and last nodes had a value of `"/"`.
+
+* `.a /for/ .b` is parsed as a combinator.
+ - Old & Busted:
+ - `root.nodes[0].nodes[1].type === "tag"`
+ - `root.nodes[0].nodes[1].value === "/"`
+ - New hotness:
+ - `root.nodes[0].nodes[1].type === "combinator"`
+ - `root.nodes[0].nodes[1].value === "/for/"`
+* `.a /F\6fR/ .b` escapes are handled and uppercase is normalized.
+ - Old & Busted:
+ - `root.nodes[0].nodes[2].type === "tag"`
+ - `root.nodes[0].nodes[2].value === "F\\6fR"`
+ - New hotness:
+ - `root.nodes[0].nodes[1].type === "combinator"`
+ - `root.nodes[0].nodes[1].value === "/for/"`
+ - `root.nodes[0].nodes[1].raws.value === "/F\\6fR/"`
+
+### Source position checks and lookups
+
+A new API was added to look up a node based on the source location.
+
+```js
+const selectorParser = require("postcss-selector-parser");
+// You can find the most specific node for any given character
+let combinator = selectorParser.astSync(".a > .b").atPosition(1,4);
+combinator.toString() === " > ";
+// You can check if a node includes a specific character
+// Whitespace surrounding the node that is owned by that node
+// is included in the check.
+[2,3,4,5,6].map(column => combinator.isAtPosition(1, column));
+// => [false, true, true, true, false]
+```
+
+# 4.0.0
+
+This release has **BREAKING CHANGES** that were required to fix bugs regarding values with escape sequences. Please read carefully.
+
+* **Identifiers with escapes** - CSS escape sequences are now hidden from the public API by default.
+ The normal value of a node like a class name or ID, or an aspect of a node such as attribute
+ selector's value, is unescaped. Escapes representing Non-ascii characters are unescaped into
+ unicode characters. For example: `bu\tton, .\31 00, #i\2764\FE0Fu, [attr="value is \"quoted\""]`
+ will parse respectively to the values `button`, `100`, `i❤️u`, `value is "quoted"`.
+ The original escape sequences for these values can be found in the corresponding property name
+ in `node.raws`. Where possible, deprecation warnings were added, but the nature
+ of escape handling makes it impossible to detect what is escaped or not. Our expectation is
+ that most users are neither expecting nor handling escape sequences in their use of this library,
+ and so for them, this is a bug fix. Users who are taking care to handle escapes correctly can
+ now update their code to remove the escape handling and let us do it for them.
+
+* **Mutating values with escapes** - When you make an update to a node property that has escape handling
+ The value is assumed to be unescaped, and any special characters are escaped automatically and
+ the corresponding `raws` value is immediately updated. This can result in changes to the original
+ escape format. Where the exact value of the escape sequence is important there are methods that
+ allow both values to be set in conjunction. There are a number of new convenience methods for
+ manipulating values that involve escapes, especially for attributes values where the quote mark
+ is involved. See https://github.com/postcss/postcss-selector-parser/pull/133 for an extensive
+ write-up on these changes.
+
+
+**Upgrade/API Example**
+
+In `3.x` there was no unescape handling and internal consistency of several properties was the caller's job to maintain. It was very easy for the developer
+to create a CSS file that did not parse correctly when some types of values
+were in use.
+
+```js
+const selectorParser = require("postcss-selector-parser");
+let attr = selectorParser.attribute({attribute: "id", operator: "=", value: "a-value"});
+attr.value; // => "a-value"
+attr.toString(); // => [id=a-value]
+// Add quotes to an attribute's value.
+// All these values have to be set by the caller to be consistent:
+// no internal consistency is maintained.
+attr.raws.unquoted = attr.value
+attr.value = "'" + attr.value + "'";
+attr.value; // => "'a-value'"
+attr.quoted = true;
+attr.toString(); // => "[id='a-value']"
+```
+
+In `4.0` there is a convenient API for setting and mutating values
+that may need escaping. Especially for attributes.
+
+```js
+const selectorParser = require("postcss-selector-parser");
+
+// The constructor requires you specify the exact escape sequence
+let className = selectorParser.className({value: "illegal class name", raws: {value: "illegal\\ class\\ name"}});
+className.toString(); // => '.illegal\\ class\\ name'
+
+// So it's better to set the value as a property
+className = selectorParser.className();
+// Most properties that deal with identifiers work like this
+className.value = "escape for me";
+className.value; // => 'escape for me'
+className.toString(); // => '.escape\\ for\\ me'
+
+// emoji and all non-ascii are escaped to ensure it works in every css file.
+className.value = "😱🦄😍";
+className.value; // => '😱🦄😍'
+className.toString(); // => '.\\1F631\\1F984\\1F60D'
+
+// you can control the escape sequence if you want, or do bad bad things
+className.setPropertyAndEscape('value', 'xxxx', 'yyyy');
+className.value; // => "xxxx"
+className.toString(); // => ".yyyy"
+
+// Pass a value directly through to the css output without escaping it.
+className.setPropertyWithoutEscape('value', '$REPLACE_ME$');
+className.value; // => "$REPLACE_ME$"
+className.toString(); // => ".$REPLACE_ME$"
+
+// The biggest changes are to the Attribute class
+// passing quoteMark explicitly is required to avoid a deprecation warning.
+let attr = selectorParser.attribute({attribute: "id", operator: "=", value: "a-value", quoteMark: null});
+attr.toString(); // => "[id=a-value]"
+// Get the value with quotes on it and any necessary escapes.
+// This is the same as reading attr.value in 3.x.
+attr.getQuotedValue(); // => "a-value";
+attr.quoteMark; // => null
+
+// Add quotes to an attribute's value.
+attr.quoteMark = "'"; // This is all that's required.
+attr.toString(); // => "[id='a-value']"
+attr.quoted; // => true
+// The value is still the same, only the quotes have changed.
+attr.value; // => a-value
+attr.getQuotedValue(); // => "'a-value'";
+
+// deprecated assignment, no warning because there's no escapes
+attr.value = "new-value";
+// no quote mark is needed so it is removed
+attr.getQuotedValue(); // => "new-value";
+
+// deprecated assignment,
+attr.value = "\"a 'single quoted' value\"";
+// > (node:27859) DeprecationWarning: Assigning an attribute a value containing characters that might need to be escaped is deprecated. Call attribute.setValue() instead.
+attr.getQuotedValue(); // => '"a \'single quoted\' value"';
+// quote mark inferred from first and last characters.
+attr.quoteMark; // => '"'
+
+// setValue takes options to make manipulating the value simple.
+attr.setValue('foo', {smart: true});
+// foo doesn't require any escapes or quotes.
+attr.toString(); // => '[id=foo]'
+attr.quoteMark; // => null
+
+// An explicit quote mark can be specified
+attr.setValue('foo', {quoteMark: '"'});
+attr.toString(); // => '[id="foo"]'
+
+// preserves quote mark by default
+attr.setValue('bar');
+attr.toString(); // => '[id="bar"]'
+attr.quoteMark = null;
+attr.toString(); // => '[id=bar]'
+
+// with no arguments, it preserves quote mark even when it's not a great idea
+attr.setValue('a value \n that should be quoted');
+attr.toString(); // => '[id=a\\ value\\ \\A\\ that\\ should\\ be\\ quoted]'
+
+// smart preservation with a specified default
+attr.setValue('a value \n that should be quoted', {smart: true, preferCurrentQuoteMark: true, quoteMark: "'"});
+// => "[id='a value \\A that should be quoted']"
+attr.quoteMark = '"';
+// => '[id="a value \\A that should be quoted"]'
+
+// this keeps double quotes because it wants to quote the value and the existing value has double quotes.
+attr.setValue('this should be quoted', {smart: true, preferCurrentQuoteMark: true, quoteMark: "'"});
+// => '[id="this should be quoted"]'
+
+// picks single quotes because the value has double quotes
+attr.setValue('a "double quoted" value', {smart: true, preferCurrentQuoteMark: true, quoteMark: "'"});
+// => "[id='a "double quoted" value']"
+
+// setPropertyAndEscape lets you do anything you want. Even things that are a bad idea and illegal.
+attr.setPropertyAndEscape('value', 'xxxx', 'the password is 42');
+attr.value; // => "xxxx"
+attr.toString(); // => "[id=the password is 42]"
+
+// Pass a value directly through to the css output without escaping it.
+attr.setPropertyWithoutEscape('value', '$REPLACEMENT$');
+attr.value; // => "$REPLACEMENT$"
+attr.toString(); // => "[id=$REPLACEMENT$]"
+```
+
+# 3.1.2
+
+* Fix: Removed dot-prop dependency since it's no longer written in es5.
+
+# 3.1.1
+
+* Fix: typescript definitions weren't in the published package.
+
+# 3.1.0
+
+* Fixed numerous bugs in attribute nodes relating to the handling of comments
+ and whitespace. There's significant changes to `attrNode.spaces` and `attrNode.raws` since the `3.0.0` release.
+* Added `Attribute#offsetOf(part)` to get the offset location of
+ attribute parts like `"operator"` and `"value"`. This is most
+ often added to `Attribute#sourceIndex` for error reporting.
+
+# 3.0.0
+
+## Breaking changes
+
+* Some tweaks to the tokenizer/attribute selector parsing mean that whitespace
+ locations might be slightly different to the 2.x code.
+* Better attribute selector parsing with more validation; postcss-selector-parser
+ no longer uses regular expressions to parse attribute selectors.
+* Added an async API (thanks to @jacobp100); the default `process` API is now
+ async, and the sync API is now accessed through `processSync` instead.
+* `process()` and `processSync()` now return a string instead of the Processor
+ instance.
+* Tweaks handling of Less interpolation (thanks to @jwilsson).
+* Removes support for Node 0.12.
+
+## Other changes
+
+* `ast()` and `astSync()` methods have been added to the `Processor`. These
+ return the `Root` node of the selectors after processing them.
+* `transform()` and `transformSync()` methods have been added to the
+ `Processor`. These return the value returned by the processor callback
+ after processing the selectors.
+* Set the parent when inserting a node (thanks to @chriseppstein).
+* Correctly adjust indices when using insertBefore/insertAfter (thanks to @tivac).
+* Fixes handling of namespaces with qualified tag selectors.
+* `process`, `ast` and `transform` (and their sync variants) now accept a
+ `postcss` rule node. When provided, better errors are generated and selector
+ processing is automatically set back to the rule selector (unless the `updateSelector` option is set to `false`.)
+* Now more memory efficient when tokenizing selectors.
+
+### Upgrade hints
+
+The pattern of:
+
+`rule.selector = processor.process(rule.selector).result.toString();`
+
+is now:
+
+`processor.processSync(rule)`
+
+# 2.2.3
+
+* Resolves an issue where the parser would not reduce multiple spaces between an
+ ampersand and another simple selector in lossy mode (thanks to @adam-26).
+
+# 2.2.2
+
+* No longer hangs on an unescaped semicolon; instead the parser will throw
+ an exception for these cases.
+
+# 2.2.1
+
+* Allows a consumer to specify whitespace tokens when creating a new Node
+ (thanks to @Semigradsky).
+
+# 2.2.0
+
+* Added a new option to normalize whitespace when parsing the selector string
+ (thanks to @adam-26).
+
+# 2.1.1
+
+* Better unquoted value handling within attribute selectors
+ (thanks to @evilebottnawi).
+
+# 2.1.0
+
+* Added: Use string constants for all node types & expose them on the main
+ parser instance (thanks to @Aweary).
+
+# 2.0.0
+
+This release contains the following breaking changes:
+
+* Renamed all `eachInside` iterators to `walk`. For example, `eachTag` is now
+ `walkTags`, and `eachInside` is now `walk`.
+* Renamed `Node#removeSelf()` to `Node#remove()`.
+* Renamed `Container#remove()` to `Container#removeChild()`.
+* Renamed `Node#raw` to `Node#raws` (thanks to @davidtheclark).
+* Now parses `&` as the *nesting* selector, rather than a *tag* selector.
+* Fixes misinterpretation of Sass interpolation (e.g. `#{foo}`) as an
+ id selector (thanks to @davidtheclark).
+
+and;
+
+* Fixes parsing of attribute selectors with equals signs in them
+ (e.g. `[data-attr="foo=bar"]`) (thanks to @montmanu).
+* Adds `quoted` and `raw.unquoted` properties to attribute nodes
+ (thanks to @davidtheclark).
+
+# 1.3.3
+
+* Fixes an infinite loop on `)` and `]` tokens when they had no opening pairs.
+ Now postcss-selector-parser will throw when it encounters these lone tokens.
+
+# 1.3.2
+
+* Now uses plain integers rather than `str.charCodeAt(0)` for compiled builds.
+
+# 1.3.1
+
+* Update flatten to v1.x (thanks to @shinnn).
+
+# 1.3.0
+
+* Adds a new node type, `String`, to fix a crash on selectors such as
+ `foo:bar("test")`.
+
+# 1.2.1
+
+* Fixes a crash when the parser encountered a trailing combinator.
+
+# 1.2.0
+
+* A more descriptive error is thrown when the parser expects to find a
+ pseudo-class/pseudo-element (thanks to @ashelley).
+* Adds support for line/column locations for selector nodes, as well as a
+ `Node#sourceIndex` method (thanks to @davidtheclark).
+
+# 1.1.4
+
+* Fixes a crash when a selector started with a `>` combinator. The module will
+ now no longer throw if a selector has a leading/trailing combinator node.
+
+# 1.1.3
+
+* Fixes a crash on `@` tokens.
+
+# 1.1.2
+
+* Fixes an infinite loop caused by using parentheses in a non-pseudo element
+ context.
+
+# 1.1.1
+
+* Fixes a crash when a backslash ended a selector string.
+
+# 1.1.0
+
+* Adds support for replacing multiple nodes at once with `replaceWith`
+ (thanks to @jonathantneal).
+* Parser no longer throws on sequential IDs and trailing commas, to support
+ parsing of selector hacks.
+
+# 1.0.1
+
+* Fixes using `insertAfter` and `insertBefore` during iteration.
+
+# 1.0.0
+
+* Adds `clone` and `replaceWith` methods to nodes.
+* Adds `insertBefore` and `insertAfter` to containers.
+* Stabilises API.
+
+# 0.0.5
+
+* Fixes crash on extra whitespace inside a pseudo selector's parentheses.
+* Adds sort function to the container class.
+* Enables the parser to pass its input through without transforming.
+* Iteration-safe `each` and `eachInside`.
+
+# 0.0.4
+
+* Tidy up redundant duplication.
+* Fixes a bug where the parser would loop infinitely on universal selectors
+ inside pseudo selectors.
+* Adds `length` getter and `eachInside`, `map`, `reduce` to the container class.
+* When a selector has been removed from the tree, the root node will no longer
+ cast it to a string.
+* Adds node type iterators to the container class (e.g. `eachComment`).
+* Adds filter function to the container class.
+* Adds split function to the container class.
+* Create new node types by doing `parser.id(opts)` etc.
+* Adds support for pseudo classes anywhere in the selector.
+
+# 0.0.3
+
+* Adds `next` and `prev` to the node class.
+* Adds `first` and `last` getters to the container class.
+* Adds `every` and `some` iterators to the container class.
+* Add `empty` alias for `removeAll`.
+* Combinators are now types of node.
+* Fixes the at method so that it is not an alias for `index`.
+* Tidy up creation of new nodes in the parser.
+* Refactors how namespaces are handled for consistency & less redundant code.
+* Refactors AST to use `nodes` exclusively, and eliminates excessive nesting.
+* Fixes nested pseudo parsing.
+* Fixes whitespace parsing.
+
+# 0.0.2
+
+* Adds support for namespace selectors.
+* Adds support for selectors joined by escaped spaces - such as `.\31\ 0`.
+
+# 0.0.1
+
+* Initial release.
diff --git a/node_modules/postcss-selector-parser/LICENSE-MIT b/node_modules/postcss-selector-parser/LICENSE-MIT
new file mode 100644
index 0000000..fd0e863
--- /dev/null
+++ b/node_modules/postcss-selector-parser/LICENSE-MIT
@@ -0,0 +1,22 @@
+Copyright (c) Ben Briggs (http://beneb.info)
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/postcss-selector-parser/README.md b/node_modules/postcss-selector-parser/README.md
new file mode 100644
index 0000000..28e44f2
--- /dev/null
+++ b/node_modules/postcss-selector-parser/README.md
@@ -0,0 +1,49 @@
+# postcss-selector-parser [](https://github.com/postcss/postcss-selector-parser/actions/workflows/test.yml)
+
+> Selector parser with built in methods for working with selector strings.
+
+## Install
+
+With [npm](https://npmjs.com/package/postcss-selector-parser) do:
+
+```
+npm install postcss-selector-parser
+```
+
+## Quick Start
+
+```js
+const parser = require('postcss-selector-parser');
+const transform = selectors => {
+ selectors.walk(selector => {
+ // do something with the selector
+ console.log(String(selector))
+ });
+};
+
+const transformed = parser(transform).processSync('h1, h2, h3');
+```
+
+To normalize selector whitespace:
+
+```js
+const parser = require('postcss-selector-parser');
+const normalized = parser().processSync('h1, h2, h3', {lossless: false});
+// -> h1,h2,h3
+```
+
+Async support is provided through `parser.process` and will resolve a Promise
+with the resulting selector string.
+
+## API
+
+Please see [API.md](API.md).
+
+## Credits
+
+* Huge thanks to Andrey Sitnik (@ai) for work on PostCSS which helped
+ accelerate this module's development.
+
+## License
+
+MIT
diff --git a/node_modules/postcss-selector-parser/package.json b/node_modules/postcss-selector-parser/package.json
new file mode 100644
index 0000000..0b074d0
--- /dev/null
+++ b/node_modules/postcss-selector-parser/package.json
@@ -0,0 +1,80 @@
+{
+ "name": "postcss-selector-parser",
+ "version": "6.1.2",
+ "devDependencies": {
+ "@babel/cli": "^7.11.6",
+ "@babel/core": "^7.11.6",
+ "@babel/eslint-parser": "^7.11.5",
+ "@babel/eslint-plugin": "^7.11.5",
+ "@babel/plugin-proposal-class-properties": "^7.10.4",
+ "@babel/preset-env": "^7.11.5",
+ "@babel/register": "^7.11.5",
+ "ava": "^5.1.0",
+ "babel-plugin-add-module-exports": "^1.0.4",
+ "coveralls": "^3.1.0",
+ "del-cli": "^5.0.0",
+ "eslint": "^8.28.0",
+ "eslint-plugin-import": "^2.26.0",
+ "glob": "^8.0.3",
+ "minimist": "^1.2.5",
+ "nyc": "^15.1.0",
+ "postcss": "^8.4.31",
+ "semver": "^7.3.2",
+ "typescript": "^4.0.3"
+ },
+ "main": "dist/index.js",
+ "types": "postcss-selector-parser.d.ts",
+ "files": [
+ "API.md",
+ "CHANGELOG.md",
+ "LICENSE-MIT",
+ "dist",
+ "postcss-selector-parser.d.ts",
+ "!**/__tests__"
+ ],
+ "scripts": {
+ "typecheck": "tsc --noEmit --strict postcss-selector-parser.d.ts postcss-selector-parser.test.ts",
+ "pretest": "eslint src && npm run typecheck",
+ "prepare": "del-cli dist && BABEL_ENV=publish babel src --out-dir dist --ignore /__tests__/",
+ "lintfix": "eslint --fix src",
+ "report": "nyc report --reporter=html",
+ "test": "nyc ava src/__tests__/*.mjs",
+ "testone": "ava"
+ },
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ },
+ "homepage": "https://github.com/postcss/postcss-selector-parser",
+ "contributors": [
+ {
+ "name": "Ben Briggs",
+ "email": "beneb.info@gmail.com",
+ "url": "http://beneb.info"
+ },
+ {
+ "name": "Chris Eppstein",
+ "email": "chris@eppsteins.net",
+ "url": "http://twitter.com/chriseppstein"
+ }
+ ],
+ "repository": "postcss/postcss-selector-parser",
+ "ava": {
+ "require": [
+ "@babel/register"
+ ],
+ "concurrency": 5,
+ "timeout": "25s",
+ "nodeArguments": []
+ },
+ "nyc": {
+ "exclude": [
+ "node_modules",
+ "**/__tests__"
+ ]
+ }
+}
diff --git a/node_modules/postcss-selector-parser/postcss-selector-parser.d.ts b/node_modules/postcss-selector-parser/postcss-selector-parser.d.ts
new file mode 100644
index 0000000..af609e6
--- /dev/null
+++ b/node_modules/postcss-selector-parser/postcss-selector-parser.d.ts
@@ -0,0 +1,555 @@
+// Type definitions for postcss-selector-parser 2.2.3
+// Definitions by: Chris Eppstein
+
+/*~ Note that ES6 modules cannot directly export callable functions.
+ *~ This file should be imported using the CommonJS-style:
+ *~ import x = require('someLibrary');
+ *~
+ *~ Refer to the documentation to understand common
+ *~ workarounds for this limitation of ES6 modules.
+ */
+
+/*~ This declaration specifies that the function
+ *~ is the exported object from the file
+ */
+export = parser;
+
+// A type that's T but not U.
+type Diff = T extends U ? never : T;
+
+// TODO: Conditional types in TS 1.8 will really clean this up.
+declare function parser(): parser.Processor;
+declare function parser(processor: parser.AsyncProcessor): parser.Processor;
+declare function parser(processor: parser.AsyncProcessor): parser.Processor;
+declare function parser(processor: parser.SyncProcessor): parser.Processor;
+declare function parser(processor: parser.SyncProcessor): parser.Processor;
+declare function parser(processor?: parser.SyncProcessor | parser.AsyncProcessor): parser.Processor;
+
+/*~ If you want to expose types from your module as well, you can
+ *~ place them in this block. Often you will want to describe the
+ *~ shape of the return type of the function; that type should
+ *~ be declared in here, as this example shows.
+ */
+declare namespace parser {
+ /* copied from postcss -- so we don't need to add a dependency */
+ type ErrorOptions = {
+ plugin?: string;
+ word?: string;
+ index?: number
+ };
+ /* the bits we use of postcss.Rule, copied from postcss -- so we don't need to add a dependency */
+ type PostCSSRuleNode = {
+ selector: string
+ /**
+ * @returns postcss.CssSyntaxError but it's a complex object, caller
+ * should cast to it if they have a dependency on postcss.
+ */
+ error(message: string, options?: ErrorOptions): Error;
+ };
+ /** Accepts a string */
+ type Selectors = string | PostCSSRuleNode
+ type ProcessorFn = (root: parser.Root) => ReturnType;
+ type SyncProcessor = ProcessorFn