This run took 225 seconds.
From eae311ff5fb8914fdda392bc660f6860d75e6af7 Mon Sep 17 00:00:00 2001 From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org> Date: Sat, 29 Mar 2025 05:18:06 +0000 Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.29.1 Change-Id: Iea3b3afe49c2f9934237547b5cd7b0764aa72813 --- package-lock.json | 19 +++++++++++-------- package.json | 2 +- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 022f51e..c3d0a1b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "ajv-formats": "^2.1.1", "csv-parse": "^5.5.3", "eslint": "8.57.0", - "eslint-config-wikimedia": "0.28.2", + "eslint-config-wikimedia": "0.29.1", "eslint-plugin-n": "^16.6.2", "extend": "^3.0.2", "mocha": "^10.3.0", @@ -2249,9 +2249,9 @@ } }, "node_modules/eslint-config-wikimedia": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz", - "integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==", + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.29.1.tgz", + "integrity": "sha512-4dbL5o3hKGSvreyrGZWLPoTDLFubZ575IQOPhUaTcpbTsi0u05TBEMsOyYkthTaK21vsFQqhSYtxp/xU93BSdA==", "dev": true, "dependencies": { "browserslist-config-wikimedia": "^0.7.0", @@ -2264,13 +2264,16 @@ "eslint-plugin-mediawiki": "^0.7.0", "eslint-plugin-mocha": "^10.4.3", "eslint-plugin-n": "^17.7.0", - "eslint-plugin-no-jquery": "^3.0.1", + "eslint-plugin-no-jquery": "^3.1.1", "eslint-plugin-qunit": "^8.1.1", "eslint-plugin-security": "^1.7.1", "eslint-plugin-unicorn": "^53.0.0", "eslint-plugin-vue": "^9.26.0", "eslint-plugin-wdio": "^8.24.12", "eslint-plugin-yml": "^1.14.0" + }, + "engines": { + "node": ">=18 <23" } }, "node_modules/eslint-config-wikimedia/node_modules/brace-expansion": { @@ -2518,9 +2521,9 @@ } }, "node_modules/eslint-plugin-no-jquery": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.1.tgz", - "integrity": "sha512-GrzdjIxox/3x8hpSwpxiMuEQFipiJHTGiVsp0T1TI6GH+KVSbXa4z/56xTV1WiIe66u3iRgvCIipu9CRthecpQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz", + "integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==", "dev": true, "peerDependencies": { "eslint": ">=8.0.0" diff --git a/package.json b/package.json index db2143e..92920a7 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "ajv-formats": "^2.1.1", "csv-parse": "^5.5.3", "eslint": "8.57.0", - "eslint-config-wikimedia": "0.28.2", + "eslint-config-wikimedia": "0.29.1", "eslint-plugin-n": "^16.6.2", "extend": "^3.0.2", "mocha": "^10.3.0", -- 2.39.2
$ date --- stdout --- Sat Mar 29 05:15:13 UTC 2025 --- end --- $ git clone file:///srv/git/mediawiki-services-wikifeeds.git repo --depth=1 -b master --- stderr --- Cloning into 'repo'... --- stdout --- --- end --- $ git config user.name libraryupgrader --- stdout --- --- end --- $ git config user.email tools.libraryupgrader@tools.wmflabs.org --- stdout --- --- end --- $ git submodule update --init --- stdout --- --- end --- $ grr init --- stdout --- Installed commit-msg hook. --- end --- $ git show-ref refs/heads/master --- stdout --- 0a115c3b10887b63379dfc76a8033b39c1ca27c4 refs/heads/master --- end --- $ /usr/bin/npm audit --json --- stdout --- { "auditReportVersion": 2, "vulnerabilities": { "cross-spawn": { "name": "cross-spawn", "severity": "high", "isDirect": false, "via": [ { "source": 1100562, "name": "cross-spawn", "dependency": "cross-spawn", "title": "Regular Expression Denial of Service (ReDoS) in cross-spawn", "url": "https://github.com/advisories/GHSA-3xgq-45jj-v275", "severity": "high", "cwe": [ "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<6.0.6" } ], "effects": [ "pre-commit" ], "range": "<6.0.6", "nodes": [ "node_modules/pre-commit/node_modules/cross-spawn" ], "fixAvailable": { "name": "pre-commit", "version": "1.0.10", "isSemVerMajor": true } }, "limitation": { "name": "limitation", "severity": "moderate", "isDirect": false, "via": [ "wikimedia-kad-fork" ], "effects": [ "service-runner" ], "range": ">=0.2.3", "nodes": [ "node_modules/limitation" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } }, "ms": { "name": "ms", "severity": "moderate", "isDirect": false, "via": [ { "source": 1094419, "name": "ms", "dependency": "ms", "title": "Vercel ms Inefficient Regular Expression Complexity vulnerability", "url": "https://github.com/advisories/GHSA-w9mr-4mfr-499f", "severity": "moderate", "cwe": [ "CWE-1333" ], "cvss": { "score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L" }, "range": "<2.0.0" } ], "effects": [ "wikimedia-kad-fork" ], "range": "<2.0.0", "nodes": [ "node_modules/wikimedia-kad-fork/node_modules/ms" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } }, "pre-commit": { "name": "pre-commit", "severity": "high", "isDirect": true, "via": [ "cross-spawn" ], "effects": [], "range": ">=1.1.0", "nodes": [ "node_modules/pre-commit" ], "fixAvailable": { "name": "pre-commit", "version": "1.0.10", "isSemVerMajor": true } }, "preq": { "name": "preq", "severity": "high", "isDirect": true, "via": [ "request", "requestretry" ], "effects": [], "range": "*", "nodes": [ "node_modules/preq" ], "fixAvailable": false }, "request": { "name": "request", "severity": "moderate", "isDirect": false, "via": [ { "source": 1096727, "name": "request", "dependency": "request", "title": "Server-Side Request Forgery in Request", "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6", "severity": "moderate", "cwe": [ "CWE-918" ], "cvss": { "score": 6.1, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N" }, "range": "<=2.88.2" }, "tough-cookie" ], "effects": [ "preq", "requestretry" ], "range": "*", "nodes": [ "node_modules/request" ], "fixAvailable": false }, "requestretry": { "name": "requestretry", "severity": "high", "isDirect": false, "via": [ { "source": 1090420, "name": "requestretry", "dependency": "requestretry", "title": "Cookie exposure in requestretry", "url": "https://github.com/advisories/GHSA-hjp8-2cm3-cc45", "severity": "high", "cwe": [ "CWE-200" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N" }, "range": "<7.0.0" }, "request" ], "effects": [ "preq" ], "range": "*", "nodes": [ "node_modules/requestretry" ], "fixAvailable": false }, "service-runner": { "name": "service-runner", "severity": "moderate", "isDirect": true, "via": [ "limitation", "tar" ], "effects": [], "range": ">=3.0.0", "nodes": [ "node_modules/service-runner" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } }, "tar": { "name": "tar", "severity": "moderate", "isDirect": false, "via": [ { "source": 1097493, "name": "tar", "dependency": "tar", "title": "Denial of service while parsing a tar file due to lack of folders count validation", "url": "https://github.com/advisories/GHSA-f5x3-32g6-xq36", "severity": "moderate", "cwe": [ "CWE-400" ], "cvss": { "score": 6.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H" }, "range": "<6.2.1" } ], "effects": [ "service-runner" ], "range": "<6.2.1", "nodes": [ "node_modules/tar" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } }, "tough-cookie": { "name": "tough-cookie", "severity": "moderate", "isDirect": false, "via": [ { "source": 1097682, "name": "tough-cookie", "dependency": "tough-cookie", "title": "tough-cookie Prototype Pollution vulnerability", "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3", "severity": "moderate", "cwe": [ "CWE-1321" ], "cvss": { "score": 6.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N" }, "range": "<4.1.3" } ], "effects": [ "request" ], "range": "<4.1.3", "nodes": [ "node_modules/tough-cookie" ], "fixAvailable": false }, "wikimedia-kad-fork": { "name": "wikimedia-kad-fork", "severity": "moderate", "isDirect": false, "via": [ "ms" ], "effects": [ "limitation" ], "range": "*", "nodes": [ "node_modules/wikimedia-kad-fork" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } } }, "metadata": { "vulnerabilities": { "info": 0, "low": 0, "moderate": 7, "high": 4, "critical": 0, "total": 11 }, "dependencies": { "prod": 214, "dev": 419, "optional": 13, "peer": 1, "peerOptional": 0, "total": 644 } } } --- end --- Upgrading n:eslint-config-wikimedia from 0.28.2 -> 0.29.1 $ /usr/bin/npm install --- stderr --- npm WARN deprecated kad-fs@0.0.4: This package is no longer maintained. npm WARN deprecated har-validator@5.1.5: this library is no longer supported npm WARN deprecated kad-memstore@0.0.1: This package is no longer maintained. npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 --- stdout --- added 643 packages, and audited 644 packages in 10s 98 packages are looking for funding run `npm fund` for details 11 vulnerabilities (7 moderate, 4 high) To address all issues possible (including breaking changes), run: npm audit fix --force Some issues need review, and may require choosing a different dependency. Run `npm audit` for details. --- end --- $ package-lock-lint package-lock.json --- stdout --- Checking package-lock.json --- end --- $ package-lock-lint package-lock.json --- stdout --- Checking package-lock.json --- end --- $ ./node_modules/.bin/eslint . --fix --- stdout --- /src/repo/.eslintrc.json 1:1 warning Use the global form of 'use strict' strict /src/repo/app.js 20:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types 64:37 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 136:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 138:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types 150:31 warning Found non-literal argument in require security/detect-non-literal-require 197:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 198:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types 236:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types /src/repo/etc/news-sites.js 4:1 warning At most one access-control tag may be present on a jsdoc block jsdoc/check-access 5:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 6:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 50:1 warning Syntax error in type: {Object.<string, NewsSite>} jsdoc/valid-types /src/repo/lib/announcements.js 30:1 warning Expected this semicolon to be at the end of the previous line semi-style 34:1 warning This line has a length of 123. Maximum allowed is 100 max-len 51:1 warning This line has a length of 134. Maximum allowed is 100 max-len 84:1 warning This line has a length of 119. Maximum allowed is 100 max-len 86:1 warning This line has a length of 118. Maximum allowed is 100 max-len 135:1 warning This line has a length of 123. Maximum allowed is 100 max-len /src/repo/lib/api-util.js 300:1 warning The type 'Application' is undefined jsdoc/no-undefined-types /src/repo/lib/featured.js 136:12 warning 'si' is already declared in the upper scope on line 12 column 7 no-shadow /src/repo/lib/imageinfo.js 30:1 warning The type 'Bool' is undefined jsdoc/no-undefined-types 85:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 132:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 203:43 warning Array.prototype.map() expects a return value from arrow function array-callback-return 280:1 warning Syntax error in type: [type] jsdoc/valid-types 282:1 warning Syntax error in type: [type] jsdoc/valid-types /src/repo/lib/most-read.js 79:1 warning At most one access-control tag may be present on a jsdoc block jsdoc/check-access 80:1 warning @public should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 81:1 warning @public should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 98:1 warning This line has a length of 122. Maximum allowed is 100 max-len 113:28 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 114:1 warning This line has a length of 112. Maximum allowed is 100 max-len 143:19 warning 'pageviews' is already declared in the upper scope on line 10 column 7 no-shadow 159:25 warning Array.prototype.map() expects a return value from arrow function array-callback-return 197:1 warning This line has a length of 144. Maximum allowed is 100 max-len 206:1 warning This line has a length of 113. Maximum allowed is 100 max-len /src/repo/lib/news.js 15:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 73:12 warning 'si' is already declared in the upper scope on line 8 column 7 no-shadow 96:20 warning 'result' is already declared in the upper scope on line 80 column 19 no-shadow /src/repo/lib/on-this-day.js 34:1 warning The type 'Integer' is undefined jsdoc/no-undefined-types 122:1 warning The type 'AnchorElement' is undefined jsdoc/no-undefined-types 123:1 warning The type 'Integer' is undefined jsdoc/no-undefined-types 128:12 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 141:1 warning The type 'AnchorElement' is undefined jsdoc/no-undefined-types 161:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 173:1 warning The type 'AnchorElement' is undefined jsdoc/no-undefined-types 196:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 241:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 257:1 warning The type 'Integer' is undefined jsdoc/no-undefined-types 296:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 307:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 308:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 329:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 347:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 367:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 399:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 413:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 427:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 441:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 455:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 470:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 471:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 530:1 warning Missing JSDoc @param "sendResponse" type jsdoc/require-param-type /src/repo/lib/on-this-day.languages.js 28:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 30:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 32:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 60:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 62:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 64:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 100:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 102:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 104:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 128:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 130:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 132:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 156:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 158:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 160:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 189:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 191:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 193:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 217:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 219:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 221:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 245:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 247:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 249:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 273:13 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 275:13 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 277:13 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 301:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 303:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 305:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 335:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 337:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 339:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 362:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 364:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 366:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 390:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 392:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp /src/repo/lib/pageviews.js 36:1 warning At most one access-control tag may be present on a jsdoc block jsdoc/check-access 37:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 38:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 39:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 53:1 warning The type 'Platform' is undefined jsdoc/no-undefined-types 54:1 warning The type 'Agent' is undefined jsdoc/no-undefined-types 56:1 warning The type 'Granularity' is undefined jsdoc/no-undefined-types 71:1 warning The type 'Platform' is undefined jsdoc/no-undefined-types /src/repo/lib/random.js 38:9 warning 'score' is already declared in the upper scope on line 31 column 10 no-shadow 55:1 warning Missing JSDoc @param "scoredResults" type jsdoc/require-param-type /src/repo/lib/siteinfo.js 3:1 warning Use the global form of 'use strict' strict 10:29 warning Unsafe Regular Expression security/detect-unsafe-regex /src/repo/lib/util.js 104:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 142:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 222:1 warning The type 'Router' is undefined jsdoc/no-undefined-types 280:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 293:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 306:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 378:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 450:34 warning Default parameters should be last default-param-last /src/repo/package-lock.json 1:1 warning Use the global form of 'use strict' strict /src/repo/package.json 1:1 warning Use the global form of 'use strict' strict /src/repo/scripts/check-featured-feed.js 49:35 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 82:44 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 107:34 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 150:30 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 217:5 warning Don't use process.exit(); throw an error instead n/no-process-exit /src/repo/spec.yaml 228:1 warning This line has a length of 154. Maximum allowed is 100 max-len 232:1 warning This line has a length of 141. Maximum allowed is 100 max-len 866:1 warning This line has a length of 117. Maximum allowed is 100 max-len 871:1 warning This line has a length of 116. Maximum allowed is 100 max-len 876:1 warning This line has a length of 116. Maximum allowed is 100 max-len 881:1 warning This line has a length of 116. Maximum allowed is 100 max-len 886:1 warning This line has a length of 116. Maximum allowed is 100 max-len 938:1 warning This line has a length of 108. Maximum allowed is 100 max-len 955:1 warning This line has a length of 126. Maximum allowed is 100 max-len 956:1 warning This line has a length of 107. Maximum allowed is 100 max-len 962:1 warning This line has a length of 132. Maximum allowed is 100 max-len 969:1 warning This line has a length of 127. Maximum allowed is 100 max-len 971:1 warning This line has a length of 108. Maximum allowed is 100 max-len 972:1 warning This line has a length of 113. Maximum allowed is 100 max-len 973:1 warning This line has a length of 121. Maximum allowed is 100 max-len 977:1 warning This line has a length of 121. Maximum allowed is 100 max-len 981:1 warning This line has a length of 113. Maximum allowed is 100 max-len 985:1 warning This line has a length of 111. Maximum allowed is 100 max-len 991:1 warning This line has a length of 124. Maximum allowed is 100 max-len 995:1 warning This line has a length of 281. Maximum allowed is 100 max-len 1082:1 warning This line has a length of 144. Maximum allowed is 100 max-len ✖ 150 problems (0 errors, 150 warnings) --- end --- $ ./node_modules/.bin/eslint . -f json --- stdout --- [{"filePath":"/src/repo/.eslintrc.json","messages":[{"ruleId":"strict","severity":1,"message":"Use the global form of 'use strict'.","line":1,"column":1,"nodeType":"Program","messageId":"global","endLine":38,"endColumn":3}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"{\n\t\"root\": true,\n\t\"extends\": [\n\t\t\"wikimedia/server\"\n\t],\n\t\"rules\": {\n\t\t\"camelcase\": [\n\t\t\t\"error\",\n\t\t\t{\n\t\t\t\t\"properties\": \"never\"\n\t\t\t}\n\t\t],\n\t\t\"indent\": [\n\t\t\t\"off\",\n\t\t\t4\n\t\t],\n\t\t\"no-unused-vars\": [\n\t\t\t\"error\",\n\t\t\t{\n\t\t\t\t\"args\": \"none\"\n\t\t\t}\n\t\t],\n\t\t\"space-in-parens\": [\n\t\t\t\"error\",\n\t\t\t\"never\"\n\t\t],\n\t\t\"computed-property-spacing\": \"off\",\n\t\t\"no-multi-spaces\": \"off\",\n\t\t\"array-bracket-spacing\": \"off\",\n\t\t\"array-callback-return\": \"warn\",\n\t\t\"default-param-last\": \"warn\",\n\t\t\"n/no-process-exit\": \"warn\",\n\t\t\"no-shadow\": \"warn\",\n\t\t\"strict\": \"warn\",\n\t\t\"semi-style\": \"warn\"\n\t}\n}\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/app.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'bluebird' is undefined.","line":20,"column":1,"nodeType":"Block","endLine":20,"endColumn":1},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":64,"column":37,"nodeType":"NewExpression","endLine":64,"endColumn":133},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Application' is undefined.","line":136,"column":1,"nodeType":"Block","endLine":136,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'bluebird' is undefined.","line":138,"column":1,"nodeType":"Block","endLine":138,"endColumn":1},{"ruleId":"security/detect-non-literal-require","severity":1,"message":"Found non-literal argument in require","line":150,"column":31,"nodeType":"CallExpression","endLine":150,"endColumn":61},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Application' is undefined.","line":197,"column":1,"nodeType":"Block","endLine":197,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'bluebird' is undefined.","line":198,"column":1,"nodeType":"Block","endLine":198,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'bluebird' is undefined.","line":236,"column":1,"nodeType":"Block","endLine":236,"endColumn":1}],"suppressedMessages":[{"ruleId":"max-len","severity":1,"message":"This line has a length of 107. Maximum allowed is 100.","line":37,"column":1,"nodeType":"Program","messageId":"max","endLine":37,"endColumn":108,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":8,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst http = require('http');\nconst BBPromise = require('bluebird');\nconst express = require('express');\nconst compression = require('compression');\nconst bodyParser = require('body-parser');\nconst fs = BBPromise.promisifyAll(require('fs'));\nconst sUtil = require('./lib/util');\nconst apiUtil = require('./lib/api-util');\nconst packageInfo = require('./package.json');\nconst yaml = require('js-yaml');\nconst addShutdown = require('http-shutdown');\nconst path = require('path');\n\n/**\n * Creates an express app and initialises it\n *\n * @param {Object} options the options to initialise the app with\n * @return {bluebird} the promise resolving to the app object\n */\nfunction initApp(options) {\n\n // the main application object\n const app = express();\n\n // get the options and make them available in the app\n app.logger = options.logger; // the logging device\n app.metrics = options.metrics; // the metrics\n app.conf = options.config; // this app's config options\n app.info = packageInfo; // this app's package info\n\n // ensure some sane defaults\n app.conf.port = app.conf.port || 8888;\n app.conf.interface = app.conf.interface || '0.0.0.0';\n // eslint-disable-next-line max-len\n app.conf.compression_level = app.conf.compression_level === undefined ? 3 : app.conf.compression_level;\n app.conf.cors = app.conf.cors === undefined ? '*' : app.conf.cors;\n if (app.conf.csp === undefined) {\n app.conf.csp = \"default-src 'self'; object-src 'none'; media-src *; img-src *; style-src *; frame-ancestors 'self'\";\n }\n\n // set outgoing proxy\n if (app.conf.proxy) {\n process.env.HTTP_PROXY = app.conf.proxy;\n // if there is a list of domains which should\n // not be proxied, set it\n if (app.conf.no_proxy_list) {\n if (Array.isArray(app.conf.no_proxy_list)) {\n process.env.NO_PROXY = app.conf.no_proxy_list.join(',');\n } else {\n process.env.NO_PROXY = app.conf.no_proxy_list;\n }\n }\n }\n\n // set up header allow listing for logging\n if (!app.conf.log_header_allowlist) {\n app.conf.log_header_allowlist = [\n 'cache-control', 'content-type', 'content-length', 'if-match',\n 'user-agent', 'x-request-id'\n ];\n }\n app.conf.log_header_allowlist = new RegExp(`^(?:${ app.conf.log_header_allowlist.map((item) => item.trim()).join('|') })$`, 'i');\n\n // set up the request templates for the APIs\n apiUtil.setupApiTemplates(app);\n\n // set up the spec\n if (!app.conf.spec) {\n app.conf.spec = `${ __dirname }/spec.yaml`;\n }\n if (app.conf.spec.constructor !== Object) {\n try {\n app.conf.spec = yaml.load(fs.readFileSync(app.conf.spec));\n } catch (e) {\n app.logger.log('warn/spec', `Could not load the spec: ${ e }`);\n app.conf.spec = {};\n }\n }\n if (!app.conf.spec.swagger) {\n app.conf.spec.swagger = '2.0';\n }\n if (!app.conf.spec.info) {\n app.conf.spec.info = {\n version: app.info.version,\n title: app.info.name,\n description: app.info.description\n };\n }\n app.conf.spec.info.version = app.info.version;\n if (!app.conf.spec.paths) {\n app.conf.spec.paths = {};\n }\n\n // set the CORS and CSP headers\n app.all('*', (req, res, next) => {\n if (app.conf.cors !== false) {\n res.header('access-control-allow-origin', app.conf.cors);\n res.header('access-control-allow-headers', 'accept, x-requested-with, content-type');\n res.header('access-control-expose-headers', 'etag');\n }\n if (app.conf.csp !== false) {\n res.header('x-xss-protection', '1; mode=block');\n res.header('x-content-type-options', 'nosniff');\n res.header('x-frame-options', 'SAMEORIGIN');\n res.header('content-security-policy', app.conf.csp);\n res.header('x-content-security-policy', app.conf.csp);\n res.header('x-webkit-csp', app.conf.csp);\n }\n sUtil.initAndLogRequest(req, app);\n next();\n });\n\n // set up the user agent header string to use for requests\n app.conf.user_agent = app.conf.user_agent || app.info.name;\n\n // disable the X-Powered-By header\n app.set('x-powered-by', false);\n // disable the ETag header - users should provide them!\n app.set('etag', false);\n // enable compression\n app.use(compression({ level: app.conf.compression_level }));\n // use the JSON body parser\n app.use(bodyParser.json({ limit: app.conf.max_body_size || '100kb' }));\n // use the application/x-www-form-urlencoded parser\n app.use(bodyParser.urlencoded({ extended: true }));\n\n return BBPromise.resolve(app);\n\n}\n\n/**\n * Loads all routes declared in routes/ into the app\n *\n * @param {Application} app the application object to load routes into\n * @param {string} dir routes folder\n * @return {bluebird} a promise resolving to the app object\n */\nfunction loadRoutes(app, dir) {\n\n // recursively load routes from .js files under routes/\n return fs.readdirAsync(dir).map((fname) => BBPromise.try(() => {\n const resolvedPath = path.resolve(dir, fname);\n const isDirectory = fs.statSync(resolvedPath).isDirectory();\n if (isDirectory) {\n loadRoutes(app, resolvedPath);\n } else if (/\\.js$/.test(fname)) {\n // import the route file\n const route = require(`${ dir }/${ fname }`);\n return route(app);\n }\n }).then((route) => {\n if (route === undefined) {\n return undefined;\n }\n // check that the route exports the object we need\n if (route.constructor !== Object || !route.path || !route.router ||\n !(route.api_version || route.skip_domain)) {\n throw new TypeError(`routes/${ fname } does not export the correct object!`);\n }\n // normalise the path to be used as the mount point\n if (route.path[0] !== '/') {\n route.path = `/${ route.path }`;\n }\n if (route.path[route.path.length - 1] !== '/') {\n route.path = `${ route.path }/`;\n }\n if (!route.skip_domain) {\n route.path = `/:domain/v${ route.api_version }${ route.path }`;\n }\n // wrap the route handlers with Promise.try() blocks\n sUtil.wrapRouteHandlers(route, app);\n // all good, use that route\n\n // HACK: return 404 for yue.wikipedia.org domain\n app.use((req, res, next) => {\n if (req.url.startsWith('/yue.wikipedia.org/')) {\n res.status(404).end('Domain not found');\n return;\n }\n next();\n });\n app.use(route.path, route.router);\n })).then(() => {\n // catch errors\n sUtil.setErrorHandler(app);\n // route loading is now complete, return the app object\n return BBPromise.resolve(app);\n });\n\n}\n\n/**\n * Creates and start the service's web server\n *\n * @param {Application} app the app object to use in the service\n * @return {bluebird} a promise creating the web server\n */\nfunction createServer(app) {\n\n // return a promise which creates an HTTP server,\n // attaches the app to it, and starts accepting\n // incoming client requests\n let server;\n return new BBPromise((resolve) => {\n server = http.createServer(app).listen(\n app.conf.port,\n app.conf.interface,\n resolve\n );\n server = addShutdown(server);\n }).then(() => {\n app.logger.log('info',\n `Worker ${ process.pid } listening on ${ app.conf.interface || '*' }:${ app.conf.port }`);\n\n // Don't delay incomplete packets for 40ms (Linux default) on\n // pipelined HTTP sockets. We write in large chunks or buffers, so\n // lack of coalescing should not be an issue here.\n server.on('connection', (socket) => {\n socket.setNoDelay(true);\n });\n\n return server;\n });\n\n}\n\n/**\n * The service's entry point. It takes over the configuration\n * options and the logger- and metrics-reporting objects from\n * service-runner and starts an HTTP server, attaching the application\n * object to it.\n *\n * @param {Object} options the options to initialise the app with\n * @return {bluebird} HTTP server\n */\nmodule.exports = (options) => initApp(options)\n .then((app) => loadRoutes(app, `${ __dirname }/routes`))\n .then((app) => {\n // serve static files from static/\n app.use('/static', express.static(`${ __dirname }/static`));\n return app;\n }).then(createServer);\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/config.dev.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/config.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/dist/config.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/etc/announcements.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/etc/news-sites.js","messages":[{"ruleId":"jsdoc/check-access","severity":1,"message":"At most one access-control tag may be present on a jsdoc block.","line":4,"column":1,"nodeType":"Block","endLine":7,"endColumn":4},{"ruleId":"jsdoc/valid-types","severity":1,"message":"@private should not have a bracketed type in \"jsdoc\" mode.","line":5,"column":1,"nodeType":"Block","endLine":5,"endColumn":1},{"ruleId":"jsdoc/valid-types","severity":1,"message":"@private should not have a bracketed type in \"jsdoc\" mode.","line":6,"column":1,"nodeType":"Block","endLine":6,"endColumn":1},{"ruleId":"jsdoc/valid-types","severity":1,"message":"Syntax error in type: {Object.<string, NewsSite>}","line":50,"column":1,"nodeType":"Block","endLine":50,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/* eslint no-underscore-dangle: 0 */\n'use strict';\n\n/**\n * @private {!string} _title\n * @private {!string} _headlineSelector\n */\nclass NewsSite {\n /**\n * @param {!string} title\n * @param {!string} headlineSelectorAll\n * @param {!string} topicAnchorSelector\n */\n constructor(title, headlineSelectorAll, topicAnchorSelector) {\n this._title = title;\n this._headlineSelectorAll = headlineSelectorAll;\n this._topicAnchorSelector = topicAnchorSelector;\n }\n\n /**\n * @return {!string} News source wiki portal or template title to scrape\n * data from\n */\n get title() {\n return this._title;\n }\n\n /**\n * @return {!string} Query selector for news headline containers (not\n * specific categories like deaths, sports, etc)\n */\n get headlineSelectorAll() {\n return this._headlineSelectorAll;\n }\n\n /**\n * @return {!string} Query selector for news headline subject links; this\n * selector should be used on a headline element\n */\n get topicAnchorSelector() {\n return this._topicAnchorSelector;\n }\n}\n\nconst STORY_SELECTOR = '.itn-story';\nconst TOPIC_SELECTOR_LINK = 'a[rel=\"mw:WikiLink\"]:nth-of-type(1)';\nconst TOPIC_SELECTOR_BOLD_LINK = 'b:nth-of-type(1) a[rel=\"mw:WikiLink\"]';\n\n/**\n * @type {{Object.<string, NewsSite>}} A map of Wikipedia site languages codes to NewsSites\n */\nmodule.exports = {\n test: new NewsSite('InTheNewsFormatExample', STORY_SELECTOR, TOPIC_SELECTOR_BOLD_LINK),\n bs: new NewsSite('Šablon:Vijesti', STORY_SELECTOR, TOPIC_SELECTOR_BOLD_LINK),\n da: new NewsSite('Skabelon:Forside_aktuelle_begivenheder', 'div > ul > li', TOPIC_SELECTOR_BOLD_LINK),\n de: new NewsSite('Wikipedia:Hauptseite/Aktuelles', 'ul:not(.breadcrumb-nav-container) > li', TOPIC_SELECTOR_LINK),\n el: new NewsSite('Πύλη:Τρέχοντα_γεγονότα/Επικεφαλίδες', 'li', TOPIC_SELECTOR_LINK),\n en: new NewsSite('Template:In_the_news', 'section > ul > li', TOPIC_SELECTOR_BOLD_LINK),\n es: new NewsSite('Portal:Actualidad', 'div:nth-of-type(2) > div > ul:nth-of-type(1) > li', TOPIC_SELECTOR_LINK),\n fi: new NewsSite('Malline:Uutisissa', 'body > section > ul > li', TOPIC_SELECTOR_BOLD_LINK),\n fr: new NewsSite('Modèle:Accueil_actualité', 'section > ul > li', TOPIC_SELECTOR_BOLD_LINK),\n he: new NewsSite('תבנית:חדשות_ואקטואליה', 'section > ul > li', TOPIC_SELECTOR_LINK),\n ko: new NewsSite('틀:새로_들어온_소식', 'body > section > ul > li', TOPIC_SELECTOR_BOLD_LINK),\n no: new NewsSite('Mal:Aktuelt', 'ul > li', TOPIC_SELECTOR_BOLD_LINK),\n pl: new NewsSite('Szablon:Aktualności', 'ul:last-of-type > li', TOPIC_SELECTOR_BOLD_LINK),\n pt: new NewsSite('Portal:Eventos_atuais', 'table:nth-of-type(2) div:not(.hlist) > ul > li', TOPIC_SELECTOR_BOLD_LINK),\n ru: new NewsSite('Шаблон:Текущие_события_на_заглавной_странице', 'section > ul > li', TOPIC_SELECTOR_BOLD_LINK),\n sco: new NewsSite('Template:In_the_news', 'section > ul > li', TOPIC_SELECTOR_BOLD_LINK), // see en\n sv: new NewsSite('Portal:Huvudsida/Aktuella händelser', 'body > section > ul > li', TOPIC_SELECTOR_BOLD_LINK),\n vi: new NewsSite('Bản_mẫu:Tin_tức', 'ul > li', TOPIC_SELECTOR_BOLD_LINK)\n};\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/announcements.js","messages":[{"ruleId":"semi-style","severity":1,"message":"Expected this semicolon to be at the end of the previous line.","line":30,"column":1,"nodeType":null,"messageId":"expectedSemiColon","endLine":30,"endColumn":2},{"ruleId":"max-len","severity":1,"message":"This line has a length of 123. Maximum allowed is 100.","line":34,"column":1,"nodeType":"Program","messageId":"max","endLine":34,"endColumn":124},{"ruleId":"max-len","severity":1,"message":"This line has a length of 134. Maximum allowed is 100.","line":51,"column":1,"nodeType":"Program","messageId":"max","endLine":51,"endColumn":135},{"ruleId":"max-len","severity":1,"message":"This line has a length of 119. Maximum allowed is 100.","line":84,"column":1,"nodeType":"Program","messageId":"max","endLine":84,"endColumn":120},{"ruleId":"max-len","severity":1,"message":"This line has a length of 118. Maximum allowed is 100.","line":86,"column":1,"nodeType":"Program","messageId":"max","endLine":86,"endColumn":119},{"ruleId":"max-len","severity":1,"message":"This line has a length of 123. Maximum allowed is 100.","line":135,"column":1,"nodeType":"Program","messageId":"max","endLine":135,"endColumn":124}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst config = require('../etc/announcements');\nconst HTTPError = require('./util').HTTPError;\nconst striptags = require('striptags');\n\nconst plaintextFromHTML = (html) => {\n const htmlWithSpacesAndNewlines = html.replace(/ /ig, ' ').replace(/<br\\/>/ig, '\\n');\n return striptags(htmlWithSpacesAndNewlines);\n};\n\n/**\n * @param {!Object} campaign object, as seen in etc/announcements.js\n * @param {!string} os operating system, all caps ('IOS' or 'ANDROID')\n * @param {?string} id another string to distinguish different announcements, all caps\n * @return {!string} announcement id string\n */\nconst buildId = (campaign, os, id) => `${ campaign.idPrefix }${ os }${ id }`;\n\nconst baseAnnouncement = (campaign) => ({\n type: campaign.type,\n start_time: campaign.startTime,\n end_time: campaign.endTime,\n domain: campaign.domain\n })\n\n // beta: true,\n // logged_in: true,\n // reading_list_sync_enabled: true,\n;\n\nconst getFundraisingAnnouncementText = (countryConfig) => `<b>Wikipedia is still not on the market.</b><br><i>An important update from Jimmy Wales</i><br><br>Please don’t skip this 1-minute read. Today I ask you to reflect on the number of times you have used Wikipedia this year, the value you got from it, and whether you’re able to give ${ countryConfig.currency }${ countryConfig.coffee } to the nonprofit that supports it. Wikipedia is written by everyone, together. We want everyone to have equal access to high-quality information. If Wikipedia has given you ${ countryConfig.currency }${ countryConfig.coffee } worth of knowledge, please join the 2% of readers who donate. There are no small contributions: every edit counts, every donation counts. Thank you. — <i>Jimmy Wales, founder, Wikimedia Foundation</i>`;\n\nconst androidV2FundraisingAnnouncement = (code, countryConfig, campaign) => Object.assign({}, baseAnnouncement(campaign), {\n id: buildId(campaign, 'ANDROIDV2', 'EN'),\n platforms: [ config.Platform.ANDROID_V2 ],\n countries: [ code.toUpperCase() ],\n border: countryConfig.border,\n placement: countryConfig.placement,\n text: getFundraisingAnnouncementText(countryConfig),\n // image_url: countryConfig.imageUrl,\n // image_height: 40,\n caption_HTML: \"By donating, you agree to our <a href='https://foundation.wikimedia.org/wiki/Donor_privacy_policy/en'>donor policy</a>.\",\n negative_text: 'No thanks',\n action: {\n title: 'DONATE NOW',\n url: 'https://donate.wikimedia.org/?uselang=en&appeal=JimmyQuote&utm_medium=WikipediaApp&utm_campaign=Android&utm_source=app_2023_en6C_Android_control'\n }\n });\n\nconst japanFundraisingAnnouncement = (code, countryConfig, campaign, os, platforms) => Object.assign({}, baseAnnouncement(campaign), {\n id: buildId(campaign, os.toUpperCase(), code.toUpperCase()),\n platforms: platforms,\n countries: [ code.toUpperCase() ],\n border: countryConfig.border,\n placement: countryConfig.placement,\n text: '<b>ウィキペディアは売り物ではありません。</b><br>ジミー・ウェールズから皆様へのメッセージ<br>1分で結構です、どうか読み飛ばさないでください。今日は皆様に、ぜひお考えいただきたいことがあります。この1年間でウィキペディア アプリをどれほど使い、そこでどんな価値を得たか、そして¥300 のご寄付が可能かどうかです。ウィキメディア財団のウィキペディアを含むプロジェクト群を支える技術は、読者の皆様によって支えられています。非営利団体であるということは、誰かがウィキペディアを買い取り、好き勝手にする危険性がないことを意味します。この一年、もしあなたがウィキペディアから得た情報に¥300 の価値があったと思っていただけるのでしたら、ご寄付をお寄せいただけないでしょうか。感謝を込めて。— ジミー・ウェールズ(ウィキメディア財団創設者)',\n negative_text: 'けっこうです',\n action: {\n title: '今すぐ寄付する',\n url: `https://donate.wikimedia.org/?uselang=ja&appeal=JimmyQuote&utm_medium=WikipediaApp&utm_campaign=${ os }&utm_source=app_2023_jaJP_${ os }_control&monthlyconvert=Default`\n }\n });\n\nconst androidV2SurveyAnnouncement = (campaign) => Object.assign({}, baseAnnouncement(campaign), {\n id: buildId(campaign, 'ANDROIDV2', 'EN'),\n platforms: [ config.Platform.ANDROID_V2 ],\n countries: [ 'AL', 'DZ', 'AO', 'AR', 'AM', 'AU', 'AT', 'AZ', 'BD', 'BY', 'BR', 'BG', 'CM', 'CA', 'CF', 'TD',\n 'CL', 'CO', 'KM', 'CR', 'CI', 'HR', 'CY', 'CZ', 'DK', 'EC', 'EG', 'SV', 'EE', 'ET', 'DE', 'GH', 'GR', 'GT',\n 'GN', 'HN', 'HK', 'HU', 'IN', 'ID', 'IE', 'IT', 'JM', 'JP', 'KE', 'KR', 'LV', 'LB', 'LT', 'MG', 'MW', 'MY',\n 'ML', 'MQ', 'MR', 'MX', 'MA', 'MZ', 'NL', 'NG', 'PK', 'PY', 'PE', 'PH', 'PL', 'PT', 'PR', 'RO', 'SN', 'RS',\n 'SG', 'SK', 'SI', 'ZA', 'ES', 'SE', 'CH', 'TW', 'TZ', 'TN', 'TR', 'UG', 'GB', 'US', 'UY', 'ZM', 'ZW' ],\n border: false,\n placement: 'feed',\n text: 'Help to improve the Wikipedia mobile apps by signing up to be a user tester. Take a quick survey to participate in an upcoming study or research interview.',\n caption_HTML: \"View our <a href='https://foundation.m.wikimedia.org/w/index.php?title=Editing_Awareness_and_Trust_Survey_Privacy_Statement'>privacy statement</a>. Survey powered by a third party. View their <a href='https://policies.google.com/privacy'>privacy policy</a>.\",\n negative_text: 'No thanks',\n action: {\n title: 'Start survey',\n url: 'https://forms.gle/DUWfFRoD9nqgStJZ7'\n }\n });\n\nconst iosV2FundraisingAnnouncement = (code, countryConfig, campaign) => Object.assign({}, baseAnnouncement(campaign), {\n id: buildId(campaign, 'IOSV2', 'EN'),\n platforms: [ config.Platform.IOS_V2, config.Platform.IOS_V3, config.Platform.IOS_V4, config.Platform.IOS_V5 ],\n countries: [ code.toUpperCase() ],\n border: countryConfig.border,\n placement: countryConfig.placement,\n text: getFundraisingAnnouncementText(countryConfig),\n caption_HTML: \"By donating, you agree to our <a href='https://foundation.wikimedia.org/wiki/Donor_privacy_policy/en'>donor policy</a>.\",\n negative_text: 'No thanks',\n action: {\n title: 'DONATE NOW',\n url: 'https://donate.wikimedia.org/?uselang=en&appeal=JimmyQuote&utm_medium=WikipediaApp&utm_campaign=iOS&utm_source=app_2023_en6C_iOS_control'\n }\n });\n\nconst iOSAaaLDArticleTitles = [];\n\nconst iosV4SurveyAnnouncement = (campaign) => Object.assign({}, baseAnnouncement(campaign), {\n id: buildId(campaign, 'IOSV4', 'EN'),\n platforms: [ config.Platform.IOS_V4 ],\n border: false,\n placement: 'article',\n text: 'Help improve Wikipedia by taking a quick survey about this article',\n caption_HTML: \"View our <a href='https://foundation.m.wikimedia.org/w/index.php?title=Editing_Awareness_and_Trust_Survey_Privacy_Statement'>privacy statement</a>. Survey powered by a third-party. View their <a href='https://policies.google.com/privacy'>privacy policy</a>.\",\n negative_text: 'No thanks',\n percent_receiving_experiment: 50,\n action: {\n title: 'Start survey',\n url: 'https://docs.google.com/forms/d/e/1FAIpQLSdQ34Nz6u7Uhc6A3mTk5XwGdWVKwJpQfCZ4Jlx32QHhI6fx9Q/viewform?usp=pp_url&entry.135304298={{articleTitle}}&entry.1794192386={{didSeeModal}}&entry.1315551869={{isInExperiment}}'\n },\n articleTitles: iOSAaaLDArticleTitles,\n displayDelay: 30\n });\n\nconst iosAaaLDSurveyAnnouncement = (campaign) => Object.assign({}, baseAnnouncement(campaign), {\n id: buildId(campaign, 'IOS', 'SURVEY20-1'),\n platforms: [ config.Platform.IOS_V5 ],\n border: false,\n placement: 'article',\n text: 'Help improve Wikipedia by taking a quick survey about this article',\n caption_HTML: \"View our <a href='https://foundation.m.wikimedia.org/w/index.php?title=Editing_Awareness_and_Trust_Survey_Privacy_Statement'>privacy statement</a>. Survey powered by a third-party. View their <a href='https://policies.google.com/privacy'>privacy policy</a>.\",\n negative_text: 'No thanks',\n percent_receiving_experiment: 50,\n action: {\n title: 'Start survey',\n url: 'https://docs.google.com/forms/d/e/1FAIpQLSdQ34Nz6u7Uhc6A3mTk5XwGdWVKwJpQfCZ4Jlx32QHhI6fx9Q/viewform?usp=pp_url&entry.135304298={{articleTitle}}&entry.1794192386={{didSeeModal}}&entry.1315551869={{isInExperiment}}'\n },\n articleTitles: iOSAaaLDArticleTitles,\n displayDelay: 30\n });\n\nconst iosLegacyFundraisingAnnouncement = (code, countryConfig, campaign) => Object.assign({}, baseAnnouncement(campaign), {\n id: buildId(campaign, 'IOS', 'EN'),\n platforms: [ config.Platform.IOS ],\n countries: [ code.toUpperCase() ],\n min_version: '5.8.0',\n max_version: '6.1.0',\n caption_HTML: \"<p>By donating, you agree to our <a href='https://foundation.wikimedia.org/wiki/Donor_privacy_policy/en'>donor policy</a></p>.\",\n border: countryConfig.border,\n placement: countryConfig.placement,\n text: plaintextFromHTML(getFundraisingAnnouncementText(countryConfig)),\n action: {\n title: 'DONATE NOW',\n url: 'https://donate.wikimedia.org/?uselang=en&appeal=JimmyQuote&utm_medium=WikipediaApp&utm_campaign=iOS&utm_source=app_2023_en6C_iOS_control'\n }\n });\n\nfunction getAndroidFundraisingAnnouncements(campaign) {\n return Object.keys(campaign.countryVars)\n .map((code) => androidV2FundraisingAnnouncement(code, campaign.countryVars[code], campaign));\n}\n\nfunction getAndroidSurveyAnnouncements(campaign) {\n return [].concat(androidV2SurveyAnnouncement(campaign));\n}\n\nfunction getiOSFundraisingAnnouncements(campaign) {\n return Object.keys(campaign.countryVars)\n .map((code) => iosV2FundraisingAnnouncement(code, campaign.countryVars[code], campaign));\n}\n\nfunction getiOSSurveyAnnouncements(campaign) {\n return [].concat(iosV4SurveyAnnouncement(campaign));\n}\n\nfunction getiOSAaaLDSurveyAnnouncements(campaign) {\n return [].concat(iosAaaLDSurveyAnnouncement(campaign));\n}\n\nfunction getLegacyiOSFundraisingAnnouncements(campaign) {\n return Object.keys(campaign.countryVars)\n .map((code) => iosLegacyFundraisingAnnouncement(code, campaign.countryVars[code], campaign));\n}\n\nfunction getAnnouncementsForCampaign(campaign) {\n switch (campaign.idPrefix) {\n case 'INDIAFUNDRAISING23':\n return getAndroidFundraisingAnnouncements(campaign)\n .concat(getiOSFundraisingAnnouncements(campaign))\n .concat(getLegacyiOSFundraisingAnnouncements(campaign));\n case 'JAPANFUNDRAISING23':\n return Object.keys(campaign.countryVars).map((code) => japanFundraisingAnnouncement(code, campaign.countryVars[code], campaign, 'iOS', [ config.Platform.IOS_V2, config.Platform.IOS_V3, config.Platform.IOS_V4, config.Platform.IOS_V5 ]))\n .concat(Object.keys(campaign.countryVars).map((code) => japanFundraisingAnnouncement(code, campaign.countryVars[code], campaign, 'Android', [ config.Platform.ANDROID_V2 ])));\n case 'INDIAFUNDRAISING22':\n return getAndroidFundraisingAnnouncements(campaign);\n case 'FUNDRAISING23':\n return getAndroidFundraisingAnnouncements(campaign)\n .concat(getiOSFundraisingAnnouncements(campaign))\n .concat(getLegacyiOSFundraisingAnnouncements(campaign));\n case 'IOSSURVEY20':\n return getiOSSurveyAnnouncements(campaign);\n case 'IOSAAALDSURVEY':\n return getiOSAaaLDSurveyAnnouncements(campaign);\n case 'ANDROIDSURVEY20':\n return getAndroidSurveyAnnouncements(campaign);\n }\n}\n\nfunction hasEnded(campaign, now) {\n const endDate = Date.parse(campaign.endTime);\n if (isNaN(endDate)) {\n throw new HTTPError({\n status: 500,\n type: 'config_error',\n title: 'invalid end date in announcements config',\n detail: config.endTime\n });\n }\n return now > endDate;\n}\n\nfunction getActiveCampaigns(domain, now) {\n return config.campaigns.filter((campaign) => campaign.activeWikis.includes(domain) &&\n !hasEnded(campaign, now));\n}\n\nfunction getAnnouncements(domain) {\n const announcements = [];\n const activeCampaigns = getActiveCampaigns(domain, new Date());\n activeCampaigns.forEach((campaign) => {\n announcements.push(...getAnnouncementsForCampaign(campaign));\n });\n\n return {\n announce: announcements\n };\n}\n\nmodule.exports = {\n getAnnouncements,\n testing: {\n buildId,\n getActiveCampaigns,\n getAnnouncementsForCampaign,\n getAndroidFundraisingAnnouncements,\n getiOSFundraisingAnnouncements,\n getLegacyiOSFundraisingAnnouncements,\n hasEnded\n }\n};\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/api-util.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Application' is undefined.","line":300,"column":1,"nodeType":"Block","endLine":300,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst axios = require('axios').default;\nconst axiosRetry = require('axios-retry').default;\nconst BBPromise = require('bluebird');\nconst sUtil = require('./util');\nconst Template = require('swagger-router').Template;\nconst HTTPError = sUtil.HTTPError;\nconst uuid = require('cassandra-uuid').TimeUuid;\n\nconst isRedirect = (status) => status < 400 && status >= 300;\n\n/**\n * Make outgoing HTTP request using axios\n *\n * @param {Object} outReq Outgoing request\n * @param {Object} parentReq Incoming request\n * @return {Promise} outgoing request config\n */\nfunction makeOutgoingRequest(outReq, parentReq) {\n const httpConf = parentReq.app.conf.http_client || {};\n\n // Log each outgoing request on incoming request logger\n const loggerInterceptor = (config) => {\n parentReq.logger.log('trace/req', { msg: 'Outgoing request', out_request: outReq });\n return config;\n };\n\n // Handle service mesh redirects\n const serviceMeshInterceptor = ((response) => {\n if (isRedirect(response.status)) {\n const location = response.headers.location;\n try {\n // Redirect location is absolute\n const nextURL = new URL(response.headers.location);\n response.config.url.pathname = nextURL.pathname;\n response.config.headers.host = nextURL.hostname;\n } catch (err) {\n // Redirect location is relative\n response.config.url = new URL(location, response.config.url);\n }\n return axios.request(response.config);\n }\n return response;\n });\n\n Object.assign(outReq.headers, {\n 'user-agent': parentReq.app.conf.user_agent,\n 'x-request-id': parentReq.headers['x-request-id']\n });\n\n const reqConfig = {\n url: new URL(outReq.uri),\n method: outReq.method,\n headers: outReq.headers,\n timeout: httpConf.timeout || 2 * 60 * 1000,\n validateStatus: httpConf.status_validator || ((status) => status < 400)\n };\n\n // Ensure requests are retried in case of failure\n axiosRetry(axios, { retries: httpConf.retries || 3 });\n\n axios.interceptors.request.use(loggerInterceptor);\n if (httpConf.use_service_mesh) {\n // Manually handle redirects for service mesh\n reqConfig.maxRedirects = 0;\n axios.interceptors.response.use(serviceMeshInterceptor);\n }\n\n return axios.request(reqConfig);\n}\n\n/**\n * Calls the MW REST API with the supplied query as its body\n *\n * @param {!Object} req the incoming request object\n * @param {?Object} addlHeaders additional headers to pass to the MW API\n * @return {!Promise} a promise resolving as the response object from the MW API\n */\nfunction mwCorePageHTMLGet(req, addlHeaders) {\n const rev = req.params.revision;\n const title = encodeURIComponent(req.params.title);\n const corePageReq = req.app.mwrestapi_tpl.expand({\n request: {\n headers: addlHeaders,\n params: {\n path: rev ? `revision/${ rev }/with_html` : `page/${ title }/with_html`,\n domain: req.params.domain\n }\n }\n });\n\n return makeOutgoingRequest(corePageReq, req).then((response) => {\n // Compat: rewrite etag header and body to be the same format as the\n // responses from parsoid on restbase\n const html = response.data.html;\n const revision = response.data.id;\n const timestamp = response.data.timestamp;\n const tid = uuid.fromDate(new Date(timestamp)).toString();\n const etag = `${ revision }/${ tid }`;\n response.body = html;\n response.headers.etag = etag;\n return response;\n });\n}\n\n/**\n * Calls the MW API with the supplied query as its body\n *\n * @param {!Object} req the incoming request object\n * @param {?Object} query an object with all the query parameters for the MW API\n * @param {?string} altDomain domain to query, if other than the original request domain\n * @param {?Object} addlHeaders additional headers to pass to the MW API\n * @return {!Promise} a promise resolving as the response object from the MW API\n */\nfunction mwApiGet(req, query, altDomain, addlHeaders) {\n\n const app = req.app;\n query = Object.assign({\n format: 'json',\n formatversion: 2\n }, query);\n\n const request = app.mwapi_tpl.expand({\n request: {\n params: { domain: altDomain || req.params.domain },\n headers: req.headers,\n query\n }\n });\n Object.assign(request.headers, addlHeaders);\n\n return req.issueRequest(request).then((response) => {\n if (response.status < 200 || response.status > 399) {\n // there was an error when calling the upstream service, propagate that\n return BBPromise.reject(new HTTPError({\n status: response.status,\n type: 'api_error',\n title: 'MW API error',\n detail: response.body\n }));\n }\n return response;\n });\n\n}\n\n/**\n * For use by `restApiGet` and `restGatewayGet`.\n *\n * @ignore\n *\n * @throws {Error} If the domain is unspecified and cannot be retreived from\n * the incoming request\n * @throws {Error} If the path is unspecified\n */\nfunction prepareReqParams(req, path, reqParams) {\n\n if (path.constructor === Object) {\n reqParams = path;\n path = undefined;\n }\n reqParams = reqParams || {};\n reqParams.method = reqParams.method || 'get';\n reqParams.query = reqParams.query || {};\n reqParams.headers = reqParams.headers || {};\n reqParams.params = reqParams.params || {};\n reqParams.params.path = path || reqParams.params.path;\n reqParams.params.domain = reqParams.params.domain || req.params.domain;\n\n if (!reqParams.params.path) {\n throw new Error('The path must be specified.');\n }\n\n if (!reqParams.params.domain) {\n throw new Error('The domain must be specified or retrievable from the incoming request.');\n }\n\n reqParams.params.path = reqParams.params.path[0] === '/' ?\n reqParams.params.path.slice(1) : reqParams.params.path;\n\n return reqParams;\n}\n\n/**\n * Calls the REST API with the supplied parameters.\n *\n * @param {!Object} req the incoming request object\n * @param {?string} path the API path to contact without the leading slash\n * @param {?Object} [reqParams={}] the object containing request details\n * @param {!string} [reqParams.path] the path\n * @param {?string} [reqParams.domain] the domain, defaulting to `req.params.domain`\n * @param {?string} [reqParams.method=get] the request method\n * @param {?Object} [reqParams.query={}] the query string to send, if any\n * @param {?Object} [reqParams.headers={}] the request headers to send\n * @param {?Object} [reqParams.body=null] the body of the request, if any\n * @return {!Promise} a promise resolving as the response object from the API\n * or rejecting if the domain or path were unspecified or couldn't be\n * retrieved from the incoming request\n */\nfunction restApiGet(req, path, reqParams) {\n\n try {\n return req.issueRequest(req.app.restbase_tpl.expand({\n request: prepareReqParams(req, path, reqParams)\n }));\n } catch (e) {\n return BBPromise.reject(new HTTPError({\n status: 500,\n type: 'internal_error',\n title: 'Invalid internal call',\n detail: 'domain and path need to be defined for the REST API call'\n }));\n }\n\n}\n\n/**\n * Calls the REST Gateway-proxied API with the supplied parameters.\n *\n * @param {!Object} req the incoming request object\n * @param {?string} path the API path to contact without the leading slash\n * @param {?Object} [reqParams={}] the object containing request details\n * @param {!string} [reqParams.path] the path\n * @param {?string} [reqParams.domain] the domain, defaulting to `req.params.domain`\n * @param {?string} [reqParams.method=get] the request method\n * @param {?Object} [reqParams.query={}] the query string to send, if any\n * @param {?Object} [reqParams.headers={}] the request headers to send\n * @param {?Object} [reqParams.body=null] the body of the request, if any\n * @return {!Promise} a promise resolving as the response object from the API\n * or rejecting if the domain or path were unspecified or couldn't be\n * retrieved from the incoming request\n */\nfunction restGatewayGet(req, path, reqParams) {\n\n try {\n return req.issueRequest(req.app.rest_gateway_req.expand({\n request: prepareReqParams(req, path, reqParams)\n }));\n } catch (e) {\n return BBPromise.reject(new HTTPError({\n status: 500,\n type: 'internal_error',\n title: 'Invalid internal call',\n detail: 'domain and path need to be defined for the REST Gateway API call'\n }));\n }\n\n}\n\nfunction mwGet(req, title, addlHeaders) {\n const app = req.app;\n const request = app.mw_tpl.expand({\n request: {\n headers: Object.assign(req.headers, addlHeaders),\n params: {\n domain: req.params.domain,\n title\n }\n }\n });\n return req.issueRequest(request);\n}\n\n/**\n * Returns a promise to the summary object for the given title.\n *\n * @param {!Object} req\n * @param {!string} title\n * @return {Promise<Object>}\n */\nfunction restGetSummary(req, title) {\n let lang = req.headers['accept-language'];\n if (lang) {\n // HACK: T346657\n // Use zh locale for all zhwiki requests\n lang = lang.replace(/zh(-.*)/, 'zh');\n }\n\n return restApiGet(\n req,\n `page/summary/${ encodeURIComponent(title) }`,\n {\n headers: {\n 'accept-language': lang\n }\n }\n )\n .then((res) => {\n // Support legacy pre summary 2.0 clients.\n res.body.normalizedtitle = res.body.title;\n res.body.title = res.body.title.replace(/ /g, '_');\n return res.body;\n });\n}\n\n/**\n * Sets up the request templates for MW and RESTBase API requests\n *\n * @param {!Application} app the application object\n */\nfunction setupApiTemplates(app) {\n\n // set up the MW API request template\n if (!app.conf.mwapi_req) {\n app.conf.mwapi_req = {\n method: 'get',\n uri: 'http://{{domain}}/w/api.php',\n headers: '{{request.headers}}',\n query: '{{ default(request.query, {}) }}'\n };\n }\n app.mwapi_tpl = new Template(app.conf.mwapi_req);\n\n // set up MW REST API request template\n if (!app.conf.mwrestapi_req) {\n app.conf.mwrestapi_req = {\n method: 'get',\n uri: 'http://{{domain}}/w/rest.php/v1/{+path}',\n headers: '{{request.headers}}'\n };\n }\n app.mwrestapi_tpl = new Template(app.conf.mwrestapi_req);\n\n // set up the RESTBase request template\n if (!app.conf.restbase_req) {\n app.conf.restbase_req = {\n method: '{{request.method}}',\n uri: 'http://{{domain}}/api/rest_v1/{+path}',\n query: '{{ default(request.query, {}) }}',\n headers: '{{request.headers}}',\n body: '{{request.body}}'\n };\n }\n app.restbase_tpl = new Template(app.conf.restbase_req);\n\n // Set up the REST Gateway request template\n //\n // For the definitive list of services proxied by the REST Gateway, see\n // https://gerrit.wikimedia.org/g/operations/deployment-charts/+/c4c17fdb4869333de00e269454580119442d6082/helmfile.d/services/rest-gateway/values.yaml#57\n if (!app.conf.rest_gateway_req) {\n app.conf.rest_gateway_req = {\n method: '{{request.method}}',\n uri: 'http://{{domain}}/v1/{+path}',\n query: '{{ default(request.query, {}) }}',\n headers: '{{request.headers}}',\n body: '{{request.body}}'\n };\n }\n app.rest_gateway_req = new Template(app.conf.rest_gateway_req);\n\n // set up the MediaWiki page request template\n if (!app.conf.mw_req) {\n app.conf.mw_req = {\n method: '{{request.method}}',\n uri: 'http://{{domain}}/w/index.php?title={+title}',\n query: '{{ default(request.query, {}) }}',\n headers: '{{request.headers}}'\n };\n }\n app.mw_tpl = new Template(app.conf.mw_req);\n}\n\nmodule.exports = {\n mwGet,\n mwApiGet,\n restApiGet,\n restGetSummary,\n setupApiTemplates,\n mwCorePageHTMLGet,\n restGatewayGet\n};\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/date-util.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/doc-util.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/featured-image.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/featured.js","messages":[{"ruleId":"no-shadow","severity":1,"message":"'si' is already declared in the upper scope on line 12 column 7.","line":136,"column":12,"nodeType":"Identifier","messageId":"noShadow","endLine":136,"endColumn":14}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * To retrieve TFA -- Today's featured article -- for a given date.\n */\n\n'use strict';\n\nconst crypto = require('crypto');\nconst domino = require('domino');\nconst BBPromise = require('bluebird');\nconst api = require('./api-util');\n\nconst si = require('./siteinfo');\nconst dateUtil = require('./date-util');\nconst util = require('./util');\n\nconst HTTPError = util.HTTPError;\n\nconst NS_SPECIAL = '-1';\n\nconst supportedSubdomains = [ 'bg', 'bn', 'bs', 'cs', 'de', 'el', 'en', 'fa', 'he', 'hu', 'it', 'ja',\n 'la', 'no', 'sco', 'sd', 'sv', 'tr', 'ur', 'vi', 'zh' ];\n\nconst supportedDomains = supportedSubdomains.map((lang) => `${ lang }.wikipedia.org`);\n\nconst isSupported = (domain) => supportedDomains.includes(domain);\n\n/**\n * Builds the request to get the Special:FeedItem provided by the FeaturedFeed extension.\n *\n * @param {!string} req the request object\n * @param {!Object} siteinfo\n * @param {!Date} date for which day the featured article is requested\n * @return {!Promise} a promise resolving as an JSON object containing the response\n */\nconst requestFeaturedFeedSpecialItem = (req, siteinfo, date) => {\n const lang = siteinfo.general.lang;\n const localizedNamespaceSpecial = siteinfo.namespaces[NS_SPECIAL].name.replace(/ /g, '_');\n const feedItemAliasInfo = siteinfo.specialpagealiases.find((i) => i.realname === 'FeedItem');\n const feedItemAlias = (feedItemAliasInfo && feedItemAliasInfo.aliases[0]) || 'FeedItem';\n const dateString = `${ dateUtil.formatYYYYMMDD(date) }000000`;\n const title = `${ localizedNamespaceSpecial }:${ feedItemAlias }/featured/${ dateString }/${ lang }`;\n return api.mwGet(req, title, { accept: 'text/html; charset=UTF-8' });\n};\n\n// -- functions dealing with responses:\n\nconst findPageTitle = (html) => {\n const document = domino.createDocument(html);\n const scope = document.querySelector('div#mw-content-text');\n if (!scope) {\n return;\n }\n\n const found = scope.querySelector('b > a, a > b');\n if (found) {\n if (found.tagName === 'A') { // b > a\n return found.getAttribute('title');\n } else { // a > b\n // the anchor is the parent node\n return found.parentNode.getAttribute('title');\n }\n }\n};\n\n/**\n * Fetches higher-quality page image form MW API\n *\n * @param {!Object} req\n * @param {!string} title\n * @return {Promise<Object>}\n */\nconst fetchHighQualityPageImage = (req, title) => api.mwApiGet(req, {\n action: 'query',\n format: 'json',\n formatversion: 2,\n prop: 'pageimages',\n piprop: 'thumbnail|original',\n pithumbsize: 640,\n pilicense: 'any',\n titles: title\n })\n .then((res) => {\n if (res.body &&\n res.body.query &&\n res.body.query.pages &&\n res.body.query.pages.length &&\n res.body.query.pages[0].thumbnail &&\n res.body.query.pages[0].original) {\n const thumbnail = res.body.query.pages[0].thumbnail;\n const originalimage = res.body.query.pages[0].original;\n thumbnail.source = thumbnail.source.replace(/^http:/, 'https:');\n originalimage.source = originalimage.source.replace(/^http:/, 'https:');\n return { thumbnail, originalimage };\n }\n });\n\nconst createSha1 = (input) => {\n const shasum = crypto.createHash('sha1');\n shasum.update(input);\n return shasum.digest('hex');\n};\n\n// -- main\n\nconst promise = (app, req) => {\n let pageTitle;\n const domain = req.params.domain;\n const aggregated = !!req.query.aggregated;\n\n if (!dateUtil.validate(dateUtil.hyphenDelimitedDateString(req))) {\n if (aggregated) {\n return BBPromise.resolve({});\n }\n dateUtil.throwDateError();\n }\n\n if (!isSupported(domain)) {\n if (aggregated) {\n return BBPromise.resolve({});\n } else {\n throw new HTTPError({\n status: 404,\n type: 'not_found',\n title: 'Not found',\n detail: 'The language you have requested is not yet supported.'\n });\n }\n }\n\n const requestedDate = dateUtil.getRequestedDate(req);\n if (domain === 'de.wikipedia.org' && !(dateUtil.isWithinLast3Days(requestedDate))) {\n return BBPromise.resolve({});\n }\n\n return si.getSiteInfo(req)\n .then((si) => requestFeaturedFeedSpecialItem(req, si, requestedDate)\n .then((featured) => {\n pageTitle = findPageTitle(featured.body);\n if (!pageTitle) {\n return BBPromise.resolve({});\n }\n const dbTitle = util.getDbTitle(pageTitle, si);\n const vary = [];\n if (si.variants && si.variants.length > 1) {\n vary.push('accept-language');\n }\n return {\n payload: api.restGetSummary(req, dbTitle),\n meta: { etag: createSha1(dbTitle), vary },\n // will be moved into summary before returning the result\n $fetchHighQualityImage: fetchHighQualityPageImage(req, dbTitle)\n };\n })\n .then((result) => util.promiseAwaitAll(result, true, req.logger))\n .then((resolvedResult) => {\n if (resolvedResult.$fetchHighQualityImage) {\n Object.assign(resolvedResult.payload, resolvedResult.$fetchHighQualityImage);\n }\n delete resolvedResult.$fetchHighQualityImage;\n return resolvedResult;\n })\n .catch((err) => {\n if (aggregated) {\n return BBPromise.resolve({});\n }\n throw err;\n }));\n};\n\nmodule.exports = {\n promise,\n supportedSubdomains,\n supportedDomains,\n testing: {\n findPageTitle,\n isSupported\n }\n};\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/imageinfo.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Bool' is undefined.","line":30,"column":1,"nodeType":"Block","endLine":30,"endColumn":1},{"ruleId":"jsdoc/require-returns-check","severity":1,"message":"JSDoc @return declaration present but return expression not available in function.","line":85,"column":1,"nodeType":"Block","endLine":103,"endColumn":4},{"ruleId":"jsdoc/require-returns-check","severity":1,"message":"JSDoc @return declaration present but return expression not available in function.","line":132,"column":1,"nodeType":"Block","endLine":145,"endColumn":4},{"ruleId":"array-callback-return","severity":1,"message":"Array.prototype.map() expects a return value from arrow function.","line":203,"column":43,"nodeType":"ArrowFunctionExpression","messageId":"expectedInside","endLine":203,"endColumn":45},{"ruleId":"jsdoc/valid-types","severity":1,"message":"Syntax error in type: [type]","line":280,"column":1,"nodeType":"Block","endLine":280,"endColumn":1},{"ruleId":"jsdoc/valid-types","severity":1,"message":"Syntax error in type: [type]","line":282,"column":1,"nodeType":"Block","endLine":282,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst P = require('bluebird');\nconst _ = require('lodash');\nconst domino = require('domino');\nconst striptags = require('striptags');\nconst api = require('./api-util');\nconst dateUtil = require('./date-util');\nconst util = require('./util');\nconst HTTPError = util.HTTPError;\nconst parsoid = require('./parsoid');\n\nconst PROD_COMMONS_DOMAIN = 'commons.wikimedia.org';\nconst BETA_COMMONS_DOMAIN = 'commons.wikimedia.beta.wmflabs.org';\n\n/**\n * Get the correct Commons domain to handle the request.\n *\n * @param {!string} domain original request domain\n * @return {!string} Commons domain for beta or prod\n */\nfunction getCommonsDomain(domain) {\n return domain.endsWith('beta.wmflabs.org') ? BETA_COMMONS_DOMAIN : PROD_COMMONS_DOMAIN;\n}\n\n/**\n * get page object from api response\n *\n * @param {Object} response MWAPI response\n * @param {Bool} dontThrow if true throw HTTP error 404\n * @return {Object} Page Object\n */\nfunction getPageObject(response, dontThrow) {\n const page = response.body.query.pages[0];\n if (!page.pageid || page.missing === true) {\n if (dontThrow) {\n page.notfound = true;\n return page;\n } else {\n throw new HTTPError({\n status: 404,\n type: 'not_found',\n title: 'No picture of the day for this date',\n detail: 'There is no picture of the day for this date.'\n });\n }\n }\n return page;\n}\n\n/**\n * @param {!domino.Document} doc\n * @return {void}\n */\nfunction removeLangLabels(doc) {\n const labels = doc.querySelectorAll('span[class*=langlabel-]') || [];\n labels.forEach((element) => {\n element.parentNode.removeChild(element);\n });\n}\n\n/**\n * @param {!domino.Document} doc\n * @return {!Object.<string, string>} Map of languages to descriptions\n */\nfunction queryDescriptions(doc) {\n const descriptions = {};\n const descriptionElements = doc.querySelectorAll('.description[class*=lang-]') || [];\n descriptionElements.forEach((element) => {\n descriptions[element.lang] = element.innerHTML.trim();\n });\n return descriptions;\n}\n\n/**\n * Converts a metadata array to a standard JS key-value object.\n *\n * @param {!Array} meta A metadata array from Commons ([ { name: foo, value: bar }, ... ])\n * @return {!Object} a consolidated object ({ foo: bar, ... })\n */\nfunction metadataToObject(meta) {\n return Object.assign(...meta.map((item) => ({ [item.name]: item.value })));\n}\n\n/**\n * Provides a consistent structure for extended metadata (extmetadata) properties returned from the\n * MW API. As returned directly from the MW API, these values may be strings or objects, and may\n * or may not specify the language in which they are provided. This provides some structure to help\n * clients consume the data more easily.\n * The result language will be chosen according to the following algorithm:\n * 1) If a key for preferredLang exists, use preferredLang;\n * 2) Else, if the key exists in English, use English;\n * 3) Else, use the first available language.\n * The return value will include the following properties:\n * html (required): the original value text in the chosen language, likely (but not necessarily)\n * HTML-formatted;\n * text (required): the original value text with HTML-formatting stripped;\n * lang (optional): the chosen language code, if language codes were provided\n *\n * @param {!Object|string} val Value of the extmetadata property\n * @param {!string} preferredLang preferred language (most likely the request language)\n * @return {?Object} structured values for the extmetadata property\n */\nfunction structureExtMetadataValue(val, preferredLang) {\n let html;\n let lang;\n\n if (typeof val === 'object') {\n if (val[preferredLang]) {\n lang = preferredLang;\n } else if (val.en) {\n lang = 'en';\n } else if (Object.keys(val)[0]) {\n lang = Object.keys(val)[0];\n } else {\n return;\n }\n html = val[lang];\n } else if (typeof val === 'string') {\n html = val;\n } else {\n return;\n }\n\n return {\n html,\n text: striptags(html).trim(),\n lang\n };\n}\n\n/**\n * Get structured artist info from extmetadata (to the extent possible).\n * We take a rather conservative approach here:\n * 1) In the 'html' property, we always return the full HTML string.\n * 2) If the field contains only plain text, we assume this is an artist name and\n * return it in the 'name' property.\n * 3) If the HTML string is of a specific common form, we parse the user name and\n * user page from it, and return them in the 'name' and 'user_page' fields respectively.\n * That form is \"<a href=\\\"//commons.wikimedia.org/wiki/User:Foo\\\" title=\\\"User:Foo\\\">Foo</a>\".\n *\n * @param {!Object|string} val The Artist value from extmetadata\n * @param {!string} preferredLang \"artist\" metadata value from the MW API\n * @return {?Object} structured artist info\n */\nfunction getStructuredArtistInfo(val, preferredLang) {\n const result = structureExtMetadataValue(val, preferredLang);\n if (!result) {\n return;\n }\n const doc = domino.createDocument(result.html);\n if (!doc.body.textContent) {\n return;\n }\n let name;\n let userPage;\n if (doc.body.textContent === result.html) {\n name = doc.body.textContent;\n } else {\n const a = doc.body.querySelector('a');\n if (a && a.outerHTML === result.html && a.getAttribute('title') === `User:${ doc.body.textContent }` &&\n // TODO: Update to handle all Wikimedia project domains\n a.getAttribute('href') === `//commons.wikimedia.org/wiki/${ a.title }`) {\n name = doc.body.textContent;\n userPage = `https:${ a.getAttribute('href') }`;\n }\n }\n return Object.assign(result, { name, user_page: userPage });\n}\n\n/**\n * Provides consistent structuring of extmetadata values. See comments on\n * structureExtMetadataProperty for the specific steps applied to each value.\n *\n * @param {!Object} extMetadata extmetadata object from MW API\n * @param {!string} preferredLang preferred language (most likely the request language)\n * @return {?Object} set of structured extmetadata values\n */\nfunction structureExtMetadataValues(extMetadata, preferredLang) {\n return Object.keys(extMetadata).reduce((acc, cur) => {\n const val = extMetadata[cur].value;\n if (cur === 'Artist') {\n // Special-case handling for the Artist property (conditionally including a\n // derived Commons username and User page URL), which is used for something\n // or other in the Android app.\n acc[cur] = getStructuredArtistInfo(val, preferredLang);\n } else {\n acc[cur] = structureExtMetadataValue(val, preferredLang);\n }\n return acc;\n }, {});\n}\n\n/**\n * Provides consistent structuring of wbentities values for the structured captions field\n *\n * @param {!Object} wbentity object data from wbgetentities API action\n * @return {!Object} structured captions for given wbentity\n */\nfunction structureCaptions(wbentity) {\n const captions = wbentity && wbentity.labels;\n if (captions) {\n Object.keys(captions).map((index) => {\n captions[index] = captions[index].value;\n });\n }\n return captions;\n}\n\n/**\n * Make image info result\n *\n * @param {!Object} wbentity Wikibase entity object\n * @param {!Object} image metadata query results to be parsed and formatted\n * @param {!Object} siteinfo Site info\n * @param {!string} preferredLang language code of the preferred language for metadata values\n * @param {!Object} desc Description Value pre-processed (needed for Picture of the day)\n * @return {!Object}\n */\nfunction makeResult(wbentity, image, siteinfo, preferredLang, desc) {\n const imageInfo = image.imageinfo[0];\n const meta = imageInfo.metadata && metadataToObject(imageInfo.metadata);\n const ext = imageInfo.extmetadata &&\n structureExtMetadataValues(imageInfo.extmetadata, preferredLang);\n const isAudio = imageInfo.mediatype === 'AUDIO';\n const isSvg = imageInfo.mime && imageInfo.mime.includes('svg');\n const captions = structureCaptions(wbentity);\n\n return {\n title: image.pageprops && image.pageprops.displaytitle || image.title,\n thumbnail: {\n source: imageInfo.thumburl,\n width: imageInfo.thumbwidth,\n height: imageInfo.thumbheight,\n mime: imageInfo.thumbmime\n },\n image: {\n source: imageInfo.url,\n width: isAudio || isSvg ? undefined : imageInfo.width,\n height: isAudio || isSvg ? undefined : imageInfo.height,\n mime: imageInfo.mime\n },\n page_count: imageInfo.pagecount,\n file_page: imageInfo.descriptionurl,\n duration: meta && (meta.length || meta.playtime_seconds) || undefined,\n artist: ext && ext.Artist,\n credit: ext && ext.Credit,\n // Use original value for each of these since it's well standardized data\n license: {\n type: ext && ext.LicenseShortName && ext.LicenseShortName.html,\n code: ext && ext.License && ext.License.html,\n url: ext && ext.LicenseUrl && ext.LicenseUrl.html\n },\n description:\n desc && structureExtMetadataValue(desc, preferredLang) ||\n ext && ext.ImageDescription,\n wb_entity_id: wbentity.id,\n structured: {\n captions: captions && Object.keys(captions).length ? captions : {}\n }\n };\n}\n\n/**\n * Get Picture of the day description from Parsoid response\n *\n * @param {Object} req req Server request\n * @param {Object} body parsoid body response\n * @return {Object} POTD description value\n */\nfunction getPotdDescriptionValue(req, body) {\n const doc = domino.createDocument(body);\n removeLangLabels(doc);\n return queryDescriptions(doc);\n}\n\n/**\n * Builds the request to get the Picture of the day of a given date.\n *\n * @param {[type]} req [description]\n * @param {!Date} date for which day the featured image of theday is requested\n * @param {[type]} siteinfo [description]\n * @return {!Promise} a promise resolving as an JSON object containing the response\n */\nfunction requestPictureOfTheDay(req, date, siteinfo) {\n const isoDate = dateUtil.formatISODate(date);\n const commonsDomain = getCommonsDomain(req.params.domain);\n let page;\n const filter = [\n 'Artist',\n 'LicenseShortName',\n 'License',\n 'LicenseUrl',\n 'Credit'\n ];\n\n const imageInfoProps = [\n 'url',\n 'dimensions',\n 'extmetadata'\n ];\n\n const query = {\n action: 'query',\n format: 'json',\n formatversion: 2,\n generator: 'images',\n prop: 'imageinfo|revisions',\n iiextmetadatafilter: filter.join('|'),\n iimetadataversion: 'latest',\n iiprop: imageInfoProps.join('|'),\n iiurlwidth: 640,\n rawcontinue: '',\n titles: `Template:Potd/${ isoDate }`\n };\n return api.mwApiGet(req, query, commonsDomain).then((response) => {\n page = getPageObject(response);\n\n const parsoidReq = Object.create(req);\n parsoidReq.params = Object.create(req.params);\n parsoidReq.params.title = page.title;\n parsoidReq.params.domain = commonsDomain;\n\n const structuredQuery = {\n action: 'wbgetentities',\n format: 'json',\n formatversion: 2,\n sites: 'commonswiki',\n props: 'labels|info',\n titles: page.title\n };\n\n return P.join(\n parsoid.getParsoidHtml(parsoidReq),\n api.mwApiGet(req, structuredQuery, commonsDomain),\n (html, structured) => {\n const description = getPotdDescriptionValue(req, html.body);\n const lang = req.params.domain.split('.')[0];\n const wbentity = _.values(structured.body.entities)[0];\n return {\n payload: makeResult(wbentity, page, siteinfo, lang, description),\n meta: util.getRevAndTidFromEtag(html.headers)\n };\n });\n });\n}\n\nmodule.exports = {\n requestPictureOfTheDay,\n testing: {\n structureExtMetadataValue\n }\n};\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/most-read.js","messages":[{"ruleId":"jsdoc/check-access","severity":1,"message":"At most one access-control tag may be present on a jsdoc block.","line":79,"column":1,"nodeType":"Block","endLine":82,"endColumn":4},{"ruleId":"jsdoc/valid-types","severity":1,"message":"@public should not have a bracketed type in \"jsdoc\" mode.","line":80,"column":1,"nodeType":"Block","endLine":80,"endColumn":1},{"ruleId":"jsdoc/valid-types","severity":1,"message":"@public should not have a bracketed type in \"jsdoc\" mode.","line":81,"column":1,"nodeType":"Block","endLine":81,"endColumn":1},{"ruleId":"max-len","severity":1,"message":"This line has a length of 122. Maximum allowed is 100.","line":98,"column":1,"nodeType":"Program","messageId":"max","endLine":98,"endColumn":123},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":113,"column":28,"nodeType":"NewExpression","endLine":113,"endColumn":80},{"ruleId":"max-len","severity":1,"message":"This line has a length of 112. Maximum allowed is 100.","line":114,"column":1,"nodeType":"Program","messageId":"max","endLine":114,"endColumn":113},{"ruleId":"no-shadow","severity":1,"message":"'pageviews' is already declared in the upper scope on line 10 column 7.","line":143,"column":19,"nodeType":"Identifier","messageId":"noShadow","endLine":143,"endColumn":28},{"ruleId":"array-callback-return","severity":1,"message":"Array.prototype.map() expects a return value from arrow function.","line":159,"column":25,"nodeType":"ReturnStatement","messageId":"expectedReturnValue","endLine":159,"endColumn":32},{"ruleId":"max-len","severity":1,"message":"This line has a length of 144. Maximum allowed is 100.","line":197,"column":1,"nodeType":"Program","messageId":"max","endLine":197,"endColumn":145},{"ruleId":"max-len","severity":1,"message":"This line has a length of 113. Maximum allowed is 100.","line":206,"column":1,"nodeType":"Program","messageId":"max","endLine":206,"endColumn":114}],"suppressedMessages":[{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_id'.","line":155,"column":26,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":155,"endColumn":87,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":10,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Most-read article promise and related support functions.\n */\n\n'use strict';\n\nconst BBPromise = require('bluebird');\nconst regexEscape = require('lodash').escapeRegExp;\nconst dateUtil = require('./date-util');\nconst pageviews = require('./pageviews');\nconst si = require('./siteinfo');\nconst util = require('./util');\nconst apiUtil = require('./api-util');\nconst Title = require('mediawiki-title').Title;\n\nconst MAX_TITLES = 50;\n\nconst DENY_LIST = {\n '*': [\n '-',\n 'Test_card',\n 'Web_scraping',\n 'XHamster',\n 'Java_(programming_language)',\n 'Images/upload/bel.jpg',\n 'Superintelligence:_Paths,_Dangers,_Strategies',\n 'Okto',\n 'Proyecto_40',\n 'AMGTV',\n 'Lali_Espósito',\n 'La7',\n 'Vagina',\n 'کس', // mznwiki\n 'مقعد', // mznwiki\n 'Tobias_Sammet', // dewiki T238942\n 'Avantasia', // dewiki T238942\n 'Edguy', // dewiki T238942\n 'Pornhub', // dewiki T238942\n 'Index', // T327904\n 'Index_(statistics)',\n 'Index,_Washington',\n 'Index_(economics)',\n 'XXX:_Return_of_Xander_Cage',\n 'XXX_(film_series)',\n 'XXX_(2002_film)',\n 'Cookie_(informatique)',\n 'Nigger',\n 'nigger',\n 'YouTube',\n 'Cleopatra',\n 'Outlook.com',\n 'Sex',\n '.xxx',\n 'XNXX',\n 'XVideos',\n 'XXXX_(beer)',\n 'XXXX',\n 'XXXX_Gold',\n 'XXXX_(album)',\n 'XXXX_Summer_Bright_Lager',\n 'XXXX_Panzer_Corps',\n 'XXX:_State_of_the_Union',\n 'XXXTentacion',\n 'X_(2022_film)',\n 'Super_Bowl_XXX',\n 'Murder_of_XXXTentacion'\n ],\n es: [\n 'Cleopatra'\n ],\n pt: [\n 'Cleopatra'\n ],\n test: [\n 'User:JGiannelos_(WMF)/test_most_read_block'\n ]\n};\n\n/**\n * @public {!string} date ISO 8601 timestamp of pageviews recorded\n * @public {!number} views Integer pageviews on date\n */\nclass DatedPageviews {\n constructor(date, views) {\n this.date = date;\n this.views = views;\n }\n}\n\nfunction getTopPageviews(req, domain, date) {\n const restReq = {\n params: { domain: 'wikimedia.org' },\n headers: { accept: 'application/json; charset=utf-8' }\n };\n return new pageviews.Client(req, restReq).reqTop(domain, pageviews.Platform.ALL, date);\n}\nfunction pageviewsPageRspToDatedPageviews(rsp) {\n return rsp.body.items.map((item) => new DatedPageviews(dateUtil.iso8601DateFromYYYYMMDD(item.timestamp), item.views));\n}\n\nfunction getViewHistory(req, domain, startDate, endDate, entry) {\n const restReq = {\n params: { domain: 'wikimedia.org' },\n headers: { accept: 'application/json; charset=utf-8' }\n };\n const client = new pageviews.Client(req, restReq);\n return client.reqPage(util.removeTLD(domain), pageviews.Platform.ALL, pageviews.Agent.USER,\n entry.article, pageviews.Granularity.DAILY, startDate, endDate)\n .then(pageviewsPageRspToDatedPageviews);\n}\n\nfunction filterSpecial(articles, mainPageTitle) {\n const mainPageRegExp = new RegExp(`^${ regexEscape(mainPageTitle) }$`, 'i');\n return articles.filter((entry) => entry.namespace.id === 0 && !mainPageRegExp.test(entry.titles.canonical));\n}\n\nfunction isBlocked(lang, title) {\n return (lang in DENY_LIST && DENY_LIST[lang].includes(title)) || DENY_LIST['*'].includes(title);\n}\n\nfunction promise(app, req) {\n if (req.params.domain === 'fy.wikipedia.org') {\n return BBPromise.resolve({ meta: {} });\n }\n\n if (!dateUtil.validate(dateUtil.hyphenDelimitedDateString(req))) {\n if (req.query.aggregated) {\n return BBPromise.resolve({ meta: {} });\n }\n dateUtil.throwDateError();\n }\n\n const reqDate = dateUtil.getRequestedDate(req);\n const rspDate = req.query.aggregated ? dateUtil.addDays(reqDate, -1) : reqDate;\n\n return BBPromise.join(\n getTopPageviews(req, util.removeTLD(req.params.domain), rspDate),\n si.getSiteInfo(req),\n (pageviewsResponse, siteinfo) => {\n const mainPage = siteinfo.general && siteinfo.general.mainpage;\n const mainPageTitle = Title.newFromText(mainPage, siteinfo);\n\n const pageviews = pageviewsResponse &&\n pageviewsResponse.body &&\n pageviewsResponse.body.items &&\n pageviewsResponse.body.items[0];\n\n const pageviewsSlice = pageviews.articles &&\n pageviews.articles.slice(0, MAX_TITLES);\n\n const titles = pageviewsSlice.map((entry) => {\n let ns;\n try {\n // eslint-disable-next-line no-underscore-dangle\n ns = Title.newFromText(entry.article, siteinfo).getNamespace()._id;\n } catch (e) {\n if (e.type === 'title-invalid-utf8') {\n req.logger.log('warn', e);\n return;\n } else {\n throw e;\n }\n }\n return Object.assign({ ns }, entry);\n }).filter((entry) => entry !== undefined);\n\n const resultsDate = `${ pageviews.year }-${ pageviews.month }-${ pageviews.day }Z`;\n const start = dateUtil.addDays(new Date(resultsDate), -4);\n const end = new Date(resultsDate);\n\n const results = titles.map((entry) => {\n // Will be merged-in on a later pass\n entry.$summary = apiUtil.restGetSummary(req, entry.article);\n entry.view_history = getViewHistory(req, req.params.domain, start, end, entry);\n delete entry.article;\n delete entry.ns;\n return entry;\n });\n\n return util.promiseAwaitAll(results, true, req.logger)\n .then((resp) => {\n let articles = resp\n // Throw away items where summaries failed to fetch.\n .filter((entry) => !!entry.$summary)\n // Merge the summary content into the article view data.\n .map((entry) => {\n Object.assign(entry, entry.$summary);\n delete entry.$summary;\n return entry;\n });\n\n // Deduplicate the most-read pages cause some of them might have been\n // redirects which have now been resolved.\n articles = util.removeDuplicateTitles(articles, (orig, dupe) => {\n orig.views += dupe.views;\n orig.view_history.forEach((toViewsForDate) => {\n const filteredViews = dupe.view_history.filter((fromViewsForDate) => toViewsForDate.date === fromViewsForDate.date);\n if (filteredViews.length) {\n toViewsForDate.views += filteredViews[0].views;\n }\n });\n return orig;\n });\n\n articles = filterSpecial(articles, mainPageTitle.getPrefixedDBKey());\n articles = articles.filter((entry) => !isBlocked(siteinfo.general.lang, entry.titles.canonical));\n\n const vary = [];\n if (siteinfo.variants && siteinfo.variants.length > 1) {\n vary.push('accept-language');\n }\n return {\n payload: {\n date: resultsDate,\n articles\n },\n meta: { revision: dateUtil.dateStringFrom(req), vary }\n };\n });\n }).catch((err) => {\n // Catch and handle the error if this is an aggregated request and the\n // pageview data are not yet loaded.\n if (req.query.aggregated && err.status === 404) {\n return BBPromise.resolve({ meta: {} });\n }\n throw err;\n });\n}\n\nmodule.exports = {\n promise,\n\n // visible for testing\n filterSpecial,\n isBlocked\n};\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/news.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Document' is undefined.","line":15,"column":1,"nodeType":"Block","endLine":15,"endColumn":1},{"ruleId":"no-shadow","severity":1,"message":"'si' is already declared in the upper scope on line 8 column 7.","line":73,"column":12,"nodeType":"Identifier","messageId":"noShadow","endLine":73,"endColumn":14},{"ruleId":"no-shadow","severity":1,"message":"'result' is already declared in the upper scope on line 80 column 19.","line":96,"column":20,"nodeType":"Identifier","messageId":"noShadow","endLine":96,"endColumn":26}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst BBPromise = require('bluebird');\nconst parsoid = require('./parsoid');\nconst util = require('./util');\nconst apiUtil = require('./api-util');\nconst docUtil = require('./doc-util');\nconst si = require('./siteinfo');\nconst HTTPError = util.HTTPError;\nconst NEWS_TEMPLATES = require('../etc/news-sites');\n\n/**\n * Remove any elements matching selector from doc\n *\n * @param {Document} doc\n * @param {string} selector\n * @return {boolean} true if at least one node has been removed\n */\nfunction rmElements(doc, selector) {\n const nodes = doc.querySelectorAll(selector) || [];\n for (let idx = 0; idx < nodes.length; idx++) {\n const node = nodes[idx];\n node.parentNode.removeChild(node);\n }\n return nodes.length > 0;\n}\n\nfunction constructStory(req, lang, storyHtml) {\n const story = { links: [] };\n const linkTitles = [];\n\n const topicAnchor = storyHtml.querySelector(NEWS_TEMPLATES[lang].topicAnchorSelector);\n const topicTitle = util.extractDbTitleFromAnchor(topicAnchor);\n storyHtml.querySelectorAll('a[rel=\"mw:WikiLink\"]').forEach((anchor) => {\n const storyTitle = util.extractDbTitleFromAnchor(anchor);\n if (!linkTitles.includes(storyTitle)) {\n story.links.splice(\n storyTitle === topicTitle ? 0 : story.links.length,\n 0,\n apiUtil.restGetSummary(req, storyTitle)\n );\n linkTitles.push(storyTitle);\n }\n });\n\n rmElements(storyHtml, 'span[style^=float:right]');\n story.story = storyHtml.innerHTML;\n if (story.story.length > 0 && story.links.length > 0) {\n return story;\n } else {\n return undefined;\n }\n}\n\nfunction promise(app, req) {\n const lang = req.params.domain.split('.')[0];\n const aggregated = !!req.query.aggregated;\n\n if (!NEWS_TEMPLATES[lang]) {\n if (aggregated) {\n return BBPromise.resolve({});\n }\n throw new HTTPError({\n status: 404,\n type: 'not_found',\n title: 'Not found',\n detail: 'The language you have requested is not yet supported.'\n });\n }\n\n req.params.title = NEWS_TEMPLATES[lang].title;\n return si.getSiteInfo(req)\n .then((si) => parsoid.getParsoidHtml(req)\n .then((response) => {\n const selector = NEWS_TEMPLATES[lang].headlineSelectorAll;\n const vary = [];\n if (si.variants && si.variants.length > 1) {\n vary.push('accept-language');\n }\n const result = {\n payload: [],\n meta: { etag: util.getRevisionFromEtag(response.headers), vary }\n };\n return docUtil.createDocument(response.body)\n .then((doc) => {\n const headlines = doc.querySelectorAll(selector);\n Array.prototype.forEach.call(headlines, (storyHtml) => {\n const story = constructStory(req, lang, storyHtml);\n if (story) {\n result.payload.push(story);\n }\n });\n\n return result;\n })\n .then((result) => util.promiseAwaitAll(result, true, req.logger));\n }));\n}\n\nmodule.exports = {\n promise,\n\n // visible for testing\n constructStory\n};\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/on-this-day.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Integer' is undefined.","line":34,"column":1,"nodeType":"Block","endLine":34,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'AnchorElement' is undefined.","line":122,"column":1,"nodeType":"Block","endLine":122,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Integer' is undefined.","line":123,"column":1,"nodeType":"Block","endLine":123,"endColumn":1},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":128,"column":12,"nodeType":"NewExpression","endLine":128,"endColumn":73},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'AnchorElement' is undefined.","line":141,"column":1,"nodeType":"Block","endLine":141,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'ListElement' is undefined.","line":161,"column":1,"nodeType":"Block","endLine":161,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'AnchorElement' is undefined.","line":173,"column":1,"nodeType":"Block","endLine":173,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'ListElement' is undefined.","line":196,"column":1,"nodeType":"Block","endLine":196,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'ListElement' is undefined.","line":241,"column":1,"nodeType":"Block","endLine":241,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Integer' is undefined.","line":257,"column":1,"nodeType":"Block","endLine":257,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'ListElement' is undefined.","line":296,"column":1,"nodeType":"Block","endLine":296,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'ListElement' is undefined.","line":307,"column":1,"nodeType":"Block","endLine":307,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'ListElement' is undefined.","line":308,"column":1,"nodeType":"Block","endLine":308,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'ListElement' is undefined.","line":329,"column":1,"nodeType":"Block","endLine":329,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'ListElement' is undefined.","line":347,"column":1,"nodeType":"Block","endLine":347,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Document' is undefined.","line":367,"column":1,"nodeType":"Block","endLine":367,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Document' is undefined.","line":399,"column":1,"nodeType":"Block","endLine":399,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Document' is undefined.","line":413,"column":1,"nodeType":"Block","endLine":413,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Document' is undefined.","line":427,"column":1,"nodeType":"Block","endLine":427,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Document' is undefined.","line":441,"column":1,"nodeType":"Block","endLine":441,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Document' is undefined.","line":455,"column":1,"nodeType":"Block","endLine":455,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Document' is undefined.","line":470,"column":1,"nodeType":"Block","endLine":470,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Document' is undefined.","line":471,"column":1,"nodeType":"Block","endLine":471,"endColumn":1},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"sendResponse\" type.","line":530,"column":1,"nodeType":"Block","endLine":530,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-prototype-builtins","severity":2,"message":"Do not access Object.prototype method 'hasOwnProperty' from target object.","line":496,"column":16,"nodeType":"CallExpression","messageId":"prototypeBuildIn","endLine":496,"endColumn":30,"suggestions":[{"messageId":"callObjectPrototype","data":{"prop":"hasOwnProperty"},"fix":{"range":[16975,16997],"text":"Object.prototype.hasOwnProperty.call(object, "},"desc":"Call Object.prototype.hasOwnProperty explicitly."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":24,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst _ = require('lodash');\nconst parsoid = require('./parsoid');\nconst apiUtil = require('./api-util');\nconst util = require('./util');\nconst docUtil = require('./doc-util');\nconst si = require('./siteinfo');\nconst HTTPError = util.HTTPError;\nconst languages = require('./on-this-day.languages').languages;\n\n/**\n * WMFPage models a link to a page\n *\n * @param {!string} title a page title, i.e. 'Goat'\n * @param {!boolean} isTopic events can have multiple links to pages, if this particular link is\n * bolded, such as those seen on https://en.m.wikipedia.org/wiki/Wikipedia:On_this_day/Today,\n * isTopic will be true.\n */\nclass WMFPage {\n constructor(title, isTopic) {\n this.title = title;\n if (isTopic) {\n this.isTopic = isTopic;\n }\n }\n}\n\n/**\n * WMFEvent models an historical event\n *\n * @param {!string} text event description\n * @param {!Array} pages array of WMFPage's for the event\n * @param {!Integer} year the year the event first happened. A negative number indicates the event\n * occured 'BC' (sometimes also denoted 'BCE' - i.e. '32 BC' or '200 BCE)'.\n */\nclass WMFEvent {\n constructor(text, pages, year) {\n this.text = text;\n this.pages = pages;\n this.year = year;\n }\n}\n\n/**\n * WMFHoliday models an annually occuring holiday.\n *\n * @param {!string} text event description\n * @param {!Array} pages array of WMFPage's for the event\n */\nclass WMFHoliday {\n constructor(text, pages) {\n this.text = text;\n this.pages = pages;\n }\n}\n\n/**\n * Gets day page titles, which are formatted as follows: 'May_20'\n *\n * @param {!string} monthNumberString string for month number ranging from '1' to '12'\n * @param {!string} dayNumberString string number for day of month\n * @param {!string} lang String for project language code\n * @return {!string} day page title. Example, inputs ('5', '20') returns 'May_20'\n */\nfunction titleForDayPageFromMonthDayNumberStrings(monthNumberString, dayNumberString, lang) {\n const monthNumber = parseInt(monthNumberString, 10);\n const monthName = languages[lang].monthNames[monthNumber - 1];\n const dayNumber = parseInt(dayNumberString, 10);\n return languages[lang].dayPage.nameFormatter(monthName, monthNumber, dayNumber);\n}\n\n/**\n * Gets selected page titles, which are formatted as follows:\n * 'Wikipedia:Selected_anniversaries/May_20'\n *\n * @param {!string} monthNumberString a string for month number ranging from '1' to '12'\n * @param {!string} dayNumberString a string number for day of month\n * @param {!string} lang a string for project language code\n * @return {!string} selected page title. Example, inputs ('5', '20') returns\n * 'Wikipedia:Selected_anniversaries/May_20'\n */\nfunction titleForSelectedPageFromMonthDayNumberStrings(monthNumberString, dayNumberString, lang) {\n const monthNumber = parseInt(monthNumberString, 10);\n const monthName = languages[lang].monthNames[monthNumber - 1];\n const dayNumber = parseInt(dayNumberString, 10);\n return languages[lang].selectedPage.nameFormatter(monthName, monthNumber, dayNumber);\n}\n\n/**\n * Gets day page Parsoid title for day pages such as https://en.m.wikipedia.org/wiki/May_20\n *\n * @param {!Request} req Request containing month (req.params.mm) and day (req.params.dd) number\n * string params\n * @return {!string} day page title for month and day number. Example, input mm '5' dd '20'\n * returns 'May_20'\n */\nconst dayTitleForRequest = (req) => {\n const lang = req.params.domain.split('.')[0];\n return titleForDayPageFromMonthDayNumberStrings(req.params.mm, req.params.dd, lang);\n};\n\n/**\n * Gets selected page Parsoid title for selected pages such as\n * https://en.m.wikipedia.org/wiki/Wikipedia:Selected_anniversaries/May_20. These pages are\n * also where 'Today' page https://en.m.wikipedia.org/wiki/Wikipedia:On_this_day/Today content comes\n * from.\n *\n * @param {!Request} req Request containing month (req.params.mm) and day (req.params.dd) number\n * string params\n * @return {!string} elected page title for month and day number. Example, input mm '5' dd '20\n * returns 'Wikipedia:Selected_anniversaries/May_20'\n */\nconst selectedTitleForRequest = (req) => {\n const lang = req.params.domain.split('.')[0];\n return titleForSelectedPageFromMonthDayNumberStrings(req.params.mm, req.params.dd, lang);\n};\n\n/**\n * Determines whether anchor is for specific year page.\n *\n * @param {!AnchorElement} anchor\n * @param {!Integer} year\n * @param {!string} era\n * @return {!boolean}\n */\nfunction isAnchorForYear(anchor, year, era) {\n return new RegExp(String.raw`^${ Math.abs(year) }\\s*${ era }$`, 'i').test(anchor.title);\n}\n\n/**\n * Regex for determining whether anchor is not relative.\n *\n * @type {RegExp}\n */\nconst nonRelativeAnchorRegex = /^http[s]?.*/i;\n\n/**\n * Determines whether anchor is relative.\n *\n * @param {!AnchorElement} anchor\n * @return {!boolean}\n */\nfunction isAnchorRelative(anchor) {\n return !nonRelativeAnchorRegex.test(anchor.href);\n}\n\n/**\n * Trims and also removes bracketed numbers.\n *\n * @param {!string} string\n * @return {!string}\n */\nfunction cleanString(string) {\n return string.replace(/\\[\\d+\\]/g, '').trim();\n}\n\n/**\n * Removes style element from a list element\n *\n * @param {!ListElement} element\n */\nfunction removeStyleElement(element) {\n const styles = Array.from(element.querySelectorAll('STYLE'));\n for (const style of styles) {\n style.remove();\n }\n}\n\n/**\n * Converts document anchor element to WMFPage model.\n *\n * @param {!AnchorElement} anchorElement Anchor to convert\n * @return {!WMFPage} a WMFPage\n */\nfunction wmfPageFromAnchorElement(anchorElement) {\n const title = util.extractDbTitleFromAnchor(anchorElement);\n const isTopic = anchorElement.parentElement.tagName === 'B';\n return new WMFPage(title, isTopic);\n}\n\n/**\n * Converts document list element to WMFEvent model.\n * A regular expression determines valid \"year list elements\" and separating their components.\n * For example: '399 BC - Death of Socrates'\n * RegEx Capture groups:\n * 1st - entire match (will be non-null if the string looks like a year list element)\n * '399 BC - Death of Socrates'\n * 2nd - year number, required\n * '399'\n * 3rd - 'BC' indication string, optional\n * 'BC'\n * 4th - event description string, required\n * 'Death of Socrates'\n *\n * @param {!ListElement} listElement List element to convert\n * @param {!boolean} isSelected If listElement is extracted from selectedPage\n * @param {!string} lang String for project language code\n * @return {?WMFEvent} a WMFEvent or null if the list element isn't formatted as an event\n */\nfunction wmfEventFromListElement(listElement, isSelected, lang) {\n const regEx = isSelected ? languages[lang].selectedRegEx : languages[lang].yearListElementRegEx;\n\n const match = listElement.textContent.match(regEx);\n if (match === null) {\n return null;\n }\n\n let year = parseInt(match[1], 10);\n const isBC = (match[2] !== undefined);\n let era = '';\n if (isBC) {\n // Negate BC years so they sort correctly\n year = -year;\n era = match[2];\n }\n\n // In Chinese, 'BC' is written in front of year. E.g. '前153年',\n // so the 2nd capture group is 'BC' indication and 3rd is year number.\n if (lang === 'zh') {\n year = parseInt(match[2], 10);\n if (match[1] !== '') {\n year = -year;\n era = match[2];\n }\n }\n\n const textAfterYear = cleanString(match[3]);\n\n const pages = Array.from(listElement.querySelectorAll('a'))\n .filter((anchor) => !isAnchorForYear(anchor, year, era))\n .filter(isAnchorRelative)\n .map(wmfPageFromAnchorElement);\n\n return new WMFEvent(textAfterYear, pages, year);\n}\n\n/**\n * Converts document list element to WMFHoliday model\n *\n * @param {!ListElement} listElement List element to convert\n * @return {!WMFHoliday} a WMFHoliday\n */\nfunction wmfHolidayFromListElement(listElement) {\n const text = cleanString(listElement.textContent);\n const pages = Array.from(listElement.querySelectorAll('a'))\n .filter(isAnchorRelative)\n .map(wmfPageFromAnchorElement);\n return new WMFHoliday(text, pages);\n}\n\n/**\n * WMFEvent comparator which properly handles negative 'BC'/'BCE' years\n *\n * @param {!WMFEvent} eventA First event\n * @param {!WMFEvent} eventB Second event\n * @return {!Integer} number of years between eventB and eventA ( yearB - yearA ).\n */\nfunction reverseChronologicalWMFEventComparator(eventA, eventB) {\n // Reminder: BC years are negative numbers.\n return eventB.year - eventA.year;\n}\n\n/**\n * Gets chronologically sorted array of WMFEvent models from an array of list elements.\n *\n * @param {!Array} listElements an array of document list elements\n * @param {!boolean} isSelected If listElement is extracted from selectedPage\n * @param {!string} lang a string for project language code\n * @return {!Array} sorted array of WMFEvent models, one for each year list element found\n * in 'listElements' argument\n */\nfunction eventsForYearListElements(listElements, isSelected, lang) {\n return listElements\n .map((element) => wmfEventFromListElement(element, isSelected, lang))\n .filter((possibleEvent) => possibleEvent instanceof WMFEvent)\n .sort(reverseChronologicalWMFEventComparator);\n}\n\n/**\n * Gets array of WMFHoliday models from an array of list elements.\n *\n * @param {!Array} listElements an array of document list elements\n * @return {!Array} an array of WMFHoliday models, one for each list element in\n * 'listElements' argument\n */\nfunction holidaysForHolidayListElements(listElements) {\n return listElements\n .map(wmfHolidayFromListElement)\n .filter((possibleHoliday) => possibleHoliday instanceof WMFHoliday);\n}\n\n/**\n * Determine if listElement has nested list elements.\n *\n * @param {!ListElement} listElement\n * @return {!boolean}\n */\nfunction listElementHasDescendentListElements(listElement) {\n return listElement.querySelector('UL > LI') !== undefined;\n}\n\n/**\n * Return ancestor list element of listElement, if any.\n * Returns undefined unless listElement is nested inside another listElement.\n *\n * @param {!ListElement} listElement\n * @return {?ListElement}\n */\nfunction ancestorListElementOfListElement(listElement) {\n const parent = listElement.parentElement;\n if (!parent) {\n return undefined;\n }\n const grandparent = parent.parentElement;\n if (!grandparent) {\n return undefined;\n }\n if (parent.tagName === 'UL' && grandparent.tagName === 'LI') {\n return grandparent;\n }\n return undefined;\n}\n\n/**\n * Gets prefix from a list element suitable to pre-pend to one of its decendent list element's\n * innerHTML.\n *\n * @param {!ListElement} ancestorListElement\n * @param {!string} lang a string for project language code\n * @return {!string}\n */\nfunction prefixFromAncestorListElement(ancestorListElement, lang) {\n const firstLine = ancestorListElement.textContent.split('\\n')[0];\n const yearPrefixRegEx = languages[lang].yearPrefixRegEx;\n const result = firstLine.match(yearPrefixRegEx);\n const isFirstLineAYear = (result !== null);\n const firstLineStringToUse = isFirstLineAYear ? result[1] : firstLine;\n const separator = isFirstLineAYear ? ' - ' : '\\n';\n const prefix = `${ firstLineStringToUse.trim() }${ separator }`;\n return prefix;\n}\n\n/**\n * Adds prefix from ancestor list elements to listElement.\n *\n * @param {!ListElement} listElement\n * @param {!string} lang a string for project language code\n */\nfunction addPrefixFromAncestorListElementsToListElement(listElement, lang) {\n const prefixes = [];\n removeStyleElement(listElement);\n let el = listElement;\n while ((el = ancestorListElementOfListElement(el))) {\n prefixes.push(prefixFromAncestorListElement(el, lang));\n }\n const prefixString = (prefixes.length === 0) ? '' : `${ prefixes.reverse().join('') }`;\n listElement.innerHTML = `${ _.escape(prefixString) }${ listElement.innerHTML.trim() }`;\n}\n\n/**\n * Gets list elements grouped under a given heading. Couldn't use pure CSS selector syntax for\n * extracting these - this is because some languages use further sub-headings under, say, 'births',\n * for things like 'Births before 1900' and so forth. We want *all* births, in this case - that is,\n * we want all list elements after the h2 'births' heading up until the next h2 heading.\n *\n * @param {!Document} document a DOM document to examine\n * @param {!string} headingIds an array of heading id strings\n * @param {!string} lang a string for project language code\n * @return {!Array} an array of list elements\n */\nfunction listElementsByHeadingID(document, headingIds, lang) {\n const elements = Array.from(document.querySelectorAll('h2,ul li'));\n const listElements = [];\n let grab = false;\n for (const element of elements) {\n if (element.tagName === 'H2') {\n grab = false;\n for (const headingId of headingIds) {\n if (element.id === headingId) {\n grab = true;\n }\n }\n } else if (element.tagName === 'LI' && grab) {\n\n if (listElementHasDescendentListElements(element)) {\n continue;\n }\n addPrefixFromAncestorListElementsToListElement(element, lang);\n listElements.push(element);\n }\n }\n return listElements;\n}\n\n/**\n * Gets array of WMFEvent models of births found in a document\n *\n * @param {!Document} doc a DOM document to examine\n * @param {!string} lang a string for project language code\n * @return {!Object} an object containing list of births\n */\nconst birthsInDoc = (doc, lang) => {\n const headingIds = languages[lang].dayPage.headingIds.births;\n return { births:\n eventsForYearListElements(listElementsByHeadingID(doc, headingIds, lang), false, lang)\n };\n};\n\n/**\n * Gets array of WMFEvent models of deaths found in a document\n *\n * @param {!Document} doc a DOM document to examine\n * @param {!string} lang a string for project language code\n * @return {!Object} an object containing list of deaths\n */\nconst deathsInDoc = (doc, lang) => {\n const headingIds = languages[lang].dayPage.headingIds.deaths;\n return { deaths:\n eventsForYearListElements(listElementsByHeadingID(doc, headingIds, lang), false, lang)\n };\n};\n\n/**\n * Gets array of WMFEvent models of events found in a document\n *\n * @param {!Document} doc a DOM document to examine\n * @param {!string} lang a string for project language code\n * @return {!Object} an object containing list of events\n */\nconst eventsInDoc = (doc, lang) => {\n const headingIds = languages[lang].dayPage.headingIds.events;\n return { events:\n eventsForYearListElements(listElementsByHeadingID(doc, headingIds, lang), false, lang)\n };\n};\n\n/**\n * Gets array of WMFEvent models of holidays and observances found in a document\n *\n * @param {!Document} doc a DOM document to examine\n * @param {!string} lang a string for project language code\n * @return {!Object} an object containing list of holidays and observances\n */\nconst holidaysInDoc = (doc, lang) => {\n const headingIds = languages[lang].dayPage.headingIds.holidays;\n return { holidays:\n holidaysForHolidayListElements(listElementsByHeadingID(doc, headingIds, lang))\n };\n};\n\n/**\n * Gets array of WMFEvent models of editor curated selected anniversaries found in a document\n *\n * @param {!Document} doc a DOM document to examine\n * @param {!string} lang a string for project language code\n * @return {!Object} an object containing list of selected anniversaries\n */\nconst selectionsInDoc = (doc, lang) => {\n const selector = languages[lang].selectedPage.listElementSelector;\n return { selected:\n eventsForYearListElements(doc.querySelectorAll(selector), true, lang)\n };\n};\n\n/**\n * Gets dictionary of arrays of WMFEvent models of all types: 'births', 'deaths', 'events',\n * 'holidays' and 'selected'\n *\n * @param {!Document} dayDoc a DOM document of events on a given day\n * @param {!Document} selectionsDoc a DOM document of editor curated events for a given day\n * @param {!string} lang a string for project language code\n * @return {!Object} an object with keys for arrays of 'selected', 'events',\n * 'births', 'deaths', and 'holidays'\n */\nconst everythingInDayAndSelectionsDocs = (dayDoc, selectionsDoc, lang) => {\n const result = {};\n Object.assign(result,\n selectionsInDoc(selectionsDoc, lang),\n eventsInDoc(dayDoc, lang),\n birthsInDoc(dayDoc, lang),\n deathsInDoc(dayDoc, lang),\n holidaysInDoc(dayDoc, lang)\n );\n return result;\n};\n\n/**\n * Determines whether a DOM element has a 'title' property\n *\n * @param {!Object} object DOM element to examine\n * @return {!boolean} true if the object has a 'title' property\n */\nfunction hasTitle(object) {\n return (\n object.hasOwnProperty('title') && // eslint-disable-line no-prototype-builtins\n typeof object.title === 'string'\n );\n}\n\n/**\n * Recursively creates summary promises instead of objects with 'title' properties\n * found in a dom object hierarchy\n *\n * @param {!Object} req the original request\n * @param {!Object} object Dom object to examine\n * @return {Object}\n */\nfunction fetchSummaries(req, object) {\n if (hasTitle(object)) {\n return apiUtil.restGetSummary(req, object.title);\n }\n for (const property in object) {\n if (Object.prototype.hasOwnProperty.call(object, property)) {\n if (typeof object[property] === 'object') {\n object[property] = fetchSummaries(req, object[property]);\n }\n }\n }\n return object;\n}\n\n/**\n * Ends a response. Creates $merge nodes and sets eTags, status etc.\n *\n * @param {!Object} req the original request\n * @param {!Object} res a response to end\n * @param {!Object} output a payload to JSONify and deliver\n * @param {?number} revision a revision\n * @param sendResponse\n * @return {Promise}\n */\nconst endResponseWithOutput = (req, res, output, revision, sendResponse = true) => {\n fetchSummaries(req, output);\n return util.promiseAwaitAll(output, true, req.logger)\n .then((resolvedOutput) => {\n // Drop duplicate pages from the output\n Object.keys(resolvedOutput).forEach((key) => {\n if (!Array.isArray(resolvedOutput[key])) {\n return;\n }\n resolvedOutput[key].forEach((elem) => {\n if (!elem || !Array.isArray(elem.pages)) {\n return;\n }\n elem.pages = util.removeDuplicateTitles(elem.pages);\n });\n });\n if (!sendResponse) {\n return resolvedOutput;\n }\n return si.getSiteInfo(req)\n .then((siteinfo) => {\n res.status(200);\n util.setETag(res, revision);\n if (siteinfo.variants && siteinfo.variants.length) {\n res.header('vary', 'accept-language');\n }\n util.setContentType(res, util.CONTENT_TYPES.onthisday);\n res.json(resolvedOutput).end();\n });\n });\n};\n\n/**\n * Promises to get Parsoid html for a title\n *\n * @param {!Object} app the application object\n * @param {!Request} req a request\n * @param {!string} title a page title to fetch\n * @return {!Promise} a Promise resolving to a response\n */\nfunction fetchParsoidHtmlForTitle(app, req, title) {\n const parsoidReq = Object.create(req);\n parsoidReq.params.title = title;\n return parsoid.getParsoidHtml(parsoidReq);\n}\n\n/**\n * Fetches document and revision for URI\n *\n * @param {!Object} app the application object\n * @param {!Object} req a request\n * @param {!Function} titleFunction a function for getting source page title from request\n * @return {!Promise} a Promise resolving to array containing [document, revision] for URI\n */\nfunction fetchDocAndRevision(app, req, titleFunction) {\n let revision;\n return fetchParsoidHtmlForTitle(app, req, titleFunction(req))\n .then((response) => {\n revision = util.getRevisionFromEtag(response.headers);\n return response.body;\n })\n .then(docUtil.createDocument)\n .then((doc) => [ doc, revision ]);\n}\n\nconst assertLanguage = (lang) => {\n if (!languages[lang]) {\n throw new HTTPError({\n status: 404,\n type: 'not_found',\n title: 'Not found',\n detail: 'The language you have requested is not yet supported.'\n });\n }\n};\n\n/**\n * Fetches document for URI, extracts sought elements, responds\n *\n * @param {!Object} app the application object\n * @param {!Request} req a request\n * @param {!Response} res a response\n * @param {!Function} titleFunction a function for getting source page title from request\n * @param {!Function} extractionFunction a function for extracting sought elements\n * (births, deaths, holidays, etc)\n * @param {boolean} sendResponse send an HTTP response or return early with the data payload\n * @return {!Promise} a Promise resolving when response has completed\n */\nfunction fetchAndRespond(app, req, res, titleFunction, extractionFunction, sendResponse = true) {\n const lang = req.params.domain.split('.')[0];\n assertLanguage(lang);\n\n return fetchDocAndRevision(app, req, titleFunction)\n .then((docAndRevision) => {\n const doc = docAndRevision[0];\n const revision = docAndRevision[1];\n const output = extractionFunction(doc, lang);\n return endResponseWithOutput(req, res, output, revision, sendResponse);\n });\n}\n\nmodule.exports = {\n dayTitleForRequest,\n selectedTitleForRequest,\n birthsInDoc,\n deathsInDoc,\n eventsInDoc,\n holidaysInDoc,\n selectionsInDoc,\n everythingInDayAndSelectionsDocs,\n assertLanguage,\n fetchAndRespond,\n fetchDocAndRevision,\n titleForDayPageFromMonthDayNumberStrings,\n WMFPage,\n WMFEvent,\n WMFHoliday,\n wmfHolidayFromListElement,\n wmfEventFromListElement,\n wmfPageFromAnchorElement,\n eventsForYearListElements,\n reverseChronologicalWMFEventComparator,\n listElementsByHeadingID,\n isAnchorForYear,\n addPrefixFromAncestorListElementsToListElement,\n endResponseWithOutput\n};\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/on-this-day.languages.js","messages":[{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":28,"column":11,"nodeType":"NewExpression","endLine":28,"endColumn":109},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":30,"column":11,"nodeType":"NewExpression","endLine":30,"endColumn":74},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":32,"column":11,"nodeType":"NewExpression","endLine":32,"endColumn":109},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":60,"column":11,"nodeType":"NewExpression","endLine":60,"endColumn":102},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":62,"column":11,"nodeType":"NewExpression","endLine":62,"endColumn":74},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":64,"column":11,"nodeType":"NewExpression","endLine":64,"endColumn":102},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":100,"column":11,"nodeType":"NewExpression","endLine":100,"endColumn":123},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":102,"column":11,"nodeType":"NewExpression","endLine":102,"endColumn":74},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":104,"column":11,"nodeType":"NewExpression","endLine":104,"endColumn":123},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":128,"column":11,"nodeType":"NewExpression","endLine":128,"endColumn":95},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":130,"column":11,"nodeType":"NewExpression","endLine":130,"endColumn":74},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":132,"column":11,"nodeType":"NewExpression","endLine":132,"endColumn":95},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":156,"column":11,"nodeType":"NewExpression","endLine":156,"endColumn":94},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":158,"column":11,"nodeType":"NewExpression","endLine":158,"endColumn":74},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":160,"column":11,"nodeType":"NewExpression","endLine":160,"endColumn":94},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":189,"column":11,"nodeType":"NewExpression","endLine":189,"endColumn":110},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":191,"column":11,"nodeType":"NewExpression","endLine":191,"endColumn":85},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":193,"column":11,"nodeType":"NewExpression","endLine":193,"endColumn":110},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":217,"column":11,"nodeType":"NewExpression","endLine":217,"endColumn":98},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":219,"column":11,"nodeType":"NewExpression","endLine":219,"endColumn":74},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":221,"column":11,"nodeType":"NewExpression","endLine":221,"endColumn":98},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":245,"column":11,"nodeType":"NewExpression","endLine":245,"endColumn":88},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":247,"column":11,"nodeType":"NewExpression","endLine":247,"endColumn":74},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":249,"column":11,"nodeType":"NewExpression","endLine":249,"endColumn":88},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":273,"column":13,"nodeType":"NewExpression","endLine":273,"endColumn":102},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":275,"column":13,"nodeType":"NewExpression","endLine":275,"endColumn":76},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":277,"column":13,"nodeType":"NewExpression","endLine":277,"endColumn":102},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":301,"column":11,"nodeType":"NewExpression","endLine":301,"endColumn":110},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":303,"column":11,"nodeType":"NewExpression","endLine":303,"endColumn":85},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":305,"column":11,"nodeType":"NewExpression","endLine":305,"endColumn":110},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":335,"column":11,"nodeType":"NewExpression","endLine":335,"endColumn":94},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":337,"column":11,"nodeType":"NewExpression","endLine":337,"endColumn":74},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":339,"column":11,"nodeType":"NewExpression","endLine":339,"endColumn":94},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":362,"column":11,"nodeType":"NewExpression","endLine":362,"endColumn":106},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":364,"column":11,"nodeType":"NewExpression","endLine":364,"endColumn":74},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":366,"column":11,"nodeType":"NewExpression","endLine":366,"endColumn":106},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":390,"column":11,"nodeType":"NewExpression","endLine":390,"endColumn":98},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":392,"column":11,"nodeType":"NewExpression","endLine":392,"endColumn":84}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":38,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst dashChars = String.raw`\\u002D\\u2013\\u2014\\u2212`;\n\nconst languages = {\n\n en: {\n monthNames: [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n ],\n dayPage: {\n // https://en.wikipedia.org/api/rest_v1/page/html/May_22\n nameFormatter: (monthName, monthNumber, dayNumber) => `${ monthName }_${ dayNumber }`,\n headingIds: {\n births: [ 'Births' ],\n deaths: [ 'Deaths' ],\n events: [ 'Events' ],\n holidays: [ 'Holidays_and_observances' ]\n }\n },\n selectedPage: {\n // https://en.wikipedia.org/api/rest_v1/page/html/Wikipedia:Selected_anniversaries%2FMay_22\n nameFormatter: (monthName, monthNumber, dayNumber) => `Wikipedia:Selected_anniversaries/${ monthName }_${ dayNumber }`,\n listElementSelector: 'body > ul li,section > ul li'\n },\n yearListElementRegEx:\n new RegExp(String.raw`^\\s*(?:ad\\s+)?(\\d+)\\s*(?:(bce?)|ad|ce)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i'),\n yearPrefixRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*[:${ dashChars }]*\\s*$`, 'i'),\n selectedRegEx:\n new RegExp(String.raw`^\\s*(?:ad\\s+)?(\\d+)\\s*(?:(bce?)|ad|ce)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i')\n },\n\n de: {\n monthNames: [\n 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',\n 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'\n ],\n dayPage: {\n // https://de.wikipedia.org/api/rest_v1/page/html/22._Mai\n nameFormatter: (monthName, monthNumber, dayNumber) => `${ dayNumber }._${ monthName }`,\n headingIds: {\n births: [ 'Geboren' ],\n deaths: [ 'Gestorben' ],\n events: [ 'Ereignisse' ],\n holidays: [\n 'Feier-_und_Gedenktage',\n 'Feier-,_Gedenk-_und_Aktionstage',\n 'Feier-,_Aktions-_und_Gedenktage'\n ]\n }\n },\n selectedPage: {\n // https://de.wikipedia.org/api/rest_v1/page/html/Wikipedia:Hauptseite%2FJahrestage%2FMai%2F22\n nameFormatter: (monthName, monthNumber, dayNumber) => `Wikipedia:Hauptseite/Jahrestage/${ monthName }/${ dayNumber }`,\n listElementSelector: 'body > ul li,section > ul li'\n },\n yearListElementRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(v\\.\\s*Chr\\.)?\\s*(?::|[${ dashChars }])\\s*(.*\\S.*)`, 'i'),\n yearPrefixRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*[:${ dashChars }]*\\s*$`, 'i'),\n selectedRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(v\\.\\s*Chr\\.)?\\s*(?::|[${ dashChars }])\\s*(.*\\S.*)`, 'i')\n },\n\n fr: {\n monthNames: [\n 'janvier', 'février', 'mars', 'avril', 'mai', 'juin',\n 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'\n ],\n dayPage: {\n // https://fr.wikipedia.org/api/rest_v1/page/html/22_mai\n nameFormatter: (monthName, monthNumber, dayNumber) => {\n if (dayNumber === 1) {\n dayNumber = '1er';\n }\n return `${ dayNumber }_${ monthName }`;\n },\n headingIds: {\n births: [ 'Naissances' ],\n deaths: [ 'Décès' ],\n events: [ 'Événements', 'Évènements', 'Arts,_culture_et_religion', 'Sciences_et_techniques', 'Économie_et_société' ],\n holidays: [ 'Célébrations' ]\n }\n },\n selectedPage: {\n // https://fr.wikipedia.org/api/rest_v1/page/html/Wikipédia:Éphéméride%2F22_mai\n nameFormatter: (monthName, monthNumber, dayNumber) => {\n if (dayNumber === 1) {\n if (new Set([ 1, 2, 3, 5, 9, 10, 11, 12 ]).has(monthNumber)) {\n dayNumber = '1er';\n }\n }\n return `Wikipédia:Éphéméride/${ dayNumber }_${ monthName }`;\n },\n listElementSelector: 'body > ul li,section > ul li'\n },\n yearListElementRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(av\\.\\s*J\\.\\s*[${ dashChars }]C\\.)?\\s*(?::|[${ dashChars }])\\s*(.*\\S.*)`, 'i'),\n yearPrefixRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*[:${ dashChars }]*\\s*$`, 'i'),\n selectedRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(av\\.\\s*J\\.\\s*[${ dashChars }]C\\.)?\\s*(?::|[${ dashChars }])\\s*(.*\\S.*)`, 'i')\n },\n\n sv: {\n monthNames: [\n 'januari', 'februari', 'mars', 'april', 'maj', 'juni',\n 'juli', 'augusti', 'september', 'oktober', 'november', 'december'\n ],\n dayPage: {\n // https://sv.wikipedia.org/api/rest_v1/page/html/22_maj\n nameFormatter: (monthName, monthNumber, dayNumber) => `${ dayNumber }_${ monthName }`,\n headingIds: {\n births: [ 'Födda' ],\n deaths: [ 'Avlidna' ],\n events: [ 'Händelser' ],\n holidays: [ 'Återkommande_bemärkelsedagar' ]\n }\n },\n selectedPage: {\n // https://sv.wikipedia.org/api/rest_v1/page/html/Mall:22_maj\n nameFormatter: (monthName, monthNumber, dayNumber) => `Mall:${ dayNumber }_${ monthName }`,\n listElementSelector: 'body > ul li,section > ul li'\n },\n yearListElementRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(f\\.\\s*Kr\\.)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i'),\n yearPrefixRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*[:${ dashChars }]*\\s*$`, 'i'),\n selectedRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(f\\.\\s*Kr\\.)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i')\n },\n\n pt: {\n monthNames: [\n 'de janeiro', 'de fevereiro', 'de março', 'de abril', 'de maio', 'de junho',\n 'de julho', 'de agosto', 'de setembro', 'de outubro', 'de novembro', 'de dezembro'\n ],\n dayPage: {\n // https://pt.wikipedia.org/api/rest_v1/page/html/15_de_maio\n nameFormatter: (monthName, monthNumber, dayNumber) => `${ dayNumber }_${ monthName }`,\n headingIds: {\n births: [ 'Nascimentos' ],\n deaths: [ 'Mortes', 'Falecimentos' ],\n events: [ 'Eventos', 'Eventos_históricos' ],\n holidays: [ 'Feriados_e_eventos_cíclicos' ]\n }\n },\n selectedPage: {\n // https://pt.wikipedia.org/api/rest_v1/page/html/Wikipédia:Efemérides%2F22_de_maio\n nameFormatter: (monthName, monthNumber, dayNumber) => `Wikipédia:Efemérides/${ dayNumber }_${ monthName }`,\n listElementSelector: 'body > ul li,section > ul li'\n },\n yearListElementRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(a\\.\\s*C\\.)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i'),\n yearPrefixRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*[:${ dashChars }]*\\s*$`, 'i'),\n selectedRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(a\\.\\s*C\\.)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i')\n },\n\n ru: {\n monthNames: [\n 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня',\n 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'\n ],\n dayPage: {\n // https://ru.wikipedia.org/api/rest_v1/page/html/22_мая\n nameFormatter: (monthName, monthNumber, dayNumber) => `${ dayNumber }_${ monthName }`,\n headingIds: {\n births: [ 'Родились' ],\n deaths: [ 'Скончались' ],\n events: [ 'События' ],\n holidays: [\n 'Праздники',\n 'Праздники_и_памятные_дни',\n 'Праздники_и_памятные_даты',\n 'Праздники,_памятные_даты'\n ]\n }\n },\n selectedPage: {\n // https://ru.wikipedia.org/api/rest_v1/page/html/Шаблон:События_дня:05-30\n nameFormatter: (monthName, monthNo, dayNo) => `Шаблон:События_дня:${ monthNo < 10 ? `0${ monthNo }` : monthNo }-${ dayNo }`,\n listElementSelector: 'body > ul li,section > ul li'\n },\n yearListElementRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(?:год)?\\s*(до\\s*н\\.\\s*э\\.)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i'),\n yearPrefixRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(?:год)?\\s*[:${ dashChars }]*\\s*$`, 'i'),\n selectedRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(?:год)?\\s*(до\\s*н\\.\\s*э\\.)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i')\n },\n\n es: {\n monthNames: [\n 'de enero', 'de febrero', 'de marzo', 'de abril', 'de mayo', 'de junio',\n 'de julio', 'de agosto', 'de septiembre', 'de octubre', 'de noviembre', 'de diciembre'\n ],\n dayPage: {\n // https://es.wikipedia.org/api/rest_v1/page/html/22_de_mayo\n nameFormatter: (monthName, monthNumber, dayNumber) => `${ dayNumber }_${ monthName }`,\n headingIds: {\n births: [ 'Nacimientos' ],\n deaths: [ 'Fallecimientos' ],\n events: [ 'Acontecimientos' ],\n holidays: [ 'Celebraciones' ]\n }\n },\n selectedPage: {\n // https://es.wikipedia.org/api/rest_v1/page/html/Plantilla:Efemérides_-_22_de_mayo\n nameFormatter: (monthName, monthNumber, dayNumber) => `Plantilla:Efemérides - ${ dayNumber }_${ monthName }`,\n listElementSelector: 'body > ul li,section > ul li'\n },\n yearListElementRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(a\\.\\s*C\\.)?\\s*\\.*[:${ dashChars }]\\s*(.*\\S.*)`, 'i'),\n yearPrefixRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*[:${ dashChars }]*\\s*$`, 'i'),\n selectedRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(a\\.\\s*C\\.)?\\s*\\.*[:${ dashChars }]\\s*(.*\\S.*)`, 'i')\n },\n\n ar: {\n monthNames: [\n 'يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو',\n 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'\n ],\n dayPage: {\n // https://ar.wikipedia.org/api/rest_v1/page/html/22_مايو\n nameFormatter: (monthName, monthNumber, dayNumber) => `${ dayNumber }_${ monthName }`,\n headingIds: {\n births: [ 'مواليد' ],\n deaths: [ 'وفيات' ],\n events: [ 'أحداث', 'الأحداث' ],\n holidays: [ 'أعياد_ومناسبات' ]\n }\n },\n selectedPage: {\n // https://ar.wikipedia.org/api/rest_v1/page/html/%D9%88%D9%8A%D9%83%D9%8A%D8%A8%D9%8A%D8%AF%D9%8A%D8%A7%3A%D9%81%D9%8A_%D9%87%D8%B0%D8%A7_%D8%A7%D9%84%D9%8A%D9%88%D9%85%2F22_%D9%85%D8%A7%D9%8A%D9%88\n nameFormatter: (monthName, monthNumber, dayNumber) => `ويكيبيديا:في_هذا_اليوم/${ dayNumber }_${ monthName }`,\n listElementSelector: 'body > ul li,section > ul li'\n },\n yearListElementRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(ق.م)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i'),\n yearPrefixRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*[:${ dashChars }]*\\s*$`, 'i'),\n selectedRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(ق.م)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i')\n },\n\n bs: {\n monthNames: [\n 'januar', 'februar', 'mart', 'april', 'maj', 'juni',\n 'juli', 'august', 'septembar', 'oktobar', 'novembar', 'decembar'\n ],\n dayPage: {\n // https://bs.wikipedia.org/wiki/1._januar\n nameFormatter: (monthName, monthNumber, dayNumber) => `${ dayNumber }_${ monthName }`,\n headingIds: {\n births: [ 'Rođeni' ],\n deaths: [ 'Umrli' ],\n events: [ 'Događaji' ],\n holidays: [ 'Praznici' ]\n }\n },\n selectedPage: {\n // https://bs.wikipedia.org/wiki/%C5%A0ablon:Na_dana%C5%A1nji_dan/1._januar\n nameFormatter: (monthName, monthNumber, dayNumber) => `Šablon:Na_današnji_dan/${ dayNumber }._${ monthName }`,\n listElementSelector: 'body > ul li,section > ul li'\n },\n yearListElementRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(p\\. n\\. e)?\\s*(?::|[${ dashChars }])\\s*(.*\\S.*)`, 'i'),\n yearPrefixRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*[:${ dashChars }]*\\s*$`, 'i'),\n selectedRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(p\\. n\\. e)?\\s*(?::|[${ dashChars }])\\s*(.*\\S.*)`, 'i')\n },\n\n uk: {\n monthNames: [\n 'січня', 'лютого', 'березня', 'квітня', 'травня', 'червня',\n 'липня', 'серпня', 'вересня', 'жовтня', 'листопада', 'грудня'\n ],\n dayPage: {\n // https://uk.wikipedia.org/api/rest_v1/page/html/1_січня\n nameFormatter: (monthName, monthNumber, dayNumber) => `${ dayNumber }_${ monthName }`,\n headingIds: {\n births: [ 'Народились' ],\n deaths: [ 'Померли' ],\n events: [ 'Події' ],\n holidays: [ 'Свята_і_пам\\'ятні_дні' ]\n }\n },\n selectedPage: {\n // https://uk.wikipedia.org/api/rest_v1/page/html/Вікіпедія%3AПроект%3AЦей_день_в_історії%2F1_січня\n nameFormatter: (monthName, monthNumber, dayNumber) => `Вікіпедія:Проект:Цей день в історії/${ dayNumber }_${ monthName }`,\n listElementSelector: 'body > div.onthisdayselected > ul li, section > div.onthisdayselected > ul li'\n },\n yearListElementRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(?:рік)?\\s*(до\\s*н\\.\\s*е\\.)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i'),\n yearPrefixRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(?:рік)?\\s*[:${ dashChars }]*\\s*$`, 'i'),\n selectedRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(?:рік)?\\s*(до\\s*н\\.\\s*е\\.)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i')\n },\n\n it: {\n monthNames: [\n 'gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno',\n 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'\n ],\n dayPage: {\n // https://it.wikipedia.org/wiki/25_luglio\n // TODO - births and deaths are not yet supported since they exist in the separate pages\n // List of births - https://it.wikipedia.org/wiki/Nati_il_25_luglio\n // List of deaths - https://it.wikipedia.org/wiki/Morti_il_23_luglio\n nameFormatter: (monthName, monthNumber, dayNumber) => `${ dayNumber }_${ monthName }`,\n headingIds: {\n births: ['Nati'],\n deaths: ['Morti'],\n events: ['Eventi'],\n holidays: ['Feste_e_ricorrenze']\n }\n },\n selectedPage: {\n // https://it.wikipedia.org/api/rest_v1/page/html/Template:PaginaPrincipale%2FAttualita%2F25_luglio\n nameFormatter: (monthName, monthNumber, dayNumber) => `Template:PaginaPrincipale/Attualita/${ dayNumber }_${ monthName }`,\n // TODO: the above page can be fetched but not parsed, being a single <p> element.\n // We probably need to wait for the switch to the new template:\n // https://it.wikipedia.org/api/rest_v1/page/html/Template:Pagina_principale%2FAttualit%E0%2F25_luglio\n listElementSelector: 'body > ul li,section > ul li'\n },\n yearListElementRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(a\\.\\s*C\\.)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i'),\n yearPrefixRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*[:${ dashChars }]*\\s*$`, 'i'),\n selectedRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(a\\.\\s*C\\.)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i')\n },\n\n tr: {\n monthNames: [\n 'Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'\n ],\n dayPage: {\n // https://tr.wikipedia.org/api/rest_v1/page/html/Nisan_23\n nameFormatter: (monthName, monthNumber, dayNumber) => `${ dayNumber }_${ monthName }`,\n headingIds: {\n births: [ 'Doğumlar' ],\n deaths: [ 'Ölümler' ],\n events: [ 'Olaylar' ],\n holidays: [ 'Tatiller_ve_özel_günler' ]\n }\n },\n selectedPage: {\n // https://tr.wikipedia.org/api/rest_v1/page/html/%C5%9Eablon%3ATarihte_bug%C3%BCn%2F22_Ekim\n nameFormatter: (monthName, monthNumber, dayNumber) => `Şablon:Tarihte_bugün/${ dayNumber }_${ monthName }`,\n listElementSelector: 'body > ul li,section > ul li'\n },\n yearListElementRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(?:(M.?Ö.?))?\\s*(?:yil)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i'),\n yearPrefixRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*[:${ dashChars }]*\\s*$`, 'i'),\n selectedRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(?:(M.?Ö.?))?\\s*(?:yil)?\\s*[${ dashChars }]\\s*(.*\\S.*)`, 'i')\n },\n\n zh: {\n monthNames: [\n '1月', '2月', '3月', '4月', '5月', '6月',\n '7月', '8月', '9月', '10月', '11月', '12月'\n ],\n dayPage: {\n // https://zh.wikipedia.org/api/rest_v1/page/html/5月22日\n nameFormatter: (monthName, monthNumber, dayNumber) => `${ monthName }${ dayNumber }日`,\n headingIds: {\n births: [ '出生'],\n deaths: [ '逝世' ],\n events: [ '大事记', '大事記', '大事紀' ],\n holidays: [ '节假日和习俗', '節假日和習俗', '节日、风俗习惯', '節日、風俗習慣' ]\n }\n },\n selectedPage: {\n // https://zh.wikipedia.org/api/rest_v1/page/html/Wikipedia:历史上的今天%2F5月22日\n nameFormatter: (monthName, monthNumber, dayNumber) => `Wikipedia:历史上的今天/${ monthName }${ dayNumber }日`,\n listElementSelector: 'section > dl > .event'\n },\n yearListElementRegEx:\n new RegExp(String.raw`^\\s*(前?)\\s*(\\d+)\\s*(?:年)?\\s*[::${ dashChars }]\\s*(.*\\S.*)$`, 'i'),\n yearPrefixRegEx:\n new RegExp(String.raw`^\\s*(\\d+)\\s*(?:年)?\\s*[::${ dashChars }]*\\s*$`, 'i'),\n selectedRegEx:\n /(前?)(\\d+)(?:年)?\\s*(.*\\S.*)/\n }\n\n};\n\nmodule.exports = {\n languages\n};\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/pageviews.js","messages":[{"ruleId":"jsdoc/check-access","severity":1,"message":"At most one access-control tag may be present on a jsdoc block.","line":36,"column":1,"nodeType":"Block","endLine":40,"endColumn":4},{"ruleId":"jsdoc/valid-types","severity":1,"message":"@private should not have a bracketed type in \"jsdoc\" mode.","line":37,"column":1,"nodeType":"Block","endLine":37,"endColumn":1},{"ruleId":"jsdoc/valid-types","severity":1,"message":"@private should not have a bracketed type in \"jsdoc\" mode.","line":38,"column":1,"nodeType":"Block","endLine":38,"endColumn":1},{"ruleId":"jsdoc/valid-types","severity":1,"message":"@private should not have a bracketed type in \"jsdoc\" mode.","line":39,"column":1,"nodeType":"Block","endLine":39,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Platform' is undefined.","line":53,"column":1,"nodeType":"Block","endLine":53,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Agent' is undefined.","line":54,"column":1,"nodeType":"Block","endLine":54,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Granularity' is undefined.","line":56,"column":1,"nodeType":"Block","endLine":56,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Platform' is undefined.","line":71,"column":1,"nodeType":"Block","endLine":71,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":8,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst api = require('./api-util');\nconst dateUtil = require('./date-util');\n\n/**\n * @readonly\n * @enum {!string}\n */\nmodule.exports.Platform = {\n ALL: 'all-access',\n DESKTOP_WEB: 'desktop',\n MOBILE_WEB: 'mobile-web',\n MOBILE_APP: 'mobile-app'\n};\n\n/**\n * @readonly\n * @enum {!string}\n */\nmodule.exports.Agent = {\n ALL: 'all-agents',\n USER: 'user',\n SPIDER: 'spider',\n BOT: 'bot'\n};\n\n/**\n * @readonly\n * @enum {!string}\n */\nmodule.exports.Granularity = {\n DAILY: 'daily'\n};\n\n/**\n * @private {!Object} app\n * @private {!string} apiDomain RESTBase API domain; e.g., wikimedia.org\n * @private {!Object} req\n */\nmodule.exports.Client = class {\n /**\n * @param {!Object} req original Request object\n * @param {!Object} restReq new Request object for the Pageviews API\n */\n constructor(req, restReq) {\n this.req = req;\n this.restReq = restReq;\n }\n\n /**\n * @param {!string} domain Top level project domain to filter; e.g., de.wikipedia\n * @param {!Platform} platform Device platform to filter\n * @param {!Agent} agent User agent to filter\n * @param {!string} title Normalized article title\n * @param {!Granularity} granularity Result time unit\n * @param {!Date} start Inclusive start date\n * @param {!Date} end Inclusive end date\n * @return {!Promise} Daily pageviews on domain from platform for title from [start, end]\n */\n reqPage(domain, platform, agent, title, granularity, start, end) {\n const titleEncoded = encodeURIComponent(title);\n const startStr = dateUtil.formatYYYYMMDD(start);\n const endStr = dateUtil.formatYYYYMMDD(end);\n const path = `metrics/pageviews/per-article/${ domain }/${ platform }/${ agent }/${ titleEncoded }/${ granularity }/${ startStr }/${ endStr }`;\n return api.restGatewayGet(this.req, path, this.restReq);\n }\n\n /**\n * @param {!string} domain Top level project domain to filter; e.g., de.wikipedia\n * @param {!Platform} platform Device platform to filter\n * @param {!Date} date\n * @return {!Promise} Top pageviews on domain from platform for date\n */\n reqTop(domain, platform, date) {\n const year = date.getUTCFullYear();\n const month = dateUtil.pad(date.getUTCMonth() + 1);\n const day = dateUtil.pad(date.getUTCDate());\n const path = `metrics/pageviews/top/${ domain }/${ platform }/${ year }/${ month }/${ day }`;\n return api.restGatewayGet(this.req, path, this.restReq);\n }\n};\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/parsoid.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/random.js","messages":[{"ruleId":"no-shadow","severity":1,"message":"'score' is already declared in the upper scope on line 31 column 10.","line":38,"column":9,"nodeType":"Identifier","messageId":"noShadow","endLine":38,"endColumn":14},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"scoredResults\" type.","line":55,"column":1,"nodeType":"Block","endLine":55,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Random article promise and related support functions.\n */\n\n'use strict';\n\nconst api = require('./api-util');\nconst util = require('./util');\nconst si = require('./siteinfo');\nconst BBPromise = require('bluebird');\n\n/**\n * Returns a numeric score which can be used to roughly determine the relative \"quality\" of random\n * results.\n *\n * Scores are calculated as follows:\n *\n * 2 points for having:\n * thumb url\n *\n * 1 point for having:\n * wikidataDescription\n *\n * -10 point for being:\n * disambiguation page\n * list item page\n *\n * @param {?Object} page Page object from MW API\n * @return {!number} quality score\n */\nfunction score(page) {\n\n const isDisambiguationPage = (page.pageprops && page.pageprops.disambiguation) ||\n (page.description && page.description.includes('disambiguation page'));\n\n const isListPage = page.description && page.description.includes('Wikimedia list article');\n\n let score = 0.0;\n\n if (page.pageprops && (page.pageprops.page_image || page.pageprops.page_image_free)) {\n score += 2.0;\n }\n if (page.description) {\n score += 1.0;\n }\n if (isDisambiguationPage || isListPage) {\n score -= 10.0;\n }\n return score;\n}\n\n/**\n * Returns random page from max score pages list.\n *\n * @param scoredResults\n * @return {*}\n */\nfunction pickBestResult(scoredResults) {\n const maxScore = Math.max.apply(\n scoredResults,\n scoredResults.map((page) => page.score)\n );\n const scoredPagesFiltered = scoredResults.filter((page) => page.score === maxScore);\n\n return scoredPagesFiltered[Math.floor(Math.random() * scoredPagesFiltered.length)];\n}\n\n/**\n * Returns a single random result well suited to card-type layouts, i.e.\n * one likely to have a page image and wikidata description.\n *\n * Multiple random items are requested, but only the result having\n * the highest relative score is returned. Requesting about 12 items\n * seems to consistently produce a really \"good\" result.\n *\n * @param {!Object} req Request object\n * @return {!Promise}\n */\nfunction promise(req) {\n const itemsToRequest = 12;\n return BBPromise.join(\n si.getSiteInfo(req),\n api.mwApiGet(req, {\n action: 'query',\n format: 'json',\n formatversion: 2,\n generator: 'random',\n grnfilterredir: 'nonredirects',\n grnlimit: itemsToRequest,\n grnnamespace: 0,\n prop: 'description|pageprops'\n }),\n (siteinfo, queryResponse) => {\n const pages = queryResponse.body.query.pages;\n const scoredPages = pages.map((page) => Object.assign(page, { score: score(page) }));\n const bestResult = pickBestResult(scoredPages);\n return util.getDbTitle(bestResult.title, siteinfo);\n });\n}\n\nmodule.exports = {\n promise,\n\n // visible for testing\n pickBestResult\n};\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/siteinfo.js","messages":[{"ruleId":"strict","severity":1,"message":"Use the global form of 'use strict'.","line":3,"column":1,"nodeType":"Program","messageId":"global","endLine":59,"endColumn":34},{"ruleId":"security/detect-unsafe-regex","severity":1,"message":"Unsafe Regular Expression","line":10,"column":29,"nodeType":"Literal","endLine":10,"endColumn":55}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"// use strict;\n\nconst api = require('./api-util');\n\nconst siteInfoCache = {};\n\nfunction findSharedRepoDomain(siteInfoRes) {\n const sharedRepo = (siteInfoRes.body.query.repos || []).find((repo) => repo.name === 'shared');\n if (sharedRepo) {\n const domainMatch = /^((:?https?:)?\\/\\/[^/]+)/.exec(sharedRepo.descBaseUrl);\n if (domainMatch) {\n return domainMatch[0];\n }\n }\n}\n\n/**\n * Builds a request for siteinfo data for the MW site for the request domain.\n *\n * @param {!Object} req the request object\n * @return {!Promise} a promise resolving as an JSON object containing the response\n */\nfunction getSiteInfo(req) {\n const rp = req.params;\n if (!siteInfoCache[rp.domain]) {\n const query = {\n action: 'query',\n meta: 'siteinfo|allmessages',\n siprop: 'general|languagevariants|namespaces|namespacealiases|specialpagealiases',\n ammessages: 'toc'\n };\n siteInfoCache[rp.domain] = api.mwApiGet(req, query)\n .then((res) => {\n const general = res.body.query.general;\n const allmessages = res.body.query.allmessages;\n\n return {\n general: {\n mainpage: general.mainpage,\n lang: general.lang,\n legaltitlechars: general.legaltitlechars,\n case: general.case,\n mobileserver: general.mobileserver,\n toctitle: allmessages[0].content\n },\n variants: res.body.query.languagevariants &&\n res.body.query.languagevariants[general.lang] &&\n Object.keys(res.body.query.languagevariants[general.lang]),\n namespaces: res.body.query.namespaces,\n namespacealiases: res.body.query.namespacealiases,\n specialpagealiases: res.body.query.specialpagealiases,\n sharedRepoRootURI: findSharedRepoDomain(res)\n };\n });\n }\n return siteInfoCache[rp.domain];\n}\n\nmodule.exports = { getSiteInfo };\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/swagger-ui.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/util.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Application' is undefined.","line":104,"column":1,"nodeType":"Block","endLine":104,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Application' is undefined.","line":142,"column":1,"nodeType":"Block","endLine":142,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Router' is undefined.","line":222,"column":1,"nodeType":"Block","endLine":222,"endColumn":1},{"ruleId":"jsdoc/require-returns-check","severity":1,"message":"JSDoc @return declaration present but return expression not available in function.","line":280,"column":1,"nodeType":"Block","endLine":286,"endColumn":4},{"ruleId":"jsdoc/require-returns-check","severity":1,"message":"JSDoc @return declaration present but return expression not available in function.","line":293,"column":1,"nodeType":"Block","endLine":298,"endColumn":4},{"ruleId":"jsdoc/require-returns-check","severity":1,"message":"JSDoc @return declaration present but return expression not available in function.","line":306,"column":1,"nodeType":"Block","endLine":311,"endColumn":4},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Application' is undefined.","line":378,"column":1,"nodeType":"Block","endLine":378,"endColumn":1},{"ruleId":"default-param-last","severity":1,"message":"Default parameters should be last.","line":450,"column":34,"nodeType":"AssignmentPattern","messageId":"shouldBeLast","endLine":450,"endColumn":57}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":8,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst BBPromise = require('bluebird');\nconst preq = require('preq');\nconst express = require('express');\nconst assert = require('assert');\nconst uuidv1 = require('uuid').v1;\nconst bunyan = require('bunyan');\nconst uuid = require('cassandra-uuid');\n\n// service-specific deps\nconst Title = require('mediawiki-title').Title;\n\n/**\n * Error instance wrapping HTTP error responses\n */\nclass HTTPError extends Error {\n\n constructor(response) {\n super();\n Error.captureStackTrace(this, HTTPError);\n\n if (response.constructor !== Object) {\n // just assume this is just the error message\n response = {\n status: 500,\n type: 'internal_error',\n title: 'InternalError',\n detail: response\n };\n }\n\n this.name = this.constructor.name;\n this.message = `${ response.status }`;\n if (response.type) {\n this.message += `: ${ response.type }`;\n }\n\n Object.assign(this, response);\n }\n}\n\n/**\n * Generates an object suitable for logging out of a request object\n *\n * @param {!Request} req the request\n * @param {?RegExp} allowListRegExp the RegExp used to filter headers\n * @return {!Object} an object containing the key components of the request\n */\nfunction reqForLog(req, allowListRegExp) {\n\n const ret = {\n url: req.originalUrl,\n headers: {},\n method: req.method,\n params: req.params,\n query: req.query,\n body: req.body,\n remoteAddress: req.connection.remoteAddress,\n remotePort: req.connection.remotePort\n };\n\n if (req.headers && allowListRegExp) {\n Object.keys(req.headers).forEach((hdr) => {\n if (allowListRegExp.test(hdr)) {\n ret.headers[hdr] = req.headers[hdr];\n }\n });\n }\n\n return ret;\n\n}\n\n/**\n * Serialises an error object in a form suitable for logging.\n *\n * @param {!Error} err error to serialise\n * @return {!Object} the serialised version of the error\n */\nfunction errForLog(err) {\n\n const ret = bunyan.stdSerializers.err(err);\n ret.status = err.status;\n ret.type = err.type;\n ret.detail = err.detail;\n\n // log the stack trace only for 500 errors\n if (Number.parseInt(ret.status, 10) !== 500) {\n ret.stack = undefined;\n }\n\n return ret;\n\n}\n\n/**\n * Wraps all of the given router's handler functions with\n * promised try blocks so as to allow catching all errors,\n * regardless of whether a handler returns/uses promises\n * or not.\n *\n * @param {!Object} route the object containing the router and path to bind it to\n * @param {!Application} app the application object\n */\nfunction wrapRouteHandlers(route, app) {\n\n route.router.stack.forEach((routerLayer) => {\n let path = (route.path + routerLayer.route.path.slice(1))\n .replace(/\\/:/g, '/--')\n .replace(/^\\//, '')\n .replace(/[/?]+$/, '');\n path = app.metrics.normalizeName(path || 'root');\n routerLayer.route.stack.forEach((layer) => {\n const origHandler = layer.handle;\n layer.handle = (req, res, next) => {\n const startTime = Date.now();\n BBPromise.try(() => origHandler(req, res, next))\n .catch(next)\n .finally(() => {\n let statusCode = parseInt(res.statusCode, 10) || 500;\n if (statusCode < 100 || statusCode > 599) {\n statusCode = 500;\n }\n const statusClass = `${ Math.floor(statusCode / 100) }xx`;\n const stat = `${ path }.${ req.method }.`;\n app.metrics.endTiming([\n stat + statusCode,\n stat + statusClass,\n `${ stat }ALL`\n ], startTime);\n });\n };\n });\n });\n\n}\n\n/**\n * Generates an error handler for the given applications and installs it.\n *\n * @param {!Application} app the application object to add the handler to\n */\nfunction setErrorHandler(app) {\n\n app.use((err, req, res, next) => {\n let errObj;\n // ensure this is an HTTPError object\n if (err.constructor === HTTPError) {\n errObj = err;\n } else if (err instanceof Error) {\n // is this an HTTPError defined elsewhere? (preq)\n if (err.constructor.name === 'HTTPError') {\n const o = { status: err.status };\n if (err.body && err.body.constructor === Object) {\n Object.keys(err.body).forEach((key) => {\n o[key] = err.body[key];\n });\n } else {\n o.detail = err.body;\n }\n o.message = err.message;\n errObj = new HTTPError(o);\n } else {\n // this is a standard error, convert it\n errObj = new HTTPError({\n status: 500,\n type: 'internal_error',\n title: err.name,\n detail: err.detail || err.message,\n stack: err.stack\n });\n }\n } else if (err.constructor === Object) {\n // this is a regular object, suppose it's a response\n errObj = new HTTPError(err);\n } else {\n // just assume this is just the error message\n errObj = new HTTPError({\n status: 500,\n type: 'internal_error',\n title: 'InternalError',\n detail: err\n });\n }\n // ensure some important error fields are present\n errObj.status = errObj.status || 500;\n errObj.type = errObj.type || 'internal_error';\n // add the offending URI and method as well\n errObj.method = errObj.method || req.method;\n errObj.uri = errObj.uri || req.url;\n // some set 'message' or 'description' instead of 'detail'\n errObj.detail = errObj.detail || errObj.message || errObj.description || '';\n // adjust the log level based on the status code\n let level = 'error';\n if (Number.parseInt(errObj.status, 10) < 400) {\n level = 'trace';\n } else if (Number.parseInt(errObj.status, 10) < 500) {\n level = 'info';\n }\n // log the error\n const component = (errObj.component ? errObj.component : errObj.status);\n (req.logger || app.logger).log(`${ level }/${ component }`, errForLog(errObj));\n // let through only non-sensitive info\n const respBody = {\n status: errObj.status,\n type: errObj.type,\n title: errObj.title,\n detail: errObj.detail,\n method: errObj.method,\n uri: errObj.uri\n };\n res.status(errObj.status).json(respBody);\n });\n\n}\n\n/**\n * Creates a new router with some default options.\n *\n * @param {?Object} [opts] additional options to pass to express.Router()\n * @return {!Router} a new router object\n */\nfunction createRouter(opts) {\n\n const options = {\n mergeParams: true\n };\n\n if (opts && opts.constructor === Object) {\n Object.assign(options, opts);\n }\n\n return new express.Router(options);\n\n}\n\nfunction removeFragment(href) {\n if (href.includes('#')) {\n return href.slice(0, Math.max(0, href.indexOf('#')));\n }\n return href;\n}\n\nfunction removeLinkPrefix(href) {\n return href.replace(/^\\.\\//, '');\n}\n\nfunction extractDbTitleFromAnchor(anchor) {\n // T308096: Use the original title without language conversion\n if (anchor && anchor.getAttribute('data-mw-variant-orig')) {\n return removeFragment(anchor.getAttribute('data-mw-variant-orig'));\n }\n return anchor && removeFragment(removeLinkPrefix(anchor.getAttribute('href')));\n}\n\nfunction getRbPageSummaryUrl(restbaseTpl, domain, title) {\n const request = restbaseTpl.expand({\n request: {\n params: {\n domain,\n path: `page/summary/${ encodeURIComponent(title) }`\n }\n }\n });\n return request.uri;\n}\n\n/**\n * Get a Title object for a MW title string\n *\n * @param {!string} title a MediaWiki page title string\n * @param {!Object} siteinfo siteinfo from the MW API\n * @return {!string} a mediawiki-title Title object that can be used to obtain a db-normalized title\n */\nfunction getDbTitle(title, siteinfo) {\n return Title.newFromText(title, siteinfo).getPrefixedDBKey();\n}\n\n/**\n * Retrieves the etag from the headers if present. Strips the weak etag prefix (W/) and enclosing\n * quotes.\n *\n * @param {?Object} headers an object of header name/values\n * @return {?string} etag\n */\nfunction getEtagFromHeaders(headers) {\n if (headers && headers.etag) {\n return headers.etag.replace(/^W\\//, '').replace(/\"/g, '');\n }\n}\n\n/**\n * Retrieves the revision from the etag emitted by Parsoid.\n *\n * @param {?Object} headers an object of header name/values\n * @return {?string} revision portion of etag, if found\n */\nfunction getRevisionFromEtag(headers) {\n const etag = getEtagFromHeaders(headers);\n if (etag) {\n return etag.split('/').shift();\n }\n}\n\n/**\n * Retrieves the revision and tid from the etag emitted by Parsoid.\n *\n * @param {?Object} headers an object of header name/values\n * @return {?Object} revision and tid from etag, if found\n */\nfunction getRevAndTidFromEtag(headers) {\n const etag = getEtagFromHeaders(headers);\n if (etag) {\n const etagComponents = etag.split('/');\n return {\n revision: etagComponents[0],\n tid: etagComponents[1]\n };\n }\n}\n\n/* eslint no-bitwise: [\"error\", { \"allow\": [\"<<\"] }] */\nfunction hashCode(string) {\n return string.split('').reduce((prevHash, currVal) => ((prevHash << 5) - prevHash) + currVal.charCodeAt(0), 0);\n}\n\n/**\n * Remove the top-level domain from a domain string, e.g., 'en.wikipedia.org' ->\n * 'en.wikipedia'.\n *\n * @param {!string} domain domain string\n * @return {!string} domain string minus the TLD\n */\nfunction removeTLD(domain) {\n return domain.split('.').slice(0, 2).join('.');\n}\n\n/**\n * Sets the ETag header on the response object, comprised of the revision ID and\n * the time UUID. If the latter is not given, the current time stamp is used to\n * generate it.\n *\n * @param {!Object} response The HTTPResponse object on which to set the header\n * @param {?number} revision The revision integer ID to use\n * @param {?string} tid The time UUID to use; optional\n */\nfunction setETag(response, revision, tid = undefined) {\n assert(['string', 'number'].includes(typeof revision));\n assert(['string', 'undefined'].includes(typeof tid));\n if (!tid) {\n tid = uuid.TimeUuid.now().toString();\n }\n response.set('etag', `\"${ revision }/${ tid }\"`);\n}\n\nfunction getContentTypeString(spec) {\n return `${ spec.type }; charset=utf-8; profile=\"https://www.mediawiki.org/wiki/Specs/${ spec.name }/${ spec.version }\"`;\n}\n\nfunction setContentType(res, spec) {\n if (!spec.name || !spec.version) {\n throw new HTTPError({\n status: 500,\n type: 'invalid_content_type',\n title: 'Only use the allowed content-types',\n detail: `${ spec.name }/${ spec.version } is not an allowed content-type!`\n });\n }\n\n res.type(getContentTypeString(spec));\n}\n\n/**\n * Adds logger to the request and logs it.\n *\n * @param {!*} req request object\n * @param {!Application} app application object\n */\nfunction initAndLogRequest(req, app) {\n req.headers = req.headers || {};\n req.headers['x-request-id'] = req.headers['x-request-id'] || uuidv1();\n req.logger = app.logger.child({\n request_id: req.headers['x-request-id'],\n request: reqForLog(req, app.conf.log_header_allowlist)\n });\n req.context = { reqId: req.headers['x-request-id'] };\n req.issueRequest = (request) => {\n if (!(request.constructor === Object)) {\n request = { uri: request };\n }\n if (request.url) {\n request.uri = request.url;\n delete request.url;\n }\n if (!request.uri) {\n return BBPromise.reject(new HTTPError({\n status: 500,\n type: 'internal_error',\n title: 'No request to issue',\n detail: 'No request has been specified'\n }));\n }\n request.method = request.method || 'get';\n request.headers = request.headers || {};\n Object.assign(request.headers, {\n 'user-agent': app.conf.user_agent,\n 'x-request-id': req.context.reqId\n });\n req.logger.log('trace/req', { msg: 'Outgoing request', out_request: request });\n return preq(request);\n };\n req.logger.log('trace/req', { msg: 'Incoming request' });\n}\n\n/**\n * Remove entries with duplicate 'title' values from an array of objects\n *\n * @param {?Array} arr Array of page/article objects\n * @param {?Function} upd Optional function to update the original item based on the duplicate.\n * Takes two parameters (orig, dupe): orig - the original object,\n * dupe - the duplicate\n * @return {?Array} arr deduplicated by 'title'\n */\nfunction removeDuplicateTitles(arr, upd) {\n const titles = {};\n return arr.filter((item, idx, init) => {\n if (titles[item.title]) {\n if (upd) {\n const orig = init[init.findIndex((el) => el.title === item.title)];\n upd(orig, item);\n }\n return false;\n }\n titles[item.title] = true;\n return true;\n });\n}\n\n/**\n * For a free-form object nested object with promises, awaits all promises in parallel.\n *\n * @param {!Object} object\n * @param {boolean} ignoreRejections whether to ignore rejected promises.\n * If true, rejected promises are ignored and removed from the object.\n * If false, the first rejection is propagated to the returned promise.\n * @param {Object} logger optional logger to log promise rejections.\n * @return {Promise<Object>}\n */\nfunction promiseAwaitAll(object, ignoreRejections = true, logger) {\n const promises = [];\n function collectPromises(subObject, replaceCallback, removeCallback) {\n if (subObject instanceof BBPromise) {\n promises.push(subObject\n .then(\n (value) => replaceCallback(value),\n (err) => {\n if (ignoreRejections) {\n if (logger) {\n logger.log('warn', err);\n }\n removeCallback();\n } else {\n throw err;\n }\n }\n ));\n } else if (Array.isArray(subObject)) {\n subObject.forEach((item) => collectPromises(\n item,\n (value) => {\n subObject[subObject.indexOf(item)] = value;\n },\n () => {\n subObject.splice(subObject.indexOf(item), 1);\n }));\n } else if (typeof subObject === 'object') {\n Object.keys(subObject).forEach((key) => {\n collectPromises(\n subObject[key],\n (value) => {\n subObject[key] = value;\n },\n () => {\n delete subObject[key];\n });\n });\n }\n }\n collectPromises(object);\n return BBPromise.all(promises).thenReturn(object);\n}\n\nconst CONTENT_TYPES = {\n html: { name: 'HTML', version: '2.1.0', type: 'text/html' },\n announcements: { name: 'Announcements', version: '0.3.0', type: 'application/json' },\n onthisday: { name: 'OnThisDay', version: '0.5.0', type: 'application/json' },\n availability: { name: 'Availability', version: '1.0.1', type: 'application/json' },\n random: { name: 'Random', version: '0.7.0', type: 'application/json' },\n unpublished: { name: 'Unpublished', version: '0.0.0', type: 'application/json' }\n};\n\nmodule.exports = {\n HTTPError,\n initAndLogRequest,\n wrapRouteHandlers,\n setErrorHandler,\n router: createRouter,\n\n // service-specific\n extractDbTitleFromAnchor,\n getContentTypeString,\n getRbPageSummaryUrl,\n getDbTitle,\n getRevisionFromEtag,\n getRevAndTidFromEtag,\n hashCode,\n removeTLD,\n setETag,\n setContentType,\n promiseAwaitAll,\n removeDuplicateTitles,\n CONTENT_TYPES\n};\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package-lock.json","messages":[{"ruleId":"strict","severity":1,"message":"Use the global form of 'use strict'.","line":1,"column":1,"nodeType":"Program","messageId":"global","endLine":7236,"endColumn":3}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"{\n\t\"name\": \"@wikimedia/wikifeeds\",\n\t\"version\": \"1.0.0\",\n\t\"lockfileVersion\": 3,\n\t\"requires\": true,\n\t\"packages\": {\n\t\t\"\": {\n\t\t\t\"name\": \"@wikimedia/wikifeeds\",\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"license\": \"Apache-2.0\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"axios\": \"^1.6.7\",\n\t\t\t\t\"axios-retry\": \"^4.0.0\",\n\t\t\t\t\"bluebird\": \"^3.7.2\",\n\t\t\t\t\"body-parser\": \"^1.20.2\",\n\t\t\t\t\"bunyan\": \"^1.8.15\",\n\t\t\t\t\"cassandra-uuid\": \"^0.1.0\",\n\t\t\t\t\"compression\": \"^1.7.4\",\n\t\t\t\t\"domino\": \"^2.1.6\",\n\t\t\t\t\"express\": \"^4.18.2\",\n\t\t\t\t\"http-shutdown\": \"^1.2.2\",\n\t\t\t\t\"js-yaml\": \"^4.1.0\",\n\t\t\t\t\"lodash\": \"^4.17.21\",\n\t\t\t\t\"mediawiki-title\": \"^0.7.5\",\n\t\t\t\t\"preq\": \"^0.5.14\",\n\t\t\t\t\"service-runner\": \"^3.1.0\",\n\t\t\t\t\"striptags\": \"^3.2.0\",\n\t\t\t\t\"swagger-router\": \"^0.7.4\",\n\t\t\t\t\"swagger-ui-dist\": \"^5.11.7\",\n\t\t\t\t\"uuid\": \"^9.0.1\"\n\t\t\t},\n\t\t\t\"devDependencies\": {\n\t\t\t\t\"ajv\": \"^8.12.0\",\n\t\t\t\t\"ajv-formats\": \"^2.1.1\",\n\t\t\t\t\"csv-parse\": \"^5.5.3\",\n\t\t\t\t\"eslint\": \"8.57.0\",\n\t\t\t\t\"eslint-config-wikimedia\": \"0.29.1\",\n\t\t\t\t\"eslint-plugin-n\": \"^16.6.2\",\n\t\t\t\t\"extend\": \"^3.0.2\",\n\t\t\t\t\"mocha\": \"^10.3.0\",\n\t\t\t\t\"mocha-lcov-reporter\": \"^1.3.0\",\n\t\t\t\t\"mocha.parallel\": \"^0.15.6\",\n\t\t\t\t\"nock\": \"^13.5.3\",\n\t\t\t\t\"nyc\": \"^15.1.0\",\n\t\t\t\t\"path\": \"^0.12.7\",\n\t\t\t\t\"pre-commit\": \"^1.2.2\",\n\t\t\t\t\"rss-parser\": \"^3.13.0\",\n\t\t\t\t\"sinon\": \"^17.0.1\",\n\t\t\t\t\"underscore\": \"^1.13.6\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=16.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@aashutoshrathi/word-wrap\": {\n\t\t\t\"version\": \"1.2.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz\",\n\t\t\t\"integrity\": \"sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@ampproject/remapping\": {\n\t\t\t\"version\": \"2.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@jridgewell/gen-mapping\": \"^0.3.5\",\n\t\t\t\t\"@jridgewell/trace-mapping\": \"^0.3.24\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/code-frame\": {\n\t\t\t\"version\": \"7.26.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz\",\n\t\t\t\"integrity\": \"sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/helper-validator-identifier\": \"^7.25.9\",\n\t\t\t\t\"js-tokens\": \"^4.0.0\",\n\t\t\t\t\"picocolors\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/compat-data\": {\n\t\t\t\"version\": \"7.24.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz\",\n\t\t\t\"integrity\": \"sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/core\": {\n\t\t\t\"version\": \"7.24.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz\",\n\t\t\t\"integrity\": \"sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@ampproject/remapping\": \"^2.2.0\",\n\t\t\t\t\"@babel/code-frame\": \"^7.24.2\",\n\t\t\t\t\"@babel/generator\": \"^7.24.4\",\n\t\t\t\t\"@babel/helper-compilation-targets\": \"^7.23.6\",\n\t\t\t\t\"@babel/helper-module-transforms\": \"^7.23.3\",\n\t\t\t\t\"@babel/helpers\": \"^7.24.4\",\n\t\t\t\t\"@babel/parser\": \"^7.24.4\",\n\t\t\t\t\"@babel/template\": \"^7.24.0\",\n\t\t\t\t\"@babel/traverse\": \"^7.24.1\",\n\t\t\t\t\"@babel/types\": \"^7.24.0\",\n\t\t\t\t\"convert-source-map\": \"^2.0.0\",\n\t\t\t\t\"debug\": \"^4.1.0\",\n\t\t\t\t\"gensync\": \"^1.0.0-beta.2\",\n\t\t\t\t\"json5\": \"^2.2.3\",\n\t\t\t\t\"semver\": \"^6.3.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"opencollective\",\n\t\t\t\t\"url\": \"https://opencollective.com/babel\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/core/node_modules/convert-source-map\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/@babel/core/node_modules/debug\": {\n\t\t\t\"version\": \"4.3.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.4.tgz\",\n\t\t\t\"integrity\": \"sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ms\": \"2.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"supports-color\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/core/node_modules/ms\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/@babel/core/node_modules/semver\": {\n\t\t\t\"version\": \"6.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"semver\": \"bin/semver.js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/generator\": {\n\t\t\t\"version\": \"7.24.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz\",\n\t\t\t\"integrity\": \"sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/types\": \"^7.24.0\",\n\t\t\t\t\"@jridgewell/gen-mapping\": \"^0.3.5\",\n\t\t\t\t\"@jridgewell/trace-mapping\": \"^0.3.25\",\n\t\t\t\t\"jsesc\": \"^2.5.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/generator/node_modules/jsesc\": {\n\t\t\t\"version\": \"2.5.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz\",\n\t\t\t\"integrity\": \"sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"jsesc\": \"bin/jsesc\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/helper-compilation-targets\": {\n\t\t\t\"version\": \"7.23.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz\",\n\t\t\t\"integrity\": \"sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/compat-data\": \"^7.23.5\",\n\t\t\t\t\"@babel/helper-validator-option\": \"^7.23.5\",\n\t\t\t\t\"browserslist\": \"^4.22.2\",\n\t\t\t\t\"lru-cache\": \"^5.1.1\",\n\t\t\t\t\"semver\": \"^6.3.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/helper-compilation-targets/node_modules/semver\": {\n\t\t\t\"version\": \"6.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"semver\": \"bin/semver.js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/helper-environment-visitor\": {\n\t\t\t\"version\": \"7.22.20\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz\",\n\t\t\t\"integrity\": \"sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/helper-function-name\": {\n\t\t\t\"version\": \"7.23.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz\",\n\t\t\t\"integrity\": \"sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/template\": \"^7.22.15\",\n\t\t\t\t\"@babel/types\": \"^7.23.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/helper-hoist-variables\": {\n\t\t\t\"version\": \"7.22.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz\",\n\t\t\t\"integrity\": \"sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/types\": \"^7.22.5\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/helper-module-imports\": {\n\t\t\t\"version\": \"7.24.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz\",\n\t\t\t\"integrity\": \"sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/types\": \"^7.24.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/helper-module-transforms\": {\n\t\t\t\"version\": \"7.23.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz\",\n\t\t\t\"integrity\": \"sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/helper-environment-visitor\": \"^7.22.20\",\n\t\t\t\t\"@babel/helper-module-imports\": \"^7.22.15\",\n\t\t\t\t\"@babel/helper-simple-access\": \"^7.22.5\",\n\t\t\t\t\"@babel/helper-split-export-declaration\": \"^7.22.6\",\n\t\t\t\t\"@babel/helper-validator-identifier\": \"^7.22.20\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"@babel/core\": \"^7.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/helper-simple-access\": {\n\t\t\t\"version\": \"7.22.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz\",\n\t\t\t\"integrity\": \"sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/types\": \"^7.22.5\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/helper-split-export-declaration\": {\n\t\t\t\"version\": \"7.22.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz\",\n\t\t\t\"integrity\": \"sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/types\": \"^7.22.5\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/helper-string-parser\": {\n\t\t\t\"version\": \"7.25.9\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz\",\n\t\t\t\"integrity\": \"sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/helper-validator-identifier\": {\n\t\t\t\"version\": \"7.25.9\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz\",\n\t\t\t\"integrity\": \"sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/helper-validator-option\": {\n\t\t\t\"version\": \"7.23.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz\",\n\t\t\t\"integrity\": \"sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/helpers\": {\n\t\t\t\"version\": \"7.26.10\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz\",\n\t\t\t\"integrity\": \"sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/template\": \"^7.26.9\",\n\t\t\t\t\"@babel/types\": \"^7.26.10\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/parser\": {\n\t\t\t\"version\": \"7.26.10\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz\",\n\t\t\t\"integrity\": \"sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/types\": \"^7.26.10\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"parser\": \"bin/babel-parser.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/template\": {\n\t\t\t\"version\": \"7.26.9\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz\",\n\t\t\t\"integrity\": \"sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/code-frame\": \"^7.26.2\",\n\t\t\t\t\"@babel/parser\": \"^7.26.9\",\n\t\t\t\t\"@babel/types\": \"^7.26.9\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/traverse\": {\n\t\t\t\"version\": \"7.24.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz\",\n\t\t\t\"integrity\": \"sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/code-frame\": \"^7.24.1\",\n\t\t\t\t\"@babel/generator\": \"^7.24.1\",\n\t\t\t\t\"@babel/helper-environment-visitor\": \"^7.22.20\",\n\t\t\t\t\"@babel/helper-function-name\": \"^7.23.0\",\n\t\t\t\t\"@babel/helper-hoist-variables\": \"^7.22.5\",\n\t\t\t\t\"@babel/helper-split-export-declaration\": \"^7.22.6\",\n\t\t\t\t\"@babel/parser\": \"^7.24.1\",\n\t\t\t\t\"@babel/types\": \"^7.24.0\",\n\t\t\t\t\"debug\": \"^4.3.1\",\n\t\t\t\t\"globals\": \"^11.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/traverse/node_modules/debug\": {\n\t\t\t\"version\": \"4.3.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.4.tgz\",\n\t\t\t\"integrity\": \"sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ms\": \"2.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"supports-color\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/traverse/node_modules/globals\": {\n\t\t\t\"version\": \"11.12.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/globals/-/globals-11.12.0.tgz\",\n\t\t\t\"integrity\": \"sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/traverse/node_modules/ms\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/@babel/types\": {\n\t\t\t\"version\": \"7.26.10\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz\",\n\t\t\t\"integrity\": \"sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/helper-string-parser\": \"^7.25.9\",\n\t\t\t\t\"@babel/helper-validator-identifier\": \"^7.25.9\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@es-joy/jsdoccomment\": {\n\t\t\t\"version\": \"0.43.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz\",\n\t\t\t\"integrity\": \"sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@types/eslint\": \"^8.56.5\",\n\t\t\t\t\"@types/estree\": \"^1.0.5\",\n\t\t\t\t\"@typescript-eslint/types\": \"^7.2.0\",\n\t\t\t\t\"comment-parser\": \"1.4.1\",\n\t\t\t\t\"esquery\": \"^1.5.0\",\n\t\t\t\t\"jsdoc-type-pratt-parser\": \"~4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=16\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@eslint-community/eslint-utils\": {\n\t\t\t\"version\": \"4.4.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz\",\n\t\t\t\"integrity\": \"sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"eslint-visitor-keys\": \"^3.3.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \"^6.0.0 || ^7.0.0 || >=8.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@eslint-community/regexpp\": {\n\t\t\t\"version\": \"4.10.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^12.0.0 || ^14.0.0 || >=16.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@eslint/eslintrc\": {\n\t\t\t\"version\": \"2.1.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz\",\n\t\t\t\"integrity\": \"sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ajv\": \"^6.12.4\",\n\t\t\t\t\"debug\": \"^4.3.2\",\n\t\t\t\t\"espree\": \"^9.6.0\",\n\t\t\t\t\"globals\": \"^13.19.0\",\n\t\t\t\t\"ignore\": \"^5.2.0\",\n\t\t\t\t\"import-fresh\": \"^3.2.1\",\n\t\t\t\t\"js-yaml\": \"^4.1.0\",\n\t\t\t\t\"minimatch\": \"^3.1.2\",\n\t\t\t\t\"strip-json-comments\": \"^3.1.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://opencollective.com/eslint\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@eslint/eslintrc/node_modules/ajv\": {\n\t\t\t\"version\": \"6.12.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz\",\n\t\t\t\"integrity\": \"sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"fast-deep-equal\": \"^3.1.1\",\n\t\t\t\t\"fast-json-stable-stringify\": \"^2.0.0\",\n\t\t\t\t\"json-schema-traverse\": \"^0.4.1\",\n\t\t\t\t\"uri-js\": \"^4.2.2\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"github\",\n\t\t\t\t\"url\": \"https://github.com/sponsors/epoberezkin\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@eslint/eslintrc/node_modules/debug\": {\n\t\t\t\"version\": \"4.3.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.4.tgz\",\n\t\t\t\"integrity\": \"sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ms\": \"2.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"supports-color\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@eslint/eslintrc/node_modules/json-schema-traverse\": {\n\t\t\t\"version\": \"0.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/@eslint/eslintrc/node_modules/ms\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/@eslint/js\": {\n\t\t\t\"version\": \"8.57.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@humanwhocodes/config-array\": {\n\t\t\t\"version\": \"0.11.14\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz\",\n\t\t\t\"integrity\": \"sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@humanwhocodes/object-schema\": \"^2.0.2\",\n\t\t\t\t\"debug\": \"^4.3.1\",\n\t\t\t\t\"minimatch\": \"^3.0.5\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@humanwhocodes/config-array/node_modules/debug\": {\n\t\t\t\"version\": \"4.3.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.4.tgz\",\n\t\t\t\"integrity\": \"sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ms\": \"2.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"supports-color\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@humanwhocodes/config-array/node_modules/ms\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/@humanwhocodes/module-importer\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=12.22\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"github\",\n\t\t\t\t\"url\": \"https://github.com/sponsors/nzakas\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@humanwhocodes/object-schema\": {\n\t\t\t\"version\": \"2.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/@istanbuljs/load-nyc-config\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"camelcase\": \"^5.3.1\",\n\t\t\t\t\"find-up\": \"^4.1.0\",\n\t\t\t\t\"get-package-type\": \"^0.1.0\",\n\t\t\t\t\"js-yaml\": \"^3.13.1\",\n\t\t\t\t\"resolve-from\": \"^5.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@istanbuljs/load-nyc-config/node_modules/argparse\": {\n\t\t\t\"version\": \"1.0.10\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz\",\n\t\t\t\"integrity\": \"sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"sprintf-js\": \"~1.0.2\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@istanbuljs/load-nyc-config/node_modules/find-up\": {\n\t\t\t\"version\": \"4.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"locate-path\": \"^5.0.0\",\n\t\t\t\t\"path-exists\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml\": {\n\t\t\t\"version\": \"3.14.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz\",\n\t\t\t\"integrity\": \"sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"argparse\": \"^1.0.7\",\n\t\t\t\t\"esprima\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"js-yaml\": \"bin/js-yaml.js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path\": {\n\t\t\t\"version\": \"5.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-locate\": \"^4.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit\": {\n\t\t\t\"version\": \"2.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-try\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate\": {\n\t\t\t\"version\": \"4.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-limit\": \"^2.2.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from\": {\n\t\t\t\"version\": \"5.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@istanbuljs/schema\": {\n\t\t\t\"version\": \"0.1.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz\",\n\t\t\t\"integrity\": \"sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@jridgewell/gen-mapping\": {\n\t\t\t\"version\": \"0.3.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz\",\n\t\t\t\"integrity\": \"sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@jridgewell/set-array\": \"^1.2.1\",\n\t\t\t\t\"@jridgewell/sourcemap-codec\": \"^1.4.10\",\n\t\t\t\t\"@jridgewell/trace-mapping\": \"^0.3.24\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@jridgewell/resolve-uri\": {\n\t\t\t\"version\": \"3.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@jridgewell/set-array\": {\n\t\t\t\"version\": \"1.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@jridgewell/sourcemap-codec\": {\n\t\t\t\"version\": \"1.4.15\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz\",\n\t\t\t\"integrity\": \"sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/@jridgewell/trace-mapping\": {\n\t\t\t\"version\": \"0.3.25\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz\",\n\t\t\t\"integrity\": \"sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@jridgewell/resolve-uri\": \"^3.1.0\",\n\t\t\t\t\"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@mdn/browser-compat-data\": {\n\t\t\t\"version\": \"5.5.22\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.22.tgz\",\n\t\t\t\"integrity\": \"sha512-2v+HeCb1J4tAi4M9zMR1AtxMBA08q8HMDXbJ1H64sFpXhTU/8W2kBBjTL9TkUQiHaJDFFU6kAFBlsfslP253WA==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/@nodelib/fs.scandir\": {\n\t\t\t\"version\": \"2.1.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz\",\n\t\t\t\"integrity\": \"sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@nodelib/fs.stat\": \"2.0.5\",\n\t\t\t\t\"run-parallel\": \"^1.1.9\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@nodelib/fs.stat\": {\n\t\t\t\"version\": \"2.0.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz\",\n\t\t\t\"integrity\": \"sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@nodelib/fs.walk\": {\n\t\t\t\"version\": \"1.2.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz\",\n\t\t\t\"integrity\": \"sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@nodelib/fs.scandir\": \"2.1.5\",\n\t\t\t\t\"fastq\": \"^1.6.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@sinonjs/commons\": {\n\t\t\t\"version\": \"3.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"type-detect\": \"4.0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@sinonjs/fake-timers\": {\n\t\t\t\"version\": \"11.2.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz\",\n\t\t\t\"integrity\": \"sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@sinonjs/commons\": \"^3.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@sinonjs/samsam\": {\n\t\t\t\"version\": \"8.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@sinonjs/commons\": \"^2.0.0\",\n\t\t\t\t\"lodash.get\": \"^4.4.2\",\n\t\t\t\t\"type-detect\": \"^4.0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"type-detect\": \"4.0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@sinonjs/text-encoding\": {\n\t\t\t\"version\": \"0.7.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz\",\n\t\t\t\"integrity\": \"sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/@types/eslint\": {\n\t\t\t\"version\": \"8.56.10\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz\",\n\t\t\t\"integrity\": \"sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@types/estree\": \"*\",\n\t\t\t\t\"@types/json-schema\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@types/estree\": {\n\t\t\t\"version\": \"1.0.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz\",\n\t\t\t\"integrity\": \"sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/@types/json-schema\": {\n\t\t\t\"version\": \"7.0.15\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz\",\n\t\t\t\"integrity\": \"sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/@types/normalize-package-data\": {\n\t\t\t\"version\": \"2.4.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz\",\n\t\t\t\"integrity\": \"sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/@typescript-eslint/scope-manager\": {\n\t\t\t\"version\": \"7.12.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz\",\n\t\t\t\"integrity\": \"sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@typescript-eslint/types\": \"7.12.0\",\n\t\t\t\t\"@typescript-eslint/visitor-keys\": \"7.12.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^18.18.0 || >=20.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"opencollective\",\n\t\t\t\t\"url\": \"https://opencollective.com/typescript-eslint\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@typescript-eslint/types\": {\n\t\t\t\"version\": \"7.12.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz\",\n\t\t\t\"integrity\": \"sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^18.18.0 || >=20.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"opencollective\",\n\t\t\t\t\"url\": \"https://opencollective.com/typescript-eslint\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@typescript-eslint/typescript-estree\": {\n\t\t\t\"version\": \"7.12.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz\",\n\t\t\t\"integrity\": \"sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@typescript-eslint/types\": \"7.12.0\",\n\t\t\t\t\"@typescript-eslint/visitor-keys\": \"7.12.0\",\n\t\t\t\t\"debug\": \"^4.3.4\",\n\t\t\t\t\"globby\": \"^11.1.0\",\n\t\t\t\t\"is-glob\": \"^4.0.3\",\n\t\t\t\t\"minimatch\": \"^9.0.4\",\n\t\t\t\t\"semver\": \"^7.6.0\",\n\t\t\t\t\"ts-api-utils\": \"^1.3.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^18.18.0 || >=20.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"opencollective\",\n\t\t\t\t\"url\": \"https://opencollective.com/typescript-eslint\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"typescript\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"balanced-match\": \"^1.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@typescript-eslint/typescript-estree/node_modules/debug\": {\n\t\t\t\"version\": \"4.3.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.5.tgz\",\n\t\t\t\"integrity\": \"sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ms\": \"2.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"supports-color\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch\": {\n\t\t\t\"version\": \"9.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"brace-expansion\": \"^2.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=16 || 14 >=14.17\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/isaacs\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@typescript-eslint/typescript-estree/node_modules/ms\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/@typescript-eslint/utils\": {\n\t\t\t\"version\": \"7.12.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.12.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@eslint-community/eslint-utils\": \"^4.4.0\",\n\t\t\t\t\"@typescript-eslint/scope-manager\": \"7.12.0\",\n\t\t\t\t\"@typescript-eslint/types\": \"7.12.0\",\n\t\t\t\t\"@typescript-eslint/typescript-estree\": \"7.12.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^18.18.0 || >=20.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"opencollective\",\n\t\t\t\t\"url\": \"https://opencollective.com/typescript-eslint\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \"^8.56.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@typescript-eslint/visitor-keys\": {\n\t\t\t\"version\": \"7.12.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz\",\n\t\t\t\"integrity\": \"sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@typescript-eslint/types\": \"7.12.0\",\n\t\t\t\t\"eslint-visitor-keys\": \"^3.4.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^18.18.0 || >=20.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"opencollective\",\n\t\t\t\t\"url\": \"https://opencollective.com/typescript-eslint\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@ungap/structured-clone\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/accepts\": {\n\t\t\t\"version\": \"1.3.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz\",\n\t\t\t\"integrity\": \"sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"mime-types\": \"~2.1.34\",\n\t\t\t\t\"negotiator\": \"0.6.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/acorn\": {\n\t\t\t\"version\": \"8.11.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz\",\n\t\t\t\"integrity\": \"sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"acorn\": \"bin/acorn\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.4.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/acorn-jsx\": {\n\t\t\t\"version\": \"5.3.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz\",\n\t\t\t\"integrity\": \"sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"acorn\": \"^6.0.0 || ^7.0.0 || ^8.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/aggregate-error\": {\n\t\t\t\"version\": \"3.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"clean-stack\": \"^2.0.0\",\n\t\t\t\t\"indent-string\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ajv\": {\n\t\t\t\"version\": \"8.12.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz\",\n\t\t\t\"integrity\": \"sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"fast-deep-equal\": \"^3.1.1\",\n\t\t\t\t\"json-schema-traverse\": \"^1.0.0\",\n\t\t\t\t\"require-from-string\": \"^2.0.2\",\n\t\t\t\t\"uri-js\": \"^4.2.2\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"github\",\n\t\t\t\t\"url\": \"https://github.com/sponsors/epoberezkin\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ajv-formats\": {\n\t\t\t\"version\": \"2.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ajv\": \"^8.0.0\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"ajv\": \"^8.0.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"ajv\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ansi-colors\": {\n\t\t\t\"version\": \"4.1.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz\",\n\t\t\t\"integrity\": \"sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ansi-regex\": {\n\t\t\t\"version\": \"5.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ansi-styles\": {\n\t\t\t\"version\": \"4.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"color-convert\": \"^2.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/anymatch\": {\n\t\t\t\"version\": \"3.1.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz\",\n\t\t\t\"integrity\": \"sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"normalize-path\": \"^3.0.0\",\n\t\t\t\t\"picomatch\": \"^2.0.4\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/append-transform\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"default-require-extensions\": \"^3.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/archy\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/archy/-/archy-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/are-docs-informative\": {\n\t\t\t\"version\": \"0.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=14\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/argparse\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==\"\n\t\t},\n\t\t\"node_modules/array-flatten\": {\n\t\t\t\"version\": \"1.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==\"\n\t\t},\n\t\t\"node_modules/array-union\": {\n\t\t\t\"version\": \"2.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/asap\": {\n\t\t\t\"version\": \"2.0.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/asap/-/asap-2.0.6.tgz\",\n\t\t\t\"integrity\": \"sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==\"\n\t\t},\n\t\t\"node_modules/asn1\": {\n\t\t\t\"version\": \"0.2.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz\",\n\t\t\t\"integrity\": \"sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"safer-buffer\": \"~2.1.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/assert-plus\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ast-metadata-inferer\": {\n\t\t\t\"version\": \"0.8.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz\",\n\t\t\t\"integrity\": \"sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@mdn/browser-compat-data\": \"^5.2.34\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/async\": {\n\t\t\t\"version\": \"0.9.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/async/-/async-0.9.2.tgz\",\n\t\t\t\"integrity\": \"sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==\"\n\t\t},\n\t\t\"node_modules/asynckit\": {\n\t\t\t\"version\": \"0.4.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==\"\n\t\t},\n\t\t\"node_modules/aws-sign2\": {\n\t\t\t\"version\": \"0.7.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz\",\n\t\t\t\"integrity\": \"sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/aws4\": {\n\t\t\t\"version\": \"1.12.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz\",\n\t\t\t\"integrity\": \"sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==\"\n\t\t},\n\t\t\"node_modules/axios\": {\n\t\t\t\"version\": \"1.8.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/axios/-/axios-1.8.2.tgz\",\n\t\t\t\"integrity\": \"sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"follow-redirects\": \"^1.15.6\",\n\t\t\t\t\"form-data\": \"^4.0.0\",\n\t\t\t\t\"proxy-from-env\": \"^1.1.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/axios-retry\": {\n\t\t\t\"version\": \"4.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/axios-retry/-/axios-retry-4.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-svdth4H00yhlsjBbjfLQ/sMLkXqeLxhiFC1nE1JtkN/CIssGxqk0UwTEdrVjwA2gr3yJkAulwvDSIm4z4HyPvg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-retry-allowed\": \"^2.2.0\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"axios\": \"0.x || 1.x\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/balanced-match\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n\t\t\t\"devOptional\": true\n\t\t},\n\t\t\"node_modules/bcrypt-pbkdf\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"tweetnacl\": \"^0.14.3\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/binary-extensions\": {\n\t\t\t\"version\": \"2.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/bindings\": {\n\t\t\t\"version\": \"1.5.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz\",\n\t\t\t\"integrity\": \"sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==\",\n\t\t\t\"optional\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"file-uri-to-path\": \"1.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/bintrees\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==\"\n\t\t},\n\t\t\"node_modules/bl\": {\n\t\t\t\"version\": \"1.2.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/bl/-/bl-1.2.3.tgz\",\n\t\t\t\"integrity\": \"sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"readable-stream\": \"^2.3.5\",\n\t\t\t\t\"safe-buffer\": \"^5.1.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/bluebird\": {\n\t\t\t\"version\": \"3.7.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz\",\n\t\t\t\"integrity\": \"sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==\"\n\t\t},\n\t\t\"node_modules/body-parser\": {\n\t\t\t\"version\": \"1.20.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz\",\n\t\t\t\"integrity\": \"sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"bytes\": \"3.1.2\",\n\t\t\t\t\"content-type\": \"~1.0.5\",\n\t\t\t\t\"debug\": \"2.6.9\",\n\t\t\t\t\"depd\": \"2.0.0\",\n\t\t\t\t\"destroy\": \"1.2.0\",\n\t\t\t\t\"http-errors\": \"2.0.0\",\n\t\t\t\t\"iconv-lite\": \"0.4.24\",\n\t\t\t\t\"on-finished\": \"2.4.1\",\n\t\t\t\t\"qs\": \"6.13.0\",\n\t\t\t\t\"raw-body\": \"2.5.2\",\n\t\t\t\t\"type-is\": \"~1.6.18\",\n\t\t\t\t\"unpipe\": \"1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\",\n\t\t\t\t\"npm\": \"1.2.8000 || >= 1.4.16\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/boolbase\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/brace-expansion\": {\n\t\t\t\"version\": \"1.1.11\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz\",\n\t\t\t\"integrity\": \"sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==\",\n\t\t\t\"devOptional\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"balanced-match\": \"^1.0.0\",\n\t\t\t\t\"concat-map\": \"0.0.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/braces\": {\n\t\t\t\"version\": \"3.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/braces/-/braces-3.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"fill-range\": \"^7.1.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/browser-stdout\": {\n\t\t\t\"version\": \"1.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/browserslist\": {\n\t\t\t\"version\": \"4.23.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz\",\n\t\t\t\"integrity\": \"sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"funding\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"opencollective\",\n\t\t\t\t\t\"url\": \"https://opencollective.com/browserslist\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"tidelift\",\n\t\t\t\t\t\"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"github\",\n\t\t\t\t\t\"url\": \"https://github.com/sponsors/ai\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"dependencies\": {\n\t\t\t\t\"caniuse-lite\": \"^1.0.30001587\",\n\t\t\t\t\"electron-to-chromium\": \"^1.4.668\",\n\t\t\t\t\"node-releases\": \"^2.0.14\",\n\t\t\t\t\"update-browserslist-db\": \"^1.0.13\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"browserslist\": \"cli.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/browserslist-config-wikimedia\": {\n\t\t\t\"version\": \"0.7.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.7.0.tgz\",\n\t\t\t\"integrity\": \"sha512-CTa0lv78dXKEgrYsOLCkqO+9UUS3CV9MWEOYHcymgEvx4mYxB80sCoKRCR7wW2SOMNxjaP9hohrZripjnKuRTA==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/buffer-from\": {\n\t\t\t\"version\": \"1.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/builtin-modules\": {\n\t\t\t\"version\": \"3.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/builtins\": {\n\t\t\t\"version\": \"5.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"semver\": \"^7.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/bunyan\": {\n\t\t\t\"version\": \"1.8.15\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz\",\n\t\t\t\"integrity\": \"sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==\",\n\t\t\t\"engines\": [\n\t\t\t\t\"node >=0.10.0\"\n\t\t\t],\n\t\t\t\"bin\": {\n\t\t\t\t\"bunyan\": \"bin/bunyan\"\n\t\t\t},\n\t\t\t\"optionalDependencies\": {\n\t\t\t\t\"dtrace-provider\": \"~0.8\",\n\t\t\t\t\"moment\": \"^2.19.3\",\n\t\t\t\t\"mv\": \"~2\",\n\t\t\t\t\"safe-json-stringify\": \"~1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/bunyan-syslog-udp\": {\n\t\t\t\"version\": \"0.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/bunyan-syslog-udp/-/bunyan-syslog-udp-0.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-tY6iaw+iYbCjlsAgAyO4CeA7Usnj5VndygMfd2PcHK++626oMoHANcdsH5tq5VxRPsbk9M1fbuk0a5pX9axV2w==\"\n\t\t},\n\t\t\"node_modules/bytes\": {\n\t\t\t\"version\": \"3.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/caching-transform\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"hasha\": \"^5.0.0\",\n\t\t\t\t\"make-dir\": \"^3.0.0\",\n\t\t\t\t\"package-hash\": \"^4.0.0\",\n\t\t\t\t\"write-file-atomic\": \"^3.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/call-bind\": {\n\t\t\t\"version\": \"1.0.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz\",\n\t\t\t\"integrity\": \"sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es-define-property\": \"^1.0.0\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"function-bind\": \"^1.1.2\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.4\",\n\t\t\t\t\"set-function-length\": \"^1.2.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/callsites\": {\n\t\t\t\"version\": \"3.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/camelcase\": {\n\t\t\t\"version\": \"5.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/caniuse-lite\": {\n\t\t\t\"version\": \"1.0.30001611\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001611.tgz\",\n\t\t\t\"integrity\": \"sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"funding\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"opencollective\",\n\t\t\t\t\t\"url\": \"https://opencollective.com/browserslist\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"tidelift\",\n\t\t\t\t\t\"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"github\",\n\t\t\t\t\t\"url\": \"https://github.com/sponsors/ai\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"node_modules/caseless\": {\n\t\t\t\"version\": \"0.12.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz\",\n\t\t\t\"integrity\": \"sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==\"\n\t\t},\n\t\t\"node_modules/cassandra-uuid\": {\n\t\t\t\"version\": \"0.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/cassandra-uuid/-/cassandra-uuid-0.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-XM/UdAVoXJWDcqxVqNe2agYat51C25g5m8nkJ2/ai3QvHwWsRx/+OlziD1c1/jYLlP7kcC1DMO2IF5ldt8EV+A==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"long\": \"^4.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/chalk\": {\n\t\t\t\"version\": \"4.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ansi-styles\": \"^4.1.0\",\n\t\t\t\t\"supports-color\": \"^7.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/chokidar\": {\n\t\t\t\"version\": \"3.5.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz\",\n\t\t\t\"integrity\": \"sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"funding\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"individual\",\n\t\t\t\t\t\"url\": \"https://paulmillr.com/funding/\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"dependencies\": {\n\t\t\t\t\"anymatch\": \"~3.1.2\",\n\t\t\t\t\"braces\": \"~3.0.2\",\n\t\t\t\t\"glob-parent\": \"~5.1.2\",\n\t\t\t\t\"is-binary-path\": \"~2.1.0\",\n\t\t\t\t\"is-glob\": \"~4.0.1\",\n\t\t\t\t\"normalize-path\": \"~3.0.0\",\n\t\t\t\t\"readdirp\": \"~3.6.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 8.10.0\"\n\t\t\t},\n\t\t\t\"optionalDependencies\": {\n\t\t\t\t\"fsevents\": \"~2.3.2\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/chokidar/node_modules/glob-parent\": {\n\t\t\t\"version\": \"5.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-glob\": \"^4.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/chownr\": {\n\t\t\t\"version\": \"1.1.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz\",\n\t\t\t\"integrity\": \"sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==\"\n\t\t},\n\t\t\"node_modules/ci-info\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"funding\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"github\",\n\t\t\t\t\t\"url\": \"https://github.com/sponsors/sibiraj-s\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/clarinet\": {\n\t\t\t\"version\": \"0.11.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/clarinet/-/clarinet-0.11.0.tgz\",\n\t\t\t\"integrity\": \"sha512-6hgoCgDgdyEtrXsk1tMomUl+S6wnslv2F1muNTOuhQemOhauR+Q0FtBdrj9k+qyIDLm0TVW0QMZ10aeWwRDgIA==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"chrome\": \">=16.0.912\",\n\t\t\t\t\"firefox\": \">=0.8.0\",\n\t\t\t\t\"node\": \">=0.3.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/clean-regexp\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"escape-string-regexp\": \"^1.0.5\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/clean-regexp/node_modules/escape-string-regexp\": {\n\t\t\t\"version\": \"1.0.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz\",\n\t\t\t\"integrity\": \"sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/clean-stack\": {\n\t\t\t\"version\": \"2.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/cliui\": {\n\t\t\t\"version\": \"7.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"string-width\": \"^4.2.0\",\n\t\t\t\t\"strip-ansi\": \"^6.0.0\",\n\t\t\t\t\"wrap-ansi\": \"^7.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/color-convert\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"color-name\": \"~1.1.4\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=7.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/color-name\": {\n\t\t\t\"version\": \"1.1.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n\t\t\t\"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\"\n\t\t},\n\t\t\"node_modules/colors\": {\n\t\t\t\"version\": \"1.4.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/colors/-/colors-1.4.0.tgz\",\n\t\t\t\"integrity\": \"sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.1.90\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/combined-stream\": {\n\t\t\t\"version\": \"1.0.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz\",\n\t\t\t\"integrity\": \"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"delayed-stream\": \"~1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/comment-parser\": {\n\t\t\t\"version\": \"1.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 12.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/commondir\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/compressible\": {\n\t\t\t\"version\": \"2.0.18\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz\",\n\t\t\t\"integrity\": \"sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"mime-db\": \">= 1.43.0 < 2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/compression\": {\n\t\t\t\"version\": \"1.7.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/compression/-/compression-1.7.4.tgz\",\n\t\t\t\"integrity\": \"sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"accepts\": \"~1.3.5\",\n\t\t\t\t\"bytes\": \"3.0.0\",\n\t\t\t\t\"compressible\": \"~2.0.16\",\n\t\t\t\t\"debug\": \"2.6.9\",\n\t\t\t\t\"on-headers\": \"~1.0.2\",\n\t\t\t\t\"safe-buffer\": \"5.1.2\",\n\t\t\t\t\"vary\": \"~1.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/compression/node_modules/bytes\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/concat-map\": {\n\t\t\t\"version\": \"0.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==\",\n\t\t\t\"devOptional\": true\n\t\t},\n\t\t\"node_modules/concat-stream\": {\n\t\t\t\"version\": \"1.6.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz\",\n\t\t\t\"integrity\": \"sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": [\n\t\t\t\t\"node >= 0.8\"\n\t\t\t],\n\t\t\t\"dependencies\": {\n\t\t\t\t\"buffer-from\": \"^1.0.0\",\n\t\t\t\t\"inherits\": \"^2.0.3\",\n\t\t\t\t\"readable-stream\": \"^2.2.2\",\n\t\t\t\t\"typedarray\": \"^0.0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/content-disposition\": {\n\t\t\t\"version\": \"0.5.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz\",\n\t\t\t\"integrity\": \"sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"safe-buffer\": \"5.2.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/content-disposition/node_modules/safe-buffer\": {\n\t\t\t\"version\": \"5.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==\",\n\t\t\t\"funding\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"github\",\n\t\t\t\t\t\"url\": \"https://github.com/sponsors/feross\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"patreon\",\n\t\t\t\t\t\"url\": \"https://www.patreon.com/feross\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"consulting\",\n\t\t\t\t\t\"url\": \"https://feross.org/support\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"node_modules/content-type\": {\n\t\t\t\"version\": \"1.0.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz\",\n\t\t\t\"integrity\": \"sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/convert-source-map\": {\n\t\t\t\"version\": \"1.9.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz\",\n\t\t\t\"integrity\": \"sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/cookie\": {\n\t\t\t\"version\": \"0.7.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz\",\n\t\t\t\"integrity\": \"sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/cookie-signature\": {\n\t\t\t\"version\": \"1.0.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz\",\n\t\t\t\"integrity\": \"sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==\"\n\t\t},\n\t\t\"node_modules/core-js-compat\": {\n\t\t\t\"version\": \"3.37.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz\",\n\t\t\t\"integrity\": \"sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"browserslist\": \"^4.23.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"opencollective\",\n\t\t\t\t\"url\": \"https://opencollective.com/core-js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/core-util-is\": {\n\t\t\t\"version\": \"1.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==\"\n\t\t},\n\t\t\"node_modules/cross-spawn\": {\n\t\t\t\"version\": \"7.0.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz\",\n\t\t\t\"integrity\": \"sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"path-key\": \"^3.1.0\",\n\t\t\t\t\"shebang-command\": \"^2.0.0\",\n\t\t\t\t\"which\": \"^2.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/cssesc\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"cssesc\": \"bin/cssesc\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/csv-parse\": {\n\t\t\t\"version\": \"5.5.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/csv-parse/-/csv-parse-5.5.5.tgz\",\n\t\t\t\"integrity\": \"sha512-erCk7tyU3yLWAhk6wvKxnyPtftuy/6Ak622gOO7BCJ05+TYffnPCJF905wmOQm+BpkX54OdAl8pveJwUdpnCXQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/dashdash\": {\n\t\t\t\"version\": \"1.14.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz\",\n\t\t\t\"integrity\": \"sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"assert-plus\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/debug\": {\n\t\t\t\"version\": \"2.6.9\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n\t\t\t\"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ms\": \"2.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/decamelize\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/deep-is\": {\n\t\t\t\"version\": \"0.1.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz\",\n\t\t\t\"integrity\": \"sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/default-require-extensions\": {\n\t\t\t\"version\": \"3.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"strip-bom\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/define-data-property\": {\n\t\t\t\"version\": \"1.1.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz\",\n\t\t\t\"integrity\": \"sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es-define-property\": \"^1.0.0\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"gopd\": \"^1.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/delayed-stream\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.4.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/depd\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/depd/-/depd-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/destroy\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\",\n\t\t\t\t\"npm\": \"1.2.8000 || >= 1.4.16\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/diff\": {\n\t\t\t\"version\": \"5.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/diff/-/diff-5.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.3.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/dir-glob\": {\n\t\t\t\"version\": \"3.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"path-type\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/dnscache\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/dnscache/-/dnscache-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-2FFKzmLGOnD+Y378bRKH+gTjRMuSpH7OKgPy31KjjfCoKZx7tU8Dmqfd/3fhG2d/4bppuN8/KtWMUZBAcUCRnQ==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"asap\": \"^2.0.6\",\n\t\t\t\t\"lodash.clone\": \"^4.5.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/doctrine\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"esutils\": \"^2.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/dom-storage\": {\n\t\t\t\"version\": \"2.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/domino\": {\n\t\t\t\"version\": \"2.1.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/domino/-/domino-2.1.6.tgz\",\n\t\t\t\"integrity\": \"sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==\"\n\t\t},\n\t\t\"node_modules/dtrace-provider\": {\n\t\t\t\"version\": \"0.8.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz\",\n\t\t\t\"integrity\": \"sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==\",\n\t\t\t\"hasInstallScript\": true,\n\t\t\t\"optional\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"nan\": \"^2.14.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ecc-jsbn\": {\n\t\t\t\"version\": \"0.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"jsbn\": \"~0.1.0\",\n\t\t\t\t\"safer-buffer\": \"^2.1.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ee-first\": {\n\t\t\t\"version\": \"1.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==\"\n\t\t},\n\t\t\"node_modules/electron-to-chromium\": {\n\t\t\t\"version\": \"1.4.744\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.744.tgz\",\n\t\t\t\"integrity\": \"sha512-nAGcF0yeKKfrP13LMFr5U1eghfFSvFLg302VUFzWlcjPOnUYd52yU5x6PBYrujhNbc4jYmZFrGZFK+xasaEzVA==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/emoji-regex\": {\n\t\t\t\"version\": \"8.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\"\n\t\t},\n\t\t\"node_modules/encodeurl\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/enhanced-resolve\": {\n\t\t\t\"version\": \"5.17.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz\",\n\t\t\t\"integrity\": \"sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"graceful-fs\": \"^4.2.4\",\n\t\t\t\t\"tapable\": \"^2.2.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10.13.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/entities\": {\n\t\t\t\"version\": \"2.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/entities/-/entities-2.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/fb55/entities?sponsor=1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/error-ex\": {\n\t\t\t\"version\": \"1.3.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz\",\n\t\t\t\"integrity\": \"sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-arrayish\": \"^0.2.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/es-define-property\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"get-intrinsic\": \"^1.2.4\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/es-errors\": {\n\t\t\t\"version\": \"1.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/es6-error\": {\n\t\t\t\"version\": \"4.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/escalade\": {\n\t\t\t\"version\": \"3.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/escape-html\": {\n\t\t\t\"version\": \"1.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==\"\n\t\t},\n\t\t\"node_modules/escape-string-regexp\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint\": {\n\t\t\t\"version\": \"8.57.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz\",\n\t\t\t\"integrity\": \"sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@eslint-community/eslint-utils\": \"^4.2.0\",\n\t\t\t\t\"@eslint-community/regexpp\": \"^4.6.1\",\n\t\t\t\t\"@eslint/eslintrc\": \"^2.1.4\",\n\t\t\t\t\"@eslint/js\": \"8.57.0\",\n\t\t\t\t\"@humanwhocodes/config-array\": \"^0.11.14\",\n\t\t\t\t\"@humanwhocodes/module-importer\": \"^1.0.1\",\n\t\t\t\t\"@nodelib/fs.walk\": \"^1.2.8\",\n\t\t\t\t\"@ungap/structured-clone\": \"^1.2.0\",\n\t\t\t\t\"ajv\": \"^6.12.4\",\n\t\t\t\t\"chalk\": \"^4.0.0\",\n\t\t\t\t\"cross-spawn\": \"^7.0.2\",\n\t\t\t\t\"debug\": \"^4.3.2\",\n\t\t\t\t\"doctrine\": \"^3.0.0\",\n\t\t\t\t\"escape-string-regexp\": \"^4.0.0\",\n\t\t\t\t\"eslint-scope\": \"^7.2.2\",\n\t\t\t\t\"eslint-visitor-keys\": \"^3.4.3\",\n\t\t\t\t\"espree\": \"^9.6.1\",\n\t\t\t\t\"esquery\": \"^1.4.2\",\n\t\t\t\t\"esutils\": \"^2.0.2\",\n\t\t\t\t\"fast-deep-equal\": \"^3.1.3\",\n\t\t\t\t\"file-entry-cache\": \"^6.0.1\",\n\t\t\t\t\"find-up\": \"^5.0.0\",\n\t\t\t\t\"glob-parent\": \"^6.0.2\",\n\t\t\t\t\"globals\": \"^13.19.0\",\n\t\t\t\t\"graphemer\": \"^1.4.0\",\n\t\t\t\t\"ignore\": \"^5.2.0\",\n\t\t\t\t\"imurmurhash\": \"^0.1.4\",\n\t\t\t\t\"is-glob\": \"^4.0.0\",\n\t\t\t\t\"is-path-inside\": \"^3.0.3\",\n\t\t\t\t\"js-yaml\": \"^4.1.0\",\n\t\t\t\t\"json-stable-stringify-without-jsonify\": \"^1.0.1\",\n\t\t\t\t\"levn\": \"^0.4.1\",\n\t\t\t\t\"lodash.merge\": \"^4.6.2\",\n\t\t\t\t\"minimatch\": \"^3.1.2\",\n\t\t\t\t\"natural-compare\": \"^1.4.0\",\n\t\t\t\t\"optionator\": \"^0.9.3\",\n\t\t\t\t\"strip-ansi\": \"^6.0.1\",\n\t\t\t\t\"text-table\": \"^0.2.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"eslint\": \"bin/eslint.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://opencollective.com/eslint\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-compat-utils\": {\n\t\t\t\"version\": \"0.5.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz\",\n\t\t\t\"integrity\": \"sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"semver\": \"^7.5.4\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=12\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \">=6.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-config-wikimedia\": {\n\t\t\t\"version\": \"0.29.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.29.1.tgz\",\n\t\t\t\"integrity\": \"sha512-4dbL5o3hKGSvreyrGZWLPoTDLFubZ575IQOPhUaTcpbTsi0u05TBEMsOyYkthTaK21vsFQqhSYtxp/xU93BSdA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"browserslist-config-wikimedia\": \"^0.7.0\",\n\t\t\t\t\"eslint\": \"^8.57.0\",\n\t\t\t\t\"eslint-plugin-compat\": \"^4.2.0\",\n\t\t\t\t\"eslint-plugin-es-x\": \"^7.6.0\",\n\t\t\t\t\"eslint-plugin-jest\": \"^28.5.0\",\n\t\t\t\t\"eslint-plugin-jsdoc\": \"48.2.5\",\n\t\t\t\t\"eslint-plugin-json-es\": \"^1.6.0\",\n\t\t\t\t\"eslint-plugin-mediawiki\": \"^0.7.0\",\n\t\t\t\t\"eslint-plugin-mocha\": \"^10.4.3\",\n\t\t\t\t\"eslint-plugin-n\": \"^17.7.0\",\n\t\t\t\t\"eslint-plugin-no-jquery\": \"^3.1.1\",\n\t\t\t\t\"eslint-plugin-qunit\": \"^8.1.1\",\n\t\t\t\t\"eslint-plugin-security\": \"^1.7.1\",\n\t\t\t\t\"eslint-plugin-unicorn\": \"^53.0.0\",\n\t\t\t\t\"eslint-plugin-vue\": \"^9.26.0\",\n\t\t\t\t\"eslint-plugin-wdio\": \"^8.24.12\",\n\t\t\t\t\"eslint-plugin-yml\": \"^1.14.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=18 <23\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-config-wikimedia/node_modules/brace-expansion\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"balanced-match\": \"^1.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-n\": {\n\t\t\t\"version\": \"17.8.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.8.1.tgz\",\n\t\t\t\"integrity\": \"sha512-KdG0h0voZms8UhndNu8DeWx1eM4sY+A4iXtsNo6kOfJLYHNeTGPacGalJ9GcvrbmOL3r/7QOMwVZDSw+1SqsrA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@eslint-community/eslint-utils\": \"^4.4.0\",\n\t\t\t\t\"enhanced-resolve\": \"^5.17.0\",\n\t\t\t\t\"eslint-plugin-es-x\": \"^7.5.0\",\n\t\t\t\t\"get-tsconfig\": \"^4.7.0\",\n\t\t\t\t\"globals\": \"^15.0.0\",\n\t\t\t\t\"ignore\": \"^5.2.4\",\n\t\t\t\t\"minimatch\": \"^9.0.0\",\n\t\t\t\t\"semver\": \"^7.5.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://opencollective.com/eslint\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \">=8.23.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-config-wikimedia/node_modules/globals\": {\n\t\t\t\"version\": \"15.4.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/globals/-/globals-15.4.0.tgz\",\n\t\t\t\"integrity\": \"sha512-unnwvMZpv0eDUyjNyh9DH/yxUaRYrEjW/qK4QcdrHg3oO11igUQrCSgODHEqxlKg8v2CD2Sd7UkqqEBoz5U7TQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=18\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-config-wikimedia/node_modules/minimatch\": {\n\t\t\t\"version\": \"9.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"brace-expansion\": \"^2.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=16 || 14 >=14.17\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/isaacs\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-compat\": {\n\t\t\t\"version\": \"4.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@mdn/browser-compat-data\": \"^5.3.13\",\n\t\t\t\t\"ast-metadata-inferer\": \"^0.8.0\",\n\t\t\t\t\"browserslist\": \"^4.21.10\",\n\t\t\t\t\"caniuse-lite\": \"^1.0.30001524\",\n\t\t\t\t\"find-up\": \"^5.0.0\",\n\t\t\t\t\"lodash.memoize\": \"^4.1.2\",\n\t\t\t\t\"semver\": \"^7.5.4\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=14.x\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \"^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-es-x\": {\n\t\t\t\"version\": \"7.6.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz\",\n\t\t\t\"integrity\": \"sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@eslint-community/eslint-utils\": \"^4.1.2\",\n\t\t\t\t\"@eslint-community/regexpp\": \"^4.6.0\",\n\t\t\t\t\"eslint-compat-utils\": \"^0.5.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^14.18.0 || >=16.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ota-meshi\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-jest\": {\n\t\t\t\"version\": \"28.6.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.6.0.tgz\",\n\t\t\t\"integrity\": \"sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@typescript-eslint/utils\": \"^6.0.0 || ^7.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^16.10.0 || ^18.12.0 || >=20.0.0\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"@typescript-eslint/eslint-plugin\": \"^6.0.0 || ^7.0.0\",\n\t\t\t\t\"eslint\": \"^7.0.0 || ^8.0.0 || ^9.0.0\",\n\t\t\t\t\"jest\": \"*\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"@typescript-eslint/eslint-plugin\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t},\n\t\t\t\t\"jest\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-jsdoc\": {\n\t\t\t\"version\": \"48.2.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz\",\n\t\t\t\"integrity\": \"sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@es-joy/jsdoccomment\": \"~0.43.0\",\n\t\t\t\t\"are-docs-informative\": \"^0.0.2\",\n\t\t\t\t\"comment-parser\": \"1.4.1\",\n\t\t\t\t\"debug\": \"^4.3.4\",\n\t\t\t\t\"escape-string-regexp\": \"^4.0.0\",\n\t\t\t\t\"esquery\": \"^1.5.0\",\n\t\t\t\t\"is-builtin-module\": \"^3.2.1\",\n\t\t\t\t\"semver\": \"^7.6.1\",\n\t\t\t\t\"spdx-expression-parse\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=18\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \"^7.0.0 || ^8.0.0 || ^9.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-jsdoc/node_modules/debug\": {\n\t\t\t\"version\": \"4.3.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.5.tgz\",\n\t\t\t\"integrity\": \"sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ms\": \"2.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"supports-color\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-jsdoc/node_modules/ms\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/eslint-plugin-json-es\": {\n\t\t\t\"version\": \"1.6.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.6.0.tgz\",\n\t\t\t\"integrity\": \"sha512-xVn6hufGQH1Aa+yqOhQ43Cq28GuitTcMpQh+uaUh27U2qnVLBrvkN+2xQSnv6zpdLEPS35JCNhq4kvhR+PQCgw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"eslint-visitor-keys\": \"^3.3.0\",\n\t\t\t\t\"espree\": \"^9.3.1\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \">= 7\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-mediawiki\": {\n\t\t\t\"version\": \"0.7.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.0.tgz\",\n\t\t\t\"integrity\": \"sha512-1Y2nsFDPp96xOZCB5ivZAgqYe9i6w2u64VoCIaAzPyZnd/2h8VQR3CtD+u4Yk/KrpbKq9AAJjrs5LS8VAz6KOA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"eslint-plugin-vue\": \"^9.23.0\",\n\t\t\t\t\"upath\": \"^2.0.1\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \">=5.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-mocha\": {\n\t\t\t\"version\": \"10.4.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz\",\n\t\t\t\"integrity\": \"sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"eslint-utils\": \"^3.0.0\",\n\t\t\t\t\"globals\": \"^13.24.0\",\n\t\t\t\t\"rambda\": \"^7.4.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=14.0.0\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \">=7.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-n\": {\n\t\t\t\"version\": \"16.6.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz\",\n\t\t\t\"integrity\": \"sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@eslint-community/eslint-utils\": \"^4.4.0\",\n\t\t\t\t\"builtins\": \"^5.0.1\",\n\t\t\t\t\"eslint-plugin-es-x\": \"^7.5.0\",\n\t\t\t\t\"get-tsconfig\": \"^4.7.0\",\n\t\t\t\t\"globals\": \"^13.24.0\",\n\t\t\t\t\"ignore\": \"^5.2.4\",\n\t\t\t\t\"is-builtin-module\": \"^3.2.1\",\n\t\t\t\t\"is-core-module\": \"^2.12.1\",\n\t\t\t\t\"minimatch\": \"^3.1.2\",\n\t\t\t\t\"resolve\": \"^1.22.2\",\n\t\t\t\t\"semver\": \"^7.5.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=16.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/mysticatea\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \">=7.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-no-jquery\": {\n\t\t\t\"version\": \"3.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \">=8.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-qunit\": {\n\t\t\t\"version\": \"8.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"eslint-utils\": \"^3.0.0\",\n\t\t\t\t\"requireindex\": \"^1.2.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^16.0.0 || ^18.0.0 || >=20.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-security\": {\n\t\t\t\"version\": \"1.7.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz\",\n\t\t\t\"integrity\": \"sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"safe-regex\": \"^2.1.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-unicorn\": {\n\t\t\t\"version\": \"53.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/helper-validator-identifier\": \"^7.24.5\",\n\t\t\t\t\"@eslint-community/eslint-utils\": \"^4.4.0\",\n\t\t\t\t\"@eslint/eslintrc\": \"^3.0.2\",\n\t\t\t\t\"ci-info\": \"^4.0.0\",\n\t\t\t\t\"clean-regexp\": \"^1.0.0\",\n\t\t\t\t\"core-js-compat\": \"^3.37.0\",\n\t\t\t\t\"esquery\": \"^1.5.0\",\n\t\t\t\t\"indent-string\": \"^4.0.0\",\n\t\t\t\t\"is-builtin-module\": \"^3.2.1\",\n\t\t\t\t\"jsesc\": \"^3.0.2\",\n\t\t\t\t\"pluralize\": \"^8.0.0\",\n\t\t\t\t\"read-pkg-up\": \"^7.0.1\",\n\t\t\t\t\"regexp-tree\": \"^0.1.27\",\n\t\t\t\t\"regjsparser\": \"^0.10.0\",\n\t\t\t\t\"semver\": \"^7.6.1\",\n\t\t\t\t\"strip-indent\": \"^3.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=18.18\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \">=8.56.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-unicorn/node_modules/@eslint/eslintrc\": {\n\t\t\t\"version\": \"3.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ajv\": \"^6.12.4\",\n\t\t\t\t\"debug\": \"^4.3.2\",\n\t\t\t\t\"espree\": \"^10.0.1\",\n\t\t\t\t\"globals\": \"^14.0.0\",\n\t\t\t\t\"ignore\": \"^5.2.0\",\n\t\t\t\t\"import-fresh\": \"^3.2.1\",\n\t\t\t\t\"js-yaml\": \"^4.1.0\",\n\t\t\t\t\"minimatch\": \"^3.1.2\",\n\t\t\t\t\"strip-json-comments\": \"^3.1.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://opencollective.com/eslint\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-unicorn/node_modules/ajv\": {\n\t\t\t\"version\": \"6.12.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz\",\n\t\t\t\"integrity\": \"sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"fast-deep-equal\": \"^3.1.1\",\n\t\t\t\t\"fast-json-stable-stringify\": \"^2.0.0\",\n\t\t\t\t\"json-schema-traverse\": \"^0.4.1\",\n\t\t\t\t\"uri-js\": \"^4.2.2\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"github\",\n\t\t\t\t\"url\": \"https://github.com/sponsors/epoberezkin\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-unicorn/node_modules/debug\": {\n\t\t\t\"version\": \"4.3.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.5.tgz\",\n\t\t\t\"integrity\": \"sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ms\": \"2.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"supports-color\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-unicorn/node_modules/eslint-visitor-keys\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://opencollective.com/eslint\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-unicorn/node_modules/espree\": {\n\t\t\t\"version\": \"10.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/espree/-/espree-10.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"acorn\": \"^8.11.3\",\n\t\t\t\t\"acorn-jsx\": \"^5.3.2\",\n\t\t\t\t\"eslint-visitor-keys\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://opencollective.com/eslint\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-unicorn/node_modules/globals\": {\n\t\t\t\"version\": \"14.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/globals/-/globals-14.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=18\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-unicorn/node_modules/json-schema-traverse\": {\n\t\t\t\"version\": \"0.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/eslint-plugin-unicorn/node_modules/ms\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/eslint-plugin-vue\": {\n\t\t\t\"version\": \"9.26.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz\",\n\t\t\t\"integrity\": \"sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@eslint-community/eslint-utils\": \"^4.4.0\",\n\t\t\t\t\"globals\": \"^13.24.0\",\n\t\t\t\t\"natural-compare\": \"^1.4.0\",\n\t\t\t\t\"nth-check\": \"^2.1.1\",\n\t\t\t\t\"postcss-selector-parser\": \"^6.0.15\",\n\t\t\t\t\"semver\": \"^7.6.0\",\n\t\t\t\t\"vue-eslint-parser\": \"^9.4.2\",\n\t\t\t\t\"xml-name-validator\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^14.17.0 || >=16.0.0\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \"^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-wdio\": {\n\t\t\t\"version\": \"8.24.12\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz\",\n\t\t\t\"integrity\": \"sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^16.13 || >=18\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-yml\": {\n\t\t\t\"version\": \"1.14.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz\",\n\t\t\t\"integrity\": \"sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"debug\": \"^4.3.2\",\n\t\t\t\t\"eslint-compat-utils\": \"^0.5.0\",\n\t\t\t\t\"lodash\": \"^4.17.21\",\n\t\t\t\t\"natural-compare\": \"^1.4.0\",\n\t\t\t\t\"yaml-eslint-parser\": \"^1.2.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^14.17.0 || >=16.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ota-meshi\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \">=6.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-yml/node_modules/debug\": {\n\t\t\t\"version\": \"4.3.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.4.tgz\",\n\t\t\t\"integrity\": \"sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ms\": \"2.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"supports-color\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-plugin-yml/node_modules/ms\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/eslint-scope\": {\n\t\t\t\"version\": \"7.2.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz\",\n\t\t\t\"integrity\": \"sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"esrecurse\": \"^4.3.0\",\n\t\t\t\t\"estraverse\": \"^5.2.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://opencollective.com/eslint\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-utils\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"eslint-visitor-keys\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^10.0.0 || ^12.0.0 || >= 14.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/mysticatea\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \">=5\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-utils/node_modules/eslint-visitor-keys\": {\n\t\t\t\"version\": \"2.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint-visitor-keys\": {\n\t\t\t\"version\": \"3.4.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz\",\n\t\t\t\"integrity\": \"sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://opencollective.com/eslint\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint/node_modules/ajv\": {\n\t\t\t\"version\": \"6.12.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz\",\n\t\t\t\"integrity\": \"sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"fast-deep-equal\": \"^3.1.1\",\n\t\t\t\t\"fast-json-stable-stringify\": \"^2.0.0\",\n\t\t\t\t\"json-schema-traverse\": \"^0.4.1\",\n\t\t\t\t\"uri-js\": \"^4.2.2\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"github\",\n\t\t\t\t\"url\": \"https://github.com/sponsors/epoberezkin\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint/node_modules/debug\": {\n\t\t\t\"version\": \"4.3.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.4.tgz\",\n\t\t\t\"integrity\": \"sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ms\": \"2.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"supports-color\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/eslint/node_modules/json-schema-traverse\": {\n\t\t\t\"version\": \"0.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/eslint/node_modules/ms\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/espree\": {\n\t\t\t\"version\": \"9.6.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/espree/-/espree-9.6.1.tgz\",\n\t\t\t\"integrity\": \"sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"acorn\": \"^8.9.0\",\n\t\t\t\t\"acorn-jsx\": \"^5.3.2\",\n\t\t\t\t\"eslint-visitor-keys\": \"^3.4.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://opencollective.com/eslint\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/esprima\": {\n\t\t\t\"version\": \"4.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==\",\n\t\t\t\"bin\": {\n\t\t\t\t\"esparse\": \"bin/esparse.js\",\n\t\t\t\t\"esvalidate\": \"bin/esvalidate.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/esquery\": {\n\t\t\t\"version\": \"1.5.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz\",\n\t\t\t\"integrity\": \"sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"estraverse\": \"^5.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/esrecurse\": {\n\t\t\t\"version\": \"4.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"estraverse\": \"^5.2.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/estraverse\": {\n\t\t\t\"version\": \"5.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/esutils\": {\n\t\t\t\"version\": \"2.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/etag\": {\n\t\t\t\"version\": \"1.8.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/etag/-/etag-1.8.1.tgz\",\n\t\t\t\"integrity\": \"sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/express\": {\n\t\t\t\"version\": \"4.21.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/express/-/express-4.21.2.tgz\",\n\t\t\t\"integrity\": \"sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"accepts\": \"~1.3.8\",\n\t\t\t\t\"array-flatten\": \"1.1.1\",\n\t\t\t\t\"body-parser\": \"1.20.3\",\n\t\t\t\t\"content-disposition\": \"0.5.4\",\n\t\t\t\t\"content-type\": \"~1.0.4\",\n\t\t\t\t\"cookie\": \"0.7.1\",\n\t\t\t\t\"cookie-signature\": \"1.0.6\",\n\t\t\t\t\"debug\": \"2.6.9\",\n\t\t\t\t\"depd\": \"2.0.0\",\n\t\t\t\t\"encodeurl\": \"~2.0.0\",\n\t\t\t\t\"escape-html\": \"~1.0.3\",\n\t\t\t\t\"etag\": \"~1.8.1\",\n\t\t\t\t\"finalhandler\": \"1.3.1\",\n\t\t\t\t\"fresh\": \"0.5.2\",\n\t\t\t\t\"http-errors\": \"2.0.0\",\n\t\t\t\t\"merge-descriptors\": \"1.0.3\",\n\t\t\t\t\"methods\": \"~1.1.2\",\n\t\t\t\t\"on-finished\": \"2.4.1\",\n\t\t\t\t\"parseurl\": \"~1.3.3\",\n\t\t\t\t\"path-to-regexp\": \"0.1.12\",\n\t\t\t\t\"proxy-addr\": \"~2.0.7\",\n\t\t\t\t\"qs\": \"6.13.0\",\n\t\t\t\t\"range-parser\": \"~1.2.1\",\n\t\t\t\t\"safe-buffer\": \"5.2.1\",\n\t\t\t\t\"send\": \"0.19.0\",\n\t\t\t\t\"serve-static\": \"1.16.2\",\n\t\t\t\t\"setprototypeof\": \"1.2.0\",\n\t\t\t\t\"statuses\": \"2.0.1\",\n\t\t\t\t\"type-is\": \"~1.6.18\",\n\t\t\t\t\"utils-merge\": \"1.0.1\",\n\t\t\t\t\"vary\": \"~1.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.10.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"opencollective\",\n\t\t\t\t\"url\": \"https://opencollective.com/express\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/express/node_modules/encodeurl\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/express/node_modules/safe-buffer\": {\n\t\t\t\"version\": \"5.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==\",\n\t\t\t\"funding\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"github\",\n\t\t\t\t\t\"url\": \"https://github.com/sponsors/feross\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"patreon\",\n\t\t\t\t\t\"url\": \"https://www.patreon.com/feross\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"consulting\",\n\t\t\t\t\t\"url\": \"https://feross.org/support\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"node_modules/extend\": {\n\t\t\t\"version\": \"3.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/extend/-/extend-3.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==\"\n\t\t},\n\t\t\"node_modules/extsprintf\": {\n\t\t\t\"version\": \"1.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==\",\n\t\t\t\"engines\": [\n\t\t\t\t\"node >=0.6.0\"\n\t\t\t]\n\t\t},\n\t\t\"node_modules/fast-deep-equal\": {\n\t\t\t\"version\": \"3.1.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz\",\n\t\t\t\"integrity\": \"sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==\"\n\t\t},\n\t\t\"node_modules/fast-glob\": {\n\t\t\t\"version\": \"3.3.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz\",\n\t\t\t\"integrity\": \"sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@nodelib/fs.stat\": \"^2.0.2\",\n\t\t\t\t\"@nodelib/fs.walk\": \"^1.2.3\",\n\t\t\t\t\"glob-parent\": \"^5.1.2\",\n\t\t\t\t\"merge2\": \"^1.3.0\",\n\t\t\t\t\"micromatch\": \"^4.0.4\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8.6.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/fast-glob/node_modules/glob-parent\": {\n\t\t\t\"version\": \"5.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-glob\": \"^4.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/fast-json-stable-stringify\": {\n\t\t\t\"version\": \"2.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==\"\n\t\t},\n\t\t\"node_modules/fast-levenshtein\": {\n\t\t\t\"version\": \"2.0.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz\",\n\t\t\t\"integrity\": \"sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/fastq\": {\n\t\t\t\"version\": \"1.17.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz\",\n\t\t\t\"integrity\": \"sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"reusify\": \"^1.0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/file-entry-cache\": {\n\t\t\t\"version\": \"6.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"flat-cache\": \"^3.0.4\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^10.12.0 || >=12.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/file-uri-to-path\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==\",\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"node_modules/fill-range\": {\n\t\t\t\"version\": \"7.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"to-regex-range\": \"^5.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/finalhandler\": {\n\t\t\t\"version\": \"1.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"debug\": \"2.6.9\",\n\t\t\t\t\"encodeurl\": \"~2.0.0\",\n\t\t\t\t\"escape-html\": \"~1.0.3\",\n\t\t\t\t\"on-finished\": \"2.4.1\",\n\t\t\t\t\"parseurl\": \"~1.3.3\",\n\t\t\t\t\"statuses\": \"2.0.1\",\n\t\t\t\t\"unpipe\": \"~1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/finalhandler/node_modules/encodeurl\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/find-cache-dir\": {\n\t\t\t\"version\": \"3.3.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz\",\n\t\t\t\"integrity\": \"sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"commondir\": \"^1.0.1\",\n\t\t\t\t\"make-dir\": \"^3.0.2\",\n\t\t\t\t\"pkg-dir\": \"^4.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/avajs/find-cache-dir?sponsor=1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/find-up\": {\n\t\t\t\"version\": \"5.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"locate-path\": \"^6.0.0\",\n\t\t\t\t\"path-exists\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/flat\": {\n\t\t\t\"version\": \"5.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/flat/-/flat-5.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"flat\": \"cli.js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/flat-cache\": {\n\t\t\t\"version\": \"3.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"flatted\": \"^3.2.9\",\n\t\t\t\t\"keyv\": \"^4.5.3\",\n\t\t\t\t\"rimraf\": \"^3.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^10.12.0 || >=12.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/flatted\": {\n\t\t\t\"version\": \"3.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/follow-redirects\": {\n\t\t\t\"version\": \"1.15.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz\",\n\t\t\t\"integrity\": \"sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==\",\n\t\t\t\"funding\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"individual\",\n\t\t\t\t\t\"url\": \"https://github.com/sponsors/RubenVerborgh\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"debug\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/foreground-child\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"cross-spawn\": \"^7.0.0\",\n\t\t\t\t\"signal-exit\": \"^3.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/forever-agent\": {\n\t\t\t\"version\": \"0.6.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz\",\n\t\t\t\"integrity\": \"sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/form-data\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"asynckit\": \"^0.4.0\",\n\t\t\t\t\"combined-stream\": \"^1.0.8\",\n\t\t\t\t\"mime-types\": \"^2.1.12\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/forwarded\": {\n\t\t\t\"version\": \"0.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/fresh\": {\n\t\t\t\"version\": \"0.5.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz\",\n\t\t\t\"integrity\": \"sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/fromentries\": {\n\t\t\t\"version\": \"1.3.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz\",\n\t\t\t\"integrity\": \"sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"funding\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"github\",\n\t\t\t\t\t\"url\": \"https://github.com/sponsors/feross\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"patreon\",\n\t\t\t\t\t\"url\": \"https://www.patreon.com/feross\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"consulting\",\n\t\t\t\t\t\"url\": \"https://feross.org/support\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"node_modules/fs-minipass\": {\n\t\t\t\"version\": \"1.2.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz\",\n\t\t\t\"integrity\": \"sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"minipass\": \"^2.6.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/fs.realpath\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/fsevents\": {\n\t\t\t\"version\": \"2.3.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n\t\t\t\"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"hasInstallScript\": true,\n\t\t\t\"optional\": true,\n\t\t\t\"os\": [\n\t\t\t\t\"darwin\"\n\t\t\t],\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/function-bind\": {\n\t\t\t\"version\": \"1.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/gelf-stream\": {\n\t\t\t\"version\": \"1.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/gelf-stream/-/gelf-stream-1.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-kCzCfI6DJ8+aaDhwMcsNm2l6CsBj6y4Is6CCxH2W9sYnZGcXg9WmJ/iZMoJVO6uTwTRL7dbIioAS8lCuGUXSFA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"gelfling\": \"^0.3.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/gelfling\": {\n\t\t\t\"version\": \"0.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/gelfling/-/gelfling-0.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-vli3D2RYpLW6XhryNrv7HMjFNbj+ks/CCVDjokxOtZ+p6QYRadj8Zc0ps+LolSsh/I97XO0OduP/ShOej08clA==\"\n\t\t},\n\t\t\"node_modules/gensync\": {\n\t\t\t\"version\": \"1.0.0-beta.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n\t\t\t\"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/get-caller-file\": {\n\t\t\t\"version\": \"2.0.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n\t\t\t\"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"6.* || 8.* || >= 10.*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/get-intrinsic\": {\n\t\t\t\"version\": \"1.2.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz\",\n\t\t\t\"integrity\": \"sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"function-bind\": \"^1.1.2\",\n\t\t\t\t\"has-proto\": \"^1.0.1\",\n\t\t\t\t\"has-symbols\": \"^1.0.3\",\n\t\t\t\t\"hasown\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/get-package-type\": {\n\t\t\t\"version\": \"0.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/get-tsconfig\": {\n\t\t\t\"version\": \"4.7.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz\",\n\t\t\t\"integrity\": \"sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"resolve-pkg-maps\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/privatenumber/get-tsconfig?sponsor=1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/getpass\": {\n\t\t\t\"version\": \"0.1.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz\",\n\t\t\t\"integrity\": \"sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"assert-plus\": \"^1.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/glob\": {\n\t\t\t\"version\": \"8.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/glob/-/glob-8.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"fs.realpath\": \"^1.0.0\",\n\t\t\t\t\"inflight\": \"^1.0.4\",\n\t\t\t\t\"inherits\": \"2\",\n\t\t\t\t\"minimatch\": \"^5.0.1\",\n\t\t\t\t\"once\": \"^1.3.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=12\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/isaacs\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/glob-parent\": {\n\t\t\t\"version\": \"6.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-glob\": \"^4.0.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10.13.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/glob/node_modules/brace-expansion\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"balanced-match\": \"^1.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/glob/node_modules/minimatch\": {\n\t\t\t\"version\": \"5.1.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz\",\n\t\t\t\"integrity\": \"sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"brace-expansion\": \"^2.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/globals\": {\n\t\t\t\"version\": \"13.24.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/globals/-/globals-13.24.0.tgz\",\n\t\t\t\"integrity\": \"sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"type-fest\": \"^0.20.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/globby\": {\n\t\t\t\"version\": \"11.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/globby/-/globby-11.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"array-union\": \"^2.1.0\",\n\t\t\t\t\"dir-glob\": \"^3.0.1\",\n\t\t\t\t\"fast-glob\": \"^3.2.9\",\n\t\t\t\t\"ignore\": \"^5.2.0\",\n\t\t\t\t\"merge2\": \"^1.4.1\",\n\t\t\t\t\"slash\": \"^3.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/gopd\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"get-intrinsic\": \"^1.1.3\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/graceful-fs\": {\n\t\t\t\"version\": \"4.2.11\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz\",\n\t\t\t\"integrity\": \"sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/graphemer\": {\n\t\t\t\"version\": \"1.4.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz\",\n\t\t\t\"integrity\": \"sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/har-schema\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/har-validator\": {\n\t\t\t\"version\": \"5.1.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz\",\n\t\t\t\"integrity\": \"sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==\",\n\t\t\t\"deprecated\": \"this library is no longer supported\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ajv\": \"^6.12.3\",\n\t\t\t\t\"har-schema\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/har-validator/node_modules/ajv\": {\n\t\t\t\"version\": \"6.12.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz\",\n\t\t\t\"integrity\": \"sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"fast-deep-equal\": \"^3.1.1\",\n\t\t\t\t\"fast-json-stable-stringify\": \"^2.0.0\",\n\t\t\t\t\"json-schema-traverse\": \"^0.4.1\",\n\t\t\t\t\"uri-js\": \"^4.2.2\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"github\",\n\t\t\t\t\"url\": \"https://github.com/sponsors/epoberezkin\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/har-validator/node_modules/json-schema-traverse\": {\n\t\t\t\"version\": \"0.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==\"\n\t\t},\n\t\t\"node_modules/has-flag\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/has-property-descriptors\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es-define-property\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/has-proto\": {\n\t\t\t\"version\": \"1.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/has-symbols\": {\n\t\t\t\"version\": \"1.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/hasha\": {\n\t\t\t\"version\": \"5.2.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz\",\n\t\t\t\"integrity\": \"sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-stream\": \"^2.0.0\",\n\t\t\t\t\"type-fest\": \"^0.8.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/hasha/node_modules/type-fest\": {\n\t\t\t\"version\": \"0.8.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz\",\n\t\t\t\"integrity\": \"sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/hasown\": {\n\t\t\t\"version\": \"2.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"function-bind\": \"^1.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/hat\": {\n\t\t\t\"version\": \"0.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/hat/-/hat-0.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-zpImx2GoKXy42fVDSEad2BPKuSQdLcqsCYa48K3zHSzM/ugWuYjLDr8IXxpVuL7uCLHw56eaiLxCRthhOzf5ug==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/he\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/he/-/he-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"he\": \"bin/he\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/heapdump\": {\n\t\t\t\"version\": \"0.3.15\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/heapdump/-/heapdump-0.3.15.tgz\",\n\t\t\t\"integrity\": \"sha512-n8aSFscI9r3gfhOcAECAtXFaQ1uy4QSke6bnaL+iymYZ/dWs9cqDqHM+rALfsHUwukUbxsdlECZ0pKmJdQ/4OA==\",\n\t\t\t\"hasInstallScript\": true,\n\t\t\t\"optional\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"nan\": \"^2.13.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/hosted-git-info\": {\n\t\t\t\"version\": \"2.8.9\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz\",\n\t\t\t\"integrity\": \"sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/hot-shots\": {\n\t\t\t\"version\": \"6.8.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/hot-shots/-/hot-shots-6.8.7.tgz\",\n\t\t\t\"integrity\": \"sha512-XH8iezBSZgVw2jegu96pUfF1Zv0VZ/iXjb7L5yE3F7mn7/bdhf4qeniXjO0wQWeefe433rhOsazNKLxM+XMI9w==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0.0\"\n\t\t\t},\n\t\t\t\"optionalDependencies\": {\n\t\t\t\t\"unix-dgram\": \"2.0.x\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/html-escaper\": {\n\t\t\t\"version\": \"2.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/http-errors\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"depd\": \"2.0.0\",\n\t\t\t\t\"inherits\": \"2.0.4\",\n\t\t\t\t\"setprototypeof\": \"1.2.0\",\n\t\t\t\t\"statuses\": \"2.0.1\",\n\t\t\t\t\"toidentifier\": \"1.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/http-shutdown\": {\n\t\t\t\"version\": \"1.2.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz\",\n\t\t\t\"integrity\": \"sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"iojs\": \">= 1.0.0\",\n\t\t\t\t\"node\": \">= 0.12.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/http-signature\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"assert-plus\": \"^1.0.0\",\n\t\t\t\t\"jsprim\": \"^1.2.2\",\n\t\t\t\t\"sshpk\": \"^1.7.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8\",\n\t\t\t\t\"npm\": \">=1.3.7\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/iconv-lite\": {\n\t\t\t\"version\": \"0.4.24\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz\",\n\t\t\t\"integrity\": \"sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"safer-buffer\": \">= 2.1.2 < 3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ignore\": {\n\t\t\t\"version\": \"5.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/import-fresh\": {\n\t\t\t\"version\": \"3.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"parent-module\": \"^1.0.0\",\n\t\t\t\t\"resolve-from\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/imurmurhash\": {\n\t\t\t\"version\": \"0.1.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz\",\n\t\t\t\"integrity\": \"sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8.19\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/indent-string\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/inflight\": {\n\t\t\t\"version\": \"1.0.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz\",\n\t\t\t\"integrity\": \"sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==\",\n\t\t\t\"devOptional\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"once\": \"^1.3.0\",\n\t\t\t\t\"wrappy\": \"1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/inherits\": {\n\t\t\t\"version\": \"2.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==\"\n\t\t},\n\t\t\"node_modules/ipaddr.js\": {\n\t\t\t\"version\": \"1.9.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz\",\n\t\t\t\"integrity\": \"sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-arrayish\": {\n\t\t\t\"version\": \"0.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/is-binary-path\": {\n\t\t\t\"version\": \"2.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"binary-extensions\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-builtin-module\": {\n\t\t\t\"version\": \"3.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"builtin-modules\": \"^3.3.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-core-module\": {\n\t\t\t\"version\": \"2.13.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz\",\n\t\t\t\"integrity\": \"sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"hasown\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-extglob\": {\n\t\t\t\"version\": \"2.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-fullwidth-code-point\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-glob\": {\n\t\t\t\"version\": \"4.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-extglob\": \"^2.1.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-number\": {\n\t\t\t\"version\": \"7.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.12.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-path-inside\": {\n\t\t\t\"version\": \"3.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-plain-obj\": {\n\t\t\t\"version\": \"2.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-retry-allowed\": {\n\t\t\t\"version\": \"2.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-stream\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-typedarray\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==\"\n\t\t},\n\t\t\"node_modules/is-unicode-supported\": {\n\t\t\t\"version\": \"0.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-windows\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/isarray\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\"\n\t\t},\n\t\t\"node_modules/isexe\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/isstream\": {\n\t\t\t\"version\": \"0.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==\"\n\t\t},\n\t\t\"node_modules/istanbul-lib-coverage\": {\n\t\t\t\"version\": \"3.2.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz\",\n\t\t\t\"integrity\": \"sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/istanbul-lib-hook\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"append-transform\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/istanbul-lib-instrument\": {\n\t\t\t\"version\": \"4.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/core\": \"^7.7.5\",\n\t\t\t\t\"@istanbuljs/schema\": \"^0.1.2\",\n\t\t\t\t\"istanbul-lib-coverage\": \"^3.0.0\",\n\t\t\t\t\"semver\": \"^6.3.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/istanbul-lib-instrument/node_modules/semver\": {\n\t\t\t\"version\": \"6.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"semver\": \"bin/semver.js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/istanbul-lib-processinfo\": {\n\t\t\t\"version\": \"2.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"archy\": \"^1.0.0\",\n\t\t\t\t\"cross-spawn\": \"^7.0.3\",\n\t\t\t\t\"istanbul-lib-coverage\": \"^3.2.0\",\n\t\t\t\t\"p-map\": \"^3.0.0\",\n\t\t\t\t\"rimraf\": \"^3.0.0\",\n\t\t\t\t\"uuid\": \"^8.3.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/istanbul-lib-processinfo/node_modules/uuid\": {\n\t\t\t\"version\": \"8.3.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz\",\n\t\t\t\"integrity\": \"sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"uuid\": \"dist/bin/uuid\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/istanbul-lib-report\": {\n\t\t\t\"version\": \"3.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"istanbul-lib-coverage\": \"^3.0.0\",\n\t\t\t\t\"make-dir\": \"^4.0.0\",\n\t\t\t\t\"supports-color\": \"^7.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/istanbul-lib-report/node_modules/make-dir\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"semver\": \"^7.5.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/istanbul-lib-source-maps\": {\n\t\t\t\"version\": \"4.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"debug\": \"^4.1.1\",\n\t\t\t\t\"istanbul-lib-coverage\": \"^3.0.0\",\n\t\t\t\t\"source-map\": \"^0.6.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/istanbul-lib-source-maps/node_modules/debug\": {\n\t\t\t\"version\": \"4.3.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.4.tgz\",\n\t\t\t\"integrity\": \"sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ms\": \"2.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"supports-color\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/istanbul-lib-source-maps/node_modules/ms\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/istanbul-reports\": {\n\t\t\t\"version\": \"3.1.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz\",\n\t\t\t\"integrity\": \"sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"html-escaper\": \"^2.0.0\",\n\t\t\t\t\"istanbul-lib-report\": \"^3.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/js-tokens\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/js-yaml\": {\n\t\t\t\"version\": \"4.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"argparse\": \"^2.0.1\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"js-yaml\": \"bin/js-yaml.js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/jsbn\": {\n\t\t\t\"version\": \"0.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==\"\n\t\t},\n\t\t\"node_modules/jsdoc-type-pratt-parser\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=12.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/jsesc\": {\n\t\t\t\"version\": \"3.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"jsesc\": \"bin/jsesc\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/json-buffer\": {\n\t\t\t\"version\": \"3.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/json-parse-even-better-errors\": {\n\t\t\t\"version\": \"2.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/json-schema\": {\n\t\t\t\"version\": \"0.4.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz\",\n\t\t\t\"integrity\": \"sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==\"\n\t\t},\n\t\t\"node_modules/json-schema-traverse\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/json-stable-stringify-without-jsonify\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/json-stringify-safe\": {\n\t\t\t\"version\": \"5.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==\"\n\t\t},\n\t\t\"node_modules/json5\": {\n\t\t\t\"version\": \"2.2.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n\t\t\t\"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"json5\": \"lib/cli.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/jsprim\": {\n\t\t\t\"version\": \"1.4.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz\",\n\t\t\t\"integrity\": \"sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"assert-plus\": \"1.0.0\",\n\t\t\t\t\"extsprintf\": \"1.3.0\",\n\t\t\t\t\"json-schema\": \"0.4.0\",\n\t\t\t\t\"verror\": \"1.10.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.6.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/just-extend\": {\n\t\t\t\"version\": \"6.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/kad-fs\": {\n\t\t\t\"version\": \"0.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/kad-fs/-/kad-fs-0.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-VlLY7MuXy+3Tlqn1NJNgNkta6BRposNsJhqqcLv/M5e/rGBAETU33DhlPwV6/RBZKGzylQFkeYaKaoYin+mGZw==\",\n\t\t\t\"deprecated\": \"This package is no longer maintained.\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"readable-stream\": \"^2.0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/kad-localstorage\": {\n\t\t\t\"version\": \"0.0.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/kad-localstorage/-/kad-localstorage-0.0.7.tgz\",\n\t\t\t\"integrity\": \"sha512-3BEFBPa9cbPvW7WvZSTQHy6dSgw7ob7yTqT+eORWrxm4f4fE26BUVorg36KRbg/W+YWEnippuM68ybFyF3heiA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"dom-storage\": \"^2.0.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/kad-memstore\": {\n\t\t\t\"version\": \"0.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/kad-memstore/-/kad-memstore-0.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-fwGvRXWjaSzMed8iQHkZH41wvaoq+3tIhuIbkqBBYFuuJtWoDWqgCYTADGPqLyaLX4Ct8aP5NtAxCaxk4cfcCg==\",\n\t\t\t\"deprecated\": \"This package is no longer maintained.\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"readable-stream\": \"^2.0.5\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/keyv\": {\n\t\t\t\"version\": \"4.5.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz\",\n\t\t\t\"integrity\": \"sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"json-buffer\": \"3.0.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/levn\": {\n\t\t\t\"version\": \"0.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/levn/-/levn-0.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"prelude-ls\": \"^1.2.1\",\n\t\t\t\t\"type-check\": \"~0.4.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/limitation\": {\n\t\t\t\"version\": \"0.2.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/limitation/-/limitation-0.2.3.tgz\",\n\t\t\t\"integrity\": \"sha512-IpIBG7WniPI1Og0HYxlo8JRD2E2pExwuol7hjobcNZSYBBxAamPJdV91Q47uw5/KiUKA+We8a33sh6vD1PQ+Yw==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"bluebird\": \"^3.3.1\",\n\t\t\t\t\"readable-stream\": \"^2.0.5\",\n\t\t\t\t\"wikimedia-kad-fork\": \"^1.3.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/lines-and-columns\": {\n\t\t\t\"version\": \"1.2.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz\",\n\t\t\t\"integrity\": \"sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/locate-path\": {\n\t\t\t\"version\": \"6.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-locate\": \"^5.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/lodash\": {\n\t\t\t\"version\": \"4.17.21\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz\",\n\t\t\t\"integrity\": \"sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==\"\n\t\t},\n\t\t\"node_modules/lodash.clone\": {\n\t\t\t\"version\": \"4.5.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz\",\n\t\t\t\"integrity\": \"sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==\"\n\t\t},\n\t\t\"node_modules/lodash.clonedeep\": {\n\t\t\t\"version\": \"4.5.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz\",\n\t\t\t\"integrity\": \"sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==\"\n\t\t},\n\t\t\"node_modules/lodash.flattendeep\": {\n\t\t\t\"version\": \"4.4.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz\",\n\t\t\t\"integrity\": \"sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/lodash.get\": {\n\t\t\t\"version\": \"4.4.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz\",\n\t\t\t\"integrity\": \"sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/lodash.memoize\": {\n\t\t\t\"version\": \"4.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/lodash.merge\": {\n\t\t\t\"version\": \"4.6.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz\",\n\t\t\t\"integrity\": \"sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/log-symbols\": {\n\t\t\t\"version\": \"4.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"chalk\": \"^4.1.0\",\n\t\t\t\t\"is-unicode-supported\": \"^0.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/long\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/long/-/long-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==\"\n\t\t},\n\t\t\"node_modules/lru-cache\": {\n\t\t\t\"version\": \"5.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"yallist\": \"^3.0.2\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/make-dir\": {\n\t\t\t\"version\": \"3.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"semver\": \"^6.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/make-dir/node_modules/semver\": {\n\t\t\t\"version\": \"6.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"semver\": \"bin/semver.js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/media-typer\": {\n\t\t\t\"version\": \"0.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mediawiki-title\": {\n\t\t\t\"version\": \"0.7.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/mediawiki-title/-/mediawiki-title-0.7.5.tgz\",\n\t\t\t\"integrity\": \"sha512-csC7Gt/z03tvtlicXqT2OMNc8wHk2rd7KSL4a/ZQxhY9YRyPPq3cSysg0ToskyGld89btn+zS8TdK0iaQp3M2g==\"\n\t\t},\n\t\t\"node_modules/merge-descriptors\": {\n\t\t\t\"version\": \"1.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==\",\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/merge2\": {\n\t\t\t\"version\": \"1.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/methods\": {\n\t\t\t\"version\": \"1.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/methods/-/methods-1.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/micromatch\": {\n\t\t\t\"version\": \"4.0.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz\",\n\t\t\t\"integrity\": \"sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"braces\": \"^3.0.3\",\n\t\t\t\t\"picomatch\": \"^2.3.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mime\": {\n\t\t\t\"version\": \"1.6.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/mime/-/mime-1.6.0.tgz\",\n\t\t\t\"integrity\": \"sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==\",\n\t\t\t\"bin\": {\n\t\t\t\t\"mime\": \"cli.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mime-db\": {\n\t\t\t\"version\": \"1.52.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz\",\n\t\t\t\"integrity\": \"sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mime-types\": {\n\t\t\t\"version\": \"2.1.35\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz\",\n\t\t\t\"integrity\": \"sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"mime-db\": \"1.52.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/min-indent\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/minimatch\": {\n\t\t\t\"version\": \"3.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==\",\n\t\t\t\"devOptional\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"brace-expansion\": \"^1.1.7\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/minimist\": {\n\t\t\t\"version\": \"1.2.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz\",\n\t\t\t\"integrity\": \"sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==\",\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/minipass\": {\n\t\t\t\"version\": \"2.9.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz\",\n\t\t\t\"integrity\": \"sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"safe-buffer\": \"^5.1.2\",\n\t\t\t\t\"yallist\": \"^3.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/minizlib\": {\n\t\t\t\"version\": \"1.3.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz\",\n\t\t\t\"integrity\": \"sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"minipass\": \"^2.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mkdirp\": {\n\t\t\t\"version\": \"0.5.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz\",\n\t\t\t\"integrity\": \"sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"minimist\": \"^1.2.6\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"mkdirp\": \"bin/cmd.js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mocha\": {\n\t\t\t\"version\": \"10.8.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz\",\n\t\t\t\"integrity\": \"sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ansi-colors\": \"^4.1.3\",\n\t\t\t\t\"browser-stdout\": \"^1.3.1\",\n\t\t\t\t\"chokidar\": \"^3.5.3\",\n\t\t\t\t\"debug\": \"^4.3.5\",\n\t\t\t\t\"diff\": \"^5.2.0\",\n\t\t\t\t\"escape-string-regexp\": \"^4.0.0\",\n\t\t\t\t\"find-up\": \"^5.0.0\",\n\t\t\t\t\"glob\": \"^8.1.0\",\n\t\t\t\t\"he\": \"^1.2.0\",\n\t\t\t\t\"js-yaml\": \"^4.1.0\",\n\t\t\t\t\"log-symbols\": \"^4.1.0\",\n\t\t\t\t\"minimatch\": \"^5.1.6\",\n\t\t\t\t\"ms\": \"^2.1.3\",\n\t\t\t\t\"serialize-javascript\": \"^6.0.2\",\n\t\t\t\t\"strip-json-comments\": \"^3.1.1\",\n\t\t\t\t\"supports-color\": \"^8.1.1\",\n\t\t\t\t\"workerpool\": \"^6.5.1\",\n\t\t\t\t\"yargs\": \"^16.2.0\",\n\t\t\t\t\"yargs-parser\": \"^20.2.9\",\n\t\t\t\t\"yargs-unparser\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"_mocha\": \"bin/_mocha\",\n\t\t\t\t\"mocha\": \"bin/mocha.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 14.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mocha-lcov-reporter\": {\n\t\t\t\"version\": \"1.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-/5zI2tW4lq/ft8MGpYQ1nIH6yePPtIzdGeUEwFMKfMRdLfAQ1QW2c68eEJop32tNdN5srHa/E2TzB+erm3YMYA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mocha.parallel\": {\n\t\t\t\"version\": \"0.15.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/mocha.parallel/-/mocha.parallel-0.15.6.tgz\",\n\t\t\t\"integrity\": \"sha512-pWph+QieKGjk7cHY2hB78wyKJDOQLyOMDuBLQLrFL7riJb8qbQBlCY3XztFHv0D1d4I1gCpiwFNjd4LhVOXPew==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"bluebird\": \"^2.9.34\",\n\t\t\t\t\"semaphore\": \"^1.0.5\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"mocha\": \">=2.2.5\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mocha.parallel/node_modules/bluebird\": {\n\t\t\t\"version\": \"2.11.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz\",\n\t\t\t\"integrity\": \"sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/mocha/node_modules/brace-expansion\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"balanced-match\": \"^1.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mocha/node_modules/debug\": {\n\t\t\t\"version\": \"4.4.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.0.tgz\",\n\t\t\t\"integrity\": \"sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ms\": \"^2.1.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"supports-color\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mocha/node_modules/minimatch\": {\n\t\t\t\"version\": \"5.1.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz\",\n\t\t\t\"integrity\": \"sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"brace-expansion\": \"^2.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mocha/node_modules/ms\": {\n\t\t\t\"version\": \"2.1.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n\t\t\t\"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/mocha/node_modules/supports-color\": {\n\t\t\t\"version\": \"8.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"has-flag\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/moment\": {\n\t\t\t\"version\": \"2.30.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/moment/-/moment-2.30.1.tgz\",\n\t\t\t\"integrity\": \"sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==\",\n\t\t\t\"optional\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ms\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\"\n\t\t},\n\t\t\"node_modules/msgpack5\": {\n\t\t\t\"version\": \"3.6.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/msgpack5/-/msgpack5-3.6.1.tgz\",\n\t\t\t\"integrity\": \"sha512-VoY2AaoowHZLLKyEb5FRzuhdSzXn5quGjcMKJOJHJPxp9baYZx5t6jiHUhp5aNRlqqlt+5GXQGovMLNKsrm1hg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"bl\": \"^1.2.1\",\n\t\t\t\t\"inherits\": \"^2.0.3\",\n\t\t\t\t\"readable-stream\": \"^2.3.3\",\n\t\t\t\t\"safe-buffer\": \"^5.1.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mv\": {\n\t\t\t\"version\": \"2.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/mv/-/mv-2.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==\",\n\t\t\t\"optional\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"mkdirp\": \"~0.5.1\",\n\t\t\t\t\"ncp\": \"~2.0.0\",\n\t\t\t\t\"rimraf\": \"~2.4.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mv/node_modules/glob\": {\n\t\t\t\"version\": \"6.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/glob/-/glob-6.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==\",\n\t\t\t\"optional\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"inflight\": \"^1.0.4\",\n\t\t\t\t\"inherits\": \"2\",\n\t\t\t\t\"minimatch\": \"2 || 3\",\n\t\t\t\t\"once\": \"^1.3.0\",\n\t\t\t\t\"path-is-absolute\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mv/node_modules/rimraf\": {\n\t\t\t\"version\": \"2.4.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz\",\n\t\t\t\"integrity\": \"sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==\",\n\t\t\t\"optional\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"glob\": \"^6.0.1\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"rimraf\": \"bin.js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nan\": {\n\t\t\t\"version\": \"2.19.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/nan/-/nan-2.19.0.tgz\",\n\t\t\t\"integrity\": \"sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==\",\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"node_modules/natural-compare\": {\n\t\t\t\"version\": \"1.4.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz\",\n\t\t\t\"integrity\": \"sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/ncp\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==\",\n\t\t\t\"optional\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"ncp\": \"bin/ncp\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/negotiator\": {\n\t\t\t\"version\": \"0.6.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz\",\n\t\t\t\"integrity\": \"sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nise\": {\n\t\t\t\"version\": \"5.1.9\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/nise/-/nise-5.1.9.tgz\",\n\t\t\t\"integrity\": \"sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@sinonjs/commons\": \"^3.0.0\",\n\t\t\t\t\"@sinonjs/fake-timers\": \"^11.2.2\",\n\t\t\t\t\"@sinonjs/text-encoding\": \"^0.7.2\",\n\t\t\t\t\"just-extend\": \"^6.2.0\",\n\t\t\t\t\"path-to-regexp\": \"^6.2.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nise/node_modules/path-to-regexp\": {\n\t\t\t\"version\": \"6.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/nock\": {\n\t\t\t\"version\": \"13.5.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/nock/-/nock-13.5.4.tgz\",\n\t\t\t\"integrity\": \"sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"debug\": \"^4.1.0\",\n\t\t\t\t\"json-stringify-safe\": \"^5.0.1\",\n\t\t\t\t\"propagate\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 10.13\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nock/node_modules/debug\": {\n\t\t\t\"version\": \"4.3.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.4.tgz\",\n\t\t\t\"integrity\": \"sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ms\": \"2.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"supports-color\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nock/node_modules/ms\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/node-preload\": {\n\t\t\t\"version\": \"0.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"process-on-spawn\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/node-releases\": {\n\t\t\t\"version\": \"2.0.14\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz\",\n\t\t\t\"integrity\": \"sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/normalize-package-data\": {\n\t\t\t\"version\": \"2.5.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz\",\n\t\t\t\"integrity\": \"sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"hosted-git-info\": \"^2.1.4\",\n\t\t\t\t\"resolve\": \"^1.10.0\",\n\t\t\t\t\"semver\": \"2 || 3 || 4 || 5\",\n\t\t\t\t\"validate-npm-package-license\": \"^3.0.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/normalize-package-data/node_modules/semver\": {\n\t\t\t\"version\": \"5.7.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/semver/-/semver-5.7.2.tgz\",\n\t\t\t\"integrity\": \"sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"semver\": \"bin/semver\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/normalize-path\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nth-check\": {\n\t\t\t\"version\": \"2.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"boolbase\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/fb55/nth-check?sponsor=1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nyc\": {\n\t\t\t\"version\": \"15.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@istanbuljs/load-nyc-config\": \"^1.0.0\",\n\t\t\t\t\"@istanbuljs/schema\": \"^0.1.2\",\n\t\t\t\t\"caching-transform\": \"^4.0.0\",\n\t\t\t\t\"convert-source-map\": \"^1.7.0\",\n\t\t\t\t\"decamelize\": \"^1.2.0\",\n\t\t\t\t\"find-cache-dir\": \"^3.2.0\",\n\t\t\t\t\"find-up\": \"^4.1.0\",\n\t\t\t\t\"foreground-child\": \"^2.0.0\",\n\t\t\t\t\"get-package-type\": \"^0.1.0\",\n\t\t\t\t\"glob\": \"^7.1.6\",\n\t\t\t\t\"istanbul-lib-coverage\": \"^3.0.0\",\n\t\t\t\t\"istanbul-lib-hook\": \"^3.0.0\",\n\t\t\t\t\"istanbul-lib-instrument\": \"^4.0.0\",\n\t\t\t\t\"istanbul-lib-processinfo\": \"^2.0.2\",\n\t\t\t\t\"istanbul-lib-report\": \"^3.0.0\",\n\t\t\t\t\"istanbul-lib-source-maps\": \"^4.0.0\",\n\t\t\t\t\"istanbul-reports\": \"^3.0.2\",\n\t\t\t\t\"make-dir\": \"^3.0.0\",\n\t\t\t\t\"node-preload\": \"^0.2.1\",\n\t\t\t\t\"p-map\": \"^3.0.0\",\n\t\t\t\t\"process-on-spawn\": \"^1.0.0\",\n\t\t\t\t\"resolve-from\": \"^5.0.0\",\n\t\t\t\t\"rimraf\": \"^3.0.0\",\n\t\t\t\t\"signal-exit\": \"^3.0.2\",\n\t\t\t\t\"spawn-wrap\": \"^2.0.0\",\n\t\t\t\t\"test-exclude\": \"^6.0.0\",\n\t\t\t\t\"yargs\": \"^15.0.2\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"nyc\": \"bin/nyc.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8.9\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nyc/node_modules/cliui\": {\n\t\t\t\"version\": \"6.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"string-width\": \"^4.2.0\",\n\t\t\t\t\"strip-ansi\": \"^6.0.0\",\n\t\t\t\t\"wrap-ansi\": \"^6.2.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nyc/node_modules/find-up\": {\n\t\t\t\"version\": \"4.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"locate-path\": \"^5.0.0\",\n\t\t\t\t\"path-exists\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nyc/node_modules/glob\": {\n\t\t\t\"version\": \"7.2.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.2.3.tgz\",\n\t\t\t\"integrity\": \"sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"fs.realpath\": \"^1.0.0\",\n\t\t\t\t\"inflight\": \"^1.0.4\",\n\t\t\t\t\"inherits\": \"2\",\n\t\t\t\t\"minimatch\": \"^3.1.1\",\n\t\t\t\t\"once\": \"^1.3.0\",\n\t\t\t\t\"path-is-absolute\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/isaacs\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nyc/node_modules/locate-path\": {\n\t\t\t\"version\": \"5.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-locate\": \"^4.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nyc/node_modules/p-limit\": {\n\t\t\t\"version\": \"2.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-try\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nyc/node_modules/p-locate\": {\n\t\t\t\"version\": \"4.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-limit\": \"^2.2.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nyc/node_modules/resolve-from\": {\n\t\t\t\"version\": \"5.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nyc/node_modules/wrap-ansi\": {\n\t\t\t\"version\": \"6.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ansi-styles\": \"^4.0.0\",\n\t\t\t\t\"string-width\": \"^4.1.0\",\n\t\t\t\t\"strip-ansi\": \"^6.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nyc/node_modules/y18n\": {\n\t\t\t\"version\": \"4.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/nyc/node_modules/yargs\": {\n\t\t\t\"version\": \"15.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"cliui\": \"^6.0.0\",\n\t\t\t\t\"decamelize\": \"^1.2.0\",\n\t\t\t\t\"find-up\": \"^4.1.0\",\n\t\t\t\t\"get-caller-file\": \"^2.0.1\",\n\t\t\t\t\"require-directory\": \"^2.1.1\",\n\t\t\t\t\"require-main-filename\": \"^2.0.0\",\n\t\t\t\t\"set-blocking\": \"^2.0.0\",\n\t\t\t\t\"string-width\": \"^4.2.0\",\n\t\t\t\t\"which-module\": \"^2.0.0\",\n\t\t\t\t\"y18n\": \"^4.0.0\",\n\t\t\t\t\"yargs-parser\": \"^18.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nyc/node_modules/yargs-parser\": {\n\t\t\t\"version\": \"18.1.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz\",\n\t\t\t\"integrity\": \"sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"camelcase\": \"^5.0.0\",\n\t\t\t\t\"decamelize\": \"^1.2.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/oauth-sign\": {\n\t\t\t\"version\": \"0.9.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz\",\n\t\t\t\"integrity\": \"sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/object-inspect\": {\n\t\t\t\"version\": \"1.13.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz\",\n\t\t\t\"integrity\": \"sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==\",\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/on-finished\": {\n\t\t\t\"version\": \"2.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ee-first\": \"1.1.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/on-headers\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/once\": {\n\t\t\t\"version\": \"1.4.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/once/-/once-1.4.0.tgz\",\n\t\t\t\"integrity\": \"sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==\",\n\t\t\t\"devOptional\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"wrappy\": \"1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/optionator\": {\n\t\t\t\"version\": \"0.9.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz\",\n\t\t\t\"integrity\": \"sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@aashutoshrathi/word-wrap\": \"^1.2.3\",\n\t\t\t\t\"deep-is\": \"^0.1.3\",\n\t\t\t\t\"fast-levenshtein\": \"^2.0.6\",\n\t\t\t\t\"levn\": \"^0.4.1\",\n\t\t\t\t\"prelude-ls\": \"^1.2.1\",\n\t\t\t\t\"type-check\": \"^0.4.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/os-shim\": {\n\t\t\t\"version\": \"0.1.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz\",\n\t\t\t\"integrity\": \"sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/p-limit\": {\n\t\t\t\"version\": \"3.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"yocto-queue\": \"^0.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/p-locate\": {\n\t\t\t\"version\": \"5.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-limit\": \"^3.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/p-map\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"aggregate-error\": \"^3.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/p-try\": {\n\t\t\t\"version\": \"2.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/package-hash\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"graceful-fs\": \"^4.1.15\",\n\t\t\t\t\"hasha\": \"^5.0.0\",\n\t\t\t\t\"lodash.flattendeep\": \"^4.4.0\",\n\t\t\t\t\"release-zalgo\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/parent-module\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"callsites\": \"^3.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/parse-json\": {\n\t\t\t\"version\": \"5.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/code-frame\": \"^7.0.0\",\n\t\t\t\t\"error-ex\": \"^1.3.1\",\n\t\t\t\t\"json-parse-even-better-errors\": \"^2.3.0\",\n\t\t\t\t\"lines-and-columns\": \"^1.1.6\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/parseurl\": {\n\t\t\t\"version\": \"1.3.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz\",\n\t\t\t\"integrity\": \"sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/path\": {\n\t\t\t\"version\": \"0.12.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/path/-/path-0.12.7.tgz\",\n\t\t\t\"integrity\": \"sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"process\": \"^0.11.1\",\n\t\t\t\t\"util\": \"^0.10.3\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/path-exists\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/path-is-absolute\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==\",\n\t\t\t\"devOptional\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/path-key\": {\n\t\t\t\"version\": \"3.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/path-parse\": {\n\t\t\t\"version\": \"1.0.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz\",\n\t\t\t\"integrity\": \"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/path-to-regexp\": {\n\t\t\t\"version\": \"0.1.12\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz\",\n\t\t\t\"integrity\": \"sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==\"\n\t\t},\n\t\t\"node_modules/path-type\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/performance-now\": {\n\t\t\t\"version\": \"2.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==\"\n\t\t},\n\t\t\"node_modules/picocolors\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/picomatch\": {\n\t\t\t\"version\": \"2.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8.6\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/jonschlinkert\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pkg-dir\": {\n\t\t\t\"version\": \"4.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"find-up\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pkg-dir/node_modules/find-up\": {\n\t\t\t\"version\": \"4.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"locate-path\": \"^5.0.0\",\n\t\t\t\t\"path-exists\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pkg-dir/node_modules/locate-path\": {\n\t\t\t\"version\": \"5.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-locate\": \"^4.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pkg-dir/node_modules/p-limit\": {\n\t\t\t\"version\": \"2.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-try\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pkg-dir/node_modules/p-locate\": {\n\t\t\t\"version\": \"4.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-limit\": \"^2.2.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pluralize\": {\n\t\t\t\"version\": \"8.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/postcss-selector-parser\": {\n\t\t\t\"version\": \"6.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"cssesc\": \"^3.0.0\",\n\t\t\t\t\"util-deprecate\": \"^1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pre-commit\": {\n\t\t\t\"version\": \"1.2.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz\",\n\t\t\t\"integrity\": \"sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"hasInstallScript\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"cross-spawn\": \"^5.0.1\",\n\t\t\t\t\"spawn-sync\": \"^1.0.15\",\n\t\t\t\t\"which\": \"1.2.x\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pre-commit/node_modules/cross-spawn\": {\n\t\t\t\"version\": \"5.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"lru-cache\": \"^4.0.1\",\n\t\t\t\t\"shebang-command\": \"^1.2.0\",\n\t\t\t\t\"which\": \"^1.2.9\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pre-commit/node_modules/lru-cache\": {\n\t\t\t\"version\": \"4.1.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz\",\n\t\t\t\"integrity\": \"sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"pseudomap\": \"^1.0.2\",\n\t\t\t\t\"yallist\": \"^2.1.2\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pre-commit/node_modules/shebang-command\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"shebang-regex\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pre-commit/node_modules/shebang-regex\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pre-commit/node_modules/which\": {\n\t\t\t\"version\": \"1.2.14\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/which/-/which-1.2.14.tgz\",\n\t\t\t\"integrity\": \"sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"isexe\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"which\": \"bin/which\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pre-commit/node_modules/yallist\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/prelude-ls\": {\n\t\t\t\"version\": \"1.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/preq\": {\n\t\t\t\"version\": \"0.5.14\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/preq/-/preq-0.5.14.tgz\",\n\t\t\t\"integrity\": \"sha512-kuJ5ndEgjs27kTTQ/P2ipPQoHeCJcAI4i97mU3xSjkjx6CsuQOsCe2l5twTGC0SCB5UkzRpmrpXmvN0Ip4ZCxA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"bluebird\": \"^3.5.5\",\n\t\t\t\t\"request\": \"^2.88.0\",\n\t\t\t\t\"requestretry\": \"4.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/process\": {\n\t\t\t\"version\": \"0.11.10\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/process/-/process-0.11.10.tgz\",\n\t\t\t\"integrity\": \"sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/process-nextick-args\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==\"\n\t\t},\n\t\t\"node_modules/process-on-spawn\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"fromentries\": \"^1.2.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/prom-client\": {\n\t\t\t\"version\": \"11.5.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/prom-client/-/prom-client-11.5.3.tgz\",\n\t\t\t\"integrity\": \"sha512-iz22FmTbtkyL2vt0MdDFY+kWof+S9UB/NACxSn2aJcewtw+EERsen0urSkZ2WrHseNdydsvcxCTAnPcSMZZv4Q==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"tdigest\": \"^0.1.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/propagate\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/proxy-addr\": {\n\t\t\t\"version\": \"2.0.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz\",\n\t\t\t\"integrity\": \"sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"forwarded\": \"0.2.0\",\n\t\t\t\t\"ipaddr.js\": \"1.9.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/proxy-from-env\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==\"\n\t\t},\n\t\t\"node_modules/pseudomap\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/psl\": {\n\t\t\t\"version\": \"1.9.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/psl/-/psl-1.9.0.tgz\",\n\t\t\t\"integrity\": \"sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==\"\n\t\t},\n\t\t\"node_modules/punycode\": {\n\t\t\t\"version\": \"2.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/qs\": {\n\t\t\t\"version\": \"6.13.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.13.0.tgz\",\n\t\t\t\"integrity\": \"sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"side-channel\": \"^1.0.6\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.6\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/queue-microtask\": {\n\t\t\t\"version\": \"1.2.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz\",\n\t\t\t\"integrity\": \"sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"funding\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"github\",\n\t\t\t\t\t\"url\": \"https://github.com/sponsors/feross\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"patreon\",\n\t\t\t\t\t\"url\": \"https://www.patreon.com/feross\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"consulting\",\n\t\t\t\t\t\"url\": \"https://feross.org/support\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"node_modules/rambda\": {\n\t\t\t\"version\": \"7.5.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz\",\n\t\t\t\"integrity\": \"sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/randombytes\": {\n\t\t\t\"version\": \"2.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"safe-buffer\": \"^5.1.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/range-parser\": {\n\t\t\t\"version\": \"1.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/raw-body\": {\n\t\t\t\"version\": \"2.5.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz\",\n\t\t\t\"integrity\": \"sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"bytes\": \"3.1.2\",\n\t\t\t\t\"http-errors\": \"2.0.0\",\n\t\t\t\t\"iconv-lite\": \"0.4.24\",\n\t\t\t\t\"unpipe\": \"1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/read-pkg\": {\n\t\t\t\"version\": \"5.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@types/normalize-package-data\": \"^2.4.0\",\n\t\t\t\t\"normalize-package-data\": \"^2.5.0\",\n\t\t\t\t\"parse-json\": \"^5.0.0\",\n\t\t\t\t\"type-fest\": \"^0.6.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/read-pkg-up\": {\n\t\t\t\"version\": \"7.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"find-up\": \"^4.1.0\",\n\t\t\t\t\"read-pkg\": \"^5.2.0\",\n\t\t\t\t\"type-fest\": \"^0.8.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/read-pkg-up/node_modules/find-up\": {\n\t\t\t\"version\": \"4.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"locate-path\": \"^5.0.0\",\n\t\t\t\t\"path-exists\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/read-pkg-up/node_modules/locate-path\": {\n\t\t\t\"version\": \"5.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-locate\": \"^4.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/read-pkg-up/node_modules/p-limit\": {\n\t\t\t\"version\": \"2.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-try\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/read-pkg-up/node_modules/p-locate\": {\n\t\t\t\"version\": \"4.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-limit\": \"^2.2.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/read-pkg-up/node_modules/type-fest\": {\n\t\t\t\"version\": \"0.8.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz\",\n\t\t\t\"integrity\": \"sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/read-pkg/node_modules/type-fest\": {\n\t\t\t\"version\": \"0.6.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz\",\n\t\t\t\"integrity\": \"sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/readable-stream\": {\n\t\t\t\"version\": \"2.3.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n\t\t\t\"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"core-util-is\": \"~1.0.0\",\n\t\t\t\t\"inherits\": \"~2.0.3\",\n\t\t\t\t\"isarray\": \"~1.0.0\",\n\t\t\t\t\"process-nextick-args\": \"~2.0.0\",\n\t\t\t\t\"safe-buffer\": \"~5.1.1\",\n\t\t\t\t\"string_decoder\": \"~1.1.1\",\n\t\t\t\t\"util-deprecate\": \"~1.0.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/readdirp\": {\n\t\t\t\"version\": \"3.6.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz\",\n\t\t\t\"integrity\": \"sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"picomatch\": \"^2.2.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/regexp-tree\": {\n\t\t\t\"version\": \"0.1.27\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz\",\n\t\t\t\"integrity\": \"sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"regexp-tree\": \"bin/regexp-tree\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/regjsparser\": {\n\t\t\t\"version\": \"0.10.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz\",\n\t\t\t\"integrity\": \"sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"jsesc\": \"~0.5.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"regjsparser\": \"bin/parser\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/regjsparser/node_modules/jsesc\": {\n\t\t\t\"version\": \"0.5.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz\",\n\t\t\t\"integrity\": \"sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"jsesc\": \"bin/jsesc\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/release-zalgo\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es6-error\": \"^4.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/request\": {\n\t\t\t\"version\": \"2.88.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/request/-/request-2.88.2.tgz\",\n\t\t\t\"integrity\": \"sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==\",\n\t\t\t\"deprecated\": \"request has been deprecated, see https://github.com/request/request/issues/3142\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"aws-sign2\": \"~0.7.0\",\n\t\t\t\t\"aws4\": \"^1.8.0\",\n\t\t\t\t\"caseless\": \"~0.12.0\",\n\t\t\t\t\"combined-stream\": \"~1.0.6\",\n\t\t\t\t\"extend\": \"~3.0.2\",\n\t\t\t\t\"forever-agent\": \"~0.6.1\",\n\t\t\t\t\"form-data\": \"~2.3.2\",\n\t\t\t\t\"har-validator\": \"~5.1.3\",\n\t\t\t\t\"http-signature\": \"~1.2.0\",\n\t\t\t\t\"is-typedarray\": \"~1.0.0\",\n\t\t\t\t\"isstream\": \"~0.1.2\",\n\t\t\t\t\"json-stringify-safe\": \"~5.0.1\",\n\t\t\t\t\"mime-types\": \"~2.1.19\",\n\t\t\t\t\"oauth-sign\": \"~0.9.0\",\n\t\t\t\t\"performance-now\": \"^2.1.0\",\n\t\t\t\t\"qs\": \"~6.5.2\",\n\t\t\t\t\"safe-buffer\": \"^5.1.2\",\n\t\t\t\t\"tough-cookie\": \"~2.5.0\",\n\t\t\t\t\"tunnel-agent\": \"^0.6.0\",\n\t\t\t\t\"uuid\": \"^3.3.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/request/node_modules/form-data\": {\n\t\t\t\"version\": \"2.3.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz\",\n\t\t\t\"integrity\": \"sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"asynckit\": \"^0.4.0\",\n\t\t\t\t\"combined-stream\": \"^1.0.6\",\n\t\t\t\t\"mime-types\": \"^2.1.12\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.12\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/request/node_modules/qs\": {\n\t\t\t\"version\": \"6.5.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.5.3.tgz\",\n\t\t\t\"integrity\": \"sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/request/node_modules/uuid\": {\n\t\t\t\"version\": \"3.4.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz\",\n\t\t\t\"integrity\": \"sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==\",\n\t\t\t\"deprecated\": \"Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.\",\n\t\t\t\"bin\": {\n\t\t\t\t\"uuid\": \"bin/uuid\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/requestretry\": {\n\t\t\t\"version\": \"4.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/requestretry/-/requestretry-4.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-ZGdO1ZXUQAeCB9xOS2keSN501y7T1t0zPOD58jTAOwamt6qkcBMaGdRBHEOMQRnDtT5fn7S99F0dwADUqCmYqg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"extend\": \"^3.0.2\",\n\t\t\t\t\"lodash\": \"^4.17.10\",\n\t\t\t\t\"when\": \"^3.7.7\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"request\": \"2.*.*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/require-directory\": {\n\t\t\t\"version\": \"2.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/require-from-string\": {\n\t\t\t\"version\": \"2.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/require-main-filename\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/requireindex\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.5\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/resolve\": {\n\t\t\t\"version\": \"1.22.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz\",\n\t\t\t\"integrity\": \"sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-core-module\": \"^2.13.0\",\n\t\t\t\t\"path-parse\": \"^1.0.7\",\n\t\t\t\t\"supports-preserve-symlinks-flag\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"resolve\": \"bin/resolve\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/resolve-from\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/resolve-pkg-maps\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/privatenumber/resolve-pkg-maps?sponsor=1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/reusify\": {\n\t\t\t\"version\": \"1.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"iojs\": \">=1.0.0\",\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/rimraf\": {\n\t\t\t\"version\": \"3.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"glob\": \"^7.1.3\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"rimraf\": \"bin.js\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/isaacs\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/rimraf/node_modules/glob\": {\n\t\t\t\"version\": \"7.2.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.2.3.tgz\",\n\t\t\t\"integrity\": \"sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"fs.realpath\": \"^1.0.0\",\n\t\t\t\t\"inflight\": \"^1.0.4\",\n\t\t\t\t\"inherits\": \"2\",\n\t\t\t\t\"minimatch\": \"^3.1.1\",\n\t\t\t\t\"once\": \"^1.3.0\",\n\t\t\t\t\"path-is-absolute\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/isaacs\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/rss-parser\": {\n\t\t\t\"version\": \"3.13.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/rss-parser/-/rss-parser-3.13.0.tgz\",\n\t\t\t\"integrity\": \"sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"entities\": \"^2.0.3\",\n\t\t\t\t\"xml2js\": \"^0.5.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/run-parallel\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"funding\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"github\",\n\t\t\t\t\t\"url\": \"https://github.com/sponsors/feross\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"patreon\",\n\t\t\t\t\t\"url\": \"https://www.patreon.com/feross\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"consulting\",\n\t\t\t\t\t\"url\": \"https://feross.org/support\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"dependencies\": {\n\t\t\t\t\"queue-microtask\": \"^1.2.2\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/safe-buffer\": {\n\t\t\t\"version\": \"5.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\"\n\t\t},\n\t\t\"node_modules/safe-json-stringify\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==\",\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"node_modules/safe-regex\": {\n\t\t\t\"version\": \"2.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"regexp-tree\": \"~0.1.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/safer-buffer\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==\"\n\t\t},\n\t\t\"node_modules/sax\": {\n\t\t\t\"version\": \"1.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/sax/-/sax-1.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/semaphore\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/semver\": {\n\t\t\t\"version\": \"7.6.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/semver/-/semver-7.6.2.tgz\",\n\t\t\t\"integrity\": \"sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==\",\n\t\t\t\"bin\": {\n\t\t\t\t\"semver\": \"bin/semver.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/send\": {\n\t\t\t\"version\": \"0.19.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/send/-/send-0.19.0.tgz\",\n\t\t\t\"integrity\": \"sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"debug\": \"2.6.9\",\n\t\t\t\t\"depd\": \"2.0.0\",\n\t\t\t\t\"destroy\": \"1.2.0\",\n\t\t\t\t\"encodeurl\": \"~1.0.2\",\n\t\t\t\t\"escape-html\": \"~1.0.3\",\n\t\t\t\t\"etag\": \"~1.8.1\",\n\t\t\t\t\"fresh\": \"0.5.2\",\n\t\t\t\t\"http-errors\": \"2.0.0\",\n\t\t\t\t\"mime\": \"1.6.0\",\n\t\t\t\t\"ms\": \"2.1.3\",\n\t\t\t\t\"on-finished\": \"2.4.1\",\n\t\t\t\t\"range-parser\": \"~1.2.1\",\n\t\t\t\t\"statuses\": \"2.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/send/node_modules/ms\": {\n\t\t\t\"version\": \"2.1.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n\t\t\t\"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\"\n\t\t},\n\t\t\"node_modules/serialize-javascript\": {\n\t\t\t\"version\": \"6.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"randombytes\": \"^2.1.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/serve-static\": {\n\t\t\t\"version\": \"1.16.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz\",\n\t\t\t\"integrity\": \"sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"encodeurl\": \"~2.0.0\",\n\t\t\t\t\"escape-html\": \"~1.0.3\",\n\t\t\t\t\"parseurl\": \"~1.3.3\",\n\t\t\t\t\"send\": \"0.19.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/serve-static/node_modules/encodeurl\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/service-runner\": {\n\t\t\t\"version\": \"3.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/service-runner/-/service-runner-3.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-eDUg9iP17zodtkPNhy+LOgjL/hh245s+D0Z5fgeB1ds39qHQzBds8tM4GByGbrU4u7zv0sO0RXlyq/j6Q1kZsA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"bluebird\": \"^3.7.2\",\n\t\t\t\t\"bunyan\": \"^1.8.12\",\n\t\t\t\t\"bunyan-syslog-udp\": \"^0.2.0\",\n\t\t\t\t\"dnscache\": \"^1.0.2\",\n\t\t\t\t\"gelf-stream\": \"^1.1.1\",\n\t\t\t\t\"hot-shots\": \"^6.8.7\",\n\t\t\t\t\"js-yaml\": \"^3.13.1\",\n\t\t\t\t\"limitation\": \"^0.2.3\",\n\t\t\t\t\"lodash.clonedeep\": \"^4.5.0\",\n\t\t\t\t\"prom-client\": \"^11.5.3\",\n\t\t\t\t\"semver\": \"^7.1.2\",\n\t\t\t\t\"tar\": \"^4.4.16\",\n\t\t\t\t\"yargs\": \"^16.2.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"service-runner\": \"service-runner.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"optionalDependencies\": {\n\t\t\t\t\"heapdump\": \"^0.3.15\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/service-runner/node_modules/argparse\": {\n\t\t\t\"version\": \"1.0.10\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz\",\n\t\t\t\"integrity\": \"sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"sprintf-js\": \"~1.0.2\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/service-runner/node_modules/js-yaml\": {\n\t\t\t\"version\": \"3.14.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz\",\n\t\t\t\"integrity\": \"sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"argparse\": \"^1.0.7\",\n\t\t\t\t\"esprima\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"js-yaml\": \"bin/js-yaml.js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/set-blocking\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/set-function-length\": {\n\t\t\t\"version\": \"1.2.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz\",\n\t\t\t\"integrity\": \"sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"define-data-property\": \"^1.1.4\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"function-bind\": \"^1.1.2\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.4\",\n\t\t\t\t\"gopd\": \"^1.0.1\",\n\t\t\t\t\"has-property-descriptors\": \"^1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/setprototypeof\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==\"\n\t\t},\n\t\t\"node_modules/shebang-command\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"shebang-regex\": \"^3.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/shebang-regex\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/side-channel\": {\n\t\t\t\"version\": \"1.0.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz\",\n\t\t\t\"integrity\": \"sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind\": \"^1.0.7\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.4\",\n\t\t\t\t\"object-inspect\": \"^1.13.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/signal-exit\": {\n\t\t\t\"version\": \"3.0.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz\",\n\t\t\t\"integrity\": \"sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/sinon\": {\n\t\t\t\"version\": \"17.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@sinonjs/commons\": \"^3.0.0\",\n\t\t\t\t\"@sinonjs/fake-timers\": \"^11.2.2\",\n\t\t\t\t\"@sinonjs/samsam\": \"^8.0.0\",\n\t\t\t\t\"diff\": \"^5.1.0\",\n\t\t\t\t\"nise\": \"^5.1.5\",\n\t\t\t\t\"supports-color\": \"^7.2.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"type\": \"opencollective\",\n\t\t\t\t\"url\": \"https://opencollective.com/sinon\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/slash\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/slash/-/slash-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/source-map\": {\n\t\t\t\"version\": \"0.6.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\n\t\t\t\"integrity\": \"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/spawn-sync\": {\n\t\t\t\"version\": \"1.0.15\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz\",\n\t\t\t\"integrity\": \"sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"hasInstallScript\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"concat-stream\": \"^1.4.7\",\n\t\t\t\t\"os-shim\": \"^0.1.2\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/spawn-wrap\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"foreground-child\": \"^2.0.0\",\n\t\t\t\t\"is-windows\": \"^1.0.2\",\n\t\t\t\t\"make-dir\": \"^3.0.0\",\n\t\t\t\t\"rimraf\": \"^3.0.0\",\n\t\t\t\t\"signal-exit\": \"^3.0.2\",\n\t\t\t\t\"which\": \"^2.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/spdx-correct\": {\n\t\t\t\"version\": \"3.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"spdx-expression-parse\": \"^3.0.0\",\n\t\t\t\t\"spdx-license-ids\": \"^3.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/spdx-correct/node_modules/spdx-expression-parse\": {\n\t\t\t\"version\": \"3.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"spdx-exceptions\": \"^2.1.0\",\n\t\t\t\t\"spdx-license-ids\": \"^3.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/spdx-exceptions\": {\n\t\t\t\"version\": \"2.5.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz\",\n\t\t\t\"integrity\": \"sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/spdx-expression-parse\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"spdx-exceptions\": \"^2.1.0\",\n\t\t\t\t\"spdx-license-ids\": \"^3.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/spdx-license-ids\": {\n\t\t\t\"version\": \"3.0.18\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz\",\n\t\t\t\"integrity\": \"sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/sprintf-js\": {\n\t\t\t\"version\": \"1.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==\"\n\t\t},\n\t\t\"node_modules/sshpk\": {\n\t\t\t\"version\": \"1.18.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz\",\n\t\t\t\"integrity\": \"sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"asn1\": \"~0.2.3\",\n\t\t\t\t\"assert-plus\": \"^1.0.0\",\n\t\t\t\t\"bcrypt-pbkdf\": \"^1.0.0\",\n\t\t\t\t\"dashdash\": \"^1.12.0\",\n\t\t\t\t\"ecc-jsbn\": \"~0.1.1\",\n\t\t\t\t\"getpass\": \"^0.1.1\",\n\t\t\t\t\"jsbn\": \"~0.1.0\",\n\t\t\t\t\"safer-buffer\": \"^2.0.2\",\n\t\t\t\t\"tweetnacl\": \"~0.14.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"sshpk-conv\": \"bin/sshpk-conv\",\n\t\t\t\t\"sshpk-sign\": \"bin/sshpk-sign\",\n\t\t\t\t\"sshpk-verify\": \"bin/sshpk-verify\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/statuses\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/string_decoder\": {\n\t\t\t\"version\": \"1.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"safe-buffer\": \"~5.1.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/string-width\": {\n\t\t\t\"version\": \"4.2.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n\t\t\t\"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"emoji-regex\": \"^8.0.0\",\n\t\t\t\t\"is-fullwidth-code-point\": \"^3.0.0\",\n\t\t\t\t\"strip-ansi\": \"^6.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/strip-ansi\": {\n\t\t\t\"version\": \"6.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ansi-regex\": \"^5.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/strip-bom\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/strip-indent\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"min-indent\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/strip-json-comments\": {\n\t\t\t\"version\": \"3.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/striptags\": {\n\t\t\t\"version\": \"3.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/striptags/-/striptags-3.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==\"\n\t\t},\n\t\t\"node_modules/supports-color\": {\n\t\t\t\"version\": \"7.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"has-flag\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/supports-preserve-symlinks-flag\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/swagger-router\": {\n\t\t\t\"version\": \"0.7.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/swagger-router/-/swagger-router-0.7.4.tgz\",\n\t\t\t\"integrity\": \"sha512-HdKJ4DenOXcaChWKST7oFHvd+kclike9rsFfPt3W9JWVvznofcOWGSivyWJECky3tOlw52jqvCKSQrz1l+1D9w==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"bluebird\": \"^3.5.2\",\n\t\t\t\t\"js-yaml\": \"^3.12.0\",\n\t\t\t\t\"tassembly\": \"^0.2.3\",\n\t\t\t\t\"template-expression-compiler\": \"^0.1.10\",\n\t\t\t\t\"uuid\": \"^3.3.2\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/swagger-router/node_modules/argparse\": {\n\t\t\t\"version\": \"1.0.10\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz\",\n\t\t\t\"integrity\": \"sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"sprintf-js\": \"~1.0.2\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/swagger-router/node_modules/js-yaml\": {\n\t\t\t\"version\": \"3.14.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz\",\n\t\t\t\"integrity\": \"sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"argparse\": \"^1.0.7\",\n\t\t\t\t\"esprima\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"js-yaml\": \"bin/js-yaml.js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/swagger-router/node_modules/uuid\": {\n\t\t\t\"version\": \"3.4.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz\",\n\t\t\t\"integrity\": \"sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==\",\n\t\t\t\"deprecated\": \"Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.\",\n\t\t\t\"bin\": {\n\t\t\t\t\"uuid\": \"bin/uuid\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/swagger-ui-dist\": {\n\t\t\t\"version\": \"5.16.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.16.2.tgz\",\n\t\t\t\"integrity\": \"sha512-zcRXKnDi0605AOmkv5sOPvr1m4AE4gVFdTGhapPs7fylEwv4tv5k7vbtlPPcKJQThKafASJhErWX6RZK2Wbztg==\"\n\t\t},\n\t\t\"node_modules/tapable\": {\n\t\t\t\"version\": \"2.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/tar\": {\n\t\t\t\"version\": \"4.4.19\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/tar/-/tar-4.4.19.tgz\",\n\t\t\t\"integrity\": \"sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"chownr\": \"^1.1.4\",\n\t\t\t\t\"fs-minipass\": \"^1.2.7\",\n\t\t\t\t\"minipass\": \"^2.9.0\",\n\t\t\t\t\"minizlib\": \"^1.3.3\",\n\t\t\t\t\"mkdirp\": \"^0.5.5\",\n\t\t\t\t\"safe-buffer\": \"^5.2.1\",\n\t\t\t\t\"yallist\": \"^3.1.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4.5\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/tar/node_modules/safe-buffer\": {\n\t\t\t\"version\": \"5.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==\",\n\t\t\t\"funding\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"github\",\n\t\t\t\t\t\"url\": \"https://github.com/sponsors/feross\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"patreon\",\n\t\t\t\t\t\"url\": \"https://www.patreon.com/feross\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"consulting\",\n\t\t\t\t\t\"url\": \"https://feross.org/support\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"node_modules/tassembly\": {\n\t\t\t\"version\": \"0.2.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/tassembly/-/tassembly-0.2.3.tgz\",\n\t\t\t\"integrity\": \"sha512-rpYD3bbgITu9vxxhRgMDANK3wMUw4WcQ9PJDLJnDJGs13rbHHnfuPB0sVmkTOn0c01BIUe7xZdDcF2IzlgMEHw==\"\n\t\t},\n\t\t\"node_modules/tdigest\": {\n\t\t\t\"version\": \"0.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"bintrees\": \"1.0.2\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/template-expression-compiler\": {\n\t\t\t\"version\": \"0.1.10\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/template-expression-compiler/-/template-expression-compiler-0.1.10.tgz\",\n\t\t\t\"integrity\": \"sha512-AuGyxkl8I+GhmYqt4JzsxZWIMgB1TnuCQCkRdOhHlZ612peP+yoXcoYVdBJWP/NYAFwmUUliBjuVwgqog0y5KQ==\"\n\t\t},\n\t\t\"node_modules/test-exclude\": {\n\t\t\t\"version\": \"6.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@istanbuljs/schema\": \"^0.1.2\",\n\t\t\t\t\"glob\": \"^7.1.4\",\n\t\t\t\t\"minimatch\": \"^3.0.4\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/test-exclude/node_modules/glob\": {\n\t\t\t\"version\": \"7.2.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.2.3.tgz\",\n\t\t\t\"integrity\": \"sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"fs.realpath\": \"^1.0.0\",\n\t\t\t\t\"inflight\": \"^1.0.4\",\n\t\t\t\t\"inherits\": \"2\",\n\t\t\t\t\"minimatch\": \"^3.1.1\",\n\t\t\t\t\"once\": \"^1.3.0\",\n\t\t\t\t\"path-is-absolute\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/isaacs\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/text-table\": {\n\t\t\t\"version\": \"0.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/to-regex-range\": {\n\t\t\t\"version\": \"5.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-number\": \"^7.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/toidentifier\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/tough-cookie\": {\n\t\t\t\"version\": \"2.5.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz\",\n\t\t\t\"integrity\": \"sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"psl\": \"^1.1.28\",\n\t\t\t\t\"punycode\": \"^2.1.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ts-api-utils\": {\n\t\t\t\"version\": \"1.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=16\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"typescript\": \">=4.2.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/tunnel-agent\": {\n\t\t\t\"version\": \"0.6.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz\",\n\t\t\t\"integrity\": \"sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"safe-buffer\": \"^5.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/tweetnacl\": {\n\t\t\t\"version\": \"0.14.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz\",\n\t\t\t\"integrity\": \"sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==\"\n\t\t},\n\t\t\"node_modules/type-check\": {\n\t\t\t\"version\": \"0.4.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz\",\n\t\t\t\"integrity\": \"sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"prelude-ls\": \"^1.2.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/type-detect\": {\n\t\t\t\"version\": \"4.0.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz\",\n\t\t\t\"integrity\": \"sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/type-fest\": {\n\t\t\t\"version\": \"0.20.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz\",\n\t\t\t\"integrity\": \"sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/type-is\": {\n\t\t\t\"version\": \"1.6.18\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz\",\n\t\t\t\"integrity\": \"sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"media-typer\": \"0.3.0\",\n\t\t\t\t\"mime-types\": \"~2.1.24\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/typedarray\": {\n\t\t\t\"version\": \"0.0.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz\",\n\t\t\t\"integrity\": \"sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/typedarray-to-buffer\": {\n\t\t\t\"version\": \"3.1.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz\",\n\t\t\t\"integrity\": \"sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-typedarray\": \"^1.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/typescript\": {\n\t\t\t\"version\": \"5.4.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz\",\n\t\t\t\"integrity\": \"sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"peer\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"tsc\": \"bin/tsc\",\n\t\t\t\t\"tsserver\": \"bin/tsserver\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=14.17\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/underscore\": {\n\t\t\t\"version\": \"1.13.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz\",\n\t\t\t\"integrity\": \"sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/unix-dgram\": {\n\t\t\t\"version\": \"2.0.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/unix-dgram/-/unix-dgram-2.0.6.tgz\",\n\t\t\t\"integrity\": \"sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg==\",\n\t\t\t\"hasInstallScript\": true,\n\t\t\t\"optional\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"bindings\": \"^1.5.0\",\n\t\t\t\t\"nan\": \"^2.16.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.48\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/unpipe\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/upath\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/upath/-/upath-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\",\n\t\t\t\t\"yarn\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/update-browserslist-db\": {\n\t\t\t\"version\": \"1.0.13\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz\",\n\t\t\t\"integrity\": \"sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"funding\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"opencollective\",\n\t\t\t\t\t\"url\": \"https://opencollective.com/browserslist\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"tidelift\",\n\t\t\t\t\t\"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"github\",\n\t\t\t\t\t\"url\": \"https://github.com/sponsors/ai\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"dependencies\": {\n\t\t\t\t\"escalade\": \"^3.1.1\",\n\t\t\t\t\"picocolors\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"update-browserslist-db\": \"cli.js\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"browserslist\": \">= 4.21.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/uri-js\": {\n\t\t\t\"version\": \"4.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"punycode\": \"^2.1.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/util\": {\n\t\t\t\"version\": \"0.10.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/util/-/util-0.10.4.tgz\",\n\t\t\t\"integrity\": \"sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"inherits\": \"2.0.3\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/util-deprecate\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==\"\n\t\t},\n\t\t\"node_modules/util/node_modules/inherits\": {\n\t\t\t\"version\": \"2.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/utils-merge\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/uuid\": {\n\t\t\t\"version\": \"9.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==\",\n\t\t\t\"funding\": [\n\t\t\t\t\"https://github.com/sponsors/broofa\",\n\t\t\t\t\"https://github.com/sponsors/ctavan\"\n\t\t\t],\n\t\t\t\"bin\": {\n\t\t\t\t\"uuid\": \"dist/bin/uuid\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/validate-npm-package-license\": {\n\t\t\t\"version\": \"3.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"spdx-correct\": \"^3.0.0\",\n\t\t\t\t\"spdx-expression-parse\": \"^3.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/validate-npm-package-license/node_modules/spdx-expression-parse\": {\n\t\t\t\"version\": \"3.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"spdx-exceptions\": \"^2.1.0\",\n\t\t\t\t\"spdx-license-ids\": \"^3.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/vary\": {\n\t\t\t\"version\": \"1.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/vary/-/vary-1.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/verror\": {\n\t\t\t\"version\": \"1.10.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/verror/-/verror-1.10.0.tgz\",\n\t\t\t\"integrity\": \"sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==\",\n\t\t\t\"engines\": [\n\t\t\t\t\"node >=0.6.0\"\n\t\t\t],\n\t\t\t\"dependencies\": {\n\t\t\t\t\"assert-plus\": \"^1.0.0\",\n\t\t\t\t\"core-util-is\": \"1.0.2\",\n\t\t\t\t\"extsprintf\": \"^1.2.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/verror/node_modules/core-util-is\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==\"\n\t\t},\n\t\t\"node_modules/vue-eslint-parser\": {\n\t\t\t\"version\": \"9.4.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz\",\n\t\t\t\"integrity\": \"sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"debug\": \"^4.3.4\",\n\t\t\t\t\"eslint-scope\": \"^7.1.1\",\n\t\t\t\t\"eslint-visitor-keys\": \"^3.3.0\",\n\t\t\t\t\"espree\": \"^9.3.1\",\n\t\t\t\t\"esquery\": \"^1.4.0\",\n\t\t\t\t\"lodash\": \"^4.17.21\",\n\t\t\t\t\"semver\": \"^7.3.6\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^14.17.0 || >=16.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/mysticatea\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"eslint\": \">=6.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/vue-eslint-parser/node_modules/debug\": {\n\t\t\t\"version\": \"4.3.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.5.tgz\",\n\t\t\t\"integrity\": \"sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ms\": \"2.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"supports-color\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/vue-eslint-parser/node_modules/ms\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/when\": {\n\t\t\t\"version\": \"3.7.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/when/-/when-3.7.8.tgz\",\n\t\t\t\"integrity\": \"sha512-5cZ7mecD3eYcMiCH4wtRPA5iFJZ50BJYDfckI5RRpQiktMiYTcn0ccLTZOvcbBume+1304fQztxeNzNS9Gvrnw==\"\n\t\t},\n\t\t\"node_modules/which\": {\n\t\t\t\"version\": \"2.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/which/-/which-2.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"isexe\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"node-which\": \"bin/node-which\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/which-module\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/wikimedia-kad-fork\": {\n\t\t\t\"version\": \"1.3.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/wikimedia-kad-fork/-/wikimedia-kad-fork-1.3.6.tgz\",\n\t\t\t\"integrity\": \"sha512-m+IxFN4JatoQPRo0N46xMh7tR6FSznb/ithIchAy7Wg9mrkc4/bE/3BhlJS410quFJFrJp8lJJp93g4uTbj4lA==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"async\": \"^0.9.0\",\n\t\t\t\t\"clarinet\": \"^0.11.0\",\n\t\t\t\t\"colors\": \"^1.0.3\",\n\t\t\t\t\"hat\": \"0.0.3\",\n\t\t\t\t\"kad-fs\": \"0.0.4\",\n\t\t\t\t\"kad-localstorage\": \"0.0.7\",\n\t\t\t\t\"kad-memstore\": \"0.0.1\",\n\t\t\t\t\"lodash\": \"^4.17.11\",\n\t\t\t\t\"ms\": \"^0.7.0\",\n\t\t\t\t\"msgpack5\": \"^3.3.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/wikimedia-kad-fork/node_modules/ms\": {\n\t\t\t\"version\": \"0.7.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ms/-/ms-0.7.3.tgz\",\n\t\t\t\"integrity\": \"sha512-lrKNzMWqQZgwJahtrtrM+9NgOoDUveDrVmm5aGXrf3BdtL0mq7X6IVzoZaw+TfNti29eHd1/8GI+h45K5cQ6/w==\"\n\t\t},\n\t\t\"node_modules/workerpool\": {\n\t\t\t\"version\": \"6.5.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz\",\n\t\t\t\"integrity\": \"sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/wrap-ansi\": {\n\t\t\t\"version\": \"7.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ansi-styles\": \"^4.0.0\",\n\t\t\t\t\"string-width\": \"^4.1.0\",\n\t\t\t\t\"strip-ansi\": \"^6.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/wrappy\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==\",\n\t\t\t\"devOptional\": true\n\t\t},\n\t\t\"node_modules/write-file-atomic\": {\n\t\t\t\"version\": \"3.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"imurmurhash\": \"^0.1.4\",\n\t\t\t\t\"is-typedarray\": \"^1.0.0\",\n\t\t\t\t\"signal-exit\": \"^3.0.2\",\n\t\t\t\t\"typedarray-to-buffer\": \"^3.1.5\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/xml-name-validator\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=12\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/xml2js\": {\n\t\t\t\"version\": \"0.5.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz\",\n\t\t\t\"integrity\": \"sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"sax\": \">=0.6.0\",\n\t\t\t\t\"xmlbuilder\": \"~11.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/xmlbuilder\": {\n\t\t\t\"version\": \"11.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/y18n\": {\n\t\t\t\"version\": \"5.0.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n\t\t\t\"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/yallist\": {\n\t\t\t\"version\": \"3.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==\"\n\t\t},\n\t\t\"node_modules/yaml\": {\n\t\t\t\"version\": \"2.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"yaml\": \"bin.mjs\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 14\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/yaml-eslint-parser\": {\n\t\t\t\"version\": \"1.2.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz\",\n\t\t\t\"integrity\": \"sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"eslint-visitor-keys\": \"^3.0.0\",\n\t\t\t\t\"lodash\": \"^4.17.21\",\n\t\t\t\t\"yaml\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^14.17.0 || >=16.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ota-meshi\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/yargs\": {\n\t\t\t\"version\": \"16.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"cliui\": \"^7.0.2\",\n\t\t\t\t\"escalade\": \"^3.1.1\",\n\t\t\t\t\"get-caller-file\": \"^2.0.5\",\n\t\t\t\t\"require-directory\": \"^2.1.1\",\n\t\t\t\t\"string-width\": \"^4.2.0\",\n\t\t\t\t\"y18n\": \"^5.0.5\",\n\t\t\t\t\"yargs-parser\": \"^20.2.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/yargs-parser\": {\n\t\t\t\"version\": \"20.2.9\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz\",\n\t\t\t\"integrity\": \"sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/yargs-unparser\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"camelcase\": \"^6.0.0\",\n\t\t\t\t\"decamelize\": \"^4.0.0\",\n\t\t\t\t\"flat\": \"^5.0.2\",\n\t\t\t\t\"is-plain-obj\": \"^2.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/yargs-unparser/node_modules/camelcase\": {\n\t\t\t\"version\": \"6.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/yargs-unparser/node_modules/decamelize\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/yocto-queue\": {\n\t\t\t\"version\": \"0.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t}\n\t}\n}\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package.json","messages":[{"ruleId":"strict","severity":1,"message":"Use the global form of 'use strict'.","line":1,"column":1,"nodeType":"Program","messageId":"global","endLine":82,"endColumn":3}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"{\n\t\"name\": \"@wikimedia/wikifeeds\",\n\t\"version\": \"1.0.0\",\n\t\"description\": \"A node webservice supporting featured wiki content feeds\",\n\t\"main\": \"./app.js\",\n\t\"engines\": {\n\t\t\"node\": \">=16.0.0\"\n\t},\n\t\"scripts\": {\n\t\t\"start\": \"service-runner\",\n\t\t\"test\": \"npm run lint && PREQ_CONNECT_TIMEOUT=15 mocha --recursive\",\n\t\t\"test:unit\": \"mocha test/lib\",\n\t\t\"test:diff\": \"mocha --exit test/diff\",\n\t\t\"test:spec\": \"mocha test/features/app/spec.js\",\n\t\t\"lint\": \"eslint .\",\n\t\t\"lint:fix\": \"eslint --fix .\",\n\t\t\"docker-start\": \"service-runner docker-start\",\n\t\t\"docker-test\": \"service-runner docker-test\",\n\t\t\"test-build\": \"service-runner docker-test && service-runner build --deploy-repo --force\",\n\t\t\"coverage\": \"nyc mocha --recursive\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/services/wikifeeds\"\n\t},\n\t\"keywords\": [\n\t\t\"REST\",\n\t\t\"API\",\n\t\t\"node service\",\n\t\t\"mobile apps\",\n\t\t\"MediaWiki\",\n\t\t\"Wikipedia\"\n\t],\n\t\"author\": \"Wikimedia Product Infrastructure team, maintained by Content Transform team\",\n\t\"contributors\": [],\n\t\"license\": \"Apache-2.0\",\n\t\"bugs\": {\n\t\t\"url\": \"https://phabricator.wikimedia.org/tag/wikifeeds\"\n\t},\n\t\"homepage\": \"https://phabricator.wikimedia.org/tag/wikifeeds\",\n\t\"dependencies\": {\n\t\t\"axios\": \"^1.6.7\",\n\t\t\"axios-retry\": \"^4.0.0\",\n\t\t\"bluebird\": \"^3.7.2\",\n\t\t\"body-parser\": \"^1.20.2\",\n\t\t\"bunyan\": \"^1.8.15\",\n\t\t\"cassandra-uuid\": \"^0.1.0\",\n\t\t\"compression\": \"^1.7.4\",\n\t\t\"domino\": \"^2.1.6\",\n\t\t\"express\": \"^4.18.2\",\n\t\t\"http-shutdown\": \"^1.2.2\",\n\t\t\"js-yaml\": \"^4.1.0\",\n\t\t\"lodash\": \"^4.17.21\",\n\t\t\"mediawiki-title\": \"^0.7.5\",\n\t\t\"preq\": \"^0.5.14\",\n\t\t\"service-runner\": \"^3.1.0\",\n\t\t\"striptags\": \"^3.2.0\",\n\t\t\"swagger-router\": \"^0.7.4\",\n\t\t\"swagger-ui-dist\": \"^5.11.7\",\n\t\t\"uuid\": \"^9.0.1\"\n\t},\n\t\"devDependencies\": {\n\t\t\"ajv\": \"^8.12.0\",\n\t\t\"ajv-formats\": \"^2.1.1\",\n\t\t\"csv-parse\": \"^5.5.3\",\n\t\t\"eslint\": \"8.57.0\",\n\t\t\"eslint-config-wikimedia\": \"0.29.1\",\n\t\t\"eslint-plugin-n\": \"^16.6.2\",\n\t\t\"extend\": \"^3.0.2\",\n\t\t\"mocha\": \"^10.3.0\",\n\t\t\"mocha-lcov-reporter\": \"^1.3.0\",\n\t\t\"mocha.parallel\": \"^0.15.6\",\n\t\t\"nock\": \"^13.5.3\",\n\t\t\"nyc\": \"^15.1.0\",\n\t\t\"path\": \"^0.12.7\",\n\t\t\"pre-commit\": \"^1.2.2\",\n\t\t\"rss-parser\": \"^3.13.0\",\n\t\t\"sinon\": \"^17.0.1\",\n\t\t\"underscore\": \"^1.13.6\"\n\t}\n}\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/routes/aggregated.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/routes/announcements.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/routes/availability.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/routes/featured-image.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/routes/featured.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/routes/info.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/routes/most-read.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/routes/news.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/routes/on-this-day.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/routes/random.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/routes/root.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/scripts/check-featured-feed.js","messages":[{"ruleId":"no-shadow","severity":1,"message":"'feature' is already declared in the upper scope on line 212 column 7.","line":49,"column":35,"nodeType":"Identifier","messageId":"noShadow","endLine":49,"endColumn":42},{"ruleId":"no-shadow","severity":1,"message":"'feature' is already declared in the upper scope on line 212 column 7.","line":82,"column":44,"nodeType":"Identifier","messageId":"noShadow","endLine":82,"endColumn":51},{"ruleId":"no-shadow","severity":1,"message":"'feature' is already declared in the upper scope on line 212 column 7.","line":107,"column":34,"nodeType":"Identifier","messageId":"noShadow","endLine":107,"endColumn":41},{"ruleId":"no-shadow","severity":1,"message":"'feature' is already declared in the upper scope on line 212 column 7.","line":150,"column":30,"nodeType":"Identifier","messageId":"noShadow","endLine":150,"endColumn":37},{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":217,"column":5,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":217,"endColumn":21}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":5,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst BBPromise = require('bluebird');\nconst domino = require('domino');\nconst preq = require('preq');\nconst parseRssUrl = BBPromise.promisify(require('rss-parser').parseURL);\nconst underscore = require('underscore');\nconst path = require('path');\n\n//\n// LANGUAGES SECTION start\n//\nconst wikiquoteLanguages = require(path.join(__dirname, '../private/wikiquotes.json'));\nconst wiktionaryLanguages = require(path.join(__dirname, '../private/wiktionaries.json'));\nconst wikipediaLanguagesRawList = require(path.join(__dirname, '../private/languages_list.json'));\n\nconst prepareWikipediaLanguageCodes = () => {\n delete wikipediaLanguagesRawList['Simplified Chinese']; // skip lang variants\n delete wikipediaLanguagesRawList['Traditional Chinese'];\n return underscore.values(wikipediaLanguagesRawList).sort();\n};\nconst wikipediaLanguages = prepareWikipediaLanguageCodes();\n//\n// LANGUAGES SECTION end\n//\n\nconst ModeEnum = Object.freeze({ wikitext: 0, expandTemplates: 1, rssFeed: 2 });\nconst mode = ModeEnum.rssFeed;\n\nconst candidates = [];\nconst errNotConfigured = [];\nconst errElse = [];\nconst errHttp = [];\n\nconst cleanUpHtml = (html) => html.replace(/<!--[\\s\\S]*?-->/mg, '').replace(/\\n/mg, '');\n\nconst lookForBoldAnchor = (document, projectLang, html) => {\n const boldAnchor = document.querySelector('b > a, a > b');\n if (boldAnchor) {\n const tfaTitle = boldAnchor.getAttribute('title');\n console.log(`${ projectLang }: ${ tfaTitle }`);\n candidates.push(projectLang);\n } else {\n console.log(`${ projectLang }: ERROR: bold anchor not found: else: ${ html }`);\n errElse.push(projectLang);\n }\n};\n\nconst getWikitext = (projectLang, feature) => {\n const baseUri = `https://${ projectLang }.${ feature.projectFamily }.org`;\n const queryParams1 = 'action=query&format=json&prop=revisions&rvprop=content';\n const queryParams2 = `&rvslots=main&titles=MediaWiki%3A${ feature.title }`;\n const uri = `${ baseUri }/w/api.php?${ queryParams1 }${ queryParams2 }`;\n\n return preq.get({ uri })\n .then((rsp) => {\n const pages = rsp.body.query && rsp.body.query.pages;\n if (!pages) {\n errNotConfigured.push(projectLang);\n return;\n }\n const firstPageKey = Object.keys(pages)[0];\n if (Object.prototype.hasOwnProperty.call(pages[firstPageKey], 'missing')) {\n errNotConfigured.push(projectLang);\n return;\n }\n\n const wikiText = pages[firstPageKey].revisions[0].slots.main['*'];\n if (wikiText) {\n console.log(`${ projectLang }: ${ wikiText }`);\n candidates.push(projectLang);\n } else {\n errNotConfigured.push(projectLang);\n }\n })\n .catch((err) => {\n console.log(`${ projectLang } ERROR: ${ err }`);\n errHttp.push(projectLang);\n });\n};\n\nconst doubleExpandTemplate = (projectLang, feature) => {\n const baseUri = `https://${ projectLang }.${ feature.projectFamily }.org`;\n const wikiText = encodeURIComponent(\n `{{#ifexist:{{int:${ feature.title }}}|{{ {{int:${ feature.title }}} }} }}`);\n const queryParams = `action=parse&format=json&prop=text&contentmodel=wikitext&text=${ wikiText }`;\n const uri = `${ baseUri }/w/api.php?${ queryParams }`;\n\n return preq.get({ uri })\n .then((rsp) => {\n const html = cleanUpHtml(rsp.body.parse.text['*']);\n if (html === '') {\n errNotConfigured.push(projectLang);\n } else if (feature.shouldLookForBoldAnchor) {\n lookForBoldAnchor(domino.createDocument(html), projectLang, html);\n } else {\n console.log(`${ projectLang }: ${ html }`);\n candidates.push(projectLang);\n }\n })\n .catch((err) => {\n console.log(`${ projectLang } ERROR: ${ err }`);\n errHttp.push(projectLang);\n });\n};\n\nconst getRssFeed = (projectLang, feature) => {\n const baseUri = `https://${ projectLang }.${ feature.projectFamily }.org`;\n const queryParams = `action=featuredfeed&feed=${ feature.feedName }&feedformat=rss`;\n const uri = `${ baseUri }/w/api.php?${ queryParams }`;\n const contentPool = [];\n const indices = [];\n\n return parseRssUrl(uri)\n .then((response) => {\n let languageCode;\n // console.log(`${projectLang}: ${response.feed.title}`);\n response.feed.entries.forEach((entry) => {\n const index = underscore.indexOf(contentPool, entry.content);\n // console.log(`${entry.title}: ${index}: ${entry.link}`);\n if (index >= 0) {\n indices.push(index);\n } else {\n contentPool.push(entry.content);\n indices.push(contentPool.length - 1);\n }\n languageCode = entry.link.slice(entry.link.lastIndexOf('/') + 1);\n });\n // in a few instances the languageCode differs from the projectLang (Example: no/nb)\n console.log(`${ projectLang }/${ languageCode }: ${ indices }: ${ uri }`);\n candidates.push(projectLang);\n })\n .catch((err) => {\n if (err.message === 'RSS 1.0 parsing not yet implemented.') {\n errNotConfigured.push(projectLang);\n } else {\n console.log(`${ projectLang }: ERROR: ${ uri }: ${ err }`);\n errHttp.push(projectLang);\n }\n });\n};\n\nconst printResultSummary = () => {\n console.log(`candidates: ${ candidates.length }: ${ JSON.stringify(candidates.sort()) }`);\n console.log(`errNotConfigured: ${ errNotConfigured.length }: ${ errNotConfigured.sort() }`);\n console.log(`errElse: ${ errElse.length }: ${ errElse.sort() }`);\n console.log(`retryQueue: ${ errHttp.length }: ${ errHttp.sort() }`);\n};\n\nconst processAllLanguages = (feature) => {\n BBPromise.map(feature.projectLangs, (projectLang) => {\n if (mode === ModeEnum.expandTemplates) {\n return doubleExpandTemplate(projectLang, feature);\n } else if (mode === ModeEnum.wikitext) {\n return getWikitext(projectLang, feature);\n } else {\n return getRssFeed(projectLang, feature);\n }\n }, { concurrency: 1 })\n .then(() => {\n printResultSummary();\n });\n};\n\n// MAIN\nconst featureMap = {\n tfa: {\n projectFamily: 'wikipedia',\n projectLangs: wikipediaLanguages,\n feedName: 'featured',\n title: 'Ffeed-featured-page',\n shouldLookForBoldAnchor: true\n },\n dyk: {\n projectFamily: 'wikipedia',\n projectLangs: wikipediaLanguages,\n feedName: 'dyk',\n title: 'Ffeed-dyk-page'\n },\n potd: {\n projectFamily: 'wikipedia',\n projectLangs: wikipediaLanguages,\n feedName: 'potd',\n title: 'Ffeed-potd-page'\n },\n motd: {\n projectFamily: 'wikipedia',\n projectLangs: wikipediaLanguages,\n feedName: 'motd',\n title: 'Ffeed-motd-page'\n },\n qotd: {\n projectFamily: 'wikiquote',\n projectLangs: wikiquoteLanguages,\n feedName: 'qotd',\n title: 'Ffeed-qotd-page'\n },\n wotd: {\n projectFamily: 'wiktionary',\n projectLangs: wiktionaryLanguages,\n feedName: 'wotd',\n title: 'Ffeed-wotd-page'\n },\n fwotd: {\n projectFamily: 'wiktionary',\n projectLangs: wiktionaryLanguages,\n feedName: 'fwotd',\n title: 'Ffeed-fwotd-page'\n }\n};\n\nconst feature = featureMap[process.argv[2]];\nif (feature) {\n processAllLanguages(feature);\n} else {\n console.error(`Error: need to specify one of ${ Object.keys(featureMap) }!`);\n process.exit(-1);\n}\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/server.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/spec.yaml","messages":[{"ruleId":"max-len","severity":1,"message":"This line has a length of 154. Maximum allowed is 100.","line":228,"column":1,"nodeType":"Program","messageId":"max","endLine":228,"endColumn":155},{"ruleId":"max-len","severity":1,"message":"This line has a length of 141. Maximum allowed is 100.","line":232,"column":1,"nodeType":"Program","messageId":"max","endLine":232,"endColumn":142},{"ruleId":"max-len","severity":1,"message":"This line has a length of 117. Maximum allowed is 100.","line":866,"column":1,"nodeType":"Program","messageId":"max","endLine":866,"endColumn":118},{"ruleId":"max-len","severity":1,"message":"This line has a length of 116. Maximum allowed is 100.","line":871,"column":1,"nodeType":"Program","messageId":"max","endLine":871,"endColumn":117},{"ruleId":"max-len","severity":1,"message":"This line has a length of 116. Maximum allowed is 100.","line":876,"column":1,"nodeType":"Program","messageId":"max","endLine":876,"endColumn":117},{"ruleId":"max-len","severity":1,"message":"This line has a length of 116. Maximum allowed is 100.","line":881,"column":1,"nodeType":"Program","messageId":"max","endLine":881,"endColumn":117},{"ruleId":"max-len","severity":1,"message":"This line has a length of 116. Maximum allowed is 100.","line":886,"column":1,"nodeType":"Program","messageId":"max","endLine":886,"endColumn":117},{"ruleId":"max-len","severity":1,"message":"This line has a length of 108. Maximum allowed is 100.","line":938,"column":1,"nodeType":"Program","messageId":"max","endLine":938,"endColumn":109},{"ruleId":"max-len","severity":1,"message":"This line has a length of 126. Maximum allowed is 100.","line":955,"column":1,"nodeType":"Program","messageId":"max","endLine":955,"endColumn":127},{"ruleId":"max-len","severity":1,"message":"This line has a length of 107. Maximum allowed is 100.","line":956,"column":1,"nodeType":"Program","messageId":"max","endLine":956,"endColumn":108},{"ruleId":"max-len","severity":1,"message":"This line has a length of 132. Maximum allowed is 100.","line":962,"column":1,"nodeType":"Program","messageId":"max","endLine":962,"endColumn":133},{"ruleId":"max-len","severity":1,"message":"This line has a length of 127. Maximum allowed is 100.","line":969,"column":1,"nodeType":"Program","messageId":"max","endLine":969,"endColumn":128},{"ruleId":"max-len","severity":1,"message":"This line has a length of 108. Maximum allowed is 100.","line":971,"column":1,"nodeType":"Program","messageId":"max","endLine":971,"endColumn":109},{"ruleId":"max-len","severity":1,"message":"This line has a length of 113. Maximum allowed is 100.","line":972,"column":1,"nodeType":"Program","messageId":"max","endLine":972,"endColumn":114},{"ruleId":"max-len","severity":1,"message":"This line has a length of 121. Maximum allowed is 100.","line":973,"column":1,"nodeType":"Program","messageId":"max","endLine":973,"endColumn":122},{"ruleId":"max-len","severity":1,"message":"This line has a length of 121. Maximum allowed is 100.","line":977,"column":1,"nodeType":"Program","messageId":"max","endLine":977,"endColumn":122},{"ruleId":"max-len","severity":1,"message":"This line has a length of 113. Maximum allowed is 100.","line":981,"column":1,"nodeType":"Program","messageId":"max","endLine":981,"endColumn":114},{"ruleId":"max-len","severity":1,"message":"This line has a length of 111. Maximum allowed is 100.","line":985,"column":1,"nodeType":"Program","messageId":"max","endLine":985,"endColumn":112},{"ruleId":"max-len","severity":1,"message":"This line has a length of 124. Maximum allowed is 100.","line":991,"column":1,"nodeType":"Program","messageId":"max","endLine":991,"endColumn":125},{"ruleId":"max-len","severity":1,"message":"This line has a length of 281. Maximum allowed is 100.","line":995,"column":1,"nodeType":"Program","messageId":"max","endLine":995,"endColumn":282},{"ruleId":"max-len","severity":1,"message":"This line has a length of 144. Maximum allowed is 100.","line":1082,"column":1,"nodeType":"Program","messageId":"max","endLine":1082,"endColumn":145}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":21,"fixableErrorCount":0,"fixableWarningCount":0,"source":"swagger: \"2.0\"\n\ninfo:\n version: 1.0.0\n title: wikifeeds\n description: A node webservice supporting featured wiki content feeds\n termsOfService: https://wikimediafoundation.org/wiki/Terms_of_Use\n contact:\n name: Wikimedia Product Infrastructure Team\n url: https://www.mediawiki.org/wiki/Wikimedia_Product/Wikimedia_Product_Infrastructure_team\n license:\n name: Apache2\n url: http://www.apache.org/licenses/LICENSE-2.0\n\nx-default-params:\n domain: en.wikipedia.org\n\nparameters:\n domain:\n in: path\n name: domain\n required: true\n type: string\n description: |\n Project domain for the requested data.\n title:\n in: path\n name: title\n required: true\n type: string\n description: |\n Page title. Use underscores instead of spaces. Example: `Main_Page`\n revision:\n in: path\n name: revision\n required: false\n type: integer\n description: Revision ID\n tid:\n in: path\n name: tid\n required: false\n type: integer\n description: Time UUID of the rendering (used for rerenders when non-revision content changes)\n year:\n in: path\n name: year\n required: true\n type: integer\n description: Four digit year (2016 and later)\n minimum: 2016\n maximum: 2999\n month:\n in: path\n name: month\n required: true\n type: integer\n description: Two digit month, 0-padded if necessary (01 - 12)\n minimum: 01\n maximum: 31\n day:\n in: path\n name: day\n required: true\n type: integer\n description: Two digit day of the month, 0-padded if necessary (01 - 31)\n minimum: 01\n maximum: 31\n\npaths:\n # from routes/root.js\n /robots.txt:\n get:\n tags:\n - Root\n description: Gets robots.txt\n responses:\n 200:\n description: Success\n default:\n description: Error\n schema:\n $ref: \"#/definitions/problem\"\n x-monitor: false\n\n /:\n get:\n tags:\n - Root\n description: The root service end-point\n produces:\n - application/json\n - application/problem+json\n responses:\n 200:\n description: Success\n default:\n description: Error\n schema:\n $ref: \"#/definitions/problem\"\n x-amples:\n - title: spec from root\n request:\n query:\n spec: true\n response:\n status: 200\n\n # from routes/info.js\n /_info:\n get:\n tags:\n - Root\n description: Gets information about the service.\n produces:\n - application/json\n - application/problem+json\n responses:\n 200:\n description: Success\n default:\n description: Error\n schema:\n $ref: \"#/definitions/problem\"\n x-amples:\n - title: retrieve service info\n request: {}\n response:\n status: 200\n headers:\n content-type: application/json\n body:\n name: /.+/\n description: /.+/\n version: /.+/\n home: /.+/\n\n # from routes/feed/availability.js\n /{domain}/v1/feed/availability:\n get:\n tags:\n - Feed\n summary: Get availability of featured feed content by wiki domain.\n produces:\n - application/json; charset=utf-8; profile=\"https://www.mediawiki.org/wiki/Specs/Availability/1.0.1\"\n - application/problem+json\n parameters:\n - $ref: \"#/parameters/domain\"\n responses:\n 200:\n description: Availability of the feed content by wiki domain\n schema:\n $ref: \"#/definitions/availability\"\n default:\n description: Error\n schema:\n $ref: \"#/definitions/problem\"\n x-amples:\n - title: Retrieve feed content availability from \\'wikipedia.org\\'\n request:\n params:\n domain: wikimedia.org\n response:\n status: 200\n headers:\n content-type: application/json; charset=utf-8; profile=\"https://www.mediawiki.org/wiki/Specs/Availability/1.0.1\"\n vary: /.+/\n etag: /^\"[^/\"]+/[^/\"]+\"$/\n access-control-allow-origin: \"*\"\n access-control-allow-headers: accept, x-requested-with, content-type\n content-security-policy: default-src\n x-content-security-policy: default-src\n x-frame-options: SAMEORIGIN\n body:\n todays_featured_article: [ /.+/ ]\n most_read: [ \"*\" ]\n picture_of_the_day: [ \"*\" ]\n in_the_news: [ /.+/ ]\n on_this_day: [ /.+/ ]\n\n # from routes/feed/announcements.js\n /{domain}/v1/feed/announcements:\n get:\n tags:\n - Feed\n summary: Get announcements for the Explore feed in the mobile apps.\n description: |\n Gets announcements for display in the official Wikipedia iOS and Android apps.\n This is usually used to show announcements for surveys or fundraising.\n produces:\n - application/json; charset=utf-8; profile=\"https://www.mediawiki.org/wiki/Specs/Announcements/0.3.0\"\n - application/problem+json\n parameters:\n - $ref: \"#/parameters/domain\"\n responses:\n 200:\n description: Announcements for the given Wiki\n schema:\n $ref: \"#/definitions/announcements\"\n default:\n description: Error\n schema:\n $ref: \"#/definitions/problem\"\n x-amples:\n - title: Retrieve announcements\n response:\n status: 200\n headers:\n content-type: application/json; charset=utf-8; profile=\"https://www.mediawiki.org/wiki/Specs/Announcements/0.3.0\"\n cache-control: public, max-age=86400, s-maxage=900\n vary: /.+/\n etag: /^\"[^/\"]+/[^/\"]+\"$/\n access-control-allow-origin: \"*\"\n access-control-allow-headers: accept, x-requested-with, content-type\n content-security-policy: default-src\n x-content-security-policy: default-src\n x-frame-options: SAMEORIGIN\n\n # from routes/feed/on-this-day.js\n /{domain}/v1/feed/onthisday/{type}/{month}/{day}:\n get:\n tags:\n - Feed\n summary: Get events on this day in history for the Explore feed.\n description: |\n Provides events that historically happened on the provided day and month.\n Supported types of events are:\n - Selected: a list of a few selected anniversaries which happen on the provided day and month; often the entries are curated for the current year\n - Births: a list of birthdays which happened on the provided day and month\n - Deaths: a list of deaths which happened on the provided day and month\n - Holidays: a list of fixed holidays celebrated on the provided day and month\n - Events: a list of significant events which happened on the provided day and month and which are not covered by the other types yet\n - All: all of the above\n produces:\n - application/json; charset=utf-8; profile=\"https://www.mediawiki.org/wiki/Specs/OnThisDay/0.5.0\"\n - application/problem+json\n parameters:\n - $ref: \"#/parameters/domain\"\n - name: type\n in: path\n description: Type of events\n type: string\n required: true\n enum:\n - selected\n - births\n - deaths\n - holidays\n - events\n - all\n - $ref: \"#/parameters/month\"\n - $ref: \"#/parameters/day\"\n\n responses:\n 200:\n description: Annual events listed on this wiki for the requested month and day\n schema:\n $ref: \"#/definitions/onthisdayResponse\"\n 404:\n description: No data found for the requested date\n schema:\n $ref: \"#/definitions/problem\"\n 501:\n description: Unsupported language\n schema:\n $ref: \"#/definitions/problem\"\n default:\n description: Error\n schema:\n $ref: \"#/definitions/problem\"\n x-amples:\n - title: retrieve selected events on January 15\n request:\n params:\n type: selected\n month: 01\n day: 15\n response:\n status: 200\n headers:\n content-type: application/json; charset=utf-8; profile=\"https://www.mediawiki.org/wiki/Specs/OnThisDay/0.5.0\"\n vary: /.+/\n etag: /^\"[^/\"]+/[^/\"]+\"$/\n access-control-allow-origin: \"*\"\n access-control-allow-headers: accept, x-requested-with, content-type\n content-security-policy: default-src\n x-content-security-policy: default-src\n x-frame-options: SAMEORIGIN\n body:\n selected:\n - text: /.+/\n year: /.+/\n pages:\n - title: /.+/\n\n # from routes/feed/featured.js\n /{domain}/v1/page/featured/{year}/{month}/{day}:\n get:\n tags:\n - Feed\n summary: Get featured article of the day for the Explore feed.\n description: |\n Page title of \"Today's featured article\" (only works on select wikis for now).\n produces:\n - application/json\n - application/problem+json\n parameters:\n - $ref: \"#/parameters/domain\"\n - $ref: \"#/parameters/year\"\n - $ref: \"#/parameters/month\"\n - $ref: \"#/parameters/day\"\n responses:\n 200:\n description: The title of a Wikipedia's Featured Article of the Day\n schema:\n $ref: \"#/definitions/summary\"\n 204:\n description: Empty response (for feed content aggregation requests from RESTBase)\n schema:\n $ref: \"#/definitions/empty\"\n 404:\n description: Not found\n schema:\n $ref: \"#/definitions/problem\"\n 500:\n description: API Error\n schema:\n $ref: \"#/definitions/problem\"\n 501:\n description: Unsupported language\n schema:\n $ref: \"#/definitions/problem\"\n default:\n description: Error\n schema:\n $ref: \"#/definitions/problem\"\n x-amples:\n - title: retrieve title of the featured article for April 29, 2016\n request:\n params:\n year: 2016\n month: \"04\"\n day: 29\n response:\n status: 200\n headers:\n content-type: application/json; charset=utf-8\n vary: /.+/\n etag: /^\"[^/\"]+/[^/\"]+\"$/\n access-control-allow-origin: \"*\"\n access-control-allow-headers: accept, x-requested-with, content-type\n content-security-policy: default-src\n x-content-security-policy: default-src\n x-frame-options: SAMEORIGIN\n body:\n title: /.+/\n extract: /.+/\n - title: retrieve featured article info for unsupported site (with aggregated=true)\n request:\n params:\n domain: is.wikipedia.org\n year: 2016\n month: \"04\"\n day: 29\n query:\n aggregated: true\n response:\n status: 204\n body: \"\"\n\n # from routes/feed/featured-image.js\n /{domain}/v1/media/image/featured/{year}/{month}/{day}:\n get:\n tags:\n - Feed\n summary: Get the Picture of the Day from Wikimedia Commons for the Explore feed.\n description: |\n Featured image for a given date (aka Picture of the day).\n Provides thumbnail and full res image URLs and a localized description based\n on the domain used.\n produces:\n - application/json\n - application/problem+json\n parameters:\n - $ref: \"#/parameters/domain\"\n - $ref: \"#/parameters/year\"\n - $ref: \"#/parameters/month\"\n - $ref: \"#/parameters/day\"\n responses:\n 200:\n description: Info on the Commons Featured Image of the Day for the requested date\n schema:\n $ref: \"#/definitions/image\"\n 204:\n description: Empty response (for feed content aggregation requests from RESTBase)\n schema:\n $ref: \"#/definitions/empty\"\n 404:\n description: Not found (no featured image for the requested date)\n schema:\n $ref: \"#/definitions/problem\"\n default:\n description: Error\n schema:\n $ref: \"#/definitions/problem\"\n x-amples:\n - title: retrieve featured image data for April 29, 2016\n request:\n params:\n year: 2016\n month: \"04\"\n day: 29\n response:\n status: 200\n headers:\n content-type: application/json; charset=utf-8\n vary: /.+/\n etag: /^\"[^/\"]+/[^/\"]+\"$/\n access-control-allow-origin: \"*\"\n access-control-allow-headers: accept, x-requested-with, content-type\n content-security-policy: default-src\n x-content-security-policy: default-src\n x-frame-options: SAMEORIGIN\n body:\n title: /.+/\n description:\n html: /.+/\n text: /.+/\n lang: /.+/\n image:\n source: /.+/\n width: /.+/\n height: /.+/\n credit:\n html: /.+/\n text: /.+/\n license:\n type: /.+/\n code: /.+/\n url: /.+/\n artist:\n html: /.+/\n text: /.+/\n file_page: /.+/\n wb_entity_id: /.+/\n structured:\n captions: /.+/\n thumbnail:\n source: /.+/\n width: /.+/\n height: /.+/\n\n # from routes/feed/most-read.js\n /{domain}/v1/page/most-read/{year}/{month}/{day}:\n get:\n tags:\n - Feed\n summary: Get most viewed pages for a date.\n description: |\n Gets the most read articles for the date provided.\n The date is in UTC, as other endpoints, too.\n Only days prior to today's date are accepted.\n produces:\n - application/json\n - application/problem+json\n parameters:\n - $ref: \"#/parameters/domain\"\n - $ref: \"#/parameters/year\"\n - $ref: \"#/parameters/month\"\n - $ref: \"#/parameters/day\"\n responses:\n 200:\n description: Most read article titles for this wiki for the requested date\n schema:\n $ref: \"#/definitions/mostread\"\n 204:\n description: Empty response (for feed content aggregation requests from RESTBase)\n schema:\n $ref: \"#/definitions/empty\"\n 404:\n description: No data found for the requested date\n schema:\n $ref: \"#/definitions/problem\"\n default:\n description: Error\n schema:\n $ref: \"#/definitions/problem\"\n x-amples:\n - title: retrieve the most read articles for January 1, 2016\n request:\n params:\n year: 2016\n month: \"01\"\n day: \"01\"\n response:\n status: 200\n headers:\n content-type: application/json\n vary: /.+/\n etag: /^\"[^/\"]+/[^/\"]+\"$/\n access-control-allow-origin: \"*\"\n access-control-allow-headers: accept, x-requested-with, content-type\n content-security-policy: default-src\n x-content-security-policy: default-src\n x-frame-options: SAMEORIGIN\n body:\n date: 2016-01-01Z\n articles:\n - views: /.+/\n rank: /.+/\n title: /.+/\n extract: /.+/\n - title: retrieve the most-read articles for January 1, 2016 (with aggregated=true)\n request:\n params:\n year: 2016\n month: \"01\"\n day: \"01\"\n query:\n aggregated: true\n response:\n status: 200\n headers:\n content-type: application/json; charset=utf-8\n vary: /.+/\n etag: /^\"[^/\"]+/[^/\"]+\"$/\n access-control-allow-origin: \"*\"\n access-control-allow-headers: accept, x-requested-with, content-type\n content-security-policy: default-src\n x-content-security-policy: default-src\n x-frame-options: SAMEORIGIN\n body:\n date: 2015-12-31Z\n articles:\n - views: /.+/\n rank: /.+/\n title: /.+/\n extract: /.+/\n - title: retrieve most-read articles for date with no data (with aggregated=true)\n request:\n params:\n year: 2015\n month: \"01\"\n day: \"01\"\n query:\n aggregated: true\n response:\n status: 204\n body: \"\"\n\n # from routes/feed/news.js\n /{domain}/v1/page/news:\n get:\n tags:\n - Feed\n summary: Get current news headlines.\n description: |\n Gets content related to the current \"In the News\" template\n (for some wikis for now).\n produces:\n - application/json\n - application/problem+json\n parameters:\n - $ref: \"#/parameters/domain\"\n responses:\n 200:\n description: News content from the a Wikipedia main page\n schema:\n $ref: \"#/definitions/news\"\n 204:\n description: Empty response (for feed content aggregation requests from RESTBase)\n schema:\n $ref: \"#/definitions/empty\"\n 501:\n description: Unsupported language\n schema:\n $ref: \"#/definitions/problem\"\n default:\n description: Error\n schema:\n $ref: \"#/definitions/problem\"\n x-amples:\n - title: get 'In the News' content\n response:\n status: 200\n headers:\n content-type: application/json; charset=utf-8\n vary: /.+/\n etag: /^\"[^/\"]+/[^/\"]+\"$/\n access-control-allow-origin: \"*\"\n access-control-allow-headers: accept, x-requested-with, content-type\n content-security-policy: default-src\n x-content-security-policy: default-src\n x-frame-options: SAMEORIGIN\n body:\n - story: /.+/\n links:\n - title: /.+/\n extract: /.+/\n - title: get \"In the News\" content for unsupported language (with aggregated=true)\n request:\n params:\n domain: is.wikipedia.org\n query:\n aggregated: true\n response:\n status: 204\n body: \"\"\n\n # from routes/page/random.js\n /{domain}/v1/page/random/title:\n get:\n tags:\n - Feed\n summary: Get a random article title.\n description: |\n Gets the title of a randomly picked article from main namespace.\n Preference is given to articles with a thumbnail and an associated Wikidata description.\n produces:\n - application/json; charset=utf-8; profile=\"https://www.mediawiki.org/wiki/Specs/Random/0.7.0\"\n - application/problem+json\n parameters:\n - $ref: \"#/parameters/domain\"\n responses:\n 200:\n description: A random (good) article title\n schema:\n $ref: \"#/definitions/random\"\n 400:\n description: Bad request\n schema:\n $ref: \"#/definitions/problem\"\n default:\n $ref: \"#/definitions/problem\"\n x-amples:\n - title: retrieve a random article title\n response:\n status: 200\n headers:\n content-type: application/json; charset=utf-8; profile=\"https://www.mediawiki.org/wiki/Specs/Random/0.7.0\"\n vary: /.+/\n access-control-allow-origin: \"*\"\n access-control-allow-headers: accept, x-requested-with, content-type\n content-security-policy: default-src\n x-content-security-policy: default-src\n x-frame-options: SAMEORIGIN\n body:\n items:\n - title: /.+/\n\ndefinitions:\n # A https://tools.ietf.org/html/draft-nottingham-http-problem\n problem:\n required:\n - type\n properties:\n status:\n type: integer\n type:\n type: string\n title:\n type: string\n detail:\n type: string\n method:\n type: string\n uri:\n type: string\n\n empty:\n type: object\n properties:\n type:\n type: string\n description: description of original content type (buffer)\n data:\n type: array\n description: Buffer contents\n items:\n type: string\n additionalProperties: false\n\n dated_pageview:\n type: object\n properties:\n date:\n type: string\n description: ISO 8601 timestamp of pageviews recorded\n views:\n type: integer\n description: Number of views on date\n required:\n - date\n - views\n additionalProperties: false\n\n mostread_article:\n allOf:\n - $ref: \"#/definitions/summary\"\n - type: object\n properties:\n views:\n type: integer\n description: Number of views on the requested day\n view_history:\n type: array\n items:\n $ref: \"#/definitions/dated_pageview\"\n rank:\n type: integer\n description: Position in the list of most viewed articles\n required:\n - views\n - rank\n\n mostread:\n type: object\n properties:\n date:\n type: string\n description: The date which the data correspond to\n articles:\n type: array\n description: Array of most popular articles\n items:\n $ref: \"#/definitions/mostread_article\"\n required:\n - date\n - articles\n\n onthisdayList:\n type: array\n items:\n type: object\n properties:\n text:\n type: string\n description: Short description of the event\n year:\n type: integer\n description: The year this event occurred\n pages:\n type: array\n description: List of pages related to the event\n items:\n $ref: \"#/definitions/summary\"\n required:\n - text\n - pages\n\n onthisdayResponse:\n type: object\n description: Lists of events which happened on the provided day and month\n properties:\n births:\n $ref: \"#/definitions/onthisdayList\"\n deaths:\n $ref: \"#/definitions/onthisdayList\"\n events:\n $ref: \"#/definitions/onthisdayList\"\n holidays:\n $ref: \"#/definitions/onthisdayList\"\n selected:\n $ref: \"#/definitions/onthisdayList\"\n additionalProperties: false\n\n news_item:\n type: object\n properties:\n story:\n type: string\n description: A cover story for the news item\n links:\n type: array\n description: |\n A collection of pages mentioned in the headline. The first page is the headline topic.\n items:\n $ref: \"#/definitions/summary\"\n required:\n - story\n - links\n\n news:\n type: array\n items:\n $ref: \"#/definitions/news_item\"\n\n image:\n type: object\n properties:\n title:\n type: string\n description: Image title\n thumbnail:\n $ref: \"#/definitions/image_props\"\n image:\n $ref: \"#/definitions/image_props\"\n description:\n $ref: \"#/definitions/extmetadata_property\"\n file_page:\n type: string\n description: Full URL to the file page for the item on Wikimedia Commons\n artist:\n type: object\n description: structured info about the author of the media item\n properties:\n html:\n type: string\n description: HTML string describing the artist\n name:\n type: string\n description: the plain text artist name, if available\n user_page:\n type: string\n description: Wikimedia Commons user page for the artist, if available\n required:\n - html\n credit:\n $ref: \"#/definitions/extmetadata_property\"\n license:\n type: object\n description: license under which the media item is available on Wikimedia Commons\n properties:\n type:\n type: string\n description: license type\n url:\n type: string\n description: URL describing the terms and conditions of the license, if any\n required:\n - type\n wb_entity_id:\n type: string\n description: Commons Wikibase ID, if the file is on Wikimedia Commons\n structured:\n type: object\n description: structured image metadata from Structured Data on Commons (SDC)\n properties:\n captions:\n type: object\n description: caption (label) values by language\n required: [ captions ]\n required:\n - title\n - thumbnail\n - image\n - license\n - structured\n\n announcements:\n type: object\n properties:\n announce:\n type: array\n description: list of active announcements for this wiki\n items:\n $ref: \"#/definitions/announcement\"\n required:\n - announce\n\n availability:\n type: object\n properties:\n todays_featured_article:\n type: array\n description: domains for wikis with this feature enabled, or [ '*.<project>.org' ] for all wikis in a project\n items:\n type: string\n most_read:\n type: array\n description: domains for wikis with this feature enabled or [ '*.<project>.org' ] for all wikis in a project\n items:\n type: string\n picture_of_the_day:\n type: array\n description: domains for wikis with this feature enabled or [ '*.<project>.org' ] for all wikis in a project\n items:\n type: string\n in_the_news:\n type: array\n description: domains for wikis with this feature enabled or [ '*.<project>.org' ] for all wikis in a project\n items:\n type: string\n on_this_day:\n type: array\n description: domains for wikis with this feature enabled or [ '*.<project>.org' ] for all wikis in a project\n items:\n type: string\n required: [ todays_featured_article, most_read, picture_of_the_day, in_the_news, on_this_day ]\n additionalProperties: false\n\n announcement:\n type: object\n properties:\n id:\n type: string\n description: Unique ID of the announcement\n type:\n type: string\n description: The announcement type\n enum:\n - survey\n - fundraising\n - announcement\n start_time:\n type: string\n description: The ISO 8601 date to begin showing the announcement.\n end_time:\n type: string\n description: The ISO 8601 date to stop showing the announcement.\n platforms:\n type: array\n description: |\n An array of platforms on which to display the announcement.\n items:\n type: string\n enum:\n - iOSApp\n - iOSAppV2\n - iOSAppV3\n - iOSAppV4\n - iOSAppV5\n - AndroidApp\n - AndroidAppV2\n text:\n type: string\n description: The text of the announcement\n image:\n type: string\n description: \\[DEPRECATED\\] The URL of the image for the announcement (Android only)\n image_url:\n type: string\n description: The URL of the image for the announcement\n action:\n $ref: \"#/definitions/action\"\n caption_HTML:\n type: string\n description: HTML to display below the announcement. Usually a privacy statment and link to a policy\n countries:\n type: array\n description: |\n An array of country codes in which to display the announcement. Clients should derive\n the country from 'GeoIP' portion of the Set-Cookie header.\n items:\n type: string\n min_version:\n type: string\n description: minimum app version code for which to show the announcement\n max_version:\n type: string\n description: maximum app version code for which to show the announcement\n beta:\n type: boolean\n description: |\n (AndroidAppV2 only) Optional boolean flag controlling the release builds for which the announcement should be shown.\n Set to true if the announcement should be shown only in pre-production builds (beta, alpha, dev).\n Set to false if the announcement should be shown only in release builds.\n If not defined, the announcement will be shown for all builds.\n logged_in:\n type: boolean\n description: |\n (AndroidAppV2 only) Optional boolean flag controlling whether announcements should be shown based on the user login state.\n Set to true if the announcement should be shown only if the user is logged in.\n Set to false if the announcement should be shown only if the user is NOT logged in.\n If not defined, the announcement will be shown regardless of the user's login state.\n reading_list_sync_enabled:\n type: boolean\n description: |\n (AndroidAppV2 only) Optional boolean flag controlling whether announcements should be shown based on whether the user\n has enabled reading list syncing.\n Set to true if the announcement should be shown only if the user has enabled reading list syncing.\n Set to false if the announcement should be shown only if the user has NOT enabled reading list syncing.\n If not defined, the announcement will be shown regardless of whether the user has enabled reading list syncing.\n negative_text:\n type: string\n description: |\n (AndroidAppV2 only) text to show on a \"negative\" button on the announcement. If absent, the button is not shown\n image_height:\n type: integer\n description: |\n (AndroidAppV2 only) height, in device-independent pixels, of the image portion of the announcement card\n articleTitles:\n type: array\n description: |\n (iOSAppV3+ only, survey type only) Array of article titles that will display the survey announcement.\n items:\n type: string\n displayDelay:\n type: integer\n description: |\n (iOSAppV3+ only, survey type only) Number in seconds to wait for survey announcement to appear after content load.\n percent_receiving_experiment:\n type: integer\n description: |\n (iOSAppV4+ only, survey type only) Integer between 0 and 100 representing the percentage of users that will fall into the iOS Article as a Living Document experiment. This percentage will see the feature, the others will not. Both groups will see the survey announcement.\n required:\n - id\n - type\n - start_time\n - end_time\n - platforms\n - text\n - action\n\n article_title:\n type: object\n properties:\n title:\n type: string\n description: An article title\n required:\n - title\n\n image_props:\n type: object\n properties:\n source:\n type: string\n description: URI\n width:\n type: integer\n minimum: 0\n description: width (px)\n height:\n type: integer\n minimum: 0\n description: height (px)\n mime:\n type: string\n description: MIME type\n required:\n - source\n - width\n - height\n additionalProperties: false\n\n extmetadata_property:\n type: object\n properties:\n html:\n type: string\n description: HTML of the description\n text:\n type: string\n description: Plain text of the description\n lang:\n type: string\n description: Language code of the description (if available)\n required:\n - html\n - text\n\n action:\n type: object\n properties:\n title:\n type: string\n description: The title to display on the button that performs the action\n url:\n type: string\n description: The URL to navigate to when the button is pressed\n required:\n - title\n - url\n\n random:\n type: object\n properties:\n items:\n type: array\n items:\n $ref: \"#/definitions/article_title\"\n required:\n - items\n\n titles_set:\n type: object\n description: a good example of the differences can be seen in https://en.wikipedia.org/api/rest_v1/page/summary/IOS_13\n properties:\n canonical:\n type: string\n description: the DB key (non-prefixed), e.g. may have _ instead of spaces, best for making request URIs, still requires Percent-encoding\n normalized:\n type: string\n description: the normalized title (https://www.mediawiki.org/wiki/API:Query#Example_2:_Title_normalization), e.g. may have spaces instead of _\n display:\n type: string\n description: the title as it should be displayed to the user\n required:\n - canonical\n - normalized\n - display\n\n content_urls:\n type: object\n properties:\n page:\n type: string\n description: the canonical page URL\n revisions:\n type: string\n description: the revision history page URL\n edit:\n type: string\n description: the (desktop) URL for editing the page\n talk:\n type: string\n description: the talk page URL, if applicable\n required:\n - page\n - revisions\n - edit\n additionalProperties: false\n\n summary:\n type: object\n properties:\n type:\n type: string\n description: Type of page summary\n enum:\n - standard\n - disambiguation\n - no-extract\n - mainpage\n titles:\n $ref: \"#/definitions/titles_set\"\n title:\n deprecated: true\n type: string\n description: |\n The page title.\n Deprecated: Use `titles.normalized` instead.\n displaytitle:\n deprecated: true\n type: string\n description: |\n The page title how it should be shown to the user.\n Deprecated: Use `titles.display` instead.\n namespace:\n type: object\n properties:\n id:\n type: integer\n description: the numeric ID for the page's namespace (https://www.mediawiki.org/wiki/Manual:Namespace)\n text:\n type: string\n description: localized text name for the MediaWiki namespace\n required: [ id, text ]\n additionalProperties: false\n wikibase_item:\n type: string\n description: the Wikibase item ID for the associated Wikidata entity (if any)\n pageid:\n type: integer\n description: The page ID\n revision:\n type: string\n description: The revision of the page when the summary was produced\n tid:\n type: string\n description: The timeuuid associated with the underlying HTML content\n extract:\n type: string\n description: First several sentences of an article in plain text\n extract_html:\n type: string\n description: First several sentences of an article in simple HTML format\n thumbnail:\n $ref: \"#/definitions/image_props\"\n originalimage:\n $ref: \"#/definitions/image_props\"\n lang:\n type: string\n description: The page language code\n example: en\n dir:\n type: string\n description: The page language direction code\n enum:\n - ltr\n - rtl\n timestamp:\n type: string\n format: date-time\n description: The time when the page was last edited in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format\n example: \"1970-01-01T00:00:00.000Z\"\n description:\n type: string\n description: short description for the page\n example: American poet\n content_urls:\n type: object\n properties:\n desktop:\n $ref: \"#/definitions/content_urls\"\n mobile:\n $ref: \"#/definitions/content_urls\"\n coordinates:\n type: object\n description: The coordinates of the item\n properties:\n lat:\n type: number\n description: The latitude\n lon:\n type: number\n description: The longitude\n required: [ lat, lon ]\n required:\n - type\n - titles\n - title\n - displaytitle\n - pageid\n - lang\n - dir\n - revision\n - timestamp\n - content_urls\n - extract\n - extract_html\n","usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/targets.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]}] --- end --- $ /usr/bin/npm ci --- stderr --- npm WARN deprecated kad-fs@0.0.4: This package is no longer maintained. npm WARN deprecated har-validator@5.1.5: this library is no longer supported npm WARN deprecated kad-memstore@0.0.1: This package is no longer maintained. npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 --- stdout --- added 643 packages, and audited 644 packages in 9s 98 packages are looking for funding run `npm fund` for details 11 vulnerabilities (7 moderate, 4 high) To address all issues possible (including breaking changes), run: npm audit fix --force Some issues need review, and may require choosing a different dependency. Run `npm audit` for details. --- end --- $ /usr/bin/npm test --- stderr --- strict mode: missing type "object" for keyword "required" at "#/definitions/problem#" (strictTypes) strict mode: missing type "object" for keyword "properties" at "#/definitions/problem#" (strictTypes) --- stdout --- > @wikimedia/wikifeeds@1.0.0 test > npm run lint && PREQ_CONNECT_TIMEOUT=15 mocha --recursive > @wikimedia/wikifeeds@1.0.0 lint > eslint . /src/repo/.eslintrc.json 1:1 warning Use the global form of 'use strict' strict /src/repo/app.js 20:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types 64:37 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 136:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 138:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types 150:31 warning Found non-literal argument in require security/detect-non-literal-require 197:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 198:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types 236:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types /src/repo/etc/news-sites.js 4:1 warning At most one access-control tag may be present on a jsdoc block jsdoc/check-access 5:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 6:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 50:1 warning Syntax error in type: {Object.<string, NewsSite>} jsdoc/valid-types /src/repo/lib/announcements.js 30:1 warning Expected this semicolon to be at the end of the previous line semi-style 34:1 warning This line has a length of 123. Maximum allowed is 100 max-len 51:1 warning This line has a length of 134. Maximum allowed is 100 max-len 84:1 warning This line has a length of 119. Maximum allowed is 100 max-len 86:1 warning This line has a length of 118. Maximum allowed is 100 max-len 135:1 warning This line has a length of 123. Maximum allowed is 100 max-len /src/repo/lib/api-util.js 300:1 warning The type 'Application' is undefined jsdoc/no-undefined-types /src/repo/lib/featured.js 136:12 warning 'si' is already declared in the upper scope on line 12 column 7 no-shadow /src/repo/lib/imageinfo.js 30:1 warning The type 'Bool' is undefined jsdoc/no-undefined-types 85:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 132:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 203:43 warning Array.prototype.map() expects a return value from arrow function array-callback-return 280:1 warning Syntax error in type: [type] jsdoc/valid-types 282:1 warning Syntax error in type: [type] jsdoc/valid-types /src/repo/lib/most-read.js 79:1 warning At most one access-control tag may be present on a jsdoc block jsdoc/check-access 80:1 warning @public should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 81:1 warning @public should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 98:1 warning This line has a length of 122. Maximum allowed is 100 max-len 113:28 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 114:1 warning This line has a length of 112. Maximum allowed is 100 max-len 143:19 warning 'pageviews' is already declared in the upper scope on line 10 column 7 no-shadow 159:25 warning Array.prototype.map() expects a return value from arrow function array-callback-return 197:1 warning This line has a length of 144. Maximum allowed is 100 max-len 206:1 warning This line has a length of 113. Maximum allowed is 100 max-len /src/repo/lib/news.js 15:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 73:12 warning 'si' is already declared in the upper scope on line 8 column 7 no-shadow 96:20 warning 'result' is already declared in the upper scope on line 80 column 19 no-shadow /src/repo/lib/on-this-day.js 34:1 warning The type 'Integer' is undefined jsdoc/no-undefined-types 122:1 warning The type 'AnchorElement' is undefined jsdoc/no-undefined-types 123:1 warning The type 'Integer' is undefined jsdoc/no-undefined-types 128:12 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 141:1 warning The type 'AnchorElement' is undefined jsdoc/no-undefined-types 161:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 173:1 warning The type 'AnchorElement' is undefined jsdoc/no-undefined-types 196:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 241:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 257:1 warning The type 'Integer' is undefined jsdoc/no-undefined-types 296:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 307:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 308:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 329:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 347:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 367:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 399:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 413:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 427:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 441:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 455:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 470:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 471:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 530:1 warning Missing JSDoc @param "sendResponse" type jsdoc/require-param-type /src/repo/lib/on-this-day.languages.js 28:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 30:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 32:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 60:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 62:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 64:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 100:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 102:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 104:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 128:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 130:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 132:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 156:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 158:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 160:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 189:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 191:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 193:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 217:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 219:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 221:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 245:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 247:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 249:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 273:13 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 275:13 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 277:13 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 301:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 303:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 305:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 335:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 337:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 339:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 362:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 364:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 366:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 390:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 392:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp /src/repo/lib/pageviews.js 36:1 warning At most one access-control tag may be present on a jsdoc block jsdoc/check-access 37:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 38:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 39:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 53:1 warning The type 'Platform' is undefined jsdoc/no-undefined-types 54:1 warning The type 'Agent' is undefined jsdoc/no-undefined-types 56:1 warning The type 'Granularity' is undefined jsdoc/no-undefined-types 71:1 warning The type 'Platform' is undefined jsdoc/no-undefined-types /src/repo/lib/random.js 38:9 warning 'score' is already declared in the upper scope on line 31 column 10 no-shadow 55:1 warning Missing JSDoc @param "scoredResults" type jsdoc/require-param-type /src/repo/lib/siteinfo.js 3:1 warning Use the global form of 'use strict' strict 10:29 warning Unsafe Regular Expression security/detect-unsafe-regex /src/repo/lib/util.js 104:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 142:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 222:1 warning The type 'Router' is undefined jsdoc/no-undefined-types 280:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 293:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 306:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 378:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 450:34 warning Default parameters should be last default-param-last /src/repo/package-lock.json 1:1 warning Use the global form of 'use strict' strict /src/repo/package.json 1:1 warning Use the global form of 'use strict' strict /src/repo/scripts/check-featured-feed.js 49:35 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 82:44 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 107:34 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 150:30 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 217:5 warning Don't use process.exit(); throw an error instead n/no-process-exit /src/repo/spec.yaml 228:1 warning This line has a length of 154. Maximum allowed is 100 max-len 232:1 warning This line has a length of 141. Maximum allowed is 100 max-len 866:1 warning This line has a length of 117. Maximum allowed is 100 max-len 871:1 warning This line has a length of 116. Maximum allowed is 100 max-len 876:1 warning This line has a length of 116. Maximum allowed is 100 max-len 881:1 warning This line has a length of 116. Maximum allowed is 100 max-len 886:1 warning This line has a length of 116. Maximum allowed is 100 max-len 938:1 warning This line has a length of 108. Maximum allowed is 100 max-len 955:1 warning This line has a length of 126. Maximum allowed is 100 max-len 956:1 warning This line has a length of 107. Maximum allowed is 100 max-len 962:1 warning This line has a length of 132. Maximum allowed is 100 max-len 969:1 warning This line has a length of 127. Maximum allowed is 100 max-len 971:1 warning This line has a length of 108. Maximum allowed is 100 max-len 972:1 warning This line has a length of 113. Maximum allowed is 100 max-len 973:1 warning This line has a length of 121. Maximum allowed is 100 max-len 977:1 warning This line has a length of 121. Maximum allowed is 100 max-len 981:1 warning This line has a length of 113. Maximum allowed is 100 max-len 985:1 warning This line has a length of 111. Maximum allowed is 100 max-len 991:1 warning This line has a length of 124. Maximum allowed is 100 max-len 995:1 warning This line has a length of 281. Maximum allowed is 100 max-len 1082:1 warning This line has a length of 144. Maximum allowed is 100 max-len ✖ 150 problems (0 errors, 150 warnings) aggregated featured starting test server ✔ should return 200 for a valid request (3530ms) ✔ should return 404 for an invalid year ✔ should return 404 for an invalid month ✔ should return 404 for an invalid day ✔ should return only historic keys for past date (646ms) ✔ should return current keys for today (2303ms) ✔ should return future keys for tomorrow (3631ms) aggregate onthisday ✔ should return 200 for a valid request (4585ms) ✔ should return 404 for an invalid month (200ms) ✔ should return 404 for an invalid day (136ms) ✔ should return objects with the expected keys (3007ms) express app ✔ should get robots.txt ✔ should set CORS headers ✔ should set CSP headers ✔ should get static content gzipped ✔ should get static content uncompressed Swagger spec ✔ get the spec ✔ spec validation validate responses against schema - random response should conform to schema ✔ featured article response should conform to schema (223ms) ✔ featured image response should conform to schema (194ms) ✔ most-read response should conform to schema (367ms) ✔ news response should conform to schema (55ms) ✔ announcements should conform to schema ✔ onthisday response should conform to schema (4601ms) ✔ featured article response should conform to schema (invalid lang, agg=true) ✔ featured image response should conform to schema (invalid date, agg=true) ✔ most-read response should conform to schema (invalid date, agg=true) ✔ news response (invalid language, agg=true) should be empty ✔ featured article request should fail for invalid language when !agg=true ✔ featured image request should fail for invalid date when !agg=true ✔ most-read request should fail for invalid date when !agg=true ✔ news request should fail for invalid language when !agg=true validate spec examples ✔ spec from root ✔ retrieve service info ✔ Retrieve feed content availability from \'wikipedia.org\' ✔ Retrieve announcements ✔ retrieve selected events on January 15 (344ms) ✔ retrieve title of the featured article for April 29, 2016 (162ms) ✔ retrieve featured article info for unsupported site (with aggregated=true) ✔ retrieve featured image data for April 29, 2016 (1892ms) ✔ retrieve the most read articles for January 1, 2016 (592ms) ✔ retrieve the most-read articles for January 1, 2016 (with aggregated=true) (723ms) ✔ retrieve most-read articles for date with no data (with aggregated=true) ✔ get 'In the News' content (116ms) ✔ get "In the News" content for unsupported language (with aggregated=true) ✔ retrieve a random article title (76ms) featured ✔ incomplete date should return 404 ✔ extra uri path parameter after date should return 404 ✔ Missing TFA should return 204 (151ms) ✔ Missing TFA with aggregated=true should return 204 (137ms) ✔ featured article of an old date should return 404 featured-image-lang ✔ bg description (3453ms) ✔ bn description (306ms) ✔ bs description (261ms) ✔ cs description (266ms) ✔ de description (302ms) ✔ el description (295ms) ✔ en description (264ms) ✔ fa description (293ms) ✔ he description (280ms) ✔ hu description (285ms) ✔ it description (252ms) ✔ ja description (290ms) ✔ la description (284ms) ✔ no description (261ms) ✔ sco description (271ms) ✔ sd description (276ms) ✔ sv description (257ms) ✔ tr description (259ms) ✔ ur description (262ms) ✔ vi description (294ms) ✔ zh description (271ms) featured-image ✔ incomplete date should return 404 ✔ extra uri path parameter after date should return 404 service information ✔ should get the service name ✔ should get the service version ✔ should redirect to the service home page ✔ should get the service info most-read articles ✔ Should provide pageviews from day prior when aggregated flag is set (487ms) ✔ Should drop duplicate pageviews (631ms) ✔ Should filter out missing summaries (546ms) ✔ Should return 204 for fywiki requests ✔ main page filtering RegExp should handle all main page title chars ✔ Should filter out blocked titles from some languages, but not others ✔ Should filter out certain blocked titles from all wikis most-read articles ✔ Should return 200 even if title has invalid utf8 encoding (525ms) ✔ Should filter-out invalid utf8 encoding news headline selectors ✔ test news headlines should be general not categorical ✔ test news headline topics should be nonnull ✔ bs news headlines should be general not categorical ✔ bs news headline topics should be nonnull ✔ da news headlines should be general not categorical ✔ da news headline topics should be nonnull ✔ de news headlines should be general not categorical ✔ de news headline topics should be nonnull ✔ el news headlines should be general not categorical ✔ el news headline topics should be nonnull ✔ en news headlines should be general not categorical ✔ en news headline topics should be nonnull ✔ es news headlines should be general not categorical ✔ es news headline topics should be nonnull ✔ fi news headlines should be general not categorical ✔ fi news headline topics should be nonnull ✔ fr news headlines should be general not categorical ✔ fr news headline topics should be nonnull ✔ he news headlines should be general not categorical ✔ he news headline topics should be nonnull ✔ ko news headlines should be general not categorical ✔ ko news headline topics should be nonnull ✔ no news headlines should be general not categorical ✔ no news headline topics should be nonnull ✔ pl news headlines should be general not categorical ✔ pl news headline topics should be nonnull ✔ pt news headlines should be general not categorical ✔ pt news headline topics should be nonnull ✔ ru news headlines should be general not categorical ✔ ru news headline topics should be nonnull ✔ sco news headlines should be general not categorical ✔ sco news headline topics should be nonnull ✔ sv news headlines should be general not categorical ✔ sv news headline topics should be nonnull ✔ vi news headlines should be general not categorical ✔ vi news headline topics should be nonnull ✔ news headline topic should be the first bold link ✔ news headline topic should be the first link when no link is bolded news ✔ test: results list should have expected properties (267ms) ✔ bs: results list should have expected properties (205ms) ✔ da: results list should have expected properties (174ms) ✔ de: results list should have expected properties (143ms) ✔ el: results list should have expected properties (237ms) ✔ en: results list should have expected properties (113ms) ✔ es: results list should have expected properties (201ms) ✔ fi: results list should have expected properties (245ms) ✔ fr: results list should have expected properties (281ms) ✔ he: results list should have expected properties (280ms) ✔ ko: results list should have expected properties (222ms) ✔ no: results list should have expected properties (121ms) ✔ pl: results list should have expected properties (289ms) ✔ pt: results list should have expected properties (267ms) ✔ ru: results list should have expected properties (315ms) ✔ sco: results list should have expected properties (117ms) ✔ sv: results list should have expected properties (212ms) ✔ vi: results list should have expected properties (127ms) onthisday ✔ all: unsupported language throws 404 ✔ selected: unsupported language throws 404 ✔ selected: fetches some results (296ms) ✔ births: unsupported language throws 404 ✔ births: fetches some results (1534ms) ✔ deaths: unsupported language throws 404 ✔ deaths: fetches some results (1477ms) ✔ events: unsupported language throws 404 ✔ events: fetches some results (1134ms) ✔ holidays: unsupported language throws 404 ✔ holidays: fetches some results (652ms) ✔ "all" fetches some results for births, deaths, events, holidays and selected (2597ms) ✔ filters out duplicate articles from pages (2529ms) random/title ✔ pickBestResult should select best-scored title from sample ✔ redirects to the right format with random title - html (81ms) ✔ redirects to the right format with random title - invalid format ✔ returns 404 for yue.wikipedia.org stopping test server lib:announcements ✔ should return no announcement for inactive wiki ✔ should return one or more announcements for active wiki lib:announcements:etc ✔ should return no image_url ✔ should return correct type ✔ countries is an array of strings ✔ should not deliver HTML in certain legacy iOS announcements fields ✔ iOS legacy fundraising announcement should have the proper platform ID ✔ iOS fundraising announcement should have the proper platform ID ✔ should deliver HTML in certain V2 announcements fields ✔ caption_HTML on iOS should be inside a paragraph ✔ caption_HTML on Android should not be inside a paragraph ✔ should return no image_url ✔ should return correct type ✔ countries is an array of strings ✔ should not deliver HTML in certain legacy iOS announcements fields ✔ iOS legacy fundraising announcement should have the proper platform ID ✔ iOS fundraising announcement should have the proper platform ID ✔ should deliver HTML in certain V2 announcements fields ✔ caption_HTML on iOS should be inside a paragraph ✔ caption_HTML on Android should not be inside a paragraph ✔ should return no image_url ✔ should return correct type ✔ countries is an array of strings ✔ should not deliver HTML in certain legacy iOS announcements fields ✔ iOS legacy fundraising announcement should have the proper platform ID ✔ iOS fundraising announcement should have the proper platform ID ✔ should deliver HTML in certain V2 announcements fields ✔ caption_HTML on iOS should be inside a paragraph ✔ caption_HTML on Android should not be inside a paragraph ✔ should return no image_url ✔ should return correct type ✔ countries is an array of strings ✔ should not deliver HTML in certain legacy iOS announcements fields ✔ iOS legacy fundraising announcement should have the proper platform ID ✔ iOS fundraising announcement should have the proper platform ID ✔ should deliver HTML in certain V2 announcements fields ✔ caption_HTML on iOS should be inside a paragraph ✔ caption_HTML on Android should not be inside a paragraph ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters .hasEnded ✔ invalid endTime ✔ endTime has passed ✔ endTime has not passed yet announcements-unit-config ✔ all dates should be valid MW core page HTML ✔ fetches the core page html output only with title in params ✔ fetches the core page html output with revision in params featured-unit ✔ isSupported should return the correct boolean ✔ findPageTitle should find the first bold link: a inside b ✔ findPageTitle should find the first bold link: b inside a ✔ findPageTitle should return undefined if nothing found featured-image-unit ✔ structureExtMetadataValue returns description for preferred lang if present ✔ structureExtMetadataValue falls back to en description if preferred lang not present ✔ structureExtMetadataValue returns lang undefined for type of value equals to string ✔ structureExtMetadataValue returns undefined for undefined input news-unit ✔ news story constructed correctly (duplicate titles handled correctly) ✔ floating spans are removed onthisday-unit ✔ eventsForYearListElements returns a WMFEvent for only year list elements ✔ Sort year list events in correct BC[E] aware manner page title generation: titleForDayPageFromMonthDayNumberStrings ✔ 1 digit mm and 1 digit dd ✔ 0 padded mm and 1 digit dd ✔ 0 padded mm and 0 padded dd day page URI generation: dayTitleForRequest ✔ returns expected title for 0 padded month and 2 digit day ✔ returns expected title for 2 digit month and 0 padded day ✔ returns expected title for 1 digit month and 1 digit day selected page URI generation: selectedTitleForRequest ✔ returns expected title for 0 padded month and 2 digit day ✔ returns expected title for 2 digit month and 0 padded day ✔ returns expected title for 1 digit month and 1 digit day anchor to WMFPage transforms: wmfPageFromAnchorElement ✔ WMFPage model object is correctly created from a topic anchor ✔ WMFPage model object is correctly created from a non-topic anchor wmfEventFromListElement: WMFEvent model object is correctly created ✔ from a selected list element ✔ from a birth list element ✔ from an event list element ✔ from a death list element ✔ from a birth list element ✔ from a selected div element on zhwiki ✔ wmfEventFromListElement should return null for elements not describing events wmfHolidayFromListElement: WMFHoliday model object is correctly created ✔ WMFHoliday model object is correctly created from a holiday list element yearListElementRegEx ✔ rejects malformed BC strings ✔ accepts well formed BC strings ✔ accepts well formed BCE strings ✔ accepts well formed CE strings ✔ accepts well formed year strings (no BCE/AD/CE) ✔ accepts well formed AD strings ✔ extracts expected BC/BCE strings ✔ extracts expected BC/BCE strings in Chinese ✔ AD strings should not be negated ✔ rejects non year list strings ✔ rejects strings missing text listElementsByHeadingID extracts expected number of births from ✔ DE fixture (76ms) ✔ EN fixture (54ms) ✔ AR fixture (38ms) ✔ BS fixture nested list element handling ✔ listElementsByHeadingID extracts expected number of holidays from EN fixture ✔ expected textContent for a list item NOT nested within another list item ✔ expected textContent for a list item nested within another list item ✔ expected textContent for list items nested within a year-dash list item ✔ expected textContent for list items nested within a year list item (no dash) addPrefixFromAncestorListElementsToListElement ✔ expected extraction from ancestor year element ✔ expected extraction from multiline ancestor year element ✔ expected extraction from ancestor year element with dash ✔ expected extraction from ancestor year element with dash space ✔ expected extraction from multiline ancestor year element with dash ✔ expected extraction from multiline non-year ancestor ✔ expected extraction from double-nested list element ✔ expected extraction from triple-nested list element ✔ expected extraction from nested Russian list element with "год" ✔ Prefixed text content from ancestor element is escaped isAnchorForYear ✔ correctly identifies anchor linking to year article ✔ correctly rejects anchor linking article starting with a year ✔ correctly rejects anchor linking article starting with a number ✔ correctly rejects anchor linking article not starting with a year ✔ correctly identifies anchor linking to year article with an era string ✔ correctly identifies anchor linking to year article with era string w/o space external urls should be excluded ✔ exclude external url from WMFHoliday pages ✔ exclude external url from WMFEvent pages style tags should be dropped ✔ exclude style tags random ✔ pickBestResult should select best-scored title from sample util ✔ promiseAwaitAll, ignoreRejected ✔ promiseAwaitAll, propagate rejected removeDuplicateTitles ✔ deduplicates and applies update function 285 passing (54s) 1 pending --- end --- $ /usr/bin/npm audit --json --- stdout --- { "auditReportVersion": 2, "vulnerabilities": { "cross-spawn": { "name": "cross-spawn", "severity": "high", "isDirect": false, "via": [ { "source": 1100562, "name": "cross-spawn", "dependency": "cross-spawn", "title": "Regular Expression Denial of Service (ReDoS) in cross-spawn", "url": "https://github.com/advisories/GHSA-3xgq-45jj-v275", "severity": "high", "cwe": [ "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<6.0.6" } ], "effects": [ "pre-commit" ], "range": "<6.0.6", "nodes": [ "node_modules/pre-commit/node_modules/cross-spawn" ], "fixAvailable": { "name": "pre-commit", "version": "1.0.10", "isSemVerMajor": true } }, "limitation": { "name": "limitation", "severity": "moderate", "isDirect": false, "via": [ "wikimedia-kad-fork" ], "effects": [ "service-runner" ], "range": ">=0.2.3", "nodes": [ "node_modules/limitation" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } }, "ms": { "name": "ms", "severity": "moderate", "isDirect": false, "via": [ { "source": 1094419, "name": "ms", "dependency": "ms", "title": "Vercel ms Inefficient Regular Expression Complexity vulnerability", "url": "https://github.com/advisories/GHSA-w9mr-4mfr-499f", "severity": "moderate", "cwe": [ "CWE-1333" ], "cvss": { "score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L" }, "range": "<2.0.0" } ], "effects": [ "wikimedia-kad-fork" ], "range": "<2.0.0", "nodes": [ "node_modules/wikimedia-kad-fork/node_modules/ms" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } }, "pre-commit": { "name": "pre-commit", "severity": "high", "isDirect": true, "via": [ "cross-spawn" ], "effects": [], "range": ">=1.1.0", "nodes": [ "node_modules/pre-commit" ], "fixAvailable": { "name": "pre-commit", "version": "1.0.10", "isSemVerMajor": true } }, "preq": { "name": "preq", "severity": "high", "isDirect": true, "via": [ "request", "requestretry" ], "effects": [], "range": "*", "nodes": [ "node_modules/preq" ], "fixAvailable": false }, "request": { "name": "request", "severity": "moderate", "isDirect": false, "via": [ { "source": 1096727, "name": "request", "dependency": "request", "title": "Server-Side Request Forgery in Request", "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6", "severity": "moderate", "cwe": [ "CWE-918" ], "cvss": { "score": 6.1, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N" }, "range": "<=2.88.2" }, "tough-cookie" ], "effects": [ "preq", "requestretry" ], "range": "*", "nodes": [ "node_modules/request" ], "fixAvailable": false }, "requestretry": { "name": "requestretry", "severity": "high", "isDirect": false, "via": [ { "source": 1090420, "name": "requestretry", "dependency": "requestretry", "title": "Cookie exposure in requestretry", "url": "https://github.com/advisories/GHSA-hjp8-2cm3-cc45", "severity": "high", "cwe": [ "CWE-200" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N" }, "range": "<7.0.0" }, "request" ], "effects": [ "preq" ], "range": "*", "nodes": [ "node_modules/requestretry" ], "fixAvailable": false }, "service-runner": { "name": "service-runner", "severity": "moderate", "isDirect": true, "via": [ "limitation", "tar" ], "effects": [], "range": ">=3.0.0", "nodes": [ "node_modules/service-runner" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } }, "tar": { "name": "tar", "severity": "moderate", "isDirect": false, "via": [ { "source": 1097493, "name": "tar", "dependency": "tar", "title": "Denial of service while parsing a tar file due to lack of folders count validation", "url": "https://github.com/advisories/GHSA-f5x3-32g6-xq36", "severity": "moderate", "cwe": [ "CWE-400" ], "cvss": { "score": 6.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H" }, "range": "<6.2.1" } ], "effects": [ "service-runner" ], "range": "<6.2.1", "nodes": [ "node_modules/tar" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } }, "tough-cookie": { "name": "tough-cookie", "severity": "moderate", "isDirect": false, "via": [ { "source": 1097682, "name": "tough-cookie", "dependency": "tough-cookie", "title": "tough-cookie Prototype Pollution vulnerability", "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3", "severity": "moderate", "cwe": [ "CWE-1321" ], "cvss": { "score": 6.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N" }, "range": "<4.1.3" } ], "effects": [ "request" ], "range": "<4.1.3", "nodes": [ "node_modules/tough-cookie" ], "fixAvailable": false }, "wikimedia-kad-fork": { "name": "wikimedia-kad-fork", "severity": "moderate", "isDirect": false, "via": [ "ms" ], "effects": [ "limitation" ], "range": "*", "nodes": [ "node_modules/wikimedia-kad-fork" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } } }, "metadata": { "vulnerabilities": { "info": 0, "low": 0, "moderate": 7, "high": 4, "critical": 0, "total": 11 }, "dependencies": { "prod": 214, "dev": 419, "optional": 13, "peer": 1, "peerOptional": 0, "total": 644 } } } --- end --- Attempting to npm audit fix $ /usr/bin/npm audit fix --dry-run --only=dev --json --- stderr --- npm WARN invalid config only="dev" set in command line options npm WARN invalid config Must be one of: null, prod, production --- stdout --- { "added": 1, "removed": 0, "changed": 0, "audited": 645, "funding": 98, "audit": { "auditReportVersion": 2, "vulnerabilities": { "cross-spawn": { "name": "cross-spawn", "severity": "high", "isDirect": false, "via": [ { "source": 1100562, "name": "cross-spawn", "dependency": "cross-spawn", "title": "Regular Expression Denial of Service (ReDoS) in cross-spawn", "url": "https://github.com/advisories/GHSA-3xgq-45jj-v275", "severity": "high", "cwe": [ "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<6.0.6" } ], "effects": [ "pre-commit" ], "range": "<6.0.6", "nodes": [ "node_modules/pre-commit/node_modules/cross-spawn" ], "fixAvailable": { "name": "pre-commit", "version": "1.0.10", "isSemVerMajor": true } }, "limitation": { "name": "limitation", "severity": "moderate", "isDirect": false, "via": [ "wikimedia-kad-fork" ], "effects": [ "service-runner" ], "range": ">=0.2.3", "nodes": [ "node_modules/limitation" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } }, "ms": { "name": "ms", "severity": "moderate", "isDirect": false, "via": [ { "source": 1094419, "name": "ms", "dependency": "ms", "title": "Vercel ms Inefficient Regular Expression Complexity vulnerability", "url": "https://github.com/advisories/GHSA-w9mr-4mfr-499f", "severity": "moderate", "cwe": [ "CWE-1333" ], "cvss": { "score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L" }, "range": "<2.0.0" } ], "effects": [ "wikimedia-kad-fork" ], "range": "<2.0.0", "nodes": [ "node_modules/wikimedia-kad-fork/node_modules/ms" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } }, "pre-commit": { "name": "pre-commit", "severity": "high", "isDirect": true, "via": [ "cross-spawn" ], "effects": [], "range": ">=1.1.0", "nodes": [ "node_modules/pre-commit" ], "fixAvailable": { "name": "pre-commit", "version": "1.0.10", "isSemVerMajor": true } }, "preq": { "name": "preq", "severity": "high", "isDirect": true, "via": [ "request", "requestretry" ], "effects": [], "range": "*", "nodes": [ "node_modules/preq" ], "fixAvailable": false }, "request": { "name": "request", "severity": "moderate", "isDirect": false, "via": [ { "source": 1096727, "name": "request", "dependency": "request", "title": "Server-Side Request Forgery in Request", "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6", "severity": "moderate", "cwe": [ "CWE-918" ], "cvss": { "score": 6.1, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N" }, "range": "<=2.88.2" }, "tough-cookie" ], "effects": [ "preq", "requestretry" ], "range": "*", "nodes": [ "node_modules/request" ], "fixAvailable": false }, "requestretry": { "name": "requestretry", "severity": "high", "isDirect": false, "via": [ { "source": 1090420, "name": "requestretry", "dependency": "requestretry", "title": "Cookie exposure in requestretry", "url": "https://github.com/advisories/GHSA-hjp8-2cm3-cc45", "severity": "high", "cwe": [ "CWE-200" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N" }, "range": "<7.0.0" }, "request" ], "effects": [ "preq" ], "range": "*", "nodes": [ "node_modules/requestretry" ], "fixAvailable": false }, "service-runner": { "name": "service-runner", "severity": "moderate", "isDirect": true, "via": [ "limitation", "tar" ], "effects": [], "range": ">=3.0.0", "nodes": [ "node_modules/service-runner" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } }, "tar": { "name": "tar", "severity": "moderate", "isDirect": false, "via": [ { "source": 1097493, "name": "tar", "dependency": "tar", "title": "Denial of service while parsing a tar file due to lack of folders count validation", "url": "https://github.com/advisories/GHSA-f5x3-32g6-xq36", "severity": "moderate", "cwe": [ "CWE-400" ], "cvss": { "score": 6.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H" }, "range": "<6.2.1" } ], "effects": [ "service-runner" ], "range": "<6.2.1", "nodes": [ "node_modules/tar" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } }, "tough-cookie": { "name": "tough-cookie", "severity": "moderate", "isDirect": false, "via": [ { "source": 1097682, "name": "tough-cookie", "dependency": "tough-cookie", "title": "tough-cookie Prototype Pollution vulnerability", "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3", "severity": "moderate", "cwe": [ "CWE-1321" ], "cvss": { "score": 6.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N" }, "range": "<4.1.3" } ], "effects": [ "request" ], "range": "<4.1.3", "nodes": [ "node_modules/tough-cookie" ], "fixAvailable": false }, "wikimedia-kad-fork": { "name": "wikimedia-kad-fork", "severity": "moderate", "isDirect": false, "via": [ "ms" ], "effects": [ "limitation" ], "range": "*", "nodes": [ "node_modules/wikimedia-kad-fork" ], "fixAvailable": { "name": "service-runner", "version": "6.0.0", "isSemVerMajor": true } } }, "metadata": { "vulnerabilities": { "info": 0, "low": 0, "moderate": 7, "high": 4, "critical": 0, "total": 11 }, "dependencies": { "prod": 214, "dev": 419, "optional": 13, "peer": 1, "peerOptional": 0, "total": 644 } } } } --- end --- {"added": 1, "removed": 0, "changed": 0, "audited": 645, "funding": 98, "audit": {"auditReportVersion": 2, "vulnerabilities": {"cross-spawn": {"name": "cross-spawn", "severity": "high", "isDirect": false, "via": [{"source": 1100562, "name": "cross-spawn", "dependency": "cross-spawn", "title": "Regular Expression Denial of Service (ReDoS) in cross-spawn", "url": "https://github.com/advisories/GHSA-3xgq-45jj-v275", "severity": "high", "cwe": ["CWE-1333"], "cvss": {"score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": "<6.0.6"}], "effects": ["pre-commit"], "range": "<6.0.6", "nodes": ["node_modules/pre-commit/node_modules/cross-spawn"], "fixAvailable": {"name": "pre-commit", "version": "1.0.10", "isSemVerMajor": true}}, "limitation": {"name": "limitation", "severity": "moderate", "isDirect": false, "via": ["wikimedia-kad-fork"], "effects": ["service-runner"], "range": ">=0.2.3", "nodes": ["node_modules/limitation"], "fixAvailable": {"name": "service-runner", "version": "6.0.0", "isSemVerMajor": true}}, "ms": {"name": "ms", "severity": "moderate", "isDirect": false, "via": [{"source": 1094419, "name": "ms", "dependency": "ms", "title": "Vercel ms Inefficient Regular Expression Complexity vulnerability", "url": "https://github.com/advisories/GHSA-w9mr-4mfr-499f", "severity": "moderate", "cwe": ["CWE-1333"], "cvss": {"score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"}, "range": "<2.0.0"}], "effects": ["wikimedia-kad-fork"], "range": "<2.0.0", "nodes": ["node_modules/wikimedia-kad-fork/node_modules/ms"], "fixAvailable": {"name": "service-runner", "version": "6.0.0", "isSemVerMajor": true}}, "pre-commit": {"name": "pre-commit", "severity": "high", "isDirect": true, "via": ["cross-spawn"], "effects": [], "range": ">=1.1.0", "nodes": ["node_modules/pre-commit"], "fixAvailable": {"name": "pre-commit", "version": "1.0.10", "isSemVerMajor": true}}, "preq": {"name": "preq", "severity": "high", "isDirect": true, "via": ["request", "requestretry"], "effects": [], "range": "*", "nodes": ["node_modules/preq"], "fixAvailable": false}, "request": {"name": "request", "severity": "moderate", "isDirect": false, "via": [{"source": 1096727, "name": "request", "dependency": "request", "title": "Server-Side Request Forgery in Request", "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6", "severity": "moderate", "cwe": ["CWE-918"], "cvss": {"score": 6.1, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"}, "range": "<=2.88.2"}, "tough-cookie"], "effects": ["preq", "requestretry"], "range": "*", "nodes": ["node_modules/request"], "fixAvailable": false}, "requestretry": {"name": "requestretry", "severity": "high", "isDirect": false, "via": [{"source": 1090420, "name": "requestretry", "dependency": "requestretry", "title": "Cookie exposure in requestretry", "url": "https://github.com/advisories/GHSA-hjp8-2cm3-cc45", "severity": "high", "cwe": ["CWE-200"], "cvss": {"score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N"}, "range": "<7.0.0"}, "request"], "effects": ["preq"], "range": "*", "nodes": ["node_modules/requestretry"], "fixAvailable": false}, "service-runner": {"name": "service-runner", "severity": "moderate", "isDirect": true, "via": ["limitation", "tar"], "effects": [], "range": ">=3.0.0", "nodes": ["node_modules/service-runner"], "fixAvailable": {"name": "service-runner", "version": "6.0.0", "isSemVerMajor": true}}, "tar": {"name": "tar", "severity": "moderate", "isDirect": false, "via": [{"source": 1097493, "name": "tar", "dependency": "tar", "title": "Denial of service while parsing a tar file due to lack of folders count validation", "url": "https://github.com/advisories/GHSA-f5x3-32g6-xq36", "severity": "moderate", "cwe": ["CWE-400"], "cvss": {"score": 6.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H"}, "range": "<6.2.1"}], "effects": ["service-runner"], "range": "<6.2.1", "nodes": ["node_modules/tar"], "fixAvailable": {"name": "service-runner", "version": "6.0.0", "isSemVerMajor": true}}, "tough-cookie": {"name": "tough-cookie", "severity": "moderate", "isDirect": false, "via": [{"source": 1097682, "name": "tough-cookie", "dependency": "tough-cookie", "title": "tough-cookie Prototype Pollution vulnerability", "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3", "severity": "moderate", "cwe": ["CWE-1321"], "cvss": {"score": 6.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N"}, "range": "<4.1.3"}], "effects": ["request"], "range": "<4.1.3", "nodes": ["node_modules/tough-cookie"], "fixAvailable": false}, "wikimedia-kad-fork": {"name": "wikimedia-kad-fork", "severity": "moderate", "isDirect": false, "via": ["ms"], "effects": ["limitation"], "range": "*", "nodes": ["node_modules/wikimedia-kad-fork"], "fixAvailable": {"name": "service-runner", "version": "6.0.0", "isSemVerMajor": true}}}, "metadata": {"vulnerabilities": {"info": 0, "low": 0, "moderate": 7, "high": 4, "critical": 0, "total": 11}, "dependencies": {"prod": 214, "dev": 419, "optional": 13, "peer": 1, "peerOptional": 0, "total": 644}}}} $ /usr/bin/npm audit fix --only=dev --- stderr --- npm WARN invalid config only="dev" set in command line options npm WARN invalid config Must be one of: null, prod, production --- stdout --- up to date, audited 644 packages in 2s 98 packages are looking for funding run `npm fund` for details # npm audit report cross-spawn <6.0.6 Severity: high Regular Expression Denial of Service (ReDoS) in cross-spawn - https://github.com/advisories/GHSA-3xgq-45jj-v275 fix available via `npm audit fix --force` Will install pre-commit@1.0.10, which is a breaking change node_modules/pre-commit/node_modules/cross-spawn pre-commit >=1.1.0 Depends on vulnerable versions of cross-spawn node_modules/pre-commit ms <2.0.0 Severity: moderate Vercel ms Inefficient Regular Expression Complexity vulnerability - https://github.com/advisories/GHSA-w9mr-4mfr-499f fix available via `npm audit fix --force` Will install service-runner@6.0.0, which is a breaking change node_modules/wikimedia-kad-fork/node_modules/ms wikimedia-kad-fork * Depends on vulnerable versions of ms node_modules/wikimedia-kad-fork limitation >=0.2.3 Depends on vulnerable versions of wikimedia-kad-fork node_modules/limitation service-runner >=3.0.0 Depends on vulnerable versions of limitation Depends on vulnerable versions of tar node_modules/service-runner request * Severity: moderate Server-Side Request Forgery in Request - https://github.com/advisories/GHSA-p8p7-x288-28g6 Depends on vulnerable versions of tough-cookie No fix available node_modules/request preq * Depends on vulnerable versions of request Depends on vulnerable versions of requestretry node_modules/preq requestretry * Depends on vulnerable versions of request node_modules/requestretry tar <6.2.1 Severity: moderate Denial of service while parsing a tar file due to lack of folders count validation - https://github.com/advisories/GHSA-f5x3-32g6-xq36 fix available via `npm audit fix --force` Will install service-runner@6.0.0, which is a breaking change node_modules/tar tough-cookie <4.1.3 Severity: moderate tough-cookie Prototype Pollution vulnerability - https://github.com/advisories/GHSA-72xf-g2v4-qvf3 No fix available node_modules/tough-cookie 11 vulnerabilities (7 moderate, 4 high) To address all issues possible (including breaking changes), run: npm audit fix --force Some issues need review, and may require choosing a different dependency. --- end --- Verifying that tests still pass $ /usr/bin/npm ci --- stderr --- npm WARN deprecated kad-fs@0.0.4: This package is no longer maintained. npm WARN deprecated har-validator@5.1.5: this library is no longer supported npm WARN deprecated kad-memstore@0.0.1: This package is no longer maintained. npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 --- stdout --- added 643 packages, and audited 644 packages in 9s 98 packages are looking for funding run `npm fund` for details 11 vulnerabilities (7 moderate, 4 high) To address all issues possible (including breaking changes), run: npm audit fix --force Some issues need review, and may require choosing a different dependency. Run `npm audit` for details. --- end --- $ /usr/bin/npm test --- stderr --- strict mode: missing type "object" for keyword "required" at "#/definitions/problem#" (strictTypes) strict mode: missing type "object" for keyword "properties" at "#/definitions/problem#" (strictTypes) --- stdout --- > @wikimedia/wikifeeds@1.0.0 test > npm run lint && PREQ_CONNECT_TIMEOUT=15 mocha --recursive > @wikimedia/wikifeeds@1.0.0 lint > eslint . /src/repo/.eslintrc.json 1:1 warning Use the global form of 'use strict' strict /src/repo/app.js 20:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types 64:37 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 136:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 138:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types 150:31 warning Found non-literal argument in require security/detect-non-literal-require 197:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 198:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types 236:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types /src/repo/etc/news-sites.js 4:1 warning At most one access-control tag may be present on a jsdoc block jsdoc/check-access 5:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 6:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 50:1 warning Syntax error in type: {Object.<string, NewsSite>} jsdoc/valid-types /src/repo/lib/announcements.js 30:1 warning Expected this semicolon to be at the end of the previous line semi-style 34:1 warning This line has a length of 123. Maximum allowed is 100 max-len 51:1 warning This line has a length of 134. Maximum allowed is 100 max-len 84:1 warning This line has a length of 119. Maximum allowed is 100 max-len 86:1 warning This line has a length of 118. Maximum allowed is 100 max-len 135:1 warning This line has a length of 123. Maximum allowed is 100 max-len /src/repo/lib/api-util.js 300:1 warning The type 'Application' is undefined jsdoc/no-undefined-types /src/repo/lib/featured.js 136:12 warning 'si' is already declared in the upper scope on line 12 column 7 no-shadow /src/repo/lib/imageinfo.js 30:1 warning The type 'Bool' is undefined jsdoc/no-undefined-types 85:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 132:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 203:43 warning Array.prototype.map() expects a return value from arrow function array-callback-return 280:1 warning Syntax error in type: [type] jsdoc/valid-types 282:1 warning Syntax error in type: [type] jsdoc/valid-types /src/repo/lib/most-read.js 79:1 warning At most one access-control tag may be present on a jsdoc block jsdoc/check-access 80:1 warning @public should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 81:1 warning @public should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 98:1 warning This line has a length of 122. Maximum allowed is 100 max-len 113:28 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 114:1 warning This line has a length of 112. Maximum allowed is 100 max-len 143:19 warning 'pageviews' is already declared in the upper scope on line 10 column 7 no-shadow 159:25 warning Array.prototype.map() expects a return value from arrow function array-callback-return 197:1 warning This line has a length of 144. Maximum allowed is 100 max-len 206:1 warning This line has a length of 113. Maximum allowed is 100 max-len /src/repo/lib/news.js 15:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 73:12 warning 'si' is already declared in the upper scope on line 8 column 7 no-shadow 96:20 warning 'result' is already declared in the upper scope on line 80 column 19 no-shadow /src/repo/lib/on-this-day.js 34:1 warning The type 'Integer' is undefined jsdoc/no-undefined-types 122:1 warning The type 'AnchorElement' is undefined jsdoc/no-undefined-types 123:1 warning The type 'Integer' is undefined jsdoc/no-undefined-types 128:12 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 141:1 warning The type 'AnchorElement' is undefined jsdoc/no-undefined-types 161:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 173:1 warning The type 'AnchorElement' is undefined jsdoc/no-undefined-types 196:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 241:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 257:1 warning The type 'Integer' is undefined jsdoc/no-undefined-types 296:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 307:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 308:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 329:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 347:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 367:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 399:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 413:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 427:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 441:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 455:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 470:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 471:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 530:1 warning Missing JSDoc @param "sendResponse" type jsdoc/require-param-type /src/repo/lib/on-this-day.languages.js 28:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 30:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 32:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 60:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 62:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 64:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 100:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 102:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 104:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 128:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 130:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 132:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 156:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 158:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 160:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 189:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 191:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 193:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 217:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 219:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 221:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 245:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 247:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 249:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 273:13 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 275:13 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 277:13 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 301:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 303:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 305:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 335:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 337:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 339:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 362:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 364:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 366:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 390:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 392:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp /src/repo/lib/pageviews.js 36:1 warning At most one access-control tag may be present on a jsdoc block jsdoc/check-access 37:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 38:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 39:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 53:1 warning The type 'Platform' is undefined jsdoc/no-undefined-types 54:1 warning The type 'Agent' is undefined jsdoc/no-undefined-types 56:1 warning The type 'Granularity' is undefined jsdoc/no-undefined-types 71:1 warning The type 'Platform' is undefined jsdoc/no-undefined-types /src/repo/lib/random.js 38:9 warning 'score' is already declared in the upper scope on line 31 column 10 no-shadow 55:1 warning Missing JSDoc @param "scoredResults" type jsdoc/require-param-type /src/repo/lib/siteinfo.js 3:1 warning Use the global form of 'use strict' strict 10:29 warning Unsafe Regular Expression security/detect-unsafe-regex /src/repo/lib/util.js 104:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 142:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 222:1 warning The type 'Router' is undefined jsdoc/no-undefined-types 280:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 293:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 306:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 378:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 450:34 warning Default parameters should be last default-param-last /src/repo/package-lock.json 1:1 warning Use the global form of 'use strict' strict /src/repo/package.json 1:1 warning Use the global form of 'use strict' strict /src/repo/scripts/check-featured-feed.js 49:35 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 82:44 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 107:34 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 150:30 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 217:5 warning Don't use process.exit(); throw an error instead n/no-process-exit /src/repo/spec.yaml 228:1 warning This line has a length of 154. Maximum allowed is 100 max-len 232:1 warning This line has a length of 141. Maximum allowed is 100 max-len 866:1 warning This line has a length of 117. Maximum allowed is 100 max-len 871:1 warning This line has a length of 116. Maximum allowed is 100 max-len 876:1 warning This line has a length of 116. Maximum allowed is 100 max-len 881:1 warning This line has a length of 116. Maximum allowed is 100 max-len 886:1 warning This line has a length of 116. Maximum allowed is 100 max-len 938:1 warning This line has a length of 108. Maximum allowed is 100 max-len 955:1 warning This line has a length of 126. Maximum allowed is 100 max-len 956:1 warning This line has a length of 107. Maximum allowed is 100 max-len 962:1 warning This line has a length of 132. Maximum allowed is 100 max-len 969:1 warning This line has a length of 127. Maximum allowed is 100 max-len 971:1 warning This line has a length of 108. Maximum allowed is 100 max-len 972:1 warning This line has a length of 113. Maximum allowed is 100 max-len 973:1 warning This line has a length of 121. Maximum allowed is 100 max-len 977:1 warning This line has a length of 121. Maximum allowed is 100 max-len 981:1 warning This line has a length of 113. Maximum allowed is 100 max-len 985:1 warning This line has a length of 111. Maximum allowed is 100 max-len 991:1 warning This line has a length of 124. Maximum allowed is 100 max-len 995:1 warning This line has a length of 281. Maximum allowed is 100 max-len 1082:1 warning This line has a length of 144. Maximum allowed is 100 max-len ✖ 150 problems (0 errors, 150 warnings) aggregated featured starting test server ✔ should return 200 for a valid request (960ms) ✔ should return 404 for an invalid year ✔ should return 404 for an invalid month ✔ should return 404 for an invalid day ✔ should return only historic keys for past date (645ms) ✔ should return current keys for today (643ms) ✔ should return future keys for tomorrow (311ms) aggregate onthisday ✔ should return 200 for a valid request (4019ms) ✔ should return 404 for an invalid month (1747ms) ✔ should return 404 for an invalid day (103ms) ✔ should return objects with the expected keys (2807ms) express app ✔ should get robots.txt ✔ should set CORS headers ✔ should set CSP headers ✔ should get static content gzipped ✔ should get static content uncompressed Swagger spec ✔ get the spec ✔ spec validation validate responses against schema - random response should conform to schema ✔ featured article response should conform to schema (428ms) ✔ featured image response should conform to schema (180ms) ✔ most-read response should conform to schema (314ms) ✔ news response should conform to schema (135ms) ✔ announcements should conform to schema ✔ onthisday response should conform to schema (4211ms) ✔ featured article response should conform to schema (invalid lang, agg=true) ✔ featured image response should conform to schema (invalid date, agg=true) ✔ most-read response should conform to schema (invalid date, agg=true) ✔ news response (invalid language, agg=true) should be empty ✔ featured article request should fail for invalid language when !agg=true ✔ featured image request should fail for invalid date when !agg=true ✔ most-read request should fail for invalid date when !agg=true ✔ news request should fail for invalid language when !agg=true validate spec examples ✔ spec from root ✔ retrieve service info ✔ Retrieve feed content availability from \'wikipedia.org\' ✔ Retrieve announcements ✔ retrieve selected events on January 15 (370ms) ✔ retrieve title of the featured article for April 29, 2016 (189ms) ✔ retrieve featured article info for unsupported site (with aggregated=true) ✔ retrieve featured image data for April 29, 2016 (190ms) ✔ retrieve the most read articles for January 1, 2016 (309ms) ✔ retrieve the most-read articles for January 1, 2016 (with aggregated=true) (556ms) ✔ retrieve most-read articles for date with no data (with aggregated=true) ✔ get 'In the News' content (133ms) ✔ get "In the News" content for unsupported language (with aggregated=true) ✔ retrieve a random article title (78ms) featured ✔ incomplete date should return 404 ✔ extra uri path parameter after date should return 404 ✔ Missing TFA should return 204 (361ms) ✔ Missing TFA with aggregated=true should return 204 (192ms) ✔ featured article of an old date should return 404 featured-image-lang ✔ bg description (311ms) ✔ bn description (300ms) ✔ bs description (724ms) ✔ cs description (326ms) ✔ de description (302ms) ✔ el description (266ms) ✔ en description (215ms) ✔ fa description (480ms) ✔ he description (265ms) ✔ hu description (294ms) ✔ it description (283ms) ✔ ja description (328ms) ✔ la description (15327ms) ✔ no description (1590ms) ✔ sco description (272ms) ✔ sd description (272ms) ✔ sv description (295ms) ✔ tr description (409ms) ✔ ur description (347ms) ✔ vi description (299ms) ✔ zh description (283ms) featured-image ✔ incomplete date should return 404 ✔ extra uri path parameter after date should return 404 service information ✔ should get the service name ✔ should get the service version ✔ should redirect to the service home page ✔ should get the service info most-read articles ✔ Should provide pageviews from day prior when aggregated flag is set (365ms) ✔ Should drop duplicate pageviews (399ms) ✔ Should filter out missing summaries (446ms) ✔ Should return 204 for fywiki requests ✔ main page filtering RegExp should handle all main page title chars ✔ Should filter out blocked titles from some languages, but not others ✔ Should filter out certain blocked titles from all wikis most-read articles ✔ Should return 200 even if title has invalid utf8 encoding (392ms) ✔ Should filter-out invalid utf8 encoding news headline selectors ✔ test news headlines should be general not categorical ✔ test news headline topics should be nonnull ✔ bs news headlines should be general not categorical ✔ bs news headline topics should be nonnull ✔ da news headlines should be general not categorical ✔ da news headline topics should be nonnull ✔ de news headlines should be general not categorical ✔ de news headline topics should be nonnull ✔ el news headlines should be general not categorical ✔ el news headline topics should be nonnull ✔ en news headlines should be general not categorical ✔ en news headline topics should be nonnull ✔ es news headlines should be general not categorical ✔ es news headline topics should be nonnull ✔ fi news headlines should be general not categorical ✔ fi news headline topics should be nonnull ✔ fr news headlines should be general not categorical ✔ fr news headline topics should be nonnull ✔ he news headlines should be general not categorical ✔ he news headline topics should be nonnull ✔ ko news headlines should be general not categorical ✔ ko news headline topics should be nonnull ✔ no news headlines should be general not categorical ✔ no news headline topics should be nonnull ✔ pl news headlines should be general not categorical ✔ pl news headline topics should be nonnull ✔ pt news headlines should be general not categorical ✔ pt news headline topics should be nonnull ✔ ru news headlines should be general not categorical ✔ ru news headline topics should be nonnull ✔ sco news headlines should be general not categorical ✔ sco news headline topics should be nonnull ✔ sv news headlines should be general not categorical ✔ sv news headline topics should be nonnull ✔ vi news headlines should be general not categorical ✔ vi news headline topics should be nonnull ✔ news headline topic should be the first bold link ✔ news headline topic should be the first link when no link is bolded news ✔ test: results list should have expected properties (165ms) ✔ bs: results list should have expected properties (227ms) ✔ da: results list should have expected properties (156ms) ✔ de: results list should have expected properties (100ms) ✔ el: results list should have expected properties (113ms) ✔ en: results list should have expected properties (103ms) ✔ es: results list should have expected properties (143ms) ✔ fi: results list should have expected properties (212ms) ✔ fr: results list should have expected properties (197ms) ✔ he: results list should have expected properties (97ms) ✔ ko: results list should have expected properties (185ms) ✔ no: results list should have expected properties (98ms) ✔ pl: results list should have expected properties (107ms) ✔ pt: results list should have expected properties (180ms) ✔ ru: results list should have expected properties (231ms) ✔ sco: results list should have expected properties (38ms) ✔ sv: results list should have expected properties (67ms) ✔ vi: results list should have expected properties (44ms) onthisday ✔ all: unsupported language throws 404 ✔ selected: unsupported language throws 404 ✔ selected: fetches some results (339ms) ✔ births: unsupported language throws 404 ✔ births: fetches some results (1441ms) ✔ deaths: unsupported language throws 404 ✔ deaths: fetches some results (911ms) ✔ events: unsupported language throws 404 ✔ events: fetches some results (1064ms) ✔ holidays: unsupported language throws 404 ✔ holidays: fetches some results (383ms) ✔ "all" fetches some results for births, deaths, events, holidays and selected (2428ms) ✔ filters out duplicate articles from pages (2256ms) random/title ✔ pickBestResult should select best-scored title from sample ✔ redirects to the right format with random title - html (81ms) ✔ redirects to the right format with random title - invalid format ✔ returns 404 for yue.wikipedia.org stopping test server lib:announcements ✔ should return no announcement for inactive wiki ✔ should return one or more announcements for active wiki lib:announcements:etc ✔ should return no image_url ✔ should return correct type ✔ countries is an array of strings ✔ should not deliver HTML in certain legacy iOS announcements fields ✔ iOS legacy fundraising announcement should have the proper platform ID ✔ iOS fundraising announcement should have the proper platform ID ✔ should deliver HTML in certain V2 announcements fields ✔ caption_HTML on iOS should be inside a paragraph ✔ caption_HTML on Android should not be inside a paragraph ✔ should return no image_url ✔ should return correct type ✔ countries is an array of strings ✔ should not deliver HTML in certain legacy iOS announcements fields ✔ iOS legacy fundraising announcement should have the proper platform ID ✔ iOS fundraising announcement should have the proper platform ID ✔ should deliver HTML in certain V2 announcements fields ✔ caption_HTML on iOS should be inside a paragraph ✔ caption_HTML on Android should not be inside a paragraph ✔ should return no image_url ✔ should return correct type ✔ countries is an array of strings ✔ should not deliver HTML in certain legacy iOS announcements fields ✔ iOS legacy fundraising announcement should have the proper platform ID ✔ iOS fundraising announcement should have the proper platform ID ✔ should deliver HTML in certain V2 announcements fields ✔ caption_HTML on iOS should be inside a paragraph ✔ caption_HTML on Android should not be inside a paragraph ✔ should return no image_url ✔ should return correct type ✔ countries is an array of strings ✔ should not deliver HTML in certain legacy iOS announcements fields ✔ iOS legacy fundraising announcement should have the proper platform ID ✔ iOS fundraising announcement should have the proper platform ID ✔ should deliver HTML in certain V2 announcements fields ✔ caption_HTML on iOS should be inside a paragraph ✔ caption_HTML on Android should not be inside a paragraph ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters .hasEnded ✔ invalid endTime ✔ endTime has passed ✔ endTime has not passed yet announcements-unit-config ✔ all dates should be valid MW core page HTML ✔ fetches the core page html output only with title in params ✔ fetches the core page html output with revision in params featured-unit ✔ isSupported should return the correct boolean ✔ findPageTitle should find the first bold link: a inside b ✔ findPageTitle should find the first bold link: b inside a ✔ findPageTitle should return undefined if nothing found featured-image-unit ✔ structureExtMetadataValue returns description for preferred lang if present ✔ structureExtMetadataValue falls back to en description if preferred lang not present ✔ structureExtMetadataValue returns lang undefined for type of value equals to string ✔ structureExtMetadataValue returns undefined for undefined input news-unit ✔ news story constructed correctly (duplicate titles handled correctly) ✔ floating spans are removed onthisday-unit ✔ eventsForYearListElements returns a WMFEvent for only year list elements ✔ Sort year list events in correct BC[E] aware manner page title generation: titleForDayPageFromMonthDayNumberStrings ✔ 1 digit mm and 1 digit dd ✔ 0 padded mm and 1 digit dd ✔ 0 padded mm and 0 padded dd day page URI generation: dayTitleForRequest ✔ returns expected title for 0 padded month and 2 digit day ✔ returns expected title for 2 digit month and 0 padded day ✔ returns expected title for 1 digit month and 1 digit day selected page URI generation: selectedTitleForRequest ✔ returns expected title for 0 padded month and 2 digit day ✔ returns expected title for 2 digit month and 0 padded day ✔ returns expected title for 1 digit month and 1 digit day anchor to WMFPage transforms: wmfPageFromAnchorElement ✔ WMFPage model object is correctly created from a topic anchor ✔ WMFPage model object is correctly created from a non-topic anchor wmfEventFromListElement: WMFEvent model object is correctly created ✔ from a selected list element ✔ from a birth list element ✔ from an event list element ✔ from a death list element ✔ from a birth list element ✔ from a selected div element on zhwiki ✔ wmfEventFromListElement should return null for elements not describing events wmfHolidayFromListElement: WMFHoliday model object is correctly created ✔ WMFHoliday model object is correctly created from a holiday list element yearListElementRegEx ✔ rejects malformed BC strings ✔ accepts well formed BC strings ✔ accepts well formed BCE strings ✔ accepts well formed CE strings ✔ accepts well formed year strings (no BCE/AD/CE) ✔ accepts well formed AD strings ✔ extracts expected BC/BCE strings ✔ extracts expected BC/BCE strings in Chinese ✔ AD strings should not be negated ✔ rejects non year list strings ✔ rejects strings missing text listElementsByHeadingID extracts expected number of births from ✔ DE fixture (58ms) ✔ EN fixture (78ms) ✔ AR fixture (38ms) ✔ BS fixture nested list element handling ✔ listElementsByHeadingID extracts expected number of holidays from EN fixture ✔ expected textContent for a list item NOT nested within another list item ✔ expected textContent for a list item nested within another list item ✔ expected textContent for list items nested within a year-dash list item ✔ expected textContent for list items nested within a year list item (no dash) addPrefixFromAncestorListElementsToListElement ✔ expected extraction from ancestor year element ✔ expected extraction from multiline ancestor year element ✔ expected extraction from ancestor year element with dash ✔ expected extraction from ancestor year element with dash space ✔ expected extraction from multiline ancestor year element with dash ✔ expected extraction from multiline non-year ancestor ✔ expected extraction from double-nested list element ✔ expected extraction from triple-nested list element ✔ expected extraction from nested Russian list element with "год" ✔ Prefixed text content from ancestor element is escaped isAnchorForYear ✔ correctly identifies anchor linking to year article ✔ correctly rejects anchor linking article starting with a year ✔ correctly rejects anchor linking article starting with a number ✔ correctly rejects anchor linking article not starting with a year ✔ correctly identifies anchor linking to year article with an era string ✔ correctly identifies anchor linking to year article with era string w/o space external urls should be excluded ✔ exclude external url from WMFHoliday pages ✔ exclude external url from WMFEvent pages style tags should be dropped ✔ exclude style tags random ✔ pickBestResult should select best-scored title from sample util ✔ promiseAwaitAll, ignoreRejected ✔ promiseAwaitAll, propagate rejected removeDuplicateTitles ✔ deduplicates and applies update function 285 passing (56s) 1 pending --- end --- $ package-lock-lint package-lock.json --- stdout --- Checking package-lock.json --- end --- build: Updating eslint-config-wikimedia to 0.29.1 $ git add . --- stdout --- --- end --- $ git commit -F /tmp/tmpjut7c7by --- stderr --- /src/repo/.eslintrc.json 1:1 warning Use the global form of 'use strict' strict /src/repo/app.js 20:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types 64:37 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 136:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 138:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types 150:31 warning Found non-literal argument in require security/detect-non-literal-require 197:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 198:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types 236:1 warning The type 'bluebird' is undefined jsdoc/no-undefined-types /src/repo/etc/news-sites.js 4:1 warning At most one access-control tag may be present on a jsdoc block jsdoc/check-access 5:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 6:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 50:1 warning Syntax error in type: {Object.<string, NewsSite>} jsdoc/valid-types /src/repo/lib/announcements.js 30:1 warning Expected this semicolon to be at the end of the previous line semi-style 34:1 warning This line has a length of 123. Maximum allowed is 100 max-len 51:1 warning This line has a length of 134. Maximum allowed is 100 max-len 84:1 warning This line has a length of 119. Maximum allowed is 100 max-len 86:1 warning This line has a length of 118. Maximum allowed is 100 max-len 135:1 warning This line has a length of 123. Maximum allowed is 100 max-len /src/repo/lib/api-util.js 300:1 warning The type 'Application' is undefined jsdoc/no-undefined-types /src/repo/lib/featured.js 136:12 warning 'si' is already declared in the upper scope on line 12 column 7 no-shadow /src/repo/lib/imageinfo.js 30:1 warning The type 'Bool' is undefined jsdoc/no-undefined-types 85:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 132:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 203:43 warning Array.prototype.map() expects a return value from arrow function array-callback-return 280:1 warning Syntax error in type: [type] jsdoc/valid-types 282:1 warning Syntax error in type: [type] jsdoc/valid-types /src/repo/lib/most-read.js 79:1 warning At most one access-control tag may be present on a jsdoc block jsdoc/check-access 80:1 warning @public should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 81:1 warning @public should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 98:1 warning This line has a length of 122. Maximum allowed is 100 max-len 113:28 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 114:1 warning This line has a length of 112. Maximum allowed is 100 max-len 143:19 warning 'pageviews' is already declared in the upper scope on line 10 column 7 no-shadow 159:25 warning Array.prototype.map() expects a return value from arrow function array-callback-return 197:1 warning This line has a length of 144. Maximum allowed is 100 max-len 206:1 warning This line has a length of 113. Maximum allowed is 100 max-len /src/repo/lib/news.js 15:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 73:12 warning 'si' is already declared in the upper scope on line 8 column 7 no-shadow 96:20 warning 'result' is already declared in the upper scope on line 80 column 19 no-shadow /src/repo/lib/on-this-day.js 34:1 warning The type 'Integer' is undefined jsdoc/no-undefined-types 122:1 warning The type 'AnchorElement' is undefined jsdoc/no-undefined-types 123:1 warning The type 'Integer' is undefined jsdoc/no-undefined-types 128:12 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 141:1 warning The type 'AnchorElement' is undefined jsdoc/no-undefined-types 161:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 173:1 warning The type 'AnchorElement' is undefined jsdoc/no-undefined-types 196:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 241:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 257:1 warning The type 'Integer' is undefined jsdoc/no-undefined-types 296:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 307:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 308:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 329:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 347:1 warning The type 'ListElement' is undefined jsdoc/no-undefined-types 367:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 399:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 413:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 427:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 441:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 455:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 470:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 471:1 warning The type 'Document' is undefined jsdoc/no-undefined-types 530:1 warning Missing JSDoc @param "sendResponse" type jsdoc/require-param-type /src/repo/lib/on-this-day.languages.js 28:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 30:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 32:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 60:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 62:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 64:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 100:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 102:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 104:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 128:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 130:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 132:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 156:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 158:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 160:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 189:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 191:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 193:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 217:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 219:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 221:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 245:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 247:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 249:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 273:13 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 275:13 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 277:13 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 301:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 303:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 305:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 335:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 337:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 339:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 362:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 364:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 366:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 390:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 392:11 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp /src/repo/lib/pageviews.js 36:1 warning At most one access-control tag may be present on a jsdoc block jsdoc/check-access 37:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 38:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 39:1 warning @private should not have a bracketed type in "jsdoc" mode jsdoc/valid-types 53:1 warning The type 'Platform' is undefined jsdoc/no-undefined-types 54:1 warning The type 'Agent' is undefined jsdoc/no-undefined-types 56:1 warning The type 'Granularity' is undefined jsdoc/no-undefined-types 71:1 warning The type 'Platform' is undefined jsdoc/no-undefined-types /src/repo/lib/random.js 38:9 warning 'score' is already declared in the upper scope on line 31 column 10 no-shadow 55:1 warning Missing JSDoc @param "scoredResults" type jsdoc/require-param-type /src/repo/lib/siteinfo.js 3:1 warning Use the global form of 'use strict' strict 10:29 warning Unsafe Regular Expression security/detect-unsafe-regex /src/repo/lib/util.js 104:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 142:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 222:1 warning The type 'Router' is undefined jsdoc/no-undefined-types 280:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 293:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 306:1 warning JSDoc @return declaration present but return expression not available in function jsdoc/require-returns-check 378:1 warning The type 'Application' is undefined jsdoc/no-undefined-types 450:34 warning Default parameters should be last default-param-last /src/repo/package-lock.json 1:1 warning Use the global form of 'use strict' strict /src/repo/package.json 1:1 warning Use the global form of 'use strict' strict /src/repo/scripts/check-featured-feed.js 49:35 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 82:44 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 107:34 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 150:30 warning 'feature' is already declared in the upper scope on line 212 column 7 no-shadow 217:5 warning Don't use process.exit(); throw an error instead n/no-process-exit /src/repo/spec.yaml 228:1 warning This line has a length of 154. Maximum allowed is 100 max-len 232:1 warning This line has a length of 141. Maximum allowed is 100 max-len 866:1 warning This line has a length of 117. Maximum allowed is 100 max-len 871:1 warning This line has a length of 116. Maximum allowed is 100 max-len 876:1 warning This line has a length of 116. Maximum allowed is 100 max-len 881:1 warning This line has a length of 116. Maximum allowed is 100 max-len 886:1 warning This line has a length of 116. Maximum allowed is 100 max-len 938:1 warning This line has a length of 108. Maximum allowed is 100 max-len 955:1 warning This line has a length of 126. Maximum allowed is 100 max-len 956:1 warning This line has a length of 107. Maximum allowed is 100 max-len 962:1 warning This line has a length of 132. Maximum allowed is 100 max-len 969:1 warning This line has a length of 127. Maximum allowed is 100 max-len 971:1 warning This line has a length of 108. Maximum allowed is 100 max-len 972:1 warning This line has a length of 113. Maximum allowed is 100 max-len 973:1 warning This line has a length of 121. Maximum allowed is 100 max-len 977:1 warning This line has a length of 121. Maximum allowed is 100 max-len 981:1 warning This line has a length of 113. Maximum allowed is 100 max-len 985:1 warning This line has a length of 111. Maximum allowed is 100 max-len 991:1 warning This line has a length of 124. Maximum allowed is 100 max-len 995:1 warning This line has a length of 281. Maximum allowed is 100 max-len 1082:1 warning This line has a length of 144. Maximum allowed is 100 max-len ✖ 150 problems (0 errors, 150 warnings) aggregated featured starting test server ✔ should return 200 for a valid request (1006ms) ✔ should return 404 for an invalid year ✔ should return 404 for an invalid month ✔ should return 404 for an invalid day ✔ should return only historic keys for past date (735ms) ✔ should return current keys for today (679ms) ✔ should return future keys for tomorrow (338ms) aggregate onthisday ✔ should return 200 for a valid request (4029ms) ✔ should return 404 for an invalid month (115ms) ✔ should return 404 for an invalid day (88ms) ✔ should return objects with the expected keys (2937ms) express app ✔ should get robots.txt ✔ should set CORS headers ✔ should set CSP headers ✔ should get static content gzipped ✔ should get static content uncompressed Swagger spec ✔ get the spec ✔ spec validation validate responses against schema - random response should conform to schema ✔ featured article response should conform to schema (199ms) ✔ featured image response should conform to schema (181ms) ✔ most-read response should conform to schema (379ms) ✔ news response should conform to schema (131ms) ✔ announcements should conform to schema ✔ onthisday response should conform to schema (4090ms) ✔ featured article response should conform to schema (invalid lang, agg=true) ✔ featured image response should conform to schema (invalid date, agg=true) ✔ most-read response should conform to schema (invalid date, agg=true) ✔ news response (invalid language, agg=true) should be empty strict mode: missing type "object" for keyword "required" at "#/definitions/problem#" (strictTypes) strict mode: missing type "object" for keyword "properties" at "#/definitions/problem#" (strictTypes) ✔ featured article request should fail for invalid language when !agg=true ✔ featured image request should fail for invalid date when !agg=true ✔ most-read request should fail for invalid date when !agg=true ✔ news request should fail for invalid language when !agg=true validate spec examples ✔ spec from root ✔ retrieve service info ✔ Retrieve feed content availability from \'wikipedia.org\' ✔ Retrieve announcements ✔ retrieve selected events on January 15 (331ms) ✔ retrieve title of the featured article for April 29, 2016 (177ms) ✔ retrieve featured article info for unsupported site (with aggregated=true) ✔ retrieve featured image data for April 29, 2016 (195ms) ✔ retrieve the most read articles for January 1, 2016 (316ms) ✔ retrieve the most-read articles for January 1, 2016 (with aggregated=true) (302ms) ✔ retrieve most-read articles for date with no data (with aggregated=true) ✔ get 'In the News' content (107ms) ✔ get "In the News" content for unsupported language (with aggregated=true) ✔ retrieve a random article title (67ms) featured ✔ incomplete date should return 404 ✔ extra uri path parameter after date should return 404 ✔ Missing TFA should return 204 (142ms) ✔ Missing TFA with aggregated=true should return 204 (152ms) ✔ featured article of an old date should return 404 featured-image-lang ✔ bg description (1862ms) ✔ bn description (282ms) ✔ bs description (250ms) ✔ cs description (264ms) ✔ de description (290ms) ✔ el description (276ms) ✔ en description (208ms) ✔ fa description (257ms) ✔ he description (2129ms) ✔ hu description (279ms) ✔ it description (289ms) ✔ ja description (260ms) ✔ la description (267ms) ✔ no description (257ms) ✔ sco description (262ms) ✔ sd description (259ms) ✔ sv description (1648ms) ✔ tr description (326ms) ✔ ur description (263ms) ✔ vi description (341ms) ✔ zh description (266ms) featured-image ✔ incomplete date should return 404 ✔ extra uri path parameter after date should return 404 service information ✔ should get the service name ✔ should get the service version ✔ should redirect to the service home page ✔ should get the service info most-read articles ✔ Should provide pageviews from day prior when aggregated flag is set (362ms) ✔ Should drop duplicate pageviews (277ms) ✔ Should filter out missing summaries (427ms) ✔ Should return 204 for fywiki requests ✔ main page filtering RegExp should handle all main page title chars ✔ Should filter out blocked titles from some languages, but not others ✔ Should filter out certain blocked titles from all wikis most-read articles ✔ Should return 200 even if title has invalid utf8 encoding (346ms) ✔ Should filter-out invalid utf8 encoding news headline selectors ✔ test news headlines should be general not categorical ✔ test news headline topics should be nonnull ✔ bs news headlines should be general not categorical ✔ bs news headline topics should be nonnull ✔ da news headlines should be general not categorical ✔ da news headline topics should be nonnull ✔ de news headlines should be general not categorical ✔ de news headline topics should be nonnull ✔ el news headlines should be general not categorical ✔ el news headline topics should be nonnull ✔ en news headlines should be general not categorical ✔ en news headline topics should be nonnull ✔ es news headlines should be general not categorical ✔ es news headline topics should be nonnull ✔ fi news headlines should be general not categorical ✔ fi news headline topics should be nonnull ✔ fr news headlines should be general not categorical ✔ fr news headline topics should be nonnull ✔ he news headlines should be general not categorical ✔ he news headline topics should be nonnull ✔ ko news headlines should be general not categorical ✔ ko news headline topics should be nonnull ✔ no news headlines should be general not categorical ✔ no news headline topics should be nonnull ✔ pl news headlines should be general not categorical ✔ pl news headline topics should be nonnull ✔ pt news headlines should be general not categorical ✔ pt news headline topics should be nonnull ✔ ru news headlines should be general not categorical ✔ ru news headline topics should be nonnull ✔ sco news headlines should be general not categorical ✔ sco news headline topics should be nonnull ✔ sv news headlines should be general not categorical ✔ sv news headline topics should be nonnull ✔ vi news headlines should be general not categorical ✔ vi news headline topics should be nonnull ✔ news headline topic should be the first bold link ✔ news headline topic should be the first link when no link is bolded news ✔ test: results list should have expected properties (154ms) ✔ bs: results list should have expected properties (186ms) ✔ da: results list should have expected properties (196ms) ✔ de: results list should have expected properties (105ms) ✔ el: results list should have expected properties (99ms) ✔ en: results list should have expected properties (116ms) ✔ es: results list should have expected properties (186ms) ✔ fi: results list should have expected properties (212ms) ✔ fr: results list should have expected properties (292ms) ✔ he: results list should have expected properties (191ms) ✔ ko: results list should have expected properties (206ms) ✔ no: results list should have expected properties (122ms) ✔ pl: results list should have expected properties (174ms) ✔ pt: results list should have expected properties (237ms) ✔ ru: results list should have expected properties (524ms) ✔ sco: results list should have expected properties (87ms) ✔ sv: results list should have expected properties (140ms) ✔ vi: results list should have expected properties (130ms) onthisday ✔ all: unsupported language throws 404 ✔ selected: unsupported language throws 404 ✔ selected: fetches some results (328ms) ✔ births: unsupported language throws 404 ✔ births: fetches some results (1481ms) ✔ deaths: unsupported language throws 404 ✔ deaths: fetches some results (857ms) ✔ events: unsupported language throws 404 ✔ events: fetches some results (993ms) ✔ holidays: unsupported language throws 404 ✔ holidays: fetches some results (321ms) ✔ "all" fetches some results for births, deaths, events, holidays and selected (2390ms) ✔ filters out duplicate articles from pages (2307ms) random/title ✔ pickBestResult should select best-scored title from sample ✔ redirects to the right format with random title - html (77ms) ✔ redirects to the right format with random title - invalid format ✔ returns 404 for yue.wikipedia.org stopping test server lib:announcements ✔ should return no announcement for inactive wiki ✔ should return one or more announcements for active wiki lib:announcements:etc ✔ should return no image_url ✔ should return correct type ✔ countries is an array of strings ✔ should not deliver HTML in certain legacy iOS announcements fields ✔ iOS legacy fundraising announcement should have the proper platform ID ✔ iOS fundraising announcement should have the proper platform ID ✔ should deliver HTML in certain V2 announcements fields ✔ caption_HTML on iOS should be inside a paragraph ✔ caption_HTML on Android should not be inside a paragraph ✔ should return no image_url ✔ should return correct type ✔ countries is an array of strings ✔ should not deliver HTML in certain legacy iOS announcements fields ✔ iOS legacy fundraising announcement should have the proper platform ID ✔ iOS fundraising announcement should have the proper platform ID ✔ should deliver HTML in certain V2 announcements fields ✔ caption_HTML on iOS should be inside a paragraph ✔ caption_HTML on Android should not be inside a paragraph ✔ should return no image_url ✔ should return correct type ✔ countries is an array of strings ✔ should not deliver HTML in certain legacy iOS announcements fields ✔ iOS legacy fundraising announcement should have the proper platform ID ✔ iOS fundraising announcement should have the proper platform ID ✔ should deliver HTML in certain V2 announcements fields ✔ caption_HTML on iOS should be inside a paragraph ✔ caption_HTML on Android should not be inside a paragraph ✔ should return no image_url ✔ should return correct type ✔ countries is an array of strings ✔ should not deliver HTML in certain legacy iOS announcements fields ✔ iOS legacy fundraising announcement should have the proper platform ID ✔ iOS fundraising announcement should have the proper platform ID ✔ should deliver HTML in certain V2 announcements fields ✔ caption_HTML on iOS should be inside a paragraph ✔ caption_HTML on Android should not be inside a paragraph ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters ✔ buildId should not return lower case characters .hasEnded ✔ invalid endTime ✔ endTime has passed ✔ endTime has not passed yet announcements-unit-config ✔ all dates should be valid MW core page HTML ✔ fetches the core page html output only with title in params ✔ fetches the core page html output with revision in params featured-unit ✔ isSupported should return the correct boolean ✔ findPageTitle should find the first bold link: a inside b ✔ findPageTitle should find the first bold link: b inside a ✔ findPageTitle should return undefined if nothing found featured-image-unit ✔ structureExtMetadataValue returns description for preferred lang if present ✔ structureExtMetadataValue falls back to en description if preferred lang not present ✔ structureExtMetadataValue returns lang undefined for type of value equals to string ✔ structureExtMetadataValue returns undefined for undefined input news-unit ✔ news story constructed correctly (duplicate titles handled correctly) ✔ floating spans are removed onthisday-unit ✔ eventsForYearListElements returns a WMFEvent for only year list elements ✔ Sort year list events in correct BC[E] aware manner page title generation: titleForDayPageFromMonthDayNumberStrings ✔ 1 digit mm and 1 digit dd ✔ 0 padded mm and 1 digit dd ✔ 0 padded mm and 0 padded dd day page URI generation: dayTitleForRequest ✔ returns expected title for 0 padded month and 2 digit day ✔ returns expected title for 2 digit month and 0 padded day ✔ returns expected title for 1 digit month and 1 digit day selected page URI generation: selectedTitleForRequest ✔ returns expected title for 0 padded month and 2 digit day ✔ returns expected title for 2 digit month and 0 padded day ✔ returns expected title for 1 digit month and 1 digit day anchor to WMFPage transforms: wmfPageFromAnchorElement ✔ WMFPage model object is correctly created from a topic anchor ✔ WMFPage model object is correctly created from a non-topic anchor wmfEventFromListElement: WMFEvent model object is correctly created ✔ from a selected list element ✔ from a birth list element ✔ from an event list element ✔ from a death list element ✔ from a birth list element ✔ from a selected div element on zhwiki ✔ wmfEventFromListElement should return null for elements not describing events wmfHolidayFromListElement: WMFHoliday model object is correctly created ✔ WMFHoliday model object is correctly created from a holiday list element yearListElementRegEx ✔ rejects malformed BC strings ✔ accepts well formed BC strings ✔ accepts well formed BCE strings ✔ accepts well formed CE strings ✔ accepts well formed year strings (no BCE/AD/CE) ✔ accepts well formed AD strings ✔ extracts expected BC/BCE strings ✔ extracts expected BC/BCE strings in Chinese ✔ AD strings should not be negated ✔ rejects non year list strings ✔ rejects strings missing text listElementsByHeadingID extracts expected number of births from ✔ DE fixture (83ms) ✔ EN fixture (90ms) ✔ AR fixture (42ms) ✔ BS fixture nested list element handling ✔ listElementsByHeadingID extracts expected number of holidays from EN fixture ✔ expected textContent for a list item NOT nested within another list item ✔ expected textContent for a list item nested within another list item ✔ expected textContent for list items nested within a year-dash list item ✔ expected textContent for list items nested within a year list item (no dash) addPrefixFromAncestorListElementsToListElement ✔ expected extraction from ancestor year element ✔ expected extraction from multiline ancestor year element ✔ expected extraction from ancestor year element with dash ✔ expected extraction from ancestor year element with dash space ✔ expected extraction from multiline ancestor year element with dash ✔ expected extraction from multiline non-year ancestor ✔ expected extraction from double-nested list element ✔ expected extraction from triple-nested list element ✔ expected extraction from nested Russian list element with "год" ✔ Prefixed text content from ancestor element is escaped isAnchorForYear ✔ correctly identifies anchor linking to year article ✔ correctly rejects anchor linking article starting with a year ✔ correctly rejects anchor linking article starting with a number ✔ correctly rejects anchor linking article not starting with a year ✔ correctly identifies anchor linking to year article with an era string ✔ correctly identifies anchor linking to year article with era string w/o space external urls should be excluded ✔ exclude external url from WMFHoliday pages ✔ exclude external url from WMFEvent pages style tags should be dropped ✔ exclude style tags random ✔ pickBestResult should select best-scored title from sample util ✔ promiseAwaitAll, ignoreRejected ✔ promiseAwaitAll, propagate rejected removeDuplicateTitles ✔ deduplicates and applies update function 285 passing (42s) 1 pending --- stdout --- [master eae311f] build: Updating eslint-config-wikimedia to 0.29.1 2 files changed, 12 insertions(+), 9 deletions(-) --- end --- $ git format-patch HEAD~1 --stdout --- stdout --- From eae311ff5fb8914fdda392bc660f6860d75e6af7 Mon Sep 17 00:00:00 2001 From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org> Date: Sat, 29 Mar 2025 05:18:06 +0000 Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.29.1 Change-Id: Iea3b3afe49c2f9934237547b5cd7b0764aa72813 --- package-lock.json | 19 +++++++++++-------- package.json | 2 +- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 022f51e..c3d0a1b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "ajv-formats": "^2.1.1", "csv-parse": "^5.5.3", "eslint": "8.57.0", - "eslint-config-wikimedia": "0.28.2", + "eslint-config-wikimedia": "0.29.1", "eslint-plugin-n": "^16.6.2", "extend": "^3.0.2", "mocha": "^10.3.0", @@ -2249,9 +2249,9 @@ } }, "node_modules/eslint-config-wikimedia": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz", - "integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==", + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.29.1.tgz", + "integrity": "sha512-4dbL5o3hKGSvreyrGZWLPoTDLFubZ575IQOPhUaTcpbTsi0u05TBEMsOyYkthTaK21vsFQqhSYtxp/xU93BSdA==", "dev": true, "dependencies": { "browserslist-config-wikimedia": "^0.7.0", @@ -2264,13 +2264,16 @@ "eslint-plugin-mediawiki": "^0.7.0", "eslint-plugin-mocha": "^10.4.3", "eslint-plugin-n": "^17.7.0", - "eslint-plugin-no-jquery": "^3.0.1", + "eslint-plugin-no-jquery": "^3.1.1", "eslint-plugin-qunit": "^8.1.1", "eslint-plugin-security": "^1.7.1", "eslint-plugin-unicorn": "^53.0.0", "eslint-plugin-vue": "^9.26.0", "eslint-plugin-wdio": "^8.24.12", "eslint-plugin-yml": "^1.14.0" + }, + "engines": { + "node": ">=18 <23" } }, "node_modules/eslint-config-wikimedia/node_modules/brace-expansion": { @@ -2518,9 +2521,9 @@ } }, "node_modules/eslint-plugin-no-jquery": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.1.tgz", - "integrity": "sha512-GrzdjIxox/3x8hpSwpxiMuEQFipiJHTGiVsp0T1TI6GH+KVSbXa4z/56xTV1WiIe66u3iRgvCIipu9CRthecpQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz", + "integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==", "dev": true, "peerDependencies": { "eslint": ">=8.0.0" diff --git a/package.json b/package.json index db2143e..92920a7 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "ajv-formats": "^2.1.1", "csv-parse": "^5.5.3", "eslint": "8.57.0", - "eslint-config-wikimedia": "0.28.2", + "eslint-config-wikimedia": "0.29.1", "eslint-plugin-n": "^16.6.2", "extend": "^3.0.2", "mocha": "^10.3.0", -- 2.39.2 --- end ---