From 938e237411f8a5211a098c8dc6432f4c6901837b Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 25 Nov 2025 00:12:12 +0100 Subject: [PATCH] Add command modules and tests; commit remaining changes --- .github/workflows/ci.yml | 5 +- coverage/base.css | 224 + coverage/block-navigation.js | 87 + coverage/clover.xml | 962 ++++ coverage/coverage-final.json | 11 + coverage/favicon.png | Bin 0 -> 445 bytes coverage/index.html | 146 + coverage/prettify.css | 1 + coverage/prettify.js | 2 + coverage/sort-arrow-sprite.png | Bin 0 -> 138 bytes coverage/sorter.js | 210 + coverage/src/commands/index.html | 161 + coverage/src/commands/send.ts.html | 217 + coverage/src/commands/status.ts.html | 175 + coverage/src/commands/up.ts.html | 238 + coverage/src/commands/webhook.ts.html | 148 + coverage/src/globals.ts.html | 172 + coverage/src/index.html | 161 + coverage/src/index.ts.html | 6475 +++++++++++++++++++++++++ coverage/src/provider-web.ts.html | 892 ++++ coverage/src/utils.ts.html | 235 + coverage/test/mocks/baileys.ts.html | 244 + coverage/test/mocks/index.html | 131 + coverage/test/mocks/twilio.ts.html | 232 + package.json | 5 +- src/commands/send.ts | 44 + src/commands/status.ts | 30 + src/commands/webhook.ts | 27 + src/globals.test.ts | 29 + src/index.test.ts | 4 +- src/utils.test.ts | 8 +- 31 files changed, 11269 insertions(+), 7 deletions(-) create mode 100644 coverage/base.css create mode 100644 coverage/block-navigation.js create mode 100644 coverage/clover.xml create mode 100644 coverage/coverage-final.json create mode 100644 coverage/favicon.png create mode 100644 coverage/index.html create mode 100644 coverage/prettify.css create mode 100644 coverage/prettify.js create mode 100644 coverage/sort-arrow-sprite.png create mode 100644 coverage/sorter.js create mode 100644 coverage/src/commands/index.html create mode 100644 coverage/src/commands/send.ts.html create mode 100644 coverage/src/commands/status.ts.html create mode 100644 coverage/src/commands/up.ts.html create mode 100644 coverage/src/commands/webhook.ts.html create mode 100644 coverage/src/globals.ts.html create mode 100644 coverage/src/index.html create mode 100644 coverage/src/index.ts.html create mode 100644 coverage/src/provider-web.ts.html create mode 100644 coverage/src/utils.ts.html create mode 100644 coverage/test/mocks/baileys.ts.html create mode 100644 coverage/test/mocks/index.html create mode 100644 coverage/test/mocks/twilio.ts.html create mode 100644 src/commands/send.ts create mode 100644 src/commands/status.ts create mode 100644 src/commands/webhook.ts create mode 100644 src/globals.test.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ff49f68c2..cb5e62f46 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,10 @@ jobs: cache: pnpm - name: Install dependencies - run: pnpm install --frozen-lockfile + env: + PNPM_HOME: ~/.pnpm + PNPM_IGNORE_SCRIPTS: "false" + run: pnpm install --frozen-lockfile --ignore-scripts=false - name: Lint run: pnpm lint diff --git a/coverage/base.css b/coverage/base.css new file mode 100644 index 000000000..f418035b4 --- /dev/null +++ b/coverage/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/block-navigation.js b/coverage/block-navigation.js new file mode 100644 index 000000000..530d1ed2b --- /dev/null +++ b/coverage/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selector that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/clover.xml b/coverage/clover.xml new file mode 100644 index 000000000..6e0f0e112 --- /dev/null +++ b/coverage/clover.xml @@ -0,0 +1,962 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json new file mode 100644 index 000000000..2617e2397 --- /dev/null +++ b/coverage/coverage-final.json @@ -0,0 +1,11 @@ +{"/Users/steipete/Projects/warelay/src/globals.ts": {"path":"/Users/steipete/Projects/warelay/src/globals.ts","statementMap":{"0":{"start":{"line":3,"column":20},"end":{"line":3,"column":null}},"1":{"start":{"line":4,"column":16},"end":{"line":4,"column":null}},"2":{"start":{"line":7,"column":1},"end":{"line":7,"column":null}},"3":{"start":{"line":11,"column":1},"end":{"line":11,"column":null}},"4":{"start":{"line":15,"column":1},"end":{"line":15,"column":null}},"5":{"start":{"line":15,"column":20},"end":{"line":15,"column":null}},"6":{"start":{"line":19,"column":1},"end":{"line":19,"column":null}},"7":{"start":{"line":23,"column":1},"end":{"line":23,"column":null}},"8":{"start":{"line":26,"column":23},"end":{"line":26,"column":null}},"9":{"start":{"line":27,"column":20},"end":{"line":27,"column":null}},"10":{"start":{"line":28,"column":20},"end":{"line":28,"column":null}},"11":{"start":{"line":29,"column":22},"end":{"line":29,"column":null}}},"fnMap":{"0":{"name":"setVerbose","decl":{"start":{"line":6,"column":16},"end":{"line":6,"column":27}},"loc":{"start":{"line":6,"column":39},"end":{"line":8,"column":null}},"line":6},"1":{"name":"isVerbose","decl":{"start":{"line":10,"column":16},"end":{"line":10,"column":28}},"loc":{"start":{"line":10,"column":28},"end":{"line":12,"column":null}},"line":10},"2":{"name":"logVerbose","decl":{"start":{"line":14,"column":16},"end":{"line":14,"column":27}},"loc":{"start":{"line":14,"column":44},"end":{"line":16,"column":null}},"line":14},"3":{"name":"setYes","decl":{"start":{"line":18,"column":16},"end":{"line":18,"column":23}},"loc":{"start":{"line":18,"column":35},"end":{"line":20,"column":null}},"line":18},"4":{"name":"isYes","decl":{"start":{"line":22,"column":16},"end":{"line":22,"column":24}},"loc":{"start":{"line":22,"column":24},"end":{"line":24,"column":null}},"line":22}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":1},"end":{"line":15,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":1},"end":{"line":15,"column":null}},{"start":{},"end":{}}],"line":15}},"s":{"0":5,"1":5,"2":4,"3":6,"4":19,"5":1,"6":4,"7":2,"8":5,"9":5,"10":5,"11":5},"f":{"0":4,"1":6,"2":19,"3":4,"4":2},"b":{"0":[1,18]},"meta":{"lastBranch":1,"lastFunction":5,"lastStatement":12,"seen":{"s:3:20:3:Infinity":0,"s:4:16:4:Infinity":1,"f:6:16:6:27":0,"s:7:1:7:Infinity":2,"f:10:16:10:28":1,"s:11:1:11:Infinity":3,"f:14:16:14:27":2,"b:15:1:15:Infinity:undefined:undefined:undefined:undefined":0,"s:15:1:15:Infinity":4,"s:15:20:15:Infinity":5,"f:18:16:18:23":3,"s:19:1:19:Infinity":6,"f:22:16:22:24":4,"s:23:1:23:Infinity":7,"s:26:23:26:Infinity":8,"s:27:20:27:Infinity":9,"s:28:20:28:Infinity":10,"s:29:22:29:Infinity":11}}} +,"/Users/steipete/Projects/warelay/src/index.ts": {"path":"/Users/steipete/Projects/warelay/src/index.ts","statementMap":{"0":{"start":{"line":49,"column":0},"end":{"line":49,"column":null}},"1":{"start":{"line":51,"column":16},"end":{"line":51,"column":null}},"2":{"start":{"line":79,"column":1},"end":{"line":98,"column":null}},"3":{"start":{"line":194,"column":35},"end":{"line":201,"column":null}},"4":{"start":{"line":198,"column":2},"end":{"line":198,"column":null}},"5":{"start":{"line":199,"column":2},"end":{"line":199,"column":null}},"6":{"start":{"line":203,"column":18},"end":{"line":232,"column":null}},"7":{"start":{"line":213,"column":2},"end":{"line":218,"column":null}},"8":{"start":{"line":214,"column":3},"end":{"line":217,"column":null}},"9":{"start":{"line":219,"column":2},"end":{"line":224,"column":null}},"10":{"start":{"line":220,"column":3},"end":{"line":223,"column":null}},"11":{"start":{"line":225,"column":2},"end":{"line":231,"column":null}},"12":{"start":{"line":226,"column":3},"end":{"line":230,"column":null}},"13":{"start":{"line":236,"column":16},"end":{"line":236,"column":null}},"14":{"start":{"line":237,"column":1},"end":{"line":241,"column":null}},"15":{"start":{"line":238,"column":2},"end":{"line":238,"column":null}},"16":{"start":{"line":239,"column":2},"end":{"line":239,"column":null}},"17":{"start":{"line":239,"column":39},"end":{"line":239,"column":72}},"18":{"start":{"line":240,"column":2},"end":{"line":240,"column":null}},"19":{"start":{"line":250,"column":5},"end":{"line":250,"column":null}},"20":{"start":{"line":253,"column":2},"end":{"line":255,"column":null}},"21":{"start":{"line":257,"column":1},"end":{"line":262,"column":null}},"22":{"start":{"line":265,"column":6},"end":{"line":265,"column":null}},"23":{"start":{"line":277,"column":1},"end":{"line":279,"column":null}},"24":{"start":{"line":278,"column":2},"end":{"line":278,"column":null}},"25":{"start":{"line":280,"column":1},"end":{"line":296,"column":null}},"26":{"start":{"line":281,"column":29},"end":{"line":285,"column":null}},"27":{"start":{"line":286,"column":2},"end":{"line":289,"column":null}},"28":{"start":{"line":287,"column":3},"end":{"line":287,"column":null}},"29":{"start":{"line":287,"column":22},"end":{"line":287,"column":null}},"30":{"start":{"line":288,"column":3},"end":{"line":288,"column":null}},"31":{"start":{"line":288,"column":22},"end":{"line":288,"column":null}},"32":{"start":{"line":290,"column":2},"end":{"line":290,"column":null}},"33":{"start":{"line":292,"column":2},"end":{"line":294,"column":null}},"34":{"start":{"line":293,"column":3},"end":{"line":293,"column":null}},"35":{"start":{"line":295,"column":2},"end":{"line":295,"column":null}},"36":{"start":{"line":312,"column":1},"end":{"line":341,"column":null}},"37":{"start":{"line":313,"column":8},"end":{"line":315,"column":null}},"38":{"start":{"line":316,"column":15},"end":{"line":316,"column":null}},"39":{"start":{"line":317,"column":15},"end":{"line":317,"column":null}},"40":{"start":{"line":318,"column":16},"end":{"line":318,"column":null}},"41":{"start":{"line":319,"column":16},"end":{"line":321,"column":null}},"42":{"start":{"line":320,"column":3},"end":{"line":320,"column":null}},"43":{"start":{"line":323,"column":2},"end":{"line":325,"column":null}},"44":{"start":{"line":324,"column":3},"end":{"line":324,"column":null}},"45":{"start":{"line":326,"column":2},"end":{"line":328,"column":null}},"46":{"start":{"line":327,"column":3},"end":{"line":327,"column":null}},"47":{"start":{"line":329,"column":2},"end":{"line":334,"column":null}},"48":{"start":{"line":330,"column":3},"end":{"line":330,"column":null}},"49":{"start":{"line":330,"column":16},"end":{"line":330,"column":null}},"50":{"start":{"line":331,"column":3},"end":{"line":331,"column":null}},"51":{"start":{"line":332,"column":3},"end":{"line":332,"column":null}},"52":{"start":{"line":333,"column":3},"end":{"line":333,"column":null}},"53":{"start":{"line":335,"column":2},"end":{"line":340,"column":null}},"54":{"start":{"line":336,"column":3},"end":{"line":336,"column":null}},"55":{"start":{"line":336,"column":16},"end":{"line":336,"column":null}},"56":{"start":{"line":337,"column":3},"end":{"line":337,"column":null}},"57":{"start":{"line":338,"column":3},"end":{"line":338,"column":null}},"58":{"start":{"line":339,"column":3},"end":{"line":339,"column":null}},"59":{"start":{"line":350,"column":2},"end":{"line":350,"column":null}},"60":{"start":{"line":351,"column":2},"end":{"line":351,"column":null}},"61":{"start":{"line":352,"column":2},"end":{"line":352,"column":null}},"62":{"start":{"line":353,"column":2},"end":{"line":353,"column":null}},"63":{"start":{"line":358,"column":1},"end":{"line":358,"column":null}},"64":{"start":{"line":363,"column":1},"end":{"line":374,"column":null}},"65":{"start":{"line":364,"column":21},"end":{"line":369,"column":null}},"66":{"start":{"line":370,"column":18},"end":{"line":370,"column":null}},"67":{"start":{"line":371,"column":2},"end":{"line":371,"column":null}},"68":{"start":{"line":371,"column":15},"end":{"line":371,"column":null}},"69":{"start":{"line":373,"column":2},"end":{"line":373,"column":null}},"70":{"start":{"line":375,"column":1},"end":{"line":375,"column":null}},"71":{"start":{"line":380,"column":1},"end":{"line":396,"column":null}},"72":{"start":{"line":381,"column":2},"end":{"line":389,"column":null}},"73":{"start":{"line":382,"column":18},"end":{"line":388,"column":null}},"74":{"start":{"line":384,"column":28},"end":{"line":384,"column":39}},"75":{"start":{"line":386,"column":5},"end":{"line":386,"column":null}},"76":{"start":{"line":386,"column":24},"end":{"line":386,"column":33}},"77":{"start":{"line":391,"column":2},"end":{"line":394,"column":null}},"78":{"start":{"line":392,"column":19},"end":{"line":392,"column":null}},"79":{"start":{"line":393,"column":3},"end":{"line":393,"column":null}},"80":{"start":{"line":395,"column":2},"end":{"line":395,"column":null}},"81":{"start":{"line":405,"column":1},"end":{"line":431,"column":null}},"82":{"start":{"line":410,"column":3},"end":{"line":412,"column":null}},"83":{"start":{"line":413,"column":2},"end":{"line":413,"column":null}},"84":{"start":{"line":414,"column":2},"end":{"line":424,"column":null}},"85":{"start":{"line":415,"column":3},"end":{"line":415,"column":null}},"86":{"start":{"line":416,"column":3},"end":{"line":416,"column":null}},"87":{"start":{"line":417,"column":3},"end":{"line":423,"column":null}},"88":{"start":{"line":418,"column":4},"end":{"line":422,"column":null}},"89":{"start":{"line":425,"column":2},"end":{"line":429,"column":null}},"90":{"start":{"line":430,"column":2},"end":{"line":430,"column":null}},"91":{"start":{"line":432,"column":1},"end":{"line":432,"column":null}},"92":{"start":{"line":433,"column":1},"end":{"line":433,"column":null}},"93":{"start":{"line":442,"column":1},"end":{"line":445,"column":null}},"94":{"start":{"line":443,"column":2},"end":{"line":443,"column":null}},"95":{"start":{"line":444,"column":2},"end":{"line":444,"column":null}},"96":{"start":{"line":452,"column":1},"end":{"line":452,"column":null}},"97":{"start":{"line":452,"column":29},"end":{"line":452,"column":null}},"98":{"start":{"line":453,"column":1},"end":{"line":453,"column":null}},"99":{"start":{"line":453,"column":14},"end":{"line":453,"column":null}},"100":{"start":{"line":454,"column":12},"end":{"line":454,"column":null}},"101":{"start":{"line":455,"column":16},"end":{"line":455,"column":null}},"102":{"start":{"line":456,"column":7},"end":{"line":458,"column":null}},"103":{"start":{"line":459,"column":1},"end":{"line":459,"column":null}},"104":{"start":{"line":460,"column":1},"end":{"line":460,"column":null}},"105":{"start":{"line":460,"column":14},"end":{"line":460,"column":null}},"106":{"start":{"line":461,"column":1},"end":{"line":461,"column":null}},"107":{"start":{"line":464,"column":20},"end":{"line":464,"column":null}},"108":{"start":{"line":497,"column":1},"end":{"line":506,"column":null}},"109":{"start":{"line":498,"column":2},"end":{"line":498,"column":null}},"110":{"start":{"line":498,"column":35},"end":{"line":498,"column":null}},"111":{"start":{"line":499,"column":14},"end":{"line":499,"column":null}},"112":{"start":{"line":500,"column":17},"end":{"line":500,"column":null}},"113":{"start":{"line":501,"column":2},"end":{"line":501,"column":null}},"114":{"start":{"line":501,"column":53},"end":{"line":501,"column":null}},"115":{"start":{"line":502,"column":2},"end":{"line":502,"column":null}},"116":{"start":{"line":504,"column":2},"end":{"line":504,"column":null}},"117":{"start":{"line":505,"column":2},"end":{"line":505,"column":null}},"118":{"start":{"line":522,"column":1},"end":{"line":525,"column":null}},"119":{"start":{"line":523,"column":17},"end":{"line":523,"column":null}},"120":{"start":{"line":524,"column":2},"end":{"line":524,"column":null}},"121":{"start":{"line":536,"column":30},"end":{"line":536,"column":null}},"122":{"start":{"line":537,"column":30},"end":{"line":537,"column":null}},"123":{"start":{"line":538,"column":29},"end":{"line":538,"column":null}},"124":{"start":{"line":541,"column":1},"end":{"line":541,"column":null}},"125":{"start":{"line":541,"column":13},"end":{"line":541,"column":null}},"126":{"start":{"line":542,"column":1},"end":{"line":542,"column":null}},"127":{"start":{"line":542,"column":28},"end":{"line":542,"column":null}},"128":{"start":{"line":543,"column":1},"end":{"line":543,"column":null}},"129":{"start":{"line":547,"column":1},"end":{"line":555,"column":null}},"130":{"start":{"line":548,"column":14},"end":{"line":548,"column":null}},"131":{"start":{"line":549,"column":17},"end":{"line":549,"column":null}},"132":{"start":{"line":550,"column":2},"end":{"line":552,"column":null}},"133":{"start":{"line":551,"column":3},"end":{"line":551,"column":null}},"134":{"start":{"line":556,"column":1},"end":{"line":556,"column":null}},"135":{"start":{"line":560,"column":1},"end":{"line":560,"column":null}},"136":{"start":{"line":561,"column":1},"end":{"line":561,"column":null}},"137":{"start":{"line":565,"column":1},"end":{"line":565,"column":null}},"138":{"start":{"line":565,"column":25},"end":{"line":565,"column":null}},"139":{"start":{"line":566,"column":14},"end":{"line":566,"column":null}},"140":{"start":{"line":567,"column":1},"end":{"line":567,"column":null}},"141":{"start":{"line":577,"column":13},"end":{"line":577,"column":null}},"142":{"start":{"line":578,"column":15},"end":{"line":578,"column":null}},"143":{"start":{"line":579,"column":24},"end":{"line":579,"column":null}},"144":{"start":{"line":580,"column":19},"end":{"line":580,"column":null}},"145":{"start":{"line":581,"column":15},"end":{"line":581,"column":null}},"146":{"start":{"line":582,"column":22},"end":{"line":586,"column":null}},"147":{"start":{"line":583,"column":2},"end":{"line":583,"column":null}},"148":{"start":{"line":583,"column":15},"end":{"line":583,"column":null}},"149":{"start":{"line":584,"column":2},"end":{"line":584,"column":null}},"150":{"start":{"line":585,"column":2},"end":{"line":585,"column":null}},"151":{"start":{"line":589,"column":20},"end":{"line":589,"column":null}},"152":{"start":{"line":591,"column":2},"end":{"line":593,"column":null}},"153":{"start":{"line":594,"column":21},"end":{"line":594,"column":null}},"154":{"start":{"line":595,"column":22},"end":{"line":595,"column":null}},"155":{"start":{"line":596,"column":19},"end":{"line":596,"column":null}},"156":{"start":{"line":599,"column":20},"end":{"line":599,"column":null}},"157":{"start":{"line":602,"column":1},"end":{"line":634,"column":null}},"158":{"start":{"line":603,"column":8},"end":{"line":603,"column":null}},"159":{"start":{"line":604,"column":2},"end":{"line":617,"column":null}},"160":{"start":{"line":605,"column":3},"end":{"line":605,"column":null}},"161":{"start":{"line":605,"column":17},"end":{"line":605,"column":null}},"162":{"start":{"line":606,"column":3},"end":{"line":610,"column":null}},"163":{"start":{"line":607,"column":4},"end":{"line":607,"column":null}},"164":{"start":{"line":608,"column":4},"end":{"line":608,"column":null}},"165":{"start":{"line":609,"column":4},"end":{"line":609,"column":null}},"166":{"start":{"line":611,"column":25},"end":{"line":611,"column":null}},"167":{"start":{"line":612,"column":3},"end":{"line":616,"column":null}},"168":{"start":{"line":613,"column":4},"end":{"line":613,"column":null}},"169":{"start":{"line":614,"column":4},"end":{"line":614,"column":null}},"170":{"start":{"line":615,"column":4},"end":{"line":615,"column":null}},"171":{"start":{"line":619,"column":21},"end":{"line":619,"column":null}},"172":{"start":{"line":620,"column":16},"end":{"line":620,"column":null}},"173":{"start":{"line":621,"column":16},"end":{"line":621,"column":null}},"174":{"start":{"line":622,"column":17},"end":{"line":622,"column":null}},"175":{"start":{"line":623,"column":21},"end":{"line":623,"column":null}},"176":{"start":{"line":625,"column":2},"end":{"line":630,"column":null}},"177":{"start":{"line":626,"column":3},"end":{"line":626,"column":null}},"178":{"start":{"line":628,"column":3},"end":{"line":628,"column":null}},"179":{"start":{"line":629,"column":3},"end":{"line":629,"column":null}},"180":{"start":{"line":632,"column":2},"end":{"line":632,"column":null}},"181":{"start":{"line":633,"column":2},"end":{"line":633,"column":null}},"182":{"start":{"line":636,"column":37},"end":{"line":641,"column":null}},"183":{"start":{"line":644,"column":20},"end":{"line":646,"column":null}},"184":{"start":{"line":647,"column":22},"end":{"line":649,"column":null}},"185":{"start":{"line":650,"column":40},"end":{"line":654,"column":null}},"186":{"start":{"line":657,"column":19},"end":{"line":657,"column":null}},"187":{"start":{"line":658,"column":1},"end":{"line":666,"column":null}},"188":{"start":{"line":659,"column":8},"end":{"line":659,"column":null}},"189":{"start":{"line":660,"column":2},"end":{"line":665,"column":null}},"190":{"start":{"line":661,"column":3},"end":{"line":663,"column":null}},"191":{"start":{"line":664,"column":3},"end":{"line":664,"column":null}},"192":{"start":{"line":667,"column":1},"end":{"line":670,"column":null}},"193":{"start":{"line":668,"column":2},"end":{"line":668,"column":null}},"194":{"start":{"line":669,"column":2},"end":{"line":669,"column":null}},"195":{"start":{"line":672,"column":1},"end":{"line":676,"column":null}},"196":{"start":{"line":673,"column":2},"end":{"line":673,"column":null}},"197":{"start":{"line":674,"column":2},"end":{"line":674,"column":null}},"198":{"start":{"line":675,"column":2},"end":{"line":675,"column":null}},"199":{"start":{"line":678,"column":1},"end":{"line":751,"column":null}},"200":{"start":{"line":679,"column":2},"end":{"line":679,"column":null}},"201":{"start":{"line":680,"column":13},"end":{"line":680,"column":null}},"202":{"start":{"line":680,"column":41},"end":{"line":680,"column":75}},"203":{"start":{"line":681,"column":25},"end":{"line":683,"column":null}},"204":{"start":{"line":684,"column":2},"end":{"line":686,"column":null}},"205":{"start":{"line":685,"column":3},"end":{"line":685,"column":null}},"206":{"start":{"line":689,"column":2},"end":{"line":703,"column":null}},"207":{"start":{"line":690,"column":9},"end":{"line":693,"column":null}},"208":{"start":{"line":693,"column":19},"end":{"line":693,"column":53}},"209":{"start":{"line":694,"column":3},"end":{"line":702,"column":null}},"210":{"start":{"line":695,"column":29},"end":{"line":695,"column":null}},"211":{"start":{"line":696,"column":21},"end":{"line":696,"column":null}},"212":{"start":{"line":697,"column":4},"end":{"line":701,"column":null}},"213":{"start":{"line":704,"column":20},"end":{"line":704,"column":null}},"214":{"start":{"line":705,"column":2},"end":{"line":705,"column":null}},"215":{"start":{"line":706,"column":18},"end":{"line":706,"column":null}},"216":{"start":{"line":707,"column":2},"end":{"line":750,"column":null}},"217":{"start":{"line":709,"column":4},"end":{"line":709,"column":null}},"218":{"start":{"line":710,"column":19},"end":{"line":710,"column":null}},"219":{"start":{"line":711,"column":3},"end":{"line":713,"column":null}},"220":{"start":{"line":712,"column":4},"end":{"line":712,"column":null}},"221":{"start":{"line":714,"column":3},"end":{"line":716,"column":null}},"222":{"start":{"line":717,"column":3},"end":{"line":717,"column":null}},"223":{"start":{"line":718,"column":3},"end":{"line":723,"column":null}},"224":{"start":{"line":719,"column":4},"end":{"line":721,"column":null}},"225":{"start":{"line":722,"column":4},"end":{"line":722,"column":null}},"226":{"start":{"line":724,"column":3},"end":{"line":729,"column":null}},"227":{"start":{"line":725,"column":4},"end":{"line":727,"column":null}},"228":{"start":{"line":728,"column":4},"end":{"line":728,"column":null}},"229":{"start":{"line":730,"column":3},"end":{"line":730,"column":null}},"230":{"start":{"line":732,"column":19},"end":{"line":732,"column":null}},"231":{"start":{"line":733,"column":18},"end":{"line":733,"column":null}},"232":{"start":{"line":734,"column":22},"end":{"line":734,"column":null}},"233":{"start":{"line":735,"column":20},"end":{"line":735,"column":null}},"234":{"start":{"line":739,"column":3},"end":{"line":741,"column":null}},"235":{"start":{"line":740,"column":4},"end":{"line":740,"column":null}},"236":{"start":{"line":742,"column":3},"end":{"line":748,"column":null}},"237":{"start":{"line":743,"column":4},"end":{"line":745,"column":null}},"238":{"start":{"line":747,"column":4},"end":{"line":747,"column":null}},"239":{"start":{"line":749,"column":3},"end":{"line":749,"column":null}},"240":{"start":{"line":753,"column":1},"end":{"line":753,"column":null}},"241":{"start":{"line":763,"column":25},"end":{"line":768,"column":null}},"242":{"start":{"line":770,"column":19},"end":{"line":776,"column":null}},"243":{"start":{"line":773,"column":23},"end":{"line":773,"column":null}},"244":{"start":{"line":777,"column":1},"end":{"line":777,"column":null}},"245":{"start":{"line":777,"column":17},"end":{"line":777,"column":null}},"246":{"start":{"line":779,"column":19},"end":{"line":779,"column":null}},"247":{"start":{"line":780,"column":17},"end":{"line":780,"column":null}},"248":{"start":{"line":781,"column":1},"end":{"line":788,"column":null}},"249":{"start":{"line":782,"column":1},"end":{"line":786,"column":null}},"250":{"start":{"line":783,"column":2},"end":{"line":786,"column":null}},"251":{"start":{"line":787,"column":2},"end":{"line":787,"column":null}},"252":{"start":{"line":790,"column":1},"end":{"line":792,"column":null}},"253":{"start":{"line":794,"column":1},"end":{"line":809,"column":null}},"254":{"start":{"line":795,"column":2},"end":{"line":799,"column":null}},"255":{"start":{"line":800,"column":2},"end":{"line":806,"column":null}},"256":{"start":{"line":801,"column":3},"end":{"line":805,"column":null}},"257":{"start":{"line":808,"column":2},"end":{"line":808,"column":null}},"258":{"start":{"line":814,"column":1},"end":{"line":818,"column":null}},"259":{"start":{"line":815,"column":2},"end":{"line":817,"column":null}},"260":{"start":{"line":819,"column":1},"end":{"line":821,"column":null}},"261":{"start":{"line":830,"column":1},"end":{"line":833,"column":null}},"262":{"start":{"line":831,"column":2},"end":{"line":831,"column":null}},"263":{"start":{"line":832,"column":2},"end":{"line":832,"column":null}},"264":{"start":{"line":834,"column":1},"end":{"line":850,"column":null}},"265":{"start":{"line":835,"column":20},"end":{"line":835,"column":null}},"266":{"start":{"line":836,"column":2},"end":{"line":843,"column":null}},"267":{"start":{"line":844,"column":2},"end":{"line":844,"column":null}},"268":{"start":{"line":846,"column":2},"end":{"line":849,"column":null}},"269":{"start":{"line":847,"column":3},"end":{"line":847,"column":null}},"270":{"start":{"line":848,"column":3},"end":{"line":848,"column":null}},"271":{"start":{"line":859,"column":13},"end":{"line":859,"column":null}},"272":{"start":{"line":860,"column":16},"end":{"line":860,"column":null}},"273":{"start":{"line":861,"column":7},"end":{"line":861,"column":null}},"274":{"start":{"line":862,"column":7},"end":{"line":862,"column":null}},"275":{"start":{"line":864,"column":1},"end":{"line":901,"column":null}},"276":{"start":{"line":865,"column":18},"end":{"line":869,"column":null}},"277":{"start":{"line":871,"column":2},"end":{"line":875,"column":null}},"278":{"start":{"line":876,"column":2},"end":{"line":876,"column":null}},"279":{"start":{"line":878,"column":17},"end":{"line":878,"column":null}},"280":{"start":{"line":885,"column":27},"end":{"line":885,"column":null}},"281":{"start":{"line":887,"column":3},"end":{"line":889,"column":null}},"282":{"start":{"line":890,"column":15},"end":{"line":890,"column":null}},"283":{"start":{"line":891,"column":2},"end":{"line":893,"column":null}},"284":{"start":{"line":894,"column":2},"end":{"line":894,"column":null}},"285":{"start":{"line":894,"column":12},"end":{"line":894,"column":null}},"286":{"start":{"line":896,"column":23},"end":{"line":896,"column":null}},"287":{"start":{"line":897,"column":2},"end":{"line":899,"column":null}},"288":{"start":{"line":898,"column":3},"end":{"line":898,"column":null}},"289":{"start":{"line":900,"column":2},"end":{"line":900,"column":null}},"290":{"start":{"line":904,"column":32},"end":{"line":904,"column":null}},"291":{"start":{"line":905,"column":32},"end":{"line":905,"column":null}},"292":{"start":{"line":915,"column":18},"end":{"line":915,"column":null}},"293":{"start":{"line":916,"column":1},"end":{"line":932,"column":null}},"294":{"start":{"line":917,"column":12},"end":{"line":917,"column":null}},"295":{"start":{"line":918,"column":17},"end":{"line":918,"column":null}},"296":{"start":{"line":919,"column":2},"end":{"line":922,"column":null}},"297":{"start":{"line":920,"column":3},"end":{"line":920,"column":null}},"298":{"start":{"line":921,"column":3},"end":{"line":921,"column":null}},"299":{"start":{"line":923,"column":2},"end":{"line":930,"column":null}},"300":{"start":{"line":924,"column":3},"end":{"line":928,"column":null}},"301":{"start":{"line":929,"column":3},"end":{"line":929,"column":null}},"302":{"start":{"line":931,"column":2},"end":{"line":931,"column":null}},"303":{"start":{"line":933,"column":1},"end":{"line":935,"column":null}},"304":{"start":{"line":945,"column":7},"end":{"line":945,"column":null}},"305":{"start":{"line":947,"column":13},"end":{"line":947,"column":null}},"306":{"start":{"line":948,"column":7},"end":{"line":948,"column":null}},"307":{"start":{"line":951,"column":1},"end":{"line":951,"column":null}},"308":{"start":{"line":952,"column":1},"end":{"line":955,"column":null}},"309":{"start":{"line":953,"column":2},"end":{"line":953,"column":null}},"310":{"start":{"line":954,"column":2},"end":{"line":954,"column":null}},"311":{"start":{"line":957,"column":1},"end":{"line":999,"column":null}},"312":{"start":{"line":958,"column":41},"end":{"line":958,"column":null}},"313":{"start":{"line":959,"column":2},"end":{"line":963,"column":null}},"314":{"start":{"line":964,"column":2},"end":{"line":964,"column":null}},"315":{"start":{"line":964,"column":15},"end":{"line":964,"column":null}},"316":{"start":{"line":966,"column":17},"end":{"line":966,"column":null}},"317":{"start":{"line":967,"column":18},"end":{"line":967,"column":null}},"318":{"start":{"line":968,"column":2},"end":{"line":980,"column":null}},"319":{"start":{"line":969,"column":3},"end":{"line":979,"column":null}},"320":{"start":{"line":977,"column":25},"end":{"line":977,"column":null}},"321":{"start":{"line":982,"column":2},"end":{"line":995,"column":null}},"322":{"start":{"line":983,"column":3},"end":{"line":994,"column":null}},"323":{"start":{"line":984,"column":4},"end":{"line":988,"column":null}},"324":{"start":{"line":989,"column":4},"end":{"line":991,"column":null}},"325":{"start":{"line":990,"column":5},"end":{"line":990,"column":null}},"326":{"start":{"line":993,"column":4},"end":{"line":993,"column":null}},"327":{"start":{"line":998,"column":2},"end":{"line":998,"column":null}},"328":{"start":{"line":1001,"column":1},"end":{"line":1004,"column":null}},"329":{"start":{"line":1002,"column":2},"end":{"line":1002,"column":null}},"330":{"start":{"line":1002,"column":15},"end":{"line":1002,"column":null}},"331":{"start":{"line":1003,"column":2},"end":{"line":1003,"column":null}},"332":{"start":{"line":1006,"column":1},"end":{"line":1029,"column":null}},"333":{"start":{"line":1007,"column":17},"end":{"line":1007,"column":null}},"334":{"start":{"line":1009,"column":22},"end":{"line":1015,"column":null}},"335":{"start":{"line":1010,"column":3},"end":{"line":1010,"column":null}},"336":{"start":{"line":1011,"column":3},"end":{"line":1013,"column":null}},"337":{"start":{"line":1014,"column":3},"end":{"line":1014,"column":null}},"338":{"start":{"line":1017,"column":18},"end":{"line":1020,"column":null}},"339":{"start":{"line":1018,"column":3},"end":{"line":1018,"column":null}},"340":{"start":{"line":1019,"column":3},"end":{"line":1019,"column":null}},"341":{"start":{"line":1022,"column":18},"end":{"line":1025,"column":null}},"342":{"start":{"line":1023,"column":3},"end":{"line":1023,"column":null}},"343":{"start":{"line":1024,"column":3},"end":{"line":1024,"column":null}},"344":{"start":{"line":1027,"column":2},"end":{"line":1027,"column":null}},"345":{"start":{"line":1028,"column":2},"end":{"line":1028,"column":null}},"346":{"start":{"line":1034,"column":18},"end":{"line":1034,"column":null}},"347":{"start":{"line":1035,"column":1},"end":{"line":1035,"column":null}},"348":{"start":{"line":1036,"column":1},"end":{"line":1038,"column":null}},"349":{"start":{"line":1043,"column":20},"end":{"line":1043,"column":null}},"350":{"start":{"line":1044,"column":16},"end":{"line":1044,"column":null}},"351":{"start":{"line":1046,"column":2},"end":{"line":1048,"column":null}},"352":{"start":{"line":1050,"column":2},"end":{"line":1050,"column":null}},"353":{"start":{"line":1051,"column":13},"end":{"line":1053,"column":null}},"354":{"start":{"line":1054,"column":1},"end":{"line":1054,"column":null}},"355":{"start":{"line":1054,"column":28},"end":{"line":1054,"column":null}},"356":{"start":{"line":1055,"column":1},"end":{"line":1055,"column":null}},"357":{"start":{"line":1055,"column":21},"end":{"line":1055,"column":null}},"358":{"start":{"line":1056,"column":1},"end":{"line":1056,"column":null}},"359":{"start":{"line":1065,"column":15},"end":{"line":1068,"column":null}},"360":{"start":{"line":1066,"column":8},"end":{"line":1066,"column":null}},"361":{"start":{"line":1067,"column":8},"end":{"line":1067,"column":null}},"362":{"start":{"line":1069,"column":1},"end":{"line":1069,"column":null}},"363":{"start":{"line":1069,"column":12},"end":{"line":1069,"column":null}},"364":{"start":{"line":1070,"column":17},"end":{"line":1073,"column":null}},"365":{"start":{"line":1074,"column":1},"end":{"line":1077,"column":null}},"366":{"start":{"line":1075,"column":2},"end":{"line":1075,"column":null}},"367":{"start":{"line":1076,"column":2},"end":{"line":1076,"column":null}},"368":{"start":{"line":1078,"column":1},"end":{"line":1078,"column":null}},"369":{"start":{"line":1079,"column":1},"end":{"line":1079,"column":null}},"370":{"start":{"line":1088,"column":23},"end":{"line":1091,"column":null}},"371":{"start":{"line":1089,"column":8},"end":{"line":1089,"column":null}},"372":{"start":{"line":1090,"column":8},"end":{"line":1090,"column":null}},"373":{"start":{"line":1092,"column":1},"end":{"line":1092,"column":null}},"374":{"start":{"line":1092,"column":20},"end":{"line":1092,"column":null}},"375":{"start":{"line":1094,"column":17},"end":{"line":1097,"column":null}},"376":{"start":{"line":1098,"column":1},"end":{"line":1101,"column":null}},"377":{"start":{"line":1099,"column":2},"end":{"line":1099,"column":null}},"378":{"start":{"line":1100,"column":2},"end":{"line":1100,"column":null}},"379":{"start":{"line":1102,"column":1},"end":{"line":1102,"column":null}},"380":{"start":{"line":1103,"column":1},"end":{"line":1103,"column":null}},"381":{"start":{"line":1113,"column":1},"end":{"line":1194,"column":null}},"382":{"start":{"line":1114,"column":8},"end":{"line":1116,"column":null}},"383":{"start":{"line":1117,"column":17},"end":{"line":1119,"column":null}},"384":{"start":{"line":1120,"column":2},"end":{"line":1141,"column":null}},"385":{"start":{"line":1121,"column":3},"end":{"line":1123,"column":null}},"386":{"start":{"line":1124,"column":3},"end":{"line":1128,"column":null}},"387":{"start":{"line":1129,"column":3},"end":{"line":1133,"column":null}},"388":{"start":{"line":1134,"column":19},"end":{"line":1137,"column":null}},"389":{"start":{"line":1138,"column":3},"end":{"line":1138,"column":null}},"390":{"start":{"line":1138,"column":17},"end":{"line":1138,"column":null}},"391":{"start":{"line":1139,"column":3},"end":{"line":1139,"column":null}},"392":{"start":{"line":1140,"column":3},"end":{"line":1140,"column":null}},"393":{"start":{"line":1143,"column":2},"end":{"line":1143,"column":null}},"394":{"start":{"line":1144,"column":21},"end":{"line":1151,"column":null}},"395":{"start":{"line":1152,"column":2},"end":{"line":1152,"column":null}},"396":{"start":{"line":1152,"column":21},"end":{"line":1152,"column":null}},"397":{"start":{"line":1154,"column":20},"end":{"line":1154,"column":null}},"398":{"start":{"line":1155,"column":17},"end":{"line":1155,"column":null}},"399":{"start":{"line":1156,"column":17},"end":{"line":1156,"column":null}},"400":{"start":{"line":1157,"column":2},"end":{"line":1169,"column":null}},"401":{"start":{"line":1158,"column":3},"end":{"line":1158,"column":null}},"402":{"start":{"line":1159,"column":21},"end":{"line":1159,"column":null}},"403":{"start":{"line":1160,"column":3},"end":{"line":1168,"column":null}},"404":{"start":{"line":1161,"column":4},"end":{"line":1161,"column":null}},"405":{"start":{"line":1163,"column":4},"end":{"line":1167,"column":null}},"406":{"start":{"line":1170,"column":2},"end":{"line":1179,"column":null}},"407":{"start":{"line":1174,"column":3},"end":{"line":1178,"column":null}},"408":{"start":{"line":1180,"column":2},"end":{"line":1182,"column":null}},"409":{"start":{"line":1183,"column":2},"end":{"line":1187,"column":null}},"410":{"start":{"line":1188,"column":2},"end":{"line":1192,"column":null}},"411":{"start":{"line":1189,"column":3},"end":{"line":1189,"column":null}},"412":{"start":{"line":1189,"column":22},"end":{"line":1189,"column":null}},"413":{"start":{"line":1190,"column":3},"end":{"line":1190,"column":null}},"414":{"start":{"line":1190,"column":22},"end":{"line":1190,"column":null}},"415":{"start":{"line":1191,"column":3},"end":{"line":1191,"column":null}},"416":{"start":{"line":1193,"column":2},"end":{"line":1193,"column":null}},"417":{"start":{"line":1204,"column":1},"end":{"line":1207,"column":null}},"418":{"start":{"line":1205,"column":2},"end":{"line":1205,"column":null}},"419":{"start":{"line":1206,"column":2},"end":{"line":1206,"column":null}},"420":{"start":{"line":1208,"column":1},"end":{"line":1243,"column":null}},"421":{"start":{"line":1211,"column":23},"end":{"line":1211,"column":null}},"422":{"start":{"line":1212,"column":18},"end":{"line":1215,"column":null}},"423":{"start":{"line":1216,"column":2},"end":{"line":1218,"column":null}},"424":{"start":{"line":1217,"column":3},"end":{"line":1217,"column":null}},"425":{"start":{"line":1219,"column":16},"end":{"line":1225,"column":null}},"426":{"start":{"line":1221,"column":5},"end":{"line":1224,"column":null}},"427":{"start":{"line":1226,"column":2},"end":{"line":1230,"column":null}},"428":{"start":{"line":1227,"column":3},"end":{"line":1229,"column":null}},"429":{"start":{"line":1231,"column":2},"end":{"line":1231,"column":null}},"430":{"start":{"line":1233,"column":2},"end":{"line":1233,"column":null}},"431":{"start":{"line":1234,"column":2},"end":{"line":1236,"column":null}},"432":{"start":{"line":1235,"column":3},"end":{"line":1235,"column":null}},"433":{"start":{"line":1237,"column":2},"end":{"line":1241,"column":null}},"434":{"start":{"line":1242,"column":2},"end":{"line":1242,"column":null}},"435":{"start":{"line":1250,"column":13},"end":{"line":1250,"column":null}},"436":{"start":{"line":1251,"column":15},"end":{"line":1251,"column":null}},"437":{"start":{"line":1252,"column":1},"end":{"line":1267,"column":null}},"438":{"start":{"line":1253,"column":15},"end":{"line":1256,"column":null}},"439":{"start":{"line":1257,"column":2},"end":{"line":1257,"column":null}},"440":{"start":{"line":1257,"column":34},"end":{"line":1257,"column":null}},"441":{"start":{"line":1258,"column":2},"end":{"line":1262,"column":null}},"442":{"start":{"line":1259,"column":3},"end":{"line":1261,"column":null}},"443":{"start":{"line":1263,"column":2},"end":{"line":1263,"column":null}},"444":{"start":{"line":1265,"column":2},"end":{"line":1265,"column":null}},"445":{"start":{"line":1265,"column":19},"end":{"line":1265,"column":null}},"446":{"start":{"line":1266,"column":2},"end":{"line":1266,"column":null}},"447":{"start":{"line":1275,"column":1},"end":{"line":1289,"column":null}},"448":{"start":{"line":1276,"column":14},"end":{"line":1276,"column":null}},"449":{"start":{"line":1277,"column":16},"end":{"line":1277,"column":null}},"450":{"start":{"line":1278,"column":15},"end":{"line":1281,"column":null}},"451":{"start":{"line":1283,"column":4},"end":{"line":1284,"column":null}},"452":{"start":{"line":1285,"column":2},"end":{"line":1285,"column":null}},"453":{"start":{"line":1287,"column":2},"end":{"line":1287,"column":null}},"454":{"start":{"line":1287,"column":19},"end":{"line":1287,"column":null}},"455":{"start":{"line":1288,"column":2},"end":{"line":1288,"column":null}},"456":{"start":{"line":1297,"column":14},"end":{"line":1297,"column":null}},"457":{"start":{"line":1298,"column":1},"end":{"line":1298,"column":null}},"458":{"start":{"line":1298,"column":12},"end":{"line":1298,"column":null}},"459":{"start":{"line":1299,"column":1},"end":{"line":1315,"column":null}},"460":{"start":{"line":1300,"column":2},"end":{"line":1303,"column":null}},"461":{"start":{"line":1304,"column":18},"end":{"line":1304,"column":null}},"462":{"start":{"line":1305,"column":17},"end":{"line":1305,"column":null}},"463":{"start":{"line":1306,"column":2},"end":{"line":1310,"column":null}},"464":{"start":{"line":1311,"column":2},"end":{"line":1311,"column":null}},"465":{"start":{"line":1313,"column":2},"end":{"line":1313,"column":null}},"466":{"start":{"line":1313,"column":19},"end":{"line":1313,"column":null}},"467":{"start":{"line":1314,"column":2},"end":{"line":1314,"column":null}},"468":{"start":{"line":1326,"column":19},"end":{"line":1326,"column":null}},"469":{"start":{"line":1327,"column":21},"end":{"line":1327,"column":null}},"470":{"start":{"line":1330,"column":1},"end":{"line":1362,"column":null}},"471":{"start":{"line":1331,"column":2},"end":{"line":1341,"column":null}},"472":{"start":{"line":1343,"column":18},"end":{"line":1345,"column":null}},"473":{"start":{"line":1347,"column":3},"end":{"line":1347,"column":null}},"474":{"start":{"line":1348,"column":2},"end":{"line":1351,"column":null}},"475":{"start":{"line":1349,"column":3},"end":{"line":1349,"column":null}},"476":{"start":{"line":1350,"column":3},"end":{"line":1350,"column":null}},"477":{"start":{"line":1352,"column":2},"end":{"line":1355,"column":null}},"478":{"start":{"line":1353,"column":3},"end":{"line":1355,"column":null}},"479":{"start":{"line":1357,"column":2},"end":{"line":1361,"column":null}},"480":{"start":{"line":1358,"column":3},"end":{"line":1361,"column":null}},"481":{"start":{"line":1365,"column":1},"end":{"line":1393,"column":null}},"482":{"start":{"line":1366,"column":2},"end":{"line":1373,"column":null}},"483":{"start":{"line":1374,"column":18},"end":{"line":1376,"column":null}},"484":{"start":{"line":1378,"column":3},"end":{"line":1378,"column":null}},"485":{"start":{"line":1379,"column":2},"end":{"line":1382,"column":null}},"486":{"start":{"line":1380,"column":3},"end":{"line":1380,"column":null}},"487":{"start":{"line":1381,"column":3},"end":{"line":1381,"column":null}},"488":{"start":{"line":1383,"column":2},"end":{"line":1386,"column":null}},"489":{"start":{"line":1384,"column":3},"end":{"line":1386,"column":null}},"490":{"start":{"line":1388,"column":2},"end":{"line":1392,"column":null}},"491":{"start":{"line":1389,"column":3},"end":{"line":1392,"column":null}},"492":{"start":{"line":1396,"column":1},"end":{"line":1420,"column":null}},"493":{"start":{"line":1397,"column":2},"end":{"line":1413,"column":null}},"494":{"start":{"line":1398,"column":3},"end":{"line":1401,"column":null}},"495":{"start":{"line":1402,"column":19},"end":{"line":1404,"column":null}},"496":{"start":{"line":1406,"column":4},"end":{"line":1406,"column":null}},"497":{"start":{"line":1407,"column":3},"end":{"line":1411,"column":null}},"498":{"start":{"line":1412,"column":3},"end":{"line":1412,"column":null}},"499":{"start":{"line":1415,"column":2},"end":{"line":1419,"column":null}},"500":{"start":{"line":1416,"column":3},"end":{"line":1419,"column":null}},"501":{"start":{"line":1423,"column":1},"end":{"line":1436,"column":null}},"502":{"start":{"line":1424,"column":19},"end":{"line":1424,"column":null}},"503":{"start":{"line":1425,"column":2},"end":{"line":1433,"column":null}},"504":{"start":{"line":1426,"column":30},"end":{"line":1426,"column":null}},"505":{"start":{"line":1427,"column":3},"end":{"line":1430,"column":null}},"506":{"start":{"line":1431,"column":3},"end":{"line":1431,"column":null}},"507":{"start":{"line":1432,"column":3},"end":{"line":1432,"column":null}},"508":{"start":{"line":1435,"column":2},"end":{"line":1435,"column":null}},"509":{"start":{"line":1435,"column":19},"end":{"line":1435,"column":null}},"510":{"start":{"line":1439,"column":33},"end":{"line":1443,"column":null}},"511":{"start":{"line":1444,"column":1},"end":{"line":1444,"column":null}},"512":{"start":{"line":1444,"column":30},"end":{"line":1444,"column":null}},"513":{"start":{"line":1446,"column":1},"end":{"line":1446,"column":null}},"514":{"start":{"line":1447,"column":1},"end":{"line":1451,"column":null}},"515":{"start":{"line":1452,"column":1},"end":{"line":1456,"column":null}},"516":{"start":{"line":1457,"column":1},"end":{"line":1457,"column":null}},"517":{"start":{"line":1469,"column":11},"end":{"line":1469,"column":null}},"518":{"start":{"line":1470,"column":16},"end":{"line":1470,"column":null}},"519":{"start":{"line":1471,"column":1},"end":{"line":1471,"column":null}},"520":{"start":{"line":1471,"column":21},"end":{"line":1471,"column":null}},"521":{"start":{"line":1472,"column":1},"end":{"line":1472,"column":null}},"522":{"start":{"line":1472,"column":23},"end":{"line":1472,"column":null}},"523":{"start":{"line":1473,"column":1},"end":{"line":1473,"column":null}},"524":{"start":{"line":1473,"column":16},"end":{"line":1473,"column":null}},"525":{"start":{"line":1474,"column":1},"end":{"line":1474,"column":null}},"526":{"start":{"line":1474,"column":17},"end":{"line":1474,"column":null}},"527":{"start":{"line":1475,"column":1},"end":{"line":1475,"column":null}},"528":{"start":{"line":1483,"column":16},"end":{"line":1483,"column":null}},"529":{"start":{"line":1484,"column":1},"end":{"line":1486,"column":null}},"530":{"start":{"line":1487,"column":15},"end":{"line":1487,"column":null}},"531":{"start":{"line":1488,"column":1},"end":{"line":1490,"column":null}},"532":{"start":{"line":1489,"column":2},"end":{"line":1489,"column":null}},"533":{"start":{"line":1500,"column":13},"end":{"line":1500,"column":null}},"534":{"start":{"line":1501,"column":16},"end":{"line":1501,"column":null}},"535":{"start":{"line":1502,"column":7},"end":{"line":1502,"column":null}},"536":{"start":{"line":1504,"column":13},"end":{"line":1504,"column":null}},"537":{"start":{"line":1505,"column":14},"end":{"line":1505,"column":null}},"538":{"start":{"line":1507,"column":1},"end":{"line":1509,"column":null}},"539":{"start":{"line":1511,"column":21},"end":{"line":1516,"column":null}},"540":{"start":{"line":1512,"column":2},"end":{"line":1512,"column":null}},"541":{"start":{"line":1512,"column":13},"end":{"line":1512,"column":null}},"542":{"start":{"line":1513,"column":2},"end":{"line":1515,"column":null}},"543":{"start":{"line":1514,"column":3},"end":{"line":1514,"column":null}},"544":{"start":{"line":1518,"column":19},"end":{"line":1518,"column":null}},"545":{"start":{"line":1519,"column":1},"end":{"line":1523,"column":null}},"546":{"start":{"line":1520,"column":2},"end":{"line":1520,"column":null}},"547":{"start":{"line":1520,"column":20},"end":{"line":1520,"column":null}},"548":{"start":{"line":1521,"column":2},"end":{"line":1521,"column":null}},"549":{"start":{"line":1522,"column":2},"end":{"line":1522,"column":null}},"550":{"start":{"line":1525,"column":18},"end":{"line":1525,"column":null}},"551":{"start":{"line":1526,"column":1},"end":{"line":1557,"column":null}},"552":{"start":{"line":1527,"column":2},"end":{"line":1553,"column":null}},"553":{"start":{"line":1528,"column":20},"end":{"line":1532,"column":null}},"554":{"start":{"line":1534,"column":27},"end":{"line":1540,"column":null}},"555":{"start":{"line":1535,"column":36},"end":{"line":1535,"column":61}},"556":{"start":{"line":1537,"column":16},"end":{"line":1537,"column":null}},"557":{"start":{"line":1538,"column":16},"end":{"line":1538,"column":null}},"558":{"start":{"line":1539,"column":5},"end":{"line":1539,"column":null}},"559":{"start":{"line":1542,"column":3},"end":{"line":1550,"column":null}},"560":{"start":{"line":1543,"column":4},"end":{"line":1543,"column":null}},"561":{"start":{"line":1543,"column":25},"end":{"line":1543,"column":null}},"562":{"start":{"line":1544,"column":4},"end":{"line":1544,"column":null}},"563":{"start":{"line":1545,"column":17},"end":{"line":1545,"column":null}},"564":{"start":{"line":1546,"column":20},"end":{"line":1546,"column":null}},"565":{"start":{"line":1547,"column":4},"end":{"line":1547,"column":null}},"566":{"start":{"line":1548,"column":4},"end":{"line":1548,"column":null}},"567":{"start":{"line":1549,"column":4},"end":{"line":1549,"column":null}},"568":{"start":{"line":1552,"column":3},"end":{"line":1552,"column":null}},"569":{"start":{"line":1555,"column":2},"end":{"line":1555,"column":null}},"570":{"start":{"line":1556,"column":2},"end":{"line":1556,"column":null}},"571":{"start":{"line":1567,"column":18},"end":{"line":1598,"column":null}},"572":{"start":{"line":1570,"column":14},"end":{"line":1572,"column":null}},"573":{"start":{"line":1573,"column":3},"end":{"line":1573,"column":null}},"574":{"start":{"line":1575,"column":21},"end":{"line":1585,"column":null}},"575":{"start":{"line":1586,"column":3},"end":{"line":1586,"column":null}},"576":{"start":{"line":1586,"column":19},"end":{"line":1586,"column":null}},"577":{"start":{"line":1587,"column":3},"end":{"line":1596,"column":null}},"578":{"start":{"line":1588,"column":4},"end":{"line":1588,"column":null}},"579":{"start":{"line":1589,"column":4},"end":{"line":1591,"column":null}},"580":{"start":{"line":1590,"column":5},"end":{"line":1590,"column":null}},"581":{"start":{"line":1593,"column":4},"end":{"line":1595,"column":null}},"582":{"start":{"line":1600,"column":1},"end":{"line":1604,"column":null}},"583":{"start":{"line":1605,"column":1},"end":{"line":1610,"column":null}},"584":{"start":{"line":1606,"column":2},"end":{"line":1609,"column":null}},"585":{"start":{"line":1607,"column":3},"end":{"line":1607,"column":null}},"586":{"start":{"line":1608,"column":3},"end":{"line":1608,"column":null}},"587":{"start":{"line":1612,"column":1},"end":{"line":1614,"column":null}},"588":{"start":{"line":1613,"column":2},"end":{"line":1613,"column":null}},"589":{"start":{"line":1629,"column":1},"end":{"line":1629,"column":null}},"590":{"start":{"line":1630,"column":21},"end":{"line":1630,"column":null}},"591":{"start":{"line":1631,"column":21},"end":{"line":1631,"column":null}},"592":{"start":{"line":1633,"column":1},"end":{"line":1635,"column":null}},"593":{"start":{"line":1634,"column":2},"end":{"line":1634,"column":null}},"594":{"start":{"line":1636,"column":1},"end":{"line":1638,"column":null}},"595":{"start":{"line":1637,"column":2},"end":{"line":1637,"column":null}},"596":{"start":{"line":1640,"column":1},"end":{"line":1646,"column":null}},"597":{"start":{"line":1641,"column":2},"end":{"line":1643,"column":null}},"598":{"start":{"line":1642,"column":3},"end":{"line":1642,"column":null}},"599":{"start":{"line":1644,"column":2},"end":{"line":1644,"column":null}},"600":{"start":{"line":1645,"column":2},"end":{"line":1645,"column":null}},"601":{"start":{"line":1648,"column":16},"end":{"line":1648,"column":null}},"602":{"start":{"line":1649,"column":1},"end":{"line":1649,"column":null}},"603":{"start":{"line":1649,"column":14},"end":{"line":1649,"column":null}},"604":{"start":{"line":1650,"column":1},"end":{"line":1650,"column":null}},"605":{"start":{"line":1650,"column":24},"end":{"line":1650,"column":null}},"606":{"start":{"line":1651,"column":1},"end":{"line":1656,"column":null}},"607":{"start":{"line":1665,"column":15},"end":{"line":1665,"column":null}},"608":{"start":{"line":1666,"column":25},"end":{"line":1666,"column":null}},"609":{"start":{"line":1667,"column":1},"end":{"line":1669,"column":null}},"610":{"start":{"line":1668,"column":2},"end":{"line":1668,"column":null}},"611":{"start":{"line":1670,"column":1},"end":{"line":1672,"column":null}},"612":{"start":{"line":1671,"column":2},"end":{"line":1671,"column":null}},"613":{"start":{"line":1674,"column":18},"end":{"line":1674,"column":null}},"614":{"start":{"line":1675,"column":1},"end":{"line":1678,"column":null}},"615":{"start":{"line":1676,"column":2},"end":{"line":1676,"column":null}},"616":{"start":{"line":1677,"column":2},"end":{"line":1677,"column":null}},"617":{"start":{"line":1679,"column":1},"end":{"line":1682,"column":null}},"618":{"start":{"line":1680,"column":2},"end":{"line":1680,"column":null}},"619":{"start":{"line":1681,"column":2},"end":{"line":1681,"column":null}},"620":{"start":{"line":1683,"column":1},"end":{"line":1685,"column":null}},"621":{"start":{"line":1684,"column":2},"end":{"line":1684,"column":null}},"622":{"start":{"line":1699,"column":14},"end":{"line":1699,"column":null}},"623":{"start":{"line":1700,"column":1},"end":{"line":1702,"column":null}},"624":{"start":{"line":1701,"column":2},"end":{"line":1701,"column":null}},"625":{"start":{"line":1703,"column":1},"end":{"line":1703,"column":null}},"626":{"start":{"line":1705,"column":16},"end":{"line":1710,"column":null}},"627":{"start":{"line":1711,"column":1},"end":{"line":1711,"column":null}},"628":{"start":{"line":1725,"column":14},"end":{"line":1725,"column":null}},"629":{"start":{"line":1726,"column":1},"end":{"line":1728,"column":null}},"630":{"start":{"line":1727,"column":2},"end":{"line":1727,"column":null}},"631":{"start":{"line":1730,"column":1},"end":{"line":1730,"column":null}},"632":{"start":{"line":1733,"column":13},"end":{"line":1733,"column":null}},"633":{"start":{"line":1734,"column":1},"end":{"line":1734,"column":null}},"634":{"start":{"line":1737,"column":1},"end":{"line":1737,"column":null}},"635":{"start":{"line":1738,"column":14},"end":{"line":1738,"column":null}},"636":{"start":{"line":1739,"column":19},"end":{"line":1739,"column":null}},"637":{"start":{"line":1740,"column":1},"end":{"line":1740,"column":null}},"638":{"start":{"line":1743,"column":16},"end":{"line":1748,"column":null}},"639":{"start":{"line":1751,"column":16},"end":{"line":1751,"column":null}},"640":{"start":{"line":1752,"column":19},"end":{"line":1756,"column":null}},"641":{"start":{"line":1757,"column":1},"end":{"line":1757,"column":null}},"642":{"start":{"line":1759,"column":1},"end":{"line":1761,"column":null}},"643":{"start":{"line":1762,"column":1},"end":{"line":1762,"column":null}},"644":{"start":{"line":1778,"column":14},"end":{"line":1778,"column":null}},"645":{"start":{"line":1779,"column":34},"end":{"line":1779,"column":null}},"646":{"start":{"line":1780,"column":1},"end":{"line":1784,"column":null}},"647":{"start":{"line":1781,"column":2},"end":{"line":1781,"column":null}},"648":{"start":{"line":1781,"column":23},"end":{"line":1781,"column":null}},"649":{"start":{"line":1782,"column":2},"end":{"line":1782,"column":null}},"650":{"start":{"line":1783,"column":2},"end":{"line":1783,"column":null}},"651":{"start":{"line":1785,"column":1},"end":{"line":1785,"column":null}},"652":{"start":{"line":1789,"column":1},"end":{"line":1793,"column":null}},"653":{"start":{"line":1790,"column":13},"end":{"line":1790,"column":null}},"654":{"start":{"line":1791,"column":13},"end":{"line":1791,"column":null}},"655":{"start":{"line":1792,"column":2},"end":{"line":1792,"column":null}},"656":{"start":{"line":1797,"column":12},"end":{"line":1797,"column":null}},"657":{"start":{"line":1799,"column":2},"end":{"line":1803,"column":null}},"658":{"start":{"line":1804,"column":16},"end":{"line":1804,"column":null}},"659":{"start":{"line":1806,"column":2},"end":{"line":1808,"column":null}},"660":{"start":{"line":1809,"column":7},"end":{"line":1809,"column":null}},"661":{"start":{"line":1811,"column":2},"end":{"line":1811,"column":null}},"662":{"start":{"line":1812,"column":1},"end":{"line":1812,"column":null}},"663":{"start":{"line":1820,"column":13},"end":{"line":1820,"column":null}},"664":{"start":{"line":1821,"column":16},"end":{"line":1821,"column":null}},"665":{"start":{"line":1822,"column":7},"end":{"line":1822,"column":null}},"666":{"start":{"line":1823,"column":15},"end":{"line":1823,"column":null}},"667":{"start":{"line":1826,"column":20},"end":{"line":1826,"column":null}},"668":{"start":{"line":1827,"column":17},"end":{"line":1831,"column":null}},"669":{"start":{"line":1832,"column":18},"end":{"line":1836,"column":null}},"670":{"start":{"line":1838,"column":18},"end":{"line":1850,"column":null}},"671":{"start":{"line":1839,"column":40},"end":{"line":1849,"column":4}},"672":{"start":{"line":1852,"column":1},"end":{"line":1852,"column":null}},"673":{"start":{"line":1855,"column":0},"end":{"line":1858,"column":null}},"674":{"start":{"line":1860,"column":0},"end":{"line":1872,"column":null}},"675":{"start":{"line":1865,"column":2},"end":{"line":1865,"column":null}},"676":{"start":{"line":1866,"column":2},"end":{"line":1871,"column":null}},"677":{"start":{"line":1867,"column":3},"end":{"line":1867,"column":null}},"678":{"start":{"line":1869,"column":3},"end":{"line":1869,"column":null}},"679":{"start":{"line":1870,"column":3},"end":{"line":1870,"column":null}},"680":{"start":{"line":1874,"column":0},"end":{"line":1901,"column":null}},"681":{"start":{"line":1894,"column":15},"end":{"line":1894,"column":null}},"682":{"start":{"line":1895,"column":2},"end":{"line":1900,"column":null}},"683":{"start":{"line":1896,"column":3},"end":{"line":1896,"column":null}},"684":{"start":{"line":1898,"column":3},"end":{"line":1898,"column":null}},"685":{"start":{"line":1899,"column":3},"end":{"line":1899,"column":null}},"686":{"start":{"line":1903,"column":0},"end":{"line":1929,"column":null}},"687":{"start":{"line":1916,"column":26},"end":{"line":1916,"column":null}},"688":{"start":{"line":1917,"column":26},"end":{"line":1917,"column":null}},"689":{"start":{"line":1919,"column":2},"end":{"line":1922,"column":null}},"690":{"start":{"line":1920,"column":3},"end":{"line":1920,"column":null}},"691":{"start":{"line":1921,"column":3},"end":{"line":1921,"column":null}},"692":{"start":{"line":1923,"column":2},"end":{"line":1926,"column":null}},"693":{"start":{"line":1924,"column":3},"end":{"line":1924,"column":null}},"694":{"start":{"line":1925,"column":3},"end":{"line":1925,"column":null}},"695":{"start":{"line":1928,"column":2},"end":{"line":1928,"column":null}},"696":{"start":{"line":1931,"column":0},"end":{"line":1946,"column":null}},"697":{"start":{"line":1944,"column":2},"end":{"line":1944,"column":null}},"698":{"start":{"line":1945,"column":2},"end":{"line":1945,"column":null}},"699":{"start":{"line":1948,"column":0},"end":{"line":1970,"column":null}},"700":{"start":{"line":1963,"column":15},"end":{"line":1963,"column":null}},"701":{"start":{"line":1964,"column":2},"end":{"line":1969,"column":null}},"702":{"start":{"line":1965,"column":3},"end":{"line":1965,"column":null}},"703":{"start":{"line":1967,"column":3},"end":{"line":1967,"column":null}},"704":{"start":{"line":1968,"column":3},"end":{"line":1968,"column":null}},"705":{"start":{"line":1972,"column":0},"end":{"line":2000,"column":null}},"706":{"start":{"line":1986,"column":2},"end":{"line":1986,"column":null}},"707":{"start":{"line":1987,"column":26},"end":{"line":1987,"column":null}},"708":{"start":{"line":1988,"column":26},"end":{"line":1988,"column":null}},"709":{"start":{"line":1990,"column":2},"end":{"line":1993,"column":null}},"710":{"start":{"line":1991,"column":3},"end":{"line":1991,"column":null}},"711":{"start":{"line":1992,"column":3},"end":{"line":1992,"column":null}},"712":{"start":{"line":1994,"column":2},"end":{"line":1997,"column":null}},"713":{"start":{"line":1995,"column":3},"end":{"line":1995,"column":null}},"714":{"start":{"line":1996,"column":3},"end":{"line":1996,"column":null}},"715":{"start":{"line":1999,"column":2},"end":{"line":1999,"column":null}},"716":{"start":{"line":2002,"column":0},"end":{"line":2042,"column":null}},"717":{"start":{"line":2026,"column":2},"end":{"line":2026,"column":null}},"718":{"start":{"line":2027,"column":2},"end":{"line":2027,"column":null}},"719":{"start":{"line":2028,"column":15},"end":{"line":2028,"column":null}},"720":{"start":{"line":2029,"column":2},"end":{"line":2041,"column":null}},"721":{"start":{"line":2030,"column":18},"end":{"line":2030,"column":null}},"722":{"start":{"line":2031,"column":3},"end":{"line":2036,"column":null}},"723":{"start":{"line":2032,"column":4},"end":{"line":2035,"column":null}},"724":{"start":{"line":2033,"column":5},"end":{"line":2033,"column":null}},"725":{"start":{"line":2034,"column":5},"end":{"line":2034,"column":null}},"726":{"start":{"line":2037,"column":3},"end":{"line":2037,"column":null}},"727":{"start":{"line":2039,"column":3},"end":{"line":2039,"column":null}},"728":{"start":{"line":2040,"column":3},"end":{"line":2040,"column":null}},"729":{"start":{"line":2044,"column":0},"end":{"line":2071,"column":null}},"730":{"start":{"line":2055,"column":2},"end":{"line":2055,"column":null}},"731":{"start":{"line":2056,"column":2},"end":{"line":2056,"column":null}},"732":{"start":{"line":2057,"column":15},"end":{"line":2057,"column":null}},"733":{"start":{"line":2058,"column":2},"end":{"line":2070,"column":null}},"734":{"start":{"line":2059,"column":22},"end":{"line":2059,"column":null}},"735":{"start":{"line":2060,"column":3},"end":{"line":2065,"column":null}},"736":{"start":{"line":2061,"column":4},"end":{"line":2064,"column":null}},"737":{"start":{"line":2062,"column":5},"end":{"line":2062,"column":null}},"738":{"start":{"line":2063,"column":5},"end":{"line":2063,"column":null}},"739":{"start":{"line":2066,"column":3},"end":{"line":2066,"column":null}},"740":{"start":{"line":2068,"column":3},"end":{"line":2068,"column":null}},"741":{"start":{"line":2069,"column":3},"end":{"line":2069,"column":null}},"742":{"start":{"line":2126,"column":1},"end":{"line":2126,"column":null}},"743":{"start":{"line":2128,"column":0},"end":{"line":2130,"column":null}},"744":{"start":{"line":2129,"column":1},"end":{"line":2129,"column":null}}},"fnMap":{"0":{"name":"createDefaultDeps","decl":{"start":{"line":78,"column":9},"end":{"line":78,"column":38}},"loc":{"start":{"line":78,"column":38},"end":{"line":99,"column":null}},"line":78},"1":{"name":"(anonymous_1)","decl":{"start":{"line":197,"column":7},"end":{"line":197,"column":8}},"loc":{"start":{"line":197,"column":17},"end":{"line":200,"column":null}},"line":197},"2":{"name":"(anonymous_2)","decl":{"start":{"line":212,"column":14},"end":{"line":212,"column":15}},"loc":{"start":{"line":212,"column":28},"end":{"line":232,"column":2}},"line":212},"3":{"name":"readEnv","decl":{"start":{"line":234,"column":9},"end":{"line":234,"column":17}},"loc":{"start":{"line":234,"column":66},"end":{"line":263,"column":null}},"line":234},"4":{"name":"(anonymous_4)","decl":{"start":{"line":239,"column":30},"end":{"line":239,"column":31}},"loc":{"start":{"line":239,"column":39},"end":{"line":239,"column":72}},"line":239},"5":{"name":"runExec","decl":{"start":{"line":271,"column":15},"end":{"line":271,"column":null}},"loc":{"start":{"line":275,"column":23},"end":{"line":297,"column":null}},"line":275},"6":{"name":"runCommandWithTimeout","decl":{"start":{"line":307,"column":15},"end":{"line":307,"column":null}},"loc":{"start":{"line":310,"column":24},"end":{"line":342,"column":null}},"line":310},"7":{"name":"(anonymous_7)","decl":{"start":{"line":312,"column":26},"end":{"line":312,"column":27}},"loc":{"start":{"line":312,"column":47},"end":{"line":341,"column":2}},"line":312},"8":{"name":"(anonymous_8)","decl":{"start":{"line":319,"column":27},"end":{"line":319,"column":33}},"loc":{"start":{"line":319,"column":33},"end":{"line":321,"column":5}},"line":319},"9":{"name":"(anonymous_9)","decl":{"start":{"line":323,"column":27},"end":{"line":323,"column":28}},"loc":{"start":{"line":323,"column":34},"end":{"line":325,"column":3}},"line":323},"10":{"name":"(anonymous_10)","decl":{"start":{"line":326,"column":27},"end":{"line":326,"column":28}},"loc":{"start":{"line":326,"column":34},"end":{"line":328,"column":3}},"line":326},"11":{"name":"(anonymous_11)","decl":{"start":{"line":329,"column":20},"end":{"line":329,"column":21}},"loc":{"start":{"line":329,"column":29},"end":{"line":334,"column":3}},"line":329},"12":{"name":"(anonymous_12)","decl":{"start":{"line":335,"column":20},"end":{"line":335,"column":21}},"loc":{"start":{"line":335,"column":38},"end":{"line":340,"column":3}},"line":335},"13":{"name":"(anonymous_13)","decl":{"start":{"line":349,"column":1},"end":{"line":349,"column":13}},"loc":{"start":{"line":349,"column":45},"end":{"line":354,"column":null}},"line":349},"14":{"name":"isErrno","decl":{"start":{"line":357,"column":9},"end":{"line":357,"column":17}},"loc":{"start":{"line":357,"column":61},"end":{"line":359,"column":null}},"line":357},"15":{"name":"describePortOwner","decl":{"start":{"line":361,"column":15},"end":{"line":361,"column":33}},"loc":{"start":{"line":361,"column":76},"end":{"line":376,"column":null}},"line":361},"16":{"name":"ensurePortAvailable","decl":{"start":{"line":378,"column":15},"end":{"line":378,"column":35}},"loc":{"start":{"line":378,"column":64},"end":{"line":397,"column":null}},"line":378},"17":{"name":"(anonymous_17)","decl":{"start":{"line":381,"column":26},"end":{"line":381,"column":27}},"loc":{"start":{"line":381,"column":47},"end":{"line":389,"column":3}},"line":381},"18":{"name":"(anonymous_18)","decl":{"start":{"line":384,"column":19},"end":{"line":384,"column":20}},"loc":{"start":{"line":384,"column":28},"end":{"line":384,"column":39}},"line":384},"19":{"name":"(anonymous_19)","decl":{"start":{"line":385,"column":23},"end":{"line":385,"column":29}},"loc":{"start":{"line":385,"column":29},"end":{"line":387,"column":5}},"line":385},"20":{"name":"(anonymous_20)","decl":{"start":{"line":386,"column":18},"end":{"line":386,"column":24}},"loc":{"start":{"line":386,"column":24},"end":{"line":386,"column":33}},"line":386},"21":{"name":"handlePortError","decl":{"start":{"line":399,"column":15},"end":{"line":399,"column":null}},"loc":{"start":{"line":404,"column":18},"end":{"line":434,"column":null}},"line":404},"22":{"name":"ensureBinary","decl":{"start":{"line":436,"column":15},"end":{"line":436,"column":null}},"loc":{"start":{"line":440,"column":17},"end":{"line":446,"column":null}},"line":440},"23":{"name":"(anonymous_23)","decl":{"start":{"line":442,"column":35},"end":{"line":442,"column":41}},"loc":{"start":{"line":442,"column":41},"end":{"line":445,"column":2}},"line":442},"24":{"name":"promptYesNo","decl":{"start":{"line":448,"column":15},"end":{"line":448,"column":null}},"loc":{"start":{"line":451,"column":20},"end":{"line":462,"column":null}},"line":451},"25":{"name":"loadConfig","decl":{"start":{"line":495,"column":9},"end":{"line":495,"column":37}},"loc":{"start":{"line":495,"column":37},"end":{"line":507,"column":null}},"line":495},"26":{"name":"applyTemplate","decl":{"start":{"line":520,"column":9},"end":{"line":520,"column":23}},"loc":{"start":{"line":520,"column":58},"end":{"line":526,"column":null}},"line":520},"27":{"name":"(anonymous_27)","decl":{"start":{"line":522,"column":40},"end":{"line":522,"column":41}},"loc":{"start":{"line":522,"column":52},"end":{"line":525,"column":2}},"line":522},"28":{"name":"resolveStorePath","decl":{"start":{"line":540,"column":9},"end":{"line":540,"column":26}},"loc":{"start":{"line":540,"column":42},"end":{"line":544,"column":null}},"line":540},"29":{"name":"loadSessionStore","decl":{"start":{"line":546,"column":9},"end":{"line":546,"column":26}},"loc":{"start":{"line":546,"column":75},"end":{"line":557,"column":null}},"line":546},"30":{"name":"saveSessionStore","decl":{"start":{"line":559,"column":15},"end":{"line":559,"column":32}},"loc":{"start":{"line":559,"column":88},"end":{"line":562,"column":null}},"line":559},"31":{"name":"deriveSessionKey","decl":{"start":{"line":564,"column":9},"end":{"line":564,"column":26}},"loc":{"start":{"line":564,"column":64},"end":{"line":568,"column":null}},"line":564},"32":{"name":"getReplyFromConfig","decl":{"start":{"line":570,"column":15},"end":{"line":570,"column":null}},"loc":{"start":{"line":575,"column":31},"end":{"line":754,"column":null}},"line":575},"33":{"name":"(anonymous_33)","decl":{"start":{"line":582,"column":22},"end":{"line":582,"column":34}},"loc":{"start":{"line":582,"column":34},"end":{"line":586,"column":null}},"line":582},"34":{"name":"(anonymous_34)","decl":{"start":{"line":680,"column":31},"end":{"line":680,"column":32}},"loc":{"start":{"line":680,"column":41},"end":{"line":680,"column":75}},"line":680},"35":{"name":"(anonymous_35)","decl":{"start":{"line":693,"column":9},"end":{"line":693,"column":10}},"loc":{"start":{"line":693,"column":19},"end":{"line":693,"column":53}},"line":693},"36":{"name":"autoReplyIfConfigured","decl":{"start":{"line":756,"column":15},"end":{"line":756,"column":null}},"loc":{"start":{"line":761,"column":17},"end":{"line":810,"column":null}},"line":761},"37":{"name":"(anonymous_37)","decl":{"start":{"line":773,"column":17},"end":{"line":773,"column":23}},"loc":{"start":{"line":773,"column":23},"end":{"line":773,"column":null}},"line":773},"38":{"name":"createClient","decl":{"start":{"line":812,"column":9},"end":{"line":812,"column":22}},"loc":{"start":{"line":812,"column":38},"end":{"line":822,"column":null}},"line":812},"39":{"name":"sendTypingIndicator","decl":{"start":{"line":824,"column":15},"end":{"line":824,"column":null}},"loc":{"start":{"line":828,"column":2},"end":{"line":851,"column":null}},"line":828},"40":{"name":"sendMessage","decl":{"start":{"line":853,"column":15},"end":{"line":853,"column":null}},"loc":{"start":{"line":857,"column":2},"end":{"line":902,"column":null}},"line":857},"41":{"name":"waitForFinalStatus","decl":{"start":{"line":907,"column":15},"end":{"line":907,"column":null}},"loc":{"start":{"line":913,"column":2},"end":{"line":936,"column":null}},"line":913},"42":{"name":"startWebhook","decl":{"start":{"line":938,"column":15},"end":{"line":938,"column":null}},"loc":{"start":{"line":944,"column":34},"end":{"line":1030,"column":null}},"line":944},"43":{"name":"(anonymous_43)","decl":{"start":{"line":952,"column":9},"end":{"line":952,"column":10}},"loc":{"start":{"line":952,"column":30},"end":{"line":955,"column":2}},"line":952},"44":{"name":"(anonymous_44)","decl":{"start":{"line":957,"column":26},"end":{"line":957,"column":33}},"loc":{"start":{"line":957,"column":65},"end":{"line":999,"column":2}},"line":957},"45":{"name":"(anonymous_45)","decl":{"start":{"line":977,"column":19},"end":{"line":977,"column":25}},"loc":{"start":{"line":977,"column":25},"end":{"line":977,"column":null}},"line":977},"46":{"name":"(anonymous_46)","decl":{"start":{"line":1001,"column":9},"end":{"line":1001,"column":10}},"loc":{"start":{"line":1001,"column":24},"end":{"line":1004,"column":2}},"line":1001},"47":{"name":"(anonymous_47)","decl":{"start":{"line":1006,"column":26},"end":{"line":1006,"column":27}},"loc":{"start":{"line":1006,"column":47},"end":{"line":1029,"column":2}},"line":1006},"48":{"name":"(anonymous_48)","decl":{"start":{"line":1009,"column":22},"end":{"line":1009,"column":28}},"loc":{"start":{"line":1009,"column":28},"end":{"line":1015,"column":null}},"line":1009},"49":{"name":"(anonymous_49)","decl":{"start":{"line":1017,"column":18},"end":{"line":1017,"column":19}},"loc":{"start":{"line":1017,"column":50},"end":{"line":1020,"column":null}},"line":1017},"50":{"name":"(anonymous_50)","decl":{"start":{"line":1022,"column":18},"end":{"line":1022,"column":24}},"loc":{"start":{"line":1022,"column":24},"end":{"line":1025,"column":null}},"line":1022},"51":{"name":"waitForever","decl":{"start":{"line":1032,"column":9},"end":{"line":1032,"column":23}},"loc":{"start":{"line":1032,"column":23},"end":{"line":1039,"column":null}},"line":1032},"52":{"name":"(anonymous_52)","decl":{"start":{"line":1034,"column":30},"end":{"line":1034,"column":36}},"loc":{"start":{"line":1034,"column":36},"end":{"line":1034,"column":40}},"line":1034},"53":{"name":"(anonymous_53)","decl":{"start":{"line":1036,"column":26},"end":{"line":1036,"column":32}},"loc":{"start":{"line":1036,"column":32},"end":{"line":1038,"column":2}},"line":1036},"54":{"name":"getTailnetHostname","decl":{"start":{"line":1041,"column":15},"end":{"line":1041,"column":34}},"loc":{"start":{"line":1041,"column":66},"end":{"line":1057,"column":null}},"line":1041},"55":{"name":"ensureGoInstalled","decl":{"start":{"line":1059,"column":15},"end":{"line":1059,"column":null}},"loc":{"start":{"line":1063,"column":2},"end":{"line":1080,"column":null}},"line":1063},"56":{"name":"(anonymous_56)","decl":{"start":{"line":1066,"column":2},"end":{"line":1066,"column":8}},"loc":{"start":{"line":1066,"column":8},"end":{"line":1066,"column":null}},"line":1066},"57":{"name":"(anonymous_57)","decl":{"start":{"line":1067,"column":2},"end":{"line":1067,"column":8}},"loc":{"start":{"line":1067,"column":8},"end":{"line":1067,"column":null}},"line":1067},"58":{"name":"ensureTailscaledInstalled","decl":{"start":{"line":1082,"column":15},"end":{"line":1082,"column":null}},"loc":{"start":{"line":1086,"column":2},"end":{"line":1104,"column":null}},"line":1086},"59":{"name":"(anonymous_59)","decl":{"start":{"line":1089,"column":2},"end":{"line":1089,"column":8}},"loc":{"start":{"line":1089,"column":8},"end":{"line":1089,"column":null}},"line":1089},"60":{"name":"(anonymous_60)","decl":{"start":{"line":1090,"column":2},"end":{"line":1090,"column":8}},"loc":{"start":{"line":1090,"column":8},"end":{"line":1090,"column":null}},"line":1090},"61":{"name":"ensureFunnel","decl":{"start":{"line":1106,"column":15},"end":{"line":1106,"column":null}},"loc":{"start":{"line":1111,"column":2},"end":{"line":1195,"column":null}},"line":1111},"62":{"name":"findWhatsappSenderSid","decl":{"start":{"line":1197,"column":15},"end":{"line":1197,"column":null}},"loc":{"start":{"line":1202,"column":2},"end":{"line":1244,"column":null}},"line":1202},"63":{"name":"(anonymous_63)","decl":{"start":{"line":1220,"column":3},"end":{"line":1220,"column":4}},"loc":{"start":{"line":1221,"column":5},"end":{"line":1224,"column":null}},"line":1221},"64":{"name":"findIncomingNumberSid","decl":{"start":{"line":1246,"column":15},"end":{"line":1246,"column":null}},"loc":{"start":{"line":1248,"column":26},"end":{"line":1268,"column":null}},"line":1248},"65":{"name":"findMessagingServiceSid","decl":{"start":{"line":1270,"column":15},"end":{"line":1270,"column":null}},"loc":{"start":{"line":1272,"column":26},"end":{"line":1290,"column":null}},"line":1272},"66":{"name":"setMessagingServiceWebhook","decl":{"start":{"line":1292,"column":15},"end":{"line":1292,"column":null}},"loc":{"start":{"line":1296,"column":20},"end":{"line":1316,"column":null}},"line":1296},"67":{"name":"updateWebhook","decl":{"start":{"line":1318,"column":15},"end":{"line":1318,"column":null}},"loc":{"start":{"line":1324,"column":2},"end":{"line":1458,"column":null}},"line":1324},"68":{"name":"formatTwilioError","decl":{"start":{"line":1468,"column":9},"end":{"line":1468,"column":27}},"loc":{"start":{"line":1468,"column":49},"end":{"line":1476,"column":null}},"line":1468},"69":{"name":"logTwilioSendError","decl":{"start":{"line":1478,"column":9},"end":{"line":1478,"column":null}},"loc":{"start":{"line":1482,"column":2},"end":{"line":1491,"column":null}},"line":1482},"70":{"name":"monitor","decl":{"start":{"line":1493,"column":15},"end":{"line":1493,"column":null}},"loc":{"start":{"line":1498,"column":2},"end":{"line":1558,"column":null}},"line":1498},"71":{"name":"(anonymous_71)","decl":{"start":{"line":1511,"column":21},"end":{"line":1511,"column":22}},"loc":{"start":{"line":1511,"column":45},"end":{"line":1516,"column":null}},"line":1511},"72":{"name":"(anonymous_72)","decl":{"start":{"line":1519,"column":24},"end":{"line":1519,"column":30}},"loc":{"start":{"line":1519,"column":30},"end":{"line":1523,"column":2}},"line":1519},"73":{"name":"(anonymous_73)","decl":{"start":{"line":1535,"column":12},"end":{"line":1535,"column":13}},"loc":{"start":{"line":1535,"column":36},"end":{"line":1535,"column":61}},"line":1535},"74":{"name":"(anonymous_74)","decl":{"start":{"line":1536,"column":10},"end":{"line":1536,"column":11}},"loc":{"start":{"line":1536,"column":54},"end":{"line":1540,"column":5}},"line":1536},"75":{"name":"monitorWebProvider","decl":{"start":{"line":1560,"column":15},"end":{"line":1560,"column":null}},"loc":{"start":{"line":1565,"column":2},"end":{"line":1615,"column":null}},"line":1565},"76":{"name":"(anonymous_76)","decl":{"start":{"line":1569,"column":13},"end":{"line":1569,"column":20}},"loc":{"start":{"line":1569,"column":28},"end":{"line":1597,"column":null}},"line":1569},"77":{"name":"(anonymous_77)","decl":{"start":{"line":1605,"column":22},"end":{"line":1605,"column":28}},"loc":{"start":{"line":1605,"column":28},"end":{"line":1610,"column":2}},"line":1605},"78":{"name":"(anonymous_78)","decl":{"start":{"line":1606,"column":32},"end":{"line":1606,"column":38}},"loc":{"start":{"line":1606,"column":38},"end":{"line":1609,"column":3}},"line":1606},"79":{"name":"performSend","decl":{"start":{"line":1617,"column":15},"end":{"line":1617,"column":null}},"loc":{"start":{"line":1628,"column":2},"end":{"line":1657,"column":null}},"line":1628},"80":{"name":"performStatus","decl":{"start":{"line":1659,"column":15},"end":{"line":1659,"column":null}},"loc":{"start":{"line":1664,"column":2},"end":{"line":1686,"column":null}},"line":1664},"81":{"name":"performWebhookSetup","decl":{"start":{"line":1688,"column":15},"end":{"line":1688,"column":null}},"loc":{"start":{"line":1698,"column":2},"end":{"line":1712,"column":null}},"line":1698},"82":{"name":"performUp","decl":{"start":{"line":1714,"column":15},"end":{"line":1714,"column":null}},"loc":{"start":{"line":1724,"column":2},"end":{"line":1763,"column":null}},"line":1724},"83":{"name":"uniqueBySid","decl":{"start":{"line":1777,"column":9},"end":{"line":1777,"column":21}},"loc":{"start":{"line":1777,"column":65},"end":{"line":1786,"column":null}},"line":1777},"84":{"name":"sortByDateDesc","decl":{"start":{"line":1788,"column":9},"end":{"line":1788,"column":24}},"loc":{"start":{"line":1788,"column":68},"end":{"line":1794,"column":null}},"line":1788},"85":{"name":"(anonymous_85)","decl":{"start":{"line":1789,"column":27},"end":{"line":1789,"column":28}},"loc":{"start":{"line":1789,"column":37},"end":{"line":1793,"column":2}},"line":1789},"86":{"name":"formatMessageLine","decl":{"start":{"line":1796,"column":9},"end":{"line":1796,"column":27}},"loc":{"start":{"line":1796,"column":53},"end":{"line":1813,"column":null}},"line":1796},"87":{"name":"listRecentMessages","decl":{"start":{"line":1815,"column":15},"end":{"line":1815,"column":null}},"loc":{"start":{"line":1819,"column":28},"end":{"line":1853,"column":null}},"line":1819},"88":{"name":"(anonymous_88)","decl":{"start":{"line":1839,"column":32},"end":{"line":1839,"column":33}},"loc":{"start":{"line":1839,"column":40},"end":{"line":1849,"column":4}},"line":1839},"89":{"name":"(anonymous_89)","decl":{"start":{"line":1864,"column":9},"end":{"line":1864,"column":16}},"loc":{"start":{"line":1864,"column":25},"end":{"line":1872,"column":2}},"line":1864},"90":{"name":"(anonymous_90)","decl":{"start":{"line":1893,"column":9},"end":{"line":1893,"column":16}},"loc":{"start":{"line":1893,"column":25},"end":{"line":1901,"column":2}},"line":1893},"91":{"name":"(anonymous_91)","decl":{"start":{"line":1915,"column":9},"end":{"line":1915,"column":16}},"loc":{"start":{"line":1915,"column":25},"end":{"line":1929,"column":2}},"line":1915},"92":{"name":"(anonymous_92)","decl":{"start":{"line":1943,"column":9},"end":{"line":1943,"column":16}},"loc":{"start":{"line":1943,"column":25},"end":{"line":1946,"column":2}},"line":1943},"93":{"name":"(anonymous_93)","decl":{"start":{"line":1962,"column":9},"end":{"line":1962,"column":16}},"loc":{"start":{"line":1962,"column":25},"end":{"line":1970,"column":2}},"line":1962},"94":{"name":"(anonymous_94)","decl":{"start":{"line":1985,"column":9},"end":{"line":1985,"column":16}},"loc":{"start":{"line":1985,"column":25},"end":{"line":2000,"column":2}},"line":1985},"95":{"name":"(anonymous_95)","decl":{"start":{"line":2025,"column":9},"end":{"line":2025,"column":16}},"loc":{"start":{"line":2025,"column":25},"end":{"line":2042,"column":2}},"line":2025},"96":{"name":"(anonymous_96)","decl":{"start":{"line":2031,"column":24},"end":{"line":2031,"column":30}},"loc":{"start":{"line":2031,"column":30},"end":{"line":2036,"column":4}},"line":2031},"97":{"name":"(anonymous_97)","decl":{"start":{"line":2032,"column":17},"end":{"line":2032,"column":23}},"loc":{"start":{"line":2032,"column":23},"end":{"line":2035,"column":5}},"line":2032},"98":{"name":"(anonymous_98)","decl":{"start":{"line":2054,"column":9},"end":{"line":2054,"column":16}},"loc":{"start":{"line":2054,"column":25},"end":{"line":2071,"column":2}},"line":2054},"99":{"name":"(anonymous_99)","decl":{"start":{"line":2060,"column":24},"end":{"line":2060,"column":30}},"loc":{"start":{"line":2060,"column":30},"end":{"line":2065,"column":4}},"line":2060},"100":{"name":"(anonymous_100)","decl":{"start":{"line":2061,"column":17},"end":{"line":2061,"column":23}},"loc":{"start":{"line":2061,"column":23},"end":{"line":2064,"column":5}},"line":2061}},"branchMap":{"0":{"loc":{"start":{"line":213,"column":2},"end":{"line":218,"column":null}},"type":"if","locations":[{"start":{"line":213,"column":2},"end":{"line":218,"column":null}},{"start":{},"end":{}}],"line":213},"1":{"loc":{"start":{"line":213,"column":6},"end":{"line":213,"column":52}},"type":"binary-expr","locations":[{"start":{"line":213,"column":6},"end":{"line":213,"column":28}},{"start":{"line":213,"column":28},"end":{"line":213,"column":52}}],"line":213},"2":{"loc":{"start":{"line":219,"column":2},"end":{"line":224,"column":null}},"type":"if","locations":[{"start":{"line":219,"column":2},"end":{"line":224,"column":null}},{"start":{},"end":{}}],"line":219},"3":{"loc":{"start":{"line":219,"column":6},"end":{"line":219,"column":52}},"type":"binary-expr","locations":[{"start":{"line":219,"column":6},"end":{"line":219,"column":31}},{"start":{"line":219,"column":31},"end":{"line":219,"column":52}}],"line":219},"4":{"loc":{"start":{"line":225,"column":2},"end":{"line":231,"column":null}},"type":"if","locations":[{"start":{"line":225,"column":2},"end":{"line":231,"column":null}},{"start":{},"end":{}}],"line":225},"5":{"loc":{"start":{"line":225,"column":6},"end":{"line":225,"column":80}},"type":"binary-expr","locations":[{"start":{"line":225,"column":6},"end":{"line":225,"column":32}},{"start":{"line":225,"column":32},"end":{"line":225,"column":80}}],"line":225},"6":{"loc":{"start":{"line":225,"column":34},"end":{"line":225,"column":80}},"type":"binary-expr","locations":[{"start":{"line":225,"column":34},"end":{"line":225,"column":56}},{"start":{"line":225,"column":56},"end":{"line":225,"column":80}}],"line":225},"7":{"loc":{"start":{"line":234,"column":17},"end":{"line":234,"column":66}},"type":"default-arg","locations":[{"start":{"line":234,"column":39},"end":{"line":234,"column":66}}],"line":234},"8":{"loc":{"start":{"line":237,"column":1},"end":{"line":241,"column":null}},"type":"if","locations":[{"start":{"line":237,"column":1},"end":{"line":241,"column":null}},{"start":{},"end":{}}],"line":237},"9":{"loc":{"start":{"line":253,"column":2},"end":{"line":255,"column":null}},"type":"cond-expr","locations":[{"start":{"line":254,"column":5},"end":{"line":254,"column":null}},{"start":{"line":255,"column":5},"end":{"line":255,"column":null}}],"line":253},"10":{"loc":{"start":{"line":253,"column":2},"end":{"line":253,"column":null}},"type":"binary-expr","locations":[{"start":{"line":253,"column":2},"end":{"line":253,"column":12}},{"start":{"line":253,"column":12},"end":{"line":253,"column":null}}],"line":253},"11":{"loc":{"start":{"line":274,"column":1},"end":{"line":274,"column":null}},"type":"default-arg","locations":[{"start":{"line":274,"column":53},"end":{"line":274,"column":null}}],"line":274},"12":{"loc":{"start":{"line":274,"column":3},"end":{"line":274,"column":26}},"type":"default-arg","locations":[{"start":{"line":274,"column":15},"end":{"line":274,"column":26}}],"line":274},"13":{"loc":{"start":{"line":277,"column":1},"end":{"line":279,"column":null}},"type":"if","locations":[{"start":{"line":277,"column":1},"end":{"line":279,"column":null}},{"start":{},"end":{}}],"line":277},"14":{"loc":{"start":{"line":286,"column":2},"end":{"line":289,"column":null}},"type":"if","locations":[{"start":{"line":286,"column":2},"end":{"line":289,"column":null}},{"start":{},"end":{}}],"line":286},"15":{"loc":{"start":{"line":287,"column":3},"end":{"line":287,"column":null}},"type":"if","locations":[{"start":{"line":287,"column":3},"end":{"line":287,"column":null}},{"start":{},"end":{}}],"line":287},"16":{"loc":{"start":{"line":288,"column":3},"end":{"line":288,"column":null}},"type":"if","locations":[{"start":{"line":288,"column":3},"end":{"line":288,"column":null}},{"start":{},"end":{}}],"line":288},"17":{"loc":{"start":{"line":292,"column":2},"end":{"line":294,"column":null}},"type":"if","locations":[{"start":{"line":292,"column":2},"end":{"line":294,"column":null}},{"start":{},"end":{}}],"line":292},"18":{"loc":{"start":{"line":330,"column":3},"end":{"line":330,"column":null}},"type":"if","locations":[{"start":{"line":330,"column":3},"end":{"line":330,"column":null}},{"start":{},"end":{}}],"line":330},"19":{"loc":{"start":{"line":336,"column":3},"end":{"line":336,"column":null}},"type":"if","locations":[{"start":{"line":336,"column":3},"end":{"line":336,"column":null}},{"start":{},"end":{}}],"line":336},"20":{"loc":{"start":{"line":358,"column":16},"end":{"line":358,"column":63}},"type":"binary-expr","locations":[{"start":{"line":358,"column":16},"end":{"line":358,"column":23}},{"start":{"line":358,"column":23},"end":{"line":358,"column":50}},{"start":{"line":358,"column":50},"end":{"line":358,"column":63}}],"line":358},"21":{"loc":{"start":{"line":371,"column":2},"end":{"line":371,"column":null}},"type":"if","locations":[{"start":{"line":371,"column":2},"end":{"line":371,"column":null}},{"start":{},"end":{}}],"line":371},"22":{"loc":{"start":{"line":391,"column":2},"end":{"line":394,"column":null}},"type":"if","locations":[{"start":{"line":391,"column":2},"end":{"line":394,"column":null}},{"start":{},"end":{}}],"line":391},"23":{"loc":{"start":{"line":391,"column":6},"end":{"line":391,"column":49}},"type":"binary-expr","locations":[{"start":{"line":391,"column":6},"end":{"line":391,"column":22}},{"start":{"line":391,"column":22},"end":{"line":391,"column":49}}],"line":391},"24":{"loc":{"start":{"line":403,"column":1},"end":{"line":403,"column":null}},"type":"default-arg","locations":[{"start":{"line":403,"column":23},"end":{"line":403,"column":null}}],"line":403},"25":{"loc":{"start":{"line":405,"column":1},"end":{"line":431,"column":null}},"type":"if","locations":[{"start":{"line":405,"column":1},"end":{"line":431,"column":null}},{"start":{},"end":{}}],"line":405},"26":{"loc":{"start":{"line":406,"column":2},"end":{"line":407,"column":null}},"type":"binary-expr","locations":[{"start":{"line":406,"column":2},"end":{"line":406,"column":null}},{"start":{"line":407,"column":3},"end":{"line":407,"column":19}},{"start":{"line":407,"column":19},"end":{"line":407,"column":null}}],"line":406},"27":{"loc":{"start":{"line":410,"column":3},"end":{"line":412,"column":null}},"type":"cond-expr","locations":[{"start":{"line":411,"column":6},"end":{"line":411,"column":null}},{"start":{"line":412,"column":6},"end":{"line":412,"column":null}}],"line":410},"28":{"loc":{"start":{"line":414,"column":2},"end":{"line":424,"column":null}},"type":"if","locations":[{"start":{"line":414,"column":2},"end":{"line":424,"column":null}},{"start":{},"end":{}}],"line":414},"29":{"loc":{"start":{"line":417,"column":3},"end":{"line":423,"column":null}},"type":"if","locations":[{"start":{"line":417,"column":3},"end":{"line":423,"column":null}},{"start":{},"end":{}}],"line":417},"30":{"loc":{"start":{"line":438,"column":1},"end":{"line":438,"column":null}},"type":"default-arg","locations":[{"start":{"line":438,"column":24},"end":{"line":438,"column":null}}],"line":438},"31":{"loc":{"start":{"line":439,"column":1},"end":{"line":439,"column":null}},"type":"default-arg","locations":[{"start":{"line":439,"column":23},"end":{"line":439,"column":null}}],"line":439},"32":{"loc":{"start":{"line":450,"column":1},"end":{"line":450,"column":null}},"type":"default-arg","locations":[{"start":{"line":450,"column":14},"end":{"line":450,"column":null}}],"line":450},"33":{"loc":{"start":{"line":452,"column":1},"end":{"line":452,"column":null}},"type":"if","locations":[{"start":{"line":452,"column":1},"end":{"line":452,"column":null}},{"start":{},"end":{}}],"line":452},"34":{"loc":{"start":{"line":452,"column":1},"end":{"line":452,"column":29}},"type":"binary-expr","locations":[{"start":{"line":452,"column":1},"end":{"line":452,"column":20}},{"start":{"line":452,"column":15},"end":{"line":452,"column":29}}],"line":452},"35":{"loc":{"start":{"line":453,"column":1},"end":{"line":453,"column":null}},"type":"if","locations":[{"start":{"line":453,"column":1},"end":{"line":453,"column":null}},{"start":{},"end":{}}],"line":453},"36":{"loc":{"start":{"line":455,"column":16},"end":{"line":455,"column":null}},"type":"cond-expr","locations":[{"start":{"line":455,"column":29},"end":{"line":455,"column":41}},{"start":{"line":455,"column":41},"end":{"line":455,"column":null}}],"line":455},"37":{"loc":{"start":{"line":460,"column":1},"end":{"line":460,"column":null}},"type":"if","locations":[{"start":{"line":460,"column":1},"end":{"line":460,"column":null}},{"start":{},"end":{}}],"line":460},"38":{"loc":{"start":{"line":498,"column":2},"end":{"line":498,"column":null}},"type":"if","locations":[{"start":{"line":498,"column":2},"end":{"line":498,"column":null}},{"start":{},"end":{}}],"line":498},"39":{"loc":{"start":{"line":501,"column":2},"end":{"line":501,"column":null}},"type":"if","locations":[{"start":{"line":501,"column":2},"end":{"line":501,"column":null}},{"start":{},"end":{}}],"line":501},"40":{"loc":{"start":{"line":501,"column":6},"end":{"line":501,"column":53}},"type":"binary-expr","locations":[{"start":{"line":501,"column":6},"end":{"line":501,"column":36}},{"start":{"line":501,"column":36},"end":{"line":501,"column":53}}],"line":501},"41":{"loc":{"start":{"line":524,"column":9},"end":{"line":524,"column":null}},"type":"cond-expr","locations":[{"start":{"line":524,"column":25},"end":{"line":524,"column":30}},{"start":{"line":524,"column":30},"end":{"line":524,"column":null}}],"line":524},"42":{"loc":{"start":{"line":541,"column":1},"end":{"line":541,"column":null}},"type":"if","locations":[{"start":{"line":541,"column":1},"end":{"line":541,"column":null}},{"start":{},"end":{}}],"line":541},"43":{"loc":{"start":{"line":542,"column":1},"end":{"line":542,"column":null}},"type":"if","locations":[{"start":{"line":542,"column":1},"end":{"line":542,"column":null}},{"start":{},"end":{}}],"line":542},"44":{"loc":{"start":{"line":550,"column":2},"end":{"line":552,"column":null}},"type":"if","locations":[{"start":{"line":550,"column":2},"end":{"line":552,"column":null}},{"start":{},"end":{}}],"line":550},"45":{"loc":{"start":{"line":550,"column":6},"end":{"line":550,"column":44}},"type":"binary-expr","locations":[{"start":{"line":550,"column":6},"end":{"line":550,"column":16}},{"start":{"line":550,"column":16},"end":{"line":550,"column":44}}],"line":550},"46":{"loc":{"start":{"line":565,"column":1},"end":{"line":565,"column":null}},"type":"if","locations":[{"start":{"line":565,"column":1},"end":{"line":565,"column":null}},{"start":{},"end":{}}],"line":565},"47":{"loc":{"start":{"line":566,"column":14},"end":{"line":566,"column":null}},"type":"cond-expr","locations":[{"start":{"line":566,"column":18},"end":{"line":566,"column":51}},{"start":{"line":566,"column":51},"end":{"line":566,"column":null}}],"line":566},"48":{"loc":{"start":{"line":567,"column":8},"end":{"line":567,"column":null}},"type":"binary-expr","locations":[{"start":{"line":567,"column":8},"end":{"line":567,"column":16}},{"start":{"line":567,"column":16},"end":{"line":567,"column":null}}],"line":567},"49":{"loc":{"start":{"line":574,"column":1},"end":{"line":574,"column":null}},"type":"default-arg","locations":[{"start":{"line":574,"column":47},"end":{"line":574,"column":null}}],"line":574},"50":{"loc":{"start":{"line":577,"column":13},"end":{"line":577,"column":null}},"type":"binary-expr","locations":[{"start":{"line":577,"column":13},"end":{"line":577,"column":31}},{"start":{"line":577,"column":31},"end":{"line":577,"column":null}}],"line":577},"51":{"loc":{"start":{"line":579,"column":33},"end":{"line":579,"column":63}},"type":"binary-expr","locations":[{"start":{"line":579,"column":33},"end":{"line":579,"column":58}},{"start":{"line":579,"column":58},"end":{"line":579,"column":63}}],"line":579},"52":{"loc":{"start":{"line":583,"column":2},"end":{"line":583,"column":null}},"type":"if","locations":[{"start":{"line":583,"column":2},"end":{"line":583,"column":null}},{"start":{},"end":{}}],"line":583},"53":{"loc":{"start":{"line":591,"column":2},"end":{"line":593,"column":null}},"type":"cond-expr","locations":[{"start":{"line":592,"column":5},"end":{"line":592,"column":null}},{"start":{"line":593,"column":5},"end":{"line":593,"column":null}}],"line":591},"54":{"loc":{"start":{"line":594,"column":30},"end":{"line":594,"column":79}},"type":"binary-expr","locations":[{"start":{"line":594,"column":30},"end":{"line":594,"column":57}},{"start":{"line":594,"column":57},"end":{"line":594,"column":79}}],"line":594},"55":{"loc":{"start":{"line":595,"column":22},"end":{"line":595,"column":null}},"type":"binary-expr","locations":[{"start":{"line":595,"column":22},"end":{"line":595,"column":43}},{"start":{"line":595,"column":43},"end":{"line":595,"column":null}}],"line":595},"56":{"loc":{"start":{"line":602,"column":1},"end":{"line":634,"column":null}},"type":"if","locations":[{"start":{"line":602,"column":1},"end":{"line":634,"column":null}},{"start":{},"end":{}}],"line":602},"57":{"loc":{"start":{"line":603,"column":23},"end":{"line":603,"column":39}},"type":"binary-expr","locations":[{"start":{"line":603,"column":23},"end":{"line":603,"column":35}},{"start":{"line":603,"column":35},"end":{"line":603,"column":39}}],"line":603},"58":{"loc":{"start":{"line":605,"column":3},"end":{"line":605,"column":null}},"type":"if","locations":[{"start":{"line":605,"column":3},"end":{"line":605,"column":null}},{"start":{},"end":{}}],"line":605},"59":{"loc":{"start":{"line":606,"column":3},"end":{"line":610,"column":null}},"type":"if","locations":[{"start":{"line":606,"column":3},"end":{"line":610,"column":null}},{"start":{},"end":{}}],"line":606},"60":{"loc":{"start":{"line":612,"column":3},"end":{"line":616,"column":null}},"type":"if","locations":[{"start":{"line":612,"column":3},"end":{"line":616,"column":null}},{"start":{},"end":{}}],"line":612},"61":{"loc":{"start":{"line":623,"column":21},"end":{"line":623,"column":null}},"type":"binary-expr","locations":[{"start":{"line":623,"column":21},"end":{"line":623,"column":30}},{"start":{"line":623,"column":30},"end":{"line":623,"column":null}}],"line":623},"62":{"loc":{"start":{"line":625,"column":2},"end":{"line":630,"column":null}},"type":"if","locations":[{"start":{"line":625,"column":2},"end":{"line":630,"column":null}},{"start":{"line":627,"column":9},"end":{"line":630,"column":null}}],"line":625},"63":{"loc":{"start":{"line":625,"column":6},"end":{"line":625,"column":35}},"type":"binary-expr","locations":[{"start":{"line":625,"column":6},"end":{"line":625,"column":23}},{"start":{"line":625,"column":23},"end":{"line":625,"column":35}}],"line":625},"64":{"loc":{"start":{"line":638,"column":16},"end":{"line":638,"column":null}},"type":"binary-expr","locations":[{"start":{"line":638,"column":16},"end":{"line":638,"column":32}},{"start":{"line":638,"column":32},"end":{"line":638,"column":null}}],"line":638},"65":{"loc":{"start":{"line":640,"column":16},"end":{"line":640,"column":null}},"type":"cond-expr","locations":[{"start":{"line":640,"column":31},"end":{"line":640,"column":40}},{"start":{"line":640,"column":40},"end":{"line":640,"column":null}}],"line":640},"66":{"loc":{"start":{"line":644,"column":20},"end":{"line":646,"column":null}},"type":"cond-expr","locations":[{"start":{"line":645,"column":4},"end":{"line":645,"column":null}},{"start":{"line":646,"column":4},"end":{"line":646,"column":null}}],"line":644},"67":{"loc":{"start":{"line":647,"column":22},"end":{"line":649,"column":null}},"type":"cond-expr","locations":[{"start":{"line":648,"column":4},"end":{"line":648,"column":null}},{"start":{"line":649,"column":4},"end":{"line":649,"column":null}}],"line":647},"68":{"loc":{"start":{"line":648,"column":20},"end":{"line":648,"column":68}},"type":"binary-expr","locations":[{"start":{"line":648,"column":20},"end":{"line":648,"column":47}},{"start":{"line":648,"column":47},"end":{"line":648,"column":66}},{"start":{"line":648,"column":66},"end":{"line":648,"column":68}}],"line":648},"69":{"loc":{"start":{"line":649,"column":4},"end":{"line":649,"column":null}},"type":"binary-expr","locations":[{"start":{"line":649,"column":4},"end":{"line":649,"column":31}},{"start":{"line":649,"column":31},"end":{"line":649,"column":null}}],"line":649},"70":{"loc":{"start":{"line":658,"column":1},"end":{"line":666,"column":null}},"type":"if","locations":[{"start":{"line":658,"column":1},"end":{"line":666,"column":null}},{"start":{},"end":{}}],"line":658},"71":{"loc":{"start":{"line":658,"column":5},"end":{"line":658,"column":55}},"type":"binary-expr","locations":[{"start":{"line":658,"column":5},"end":{"line":658,"column":33}},{"start":{"line":658,"column":33},"end":{"line":658,"column":55}}],"line":658},"72":{"loc":{"start":{"line":659,"column":16},"end":{"line":659,"column":32}},"type":"binary-expr","locations":[{"start":{"line":659,"column":16},"end":{"line":659,"column":28}},{"start":{"line":659,"column":28},"end":{"line":659,"column":32}}],"line":659},"73":{"loc":{"start":{"line":660,"column":2},"end":{"line":665,"column":null}},"type":"if","locations":[{"start":{"line":660,"column":2},"end":{"line":665,"column":null}},{"start":{},"end":{}}],"line":660},"74":{"loc":{"start":{"line":662,"column":35},"end":{"line":662,"column":54}},"type":"binary-expr","locations":[{"start":{"line":662,"column":35},"end":{"line":662,"column":43}},{"start":{"line":662,"column":43},"end":{"line":662,"column":54}}],"line":662},"75":{"loc":{"start":{"line":667,"column":1},"end":{"line":670,"column":null}},"type":"if","locations":[{"start":{"line":667,"column":1},"end":{"line":670,"column":null}},{"start":{},"end":{}}],"line":667},"76":{"loc":{"start":{"line":672,"column":1},"end":{"line":676,"column":null}},"type":"if","locations":[{"start":{"line":672,"column":1},"end":{"line":676,"column":null}},{"start":{},"end":{}}],"line":672},"77":{"loc":{"start":{"line":672,"column":5},"end":{"line":672,"column":42}},"type":"binary-expr","locations":[{"start":{"line":672,"column":5},"end":{"line":672,"column":30}},{"start":{"line":672,"column":30},"end":{"line":672,"column":42}}],"line":672},"78":{"loc":{"start":{"line":678,"column":1},"end":{"line":751,"column":null}},"type":"if","locations":[{"start":{"line":678,"column":1},"end":{"line":751,"column":null}},{"start":{},"end":{}}],"line":678},"79":{"loc":{"start":{"line":678,"column":5},"end":{"line":678,"column":56}},"type":"binary-expr","locations":[{"start":{"line":678,"column":5},"end":{"line":678,"column":33}},{"start":{"line":678,"column":33},"end":{"line":678,"column":56}}],"line":678},"80":{"loc":{"start":{"line":681,"column":25},"end":{"line":683,"column":null}},"type":"cond-expr","locations":[{"start":{"line":682,"column":5},"end":{"line":682,"column":null}},{"start":{"line":683,"column":5},"end":{"line":683,"column":null}}],"line":681},"81":{"loc":{"start":{"line":684,"column":2},"end":{"line":686,"column":null}},"type":"if","locations":[{"start":{"line":684,"column":2},"end":{"line":686,"column":null}},{"start":{},"end":{}}],"line":684},"82":{"loc":{"start":{"line":684,"column":6},"end":{"line":684,"column":41}},"type":"binary-expr","locations":[{"start":{"line":684,"column":6},"end":{"line":684,"column":24}},{"start":{"line":684,"column":24},"end":{"line":684,"column":41}}],"line":684},"83":{"loc":{"start":{"line":689,"column":2},"end":{"line":703,"column":null}},"type":"if","locations":[{"start":{"line":689,"column":2},"end":{"line":703,"column":null}},{"start":{},"end":{}}],"line":689},"84":{"loc":{"start":{"line":690,"column":27},"end":{"line":692,"column":null}},"type":"cond-expr","locations":[{"start":{"line":691,"column":6},"end":{"line":691,"column":null}},{"start":{"line":692,"column":6},"end":{"line":692,"column":null}}],"line":690},"85":{"loc":{"start":{"line":691,"column":6},"end":{"line":691,"column":null}},"type":"binary-expr","locations":[{"start":{"line":691,"column":6},"end":{"line":691,"column":37}},{"start":{"line":691,"column":37},"end":{"line":691,"column":null}}],"line":691},"86":{"loc":{"start":{"line":692,"column":6},"end":{"line":692,"column":null}},"type":"binary-expr","locations":[{"start":{"line":692,"column":6},"end":{"line":692,"column":40}},{"start":{"line":692,"column":40},"end":{"line":692,"column":null}}],"line":692},"87":{"loc":{"start":{"line":694,"column":3},"end":{"line":702,"column":null}},"type":"if","locations":[{"start":{"line":694,"column":3},"end":{"line":702,"column":null}},{"start":{},"end":{}}],"line":694},"88":{"loc":{"start":{"line":695,"column":29},"end":{"line":695,"column":null}},"type":"binary-expr","locations":[{"start":{"line":695,"column":29},"end":{"line":695,"column":67}},{"start":{"line":695,"column":67},"end":{"line":695,"column":null}}],"line":695},"89":{"loc":{"start":{"line":696,"column":21},"end":{"line":696,"column":null}},"type":"cond-expr","locations":[{"start":{"line":696,"column":59},"end":{"line":696,"column":77}},{"start":{"line":696,"column":77},"end":{"line":696,"column":null}}],"line":696},"90":{"loc":{"start":{"line":696,"column":21},"end":{"line":696,"column":59}},"type":"binary-expr","locations":[{"start":{"line":696,"column":21},"end":{"line":696,"column":41}},{"start":{"line":696,"column":41},"end":{"line":696,"column":59}}],"line":696},"91":{"loc":{"start":{"line":711,"column":3},"end":{"line":713,"column":null}},"type":"if","locations":[{"start":{"line":711,"column":3},"end":{"line":713,"column":null}},{"start":{},"end":{}}],"line":711},"92":{"loc":{"start":{"line":715,"column":44},"end":{"line":715,"column":64}},"type":"binary-expr","locations":[{"start":{"line":715,"column":44},"end":{"line":715,"column":55}},{"start":{"line":715,"column":55},"end":{"line":715,"column":64}}],"line":715},"93":{"loc":{"start":{"line":718,"column":3},"end":{"line":723,"column":null}},"type":"if","locations":[{"start":{"line":718,"column":3},"end":{"line":723,"column":null}},{"start":{},"end":{}}],"line":718},"94":{"loc":{"start":{"line":718,"column":8},"end":{"line":718,"column":23}},"type":"binary-expr","locations":[{"start":{"line":718,"column":8},"end":{"line":718,"column":16}},{"start":{"line":718,"column":16},"end":{"line":718,"column":23}}],"line":718},"95":{"loc":{"start":{"line":720,"column":44},"end":{"line":720,"column":61}},"type":"binary-expr","locations":[{"start":{"line":720,"column":44},"end":{"line":720,"column":52}},{"start":{"line":720,"column":52},"end":{"line":720,"column":61}}],"line":720},"96":{"loc":{"start":{"line":720,"column":74},"end":{"line":720,"column":90}},"type":"binary-expr","locations":[{"start":{"line":720,"column":74},"end":{"line":720,"column":84}},{"start":{"line":720,"column":84},"end":{"line":720,"column":90}}],"line":720},"97":{"loc":{"start":{"line":724,"column":3},"end":{"line":729,"column":null}},"type":"if","locations":[{"start":{"line":724,"column":3},"end":{"line":729,"column":null}},{"start":{},"end":{}}],"line":724},"98":{"loc":{"start":{"line":724,"column":7},"end":{"line":724,"column":26}},"type":"binary-expr","locations":[{"start":{"line":724,"column":7},"end":{"line":724,"column":17}},{"start":{"line":724,"column":17},"end":{"line":724,"column":26}}],"line":724},"99":{"loc":{"start":{"line":726,"column":71},"end":{"line":726,"column":88}},"type":"binary-expr","locations":[{"start":{"line":726,"column":71},"end":{"line":726,"column":79}},{"start":{"line":726,"column":79},"end":{"line":726,"column":88}}],"line":726},"100":{"loc":{"start":{"line":730,"column":10},"end":{"line":730,"column":null}},"type":"binary-expr","locations":[{"start":{"line":730,"column":10},"end":{"line":730,"column":21}},{"start":{"line":730,"column":21},"end":{"line":730,"column":null}}],"line":730},"101":{"loc":{"start":{"line":734,"column":22},"end":{"line":734,"column":null}},"type":"binary-expr","locations":[{"start":{"line":734,"column":22},"end":{"line":734,"column":48}},{"start":{"line":734,"column":48},"end":{"line":734,"column":null}}],"line":734},"102":{"loc":{"start":{"line":739,"column":3},"end":{"line":741,"column":null}},"type":"if","locations":[{"start":{"line":739,"column":3},"end":{"line":741,"column":null}},{"start":{},"end":{}}],"line":739},"103":{"loc":{"start":{"line":742,"column":3},"end":{"line":748,"column":null}},"type":"if","locations":[{"start":{"line":742,"column":3},"end":{"line":748,"column":null}},{"start":{"line":746,"column":10},"end":{"line":748,"column":null}}],"line":742},"104":{"loc":{"start":{"line":760,"column":1},"end":{"line":760,"column":null}},"type":"default-arg","locations":[{"start":{"line":760,"column":23},"end":{"line":760,"column":null}}],"line":760},"105":{"loc":{"start":{"line":764,"column":8},"end":{"line":764,"column":null}},"type":"binary-expr","locations":[{"start":{"line":764,"column":8},"end":{"line":764,"column":24}},{"start":{"line":764,"column":24},"end":{"line":764,"column":null}}],"line":764},"106":{"loc":{"start":{"line":765,"column":8},"end":{"line":765,"column":null}},"type":"binary-expr","locations":[{"start":{"line":765,"column":8},"end":{"line":765,"column":24}},{"start":{"line":765,"column":24},"end":{"line":765,"column":null}}],"line":765},"107":{"loc":{"start":{"line":766,"column":6},"end":{"line":766,"column":null}},"type":"binary-expr","locations":[{"start":{"line":766,"column":6},"end":{"line":766,"column":20}},{"start":{"line":766,"column":20},"end":{"line":766,"column":null}}],"line":766},"108":{"loc":{"start":{"line":777,"column":1},"end":{"line":777,"column":null}},"type":"if","locations":[{"start":{"line":777,"column":1},"end":{"line":777,"column":null}},{"start":{},"end":{}}],"line":777},"109":{"loc":{"start":{"line":781,"column":1},"end":{"line":788,"column":null}},"type":"if","locations":[{"start":{"line":781,"column":1},"end":{"line":788,"column":null}},{"start":{},"end":{}}],"line":781},"110":{"loc":{"start":{"line":781,"column":5},"end":{"line":781,"column":29}},"type":"binary-expr","locations":[{"start":{"line":781,"column":5},"end":{"line":781,"column":19}},{"start":{"line":781,"column":19},"end":{"line":781,"column":29}}],"line":781},"111":{"loc":{"start":{"line":782,"column":1},"end":{"line":786,"column":null}},"type":"if","locations":[{"start":{"line":782,"column":1},"end":{"line":786,"column":null}},{"start":{},"end":{}}],"line":782},"112":{"loc":{"start":{"line":800,"column":2},"end":{"line":806,"column":null}},"type":"if","locations":[{"start":{"line":800,"column":2},"end":{"line":806,"column":null}},{"start":{},"end":{}}],"line":800},"113":{"loc":{"start":{"line":803,"column":44},"end":{"line":803,"column":67}},"type":"binary-expr","locations":[{"start":{"line":803,"column":44},"end":{"line":803,"column":59}},{"start":{"line":803,"column":59},"end":{"line":803,"column":67}}],"line":803},"114":{"loc":{"start":{"line":808,"column":26},"end":{"line":808,"column":48}},"type":"binary-expr","locations":[{"start":{"line":808,"column":26},"end":{"line":808,"column":37}},{"start":{"line":808,"column":37},"end":{"line":808,"column":48}}],"line":808},"115":{"loc":{"start":{"line":814,"column":1},"end":{"line":818,"column":null}},"type":"if","locations":[{"start":{"line":814,"column":1},"end":{"line":818,"column":null}},{"start":{},"end":{}}],"line":814},"116":{"loc":{"start":{"line":827,"column":1},"end":{"line":827,"column":null}},"type":"default-arg","locations":[{"start":{"line":827,"column":23},"end":{"line":827,"column":null}}],"line":827},"117":{"loc":{"start":{"line":830,"column":1},"end":{"line":833,"column":null}},"type":"if","locations":[{"start":{"line":830,"column":1},"end":{"line":833,"column":null}},{"start":{},"end":{}}],"line":830},"118":{"loc":{"start":{"line":846,"column":2},"end":{"line":849,"column":null}},"type":"if","locations":[{"start":{"line":846,"column":2},"end":{"line":849,"column":null}},{"start":{},"end":{}}],"line":846},"119":{"loc":{"start":{"line":856,"column":1},"end":{"line":856,"column":null}},"type":"default-arg","locations":[{"start":{"line":856,"column":23},"end":{"line":856,"column":null}}],"line":856},"120":{"loc":{"start":{"line":887,"column":3},"end":{"line":889,"column":null}},"type":"cond-expr","locations":[{"start":{"line":888,"column":6},"end":{"line":888,"column":null}},{"start":{"line":889,"column":6},"end":{"line":889,"column":null}}],"line":887},"121":{"loc":{"start":{"line":889,"column":6},"end":{"line":889,"column":null}},"type":"binary-expr","locations":[{"start":{"line":889,"column":6},"end":{"line":889,"column":25}},{"start":{"line":889,"column":25},"end":{"line":889,"column":null}}],"line":889},"122":{"loc":{"start":{"line":892,"column":26},"end":{"line":892,"column":55}},"type":"cond-expr","locations":[{"start":{"line":892,"column":33},"end":{"line":892,"column":53}},{"start":{"line":892,"column":53},"end":{"line":892,"column":55}}],"line":892},"123":{"loc":{"start":{"line":892,"column":58},"end":{"line":892,"column":91}},"type":"cond-expr","locations":[{"start":{"line":892,"column":67},"end":{"line":892,"column":89}},{"start":{"line":892,"column":89},"end":{"line":892,"column":91}}],"line":892},"124":{"loc":{"start":{"line":894,"column":2},"end":{"line":894,"column":null}},"type":"if","locations":[{"start":{"line":894,"column":2},"end":{"line":894,"column":null}},{"start":{},"end":{}}],"line":894},"125":{"loc":{"start":{"line":897,"column":2},"end":{"line":899,"column":null}},"type":"if","locations":[{"start":{"line":897,"column":2},"end":{"line":899,"column":null}},{"start":{},"end":{}}],"line":897},"126":{"loc":{"start":{"line":912,"column":1},"end":{"line":912,"column":null}},"type":"default-arg","locations":[{"start":{"line":912,"column":23},"end":{"line":912,"column":null}}],"line":912},"127":{"loc":{"start":{"line":918,"column":17},"end":{"line":918,"column":null}},"type":"binary-expr","locations":[{"start":{"line":918,"column":17},"end":{"line":918,"column":29}},{"start":{"line":918,"column":29},"end":{"line":918,"column":null}}],"line":918},"128":{"loc":{"start":{"line":919,"column":2},"end":{"line":922,"column":null}},"type":"if","locations":[{"start":{"line":919,"column":2},"end":{"line":922,"column":null}},{"start":{},"end":{}}],"line":919},"129":{"loc":{"start":{"line":923,"column":2},"end":{"line":930,"column":null}},"type":"if","locations":[{"start":{"line":923,"column":2},"end":{"line":930,"column":null}},{"start":{},"end":{}}],"line":923},"130":{"loc":{"start":{"line":926,"column":5},"end":{"line":926,"column":null}},"type":"cond-expr","locations":[{"start":{"line":926,"column":19},"end":{"line":926,"column":45}},{"start":{"line":926,"column":45},"end":{"line":926,"column":null}}],"line":926},"131":{"loc":{"start":{"line":927,"column":8},"end":{"line":927,"column":51}},"type":"cond-expr","locations":[{"start":{"line":927,"column":25},"end":{"line":927,"column":49}},{"start":{"line":927,"column":49},"end":{"line":927,"column":51}}],"line":927},"132":{"loc":{"start":{"line":940,"column":1},"end":{"line":940,"column":null}},"type":"default-arg","locations":[{"start":{"line":940,"column":8},"end":{"line":940,"column":null}}],"line":940},"133":{"loc":{"start":{"line":943,"column":1},"end":{"line":943,"column":null}},"type":"default-arg","locations":[{"start":{"line":943,"column":23},"end":{"line":943,"column":null}}],"line":943},"134":{"loc":{"start":{"line":958,"column":41},"end":{"line":958,"column":null}},"type":"binary-expr","locations":[{"start":{"line":958,"column":41},"end":{"line":958,"column":53}},{"start":{"line":958,"column":53},"end":{"line":958,"column":null}}],"line":958},"135":{"loc":{"start":{"line":960,"column":16},"end":{"line":960,"column":33}},"type":"binary-expr","locations":[{"start":{"line":960,"column":16},"end":{"line":960,"column":24}},{"start":{"line":960,"column":24},"end":{"line":960,"column":33}}],"line":960},"136":{"loc":{"start":{"line":960,"column":40},"end":{"line":960,"column":55}},"type":"binary-expr","locations":[{"start":{"line":960,"column":40},"end":{"line":960,"column":46}},{"start":{"line":960,"column":46},"end":{"line":960,"column":55}}],"line":960},"137":{"loc":{"start":{"line":961,"column":4},"end":{"line":961,"column":null}},"type":"binary-expr","locations":[{"start":{"line":961,"column":4},"end":{"line":961,"column":18}},{"start":{"line":961,"column":18},"end":{"line":961,"column":null}}],"line":961},"138":{"loc":{"start":{"line":964,"column":2},"end":{"line":964,"column":null}},"type":"if","locations":[{"start":{"line":964,"column":2},"end":{"line":964,"column":null}},{"start":{},"end":{}}],"line":964},"139":{"loc":{"start":{"line":964,"column":47},"end":{"line":964,"column":57}},"type":"binary-expr","locations":[{"start":{"line":964,"column":47},"end":{"line":964,"column":55}},{"start":{"line":964,"column":55},"end":{"line":964,"column":57}}],"line":964},"140":{"loc":{"start":{"line":968,"column":2},"end":{"line":980,"column":null}},"type":"if","locations":[{"start":{"line":968,"column":2},"end":{"line":980,"column":null}},{"start":{},"end":{}}],"line":968},"141":{"loc":{"start":{"line":982,"column":2},"end":{"line":995,"column":null}},"type":"if","locations":[{"start":{"line":982,"column":2},"end":{"line":995,"column":null}},{"start":{},"end":{}}],"line":982},"142":{"loc":{"start":{"line":989,"column":4},"end":{"line":991,"column":null}},"type":"if","locations":[{"start":{"line":989,"column":4},"end":{"line":991,"column":null}},{"start":{},"end":{}}],"line":989},"143":{"loc":{"start":{"line":993,"column":28},"end":{"line":993,"column":47}},"type":"binary-expr","locations":[{"start":{"line":993,"column":28},"end":{"line":993,"column":36}},{"start":{"line":993,"column":36},"end":{"line":993,"column":47}}],"line":993},"144":{"loc":{"start":{"line":1002,"column":2},"end":{"line":1002,"column":null}},"type":"if","locations":[{"start":{"line":1002,"column":2},"end":{"line":1002,"column":null}},{"start":{},"end":{}}],"line":1002},"145":{"loc":{"start":{"line":1041,"column":34},"end":{"line":1041,"column":66}},"type":"default-arg","locations":[{"start":{"line":1041,"column":57},"end":{"line":1041,"column":66}}],"line":1041},"146":{"loc":{"start":{"line":1044,"column":16},"end":{"line":1044,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1044,"column":26},"end":{"line":1044,"column":75}},{"start":{"line":1044,"column":75},"end":{"line":1044,"column":null}}],"line":1044},"147":{"loc":{"start":{"line":1046,"column":2},"end":{"line":1048,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1047,"column":6},"end":{"line":1047,"column":null}},{"start":{"line":1048,"column":5},"end":{"line":1048,"column":null}}],"line":1046},"148":{"loc":{"start":{"line":1046,"column":2},"end":{"line":1046,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1046,"column":2},"end":{"line":1046,"column":37}},{"start":{"line":1046,"column":37},"end":{"line":1046,"column":null}}],"line":1046},"149":{"loc":{"start":{"line":1050,"column":2},"end":{"line":1050,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1050,"column":39},"end":{"line":1050,"column":65}},{"start":{"line":1050,"column":65},"end":{"line":1050,"column":null}}],"line":1050},"150":{"loc":{"start":{"line":1051,"column":13},"end":{"line":1053,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1052,"column":5},"end":{"line":1052,"column":null}},{"start":{"line":1053,"column":4},"end":{"line":1053,"column":null}}],"line":1051},"151":{"loc":{"start":{"line":1054,"column":1},"end":{"line":1054,"column":null}},"type":"if","locations":[{"start":{"line":1054,"column":1},"end":{"line":1054,"column":null}},{"start":{},"end":{}}],"line":1054},"152":{"loc":{"start":{"line":1054,"column":5},"end":{"line":1054,"column":28}},"type":"binary-expr","locations":[{"start":{"line":1054,"column":5},"end":{"line":1054,"column":12}},{"start":{"line":1054,"column":12},"end":{"line":1054,"column":28}}],"line":1054},"153":{"loc":{"start":{"line":1055,"column":1},"end":{"line":1055,"column":null}},"type":"if","locations":[{"start":{"line":1055,"column":1},"end":{"line":1055,"column":null}},{"start":{},"end":{}}],"line":1055},"154":{"loc":{"start":{"line":1060,"column":1},"end":{"line":1060,"column":null}},"type":"default-arg","locations":[{"start":{"line":1060,"column":24},"end":{"line":1060,"column":null}}],"line":1060},"155":{"loc":{"start":{"line":1061,"column":1},"end":{"line":1061,"column":null}},"type":"default-arg","locations":[{"start":{"line":1061,"column":30},"end":{"line":1061,"column":null}}],"line":1061},"156":{"loc":{"start":{"line":1062,"column":1},"end":{"line":1062,"column":null}},"type":"default-arg","locations":[{"start":{"line":1062,"column":23},"end":{"line":1062,"column":null}}],"line":1062},"157":{"loc":{"start":{"line":1069,"column":1},"end":{"line":1069,"column":null}},"type":"if","locations":[{"start":{"line":1069,"column":1},"end":{"line":1069,"column":null}},{"start":{},"end":{}}],"line":1069},"158":{"loc":{"start":{"line":1074,"column":1},"end":{"line":1077,"column":null}},"type":"if","locations":[{"start":{"line":1074,"column":1},"end":{"line":1077,"column":null}},{"start":{},"end":{}}],"line":1074},"159":{"loc":{"start":{"line":1083,"column":1},"end":{"line":1083,"column":null}},"type":"default-arg","locations":[{"start":{"line":1083,"column":24},"end":{"line":1083,"column":null}}],"line":1083},"160":{"loc":{"start":{"line":1084,"column":1},"end":{"line":1084,"column":null}},"type":"default-arg","locations":[{"start":{"line":1084,"column":30},"end":{"line":1084,"column":null}}],"line":1084},"161":{"loc":{"start":{"line":1085,"column":1},"end":{"line":1085,"column":null}},"type":"default-arg","locations":[{"start":{"line":1085,"column":23},"end":{"line":1085,"column":null}}],"line":1085},"162":{"loc":{"start":{"line":1092,"column":1},"end":{"line":1092,"column":null}},"type":"if","locations":[{"start":{"line":1092,"column":1},"end":{"line":1092,"column":null}},{"start":{},"end":{}}],"line":1092},"163":{"loc":{"start":{"line":1098,"column":1},"end":{"line":1101,"column":null}},"type":"if","locations":[{"start":{"line":1098,"column":1},"end":{"line":1101,"column":null}},{"start":{},"end":{}}],"line":1098},"164":{"loc":{"start":{"line":1108,"column":1},"end":{"line":1108,"column":null}},"type":"default-arg","locations":[{"start":{"line":1108,"column":24},"end":{"line":1108,"column":null}}],"line":1108},"165":{"loc":{"start":{"line":1109,"column":1},"end":{"line":1109,"column":null}},"type":"default-arg","locations":[{"start":{"line":1109,"column":23},"end":{"line":1109,"column":null}}],"line":1109},"166":{"loc":{"start":{"line":1110,"column":1},"end":{"line":1110,"column":null}},"type":"default-arg","locations":[{"start":{"line":1110,"column":30},"end":{"line":1110,"column":null}}],"line":1110},"167":{"loc":{"start":{"line":1117,"column":17},"end":{"line":1119,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1118,"column":6},"end":{"line":1118,"column":null}},{"start":{"line":1119,"column":5},"end":{"line":1119,"column":null}}],"line":1117},"168":{"loc":{"start":{"line":1120,"column":2},"end":{"line":1141,"column":null}},"type":"if","locations":[{"start":{"line":1120,"column":2},"end":{"line":1141,"column":null}},{"start":{},"end":{}}],"line":1120},"169":{"loc":{"start":{"line":1120,"column":6},"end":{"line":1120,"column":51}},"type":"binary-expr","locations":[{"start":{"line":1120,"column":6},"end":{"line":1120,"column":17}},{"start":{"line":1120,"column":17},"end":{"line":1120,"column":51}}],"line":1120},"170":{"loc":{"start":{"line":1138,"column":3},"end":{"line":1138,"column":null}},"type":"if","locations":[{"start":{"line":1138,"column":3},"end":{"line":1138,"column":null}},{"start":{},"end":{}}],"line":1138},"171":{"loc":{"start":{"line":1152,"column":2},"end":{"line":1152,"column":null}},"type":"if","locations":[{"start":{"line":1152,"column":2},"end":{"line":1152,"column":null}},{"start":{},"end":{}}],"line":1152},"172":{"loc":{"start":{"line":1155,"column":17},"end":{"line":1155,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1155,"column":56},"end":{"line":1155,"column":75}},{"start":{"line":1155,"column":75},"end":{"line":1155,"column":null}}],"line":1155},"173":{"loc":{"start":{"line":1156,"column":17},"end":{"line":1156,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1156,"column":56},"end":{"line":1156,"column":75}},{"start":{"line":1156,"column":75},"end":{"line":1156,"column":null}}],"line":1156},"174":{"loc":{"start":{"line":1157,"column":2},"end":{"line":1169,"column":null}},"type":"if","locations":[{"start":{"line":1157,"column":2},"end":{"line":1169,"column":null}},{"start":{},"end":{}}],"line":1157},"175":{"loc":{"start":{"line":1160,"column":3},"end":{"line":1168,"column":null}},"type":"if","locations":[{"start":{"line":1160,"column":3},"end":{"line":1168,"column":null}},{"start":{"line":1162,"column":10},"end":{"line":1168,"column":null}}],"line":1160},"176":{"loc":{"start":{"line":1170,"column":2},"end":{"line":1179,"column":null}},"type":"if","locations":[{"start":{"line":1170,"column":2},"end":{"line":1179,"column":null}},{"start":{},"end":{}}],"line":1170},"177":{"loc":{"start":{"line":1171,"column":3},"end":{"line":1172,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1171,"column":3},"end":{"line":1171,"column":null}},{"start":{"line":1172,"column":3},"end":{"line":1172,"column":null}}],"line":1171},"178":{"loc":{"start":{"line":1188,"column":2},"end":{"line":1192,"column":null}},"type":"if","locations":[{"start":{"line":1188,"column":2},"end":{"line":1192,"column":null}},{"start":{},"end":{}}],"line":1188},"179":{"loc":{"start":{"line":1189,"column":3},"end":{"line":1189,"column":null}},"type":"if","locations":[{"start":{"line":1189,"column":3},"end":{"line":1189,"column":null}},{"start":{},"end":{}}],"line":1189},"180":{"loc":{"start":{"line":1190,"column":3},"end":{"line":1190,"column":null}},"type":"if","locations":[{"start":{"line":1190,"column":3},"end":{"line":1190,"column":null}},{"start":{},"end":{}}],"line":1190},"181":{"loc":{"start":{"line":1201,"column":1},"end":{"line":1201,"column":null}},"type":"default-arg","locations":[{"start":{"line":1201,"column":23},"end":{"line":1201,"column":null}}],"line":1201},"182":{"loc":{"start":{"line":1204,"column":1},"end":{"line":1207,"column":null}},"type":"if","locations":[{"start":{"line":1204,"column":1},"end":{"line":1207,"column":null}},{"start":{},"end":{}}],"line":1204},"183":{"loc":{"start":{"line":1216,"column":2},"end":{"line":1218,"column":null}},"type":"if","locations":[{"start":{"line":1216,"column":2},"end":{"line":1218,"column":null}},{"start":{},"end":{}}],"line":1216},"184":{"loc":{"start":{"line":1221,"column":5},"end":{"line":1224,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1221,"column":5},"end":{"line":1221,"column":null}},{"start":{"line":1222,"column":5},"end":{"line":1222,"column":null}},{"start":{"line":1223,"column":5},"end":{"line":1223,"column":null}},{"start":{"line":1224,"column":5},"end":{"line":1224,"column":null}}],"line":1221},"185":{"loc":{"start":{"line":1226,"column":2},"end":{"line":1230,"column":null}},"type":"if","locations":[{"start":{"line":1226,"column":2},"end":{"line":1230,"column":null}},{"start":{},"end":{}}],"line":1226},"186":{"loc":{"start":{"line":1226,"column":6},"end":{"line":1226,"column":47}},"type":"binary-expr","locations":[{"start":{"line":1226,"column":6},"end":{"line":1226,"column":16}},{"start":{"line":1226,"column":16},"end":{"line":1226,"column":47}}],"line":1226},"187":{"loc":{"start":{"line":1234,"column":2},"end":{"line":1236,"column":null}},"type":"if","locations":[{"start":{"line":1234,"column":2},"end":{"line":1236,"column":null}},{"start":{},"end":{}}],"line":1234},"188":{"loc":{"start":{"line":1257,"column":2},"end":{"line":1257,"column":null}},"type":"if","locations":[{"start":{"line":1257,"column":2},"end":{"line":1257,"column":null}},{"start":{},"end":{}}],"line":1257},"189":{"loc":{"start":{"line":1257,"column":6},"end":{"line":1257,"column":34}},"type":"binary-expr","locations":[{"start":{"line":1257,"column":6},"end":{"line":1257,"column":15}},{"start":{"line":1257,"column":15},"end":{"line":1257,"column":34}}],"line":1257},"190":{"loc":{"start":{"line":1258,"column":2},"end":{"line":1262,"column":null}},"type":"if","locations":[{"start":{"line":1258,"column":2},"end":{"line":1262,"column":null}},{"start":{},"end":{}}],"line":1258},"191":{"loc":{"start":{"line":1258,"column":6},"end":{"line":1258,"column":38}},"type":"binary-expr","locations":[{"start":{"line":1258,"column":6},"end":{"line":1258,"column":25}},{"start":{"line":1258,"column":20},"end":{"line":1258,"column":38}}],"line":1258},"192":{"loc":{"start":{"line":1263,"column":9},"end":{"line":1263,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1263,"column":9},"end":{"line":1263,"column":25}},{"start":{"line":1263,"column":25},"end":{"line":1263,"column":null}}],"line":1263},"193":{"loc":{"start":{"line":1265,"column":2},"end":{"line":1265,"column":null}},"type":"if","locations":[{"start":{"line":1265,"column":2},"end":{"line":1265,"column":null}},{"start":{},"end":{}}],"line":1265},"194":{"loc":{"start":{"line":1283,"column":4},"end":{"line":1284,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1283,"column":4},"end":{"line":1284,"column":29}},{"start":{"line":1284,"column":29},"end":{"line":1284,"column":null}}],"line":1283},"195":{"loc":{"start":{"line":1287,"column":2},"end":{"line":1287,"column":null}},"type":"if","locations":[{"start":{"line":1287,"column":2},"end":{"line":1287,"column":null}},{"start":{},"end":{}}],"line":1287},"196":{"loc":{"start":{"line":1298,"column":1},"end":{"line":1298,"column":null}},"type":"if","locations":[{"start":{"line":1298,"column":1},"end":{"line":1298,"column":null}},{"start":{},"end":{}}],"line":1298},"197":{"loc":{"start":{"line":1308,"column":42},"end":{"line":1308,"column":55}},"type":"binary-expr","locations":[{"start":{"line":1308,"column":42},"end":{"line":1308,"column":52}},{"start":{"line":1308,"column":52},"end":{"line":1308,"column":55}}],"line":1308},"198":{"loc":{"start":{"line":1313,"column":2},"end":{"line":1313,"column":null}},"type":"if","locations":[{"start":{"line":1313,"column":2},"end":{"line":1313,"column":null}},{"start":{},"end":{}}],"line":1313},"199":{"loc":{"start":{"line":1322,"column":1},"end":{"line":1322,"column":null}},"type":"default-arg","locations":[{"start":{"line":1322,"column":26},"end":{"line":1322,"column":null}}],"line":1322},"200":{"loc":{"start":{"line":1323,"column":1},"end":{"line":1323,"column":null}},"type":"default-arg","locations":[{"start":{"line":1323,"column":23},"end":{"line":1323,"column":null}}],"line":1323},"201":{"loc":{"start":{"line":1347,"column":3},"end":{"line":1347,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1347,"column":3},"end":{"line":1347,"column":37}},{"start":{"line":1347,"column":37},"end":{"line":1347,"column":null}}],"line":1347},"202":{"loc":{"start":{"line":1348,"column":2},"end":{"line":1351,"column":null}},"type":"if","locations":[{"start":{"line":1348,"column":2},"end":{"line":1351,"column":null}},{"start":{},"end":{}}],"line":1348},"203":{"loc":{"start":{"line":1352,"column":2},"end":{"line":1355,"column":null}},"type":"if","locations":[{"start":{"line":1352,"column":2},"end":{"line":1355,"column":null}},{"start":{},"end":{}}],"line":1352},"204":{"loc":{"start":{"line":1357,"column":2},"end":{"line":1361,"column":null}},"type":"if","locations":[{"start":{"line":1357,"column":2},"end":{"line":1361,"column":null}},{"start":{},"end":{}}],"line":1357},"205":{"loc":{"start":{"line":1378,"column":3},"end":{"line":1378,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1378,"column":3},"end":{"line":1378,"column":37}},{"start":{"line":1378,"column":37},"end":{"line":1378,"column":null}}],"line":1378},"206":{"loc":{"start":{"line":1379,"column":2},"end":{"line":1382,"column":null}},"type":"if","locations":[{"start":{"line":1379,"column":2},"end":{"line":1382,"column":null}},{"start":{},"end":{}}],"line":1379},"207":{"loc":{"start":{"line":1383,"column":2},"end":{"line":1386,"column":null}},"type":"if","locations":[{"start":{"line":1383,"column":2},"end":{"line":1386,"column":null}},{"start":{},"end":{}}],"line":1383},"208":{"loc":{"start":{"line":1388,"column":2},"end":{"line":1392,"column":null}},"type":"if","locations":[{"start":{"line":1388,"column":2},"end":{"line":1392,"column":null}},{"start":{},"end":{}}],"line":1388},"209":{"loc":{"start":{"line":1397,"column":2},"end":{"line":1413,"column":null}},"type":"if","locations":[{"start":{"line":1397,"column":2},"end":{"line":1413,"column":null}},{"start":{},"end":{}}],"line":1397},"210":{"loc":{"start":{"line":1406,"column":4},"end":{"line":1406,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1406,"column":4},"end":{"line":1406,"column":38}},{"start":{"line":1406,"column":38},"end":{"line":1406,"column":null}}],"line":1406},"211":{"loc":{"start":{"line":1409,"column":39},"end":{"line":1409,"column":55}},"type":"binary-expr","locations":[{"start":{"line":1409,"column":39},"end":{"line":1409,"column":52}},{"start":{"line":1409,"column":52},"end":{"line":1409,"column":55}}],"line":1409},"212":{"loc":{"start":{"line":1415,"column":2},"end":{"line":1419,"column":null}},"type":"if","locations":[{"start":{"line":1415,"column":2},"end":{"line":1419,"column":null}},{"start":{},"end":{}}],"line":1415},"213":{"loc":{"start":{"line":1425,"column":2},"end":{"line":1433,"column":null}},"type":"if","locations":[{"start":{"line":1425,"column":2},"end":{"line":1433,"column":null}},{"start":{},"end":{}}],"line":1425},"214":{"loc":{"start":{"line":1435,"column":2},"end":{"line":1435,"column":null}},"type":"if","locations":[{"start":{"line":1435,"column":2},"end":{"line":1435,"column":null}},{"start":{},"end":{}}],"line":1435},"215":{"loc":{"start":{"line":1444,"column":1},"end":{"line":1444,"column":null}},"type":"if","locations":[{"start":{"line":1444,"column":1},"end":{"line":1444,"column":null}},{"start":{},"end":{}}],"line":1444},"216":{"loc":{"start":{"line":1471,"column":1},"end":{"line":1471,"column":null}},"type":"if","locations":[{"start":{"line":1471,"column":1},"end":{"line":1471,"column":null}},{"start":{},"end":{}}],"line":1471},"217":{"loc":{"start":{"line":1472,"column":1},"end":{"line":1472,"column":null}},"type":"if","locations":[{"start":{"line":1472,"column":1},"end":{"line":1472,"column":null}},{"start":{},"end":{}}],"line":1472},"218":{"loc":{"start":{"line":1473,"column":1},"end":{"line":1473,"column":null}},"type":"if","locations":[{"start":{"line":1473,"column":1},"end":{"line":1473,"column":null}},{"start":{},"end":{}}],"line":1473},"219":{"loc":{"start":{"line":1474,"column":1},"end":{"line":1474,"column":null}},"type":"if","locations":[{"start":{"line":1474,"column":1},"end":{"line":1474,"column":null}},{"start":{},"end":{}}],"line":1474},"220":{"loc":{"start":{"line":1475,"column":8},"end":{"line":1475,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1475,"column":24},"end":{"line":1475,"column":45}},{"start":{"line":1475,"column":45},"end":{"line":1475,"column":null}}],"line":1475},"221":{"loc":{"start":{"line":1481,"column":1},"end":{"line":1481,"column":null}},"type":"default-arg","locations":[{"start":{"line":1481,"column":23},"end":{"line":1481,"column":null}}],"line":1481},"222":{"loc":{"start":{"line":1483,"column":16},"end":{"line":1483,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1483,"column":30},"end":{"line":1483,"column":54}},{"start":{"line":1483,"column":54},"end":{"line":1483,"column":null}}],"line":1483},"223":{"loc":{"start":{"line":1488,"column":1},"end":{"line":1490,"column":null}},"type":"if","locations":[{"start":{"line":1488,"column":1},"end":{"line":1490,"column":null}},{"start":{},"end":{}}],"line":1488},"224":{"loc":{"start":{"line":1497,"column":1},"end":{"line":1497,"column":null}},"type":"default-arg","locations":[{"start":{"line":1497,"column":17},"end":{"line":1497,"column":null}}],"line":1497},"225":{"loc":{"start":{"line":1501,"column":16},"end":{"line":1501,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1501,"column":16},"end":{"line":1501,"column":34}},{"start":{"line":1501,"column":34},"end":{"line":1501,"column":null}}],"line":1501},"226":{"loc":{"start":{"line":1512,"column":2},"end":{"line":1512,"column":null}},"type":"if","locations":[{"start":{"line":1512,"column":2},"end":{"line":1512,"column":null}},{"start":{},"end":{}}],"line":1512},"227":{"loc":{"start":{"line":1513,"column":2},"end":{"line":1515,"column":null}},"type":"if","locations":[{"start":{"line":1513,"column":2},"end":{"line":1515,"column":null}},{"start":{},"end":{}}],"line":1513},"228":{"loc":{"start":{"line":1520,"column":2},"end":{"line":1520,"column":null}},"type":"if","locations":[{"start":{"line":1520,"column":2},"end":{"line":1520,"column":null}},{"start":{},"end":{}}],"line":1520},"229":{"loc":{"start":{"line":1526,"column":8},"end":{"line":1526,"column":51}},"type":"binary-expr","locations":[{"start":{"line":1526,"column":8},"end":{"line":1526,"column":23}},{"start":{"line":1526,"column":23},"end":{"line":1526,"column":51}}],"line":1526},"230":{"loc":{"start":{"line":1537,"column":16},"end":{"line":1537,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1537,"column":16},"end":{"line":1537,"column":44}},{"start":{"line":1537,"column":44},"end":{"line":1537,"column":null}}],"line":1537},"231":{"loc":{"start":{"line":1538,"column":16},"end":{"line":1538,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1538,"column":16},"end":{"line":1538,"column":44}},{"start":{"line":1538,"column":44},"end":{"line":1538,"column":null}}],"line":1538},"232":{"loc":{"start":{"line":1543,"column":4},"end":{"line":1543,"column":null}},"type":"if","locations":[{"start":{"line":1543,"column":4},"end":{"line":1543,"column":null}},{"start":{},"end":{}}],"line":1543},"233":{"loc":{"start":{"line":1545,"column":17},"end":{"line":1545,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1545,"column":17},"end":{"line":1545,"column":49}},{"start":{"line":1545,"column":49},"end":{"line":1545,"column":null}}],"line":1545},"234":{"loc":{"start":{"line":1546,"column":20},"end":{"line":1546,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1546,"column":20},"end":{"line":1546,"column":30}},{"start":{"line":1546,"column":30},"end":{"line":1546,"column":null}}],"line":1546},"235":{"loc":{"start":{"line":1547,"column":54},"end":{"line":1547,"column":66}},"type":"binary-expr","locations":[{"start":{"line":1547,"column":54},"end":{"line":1547,"column":64}},{"start":{"line":1547,"column":64},"end":{"line":1547,"column":66}}],"line":1547},"236":{"loc":{"start":{"line":1562,"column":1},"end":{"line":1562,"column":null}},"type":"default-arg","locations":[{"start":{"line":1562,"column":19},"end":{"line":1562,"column":null}}],"line":1562},"237":{"loc":{"start":{"line":1563,"column":1},"end":{"line":1563,"column":null}},"type":"default-arg","locations":[{"start":{"line":1563,"column":13},"end":{"line":1563,"column":null}}],"line":1563},"238":{"loc":{"start":{"line":1564,"column":1},"end":{"line":1564,"column":null}},"type":"default-arg","locations":[{"start":{"line":1564,"column":44},"end":{"line":1564,"column":null}}],"line":1564},"239":{"loc":{"start":{"line":1570,"column":14},"end":{"line":1572,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1571,"column":6},"end":{"line":1571,"column":null}},{"start":{"line":1571,"column":42},"end":{"line":1572,"column":null}}],"line":1570},"240":{"loc":{"start":{"line":1586,"column":3},"end":{"line":1586,"column":null}},"type":"if","locations":[{"start":{"line":1586,"column":3},"end":{"line":1586,"column":null}},{"start":{},"end":{}}],"line":1586},"241":{"loc":{"start":{"line":1589,"column":4},"end":{"line":1591,"column":null}},"type":"if","locations":[{"start":{"line":1589,"column":4},"end":{"line":1591,"column":null}},{"start":{},"end":{}}],"line":1589},"242":{"loc":{"start":{"line":1612,"column":1},"end":{"line":1614,"column":null}},"type":"if","locations":[{"start":{"line":1612,"column":1},"end":{"line":1614,"column":null}},{"start":{},"end":{}}],"line":1612},"243":{"loc":{"start":{"line":1626,"column":1},"end":{"line":1626,"column":null}},"type":"default-arg","locations":[{"start":{"line":1626,"column":35},"end":{"line":1626,"column":null}}],"line":1626},"244":{"loc":{"start":{"line":1627,"column":1},"end":{"line":1627,"column":null}},"type":"default-arg","locations":[{"start":{"line":1627,"column":23},"end":{"line":1627,"column":null}}],"line":1627},"245":{"loc":{"start":{"line":1633,"column":1},"end":{"line":1635,"column":null}},"type":"if","locations":[{"start":{"line":1633,"column":1},"end":{"line":1635,"column":null}},{"start":{},"end":{}}],"line":1633},"246":{"loc":{"start":{"line":1633,"column":5},"end":{"line":1633,"column":51}},"type":"binary-expr","locations":[{"start":{"line":1633,"column":5},"end":{"line":1633,"column":34}},{"start":{"line":1633,"column":34},"end":{"line":1633,"column":51}}],"line":1633},"247":{"loc":{"start":{"line":1636,"column":1},"end":{"line":1638,"column":null}},"type":"if","locations":[{"start":{"line":1636,"column":1},"end":{"line":1638,"column":null}},{"start":{},"end":{}}],"line":1636},"248":{"loc":{"start":{"line":1636,"column":5},"end":{"line":1636,"column":52}},"type":"binary-expr","locations":[{"start":{"line":1636,"column":5},"end":{"line":1636,"column":34}},{"start":{"line":1636,"column":34},"end":{"line":1636,"column":52}}],"line":1636},"249":{"loc":{"start":{"line":1640,"column":1},"end":{"line":1646,"column":null}},"type":"if","locations":[{"start":{"line":1640,"column":1},"end":{"line":1646,"column":null}},{"start":{},"end":{}}],"line":1640},"250":{"loc":{"start":{"line":1641,"column":2},"end":{"line":1643,"column":null}},"type":"if","locations":[{"start":{"line":1641,"column":2},"end":{"line":1643,"column":null}},{"start":{},"end":{}}],"line":1641},"251":{"loc":{"start":{"line":1649,"column":1},"end":{"line":1649,"column":null}},"type":"if","locations":[{"start":{"line":1649,"column":1},"end":{"line":1649,"column":null}},{"start":{},"end":{}}],"line":1649},"252":{"loc":{"start":{"line":1650,"column":1},"end":{"line":1650,"column":null}},"type":"if","locations":[{"start":{"line":1650,"column":1},"end":{"line":1650,"column":null}},{"start":{},"end":{}}],"line":1650},"253":{"loc":{"start":{"line":1662,"column":1},"end":{"line":1662,"column":null}},"type":"default-arg","locations":[{"start":{"line":1662,"column":35},"end":{"line":1662,"column":null}}],"line":1662},"254":{"loc":{"start":{"line":1663,"column":1},"end":{"line":1663,"column":null}},"type":"default-arg","locations":[{"start":{"line":1663,"column":23},"end":{"line":1663,"column":null}}],"line":1663},"255":{"loc":{"start":{"line":1667,"column":1},"end":{"line":1669,"column":null}},"type":"if","locations":[{"start":{"line":1667,"column":1},"end":{"line":1669,"column":null}},{"start":{},"end":{}}],"line":1667},"256":{"loc":{"start":{"line":1667,"column":5},"end":{"line":1667,"column":55}},"type":"binary-expr","locations":[{"start":{"line":1667,"column":5},"end":{"line":1667,"column":28}},{"start":{"line":1667,"column":28},"end":{"line":1667,"column":42}},{"start":{"line":1667,"column":42},"end":{"line":1667,"column":55}}],"line":1667},"257":{"loc":{"start":{"line":1670,"column":1},"end":{"line":1672,"column":null}},"type":"if","locations":[{"start":{"line":1670,"column":1},"end":{"line":1672,"column":null}},{"start":{},"end":{}}],"line":1670},"258":{"loc":{"start":{"line":1670,"column":5},"end":{"line":1670,"column":60}},"type":"binary-expr","locations":[{"start":{"line":1670,"column":5},"end":{"line":1670,"column":38}},{"start":{"line":1670,"column":38},"end":{"line":1670,"column":60}}],"line":1670},"259":{"loc":{"start":{"line":1675,"column":1},"end":{"line":1678,"column":null}},"type":"if","locations":[{"start":{"line":1675,"column":1},"end":{"line":1678,"column":null}},{"start":{},"end":{}}],"line":1675},"260":{"loc":{"start":{"line":1679,"column":1},"end":{"line":1682,"column":null}},"type":"if","locations":[{"start":{"line":1679,"column":1},"end":{"line":1682,"column":null}},{"start":{},"end":{}}],"line":1679},"261":{"loc":{"start":{"line":1696,"column":1},"end":{"line":1696,"column":null}},"type":"default-arg","locations":[{"start":{"line":1696,"column":35},"end":{"line":1696,"column":null}}],"line":1696},"262":{"loc":{"start":{"line":1697,"column":1},"end":{"line":1697,"column":null}},"type":"default-arg","locations":[{"start":{"line":1697,"column":23},"end":{"line":1697,"column":null}}],"line":1697},"263":{"loc":{"start":{"line":1700,"column":1},"end":{"line":1702,"column":null}},"type":"if","locations":[{"start":{"line":1700,"column":1},"end":{"line":1702,"column":null}},{"start":{},"end":{}}],"line":1700},"264":{"loc":{"start":{"line":1700,"column":5},"end":{"line":1700,"column":55}},"type":"binary-expr","locations":[{"start":{"line":1700,"column":5},"end":{"line":1700,"column":27}},{"start":{"line":1700,"column":27},"end":{"line":1700,"column":40}},{"start":{"line":1700,"column":40},"end":{"line":1700,"column":55}}],"line":1700},"265":{"loc":{"start":{"line":1722,"column":1},"end":{"line":1722,"column":null}},"type":"default-arg","locations":[{"start":{"line":1722,"column":35},"end":{"line":1722,"column":null}}],"line":1722},"266":{"loc":{"start":{"line":1723,"column":1},"end":{"line":1723,"column":null}},"type":"default-arg","locations":[{"start":{"line":1723,"column":23},"end":{"line":1723,"column":null}}],"line":1723},"267":{"loc":{"start":{"line":1726,"column":1},"end":{"line":1728,"column":null}},"type":"if","locations":[{"start":{"line":1726,"column":1},"end":{"line":1728,"column":null}},{"start":{},"end":{}}],"line":1726},"268":{"loc":{"start":{"line":1726,"column":5},"end":{"line":1726,"column":55}},"type":"binary-expr","locations":[{"start":{"line":1726,"column":5},"end":{"line":1726,"column":27}},{"start":{"line":1726,"column":27},"end":{"line":1726,"column":40}},{"start":{"line":1726,"column":40},"end":{"line":1726,"column":55}}],"line":1726},"269":{"loc":{"start":{"line":1781,"column":2},"end":{"line":1781,"column":null}},"type":"if","locations":[{"start":{"line":1781,"column":2},"end":{"line":1781,"column":null}},{"start":{},"end":{}}],"line":1781},"270":{"loc":{"start":{"line":1790,"column":13},"end":{"line":1790,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1790,"column":13},"end":{"line":1790,"column":41}},{"start":{"line":1790,"column":41},"end":{"line":1790,"column":null}}],"line":1790},"271":{"loc":{"start":{"line":1791,"column":13},"end":{"line":1791,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1791,"column":13},"end":{"line":1791,"column":41}},{"start":{"line":1791,"column":41},"end":{"line":1791,"column":null}}],"line":1791},"272":{"loc":{"start":{"line":1797,"column":12},"end":{"line":1797,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1797,"column":12},"end":{"line":1797,"column":44}},{"start":{"line":1797,"column":44},"end":{"line":1797,"column":null}}],"line":1797},"273":{"loc":{"start":{"line":1799,"column":2},"end":{"line":1803,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1800,"column":5},"end":{"line":1800,"column":null}},{"start":{"line":1801,"column":5},"end":{"line":1803,"column":null}}],"line":1799},"274":{"loc":{"start":{"line":1801,"column":5},"end":{"line":1803,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1802,"column":6},"end":{"line":1802,"column":null}},{"start":{"line":1803,"column":6},"end":{"line":1803,"column":null}}],"line":1801},"275":{"loc":{"start":{"line":1801,"column":5},"end":{"line":1801,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1801,"column":5},"end":{"line":1801,"column":39}},{"start":{"line":1801,"column":39},"end":{"line":1801,"column":null}}],"line":1801},"276":{"loc":{"start":{"line":1804,"column":16},"end":{"line":1804,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1804,"column":16},"end":{"line":1804,"column":28}},{"start":{"line":1804,"column":28},"end":{"line":1804,"column":null}}],"line":1804},"277":{"loc":{"start":{"line":1806,"column":2},"end":{"line":1808,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1807,"column":5},"end":{"line":1807,"column":null}},{"start":{"line":1808,"column":5},"end":{"line":1808,"column":null}}],"line":1806},"278":{"loc":{"start":{"line":1807,"column":29},"end":{"line":1807,"column":73}},"type":"cond-expr","locations":[{"start":{"line":1807,"column":46},"end":{"line":1807,"column":71}},{"start":{"line":1807,"column":71},"end":{"line":1807,"column":73}}],"line":1807},"279":{"loc":{"start":{"line":1809,"column":15},"end":{"line":1809,"column":29}},"type":"binary-expr","locations":[{"start":{"line":1809,"column":15},"end":{"line":1809,"column":25}},{"start":{"line":1809,"column":25},"end":{"line":1809,"column":29}}],"line":1809},"280":{"loc":{"start":{"line":1811,"column":2},"end":{"line":1811,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1811,"column":22},"end":{"line":1811,"column":49}},{"start":{"line":1811,"column":49},"end":{"line":1811,"column":null}}],"line":1811},"281":{"loc":{"start":{"line":1811,"column":49},"end":{"line":1811,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1811,"column":49},"end":{"line":1811,"column":57}},{"start":{"line":1811,"column":57},"end":{"line":1811,"column":null}}],"line":1811},"282":{"loc":{"start":{"line":1812,"column":25},"end":{"line":1812,"column":38}},"type":"binary-expr","locations":[{"start":{"line":1812,"column":25},"end":{"line":1812,"column":35}},{"start":{"line":1812,"column":35},"end":{"line":1812,"column":38}}],"line":1812},"283":{"loc":{"start":{"line":1812,"column":45},"end":{"line":1812,"column":56}},"type":"binary-expr","locations":[{"start":{"line":1812,"column":45},"end":{"line":1812,"column":53}},{"start":{"line":1812,"column":53},"end":{"line":1812,"column":56}}],"line":1812},"284":{"loc":{"start":{"line":1821,"column":16},"end":{"line":1821,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1821,"column":16},"end":{"line":1821,"column":34}},{"start":{"line":1821,"column":34},"end":{"line":1821,"column":null}}],"line":1821},"285":{"loc":{"start":{"line":1841,"column":11},"end":{"line":1841,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1841,"column":11},"end":{"line":1841,"column":23}},{"start":{"line":1841,"column":23},"end":{"line":1841,"column":null}}],"line":1841},"286":{"loc":{"start":{"line":1842,"column":14},"end":{"line":1842,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1842,"column":14},"end":{"line":1842,"column":29}},{"start":{"line":1842,"column":29},"end":{"line":1842,"column":null}}],"line":1842},"287":{"loc":{"start":{"line":1847,"column":14},"end":{"line":1847,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1847,"column":14},"end":{"line":1847,"column":29}},{"start":{"line":1847,"column":29},"end":{"line":1847,"column":null}}],"line":1847},"288":{"loc":{"start":{"line":1848,"column":17},"end":{"line":1848,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1848,"column":17},"end":{"line":1848,"column":35}},{"start":{"line":1848,"column":35},"end":{"line":1848,"column":null}}],"line":1848},"289":{"loc":{"start":{"line":1919,"column":2},"end":{"line":1922,"column":null}},"type":"if","locations":[{"start":{"line":1919,"column":2},"end":{"line":1922,"column":null}},{"start":{},"end":{}}],"line":1919},"290":{"loc":{"start":{"line":1919,"column":6},"end":{"line":1919,"column":61}},"type":"binary-expr","locations":[{"start":{"line":1919,"column":6},"end":{"line":1919,"column":39}},{"start":{"line":1919,"column":39},"end":{"line":1919,"column":61}}],"line":1919},"291":{"loc":{"start":{"line":1923,"column":2},"end":{"line":1926,"column":null}},"type":"if","locations":[{"start":{"line":1923,"column":2},"end":{"line":1926,"column":null}},{"start":{},"end":{}}],"line":1923},"292":{"loc":{"start":{"line":1923,"column":6},"end":{"line":1923,"column":60}},"type":"binary-expr","locations":[{"start":{"line":1923,"column":6},"end":{"line":1923,"column":39}},{"start":{"line":1923,"column":39},"end":{"line":1923,"column":60}}],"line":1923},"293":{"loc":{"start":{"line":1990,"column":2},"end":{"line":1993,"column":null}},"type":"if","locations":[{"start":{"line":1990,"column":2},"end":{"line":1993,"column":null}},{"start":{},"end":{}}],"line":1990},"294":{"loc":{"start":{"line":1990,"column":6},"end":{"line":1990,"column":61}},"type":"binary-expr","locations":[{"start":{"line":1990,"column":6},"end":{"line":1990,"column":39}},{"start":{"line":1990,"column":39},"end":{"line":1990,"column":61}}],"line":1990},"295":{"loc":{"start":{"line":1994,"column":2},"end":{"line":1997,"column":null}},"type":"if","locations":[{"start":{"line":1994,"column":2},"end":{"line":1997,"column":null}},{"start":{},"end":{}}],"line":1994},"296":{"loc":{"start":{"line":1994,"column":6},"end":{"line":1994,"column":60}},"type":"binary-expr","locations":[{"start":{"line":1994,"column":6},"end":{"line":1994,"column":39}},{"start":{"line":1994,"column":39},"end":{"line":1994,"column":60}}],"line":1994},"297":{"loc":{"start":{"line":2126,"column":1},"end":{"line":2126,"column":null}},"type":"binary-expr","locations":[{"start":{"line":2126,"column":1},"end":{"line":2126,"column":20}},{"start":{"line":2126,"column":15},"end":{"line":2126,"column":null}}],"line":2126},"298":{"loc":{"start":{"line":2128,"column":0},"end":{"line":2130,"column":null}},"type":"if","locations":[{"start":{"line":2128,"column":0},"end":{"line":2130,"column":null}},{"start":{},"end":{}}],"line":2128}},"s":{"0":3,"1":3,"2":3,"3":3,"4":1,"5":1,"6":3,"7":9,"8":0,"9":9,"10":0,"11":9,"12":0,"13":9,"14":9,"15":0,"16":0,"17":0,"18":0,"19":9,"20":9,"21":9,"22":3,"23":1,"24":0,"25":1,"26":1,"27":1,"28":0,"29":0,"30":0,"31":0,"32":1,"33":0,"34":0,"35":0,"36":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":1,"43":2,"44":1,"45":2,"46":0,"47":2,"48":0,"49":0,"50":0,"51":0,"52":0,"53":2,"54":2,"55":0,"56":2,"57":2,"58":2,"59":2,"60":2,"61":2,"62":2,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":0,"70":0,"71":1,"72":1,"73":1,"74":1,"75":0,"76":0,"77":1,"78":1,"79":1,"80":0,"81":1,"82":1,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":1,"90":1,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":3,"108":2,"109":2,"110":0,"111":2,"112":2,"113":2,"114":0,"115":2,"116":0,"117":0,"118":14,"119":6,"120":6,"121":3,"122":3,"123":3,"124":6,"125":4,"126":2,"127":2,"128":2,"129":4,"130":4,"131":4,"132":4,"133":3,"134":1,"135":4,"136":4,"137":4,"138":0,"139":4,"140":4,"141":6,"142":6,"143":6,"144":6,"145":6,"146":6,"147":4,"148":0,"149":4,"150":4,"151":6,"152":6,"153":6,"154":6,"155":6,"156":6,"157":6,"158":4,"159":4,"160":4,"161":0,"162":4,"163":0,"164":0,"165":0,"166":4,"167":4,"168":1,"169":1,"170":1,"171":4,"172":4,"173":4,"174":4,"175":4,"176":4,"177":3,"178":1,"179":1,"180":4,"181":4,"182":5,"183":6,"184":6,"185":6,"186":6,"187":6,"188":2,"189":2,"190":1,"191":1,"192":4,"193":0,"194":0,"195":4,"196":2,"197":2,"198":2,"199":2,"200":2,"201":2,"202":4,"203":2,"204":2,"205":2,"206":2,"207":2,"208":4,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":0,"221":2,"222":2,"223":2,"224":0,"225":0,"226":2,"227":0,"228":0,"229":2,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":2,"242":2,"243":1,"244":1,"245":0,"246":1,"247":1,"248":1,"249":0,"250":0,"251":0,"252":1,"253":1,"254":1,"255":1,"256":0,"257":0,"258":4,"259":2,"260":2,"261":3,"262":1,"263":1,"264":2,"265":2,"266":2,"267":2,"268":0,"269":0,"270":0,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"278":2,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":3,"291":3,"292":2,"293":2,"294":832,"295":832,"296":832,"297":1,"298":1,"299":831,"300":830,"301":830,"302":831,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":0,"316":1,"317":1,"318":1,"319":1,"320":0,"321":1,"322":0,"323":0,"324":0,"325":0,"326":0,"327":1,"328":1,"329":0,"330":0,"331":0,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":0,"340":0,"341":1,"342":1,"343":1,"344":1,"345":1,"346":0,"347":0,"348":0,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"355":1,"356":1,"357":1,"358":0,"359":1,"360":0,"361":1,"362":1,"363":0,"364":1,"365":1,"366":0,"367":0,"368":1,"369":1,"370":1,"371":0,"372":1,"373":1,"374":0,"375":1,"376":1,"377":0,"378":0,"379":1,"380":1,"381":2,"382":2,"383":1,"384":2,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":0,"405":1,"406":1,"407":0,"408":1,"409":1,"410":1,"411":0,"412":0,"413":0,"414":0,"415":0,"416":1,"417":2,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":0,"425":1,"426":1,"427":1,"428":0,"429":1,"430":0,"431":0,"432":0,"433":0,"434":0,"435":1,"436":1,"437":1,"438":1,"439":1,"440":0,"441":1,"442":0,"443":1,"444":0,"445":0,"446":0,"447":2,"448":2,"449":2,"450":2,"451":2,"452":2,"453":0,"454":0,"455":0,"456":1,"457":1,"458":0,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":0,"466":0,"467":0,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"476":1,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":1,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":3,"518":3,"519":3,"520":1,"521":3,"522":1,"523":3,"524":2,"525":3,"526":1,"527":3,"528":2,"529":2,"530":2,"531":2,"532":1,"533":1,"534":1,"535":1,"536":1,"537":1,"538":1,"539":1,"540":1,"541":0,"542":1,"543":0,"544":1,"545":1,"546":0,"547":0,"548":0,"549":0,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":0,"557":0,"558":0,"559":1,"560":1,"561":0,"562":1,"563":1,"564":1,"565":1,"566":1,"567":1,"568":0,"569":1,"570":1,"571":1,"572":1,"573":1,"574":1,"575":1,"576":0,"577":1,"578":1,"579":1,"580":0,"581":0,"582":1,"583":1,"584":0,"585":0,"586":0,"587":1,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":3,"645":3,"646":3,"647":7,"648":1,"649":6,"650":6,"651":3,"652":3,"653":3,"654":3,"655":3,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":4,"672":2,"673":3,"674":3,"675":0,"676":0,"677":0,"678":0,"679":0,"680":3,"681":2,"682":2,"683":2,"684":0,"685":0,"686":3,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":3,"697":0,"698":0,"699":3,"700":0,"701":0,"702":0,"703":0,"704":0,"705":3,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":3,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":3,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":3,"743":3,"744":0},"f":{"0":3,"1":1,"2":9,"3":9,"4":0,"5":1,"6":2,"7":2,"8":1,"9":1,"10":0,"11":0,"12":2,"13":2,"14":1,"15":1,"16":1,"17":1,"18":1,"19":0,"20":0,"21":1,"22":0,"23":0,"24":0,"25":2,"26":14,"27":6,"28":6,"29":4,"30":4,"31":4,"32":6,"33":4,"34":4,"35":4,"36":2,"37":1,"38":4,"39":3,"40":2,"41":2,"42":1,"43":1,"44":1,"45":0,"46":0,"47":1,"48":1,"49":0,"50":1,"51":0,"52":0,"53":0,"54":2,"55":1,"56":0,"57":1,"58":1,"59":0,"60":1,"61":2,"62":2,"63":1,"64":1,"65":2,"66":1,"67":1,"68":3,"69":2,"70":1,"71":1,"72":0,"73":1,"74":0,"75":1,"76":1,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":3,"84":3,"85":3,"86":1,"87":2,"88":4,"89":0,"90":2,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0},"b":{"0":[0,9],"1":[9,2],"2":[0,9],"3":[9,2],"4":[0,9],"5":[9,0],"6":[0,0],"7":[9],"8":[0,9],"9":[2,7],"10":[9,2],"11":[1],"12":[1],"13":[0,1],"14":[0,1],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,2],"20":[1,1,1],"21":[1,0],"22":[1,0],"23":[1,1],"24":[1],"25":[1,0],"26":[1,0,0],"27":[1,0],"28":[0,0],"29":[0,0],"30":[0],"31":[0],"32":[0],"33":[0,0],"34":[0,0],"35":[0,0],"36":[0,0],"37":[0,0],"38":[0,2],"39":[0,2],"40":[2,2],"41":[0,6],"42":[4,2],"43":[0,2],"44":[3,1],"45":[4,3],"46":[0,4],"47":[4,0],"48":[4,0],"49":[6],"50":[6,2],"51":[6,4],"52":[0,4],"53":[4,2],"54":[6,4],"55":[6,2],"56":[4,2],"57":[4,0],"58":[0,4],"59":[0,4],"60":[1,3],"61":[4,3],"62":[3,1],"63":[4,3],"64":[5,4],"65":[1,4],"66":[2,3],"67":[2,3],"68":[2,0,0],"69":[3,0],"70":[2,4],"71":[6,2],"72":[2,0],"73":[1,1],"74":[1,0],"75":[0,4],"76":[2,2],"77":[4,2],"78":[2,0],"79":[2,2],"80":[2,0],"81":[2,0],"82":[2,2],"83":[2,0],"84":[1,1],"85":[1,0],"86":[1,0],"87":[2,0],"88":[2,2],"89":[2,0],"90":[2,2],"91":[0,2],"92":[2,0],"93":[0,2],"94":[2,0],"95":[0,0],"96":[0,0],"97":[0,2],"98":[2,0],"99":[0,0],"100":[2,0],"101":[0,0],"102":[0,0],"103":[0,0],"104":[2],"105":[2,0],"106":[2,0],"107":[2,0],"108":[0,1],"109":[0,1],"110":[1,1],"111":[0,0],"112":[0,1],"113":[0,0],"114":[0,0],"115":[2,2],"116":[3],"117":[1,2],"118":[0,0],"119":[2],"120":[0,0],"121":[0,0],"122":[0,0],"123":[0,0],"124":[0,0],"125":[0,0],"126":[2],"127":[832,0],"128":[1,831],"129":[830,1],"130":[0,830],"131":[0,830],"132":[1],"133":[1],"134":[1,0],"135":[1,0],"136":[1,0],"137":[1,0],"138":[0,1],"139":[0,0],"140":[1,0],"141":[0,1],"142":[0,0],"143":[0,0],"144":[0,0],"145":[2],"146":[2,0],"147":[2,0],"148":[2,2],"149":[1,1],"150":[1,1],"151":[1,1],"152":[2,1],"153":[1,0],"154":[1],"155":[1],"156":[1],"157":[0,1],"158":[0,1],"159":[1],"160":[1],"161":[1],"162":[0,1],"163":[0,1],"164":[2],"165":[2],"166":[2],"167":[1,0],"168":[0,2],"169":[2,1],"170":[0,0],"171":[1,0],"172":[1,0],"173":[0,1],"174":[1,0],"175":[0,1],"176":[0,1],"177":[1,1],"178":[0,1],"179":[0,0],"180":[0,0],"181":[2],"182":[1,1],"183":[0,1],"184":[1,0,1,1],"185":[0,1],"186":[1,1],"187":[0,0],"188":[0,1],"189":[1,1],"190":[0,1],"191":[1,0],"192":[1,0],"193":[0,0],"194":[2,0],"195":[0,0],"196":[0,1],"197":[1,1],"198":[0,0],"199":[1],"200":[1],"201":[1,0],"202":[1,0],"203":[0,0],"204":[0,0],"205":[0,0],"206":[0,1],"207":[0,0],"208":[0,0],"209":[0,0],"210":[0,0],"211":[0,0],"212":[0,0],"213":[0,0],"214":[0,0],"215":[0,0],"216":[1,2],"217":[1,2],"218":[2,1],"219":[1,2],"220":[2,1],"221":[2],"222":[1,1],"223":[1,1],"224":[1],"225":[1,0],"226":[0,1],"227":[0,1],"228":[0,0],"229":[1,2],"230":[0,0],"231":[0,0],"232":[0,1],"233":[1,0],"234":[1,0],"235":[1,0],"236":[1],"237":[1],"238":[1],"239":[0,1],"240":[0,1],"241":[0,1],"242":[0,1],"243":[0],"244":[0],"245":[0,0],"246":[0,0],"247":[0,0],"248":[0,0],"249":[0,0],"250":[0,0],"251":[0,0],"252":[0,0],"253":[0],"254":[0],"255":[0,0],"256":[0,0,0],"257":[0,0],"258":[0,0],"259":[0,0],"260":[0,0],"261":[0],"262":[0],"263":[0,0],"264":[0,0,0],"265":[0],"266":[0],"267":[0,0],"268":[0,0,0],"269":[1,6],"270":[3,0],"271":[3,0],"272":[1,0],"273":[1,0],"274":[0,0],"275":[0,0],"276":[1,0],"277":[0,1],"278":[0,0],"279":[1,0],"280":[0,1],"281":[1,0],"282":[1,0],"283":[1,0],"284":[2,1],"285":[4,0],"286":[4,0],"287":[4,4],"288":[4,4],"289":[0,0],"290":[0,0],"291":[0,0],"292":[0,0],"293":[0,0],"294":[0,0],"295":[0,0],"296":[0,0],"297":[3,3],"298":[0,3]},"meta":{"lastBranch":299,"lastFunction":101,"lastStatement":745,"seen":{"s:49:0:49:Infinity":0,"s:51:16:51:Infinity":1,"f:78:9:78:38":0,"s:79:1:98:Infinity":2,"s:194:35:201:Infinity":3,"f:197:7:197:8":1,"s:198:2:198:Infinity":4,"s:199:2:199:Infinity":5,"s:203:18:232:Infinity":6,"f:212:14:212:15":2,"b:213:2:218:Infinity:undefined:undefined:undefined:undefined":0,"s:213:2:218:Infinity":7,"b:213:6:213:28:213:28:213:52":1,"s:214:3:217:Infinity":8,"b:219:2:224:Infinity:undefined:undefined:undefined:undefined":2,"s:219:2:224:Infinity":9,"b:219:6:219:31:219:31:219:52":3,"s:220:3:223:Infinity":10,"b:225:2:231:Infinity:undefined:undefined:undefined:undefined":4,"s:225:2:231:Infinity":11,"b:225:6:225:32:225:32:225:80":5,"b:225:34:225:56:225:56:225:80":6,"s:226:3:230:Infinity":12,"f:234:9:234:17":3,"b:234:39:234:66":7,"s:236:16:236:Infinity":13,"b:237:1:241:Infinity:undefined:undefined:undefined:undefined":8,"s:237:1:241:Infinity":14,"s:238:2:238:Infinity":15,"s:239:2:239:Infinity":16,"f:239:30:239:31":4,"s:239:39:239:72":17,"s:240:2:240:Infinity":18,"s:250:5:250:Infinity":19,"s:253:2:255:Infinity":20,"b:254:5:254:Infinity:255:5:255:Infinity":9,"b:253:2:253:12:253:12:253:Infinity":10,"s:257:1:262:Infinity":21,"s:265:6:265:Infinity":22,"f:271:15:271:Infinity":5,"b:274:53:274:Infinity":11,"b:274:15:274:26":12,"b:277:1:279:Infinity:undefined:undefined:undefined:undefined":13,"s:277:1:279:Infinity":23,"s:278:2:278:Infinity":24,"s:280:1:296:Infinity":25,"s:281:29:285:Infinity":26,"b:286:2:289:Infinity:undefined:undefined:undefined:undefined":14,"s:286:2:289:Infinity":27,"b:287:3:287:Infinity:undefined:undefined:undefined:undefined":15,"s:287:3:287:Infinity":28,"s:287:22:287:Infinity":29,"b:288:3:288:Infinity:undefined:undefined:undefined:undefined":16,"s:288:3:288:Infinity":30,"s:288:22:288:Infinity":31,"s:290:2:290:Infinity":32,"b:292:2:294:Infinity:undefined:undefined:undefined:undefined":17,"s:292:2:294:Infinity":33,"s:293:3:293:Infinity":34,"s:295:2:295:Infinity":35,"f:307:15:307:Infinity":6,"s:312:1:341:Infinity":36,"f:312:26:312:27":7,"s:313:8:315:Infinity":37,"s:316:15:316:Infinity":38,"s:317:15:317:Infinity":39,"s:318:16:318:Infinity":40,"s:319:16:321:Infinity":41,"f:319:27:319:33":8,"s:320:3:320:Infinity":42,"s:323:2:325:Infinity":43,"f:323:27:323:28":9,"s:324:3:324:Infinity":44,"s:326:2:328:Infinity":45,"f:326:27:326:28":10,"s:327:3:327:Infinity":46,"s:329:2:334:Infinity":47,"f:329:20:329:21":11,"b:330:3:330:Infinity:undefined:undefined:undefined:undefined":18,"s:330:3:330:Infinity":48,"s:330:16:330:Infinity":49,"s:331:3:331:Infinity":50,"s:332:3:332:Infinity":51,"s:333:3:333:Infinity":52,"s:335:2:340:Infinity":53,"f:335:20:335:21":12,"b:336:3:336:Infinity:undefined:undefined:undefined:undefined":19,"s:336:3:336:Infinity":54,"s:336:16:336:Infinity":55,"s:337:3:337:Infinity":56,"s:338:3:338:Infinity":57,"s:339:3:339:Infinity":58,"f:349:1:349:13":13,"s:350:2:350:Infinity":59,"s:351:2:351:Infinity":60,"s:352:2:352:Infinity":61,"s:353:2:353:Infinity":62,"f:357:9:357:17":14,"s:358:1:358:Infinity":63,"b:358:16:358:23:358:23:358:50:358:50:358:63":20,"f:361:15:361:33":15,"s:363:1:374:Infinity":64,"s:364:21:369:Infinity":65,"s:370:18:370:Infinity":66,"b:371:2:371:Infinity:undefined:undefined:undefined:undefined":21,"s:371:2:371:Infinity":67,"s:371:15:371:Infinity":68,"s:373:2:373:Infinity":69,"s:375:1:375:Infinity":70,"f:378:15:378:35":16,"s:380:1:396:Infinity":71,"s:381:2:389:Infinity":72,"f:381:26:381:27":17,"s:382:18:388:Infinity":73,"f:384:19:384:20":18,"s:384:28:384:39":74,"f:385:23:385:29":19,"s:386:5:386:Infinity":75,"f:386:18:386:24":20,"s:386:24:386:33":76,"b:391:2:394:Infinity:undefined:undefined:undefined:undefined":22,"s:391:2:394:Infinity":77,"b:391:6:391:22:391:22:391:49":23,"s:392:19:392:Infinity":78,"s:393:3:393:Infinity":79,"s:395:2:395:Infinity":80,"f:399:15:399:Infinity":21,"b:403:23:403:Infinity":24,"b:405:1:431:Infinity:undefined:undefined:undefined:undefined":25,"s:405:1:431:Infinity":81,"b:406:2:406:Infinity:407:3:407:19:407:19:407:Infinity":26,"s:410:3:412:Infinity":82,"b:411:6:411:Infinity:412:6:412:Infinity":27,"s:413:2:413:Infinity":83,"b:414:2:424:Infinity:undefined:undefined:undefined:undefined":28,"s:414:2:424:Infinity":84,"s:415:3:415:Infinity":85,"s:416:3:416:Infinity":86,"b:417:3:423:Infinity:undefined:undefined:undefined:undefined":29,"s:417:3:423:Infinity":87,"s:418:4:422:Infinity":88,"s:425:2:429:Infinity":89,"s:430:2:430:Infinity":90,"s:432:1:432:Infinity":91,"s:433:1:433:Infinity":92,"f:436:15:436:Infinity":22,"b:438:24:438:Infinity":30,"b:439:23:439:Infinity":31,"s:442:1:445:Infinity":93,"f:442:35:442:41":23,"s:443:2:443:Infinity":94,"s:444:2:444:Infinity":95,"f:448:15:448:Infinity":24,"b:450:14:450:Infinity":32,"b:452:1:452:Infinity:undefined:undefined:undefined:undefined":33,"s:452:1:452:Infinity":96,"b:452:1:452:20:452:15:452:29":34,"s:452:29:452:Infinity":97,"b:453:1:453:Infinity:undefined:undefined:undefined:undefined":35,"s:453:1:453:Infinity":98,"s:453:14:453:Infinity":99,"s:454:12:454:Infinity":100,"s:455:16:455:Infinity":101,"b:455:29:455:41:455:41:455:Infinity":36,"s:456:7:458:Infinity":102,"s:459:1:459:Infinity":103,"b:460:1:460:Infinity:undefined:undefined:undefined:undefined":37,"s:460:1:460:Infinity":104,"s:460:14:460:Infinity":105,"s:461:1:461:Infinity":106,"s:464:20:464:Infinity":107,"f:495:9:495:37":25,"s:497:1:506:Infinity":108,"b:498:2:498:Infinity:undefined:undefined:undefined:undefined":38,"s:498:2:498:Infinity":109,"s:498:35:498:Infinity":110,"s:499:14:499:Infinity":111,"s:500:17:500:Infinity":112,"b:501:2:501:Infinity:undefined:undefined:undefined:undefined":39,"s:501:2:501:Infinity":113,"b:501:6:501:36:501:36:501:53":40,"s:501:53:501:Infinity":114,"s:502:2:502:Infinity":115,"s:504:2:504:Infinity":116,"s:505:2:505:Infinity":117,"f:520:9:520:23":26,"s:522:1:525:Infinity":118,"f:522:40:522:41":27,"s:523:17:523:Infinity":119,"s:524:2:524:Infinity":120,"b:524:25:524:30:524:30:524:Infinity":41,"s:536:30:536:Infinity":121,"s:537:30:537:Infinity":122,"s:538:29:538:Infinity":123,"f:540:9:540:26":28,"b:541:1:541:Infinity:undefined:undefined:undefined:undefined":42,"s:541:1:541:Infinity":124,"s:541:13:541:Infinity":125,"b:542:1:542:Infinity:undefined:undefined:undefined:undefined":43,"s:542:1:542:Infinity":126,"s:542:28:542:Infinity":127,"s:543:1:543:Infinity":128,"f:546:9:546:26":29,"s:547:1:555:Infinity":129,"s:548:14:548:Infinity":130,"s:549:17:549:Infinity":131,"b:550:2:552:Infinity:undefined:undefined:undefined:undefined":44,"s:550:2:552:Infinity":132,"b:550:6:550:16:550:16:550:44":45,"s:551:3:551:Infinity":133,"s:556:1:556:Infinity":134,"f:559:15:559:32":30,"s:560:1:560:Infinity":135,"s:561:1:561:Infinity":136,"f:564:9:564:26":31,"b:565:1:565:Infinity:undefined:undefined:undefined:undefined":46,"s:565:1:565:Infinity":137,"s:565:25:565:Infinity":138,"s:566:14:566:Infinity":139,"b:566:18:566:51:566:51:566:Infinity":47,"s:567:1:567:Infinity":140,"b:567:8:567:16:567:16:567:Infinity":48,"f:570:15:570:Infinity":32,"b:574:47:574:Infinity":49,"s:577:13:577:Infinity":141,"b:577:13:577:31:577:31:577:Infinity":50,"s:578:15:578:Infinity":142,"s:579:24:579:Infinity":143,"b:579:33:579:58:579:58:579:63":51,"s:580:19:580:Infinity":144,"s:581:15:581:Infinity":145,"s:582:22:586:Infinity":146,"f:582:22:582:34":33,"b:583:2:583:Infinity:undefined:undefined:undefined:undefined":52,"s:583:2:583:Infinity":147,"s:583:15:583:Infinity":148,"s:584:2:584:Infinity":149,"s:585:2:585:Infinity":150,"s:589:20:589:Infinity":151,"s:591:2:593:Infinity":152,"b:592:5:592:Infinity:593:5:593:Infinity":53,"s:594:21:594:Infinity":153,"b:594:30:594:57:594:57:594:79":54,"s:595:22:595:Infinity":154,"b:595:22:595:43:595:43:595:Infinity":55,"s:596:19:596:Infinity":155,"s:599:20:599:Infinity":156,"b:602:1:634:Infinity:undefined:undefined:undefined:undefined":56,"s:602:1:634:Infinity":157,"s:603:8:603:Infinity":158,"b:603:23:603:35:603:35:603:39":57,"s:604:2:617:Infinity":159,"b:605:3:605:Infinity:undefined:undefined:undefined:undefined":58,"s:605:3:605:Infinity":160,"s:605:17:605:Infinity":161,"b:606:3:610:Infinity:undefined:undefined:undefined:undefined":59,"s:606:3:610:Infinity":162,"s:607:4:607:Infinity":163,"s:608:4:608:Infinity":164,"s:609:4:609:Infinity":165,"s:611:25:611:Infinity":166,"b:612:3:616:Infinity:undefined:undefined:undefined:undefined":60,"s:612:3:616:Infinity":167,"s:613:4:613:Infinity":168,"s:614:4:614:Infinity":169,"s:615:4:615:Infinity":170,"s:619:21:619:Infinity":171,"s:620:16:620:Infinity":172,"s:621:16:621:Infinity":173,"s:622:17:622:Infinity":174,"s:623:21:623:Infinity":175,"b:623:21:623:30:623:30:623:Infinity":61,"b:625:2:630:Infinity:627:9:630:Infinity":62,"s:625:2:630:Infinity":176,"b:625:6:625:23:625:23:625:35":63,"s:626:3:626:Infinity":177,"s:628:3:628:Infinity":178,"s:629:3:629:Infinity":179,"s:632:2:632:Infinity":180,"s:633:2:633:Infinity":181,"s:636:37:641:Infinity":182,"b:638:16:638:32:638:32:638:Infinity":64,"b:640:31:640:40:640:40:640:Infinity":65,"s:644:20:646:Infinity":183,"b:645:4:645:Infinity:646:4:646:Infinity":66,"s:647:22:649:Infinity":184,"b:648:4:648:Infinity:649:4:649:Infinity":67,"b:648:20:648:47:648:47:648:66:648:66:648:68":68,"b:649:4:649:31:649:31:649:Infinity":69,"s:650:40:654:Infinity":185,"s:657:19:657:Infinity":186,"b:658:1:666:Infinity:undefined:undefined:undefined:undefined":70,"s:658:1:666:Infinity":187,"b:658:5:658:33:658:33:658:55":71,"s:659:8:659:Infinity":188,"b:659:16:659:28:659:28:659:32":72,"b:660:2:665:Infinity:undefined:undefined:undefined:undefined":73,"s:660:2:665:Infinity":189,"s:661:3:663:Infinity":190,"b:662:35:662:43:662:43:662:54":74,"s:664:3:664:Infinity":191,"b:667:1:670:Infinity:undefined:undefined:undefined:undefined":75,"s:667:1:670:Infinity":192,"s:668:2:668:Infinity":193,"s:669:2:669:Infinity":194,"b:672:1:676:Infinity:undefined:undefined:undefined:undefined":76,"s:672:1:676:Infinity":195,"b:672:5:672:30:672:30:672:42":77,"s:673:2:673:Infinity":196,"s:674:2:674:Infinity":197,"s:675:2:675:Infinity":198,"b:678:1:751:Infinity:undefined:undefined:undefined:undefined":78,"s:678:1:751:Infinity":199,"b:678:5:678:33:678:33:678:56":79,"s:679:2:679:Infinity":200,"s:680:13:680:Infinity":201,"f:680:31:680:32":34,"s:680:41:680:75":202,"s:681:25:683:Infinity":203,"b:682:5:682:Infinity:683:5:683:Infinity":80,"b:684:2:686:Infinity:undefined:undefined:undefined:undefined":81,"s:684:2:686:Infinity":204,"b:684:6:684:24:684:24:684:41":82,"s:685:3:685:Infinity":205,"b:689:2:703:Infinity:undefined:undefined:undefined:undefined":83,"s:689:2:703:Infinity":206,"s:690:9:693:Infinity":207,"b:691:6:691:Infinity:692:6:692:Infinity":84,"b:691:6:691:37:691:37:691:Infinity":85,"b:692:6:692:40:692:40:692:Infinity":86,"f:693:9:693:10":35,"s:693:19:693:53":208,"b:694:3:702:Infinity:undefined:undefined:undefined:undefined":87,"s:694:3:702:Infinity":209,"s:695:29:695:Infinity":210,"b:695:29:695:67:695:67:695:Infinity":88,"s:696:21:696:Infinity":211,"b:696:59:696:77:696:77:696:Infinity":89,"b:696:21:696:41:696:41:696:59":90,"s:697:4:701:Infinity":212,"s:704:20:704:Infinity":213,"s:705:2:705:Infinity":214,"s:706:18:706:Infinity":215,"s:707:2:750:Infinity":216,"s:709:4:709:Infinity":217,"s:710:19:710:Infinity":218,"b:711:3:713:Infinity:undefined:undefined:undefined:undefined":91,"s:711:3:713:Infinity":219,"s:712:4:712:Infinity":220,"s:714:3:716:Infinity":221,"b:715:44:715:55:715:55:715:64":92,"s:717:3:717:Infinity":222,"b:718:3:723:Infinity:undefined:undefined:undefined:undefined":93,"s:718:3:723:Infinity":223,"b:718:8:718:16:718:16:718:23":94,"s:719:4:721:Infinity":224,"b:720:44:720:52:720:52:720:61":95,"b:720:74:720:84:720:84:720:90":96,"s:722:4:722:Infinity":225,"b:724:3:729:Infinity:undefined:undefined:undefined:undefined":97,"s:724:3:729:Infinity":226,"b:724:7:724:17:724:17:724:26":98,"s:725:4:727:Infinity":227,"b:726:71:726:79:726:79:726:88":99,"s:728:4:728:Infinity":228,"s:730:3:730:Infinity":229,"b:730:10:730:21:730:21:730:Infinity":100,"s:732:19:732:Infinity":230,"s:733:18:733:Infinity":231,"s:734:22:734:Infinity":232,"b:734:22:734:48:734:48:734:Infinity":101,"s:735:20:735:Infinity":233,"b:739:3:741:Infinity:undefined:undefined:undefined:undefined":102,"s:739:3:741:Infinity":234,"s:740:4:740:Infinity":235,"b:742:3:748:Infinity:746:10:748:Infinity":103,"s:742:3:748:Infinity":236,"s:743:4:745:Infinity":237,"s:747:4:747:Infinity":238,"s:749:3:749:Infinity":239,"s:753:1:753:Infinity":240,"f:756:15:756:Infinity":36,"b:760:23:760:Infinity":104,"s:763:25:768:Infinity":241,"b:764:8:764:24:764:24:764:Infinity":105,"b:765:8:765:24:765:24:765:Infinity":106,"b:766:6:766:20:766:20:766:Infinity":107,"s:770:19:776:Infinity":242,"f:773:17:773:23":37,"s:773:23:773:Infinity":243,"b:777:1:777:Infinity:undefined:undefined:undefined:undefined":108,"s:777:1:777:Infinity":244,"s:777:17:777:Infinity":245,"s:779:19:779:Infinity":246,"s:780:17:780:Infinity":247,"b:781:1:788:Infinity:undefined:undefined:undefined:undefined":109,"s:781:1:788:Infinity":248,"b:781:5:781:19:781:19:781:29":110,"b:782:1:786:Infinity:undefined:undefined:undefined:undefined":111,"s:782:1:786:Infinity":249,"s:783:2:786:Infinity":250,"s:787:2:787:Infinity":251,"s:790:1:792:Infinity":252,"s:794:1:809:Infinity":253,"s:795:2:799:Infinity":254,"b:800:2:806:Infinity:undefined:undefined:undefined:undefined":112,"s:800:2:806:Infinity":255,"s:801:3:805:Infinity":256,"b:803:44:803:59:803:59:803:67":113,"s:808:2:808:Infinity":257,"b:808:26:808:37:808:37:808:48":114,"f:812:9:812:22":38,"b:814:1:818:Infinity:undefined:undefined:undefined:undefined":115,"s:814:1:818:Infinity":258,"s:815:2:817:Infinity":259,"s:819:1:821:Infinity":260,"f:824:15:824:Infinity":39,"b:827:23:827:Infinity":116,"b:830:1:833:Infinity:undefined:undefined:undefined:undefined":117,"s:830:1:833:Infinity":261,"s:831:2:831:Infinity":262,"s:832:2:832:Infinity":263,"s:834:1:850:Infinity":264,"s:835:20:835:Infinity":265,"s:836:2:843:Infinity":266,"s:844:2:844:Infinity":267,"b:846:2:849:Infinity:undefined:undefined:undefined:undefined":118,"s:846:2:849:Infinity":268,"s:847:3:847:Infinity":269,"s:848:3:848:Infinity":270,"f:853:15:853:Infinity":40,"b:856:23:856:Infinity":119,"s:859:13:859:Infinity":271,"s:860:16:860:Infinity":272,"s:861:7:861:Infinity":273,"s:862:7:862:Infinity":274,"s:864:1:901:Infinity":275,"s:865:18:869:Infinity":276,"s:871:2:875:Infinity":277,"s:876:2:876:Infinity":278,"s:878:17:878:Infinity":279,"s:885:27:885:Infinity":280,"s:887:3:889:Infinity":281,"b:888:6:888:Infinity:889:6:889:Infinity":120,"b:889:6:889:25:889:25:889:Infinity":121,"s:890:15:890:Infinity":282,"s:891:2:893:Infinity":283,"b:892:33:892:53:892:53:892:55":122,"b:892:67:892:89:892:89:892:91":123,"b:894:2:894:Infinity:undefined:undefined:undefined:undefined":124,"s:894:2:894:Infinity":284,"s:894:12:894:Infinity":285,"s:896:23:896:Infinity":286,"b:897:2:899:Infinity:undefined:undefined:undefined:undefined":125,"s:897:2:899:Infinity":287,"s:898:3:898:Infinity":288,"s:900:2:900:Infinity":289,"s:904:32:904:Infinity":290,"s:905:32:905:Infinity":291,"f:907:15:907:Infinity":41,"b:912:23:912:Infinity":126,"s:915:18:915:Infinity":292,"s:916:1:932:Infinity":293,"s:917:12:917:Infinity":294,"s:918:17:918:Infinity":295,"b:918:17:918:29:918:29:918:Infinity":127,"b:919:2:922:Infinity:undefined:undefined:undefined:undefined":128,"s:919:2:922:Infinity":296,"s:920:3:920:Infinity":297,"s:921:3:921:Infinity":298,"b:923:2:930:Infinity:undefined:undefined:undefined:undefined":129,"s:923:2:930:Infinity":299,"s:924:3:928:Infinity":300,"b:926:19:926:45:926:45:926:Infinity":130,"b:927:25:927:49:927:49:927:51":131,"s:929:3:929:Infinity":301,"s:931:2:931:Infinity":302,"s:933:1:935:Infinity":303,"f:938:15:938:Infinity":42,"b:940:8:940:Infinity":132,"b:943:23:943:Infinity":133,"s:945:7:945:Infinity":304,"s:947:13:947:Infinity":305,"s:948:7:948:Infinity":306,"s:951:1:951:Infinity":307,"s:952:1:955:Infinity":308,"f:952:9:952:10":43,"s:953:2:953:Infinity":309,"s:954:2:954:Infinity":310,"s:957:1:999:Infinity":311,"f:957:26:957:33":44,"s:958:41:958:Infinity":312,"b:958:41:958:53:958:53:958:Infinity":134,"s:959:2:963:Infinity":313,"b:960:16:960:24:960:24:960:33":135,"b:960:40:960:46:960:46:960:55":136,"b:961:4:961:18:961:18:961:Infinity":137,"b:964:2:964:Infinity:undefined:undefined:undefined:undefined":138,"s:964:2:964:Infinity":314,"s:964:15:964:Infinity":315,"b:964:47:964:55:964:55:964:57":139,"s:966:17:966:Infinity":316,"s:967:18:967:Infinity":317,"b:968:2:980:Infinity:undefined:undefined:undefined:undefined":140,"s:968:2:980:Infinity":318,"s:969:3:979:Infinity":319,"f:977:19:977:25":45,"s:977:25:977:Infinity":320,"b:982:2:995:Infinity:undefined:undefined:undefined:undefined":141,"s:982:2:995:Infinity":321,"s:983:3:994:Infinity":322,"s:984:4:988:Infinity":323,"b:989:4:991:Infinity:undefined:undefined:undefined:undefined":142,"s:989:4:991:Infinity":324,"s:990:5:990:Infinity":325,"s:993:4:993:Infinity":326,"b:993:28:993:36:993:36:993:47":143,"s:998:2:998:Infinity":327,"s:1001:1:1004:Infinity":328,"f:1001:9:1001:10":46,"b:1002:2:1002:Infinity:undefined:undefined:undefined:undefined":144,"s:1002:2:1002:Infinity":329,"s:1002:15:1002:Infinity":330,"s:1003:2:1003:Infinity":331,"s:1006:1:1029:Infinity":332,"f:1006:26:1006:27":47,"s:1007:17:1007:Infinity":333,"s:1009:22:1015:Infinity":334,"f:1009:22:1009:28":48,"s:1010:3:1010:Infinity":335,"s:1011:3:1013:Infinity":336,"s:1014:3:1014:Infinity":337,"s:1017:18:1020:Infinity":338,"f:1017:18:1017:19":49,"s:1018:3:1018:Infinity":339,"s:1019:3:1019:Infinity":340,"s:1022:18:1025:Infinity":341,"f:1022:18:1022:24":50,"s:1023:3:1023:Infinity":342,"s:1024:3:1024:Infinity":343,"s:1027:2:1027:Infinity":344,"s:1028:2:1028:Infinity":345,"f:1032:9:1032:23":51,"s:1034:18:1034:Infinity":346,"f:1034:30:1034:36":52,"s:1035:1:1035:Infinity":347,"s:1036:1:1038:Infinity":348,"f:1036:26:1036:32":53,"f:1041:15:1041:34":54,"b:1041:57:1041:66":145,"s:1043:20:1043:Infinity":349,"s:1044:16:1044:Infinity":350,"b:1044:26:1044:75:1044:75:1044:Infinity":146,"s:1046:2:1048:Infinity":351,"b:1047:6:1047:Infinity:1048:5:1048:Infinity":147,"b:1046:2:1046:37:1046:37:1046:Infinity":148,"s:1050:2:1050:Infinity":352,"b:1050:39:1050:65:1050:65:1050:Infinity":149,"s:1051:13:1053:Infinity":353,"b:1052:5:1052:Infinity:1053:4:1053:Infinity":150,"b:1054:1:1054:Infinity:undefined:undefined:undefined:undefined":151,"s:1054:1:1054:Infinity":354,"b:1054:5:1054:12:1054:12:1054:28":152,"s:1054:28:1054:Infinity":355,"b:1055:1:1055:Infinity:undefined:undefined:undefined:undefined":153,"s:1055:1:1055:Infinity":356,"s:1055:21:1055:Infinity":357,"s:1056:1:1056:Infinity":358,"f:1059:15:1059:Infinity":55,"b:1060:24:1060:Infinity":154,"b:1061:30:1061:Infinity":155,"b:1062:23:1062:Infinity":156,"s:1065:15:1068:Infinity":359,"f:1066:2:1066:8":56,"s:1066:8:1066:Infinity":360,"f:1067:2:1067:8":57,"s:1067:8:1067:Infinity":361,"b:1069:1:1069:Infinity:undefined:undefined:undefined:undefined":157,"s:1069:1:1069:Infinity":362,"s:1069:12:1069:Infinity":363,"s:1070:17:1073:Infinity":364,"b:1074:1:1077:Infinity:undefined:undefined:undefined:undefined":158,"s:1074:1:1077:Infinity":365,"s:1075:2:1075:Infinity":366,"s:1076:2:1076:Infinity":367,"s:1078:1:1078:Infinity":368,"s:1079:1:1079:Infinity":369,"f:1082:15:1082:Infinity":58,"b:1083:24:1083:Infinity":159,"b:1084:30:1084:Infinity":160,"b:1085:23:1085:Infinity":161,"s:1088:23:1091:Infinity":370,"f:1089:2:1089:8":59,"s:1089:8:1089:Infinity":371,"f:1090:2:1090:8":60,"s:1090:8:1090:Infinity":372,"b:1092:1:1092:Infinity:undefined:undefined:undefined:undefined":162,"s:1092:1:1092:Infinity":373,"s:1092:20:1092:Infinity":374,"s:1094:17:1097:Infinity":375,"b:1098:1:1101:Infinity:undefined:undefined:undefined:undefined":163,"s:1098:1:1101:Infinity":376,"s:1099:2:1099:Infinity":377,"s:1100:2:1100:Infinity":378,"s:1102:1:1102:Infinity":379,"s:1103:1:1103:Infinity":380,"f:1106:15:1106:Infinity":61,"b:1108:24:1108:Infinity":164,"b:1109:23:1109:Infinity":165,"b:1110:30:1110:Infinity":166,"s:1113:1:1194:Infinity":381,"s:1114:8:1116:Infinity":382,"s:1117:17:1119:Infinity":383,"b:1118:6:1118:Infinity:1119:5:1119:Infinity":167,"b:1120:2:1141:Infinity:undefined:undefined:undefined:undefined":168,"s:1120:2:1141:Infinity":384,"b:1120:6:1120:17:1120:17:1120:51":169,"s:1121:3:1123:Infinity":385,"s:1124:3:1128:Infinity":386,"s:1129:3:1133:Infinity":387,"s:1134:19:1137:Infinity":388,"b:1138:3:1138:Infinity:undefined:undefined:undefined:undefined":170,"s:1138:3:1138:Infinity":389,"s:1138:17:1138:Infinity":390,"s:1139:3:1139:Infinity":391,"s:1140:3:1140:Infinity":392,"s:1143:2:1143:Infinity":393,"s:1144:21:1151:Infinity":394,"b:1152:2:1152:Infinity:undefined:undefined:undefined:undefined":171,"s:1152:2:1152:Infinity":395,"s:1152:21:1152:Infinity":396,"s:1154:20:1154:Infinity":397,"s:1155:17:1155:Infinity":398,"b:1155:56:1155:75:1155:75:1155:Infinity":172,"s:1156:17:1156:Infinity":399,"b:1156:56:1156:75:1156:75:1156:Infinity":173,"b:1157:2:1169:Infinity:undefined:undefined:undefined:undefined":174,"s:1157:2:1169:Infinity":400,"s:1158:3:1158:Infinity":401,"s:1159:21:1159:Infinity":402,"b:1160:3:1168:Infinity:1162:10:1168:Infinity":175,"s:1160:3:1168:Infinity":403,"s:1161:4:1161:Infinity":404,"s:1163:4:1167:Infinity":405,"b:1170:2:1179:Infinity:undefined:undefined:undefined:undefined":176,"s:1170:2:1179:Infinity":406,"b:1171:3:1171:Infinity:1172:3:1172:Infinity":177,"s:1174:3:1178:Infinity":407,"s:1180:2:1182:Infinity":408,"s:1183:2:1187:Infinity":409,"b:1188:2:1192:Infinity:undefined:undefined:undefined:undefined":178,"s:1188:2:1192:Infinity":410,"b:1189:3:1189:Infinity:undefined:undefined:undefined:undefined":179,"s:1189:3:1189:Infinity":411,"s:1189:22:1189:Infinity":412,"b:1190:3:1190:Infinity:undefined:undefined:undefined:undefined":180,"s:1190:3:1190:Infinity":413,"s:1190:22:1190:Infinity":414,"s:1191:3:1191:Infinity":415,"s:1193:2:1193:Infinity":416,"f:1197:15:1197:Infinity":62,"b:1201:23:1201:Infinity":181,"b:1204:1:1207:Infinity:undefined:undefined:undefined:undefined":182,"s:1204:1:1207:Infinity":417,"s:1205:2:1205:Infinity":418,"s:1206:2:1206:Infinity":419,"s:1208:1:1243:Infinity":420,"s:1211:23:1211:Infinity":421,"s:1212:18:1215:Infinity":422,"b:1216:2:1218:Infinity:undefined:undefined:undefined:undefined":183,"s:1216:2:1218:Infinity":423,"s:1217:3:1217:Infinity":424,"s:1219:16:1225:Infinity":425,"f:1220:3:1220:4":63,"s:1221:5:1224:Infinity":426,"b:1221:5:1221:Infinity:1222:5:1222:Infinity:1223:5:1223:Infinity:1224:5:1224:Infinity":184,"b:1226:2:1230:Infinity:undefined:undefined:undefined:undefined":185,"s:1226:2:1230:Infinity":427,"b:1226:6:1226:16:1226:16:1226:47":186,"s:1227:3:1229:Infinity":428,"s:1231:2:1231:Infinity":429,"s:1233:2:1233:Infinity":430,"b:1234:2:1236:Infinity:undefined:undefined:undefined:undefined":187,"s:1234:2:1236:Infinity":431,"s:1235:3:1235:Infinity":432,"s:1237:2:1241:Infinity":433,"s:1242:2:1242:Infinity":434,"f:1246:15:1246:Infinity":64,"s:1250:13:1250:Infinity":435,"s:1251:15:1251:Infinity":436,"s:1252:1:1267:Infinity":437,"s:1253:15:1256:Infinity":438,"b:1257:2:1257:Infinity:undefined:undefined:undefined:undefined":188,"s:1257:2:1257:Infinity":439,"b:1257:6:1257:15:1257:15:1257:34":189,"s:1257:34:1257:Infinity":440,"b:1258:2:1262:Infinity:undefined:undefined:undefined:undefined":190,"s:1258:2:1262:Infinity":441,"b:1258:6:1258:25:1258:20:1258:38":191,"s:1259:3:1261:Infinity":442,"s:1263:2:1263:Infinity":443,"b:1263:9:1263:25:1263:25:1263:Infinity":192,"b:1265:2:1265:Infinity:undefined:undefined:undefined:undefined":193,"s:1265:2:1265:Infinity":444,"s:1265:19:1265:Infinity":445,"s:1266:2:1266:Infinity":446,"f:1270:15:1270:Infinity":65,"s:1275:1:1289:Infinity":447,"s:1276:14:1276:Infinity":448,"s:1277:16:1277:Infinity":449,"s:1278:15:1281:Infinity":450,"s:1283:4:1284:Infinity":451,"b:1283:4:1284:29:1284:29:1284:Infinity":194,"s:1285:2:1285:Infinity":452,"b:1287:2:1287:Infinity:undefined:undefined:undefined:undefined":195,"s:1287:2:1287:Infinity":453,"s:1287:19:1287:Infinity":454,"s:1288:2:1288:Infinity":455,"f:1292:15:1292:Infinity":66,"s:1297:14:1297:Infinity":456,"b:1298:1:1298:Infinity:undefined:undefined:undefined:undefined":196,"s:1298:1:1298:Infinity":457,"s:1298:12:1298:Infinity":458,"s:1299:1:1315:Infinity":459,"s:1300:2:1303:Infinity":460,"s:1304:18:1304:Infinity":461,"s:1305:17:1305:Infinity":462,"s:1306:2:1310:Infinity":463,"b:1308:42:1308:52:1308:52:1308:55":197,"s:1311:2:1311:Infinity":464,"b:1313:2:1313:Infinity:undefined:undefined:undefined:undefined":198,"s:1313:2:1313:Infinity":465,"s:1313:19:1313:Infinity":466,"s:1314:2:1314:Infinity":467,"f:1318:15:1318:Infinity":67,"b:1322:26:1322:Infinity":199,"b:1323:23:1323:Infinity":200,"s:1326:19:1326:Infinity":468,"s:1327:21:1327:Infinity":469,"s:1330:1:1362:Infinity":470,"s:1331:2:1341:Infinity":471,"s:1343:18:1345:Infinity":472,"s:1347:3:1347:Infinity":473,"b:1347:3:1347:37:1347:37:1347:Infinity":201,"b:1348:2:1351:Infinity:undefined:undefined:undefined:undefined":202,"s:1348:2:1351:Infinity":474,"s:1349:3:1349:Infinity":475,"s:1350:3:1350:Infinity":476,"b:1352:2:1355:Infinity:undefined:undefined:undefined:undefined":203,"s:1352:2:1355:Infinity":477,"s:1353:3:1355:Infinity":478,"b:1357:2:1361:Infinity:undefined:undefined:undefined:undefined":204,"s:1357:2:1361:Infinity":479,"s:1358:3:1361:Infinity":480,"s:1365:1:1393:Infinity":481,"s:1366:2:1373:Infinity":482,"s:1374:18:1376:Infinity":483,"s:1378:3:1378:Infinity":484,"b:1378:3:1378:37:1378:37:1378:Infinity":205,"b:1379:2:1382:Infinity:undefined:undefined:undefined:undefined":206,"s:1379:2:1382:Infinity":485,"s:1380:3:1380:Infinity":486,"s:1381:3:1381:Infinity":487,"b:1383:2:1386:Infinity:undefined:undefined:undefined:undefined":207,"s:1383:2:1386:Infinity":488,"s:1384:3:1386:Infinity":489,"b:1388:2:1392:Infinity:undefined:undefined:undefined:undefined":208,"s:1388:2:1392:Infinity":490,"s:1389:3:1392:Infinity":491,"s:1396:1:1420:Infinity":492,"b:1397:2:1413:Infinity:undefined:undefined:undefined:undefined":209,"s:1397:2:1413:Infinity":493,"s:1398:3:1401:Infinity":494,"s:1402:19:1404:Infinity":495,"s:1406:4:1406:Infinity":496,"b:1406:4:1406:38:1406:38:1406:Infinity":210,"s:1407:3:1411:Infinity":497,"b:1409:39:1409:52:1409:52:1409:55":211,"s:1412:3:1412:Infinity":498,"b:1415:2:1419:Infinity:undefined:undefined:undefined:undefined":212,"s:1415:2:1419:Infinity":499,"s:1416:3:1419:Infinity":500,"s:1423:1:1436:Infinity":501,"s:1424:19:1424:Infinity":502,"b:1425:2:1433:Infinity:undefined:undefined:undefined:undefined":213,"s:1425:2:1433:Infinity":503,"s:1426:30:1426:Infinity":504,"s:1427:3:1430:Infinity":505,"s:1431:3:1431:Infinity":506,"s:1432:3:1432:Infinity":507,"b:1435:2:1435:Infinity:undefined:undefined:undefined:undefined":214,"s:1435:2:1435:Infinity":508,"s:1435:19:1435:Infinity":509,"s:1439:33:1443:Infinity":510,"b:1444:1:1444:Infinity:undefined:undefined:undefined:undefined":215,"s:1444:1:1444:Infinity":511,"s:1444:30:1444:Infinity":512,"s:1446:1:1446:Infinity":513,"s:1447:1:1451:Infinity":514,"s:1452:1:1456:Infinity":515,"s:1457:1:1457:Infinity":516,"f:1468:9:1468:27":68,"s:1469:11:1469:Infinity":517,"s:1470:16:1470:Infinity":518,"b:1471:1:1471:Infinity:undefined:undefined:undefined:undefined":216,"s:1471:1:1471:Infinity":519,"s:1471:21:1471:Infinity":520,"b:1472:1:1472:Infinity:undefined:undefined:undefined:undefined":217,"s:1472:1:1472:Infinity":521,"s:1472:23:1472:Infinity":522,"b:1473:1:1473:Infinity:undefined:undefined:undefined:undefined":218,"s:1473:1:1473:Infinity":523,"s:1473:16:1473:Infinity":524,"b:1474:1:1474:Infinity:undefined:undefined:undefined:undefined":219,"s:1474:1:1474:Infinity":525,"s:1474:17:1474:Infinity":526,"s:1475:1:1475:Infinity":527,"b:1475:24:1475:45:1475:45:1475:Infinity":220,"f:1478:9:1478:Infinity":69,"b:1481:23:1481:Infinity":221,"s:1483:16:1483:Infinity":528,"b:1483:30:1483:54:1483:54:1483:Infinity":222,"s:1484:1:1486:Infinity":529,"s:1487:15:1487:Infinity":530,"b:1488:1:1490:Infinity:undefined:undefined:undefined:undefined":223,"s:1488:1:1490:Infinity":531,"s:1489:2:1489:Infinity":532,"f:1493:15:1493:Infinity":70,"b:1497:17:1497:Infinity":224,"s:1500:13:1500:Infinity":533,"s:1501:16:1501:Infinity":534,"b:1501:16:1501:34:1501:34:1501:Infinity":225,"s:1502:7:1502:Infinity":535,"s:1504:13:1504:Infinity":536,"s:1505:14:1505:Infinity":537,"s:1507:1:1509:Infinity":538,"s:1511:21:1516:Infinity":539,"f:1511:21:1511:22":71,"b:1512:2:1512:Infinity:undefined:undefined:undefined:undefined":226,"s:1512:2:1512:Infinity":540,"s:1512:13:1512:Infinity":541,"b:1513:2:1515:Infinity:undefined:undefined:undefined:undefined":227,"s:1513:2:1515:Infinity":542,"s:1514:3:1514:Infinity":543,"s:1518:19:1518:Infinity":544,"s:1519:1:1523:Infinity":545,"f:1519:24:1519:30":72,"b:1520:2:1520:Infinity:undefined:undefined:undefined:undefined":228,"s:1520:2:1520:Infinity":546,"s:1520:20:1520:Infinity":547,"s:1521:2:1521:Infinity":548,"s:1522:2:1522:Infinity":549,"s:1525:18:1525:Infinity":550,"s:1526:1:1557:Infinity":551,"b:1526:8:1526:23:1526:23:1526:51":229,"s:1527:2:1553:Infinity":552,"s:1528:20:1532:Infinity":553,"s:1534:27:1540:Infinity":554,"f:1535:12:1535:13":73,"s:1535:36:1535:61":555,"f:1536:10:1536:11":74,"s:1537:16:1537:Infinity":556,"b:1537:16:1537:44:1537:44:1537:Infinity":230,"s:1538:16:1538:Infinity":557,"b:1538:16:1538:44:1538:44:1538:Infinity":231,"s:1539:5:1539:Infinity":558,"s:1542:3:1550:Infinity":559,"b:1543:4:1543:Infinity:undefined:undefined:undefined:undefined":232,"s:1543:4:1543:Infinity":560,"s:1543:25:1543:Infinity":561,"s:1544:4:1544:Infinity":562,"s:1545:17:1545:Infinity":563,"b:1545:17:1545:49:1545:49:1545:Infinity":233,"s:1546:20:1546:Infinity":564,"b:1546:20:1546:30:1546:30:1546:Infinity":234,"s:1547:4:1547:Infinity":565,"b:1547:54:1547:64:1547:64:1547:66":235,"s:1548:4:1548:Infinity":566,"s:1549:4:1549:Infinity":567,"s:1552:3:1552:Infinity":568,"s:1555:2:1555:Infinity":569,"s:1556:2:1556:Infinity":570,"f:1560:15:1560:Infinity":75,"b:1562:19:1562:Infinity":236,"b:1563:13:1563:Infinity":237,"b:1564:44:1564:Infinity":238,"s:1567:18:1598:Infinity":571,"f:1569:13:1569:20":76,"s:1570:14:1572:Infinity":572,"b:1571:6:1571:Infinity:1571:42:1572:Infinity":239,"s:1573:3:1573:Infinity":573,"s:1575:21:1585:Infinity":574,"b:1586:3:1586:Infinity:undefined:undefined:undefined:undefined":240,"s:1586:3:1586:Infinity":575,"s:1586:19:1586:Infinity":576,"s:1587:3:1596:Infinity":577,"s:1588:4:1588:Infinity":578,"b:1589:4:1591:Infinity:undefined:undefined:undefined:undefined":241,"s:1589:4:1591:Infinity":579,"s:1590:5:1590:Infinity":580,"s:1593:4:1595:Infinity":581,"s:1600:1:1604:Infinity":582,"s:1605:1:1610:Infinity":583,"f:1605:22:1605:28":77,"s:1606:2:1609:Infinity":584,"f:1606:32:1606:38":78,"s:1607:3:1607:Infinity":585,"s:1608:3:1608:Infinity":586,"b:1612:1:1614:Infinity:undefined:undefined:undefined:undefined":242,"s:1612:1:1614:Infinity":587,"s:1613:2:1613:Infinity":588,"f:1617:15:1617:Infinity":79,"b:1626:35:1626:Infinity":243,"b:1627:23:1627:Infinity":244,"s:1629:1:1629:Infinity":589,"s:1630:21:1630:Infinity":590,"s:1631:21:1631:Infinity":591,"b:1633:1:1635:Infinity:undefined:undefined:undefined:undefined":245,"s:1633:1:1635:Infinity":592,"b:1633:5:1633:34:1633:34:1633:51":246,"s:1634:2:1634:Infinity":593,"b:1636:1:1638:Infinity:undefined:undefined:undefined:undefined":247,"s:1636:1:1638:Infinity":594,"b:1636:5:1636:34:1636:34:1636:52":248,"s:1637:2:1637:Infinity":595,"b:1640:1:1646:Infinity:undefined:undefined:undefined:undefined":249,"s:1640:1:1646:Infinity":596,"b:1641:2:1643:Infinity:undefined:undefined:undefined:undefined":250,"s:1641:2:1643:Infinity":597,"s:1642:3:1642:Infinity":598,"s:1644:2:1644:Infinity":599,"s:1645:2:1645:Infinity":600,"s:1648:16:1648:Infinity":601,"b:1649:1:1649:Infinity:undefined:undefined:undefined:undefined":251,"s:1649:1:1649:Infinity":602,"s:1649:14:1649:Infinity":603,"b:1650:1:1650:Infinity:undefined:undefined:undefined:undefined":252,"s:1650:1:1650:Infinity":604,"s:1650:24:1650:Infinity":605,"s:1651:1:1656:Infinity":606,"f:1659:15:1659:Infinity":80,"b:1662:35:1662:Infinity":253,"b:1663:23:1663:Infinity":254,"s:1665:15:1665:Infinity":607,"s:1666:25:1666:Infinity":608,"b:1667:1:1669:Infinity:undefined:undefined:undefined:undefined":255,"s:1667:1:1669:Infinity":609,"b:1667:5:1667:28:1667:28:1667:42:1667:42:1667:55":256,"s:1668:2:1668:Infinity":610,"b:1670:1:1672:Infinity:undefined:undefined:undefined:undefined":257,"s:1670:1:1672:Infinity":611,"b:1670:5:1670:38:1670:38:1670:60":258,"s:1671:2:1671:Infinity":612,"s:1674:18:1674:Infinity":613,"b:1675:1:1678:Infinity:undefined:undefined:undefined:undefined":259,"s:1675:1:1678:Infinity":614,"s:1676:2:1676:Infinity":615,"s:1677:2:1677:Infinity":616,"b:1679:1:1682:Infinity:undefined:undefined:undefined:undefined":260,"s:1679:1:1682:Infinity":617,"s:1680:2:1680:Infinity":618,"s:1681:2:1681:Infinity":619,"s:1683:1:1685:Infinity":620,"s:1684:2:1684:Infinity":621,"f:1688:15:1688:Infinity":81,"b:1696:35:1696:Infinity":261,"b:1697:23:1697:Infinity":262,"s:1699:14:1699:Infinity":622,"b:1700:1:1702:Infinity:undefined:undefined:undefined:undefined":263,"s:1700:1:1702:Infinity":623,"b:1700:5:1700:27:1700:27:1700:40:1700:40:1700:55":264,"s:1701:2:1701:Infinity":624,"s:1703:1:1703:Infinity":625,"s:1705:16:1710:Infinity":626,"s:1711:1:1711:Infinity":627,"f:1714:15:1714:Infinity":82,"b:1722:35:1722:Infinity":265,"b:1723:23:1723:Infinity":266,"s:1725:14:1725:Infinity":628,"b:1726:1:1728:Infinity:undefined:undefined:undefined:undefined":267,"s:1726:1:1728:Infinity":629,"b:1726:5:1726:27:1726:27:1726:40:1726:40:1726:55":268,"s:1727:2:1727:Infinity":630,"s:1730:1:1730:Infinity":631,"s:1733:13:1733:Infinity":632,"s:1734:1:1734:Infinity":633,"s:1737:1:1737:Infinity":634,"s:1738:14:1738:Infinity":635,"s:1739:19:1739:Infinity":636,"s:1740:1:1740:Infinity":637,"s:1743:16:1748:Infinity":638,"s:1751:16:1751:Infinity":639,"s:1752:19:1756:Infinity":640,"s:1757:1:1757:Infinity":641,"s:1759:1:1761:Infinity":642,"s:1762:1:1762:Infinity":643,"f:1777:9:1777:21":83,"s:1778:14:1778:Infinity":644,"s:1779:34:1779:Infinity":645,"s:1780:1:1784:Infinity":646,"b:1781:2:1781:Infinity:undefined:undefined:undefined:undefined":269,"s:1781:2:1781:Infinity":647,"s:1781:23:1781:Infinity":648,"s:1782:2:1782:Infinity":649,"s:1783:2:1783:Infinity":650,"s:1785:1:1785:Infinity":651,"f:1788:9:1788:24":84,"s:1789:1:1793:Infinity":652,"f:1789:27:1789:28":85,"s:1790:13:1790:Infinity":653,"b:1790:13:1790:41:1790:41:1790:Infinity":270,"s:1791:13:1791:Infinity":654,"b:1791:13:1791:41:1791:41:1791:Infinity":271,"s:1792:2:1792:Infinity":655,"f:1796:9:1796:27":86,"s:1797:12:1797:Infinity":656,"b:1797:12:1797:44:1797:44:1797:Infinity":272,"s:1799:2:1803:Infinity":657,"b:1800:5:1800:Infinity:1801:5:1803:Infinity":273,"b:1802:6:1802:Infinity:1803:6:1803:Infinity":274,"b:1801:5:1801:39:1801:39:1801:Infinity":275,"s:1804:16:1804:Infinity":658,"b:1804:16:1804:28:1804:28:1804:Infinity":276,"s:1806:2:1808:Infinity":659,"b:1807:5:1807:Infinity:1808:5:1808:Infinity":277,"b:1807:46:1807:71:1807:71:1807:73":278,"s:1809:7:1809:Infinity":660,"b:1809:15:1809:25:1809:25:1809:29":279,"s:1811:2:1811:Infinity":661,"b:1811:22:1811:49:1811:49:1811:Infinity":280,"b:1811:49:1811:57:1811:57:1811:Infinity":281,"s:1812:1:1812:Infinity":662,"b:1812:25:1812:35:1812:35:1812:38":282,"b:1812:45:1812:53:1812:53:1812:56":283,"f:1815:15:1815:Infinity":87,"s:1820:13:1820:Infinity":663,"s:1821:16:1821:Infinity":664,"b:1821:16:1821:34:1821:34:1821:Infinity":284,"s:1822:7:1822:Infinity":665,"s:1823:15:1823:Infinity":666,"s:1826:20:1826:Infinity":667,"s:1827:17:1831:Infinity":668,"s:1832:18:1836:Infinity":669,"s:1838:18:1850:Infinity":670,"f:1839:32:1839:33":88,"s:1839:40:1849:4":671,"b:1841:11:1841:23:1841:23:1841:Infinity":285,"b:1842:14:1842:29:1842:29:1842:Infinity":286,"b:1847:14:1847:29:1847:29:1847:Infinity":287,"b:1848:17:1848:35:1848:35:1848:Infinity":288,"s:1852:1:1852:Infinity":672,"s:1855:0:1858:Infinity":673,"s:1860:0:1872:Infinity":674,"f:1864:9:1864:16":89,"s:1865:2:1865:Infinity":675,"s:1866:2:1871:Infinity":676,"s:1867:3:1867:Infinity":677,"s:1869:3:1869:Infinity":678,"s:1870:3:1870:Infinity":679,"s:1874:0:1901:Infinity":680,"f:1893:9:1893:16":90,"s:1894:15:1894:Infinity":681,"s:1895:2:1900:Infinity":682,"s:1896:3:1896:Infinity":683,"s:1898:3:1898:Infinity":684,"s:1899:3:1899:Infinity":685,"s:1903:0:1929:Infinity":686,"f:1915:9:1915:16":91,"s:1916:26:1916:Infinity":687,"s:1917:26:1917:Infinity":688,"b:1919:2:1922:Infinity:undefined:undefined:undefined:undefined":289,"s:1919:2:1922:Infinity":689,"b:1919:6:1919:39:1919:39:1919:61":290,"s:1920:3:1920:Infinity":690,"s:1921:3:1921:Infinity":691,"b:1923:2:1926:Infinity:undefined:undefined:undefined:undefined":291,"s:1923:2:1926:Infinity":692,"b:1923:6:1923:39:1923:39:1923:60":292,"s:1924:3:1924:Infinity":693,"s:1925:3:1925:Infinity":694,"s:1928:2:1928:Infinity":695,"s:1931:0:1946:Infinity":696,"f:1943:9:1943:16":92,"s:1944:2:1944:Infinity":697,"s:1945:2:1945:Infinity":698,"s:1948:0:1970:Infinity":699,"f:1962:9:1962:16":93,"s:1963:15:1963:Infinity":700,"s:1964:2:1969:Infinity":701,"s:1965:3:1965:Infinity":702,"s:1967:3:1967:Infinity":703,"s:1968:3:1968:Infinity":704,"s:1972:0:2000:Infinity":705,"f:1985:9:1985:16":94,"s:1986:2:1986:Infinity":706,"s:1987:26:1987:Infinity":707,"s:1988:26:1988:Infinity":708,"b:1990:2:1993:Infinity:undefined:undefined:undefined:undefined":293,"s:1990:2:1993:Infinity":709,"b:1990:6:1990:39:1990:39:1990:61":294,"s:1991:3:1991:Infinity":710,"s:1992:3:1992:Infinity":711,"b:1994:2:1997:Infinity:undefined:undefined:undefined:undefined":295,"s:1994:2:1997:Infinity":712,"b:1994:6:1994:39:1994:39:1994:60":296,"s:1995:3:1995:Infinity":713,"s:1996:3:1996:Infinity":714,"s:1999:2:1999:Infinity":715,"s:2002:0:2042:Infinity":716,"f:2025:9:2025:16":95,"s:2026:2:2026:Infinity":717,"s:2027:2:2027:Infinity":718,"s:2028:15:2028:Infinity":719,"s:2029:2:2041:Infinity":720,"s:2030:18:2030:Infinity":721,"s:2031:3:2036:Infinity":722,"f:2031:24:2031:30":96,"s:2032:4:2035:Infinity":723,"f:2032:17:2032:23":97,"s:2033:5:2033:Infinity":724,"s:2034:5:2034:Infinity":725,"s:2037:3:2037:Infinity":726,"s:2039:3:2039:Infinity":727,"s:2040:3:2040:Infinity":728,"s:2044:0:2071:Infinity":729,"f:2054:9:2054:16":98,"s:2055:2:2055:Infinity":730,"s:2056:2:2056:Infinity":731,"s:2057:15:2057:Infinity":732,"s:2058:2:2070:Infinity":733,"s:2059:22:2059:Infinity":734,"s:2060:3:2065:Infinity":735,"f:2060:24:2060:30":99,"s:2061:4:2064:Infinity":736,"f:2061:17:2061:23":100,"s:2062:5:2062:Infinity":737,"s:2063:5:2063:Infinity":738,"s:2066:3:2066:Infinity":739,"s:2068:3:2068:Infinity":740,"s:2069:3:2069:Infinity":741,"s:2126:1:2126:Infinity":742,"b:2126:1:2126:20:2126:15:2126:Infinity":297,"b:2128:0:2130:Infinity:undefined:undefined:undefined:undefined":298,"s:2128:0:2130:Infinity":743,"s:2129:1:2129:Infinity":744}}} +,"/Users/steipete/Projects/warelay/src/provider-web.ts": {"path":"/Users/steipete/Projects/warelay/src/provider-web.ts","statementMap":{"0":{"start":{"line":17,"column":24},"end":{"line":17,"column":null}},"1":{"start":{"line":20,"column":1},"end":{"line":20,"column":null}},"2":{"start":{"line":21,"column":30},"end":{"line":21,"column":null}},"3":{"start":{"line":22,"column":21},"end":{"line":22,"column":null}},"4":{"start":{"line":23,"column":7},"end":{"line":23,"column":null}},"5":{"start":{"line":24,"column":7},"end":{"line":35,"column":null}},"6":{"start":{"line":37,"column":1},"end":{"line":37,"column":null}},"7":{"start":{"line":38,"column":1},"end":{"line":58,"column":null}},"8":{"start":{"line":41,"column":46},"end":{"line":41,"column":null}},"9":{"start":{"line":42,"column":3},"end":{"line":45,"column":null}},"10":{"start":{"line":43,"column":4},"end":{"line":43,"column":null}},"11":{"start":{"line":44,"column":4},"end":{"line":44,"column":null}},"12":{"start":{"line":46,"column":3},"end":{"line":53,"column":null}},"13":{"start":{"line":47,"column":19},"end":{"line":47,"column":null}},"14":{"start":{"line":48,"column":4},"end":{"line":52,"column":null}},"15":{"start":{"line":49,"column":5},"end":{"line":51,"column":null}},"16":{"start":{"line":54,"column":3},"end":{"line":56,"column":null}},"17":{"start":{"line":55,"column":4},"end":{"line":55,"column":null}},"18":{"start":{"line":60,"column":1},"end":{"line":60,"column":null}},"19":{"start":{"line":64,"column":1},"end":{"line":83,"column":null}},"20":{"start":{"line":68,"column":20},"end":{"line":68,"column":null}},"21":{"start":{"line":70,"column":18},"end":{"line":80,"column":null}},"22":{"start":{"line":71,"column":19},"end":{"line":71,"column":null}},"23":{"start":{"line":72,"column":3},"end":{"line":75,"column":null}},"24":{"start":{"line":73,"column":4},"end":{"line":73,"column":null}},"25":{"start":{"line":74,"column":4},"end":{"line":74,"column":null}},"26":{"start":{"line":76,"column":3},"end":{"line":79,"column":null}},"27":{"start":{"line":77,"column":4},"end":{"line":77,"column":null}},"28":{"start":{"line":78,"column":4},"end":{"line":78,"column":null}},"29":{"start":{"line":82,"column":2},"end":{"line":82,"column":null}},"30":{"start":{"line":91,"column":14},"end":{"line":91,"column":null}},"31":{"start":{"line":92,"column":1},"end":{"line":109,"column":null}},"32":{"start":{"line":93,"column":2},"end":{"line":93,"column":null}},"33":{"start":{"line":94,"column":8},"end":{"line":94,"column":null}},"34":{"start":{"line":95,"column":2},"end":{"line":99,"column":null}},"35":{"start":{"line":96,"column":3},"end":{"line":96,"column":null}},"36":{"start":{"line":98,"column":3},"end":{"line":98,"column":null}},"37":{"start":{"line":100,"column":17},"end":{"line":100,"column":null}},"38":{"start":{"line":101,"column":20},"end":{"line":101,"column":null}},"39":{"start":{"line":102,"column":2},"end":{"line":102,"column":null}},"40":{"start":{"line":104,"column":2},"end":{"line":108,"column":null}},"41":{"start":{"line":105,"column":3},"end":{"line":105,"column":null}},"42":{"start":{"line":107,"column":3},"end":{"line":107,"column":null}},"43":{"start":{"line":116,"column":14},"end":{"line":116,"column":null}},"44":{"start":{"line":117,"column":1},"end":{"line":117,"column":null}},"45":{"start":{"line":118,"column":1},"end":{"line":158,"column":null}},"46":{"start":{"line":119,"column":2},"end":{"line":119,"column":null}},"47":{"start":{"line":120,"column":2},"end":{"line":120,"column":null}},"48":{"start":{"line":123,"column":4},"end":{"line":125,"column":null}},"49":{"start":{"line":126,"column":2},"end":{"line":133,"column":null}},"50":{"start":{"line":127,"column":3},"end":{"line":131,"column":null}},"51":{"start":{"line":132,"column":3},"end":{"line":132,"column":null}},"52":{"start":{"line":134,"column":2},"end":{"line":142,"column":null}},"53":{"start":{"line":135,"column":3},"end":{"line":135,"column":null}},"54":{"start":{"line":136,"column":3},"end":{"line":140,"column":null}},"55":{"start":{"line":141,"column":3},"end":{"line":141,"column":null}},"56":{"start":{"line":143,"column":20},"end":{"line":143,"column":null}},"57":{"start":{"line":144,"column":2},"end":{"line":148,"column":null}},"58":{"start":{"line":149,"column":2},"end":{"line":149,"column":null}},"59":{"start":{"line":151,"column":2},"end":{"line":157,"column":null}},"60":{"start":{"line":152,"column":3},"end":{"line":156,"column":null}},"61":{"start":{"line":153,"column":4},"end":{"line":153,"column":null}},"62":{"start":{"line":178,"column":14},"end":{"line":178,"column":null}},"63":{"start":{"line":179,"column":1},"end":{"line":179,"column":null}},"64":{"start":{"line":180,"column":17},"end":{"line":180,"column":null}},"65":{"start":{"line":181,"column":18},"end":{"line":181,"column":null}},"66":{"start":{"line":182,"column":14},"end":{"line":182,"column":null}},"67":{"start":{"line":184,"column":1},"end":{"line":230,"column":null}},"68":{"start":{"line":185,"column":2},"end":{"line":185,"column":null}},"69":{"start":{"line":185,"column":32},"end":{"line":185,"column":null}},"70":{"start":{"line":186,"column":2},"end":{"line":229,"column":null}},"71":{"start":{"line":187,"column":14},"end":{"line":187,"column":null}},"72":{"start":{"line":189,"column":3},"end":{"line":189,"column":null}},"73":{"start":{"line":189,"column":27},"end":{"line":189,"column":null}},"74":{"start":{"line":190,"column":3},"end":{"line":190,"column":null}},"75":{"start":{"line":190,"column":11},"end":{"line":190,"column":null}},"76":{"start":{"line":191,"column":3},"end":{"line":191,"column":null}},"77":{"start":{"line":191,"column":24},"end":{"line":191,"column":null}},"78":{"start":{"line":192,"column":21},"end":{"line":192,"column":null}},"79":{"start":{"line":193,"column":3},"end":{"line":193,"column":null}},"80":{"start":{"line":193,"column":19},"end":{"line":193,"column":null}},"81":{"start":{"line":195,"column":3},"end":{"line":196,"column":null}},"82":{"start":{"line":196,"column":4},"end":{"line":196,"column":null}},"83":{"start":{"line":197,"column":9},"end":{"line":197,"column":null}},"84":{"start":{"line":198,"column":3},"end":{"line":198,"column":null}},"85":{"start":{"line":198,"column":14},"end":{"line":198,"column":null}},"86":{"start":{"line":199,"column":16},"end":{"line":199,"column":null}},"87":{"start":{"line":200,"column":3},"end":{"line":200,"column":null}},"88":{"start":{"line":200,"column":14},"end":{"line":200,"column":null}},"89":{"start":{"line":201,"column":19},"end":{"line":201,"column":null}},"90":{"start":{"line":202,"column":25},"end":{"line":208,"column":null}},"91":{"start":{"line":203,"column":4},"end":{"line":207,"column":null}},"92":{"start":{"line":204,"column":5},"end":{"line":204,"column":null}},"93":{"start":{"line":206,"column":5},"end":{"line":206,"column":null}},"94":{"start":{"line":209,"column":17},"end":{"line":211,"column":null}},"95":{"start":{"line":210,"column":4},"end":{"line":210,"column":null}},"96":{"start":{"line":212,"column":21},"end":{"line":214,"column":null}},"97":{"start":{"line":215,"column":3},"end":{"line":228,"column":null}},"98":{"start":{"line":216,"column":4},"end":{"line":225,"column":null}},"99":{"start":{"line":227,"column":4},"end":{"line":227,"column":null}},"100":{"start":{"line":232,"column":1},"end":{"line":240,"column":null}},"101":{"start":{"line":234,"column":3},"end":{"line":238,"column":null}},"102":{"start":{"line":235,"column":4},"end":{"line":235,"column":null}},"103":{"start":{"line":237,"column":4},"end":{"line":237,"column":null}},"104":{"start":{"line":244,"column":1},"end":{"line":244,"column":null}},"105":{"start":{"line":244,"column":15},"end":{"line":244,"column":null}},"106":{"start":{"line":245,"column":1},"end":{"line":247,"column":null}},"107":{"start":{"line":246,"column":2},"end":{"line":246,"column":null}},"108":{"start":{"line":248,"column":18},"end":{"line":248,"column":null}},"109":{"start":{"line":249,"column":1},"end":{"line":249,"column":null}},"110":{"start":{"line":249,"column":23},"end":{"line":249,"column":null}},"111":{"start":{"line":250,"column":17},"end":{"line":250,"column":null}},"112":{"start":{"line":251,"column":1},"end":{"line":251,"column":null}},"113":{"start":{"line":251,"column":22},"end":{"line":251,"column":null}},"114":{"start":{"line":252,"column":1},"end":{"line":252,"column":null}},"115":{"start":{"line":256,"column":1},"end":{"line":258,"column":null}},"116":{"start":{"line":263,"column":1},"end":{"line":263,"column":null}},"117":{"start":{"line":263,"column":27},"end":{"line":263,"column":null}},"118":{"start":{"line":264,"column":1},"end":{"line":264,"column":null}},"119":{"start":{"line":264,"column":30},"end":{"line":264,"column":null}},"120":{"start":{"line":265,"column":16},"end":{"line":265,"column":null}},"121":{"start":{"line":266,"column":15},"end":{"line":266,"column":null}},"122":{"start":{"line":267,"column":1},"end":{"line":267,"column":null}},"123":{"start":{"line":267,"column":21},"end":{"line":267,"column":null}},"124":{"start":{"line":268,"column":1},"end":{"line":268,"column":null}}},"fnMap":{"0":{"name":"createWaSocket","decl":{"start":{"line":19,"column":22},"end":{"line":19,"column":37}},"loc":{"start":{"line":19,"column":73},"end":{"line":61,"column":null}},"line":19},"1":{"name":"(anonymous_1)","decl":{"start":{"line":40,"column":2},"end":{"line":40,"column":3}},"loc":{"start":{"line":40,"column":58},"end":{"line":57,"column":null}},"line":40},"2":{"name":"waitForWaConnection","decl":{"start":{"line":63,"column":22},"end":{"line":63,"column":42}},"loc":{"start":{"line":63,"column":81},"end":{"line":84,"column":null}},"line":63},"3":{"name":"(anonymous_3)","decl":{"start":{"line":64,"column":26},"end":{"line":64,"column":27}},"loc":{"start":{"line":64,"column":47},"end":{"line":83,"column":2}},"line":64},"4":{"name":"(anonymous_4)","decl":{"start":{"line":70,"column":18},"end":{"line":70,"column":22}},"loc":{"start":{"line":70,"column":42},"end":{"line":80,"column":null}},"line":70},"5":{"name":"sendMessageWeb","decl":{"start":{"line":86,"column":22},"end":{"line":86,"column":null}},"loc":{"start":{"line":90,"column":2},"end":{"line":110,"column":null}},"line":90},"6":{"name":"loginWeb","decl":{"start":{"line":112,"column":22},"end":{"line":112,"column":null}},"loc":{"start":{"line":115,"column":2},"end":{"line":159,"column":null}},"line":115},"7":{"name":"(anonymous_7)","decl":{"start":{"line":151,"column":13},"end":{"line":151,"column":19}},"loc":{"start":{"line":151,"column":19},"end":{"line":157,"column":5}},"line":151},"8":{"name":"monitorWebInbox","decl":{"start":{"line":174,"column":22},"end":{"line":174,"column":38}},"loc":{"start":{"line":177,"column":3},"end":{"line":241,"column":null}},"line":177},"9":{"name":"(anonymous_9)","decl":{"start":{"line":184,"column":31},"end":{"line":184,"column":38}},"loc":{"start":{"line":184,"column":49},"end":{"line":230,"column":2}},"line":184},"10":{"name":"(anonymous_10)","decl":{"start":{"line":202,"column":25},"end":{"line":202,"column":37}},"loc":{"start":{"line":202,"column":37},"end":{"line":208,"column":null}},"line":202},"11":{"name":"(anonymous_11)","decl":{"start":{"line":209,"column":17},"end":{"line":209,"column":24}},"loc":{"start":{"line":209,"column":41},"end":{"line":211,"column":null}},"line":209},"12":{"name":"(anonymous_12)","decl":{"start":{"line":233,"column":9},"end":{"line":233,"column":21}},"loc":{"start":{"line":233,"column":21},"end":{"line":239,"column":null}},"line":233},"13":{"name":"extractText","decl":{"start":{"line":243,"column":9},"end":{"line":243,"column":21}},"loc":{"start":{"line":243,"column":78},"end":{"line":253,"column":null}},"line":243},"14":{"name":"getStatusCode","decl":{"start":{"line":255,"column":9},"end":{"line":255,"column":23}},"loc":{"start":{"line":255,"column":37},"end":{"line":260,"column":null}},"line":255},"15":{"name":"formatError","decl":{"start":{"line":262,"column":9},"end":{"line":262,"column":21}},"loc":{"start":{"line":262,"column":43},"end":{"line":269,"column":null}},"line":262}},"branchMap":{"0":{"loc":{"start":{"line":23,"column":30},"end":{"line":23,"column":58}},"type":"cond-expr","locations":[{"start":{"line":23,"column":40},"end":{"line":23,"column":49}},{"start":{"line":23,"column":49},"end":{"line":23,"column":58}}],"line":23},"1":{"loc":{"start":{"line":42,"column":3},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":3},"end":{"line":45,"column":null}},{"start":{},"end":{}}],"line":42},"2":{"loc":{"start":{"line":42,"column":7},"end":{"line":42,"column":22}},"type":"binary-expr","locations":[{"start":{"line":42,"column":7},"end":{"line":42,"column":13}},{"start":{"line":42,"column":13},"end":{"line":42,"column":22}}],"line":42},"3":{"loc":{"start":{"line":46,"column":3},"end":{"line":53,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":3},"end":{"line":53,"column":null}},{"start":{},"end":{}}],"line":46},"4":{"loc":{"start":{"line":48,"column":4},"end":{"line":52,"column":null}},"type":"if","locations":[{"start":{"line":48,"column":4},"end":{"line":52,"column":null}},{"start":{},"end":{}}],"line":48},"5":{"loc":{"start":{"line":54,"column":3},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":54,"column":3},"end":{"line":56,"column":null}},{"start":{},"end":{}}],"line":54},"6":{"loc":{"start":{"line":54,"column":7},"end":{"line":54,"column":41}},"type":"binary-expr","locations":[{"start":{"line":54,"column":7},"end":{"line":54,"column":32}},{"start":{"line":54,"column":32},"end":{"line":54,"column":41}}],"line":54},"7":{"loc":{"start":{"line":71,"column":19},"end":{"line":71,"column":null}},"type":"binary-expr","locations":[{"start":{"line":71,"column":19},"end":{"line":71,"column":30}},{"start":{"line":71,"column":30},"end":{"line":71,"column":null}}],"line":71},"8":{"loc":{"start":{"line":72,"column":3},"end":{"line":75,"column":null}},"type":"if","locations":[{"start":{"line":72,"column":3},"end":{"line":75,"column":null}},{"start":{},"end":{}}],"line":72},"9":{"loc":{"start":{"line":76,"column":3},"end":{"line":79,"column":null}},"type":"if","locations":[{"start":{"line":76,"column":3},"end":{"line":79,"column":null}},{"start":{},"end":{}}],"line":76},"10":{"loc":{"start":{"line":78,"column":11},"end":{"line":78,"column":66}},"type":"binary-expr","locations":[{"start":{"line":78,"column":11},"end":{"line":78,"column":36}},{"start":{"line":78,"column":36},"end":{"line":78,"column":66}}],"line":78},"11":{"loc":{"start":{"line":101,"column":20},"end":{"line":101,"column":null}},"type":"binary-expr","locations":[{"start":{"line":101,"column":20},"end":{"line":101,"column":39}},{"start":{"line":101,"column":39},"end":{"line":101,"column":null}}],"line":101},"12":{"loc":{"start":{"line":114,"column":1},"end":{"line":114,"column":null}},"type":"default-arg","locations":[{"start":{"line":114,"column":49},"end":{"line":114,"column":null}}],"line":114},"13":{"loc":{"start":{"line":123,"column":4},"end":{"line":125,"column":null}},"type":"binary-expr","locations":[{"start":{"line":123,"column":4},"end":{"line":124,"column":null}},{"start":{"line":125,"column":4},"end":{"line":125,"column":null}}],"line":123},"14":{"loc":{"start":{"line":126,"column":2},"end":{"line":133,"column":null}},"type":"if","locations":[{"start":{"line":126,"column":2},"end":{"line":133,"column":null}},{"start":{},"end":{}}],"line":126},"15":{"loc":{"start":{"line":134,"column":2},"end":{"line":142,"column":null}},"type":"if","locations":[{"start":{"line":134,"column":2},"end":{"line":142,"column":null}},{"start":{},"end":{}}],"line":134},"16":{"loc":{"start":{"line":181,"column":18},"end":{"line":181,"column":null}},"type":"cond-expr","locations":[{"start":{"line":181,"column":18},"end":{"line":181,"column":49}},{"start":{"line":181,"column":49},"end":{"line":181,"column":null}}],"line":181},"17":{"loc":{"start":{"line":185,"column":2},"end":{"line":185,"column":null}},"type":"if","locations":[{"start":{"line":185,"column":2},"end":{"line":185,"column":null}},{"start":{},"end":{}}],"line":185},"18":{"loc":{"start":{"line":187,"column":14},"end":{"line":187,"column":null}},"type":"binary-expr","locations":[{"start":{"line":187,"column":14},"end":{"line":187,"column":29}},{"start":{"line":187,"column":29},"end":{"line":187,"column":null}}],"line":187},"19":{"loc":{"start":{"line":189,"column":3},"end":{"line":189,"column":null}},"type":"if","locations":[{"start":{"line":189,"column":3},"end":{"line":189,"column":null}},{"start":{},"end":{}}],"line":189},"20":{"loc":{"start":{"line":189,"column":7},"end":{"line":189,"column":27}},"type":"binary-expr","locations":[{"start":{"line":189,"column":7},"end":{"line":189,"column":13}},{"start":{"line":189,"column":13},"end":{"line":189,"column":27}}],"line":189},"21":{"loc":{"start":{"line":190,"column":3},"end":{"line":190,"column":null}},"type":"if","locations":[{"start":{"line":190,"column":3},"end":{"line":190,"column":null}},{"start":{},"end":{}}],"line":190},"22":{"loc":{"start":{"line":191,"column":3},"end":{"line":191,"column":null}},"type":"if","locations":[{"start":{"line":191,"column":3},"end":{"line":191,"column":null}},{"start":{},"end":{}}],"line":191},"23":{"loc":{"start":{"line":193,"column":3},"end":{"line":193,"column":null}},"type":"if","locations":[{"start":{"line":193,"column":3},"end":{"line":193,"column":null}},{"start":{},"end":{}}],"line":193},"24":{"loc":{"start":{"line":195,"column":3},"end":{"line":196,"column":null}},"type":"if","locations":[{"start":{"line":195,"column":3},"end":{"line":196,"column":null}},{"start":{},"end":{}}],"line":195},"25":{"loc":{"start":{"line":195,"column":7},"end":{"line":195,"column":null}},"type":"binary-expr","locations":[{"start":{"line":195,"column":7},"end":{"line":195,"column":40}},{"start":{"line":195,"column":40},"end":{"line":195,"column":null}}],"line":195},"26":{"loc":{"start":{"line":198,"column":3},"end":{"line":198,"column":null}},"type":"if","locations":[{"start":{"line":198,"column":3},"end":{"line":198,"column":null}},{"start":{},"end":{}}],"line":198},"27":{"loc":{"start":{"line":200,"column":3},"end":{"line":200,"column":null}},"type":"if","locations":[{"start":{"line":200,"column":3},"end":{"line":200,"column":null}},{"start":{},"end":{}}],"line":200},"28":{"loc":{"start":{"line":212,"column":21},"end":{"line":214,"column":null}},"type":"cond-expr","locations":[{"start":{"line":213,"column":6},"end":{"line":213,"column":null}},{"start":{"line":214,"column":6},"end":{"line":214,"column":null}}],"line":212},"29":{"loc":{"start":{"line":219,"column":9},"end":{"line":219,"column":null}},"type":"binary-expr","locations":[{"start":{"line":219,"column":9},"end":{"line":219,"column":21}},{"start":{"line":219,"column":21},"end":{"line":219,"column":null}}],"line":219},"30":{"loc":{"start":{"line":221,"column":15},"end":{"line":221,"column":null}},"type":"binary-expr","locations":[{"start":{"line":221,"column":15},"end":{"line":221,"column":31}},{"start":{"line":221,"column":31},"end":{"line":221,"column":null}}],"line":221},"31":{"loc":{"start":{"line":244,"column":1},"end":{"line":244,"column":null}},"type":"if","locations":[{"start":{"line":244,"column":1},"end":{"line":244,"column":null}},{"start":{},"end":{}}],"line":244},"32":{"loc":{"start":{"line":245,"column":1},"end":{"line":247,"column":null}},"type":"if","locations":[{"start":{"line":245,"column":1},"end":{"line":247,"column":null}},{"start":{},"end":{}}],"line":245},"33":{"loc":{"start":{"line":245,"column":5},"end":{"line":245,"column":78}},"type":"binary-expr","locations":[{"start":{"line":245,"column":5},"end":{"line":245,"column":49}},{"start":{"line":245,"column":49},"end":{"line":245,"column":78}}],"line":245},"34":{"loc":{"start":{"line":249,"column":1},"end":{"line":249,"column":null}},"type":"if","locations":[{"start":{"line":249,"column":1},"end":{"line":249,"column":null}},{"start":{},"end":{}}],"line":249},"35":{"loc":{"start":{"line":250,"column":17},"end":{"line":250,"column":null}},"type":"binary-expr","locations":[{"start":{"line":250,"column":17},"end":{"line":250,"column":50}},{"start":{"line":250,"column":50},"end":{"line":250,"column":null}}],"line":250},"36":{"loc":{"start":{"line":251,"column":1},"end":{"line":251,"column":null}},"type":"if","locations":[{"start":{"line":251,"column":1},"end":{"line":251,"column":null}},{"start":{},"end":{}}],"line":251},"37":{"loc":{"start":{"line":257,"column":3},"end":{"line":258,"column":null}},"type":"binary-expr","locations":[{"start":{"line":257,"column":3},"end":{"line":257,"column":null}},{"start":{"line":258,"column":3},"end":{"line":258,"column":null}}],"line":257},"38":{"loc":{"start":{"line":263,"column":1},"end":{"line":263,"column":null}},"type":"if","locations":[{"start":{"line":263,"column":1},"end":{"line":263,"column":null}},{"start":{},"end":{}}],"line":263},"39":{"loc":{"start":{"line":264,"column":1},"end":{"line":264,"column":null}},"type":"if","locations":[{"start":{"line":264,"column":1},"end":{"line":264,"column":null}},{"start":{},"end":{}}],"line":264},"40":{"loc":{"start":{"line":267,"column":1},"end":{"line":267,"column":null}},"type":"if","locations":[{"start":{"line":267,"column":1},"end":{"line":267,"column":null}},{"start":{},"end":{}}],"line":267},"41":{"loc":{"start":{"line":267,"column":5},"end":{"line":267,"column":21}},"type":"binary-expr","locations":[{"start":{"line":267,"column":5},"end":{"line":267,"column":15}},{"start":{"line":267,"column":15},"end":{"line":267,"column":21}}],"line":267},"42":{"loc":{"start":{"line":267,"column":38},"end":{"line":267,"column":57}},"type":"binary-expr","locations":[{"start":{"line":267,"column":38},"end":{"line":267,"column":48}},{"start":{"line":267,"column":48},"end":{"line":267,"column":57}}],"line":267},"43":{"loc":{"start":{"line":267,"column":66},"end":{"line":267,"column":83}},"type":"binary-expr","locations":[{"start":{"line":267,"column":66},"end":{"line":267,"column":74}},{"start":{"line":267,"column":74},"end":{"line":267,"column":83}}],"line":267}},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":4,"8":3,"9":3,"10":0,"11":0,"12":3,"13":0,"14":0,"15":0,"16":3,"17":0,"18":4,"19":4,"20":4,"21":4,"22":4,"23":4,"24":3,"25":3,"26":4,"27":1,"28":1,"29":4,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":0,"37":1,"38":1,"39":1,"40":1,"41":1,"42":0,"43":1,"44":1,"45":1,"46":1,"47":1,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":0,"70":1,"71":1,"72":1,"73":0,"74":1,"75":1,"76":1,"77":0,"78":1,"79":1,"80":0,"81":1,"82":0,"83":1,"84":1,"85":0,"86":1,"87":1,"88":0,"89":1,"90":1,"91":1,"92":1,"93":0,"94":1,"95":1,"96":1,"97":1,"98":1,"99":0,"100":1,"101":1,"102":1,"103":0,"104":1,"105":0,"106":1,"107":1,"108":0,"109":1,"110":0,"111":0,"112":1,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0},"f":{"0":4,"1":3,"2":4,"3":4,"4":4,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":0,"15":0},"b":{"0":[0,4],"1":[0,3],"2":[3,0],"3":[0,3],"4":[0,0],"5":[0,3],"6":[3,3],"7":[4,0],"8":[3,1],"9":[1,3],"10":[1,0],"11":[1,0],"12":[1],"13":[0,0],"14":[0,0],"15":[0,0],"16":[1,0],"17":[0,1],"18":[1,0],"19":[0,1],"20":[1,1],"21":[1,0],"22":[0,1],"23":[0,1],"24":[0,1],"25":[1,1],"26":[0,1],"27":[0,1],"28":[1,0],"29":[1,0],"30":[1,0],"31":[0,1],"32":[1,0],"33":[1,1],"34":[0,1],"35":[0,0],"36":[0,1],"37":[0,0],"38":[0,0],"39":[0,0],"40":[0,0],"41":[0,0],"42":[0,0],"43":[0,0]},"meta":{"lastBranch":44,"lastFunction":16,"lastStatement":125,"seen":{"s:17:24:17:Infinity":0,"f:19:22:19:37":0,"s:20:1:20:Infinity":1,"s:21:30:21:Infinity":2,"s:22:21:22:Infinity":3,"s:23:7:23:Infinity":4,"b:23:40:23:49:23:49:23:58":0,"s:24:7:35:Infinity":5,"s:37:1:37:Infinity":6,"s:38:1:58:Infinity":7,"f:40:2:40:3":1,"s:41:46:41:Infinity":8,"b:42:3:45:Infinity:undefined:undefined:undefined:undefined":1,"s:42:3:45:Infinity":9,"b:42:7:42:13:42:13:42:22":2,"s:43:4:43:Infinity":10,"s:44:4:44:Infinity":11,"b:46:3:53:Infinity:undefined:undefined:undefined:undefined":3,"s:46:3:53:Infinity":12,"s:47:19:47:Infinity":13,"b:48:4:52:Infinity:undefined:undefined:undefined:undefined":4,"s:48:4:52:Infinity":14,"s:49:5:51:Infinity":15,"b:54:3:56:Infinity:undefined:undefined:undefined:undefined":5,"s:54:3:56:Infinity":16,"b:54:7:54:32:54:32:54:41":6,"s:55:4:55:Infinity":17,"s:60:1:60:Infinity":18,"f:63:22:63:42":2,"s:64:1:83:Infinity":19,"f:64:26:64:27":3,"s:68:20:68:Infinity":20,"s:70:18:80:Infinity":21,"f:70:18:70:22":4,"s:71:19:71:Infinity":22,"b:71:19:71:30:71:30:71:Infinity":7,"b:72:3:75:Infinity:undefined:undefined:undefined:undefined":8,"s:72:3:75:Infinity":23,"s:73:4:73:Infinity":24,"s:74:4:74:Infinity":25,"b:76:3:79:Infinity:undefined:undefined:undefined:undefined":9,"s:76:3:79:Infinity":26,"s:77:4:77:Infinity":27,"s:78:4:78:Infinity":28,"b:78:11:78:36:78:36:78:66":10,"s:82:2:82:Infinity":29,"f:86:22:86:Infinity":5,"s:91:14:91:Infinity":30,"s:92:1:109:Infinity":31,"s:93:2:93:Infinity":32,"s:94:8:94:Infinity":33,"s:95:2:99:Infinity":34,"s:96:3:96:Infinity":35,"s:98:3:98:Infinity":36,"s:100:17:100:Infinity":37,"s:101:20:101:Infinity":38,"b:101:20:101:39:101:39:101:Infinity":11,"s:102:2:102:Infinity":39,"s:104:2:108:Infinity":40,"s:105:3:105:Infinity":41,"s:107:3:107:Infinity":42,"f:112:22:112:Infinity":6,"b:114:49:114:Infinity":12,"s:116:14:116:Infinity":43,"s:117:1:117:Infinity":44,"s:118:1:158:Infinity":45,"s:119:2:119:Infinity":46,"s:120:2:120:Infinity":47,"s:123:4:125:Infinity":48,"b:123:4:124:Infinity:125:4:125:Infinity":13,"b:126:2:133:Infinity:undefined:undefined:undefined:undefined":14,"s:126:2:133:Infinity":49,"s:127:3:131:Infinity":50,"s:132:3:132:Infinity":51,"b:134:2:142:Infinity:undefined:undefined:undefined:undefined":15,"s:134:2:142:Infinity":52,"s:135:3:135:Infinity":53,"s:136:3:140:Infinity":54,"s:141:3:141:Infinity":55,"s:143:20:143:Infinity":56,"s:144:2:148:Infinity":57,"s:149:2:149:Infinity":58,"s:151:2:157:Infinity":59,"f:151:13:151:19":7,"s:152:3:156:Infinity":60,"s:153:4:153:Infinity":61,"f:174:22:174:38":8,"s:178:14:178:Infinity":62,"s:179:1:179:Infinity":63,"s:180:17:180:Infinity":64,"s:181:18:181:Infinity":65,"b:181:18:181:49:181:49:181:Infinity":16,"s:182:14:182:Infinity":66,"s:184:1:230:Infinity":67,"f:184:31:184:38":9,"b:185:2:185:Infinity:undefined:undefined:undefined:undefined":17,"s:185:2:185:Infinity":68,"s:185:32:185:Infinity":69,"s:186:2:229:Infinity":70,"s:187:14:187:Infinity":71,"b:187:14:187:29:187:29:187:Infinity":18,"b:189:3:189:Infinity:undefined:undefined:undefined:undefined":19,"s:189:3:189:Infinity":72,"b:189:7:189:13:189:13:189:27":20,"s:189:27:189:Infinity":73,"b:190:3:190:Infinity:undefined:undefined:undefined:undefined":21,"s:190:3:190:Infinity":74,"s:190:11:190:Infinity":75,"b:191:3:191:Infinity:undefined:undefined:undefined:undefined":22,"s:191:3:191:Infinity":76,"s:191:24:191:Infinity":77,"s:192:21:192:Infinity":78,"b:193:3:193:Infinity:undefined:undefined:undefined:undefined":23,"s:193:3:193:Infinity":79,"s:193:19:193:Infinity":80,"b:195:3:196:Infinity:undefined:undefined:undefined:undefined":24,"s:195:3:196:Infinity":81,"b:195:7:195:40:195:40:195:Infinity":25,"s:196:4:196:Infinity":82,"s:197:9:197:Infinity":83,"b:198:3:198:Infinity:undefined:undefined:undefined:undefined":26,"s:198:3:198:Infinity":84,"s:198:14:198:Infinity":85,"s:199:16:199:Infinity":86,"b:200:3:200:Infinity:undefined:undefined:undefined:undefined":27,"s:200:3:200:Infinity":87,"s:200:14:200:Infinity":88,"s:201:19:201:Infinity":89,"s:202:25:208:Infinity":90,"f:202:25:202:37":10,"s:203:4:207:Infinity":91,"s:204:5:204:Infinity":92,"s:206:5:206:Infinity":93,"s:209:17:211:Infinity":94,"f:209:17:209:24":11,"s:210:4:210:Infinity":95,"s:212:21:214:Infinity":96,"b:213:6:213:Infinity:214:6:214:Infinity":28,"s:215:3:228:Infinity":97,"s:216:4:225:Infinity":98,"b:219:9:219:21:219:21:219:Infinity":29,"b:221:15:221:31:221:31:221:Infinity":30,"s:227:4:227:Infinity":99,"s:232:1:240:Infinity":100,"f:233:9:233:21":12,"s:234:3:238:Infinity":101,"s:235:4:235:Infinity":102,"s:237:4:237:Infinity":103,"f:243:9:243:21":13,"b:244:1:244:Infinity:undefined:undefined:undefined:undefined":31,"s:244:1:244:Infinity":104,"s:244:15:244:Infinity":105,"b:245:1:247:Infinity:undefined:undefined:undefined:undefined":32,"s:245:1:247:Infinity":106,"b:245:5:245:49:245:49:245:78":33,"s:246:2:246:Infinity":107,"s:248:18:248:Infinity":108,"b:249:1:249:Infinity:undefined:undefined:undefined:undefined":34,"s:249:1:249:Infinity":109,"s:249:23:249:Infinity":110,"s:250:17:250:Infinity":111,"b:250:17:250:50:250:50:250:Infinity":35,"b:251:1:251:Infinity:undefined:undefined:undefined:undefined":36,"s:251:1:251:Infinity":112,"s:251:22:251:Infinity":113,"s:252:1:252:Infinity":114,"f:255:9:255:23":14,"s:256:1:258:Infinity":115,"b:257:3:257:Infinity:258:3:258:Infinity":37,"f:262:9:262:21":15,"b:263:1:263:Infinity:undefined:undefined:undefined:undefined":38,"s:263:1:263:Infinity":116,"s:263:27:263:Infinity":117,"b:264:1:264:Infinity:undefined:undefined:undefined:undefined":39,"s:264:1:264:Infinity":118,"s:264:30:264:Infinity":119,"s:265:16:265:Infinity":120,"s:266:15:266:Infinity":121,"b:267:1:267:Infinity:undefined:undefined:undefined:undefined":40,"s:267:1:267:Infinity":122,"b:267:5:267:15:267:15:267:21":41,"s:267:21:267:Infinity":123,"b:267:38:267:48:267:48:267:57":42,"b:267:66:267:74:267:74:267:83":43,"s:268:1:268:Infinity":124}}} +,"/Users/steipete/Projects/warelay/src/utils.ts": {"path":"/Users/steipete/Projects/warelay/src/utils.ts","statementMap":{"0":{"start":{"line":5,"column":1},"end":{"line":5,"column":null}},"1":{"start":{"line":11,"column":1},"end":{"line":13,"column":null}},"2":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"3":{"start":{"line":17,"column":1},"end":{"line":17,"column":null}},"4":{"start":{"line":17,"column":25},"end":{"line":17,"column":null}},"5":{"start":{"line":18,"column":1},"end":{"line":18,"column":null}},"6":{"start":{"line":22,"column":1},"end":{"line":22,"column":null}},"7":{"start":{"line":26,"column":23},"end":{"line":26,"column":null}},"8":{"start":{"line":27,"column":16},"end":{"line":27,"column":null}},"9":{"start":{"line":28,"column":1},"end":{"line":28,"column":null}},"10":{"start":{"line":28,"column":29},"end":{"line":28,"column":null}},"11":{"start":{"line":29,"column":1},"end":{"line":29,"column":null}},"12":{"start":{"line":33,"column":14},"end":{"line":33,"column":null}},"13":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"14":{"start":{"line":35,"column":1},"end":{"line":35,"column":null}},"15":{"start":{"line":40,"column":15},"end":{"line":40,"column":null}},"16":{"start":{"line":41,"column":1},"end":{"line":41,"column":null}},"17":{"start":{"line":41,"column":13},"end":{"line":41,"column":null}},"18":{"start":{"line":42,"column":16},"end":{"line":42,"column":null}},"19":{"start":{"line":43,"column":1},"end":{"line":43,"column":null}},"20":{"start":{"line":47,"column":1},"end":{"line":47,"column":null}},"21":{"start":{"line":47,"column":33},"end":{"line":47,"column":56}},"22":{"start":{"line":50,"column":26},"end":{"line":50,"column":null}}},"fnMap":{"0":{"name":"ensureDir","decl":{"start":{"line":4,"column":22},"end":{"line":4,"column":32}},"loc":{"start":{"line":4,"column":45},"end":{"line":6,"column":null}},"line":4},"1":{"name":"assertProvider","decl":{"start":{"line":10,"column":16},"end":{"line":10,"column":31}},"loc":{"start":{"line":10,"column":73},"end":{"line":14,"column":null}},"line":10},"2":{"name":"normalizePath","decl":{"start":{"line":16,"column":16},"end":{"line":16,"column":30}},"loc":{"start":{"line":16,"column":49},"end":{"line":19,"column":null}},"line":16},"3":{"name":"withWhatsAppPrefix","decl":{"start":{"line":21,"column":16},"end":{"line":21,"column":35}},"loc":{"start":{"line":21,"column":59},"end":{"line":23,"column":null}},"line":21},"4":{"name":"normalizeE164","decl":{"start":{"line":25,"column":16},"end":{"line":25,"column":30}},"loc":{"start":{"line":25,"column":54},"end":{"line":30,"column":null}},"line":25},"5":{"name":"toWhatsappJid","decl":{"start":{"line":32,"column":16},"end":{"line":32,"column":30}},"loc":{"start":{"line":32,"column":54},"end":{"line":36,"column":null}},"line":32},"6":{"name":"jidToE164","decl":{"start":{"line":38,"column":16},"end":{"line":38,"column":26}},"loc":{"start":{"line":38,"column":54},"end":{"line":44,"column":null}},"line":38},"7":{"name":"sleep","decl":{"start":{"line":46,"column":16},"end":{"line":46,"column":22}},"loc":{"start":{"line":46,"column":34},"end":{"line":48,"column":null}},"line":46},"8":{"name":"(anonymous_8)","decl":{"start":{"line":47,"column":20},"end":{"line":47,"column":21}},"loc":{"start":{"line":47,"column":33},"end":{"line":47,"column":56}},"line":47}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":1},"end":{"line":13,"column":null}},"type":"if","locations":[{"start":{"line":11,"column":1},"end":{"line":13,"column":null}},{"start":{},"end":{}}],"line":11},"1":{"loc":{"start":{"line":11,"column":5},"end":{"line":11,"column":44}},"type":"binary-expr","locations":[{"start":{"line":11,"column":5},"end":{"line":11,"column":27}},{"start":{"line":11,"column":27},"end":{"line":11,"column":44}}],"line":11},"2":{"loc":{"start":{"line":17,"column":1},"end":{"line":17,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":1},"end":{"line":17,"column":null}},{"start":{},"end":{}}],"line":17},"3":{"loc":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"type":"cond-expr","locations":[{"start":{"line":22,"column":41},"end":{"line":22,"column":50}},{"start":{"line":22,"column":50},"end":{"line":22,"column":null}}],"line":22},"4":{"loc":{"start":{"line":28,"column":1},"end":{"line":28,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":1},"end":{"line":28,"column":null}},{"start":{},"end":{}}],"line":28},"5":{"loc":{"start":{"line":41,"column":1},"end":{"line":41,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":1},"end":{"line":41,"column":null}},{"start":{},"end":{}}],"line":41}},"s":{"0":5,"1":6,"2":2,"3":3,"4":1,"5":2,"6":13,"7":10,"8":10,"9":10,"10":8,"11":2,"12":3,"13":3,"14":3,"15":2,"16":2,"17":0,"18":2,"19":2,"20":833,"21":833,"22":5},"f":{"0":5,"1":6,"2":3,"3":13,"4":10,"5":3,"6":2,"7":833,"8":833},"b":{"0":[2,4],"1":[6,4],"2":[1,2],"3":[7,6],"4":[8,2],"5":[0,2]},"meta":{"lastBranch":6,"lastFunction":9,"lastStatement":23,"seen":{"f:4:22:4:32":0,"s:5:1:5:Infinity":0,"f:10:16:10:31":1,"b:11:1:13:Infinity:undefined:undefined:undefined:undefined":0,"s:11:1:13:Infinity":1,"b:11:5:11:27:11:27:11:44":1,"s:12:2:12:Infinity":2,"f:16:16:16:30":2,"b:17:1:17:Infinity:undefined:undefined:undefined:undefined":2,"s:17:1:17:Infinity":3,"s:17:25:17:Infinity":4,"s:18:1:18:Infinity":5,"f:21:16:21:35":3,"s:22:1:22:Infinity":6,"b:22:41:22:50:22:50:22:Infinity":3,"f:25:16:25:30":4,"s:26:23:26:Infinity":7,"s:27:16:27:Infinity":8,"b:28:1:28:Infinity:undefined:undefined:undefined:undefined":4,"s:28:1:28:Infinity":9,"s:28:29:28:Infinity":10,"s:29:1:29:Infinity":11,"f:32:16:32:30":5,"s:33:14:33:Infinity":12,"s:34:16:34:Infinity":13,"s:35:1:35:Infinity":14,"f:38:16:38:26":6,"s:40:15:40:Infinity":15,"b:41:1:41:Infinity:undefined:undefined:undefined:undefined":5,"s:41:1:41:Infinity":16,"s:41:13:41:Infinity":17,"s:42:16:42:Infinity":18,"s:43:1:43:Infinity":19,"f:46:16:46:22":7,"s:47:1:47:Infinity":20,"f:47:20:47:21":8,"s:47:33:47:56":21,"s:50:26:50:Infinity":22}}} +,"/Users/steipete/Projects/warelay/src/commands/send.ts": {"path":"/Users/steipete/Projects/warelay/src/commands/send.ts","statementMap":{"0":{"start":{"line":15,"column":1},"end":{"line":15,"column":null}},"1":{"start":{"line":16,"column":21},"end":{"line":16,"column":null}},"2":{"start":{"line":17,"column":21},"end":{"line":17,"column":null}},"3":{"start":{"line":19,"column":1},"end":{"line":21,"column":null}},"4":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"5":{"start":{"line":22,"column":1},"end":{"line":24,"column":null}},"6":{"start":{"line":23,"column":2},"end":{"line":23,"column":null}},"7":{"start":{"line":26,"column":1},"end":{"line":32,"column":null}},"8":{"start":{"line":27,"column":2},"end":{"line":29,"column":null}},"9":{"start":{"line":28,"column":3},"end":{"line":28,"column":null}},"10":{"start":{"line":30,"column":2},"end":{"line":30,"column":null}},"11":{"start":{"line":31,"column":2},"end":{"line":31,"column":null}},"12":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"13":{"start":{"line":35,"column":1},"end":{"line":35,"column":null}},"14":{"start":{"line":35,"column":14},"end":{"line":35,"column":null}},"15":{"start":{"line":36,"column":1},"end":{"line":36,"column":null}},"16":{"start":{"line":36,"column":24},"end":{"line":36,"column":null}},"17":{"start":{"line":37,"column":1},"end":{"line":43,"column":null}}},"fnMap":{"0":{"name":"sendCommand","decl":{"start":{"line":4,"column":22},"end":{"line":4,"column":null}},"loc":{"start":{"line":14,"column":2},"end":{"line":44,"column":null}},"line":14}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":1},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":1},"end":{"line":21,"column":null}},{"start":{},"end":{}}],"line":19},"1":{"loc":{"start":{"line":19,"column":5},"end":{"line":19,"column":51}},"type":"binary-expr","locations":[{"start":{"line":19,"column":5},"end":{"line":19,"column":34}},{"start":{"line":19,"column":34},"end":{"line":19,"column":51}}],"line":19},"2":{"loc":{"start":{"line":22,"column":1},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":1},"end":{"line":24,"column":null}},{"start":{},"end":{}}],"line":22},"3":{"loc":{"start":{"line":22,"column":5},"end":{"line":22,"column":52}},"type":"binary-expr","locations":[{"start":{"line":22,"column":5},"end":{"line":22,"column":34}},{"start":{"line":22,"column":34},"end":{"line":22,"column":52}}],"line":22},"4":{"loc":{"start":{"line":26,"column":1},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":1},"end":{"line":32,"column":null}},{"start":{},"end":{}}],"line":26},"5":{"loc":{"start":{"line":27,"column":2},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":29,"column":null}},{"start":{},"end":{}}],"line":27},"6":{"loc":{"start":{"line":35,"column":1},"end":{"line":35,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":1},"end":{"line":35,"column":null}},{"start":{},"end":{}}],"line":35},"7":{"loc":{"start":{"line":36,"column":1},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":1},"end":{"line":36,"column":null}},{"start":{},"end":{}}],"line":36}},"s":{"0":2,"1":2,"2":2,"3":2,"4":0,"5":2,"6":0,"7":2,"8":1,"9":0,"10":1,"11":1,"12":1,"13":1,"14":0,"15":1,"16":1,"17":0},"f":{"0":2},"b":{"0":[0,2],"1":[2,2],"2":[0,2],"3":[2,2],"4":[1,1],"5":[0,1],"6":[0,1],"7":[1,0]},"meta":{"lastBranch":8,"lastFunction":1,"lastStatement":18,"seen":{"f:4:22:4:Infinity":0,"s:15:1:15:Infinity":0,"s:16:21:16:Infinity":1,"s:17:21:17:Infinity":2,"b:19:1:21:Infinity:undefined:undefined:undefined:undefined":0,"s:19:1:21:Infinity":3,"b:19:5:19:34:19:34:19:51":1,"s:20:2:20:Infinity":4,"b:22:1:24:Infinity:undefined:undefined:undefined:undefined":2,"s:22:1:24:Infinity":5,"b:22:5:22:34:22:34:22:52":3,"s:23:2:23:Infinity":6,"b:26:1:32:Infinity:undefined:undefined:undefined:undefined":4,"s:26:1:32:Infinity":7,"b:27:2:29:Infinity:undefined:undefined:undefined:undefined":5,"s:27:2:29:Infinity":8,"s:28:3:28:Infinity":9,"s:30:2:30:Infinity":10,"s:31:2:31:Infinity":11,"s:34:16:34:Infinity":12,"b:35:1:35:Infinity:undefined:undefined:undefined:undefined":6,"s:35:1:35:Infinity":13,"s:35:14:35:Infinity":14,"b:36:1:36:Infinity:undefined:undefined:undefined:undefined":7,"s:36:1:36:Infinity":15,"s:36:24:36:Infinity":16,"s:37:1:43:Infinity":17}}} +,"/Users/steipete/Projects/warelay/src/commands/status.ts": {"path":"/Users/steipete/Projects/warelay/src/commands/status.ts","statementMap":{"0":{"start":{"line":9,"column":15},"end":{"line":9,"column":null}},"1":{"start":{"line":10,"column":25},"end":{"line":10,"column":null}},"2":{"start":{"line":11,"column":1},"end":{"line":13,"column":null}},"3":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"4":{"start":{"line":14,"column":1},"end":{"line":16,"column":null}},"5":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"6":{"start":{"line":18,"column":18},"end":{"line":18,"column":null}},"7":{"start":{"line":19,"column":1},"end":{"line":22,"column":null}},"8":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"9":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}},"10":{"start":{"line":23,"column":1},"end":{"line":26,"column":null}},"11":{"start":{"line":24,"column":2},"end":{"line":24,"column":null}},"12":{"start":{"line":25,"column":2},"end":{"line":25,"column":null}},"13":{"start":{"line":27,"column":1},"end":{"line":29,"column":null}},"14":{"start":{"line":28,"column":2},"end":{"line":28,"column":null}}},"fnMap":{"0":{"name":"statusCommand","decl":{"start":{"line":4,"column":22},"end":{"line":4,"column":null}},"loc":{"start":{"line":8,"column":2},"end":{"line":30,"column":null}},"line":8}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":1},"end":{"line":13,"column":null}},"type":"if","locations":[{"start":{"line":11,"column":1},"end":{"line":13,"column":null}},{"start":{},"end":{}}],"line":11},"1":{"loc":{"start":{"line":11,"column":5},"end":{"line":11,"column":55}},"type":"binary-expr","locations":[{"start":{"line":11,"column":5},"end":{"line":11,"column":28}},{"start":{"line":11,"column":28},"end":{"line":11,"column":42}},{"start":{"line":11,"column":42},"end":{"line":11,"column":55}}],"line":11},"2":{"loc":{"start":{"line":14,"column":1},"end":{"line":16,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":1},"end":{"line":16,"column":null}},{"start":{},"end":{}}],"line":14},"3":{"loc":{"start":{"line":14,"column":5},"end":{"line":14,"column":60}},"type":"binary-expr","locations":[{"start":{"line":14,"column":5},"end":{"line":14,"column":38}},{"start":{"line":14,"column":38},"end":{"line":14,"column":60}}],"line":14},"4":{"loc":{"start":{"line":19,"column":1},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":1},"end":{"line":22,"column":null}},{"start":{},"end":{}}],"line":19},"5":{"loc":{"start":{"line":23,"column":1},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":1},"end":{"line":26,"column":null}},{"start":{},"end":{}}],"line":23}},"s":{"0":1,"1":1,"2":1,"3":0,"4":1,"5":0,"6":1,"7":1,"8":1,"9":1,"10":0,"11":0,"12":0,"13":0,"14":0},"f":{"0":1},"b":{"0":[0,1],"1":[1,1,1],"2":[0,1],"3":[1,1],"4":[1,0],"5":[0,0]},"meta":{"lastBranch":6,"lastFunction":1,"lastStatement":15,"seen":{"f:4:22:4:Infinity":0,"s:9:15:9:Infinity":0,"s:10:25:10:Infinity":1,"b:11:1:13:Infinity:undefined:undefined:undefined:undefined":0,"s:11:1:13:Infinity":2,"b:11:5:11:28:11:28:11:42:11:42:11:55":1,"s:12:2:12:Infinity":3,"b:14:1:16:Infinity:undefined:undefined:undefined:undefined":2,"s:14:1:16:Infinity":4,"b:14:5:14:38:14:38:14:60":3,"s:15:2:15:Infinity":5,"s:18:18:18:Infinity":6,"b:19:1:22:Infinity:undefined:undefined:undefined:undefined":4,"s:19:1:22:Infinity":7,"s:20:2:20:Infinity":8,"s:21:2:21:Infinity":9,"b:23:1:26:Infinity:undefined:undefined:undefined:undefined":5,"s:23:1:26:Infinity":10,"s:24:2:24:Infinity":11,"s:25:2:25:Infinity":12,"s:27:1:29:Infinity":13,"s:28:2:28:Infinity":14}}} +,"/Users/steipete/Projects/warelay/src/commands/up.ts": {"path":"/Users/steipete/Projects/warelay/src/commands/up.ts","statementMap":{"0":{"start":{"line":10,"column":14},"end":{"line":10,"column":null}},"1":{"start":{"line":11,"column":1},"end":{"line":13,"column":null}},"2":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"3":{"start":{"line":15,"column":1},"end":{"line":15,"column":null}},"4":{"start":{"line":16,"column":13},"end":{"line":16,"column":null}},"5":{"start":{"line":17,"column":1},"end":{"line":17,"column":null}},"6":{"start":{"line":18,"column":1},"end":{"line":18,"column":null}},"7":{"start":{"line":19,"column":14},"end":{"line":19,"column":null}},"8":{"start":{"line":20,"column":19},"end":{"line":20,"column":null}},"9":{"start":{"line":21,"column":1},"end":{"line":21,"column":null}},"10":{"start":{"line":23,"column":16},"end":{"line":29,"column":null}},"11":{"start":{"line":31,"column":22},"end":{"line":31,"column":null}},"12":{"start":{"line":32,"column":19},"end":{"line":37,"column":null}},"13":{"start":{"line":38,"column":1},"end":{"line":44,"column":null}},"14":{"start":{"line":46,"column":1},"end":{"line":48,"column":null}},"15":{"start":{"line":50,"column":1},"end":{"line":50,"column":null}}},"fnMap":{"0":{"name":"upCommand","decl":{"start":{"line":4,"column":22},"end":{"line":4,"column":null}},"loc":{"start":{"line":9,"column":2},"end":{"line":51,"column":null}},"line":9}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":1},"end":{"line":8,"column":null}},"type":"default-arg","locations":[{"start":{"line":8,"column":37},"end":{"line":8,"column":null}}],"line":8},"1":{"loc":{"start":{"line":11,"column":1},"end":{"line":13,"column":null}},"type":"if","locations":[{"start":{"line":11,"column":1},"end":{"line":13,"column":null}},{"start":{},"end":{}}],"line":11},"2":{"loc":{"start":{"line":11,"column":5},"end":{"line":11,"column":55}},"type":"binary-expr","locations":[{"start":{"line":11,"column":5},"end":{"line":11,"column":27}},{"start":{"line":11,"column":27},"end":{"line":11,"column":40}},{"start":{"line":11,"column":40},"end":{"line":11,"column":55}}],"line":11},"3":{"loc":{"start":{"line":31,"column":22},"end":{"line":31,"column":null}},"type":"cond-expr","locations":[{"start":{"line":31,"column":42},"end":{"line":31,"column":67}},{"start":{"line":31,"column":67},"end":{"line":31,"column":null}}],"line":31}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0},"f":{"0":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0,0]},"meta":{"lastBranch":4,"lastFunction":1,"lastStatement":16,"seen":{"f:4:22:4:Infinity":0,"b:8:37:8:Infinity":0,"s:10:14:10:Infinity":0,"b:11:1:13:Infinity:undefined:undefined:undefined:undefined":1,"s:11:1:13:Infinity":1,"b:11:5:11:27:11:27:11:40:11:40:11:55":2,"s:12:2:12:Infinity":2,"s:15:1:15:Infinity":3,"s:16:13:16:Infinity":4,"s:17:1:17:Infinity":5,"s:18:1:18:Infinity":6,"s:19:14:19:Infinity":7,"s:20:19:20:Infinity":8,"s:21:1:21:Infinity":9,"s:23:16:29:Infinity":10,"s:31:22:31:Infinity":11,"b:31:42:31:67:31:67:31:Infinity":3,"s:32:19:37:Infinity":12,"s:38:1:44:Infinity":13,"s:46:1:48:Infinity":14,"s:50:1:50:Infinity":15}}} +,"/Users/steipete/Projects/warelay/src/commands/webhook.ts": {"path":"/Users/steipete/Projects/warelay/src/commands/webhook.ts","statementMap":{"0":{"start":{"line":8,"column":14},"end":{"line":8,"column":null}},"1":{"start":{"line":9,"column":1},"end":{"line":11,"column":null}},"2":{"start":{"line":10,"column":2},"end":{"line":10,"column":null}},"3":{"start":{"line":12,"column":1},"end":{"line":12,"column":null}},"4":{"start":{"line":13,"column":16},"end":{"line":19,"column":null}},"5":{"start":{"line":20,"column":1},"end":{"line":20,"column":null}}},"fnMap":{"0":{"name":"webhookCommand","decl":{"start":{"line":3,"column":22},"end":{"line":3,"column":null}},"loc":{"start":{"line":7,"column":2},"end":{"line":21,"column":null}},"line":7}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":1},"end":{"line":11,"column":null}},"type":"if","locations":[{"start":{"line":9,"column":1},"end":{"line":11,"column":null}},{"start":{},"end":{}}],"line":9},"1":{"loc":{"start":{"line":9,"column":5},"end":{"line":9,"column":55}},"type":"binary-expr","locations":[{"start":{"line":9,"column":5},"end":{"line":9,"column":27}},{"start":{"line":9,"column":27},"end":{"line":9,"column":40}},{"start":{"line":9,"column":40},"end":{"line":9,"column":55}}],"line":9}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0,0]},"meta":{"lastBranch":2,"lastFunction":1,"lastStatement":6,"seen":{"f:3:22:3:Infinity":0,"s:8:14:8:Infinity":0,"b:9:1:11:Infinity:undefined:undefined:undefined:undefined":0,"s:9:1:11:Infinity":1,"b:9:5:9:27:9:27:9:40:9:40:9:55":1,"s:10:2:10:Infinity":2,"s:12:1:12:Infinity":3,"s:13:16:19:Infinity":4,"s:20:1:20:Infinity":5}}} +,"/Users/steipete/Projects/warelay/test/mocks/baileys.ts": {"path":"/Users/steipete/Projects/warelay/test/mocks/baileys.ts","statementMap":{"0":{"start":{"line":22,"column":38},"end":{"line":22,"column":null}},"1":{"start":{"line":23,"column":22},"end":{"line":35,"column":null}},"2":{"start":{"line":24,"column":13},"end":{"line":24,"column":null}},"3":{"start":{"line":25,"column":34},"end":{"line":31,"column":null}},"4":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"5":{"start":{"line":32,"column":21},"end":{"line":32,"column":73}},"6":{"start":{"line":33,"column":2},"end":{"line":33,"column":null}},"7":{"start":{"line":34,"column":2},"end":{"line":34,"column":null}},"8":{"start":{"line":37,"column":32},"end":{"line":47,"column":null}},"9":{"start":{"line":40,"column":56},"end":{"line":40,"column":60}},"10":{"start":{"line":42,"column":44},"end":{"line":45,"column":4}},"11":{"start":{"line":46,"column":30},"end":{"line":46,"column":null}},"12":{"start":{"line":49,"column":1},"end":{"line":52,"column":null}},"13":{"start":{"line":51,"column":20},"end":{"line":51,"column":null}}},"fnMap":{"0":{"name":"createMockBaileys","decl":{"start":{"line":21,"column":16},"end":{"line":21,"column":101}},"loc":{"start":{"line":21,"column":101},"end":{"line":53,"column":null}},"line":21},"1":{"name":"(anonymous_1)","decl":{"start":{"line":23,"column":28},"end":{"line":23,"column":29}},"loc":{"start":{"line":23,"column":47},"end":{"line":35,"column":2}},"line":23},"2":{"name":"(anonymous_2)","decl":{"start":{"line":32,"column":15},"end":{"line":32,"column":21}},"loc":{"start":{"line":32,"column":21},"end":{"line":32,"column":73}},"line":32},"3":{"name":"(anonymous_3)","decl":{"start":{"line":40,"column":37},"end":{"line":40,"column":38}},"loc":{"start":{"line":40,"column":56},"end":{"line":40,"column":60}},"line":40},"4":{"name":"(anonymous_4)","decl":{"start":{"line":42,"column":31},"end":{"line":42,"column":44}},"loc":{"start":{"line":42,"column":44},"end":{"line":45,"column":4}},"line":42},"5":{"name":"(anonymous_5)","decl":{"start":{"line":46,"column":13},"end":{"line":46,"column":14}},"loc":{"start":{"line":46,"column":30},"end":{"line":46,"column":null}},"line":46},"6":{"name":"(anonymous_6)","decl":{"start":{"line":51,"column":14},"end":{"line":51,"column":20}},"loc":{"start":{"line":51,"column":20},"end":{"line":51,"column":null}},"line":51}},"branchMap":{},"s":{"0":7,"1":7,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":4,"10":4,"11":0,"12":7,"13":3},"f":{"0":7,"1":3,"2":3,"3":4,"4":4,"5":0,"6":3},"b":{},"meta":{"lastBranch":0,"lastFunction":7,"lastStatement":14,"seen":{"f:21:16:21:101":0,"s:22:38:22:Infinity":0,"s:23:22:35:Infinity":1,"f:23:28:23:29":1,"s:24:13:24:Infinity":2,"s:25:34:31:Infinity":3,"s:32:2:32:Infinity":4,"f:32:15:32:21":2,"s:32:21:32:73":5,"s:33:2:33:Infinity":6,"s:34:2:34:Infinity":7,"s:37:32:47:Infinity":8,"f:40:37:40:38":3,"s:40:56:40:60":9,"f:42:31:42:44":4,"s:42:44:45:4":10,"f:46:13:46:14":5,"s:46:30:46:Infinity":11,"s:49:1:52:Infinity":12,"f:51:14:51:20":6,"s:51:20:51:Infinity":13}}} +,"/Users/steipete/Projects/warelay/test/mocks/twilio.ts": {"path":"/Users/steipete/Projects/warelay/test/mocks/twilio.ts","statementMap":{"0":{"start":{"line":18,"column":18},"end":{"line":18,"column":null}},"1":{"start":{"line":18,"column":43},"end":{"line":18,"column":62}},"2":{"start":{"line":19,"column":1},"end":{"line":19,"column":null}},"3":{"start":{"line":20,"column":1},"end":{"line":20,"column":null}},"4":{"start":{"line":22,"column":25},"end":{"line":25,"column":null}},"5":{"start":{"line":22,"column":50},"end":{"line":25,"column":3}},"6":{"start":{"line":26,"column":1},"end":{"line":26,"column":null}},"7":{"start":{"line":28,"column":18},"end":{"line":28,"column":null}},"8":{"start":{"line":28,"column":31},"end":{"line":28,"column":67}},"9":{"start":{"line":30,"column":30},"end":{"line":32,"column":null}},"10":{"start":{"line":30,"column":55},"end":{"line":32,"column":3}},"11":{"start":{"line":33,"column":1},"end":{"line":33,"column":null}},"12":{"start":{"line":35,"column":34},"end":{"line":43,"column":null}},"13":{"start":{"line":45,"column":17},"end":{"line":45,"column":null}},"14":{"start":{"line":45,"column":29},"end":{"line":45,"column":35}},"15":{"start":{"line":46,"column":2},"end":{"line":46,"column":null}},"16":{"start":{"line":48,"column":1},"end":{"line":48,"column":null}}},"fnMap":{"0":{"name":"createMockTwilio","decl":{"start":{"line":17,"column":16},"end":{"line":17,"column":35}},"loc":{"start":{"line":17,"column":35},"end":{"line":49,"column":null}},"line":17},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":24},"end":{"line":18,"column":25}},"loc":{"start":{"line":18,"column":43},"end":{"line":18,"column":62}},"line":18},"2":{"name":"(anonymous_2)","decl":{"start":{"line":22,"column":31},"end":{"line":22,"column":32}},"loc":{"start":{"line":22,"column":50},"end":{"line":25,"column":3}},"line":22},"3":{"name":"(anonymous_3)","decl":{"start":{"line":28,"column":24},"end":{"line":28,"column":31}},"loc":{"start":{"line":28,"column":31},"end":{"line":28,"column":67}},"line":28},"4":{"name":"(anonymous_4)","decl":{"start":{"line":30,"column":36},"end":{"line":30,"column":37}},"loc":{"start":{"line":30,"column":55},"end":{"line":32,"column":3}},"line":30},"5":{"name":"(anonymous_5)","decl":{"start":{"line":45,"column":23},"end":{"line":45,"column":29}},"loc":{"start":{"line":45,"column":29},"end":{"line":45,"column":35}},"line":45}},"branchMap":{},"s":{"0":1,"1":0,"2":1,"3":1,"4":1,"5":0,"6":1,"7":1,"8":0,"9":1,"10":0,"11":1,"12":1,"13":1,"14":2,"15":1,"16":1},"f":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":2},"b":{},"meta":{"lastBranch":0,"lastFunction":6,"lastStatement":17,"seen":{"f:17:16:17:35":0,"s:18:18:18:Infinity":0,"f:18:24:18:25":1,"s:18:43:18:62":1,"s:19:1:19:Infinity":2,"s:20:1:20:Infinity":3,"s:22:25:25:Infinity":4,"f:22:31:22:32":2,"s:22:50:25:3":5,"s:26:1:26:Infinity":6,"s:28:18:28:Infinity":7,"f:28:24:28:31":3,"s:28:31:28:67":8,"s:30:30:32:Infinity":9,"f:30:36:30:37":4,"s:30:55:32:3":10,"s:33:1:33:Infinity":11,"s:35:34:43:Infinity":12,"s:45:17:45:Infinity":13,"f:45:23:45:29":5,"s:45:29:45:35":14,"s:46:2:46:Infinity":15,"s:48:1:48:Infinity":16}}} +} diff --git a/coverage/favicon.png b/coverage/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 58.62% + Statements + 581/991 +
+ + +
+ 48.09% + Branches + 341/709 +
+ + +
+ 70.27% + Functions + 104/148 +
+ + +
+ 61.17% + Lines + 561/917 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
src +
+
59%534/90548.27%322/66771.75%94/13161.62%517/839
src/commands +
+
38.18%21/5545.23%19/4250%2/437.73%20/53
test/mocks +
+
83.87%26/31100%0/061.53%8/1396%24/25
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/prettify.css b/coverage/prettify.css new file mode 100644 index 000000000..b317a7cda --- /dev/null +++ b/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/prettify.js b/coverage/prettify.js new file mode 100644 index 000000000..b3225238f --- /dev/null +++ b/coverage/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/sort-arrow-sprite.png b/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/coverage/sorter.js b/coverage/sorter.js new file mode 100644 index 000000000..4ed70ae5a --- /dev/null +++ b/coverage/sorter.js @@ -0,0 +1,210 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + + // Try to create a RegExp from the searchValue. If it fails (invalid regex), + // it will be treated as a plain text search + let searchRegex; + try { + searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive + } catch (error) { + searchRegex = null; + } + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let isMatch = false; + + if (searchRegex) { + // If a valid regex was created, use it for matching + isMatch = searchRegex.test(row.textContent); + } else { + // Otherwise, fall back to the original plain text search + isMatch = row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()); + } + + row.style.display = isMatch ? '' : 'none'; + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/src/commands/index.html b/coverage/src/commands/index.html new file mode 100644 index 000000000..732267733 --- /dev/null +++ b/coverage/src/commands/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/commands + + + + + + + + + +
+
+

All files src/commands

+
+ +
+ 38.18% + Statements + 21/55 +
+ + +
+ 45.23% + Branches + 19/42 +
+ + +
+ 50% + Functions + 2/4 +
+ + +
+ 37.73% + Lines + 20/53 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
send.ts +
+
72.22%13/1868.75%11/16100%1/175%12/16
status.ts +
+
53.33%8/1561.53%8/13100%1/153.33%8/15
up.ts +
+
0%0/160%0/80%0/10%0/16
webhook.ts +
+
0%0/60%0/50%0/10%0/6
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/commands/send.ts.html b/coverage/src/commands/send.ts.html new file mode 100644 index 000000000..a15659070 --- /dev/null +++ b/coverage/src/commands/send.ts.html @@ -0,0 +1,217 @@ + + + + + + Code coverage report for src/commands/send.ts + + + + + + + + + +
+
+

All files / src/commands send.ts

+
+ +
+ 72.22% + Statements + 13/18 +
+ + +
+ 68.75% + Branches + 11/16 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 75% + Lines + 12/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +  +2x +  +  +2x +  +  +  +2x +1x +  +  +1x +1x +  +  +1x +1x +1x +  +  +  +  +  +  +  +  + 
import { info } from "../globals.js";
+import type { CliDeps, Provider, RuntimeEnv } from "../index.js";
+ 
+export async function sendCommand(
+	opts: {
+		to: string;
+		message: string;
+		wait: string;
+		poll: string;
+		provider: Provider;
+	},
+	deps: CliDeps,
+	runtime: RuntimeEnv,
+) {
+	deps.assertProvider(opts.provider);
+	const waitSeconds = Number.parseInt(opts.wait, 10);
+	const pollSeconds = Number.parseInt(opts.poll, 10);
+ 
+	Iif (Number.isNaN(waitSeconds) || waitSeconds < 0) {
+		throw new Error("Wait must be >= 0 seconds");
+	}
+	Iif (Number.isNaN(pollSeconds) || pollSeconds <= 0) {
+		throw new Error("Poll must be > 0 seconds");
+	}
+ 
+	if (opts.provider === "web") {
+		Iif (waitSeconds !== 0) {
+			runtime.log(info("Wait/poll are Twilio-only; ignored for provider=web."));
+		}
+		await deps.sendMessageWeb(opts.to, opts.message, { verbose: false });
+		return;
+	}
+ 
+	const result = await deps.sendMessage(opts.to, opts.message, runtime);
+	Iif (!result) return;
+	Eif (waitSeconds === 0) return;
+	await deps.waitForFinalStatus(
+		result.client,
+		result.sid,
+		waitSeconds,
+		pollSeconds,
+		runtime,
+	);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/commands/status.ts.html b/coverage/src/commands/status.ts.html new file mode 100644 index 000000000..7dbb05d7e --- /dev/null +++ b/coverage/src/commands/status.ts.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for src/commands/status.ts + + + + + + + + + +
+
+

All files / src/commands status.ts

+
+ +
+ 53.33% + Statements + 8/15 +
+ + +
+ 61.53% + Branches + 8/13 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 53.33% + Lines + 8/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x +  +  +  +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  + 
import { formatMessageLine } from "../index.js";
+import type { CliDeps, RuntimeEnv } from "../index.js";
+ 
+export async function statusCommand(
+	opts: { limit: string; lookback: string; json?: boolean },
+	deps: CliDeps,
+	runtime: RuntimeEnv,
+) {
+	const limit = Number.parseInt(opts.limit, 10);
+	const lookbackMinutes = Number.parseInt(opts.lookback, 10);
+	Iif (Number.isNaN(limit) || limit <= 0 || limit > 200) {
+		throw new Error("limit must be between 1 and 200");
+	}
+	Iif (Number.isNaN(lookbackMinutes) || lookbackMinutes <= 0) {
+		throw new Error("lookback must be > 0 minutes");
+	}
+ 
+	const messages = await deps.listRecentMessages(lookbackMinutes, limit);
+	Eif (opts.json) {
+		runtime.log(JSON.stringify(messages, null, 2));
+		return;
+	}
+	if (messages.length === 0) {
+		runtime.log("No messages found in the requested window.");
+		return;
+	}
+	for (const m of messages) {
+		runtime.log(formatMessageLine(m));
+	}
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/commands/up.ts.html b/coverage/src/commands/up.ts.html new file mode 100644 index 000000000..246873571 --- /dev/null +++ b/coverage/src/commands/up.ts.html @@ -0,0 +1,238 @@ + + + + + + Code coverage report for src/commands/up.ts + + + + + + + + + +
+
+

All files / src/commands up.ts

+
+ +
+ 0% + Statements + 0/16 +
+ + +
+ 0% + Branches + 0/8 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import type { CliDeps, RuntimeEnv } from "../index.js";
+import { waitForever as defaultWaitForever } from "../index.js";
+ 
+export async function upCommand(
+	opts: { port: string; path: string; verbose?: boolean; yes?: boolean },
+	deps: CliDeps,
+	runtime: RuntimeEnv,
+	waiter: typeof defaultWaitForever = defaultWaitForever,
+) {
+	const port = Number.parseInt(opts.port, 10);
+	if (Number.isNaN(port) || port <= 0 || port >= 65536) {
+		throw new Error("Port must be between 1 and 65535");
+	}
+ 
+	await deps.ensurePortAvailable(port);
+	const env = deps.readEnv(runtime);
+	await deps.ensureBinary("tailscale", undefined, runtime);
+	await deps.ensureFunnel(port, undefined, runtime);
+	const host = await deps.getTailnetHostname();
+	const publicUrl = `https://${host}${opts.path}`;
+	runtime.log(`🌐 Public webhook URL (via Funnel): ${publicUrl}`);
+ 
+	const server = await deps.startWebhook(
+		port,
+		opts.path,
+		undefined,
+		Boolean(opts.verbose),
+		runtime,
+	);
+ 
+	const twilioClient = deps.createClient ? deps.createClient(env) : undefined;
+	const senderSid = await deps.findWhatsappSenderSid(
+		twilioClient as any,
+		env.whatsappFrom,
+		env.whatsappSenderSid,
+		runtime,
+	);
+	await deps.updateWebhook(
+		twilioClient as any,
+		senderSid,
+		publicUrl,
+		"POST",
+		runtime,
+	);
+ 
+	runtime.log(
+		"\nSetup complete. Leave this process running to keep the webhook online. Ctrl+C to stop.",
+	);
+ 
+	return { server, publicUrl, senderSid, waiter };
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/commands/webhook.ts.html b/coverage/src/commands/webhook.ts.html new file mode 100644 index 000000000..9a7b60ab9 --- /dev/null +++ b/coverage/src/commands/webhook.ts.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for src/commands/webhook.ts + + + + + + + + + +
+
+

All files / src/commands webhook.ts

+
+ +
+ 0% + Statements + 0/6 +
+ + +
+ 0% + Branches + 0/5 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import type { CliDeps, RuntimeEnv } from "../index.js";
+ 
+export async function webhookCommand(
+	opts: { port: string; path: string; reply?: string; verbose?: boolean; yes?: boolean },
+	deps: CliDeps,
+	runtime: RuntimeEnv,
+) {
+	const port = Number.parseInt(opts.port, 10);
+	if (Number.isNaN(port) || port <= 0 || port >= 65536) {
+		throw new Error("Port must be between 1 and 65535");
+	}
+	await deps.ensurePortAvailable(port);
+	const server = await deps.startWebhook(
+		port,
+		opts.path,
+		opts.reply,
+		Boolean(opts.verbose),
+		runtime,
+	);
+	return server;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/globals.ts.html b/coverage/src/globals.ts.html new file mode 100644 index 000000000..49c2597b4 --- /dev/null +++ b/coverage/src/globals.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/globals.ts + + + + + + + + + +
+
+

All files / src globals.ts

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30  +  +5x +5x +  +  +4x +  +  +  +6x +  +  +  +19x +  +  +  +4x +  +  +  +2x +  +  +5x +5x +5x +5x + 
import chalk from "chalk";
+ 
+let globalVerbose = false;
+let globalYes = false;
+ 
+export function setVerbose(v: boolean) {
+	globalVerbose = v;
+}
+ 
+export function isVerbose() {
+	return globalVerbose;
+}
+ 
+export function logVerbose(message: string) {
+	if (globalVerbose) console.log(chalk.gray(message));
+}
+ 
+export function setYes(v: boolean) {
+	globalYes = v;
+}
+ 
+export function isYes() {
+	return globalYes;
+}
+ 
+export const success = chalk.green;
+export const warn = chalk.yellow;
+export const info = chalk.cyan;
+export const danger = chalk.red;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/index.html b/coverage/src/index.html new file mode 100644 index 000000000..9339165fb --- /dev/null +++ b/coverage/src/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src + + + + + + + + + +
+
+

All files src

+
+ +
+ 59% + Statements + 534/905 +
+ + +
+ 48.27% + Branches + 322/667 +
+ + +
+ 71.75% + Functions + 94/131 +
+ + +
+ 61.62% + Lines + 517/839 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
globals.ts +
+
100%12/12100%2/2100%5/5100%11/11
index.ts +
+
56.37%420/74547.87%271/56665.34%66/10158.53%408/697
provider-web.ts +
+
64%80/12543.67%38/8787.5%14/1670.53%79/112
utils.ts +
+
95.65%22/2391.66%11/12100%9/9100%19/19
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/index.ts.html b/coverage/src/index.ts.html new file mode 100644 index 000000000..639524afc --- /dev/null +++ b/coverage/src/index.ts.html @@ -0,0 +1,6475 @@ + + + + + + Code coverage report for src/index.ts + + + + + + + + + +
+
+

All files / src index.ts

+
+ +
+ 56.37% + Statements + 420/745 +
+ + +
+ 47.87% + Branches + 271/566 +
+ + +
+ 65.34% + Functions + 66/101 +
+ + +
+ 58.53% + Lines + 408/697 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496 +1497 +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1524 +1525 +1526 +1527 +1528 +1529 +1530 +1531 +1532 +1533 +1534 +1535 +1536 +1537 +1538 +1539 +1540 +1541 +1542 +1543 +1544 +1545 +1546 +1547 +1548 +1549 +1550 +1551 +1552 +1553 +1554 +1555 +1556 +1557 +1558 +1559 +1560 +1561 +1562 +1563 +1564 +1565 +1566 +1567 +1568 +1569 +1570 +1571 +1572 +1573 +1574 +1575 +1576 +1577 +1578 +1579 +1580 +1581 +1582 +1583 +1584 +1585 +1586 +1587 +1588 +1589 +1590 +1591 +1592 +1593 +1594 +1595 +1596 +1597 +1598 +1599 +1600 +1601 +1602 +1603 +1604 +1605 +1606 +1607 +1608 +1609 +1610 +1611 +1612 +1613 +1614 +1615 +1616 +1617 +1618 +1619 +1620 +1621 +1622 +1623 +1624 +1625 +1626 +1627 +1628 +1629 +1630 +1631 +1632 +1633 +1634 +1635 +1636 +1637 +1638 +1639 +1640 +1641 +1642 +1643 +1644 +1645 +1646 +1647 +1648 +1649 +1650 +1651 +1652 +1653 +1654 +1655 +1656 +1657 +1658 +1659 +1660 +1661 +1662 +1663 +1664 +1665 +1666 +1667 +1668 +1669 +1670 +1671 +1672 +1673 +1674 +1675 +1676 +1677 +1678 +1679 +1680 +1681 +1682 +1683 +1684 +1685 +1686 +1687 +1688 +1689 +1690 +1691 +1692 +1693 +1694 +1695 +1696 +1697 +1698 +1699 +1700 +1701 +1702 +1703 +1704 +1705 +1706 +1707 +1708 +1709 +1710 +1711 +1712 +1713 +1714 +1715 +1716 +1717 +1718 +1719 +1720 +1721 +1722 +1723 +1724 +1725 +1726 +1727 +1728 +1729 +1730 +1731 +1732 +1733 +1734 +1735 +1736 +1737 +1738 +1739 +1740 +1741 +1742 +1743 +1744 +1745 +1746 +1747 +1748 +1749 +1750 +1751 +1752 +1753 +1754 +1755 +1756 +1757 +1758 +1759 +1760 +1761 +1762 +1763 +1764 +1765 +1766 +1767 +1768 +1769 +1770 +1771 +1772 +1773 +1774 +1775 +1776 +1777 +1778 +1779 +1780 +1781 +1782 +1783 +1784 +1785 +1786 +1787 +1788 +1789 +1790 +1791 +1792 +1793 +1794 +1795 +1796 +1797 +1798 +1799 +1800 +1801 +1802 +1803 +1804 +1805 +1806 +1807 +1808 +1809 +1810 +1811 +1812 +1813 +1814 +1815 +1816 +1817 +1818 +1819 +1820 +1821 +1822 +1823 +1824 +1825 +1826 +1827 +1828 +1829 +1830 +1831 +1832 +1833 +1834 +1835 +1836 +1837 +1838 +1839 +1840 +1841 +1842 +1843 +1844 +1845 +1846 +1847 +1848 +1849 +1850 +1851 +1852 +1853 +1854 +1855 +1856 +1857 +1858 +1859 +1860 +1861 +1862 +1863 +1864 +1865 +1866 +1867 +1868 +1869 +1870 +1871 +1872 +1873 +1874 +1875 +1876 +1877 +1878 +1879 +1880 +1881 +1882 +1883 +1884 +1885 +1886 +1887 +1888 +1889 +1890 +1891 +1892 +1893 +1894 +1895 +1896 +1897 +1898 +1899 +1900 +1901 +1902 +1903 +1904 +1905 +1906 +1907 +1908 +1909 +1910 +1911 +1912 +1913 +1914 +1915 +1916 +1917 +1918 +1919 +1920 +1921 +1922 +1923 +1924 +1925 +1926 +1927 +1928 +1929 +1930 +1931 +1932 +1933 +1934 +1935 +1936 +1937 +1938 +1939 +1940 +1941 +1942 +1943 +1944 +1945 +1946 +1947 +1948 +1949 +1950 +1951 +1952 +1953 +1954 +1955 +1956 +1957 +1958 +1959 +1960 +1961 +1962 +1963 +1964 +1965 +1966 +1967 +1968 +1969 +1970 +1971 +1972 +1973 +1974 +1975 +1976 +1977 +1978 +1979 +1980 +1981 +1982 +1983 +1984 +1985 +1986 +1987 +1988 +1989 +1990 +1991 +1992 +1993 +1994 +1995 +1996 +1997 +1998 +1999 +2000 +2001 +2002 +2003 +2004 +2005 +2006 +2007 +2008 +2009 +2010 +2011 +2012 +2013 +2014 +2015 +2016 +2017 +2018 +2019 +2020 +2021 +2022 +2023 +2024 +2025 +2026 +2027 +2028 +2029 +2030 +2031 +2032 +2033 +2034 +2035 +2036 +2037 +2038 +2039 +2040 +2041 +2042 +2043 +2044 +2045 +2046 +2047 +2048 +2049 +2050 +2051 +2052 +2053 +2054 +2055 +2056 +2057 +2058 +2059 +2060 +2061 +2062 +2063 +2064 +2065 +2066 +2067 +2068 +2069 +2070 +2071 +2072 +2073 +2074 +2075 +2076 +2077 +2078 +2079 +2080 +2081 +2082 +2083 +2084 +2085 +2086 +2087 +2088 +2089 +2090 +2091 +2092 +2093 +2094 +2095 +2096 +2097 +2098 +2099 +2100 +2101 +2102 +2103 +2104 +2105 +2106 +2107 +2108 +2109 +2110 +2111 +2112 +2113 +2114 +2115 +2116 +2117 +2118 +2119 +2120 +2121 +2122 +2123 +2124 +2125 +2126 +2127 +2128 +2129 +2130 +2131  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +1x +1x +  +  +  +3x +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +9x +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +9x +9x +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +9x +  +  +  +9x +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +1x +  +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +  +  +2x +2x +2x +2x +1x +  +  +2x +1x +  +2x +  +  +2x +  +  +  +  +  +2x +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +  +  +  +  +1x +  +  +  +  +1x +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +  +1x +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +14x +6x +6x +  +  +  +  +  +  +  +  +  +  +  +3x +3x +3x +  +  +6x +2x +2x +  +  +  +4x +4x +4x +4x +3x +  +  +  +  +1x +  +  +  +4x +4x +  +  +  +4x +4x +4x +  +  +  +  +  +  +  +  +  +6x +6x +6x +6x +6x +6x +4x +4x +4x +  +  +  +6x +  +6x +  +  +6x +6x +6x +  +  +6x +  +  +6x +4x +4x +4x +4x +  +  +  +  +4x +4x +1x +1x +1x +  +  +  +4x +4x +4x +4x +4x +  +4x +3x +  +1x +1x +  +  +4x +4x +  +  +5x +  +  +  +  +  +  +  +6x +  +  +6x +  +  +6x +  +  +  +  +  +  +6x +6x +2x +2x +1x +  +  +1x +  +  +4x +  +  +  +  +4x +2x +2x +2x +  +  +2x +2x +4x +2x +  +  +2x +2x +  +  +  +2x +2x +  +  +4x +2x +2x +2x +2x +  +  +  +  +  +  +2x +2x +2x +2x +  +2x +2x +2x +  +  +2x +  +  +2x +2x +  +  +  +  +  +2x +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +2x +  +  +1x +  +  +  +1x +  +1x +1x +1x +  +  +  +  +  +  +  +  +1x +  +  +  +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +2x +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +3x +1x +1x +  +2x +2x +2x +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +  +2x +2x +  +  +  +  +  +2x +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +3x +  +  +  +  +  +  +  +  +  +2x +2x +832x +832x +832x +1x +1x +  +831x +830x +  +  +  +  +830x +  +831x +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +1x +  +  +1x +1x +1x +1x +  +  +1x +1x +1x +  +  +  +  +1x +  +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +  +1x +1x +  +1x +1x +1x +  +  +1x +  +  +1x +  +  +  +  +1x +1x +1x +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +  +2x +  +  +  +2x +2x +  +  +2x +1x +  +  +  +  +  +  +  +  +  +1x +  +1x +  +1x +1x +  +  +  +1x +  +  +  +1x +1x +  +  +  +  +  +  +  +  +1x +  +1x +  +1x +  +1x +  +  +  +1x +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +2x +2x +  +  +1x +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +1x +  +1x +1x +1x +1x +1x +1x +1x +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +2x +1x +1x +  +1x +  +  +1x +1x +  +  +  +1x +  +  +1x +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +  +  +  +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +  +  +  +  +2x +  +2x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +  +  +  +1x +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +3x +3x +3x +3x +3x +3x +  +  +  +  +  +  +  +2x +2x +  +  +2x +2x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +1x +1x +  +1x +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +  +  +  +  +  +1x +1x +1x +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +3x +3x +7x +6x +6x +  +3x +  +  +  +3x +3x +3x +3x +  +  +  +  +1x +  +1x +  +  +  +  +1x +  +1x +  +  +1x +  +1x +1x +  +  +  +  +  +  +  +2x +2x +2x +2x +  +  +2x +2x +  +  +  +  +2x +  +  +  +  +  +2x +4x +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +3x +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +3x +  +  + 
#!/usr/bin/env node
+import { execFile, spawn } from "node:child_process";
+import crypto from "node:crypto";
+import fs from "node:fs";
+import net from "node:net";
+import os from "node:os";
+import path from "node:path";
+import process, { stdin as input, stdout as output } from "node:process";
+import readline from "node:readline/promises";
+import { fileURLToPath } from "node:url";
+import { promisify } from "node:util";
+ 
+import bodyParser from "body-parser";
+import chalk from "chalk";
+import { Command } from "commander";
+import dotenv from "dotenv";
+import express, { type Request, type Response } from "express";
+import JSON5 from "json5";
+import Twilio from "twilio";
+import type { MessageInstance } from "twilio/lib/rest/api/v2010/account/message.js";
+import { z } from "zod";
+ 
+import {
+	danger,
+	info,
+	isVerbose,
+	isYes,
+	logVerbose,
+	setVerbose,
+	setYes,
+	success,
+	warn,
+} from "./globals.js";
+import { loginWeb, monitorWebInbox, sendMessageWeb } from "./provider-web.js";
+import { sendCommand } from "./commands/send.js";
+import { statusCommand } from "./commands/status.js";
+import { webhookCommand } from "./commands/webhook.js";
+import { upCommand } from "./commands/up.js";
+import {
+	assertProvider,
+	CONFIG_DIR,
+	normalizeE164,
+	normalizePath,
+	sleep,
+	toWhatsappJid,
+	withWhatsAppPrefix,
+} from "./utils.js";
+ 
+dotenv.config({ quiet: true });
+ 
+const program = new Command();
+ 
+type AuthMode =
+	| { accountSid: string; authToken: string }
+	| { accountSid: string; apiKey: string; apiSecret: string };
+ 
+type CliDeps = {
+	sendMessage: typeof sendMessage;
+	sendMessageWeb: typeof sendMessageWeb;
+	waitForFinalStatus: typeof waitForFinalStatus;
+	assertProvider: typeof assertProvider;
+	createClient?: typeof createClient;
+	monitor: typeof monitor;
+	listRecentMessages: typeof listRecentMessages;
+	ensurePortAvailable: typeof ensurePortAvailable;
+	startWebhook: typeof startWebhook;
+	waitForever: typeof waitForever;
+	ensureBinary: typeof ensureBinary;
+	ensureFunnel: typeof ensureFunnel;
+	getTailnetHostname: typeof getTailnetHostname;
+	readEnv: typeof readEnv;
+	findWhatsappSenderSid: typeof findWhatsappSenderSid;
+	updateWebhook: typeof updateWebhook;
+	handlePortError: typeof handlePortError;
+	monitorWebProvider: typeof monitorWebProvider;
+};
+ 
+function createDefaultDeps(): CliDeps {
+	return {
+		sendMessage,
+		sendMessageWeb,
+		waitForFinalStatus,
+		assertProvider,
+		createClient,
+		monitor,
+		listRecentMessages,
+		ensurePortAvailable,
+		startWebhook,
+		waitForever,
+		ensureBinary,
+		ensureFunnel,
+		getTailnetHostname,
+		readEnv,
+		findWhatsappSenderSid,
+		updateWebhook,
+		handlePortError,
+		monitorWebProvider,
+	};
+}
+ 
+type TwilioRequestOptions = {
+	method: "get" | "post";
+	uri: string;
+	params?: Record<string, string | number>;
+	form?: Record<string, string>;
+	body?: unknown;
+	contentType?: string;
+};
+ 
+type TwilioSender = { sid: string; sender_id: string };
+ 
+type TwilioRequestResponse = {
+	data?: {
+		senders?: TwilioSender[];
+	};
+};
+ 
+type IncomingNumber = {
+	sid: string;
+	phoneNumber: string;
+	smsUrl?: string;
+};
+ 
+type TwilioChannelsSender = {
+	sid?: string;
+	senderId?: string;
+	sender_id?: string;
+	webhook?: {
+		callback_url?: string;
+		callback_method?: string;
+		fallback_url?: string;
+		fallback_method?: string;
+	};
+};
+ 
+type ChannelSenderUpdater = {
+	update: (params: Record<string, string>) => Promise<unknown>;
+};
+ 
+type IncomingPhoneNumberUpdater = {
+	update: (params: Record<string, string>) => Promise<unknown>;
+};
+ 
+type IncomingPhoneNumbersClient = {
+	list: (params: {
+		phoneNumber: string;
+		limit?: number;
+	}) => Promise<IncomingNumber[]>;
+	get: (sid: string) => IncomingPhoneNumberUpdater;
+} & ((sid: string) => IncomingPhoneNumberUpdater);
+ 
+type TwilioSenderListClient = {
+	messaging: {
+		v2: {
+			channelsSenders: {
+				list: (params: {
+					channel: string;
+					pageSize: number;
+				}) => Promise<TwilioChannelsSender[]>;
+				(
+					sid: string,
+				): ChannelSenderUpdater & {
+					fetch: () => Promise<TwilioChannelsSender>;
+				};
+			};
+		};
+		v1: {
+			services: (sid: string) => {
+				update: (params: Record<string, string>) => Promise<unknown>;
+				fetch: () => Promise<{ inboundRequestUrl?: string }>;
+			};
+		};
+	};
+	incomingPhoneNumbers: IncomingPhoneNumbersClient;
+};
+ 
+type TwilioRequester = {
+	request: (options: TwilioRequestOptions) => Promise<TwilioRequestResponse>;
+};
+ 
+type EnvConfig = {
+	accountSid: string;
+	whatsappFrom: string;
+	whatsappSenderSid?: string;
+	auth: AuthMode;
+};
+ 
+type RuntimeEnv = {
+	log: typeof console.log;
+	error: typeof console.error;
+	exit: (code: number) => never;
+};
+ 
+const defaultRuntime: RuntimeEnv = {
+	log: console.log,
+	error: console.error,
+	exit: (code) => {
+		process.exit(code);
+		throw new Error("unreachable"); // satisfies tests when mocked
+	},
+};
+ 
+const EnvSchema = z
+	.object({
+		TWILIO_ACCOUNT_SID: z.string().min(1, "TWILIO_ACCOUNT_SID required"),
+		TWILIO_WHATSAPP_FROM: z.string().min(1, "TWILIO_WHATSAPP_FROM required"),
+		TWILIO_SENDER_SID: z.string().optional(),
+		TWILIO_AUTH_TOKEN: z.string().optional(),
+		TWILIO_API_KEY: z.string().optional(),
+		TWILIO_API_SECRET: z.string().optional(),
+	})
+	.superRefine((val, ctx) => {
+		Iif (val.TWILIO_API_KEY && !val.TWILIO_API_SECRET) {
+			ctx.addIssue({
+				code: "custom",
+				message: "TWILIO_API_SECRET required when TWILIO_API_KEY is set",
+			});
+		}
+		Iif (val.TWILIO_API_SECRET && !val.TWILIO_API_KEY) {
+			ctx.addIssue({
+				code: "custom",
+				message: "TWILIO_API_KEY required when TWILIO_API_SECRET is set",
+			});
+		}
+		Iif (!val.TWILIO_AUTH_TOKEN && !(val.TWILIO_API_KEY && val.TWILIO_API_SECRET)) {
+			ctx.addIssue({
+				code: "custom",
+				message:
+					"Provide TWILIO_AUTH_TOKEN or both TWILIO_API_KEY and TWILIO_API_SECRET",
+			});
+		}
+	});
+ 
+function readEnv(runtime: RuntimeEnv = defaultRuntime): EnvConfig {
+	// Load and validate Twilio auth + sender configuration from env.
+	const parsed = EnvSchema.safeParse(process.env);
+	Iif (!parsed.success) {
+		runtime.error("Invalid environment configuration:");
+		parsed.error.issues.forEach((iss) => runtime.error(`- ${iss.message}`));
+		runtime.exit(1);
+	}
+ 
+	const {
+		TWILIO_ACCOUNT_SID: accountSid,
+		TWILIO_WHATSAPP_FROM: whatsappFrom,
+		TWILIO_SENDER_SID: whatsappSenderSid,
+		TWILIO_AUTH_TOKEN: authToken,
+		TWILIO_API_KEY: apiKey,
+		TWILIO_API_SECRET: apiSecret,
+	} = parsed.data;
+ 
+	const auth: AuthMode =
+		apiKey && apiSecret
+			? { accountSid, apiKey, apiSecret }
+			: { accountSid, authToken: authToken! };
+ 
+	return {
+		accountSid,
+		whatsappFrom,
+		whatsappSenderSid,
+		auth,
+	};
+}
+ 
+const execFileAsync = promisify(execFile);
+ 
+type ExecResult = { stdout: string; stderr: string };
+ 
+type ExecOptions = { maxBuffer?: number; timeoutMs?: number };
+ 
+async function runExec(
+	command: string,
+	args: string[],
+	{ maxBuffer = 2_000_000, timeoutMs }: ExecOptions = {},
+): Promise<ExecResult> {
+	// Thin wrapper around execFile with utf8 output.
+	Iif (isVerbose()) {
+		console.log(`$ ${command} ${args.join(" ")}`);
+	}
+	try {
+		const { stdout, stderr } = await execFileAsync(command, args, {
+			maxBuffer,
+			encoding: "utf8",
+			timeout: timeoutMs,
+		});
+		Iif (isVerbose()) {
+			if (stdout.trim()) console.log(stdout.trim());
+			if (stderr.trim()) console.error(stderr.trim());
+		}
+		return { stdout, stderr };
+	} catch (err) {
+		if (isVerbose()) {
+			console.error(danger(`Command failed: ${command} ${args.join(" ")}`));
+		}
+		throw err;
+	}
+}
+ 
+type SpawnResult = {
+	stdout: string;
+	stderr: string;
+	code: number | null;
+	signal: NodeJS.Signals | null;
+	killed: boolean;
+};
+ 
+async function runCommandWithTimeout(
+	argv: string[],
+	timeoutMs: number,
+): Promise<SpawnResult> {
+	// Spawn with inherited stdin (TTY) so tools like `claude` don't hang.
+	return await new Promise((resolve, reject) => {
+		const child = spawn(argv[0], argv.slice(1), {
+			stdio: ["inherit", "pipe", "pipe"],
+		});
+		let stdout = "";
+		let stderr = "";
+		let settled = false;
+		const timer = setTimeout(() => {
+			child.kill("SIGKILL");
+		}, timeoutMs);
+ 
+		child.stdout?.on("data", (d) => {
+			stdout += d.toString();
+		});
+		child.stderr?.on("data", (d) => {
+			stderr += d.toString();
+		});
+		child.on("error", (err) => {
+			if (settled) return;
+			settled = true;
+			clearTimeout(timer);
+			reject(err);
+		});
+		child.on("close", (code, signal) => {
+			Iif (settled) return;
+			settled = true;
+			clearTimeout(timer);
+			resolve({ stdout, stderr, code, signal, killed: child.killed });
+		});
+	});
+}
+ 
+class PortInUseError extends Error {
+	port: number;
+ 
+	details?: string;
+ 
+	constructor(port: number, details?: string) {
+		super(`Port ${port} is already in use.`);
+		this.name = "PortInUseError";
+		this.port = port;
+		this.details = details;
+	}
+}
+ 
+function isErrno(err: unknown): err is NodeJS.ErrnoException {
+	return Boolean(err && typeof err === "object" && "code" in err);
+}
+ 
+async function describePortOwner(port: number): Promise<string | undefined> {
+	// Best-effort process info for a listening port (macOS/Linux).
+	try {
+		const { stdout } = await runExec("lsof", [
+			"-i",
+			`tcp:${port}`,
+			"-sTCP:LISTEN",
+			"-nP",
+		]);
+		const trimmed = stdout.trim();
+		Eif (trimmed) return trimmed;
+	} catch (err) {
+		logVerbose(`lsof unavailable: ${String(err)}`);
+	}
+	return undefined;
+}
+ 
+async function ensurePortAvailable(port: number): Promise<void> {
+	// Detect EADDRINUSE early with a friendly message.
+	try {
+		await new Promise<void>((resolve, reject) => {
+			const tester = net
+				.createServer()
+				.once("error", (err) => reject(err))
+				.once("listening", () => {
+					tester.close(() => resolve());
+				})
+				.listen(port);
+		});
+	} catch (err) {
+		Eif (isErrno(err) && err.code === "EADDRINUSE") {
+			const details = await describePortOwner(port);
+			throw new PortInUseError(port, details);
+		}
+		throw err;
+	}
+}
+ 
+async function handlePortError(
+	err: unknown,
+	port: number,
+	context: string,
+	runtime: RuntimeEnv = defaultRuntime,
+): Promise<never> {
+	Eif (
+		err instanceof PortInUseError ||
+		(isErrno(err) && err.code === "EADDRINUSE")
+	) {
+		const details =
+			err instanceof PortInUseError
+				? err.details
+				: await describePortOwner(port);
+		runtime.error(danger(`${context} failed: port ${port} is already in use.`));
+		if (details) {
+			runtime.error(info("Port listener details:"));
+			runtime.error(details);
+			if (/warelay|src\/index\.ts|dist\/index\.js/.test(details)) {
+				runtime.error(
+					warn(
+						"It looks like another warelay instance is already running. Stop it or pick a different port.",
+					),
+				);
+			}
+		}
+		runtime.error(
+			info(
+				"Resolve by stopping the process using the port or passing --port <free-port>.",
+			),
+		);
+		runtime.exit(1);
+	}
+	runtime.error(danger(`${context} failed: ${String(err)}`));
+	return runtime.exit(1);
+}
+ 
+async function ensureBinary(
+	name: string,
+	exec: typeof runExec = runExec,
+	runtime: RuntimeEnv = defaultRuntime,
+): Promise<void> {
+	// Abort early if a required CLI tool is missing.
+	await exec("which", [name]).catch(() => {
+		runtime.error(`Missing required binary: ${name}. Please install it.`);
+		runtime.exit(1);
+	});
+}
+ 
+async function promptYesNo(
+	question: string,
+	defaultYes = false,
+): Promise<boolean> {
+	if (isVerbose() && isYes()) return true; // redundant guard when both flags set
+	if (isYes()) return true;
+	const rl = readline.createInterface({ input, output });
+	const suffix = defaultYes ? " [Y/n] " : " [y/N] ";
+	const answer = (await rl.question(`${question}${suffix}`))
+		.trim()
+		.toLowerCase();
+	rl.close();
+	if (!answer) return defaultYes;
+	return answer.startsWith("y");
+}
+ 
+const CONFIG_PATH = path.join(os.homedir(), ".warelay", "warelay.json");
+ 
+type ReplyMode = "text" | "command";
+ 
+type WarelayConfig = {
+	inbound?: {
+		allowFrom?: string[]; // E.164 numbers allowed to trigger auto-reply (without whatsapp:)
+		reply?: {
+			mode: ReplyMode;
+			text?: string; // for mode=text, can contain {{Body}}
+			command?: string[]; // for mode=command, argv with templates
+			template?: string; // prepend template string when building command/prompt
+			timeoutSeconds?: number; // optional command timeout; defaults to 600s
+			bodyPrefix?: string; // optional string prepended to Body before templating
+			session?: SessionConfig;
+		};
+	};
+};
+ 
+type SessionScope = "per-sender" | "global";
+ 
+type SessionConfig = {
+	scope?: SessionScope;
+	resetTriggers?: string[];
+	idleMinutes?: number;
+	store?: string;
+	sessionArgNew?: string[];
+	sessionArgResume?: string[];
+	sessionArgBeforeBody?: boolean;
+};
+ 
+function loadConfig(): WarelayConfig {
+	// Read ~/.warelay/warelay.json (JSON5) if present.
+	try {
+		Iif (!fs.existsSync(CONFIG_PATH)) return {};
+		const raw = fs.readFileSync(CONFIG_PATH, "utf-8");
+		const parsed = JSON5.parse(raw);
+		Iif (typeof parsed !== "object" || parsed === null) return {};
+		return parsed as WarelayConfig;
+	} catch (err) {
+		console.error(`Failed to read config at ${CONFIG_PATH}`, err);
+		return {};
+	}
+}
+ 
+type MsgContext = {
+	Body?: string;
+	From?: string;
+	To?: string;
+	MessageSid?: string;
+};
+ 
+type GetReplyOptions = {
+	onReplyStart?: () => Promise<void> | void;
+};
+ 
+function applyTemplate(str: string, ctx: TemplateContext) {
+	// Simple {{Placeholder}} interpolation using inbound message context.
+	return str.replace(/{{\s*(\w+)\s*}}/g, (_, key) => {
+		const value = (ctx as Record<string, unknown>)[key];
+		return value == null ? "" : String(value);
+	});
+}
+ 
+type TemplateContext = MsgContext & {
+	BodyStripped?: string;
+	SessionId?: string;
+	IsNewSession?: string;
+};
+ 
+type SessionEntry = { sessionId: string; updatedAt: number };
+ 
+const SESSION_STORE_DEFAULT = path.join(CONFIG_DIR, "sessions.json");
+const DEFAULT_RESET_TRIGGER = "/new";
+const DEFAULT_IDLE_MINUTES = 60;
+ 
+function resolveStorePath(store?: string) {
+	if (!store) return SESSION_STORE_DEFAULT;
+	Iif (store.startsWith("~")) return path.resolve(store.replace("~", os.homedir()));
+	return path.resolve(store);
+}
+ 
+function loadSessionStore(storePath: string): Record<string, SessionEntry> {
+	try {
+		const raw = fs.readFileSync(storePath, "utf-8");
+		const parsed = JSON5.parse(raw);
+		if (parsed && typeof parsed === "object") {
+			return parsed as Record<string, SessionEntry>;
+		}
+	} catch {
+		// ignore missing/invalid store; we'll recreate it
+	}
+	return {};
+}
+ 
+async function saveSessionStore(storePath: string, store: Record<string, SessionEntry>) {
+	await fs.promises.mkdir(path.dirname(storePath), { recursive: true });
+	await fs.promises.writeFile(storePath, JSON.stringify(store, null, 2), "utf-8");
+}
+ 
+function deriveSessionKey(scope: SessionScope, ctx: MsgContext) {
+	Iif (scope === "global") return "global";
+	const from = ctx.From ? normalizeE164(ctx.From) : "";
+	return from || "unknown";
+}
+ 
+async function getReplyFromConfig(
+	ctx: MsgContext,
+	opts?: GetReplyOptions,
+	configOverride?: WarelayConfig,
+	commandRunner: typeof runCommandWithTimeout = runCommandWithTimeout,
+): Promise<string | undefined> {
+	// Choose reply from config: static text or external command stdout.
+	const cfg = configOverride ?? loadConfig();
+	const reply = cfg.inbound?.reply;
+	const timeoutSeconds = Math.max(reply?.timeoutSeconds ?? 600, 1);
+	const timeoutMs = timeoutSeconds * 1000;
+	let started = false;
+	const onReplyStart = async () => {
+		Iif (started) return;
+		started = true;
+		await opts?.onReplyStart?.();
+	};
+ 
+	// Optional session handling (conversation reuse + /new resets)
+	const sessionCfg = reply?.session;
+	const resetTriggers =
+		sessionCfg?.resetTriggers?.length
+			? sessionCfg.resetTriggers
+			: [DEFAULT_RESET_TRIGGER];
+	const idleMinutes = Math.max(sessionCfg?.idleMinutes ?? DEFAULT_IDLE_MINUTES, 1);
+	const sessionScope = sessionCfg?.scope ?? "per-sender";
+	const storePath = resolveStorePath(sessionCfg?.store);
+ 
+	let sessionId: string | undefined;
+	let isNewSession = false;
+	let bodyStripped: string | undefined;
+ 
+	if (sessionCfg) {
+		const trimmedBody = (ctx.Body ?? "").trim();
+		for (const trigger of resetTriggers) {
+			Iif (!trigger) continue;
+			Iif (trimmedBody === trigger) {
+				isNewSession = true;
+				bodyStripped = "";
+				break;
+			}
+			const triggerPrefix = `${trigger} `;
+			if (trimmedBody.startsWith(triggerPrefix)) {
+				isNewSession = true;
+				bodyStripped = trimmedBody.slice(trigger.length).trimStart();
+				break;
+			}
+		}
+ 
+		const sessionKey = deriveSessionKey(sessionScope, ctx);
+		const store = loadSessionStore(storePath);
+		const entry = store[sessionKey];
+		const idleMs = idleMinutes * 60_000;
+		const freshEntry = entry && Date.now() - entry.updatedAt <= idleMs;
+ 
+		if (!isNewSession && freshEntry) {
+			sessionId = entry.sessionId;
+		} else {
+			sessionId = crypto.randomUUID();
+			isNewSession = true;
+		}
+ 
+		store[sessionKey] = { sessionId, updatedAt: Date.now() };
+		await saveSessionStore(storePath, store);
+	}
+ 
+	const sessionCtx: TemplateContext = {
+		...ctx,
+		BodyStripped: bodyStripped ?? ctx.Body,
+		SessionId: sessionId,
+		IsNewSession: isNewSession ? "true" : "false",
+	};
+ 
+	// Optional prefix injected before Body for templating/command prompts.
+	const bodyPrefix = reply?.bodyPrefix
+		? applyTemplate(reply.bodyPrefix, sessionCtx)
+		: "";
+	const prefixedBody = bodyPrefix
+		? `${bodyPrefix}${sessionCtx.BodyStripped ?? sessionCtx.Body ?? ""}`
+		: sessionCtx.BodyStripped ?? sessionCtx.Body;
+	const templatingCtx: TemplateContext = {
+		...sessionCtx,
+		Body: prefixedBody,
+		BodyStripped: prefixedBody,
+	};
+ 
+	// Optional allowlist by origin number (E.164 without whatsapp: prefix)
+	const allowFrom = cfg.inbound?.allowFrom;
+	if (Array.isArray(allowFrom) && allowFrom.length > 0) {
+		const from = (ctx.From ?? "").replace(/^whatsapp:/, "");
+		if (!allowFrom.includes(from)) {
+			logVerbose(
+				`Skipping auto-reply: sender ${from || "<unknown>"} not in allowFrom list`,
+			);
+			return undefined;
+		}
+	}
+	Iif (!reply) {
+		logVerbose("No inbound.reply configured; skipping auto-reply");
+		return undefined;
+	}
+ 
+	if (reply.mode === "text" && reply.text) {
+		await onReplyStart();
+		logVerbose("Using text auto-reply from config");
+		return applyTemplate(reply.text, templatingCtx);
+	}
+ 
+	Eif (reply.mode === "command" && reply.command?.length) {
+		await onReplyStart();
+		let argv = reply.command.map((part) => applyTemplate(part, templatingCtx));
+		const templatePrefix = reply.template
+			? applyTemplate(reply.template, templatingCtx)
+			: "";
+		Eif (templatePrefix && argv.length > 0) {
+			argv = [argv[0], templatePrefix, ...argv.slice(1)];
+		}
+ 
+		// Inject session args if configured (use resume for existing, session-id for new)
+		Eif (reply.session) {
+			const sessionArgList = (isNewSession
+				? reply.session.sessionArgNew ?? ["--session-id", "{{SessionId}}"]
+				: reply.session.sessionArgResume ?? ["--resume", "{{SessionId}}"]
+			).map((part) => applyTemplate(part, templatingCtx));
+			Eif (sessionArgList.length) {
+				const insertBeforeBody = reply.session.sessionArgBeforeBody ?? true;
+				const insertAt = insertBeforeBody && argv.length > 1 ? argv.length - 1 : argv.length;
+				argv = [
+					...argv.slice(0, insertAt),
+					...sessionArgList,
+					...argv.slice(insertAt),
+				];
+			}
+		}
+		const finalArgv = argv;
+		logVerbose(`Running command auto-reply: ${finalArgv.join(" ")}`);
+		const started = Date.now();
+		try {
+			const { stdout, stderr, code, signal, killed } =
+				await commandRunner(finalArgv, timeoutMs);
+			const trimmed = stdout.trim();
+			Iif (stderr?.trim()) {
+				logVerbose(`Command auto-reply stderr: ${stderr.trim()}`);
+			}
+			logVerbose(
+				`Command auto-reply stdout (trimmed): ${trimmed || "<empty>"}`,
+			);
+			logVerbose(`Command auto-reply finished in ${Date.now() - started}ms`);
+			Iif ((code ?? 0) !== 0) {
+				console.error(
+					`Command auto-reply exited with code ${code ?? "unknown"} (signal: ${signal ?? "none"})`,
+				);
+				return undefined;
+			}
+			Iif (killed && !signal) {
+				console.error(
+					`Command auto-reply process killed before completion (exit code ${code ?? "unknown"})`,
+				);
+				return undefined;
+			}
+			return trimmed || undefined;
+		} catch (err) {
+			const elapsed = Date.now() - started;
+			const anyErr = err as { killed?: boolean; signal?: string };
+			const timeoutHit = anyErr.killed === true || anyErr.signal === "SIGKILL";
+			const errorObj = err as {
+				stdout?: string;
+				stderr?: string;
+			};
+			if (errorObj.stderr?.trim()) {
+				logVerbose(`Command auto-reply stderr: ${errorObj.stderr.trim()}`);
+			}
+			if (timeoutHit) {
+				console.error(
+					`Command auto-reply timed out after ${elapsed}ms (limit ${timeoutMs}ms)`,
+				);
+			} else {
+				console.error(`Command auto-reply failed after ${elapsed}ms`, err);
+			}
+			return undefined;
+		}
+	}
+ 
+	return undefined;
+}
+ 
+async function autoReplyIfConfigured(
+	client: ReturnType<typeof createClient>,
+	message: MessageInstance,
+	configOverride?: WarelayConfig,
+	runtime: RuntimeEnv = defaultRuntime,
+): Promise<void> {
+	// Fire a config-driven reply (text or command) for the inbound message, if configured.
+	const ctx: MsgContext = {
+		Body: message.body ?? undefined,
+		From: message.from ?? undefined,
+		To: message.to ?? undefined,
+		MessageSid: message.sid,
+	};
+ 
+	const replyText = await getReplyFromConfig(
+		ctx,
+		{
+			onReplyStart: () => sendTypingIndicator(client, message.sid, runtime),
+		},
+		configOverride,
+	);
+	Iif (!replyText) return;
+ 
+	const replyFrom = message.to;
+	const replyTo = message.from;
+	Iif (!replyFrom || !replyTo) {
+	if (isVerbose())
+		console.error(
+			"Skipping auto-reply: missing to/from on inbound message",
+			ctx,
+			);
+		return;
+	}
+ 
+	logVerbose(
+		`Auto-replying via Twilio: from ${replyFrom} to ${replyTo}, body length ${replyText.length}`,
+	);
+ 
+	try {
+		await client.messages.create({
+			from: replyFrom,
+			to: replyTo,
+			body: replyText,
+		});
+		Iif (isVerbose()) {
+			console.log(
+				success(
+					`↩️  Auto-replied to ${replyTo} (sid ${message.sid ?? "no-sid"})`,
+				),
+			);
+		}
+	} catch (err) {
+		logTwilioSendError(err, replyTo ?? undefined, runtime);
+	}
+}
+ 
+function createClient(env: EnvConfig) {
+	// Twilio client using either auth token or API key/secret.
+	if ("authToken" in env.auth) {
+		return Twilio(env.accountSid, env.auth.authToken, {
+			accountSid: env.accountSid,
+		});
+	}
+	return Twilio(env.auth.apiKey, env.auth.apiSecret, {
+		accountSid: env.accountSid,
+	});
+}
+ 
+async function sendTypingIndicator(
+	client: ReturnType<typeof createClient>,
+	messageSid?: string,
+	runtime: RuntimeEnv = defaultRuntime,
+) {
+	// Best-effort WhatsApp typing indicator (public beta as of Nov 2025).
+	if (!messageSid) {
+		logVerbose("Skipping typing indicator: missing MessageSid");
+		return;
+	}
+	try {
+		const requester = client as unknown as TwilioRequester;
+		await requester.request({
+			method: "post",
+			uri: "https://messaging.twilio.com/v2/Indicators/Typing.json",
+			form: {
+				messageId: messageSid,
+				channel: "whatsapp",
+			},
+		});
+		logVerbose(`Sent typing indicator for inbound ${messageSid}`);
+	} catch (err) {
+		if (isVerbose()) {
+			runtime.error(warn("Typing indicator failed (continuing without it)"));
+			runtime.error(err as Error);
+		}
+	}
+}
+ 
+async function sendMessage(
+	to: string,
+	body: string,
+	runtime: RuntimeEnv = defaultRuntime,
+) {
+	// Send outbound WhatsApp message; exit non-zero on API failure.
+	const env = readEnv(runtime);
+	const client = createClient(env);
+	const from = withWhatsAppPrefix(env.whatsappFrom);
+	const toNumber = withWhatsAppPrefix(to);
+ 
+	try {
+		const message = await client.messages.create({
+			from,
+			to: toNumber,
+			body,
+		});
+ 
+		console.log(
+			success(
+				`✅ Request accepted. Message SID: ${message.sid} -> ${toNumber}`,
+			),
+		);
+		return { client, sid: message.sid };
+	} catch (err) {
+		const anyErr = err as {
+			code?: string | number;
+			message?: unknown;
+			moreInfo?: unknown;
+			status?: string | number;
+			response?: { body?: unknown };
+		};
+		const { code, status } = anyErr;
+		const msg =
+			typeof anyErr?.message === "string"
+				? anyErr.message
+			: (anyErr?.message ?? err);
+		const more = anyErr?.moreInfo;
+		runtime.error(
+			`❌ Twilio send failed${code ? ` (code ${code})` : ""}${status ? ` status ${status}` : ""}: ${msg}`,
+		);
+		if (more) console.error(`More info: ${more}`);
+		// Some Twilio errors include response.body with more context.
+		const responseBody = anyErr?.response?.body;
+		if (responseBody) {
+			console.error("Response body:", JSON.stringify(responseBody, null, 2));
+		}
+		runtime.exit(1);
+	}
+}
+ 
+const successTerminalStatuses = new Set(["delivered", "read"]);
+const failureTerminalStatuses = new Set(["failed", "undelivered", "canceled"]);
+ 
+async function waitForFinalStatus(
+	client: ReturnType<typeof createClient>,
+	sid: string,
+	timeoutSeconds: number,
+	pollSeconds: number,
+	runtime: RuntimeEnv = defaultRuntime,
+) {
+	// Poll message status until delivered/failed or timeout.
+	const deadline = Date.now() + timeoutSeconds * 1000;
+	while (Date.now() < deadline) {
+		const m = await client.messages(sid).fetch();
+		const status = m.status ?? "unknown";
+		if (successTerminalStatuses.has(status)) {
+			console.log(success(`✅ Delivered (status: ${status})`));
+			return;
+		}
+		if (failureTerminalStatuses.has(status)) {
+			runtime.error(
+				`❌ Delivery failed (status: ${status}${
+					m.errorCode ? `, code ${m.errorCode}` : ""
+				})${m.errorMessage ? `: ${m.errorMessage}` : ""}`,
+			);
+			runtime.exit(1);
+		}
+		await sleep(pollSeconds * 1000);
+	}
+	console.log(
+		"ℹ️  Timed out waiting for final status; message may still be in flight.",
+	);
+}
+ 
+async function startWebhook(
+	port: number,
+	path = "/webhook/whatsapp",
+	autoReply: string | undefined,
+	verbose: boolean,
+	runtime: RuntimeEnv = defaultRuntime,
+): Promise<import("http").Server> {
+	const normalizedPath = normalizePath(path);
+	// Start Express webhook; generate replies via config or CLI flag.
+	const env = readEnv(runtime);
+	const app = express();
+ 
+	// Twilio sends application/x-www-form-urlencoded
+	app.use(bodyParser.urlencoded({ extended: false }));
+	app.use((req, _res, next) => {
+		runtime.log(chalk.gray(`REQ ${req.method} ${req.url}`));
+		next();
+	});
+ 
+	app.post(normalizedPath, async (req: Request, res: Response) => {
+		const { From, To, Body, MessageSid } = req.body ?? {};
+		console.log(
+			`[INBOUND] ${From ?? "unknown"} -> ${To ?? "unknown"} (${
+				MessageSid ?? "no-sid"
+			})`,
+		);
+		Iif (verbose) runtime.log(chalk.gray(`Body: ${Body ?? ""}`));
+ 
+		const client = createClient(env);
+		let replyText = autoReply;
+		Eif (!replyText) {
+			replyText = await getReplyFromConfig(
+				{
+					Body,
+					From,
+					To,
+					MessageSid,
+				},
+				{
+					onReplyStart: () => sendTypingIndicator(client, MessageSid, runtime),
+				},
+			);
+		}
+ 
+		Iif (replyText) {
+			try {
+				await client.messages.create({
+					from: To,
+					to: From,
+					body: replyText,
+				});
+				if (verbose) {
+					runtime.log(success(`↩️  Auto-replied to ${From}`));
+				}
+			} catch (err) {
+				logTwilioSendError(err, From ?? undefined, runtime);
+			}
+		}
+ 
+		// Respond 200 OK to Twilio
+		res.type("text/xml").send("<Response></Response>");
+	});
+ 
+	app.use((_req, res) => {
+		if (verbose) runtime.log(chalk.yellow(`404 ${_req.method} ${_req.url}`));
+		res.status(404).send("warelay webhook: not found");
+	});
+ 
+	return await new Promise((resolve, reject) => {
+		const server = app.listen(port);
+ 
+		const onListening = () => {
+			cleanup();
+			runtime.log(
+				`📥 Webhook listening on http://localhost:${port}${normalizedPath}`,
+			);
+			resolve(server);
+		};
+ 
+		const onError = (err: NodeJS.ErrnoException) => {
+			cleanup();
+			reject(err);
+		};
+ 
+		const cleanup = () => {
+			server.off("listening", onListening);
+			server.off("error", onError);
+		};
+ 
+		server.once("listening", onListening);
+		server.once("error", onError);
+	});
+}
+ 
+function waitForever() {
+	// Keep event loop alive via an unref'ed interval plus a pending promise.
+	const interval = setInterval(() => {}, 1_000_000);
+	interval.unref();
+	return new Promise<void>(() => {
+		/* never resolve */
+	});
+}
+ 
+async function getTailnetHostname(exec: typeof runExec = runExec) {
+	// Derive tailnet hostname (or IP fallback) from tailscale status JSON.
+	const { stdout } = await exec("tailscale", ["status", "--json"]);
+	const parsed = stdout ? (JSON.parse(stdout) as Record<string, unknown>) : {};
+	const self =
+		typeof parsed.Self === "object" && parsed.Self !== null
+			? (parsed.Self as Record<string, unknown>)
+			: undefined;
+	const dns =
+		typeof self?.DNSName === "string" ? (self.DNSName as string) : undefined;
+	const ips = Array.isArray(self?.TailscaleIPs)
+		? (self.TailscaleIPs as string[])
+		: [];
+	if (dns && dns.length > 0) return dns.replace(/\.$/, "");
+	Eif (ips.length > 0) return ips[0];
+	throw new Error("Could not determine Tailscale DNS or IP");
+}
+ 
+async function ensureGoInstalled(
+	exec: typeof runExec = runExec,
+	prompt: typeof promptYesNo = promptYesNo,
+	runtime: RuntimeEnv = defaultRuntime,
+) {
+	// Ensure Go toolchain is present; offer Homebrew install if missing.
+	const hasGo = await exec("go", ["version"]).then(
+		() => true,
+		() => false,
+	);
+	Iif (hasGo) return;
+	const install = await prompt(
+		"Go is not installed. Install via Homebrew (brew install go)?",
+		true,
+	);
+	Iif (!install) {
+		runtime.error("Go is required to build tailscaled from source. Aborting.");
+		runtime.exit(1);
+	}
+	logVerbose("Installing Go via Homebrew…");
+	await exec("brew", ["install", "go"]);
+}
+ 
+async function ensureTailscaledInstalled(
+	exec: typeof runExec = runExec,
+	prompt: typeof promptYesNo = promptYesNo,
+	runtime: RuntimeEnv = defaultRuntime,
+) {
+	// Ensure tailscaled binary exists; install via Homebrew tailscale if missing.
+	const hasTailscaled = await exec("tailscaled", ["--version"]).then(
+		() => true,
+		() => false,
+	);
+	Iif (hasTailscaled) return;
+ 
+	const install = await prompt(
+		"tailscaled not found. Install via Homebrew (tailscale package)?",
+		true,
+	);
+	Iif (!install) {
+		runtime.error("tailscaled is required for user-space funnel. Aborting.");
+		runtime.exit(1);
+	}
+	logVerbose("Installing tailscaled via Homebrew…");
+	await exec("brew", ["install", "tailscale"]);
+}
+ 
+async function ensureFunnel(
+	port: number,
+	exec: typeof runExec = runExec,
+	runtime: RuntimeEnv = defaultRuntime,
+	prompt: typeof promptYesNo = promptYesNo,
+) {
+	// Ensure Funnel is enabled and publish the webhook port.
+	try {
+		const statusOut = (
+			await exec("tailscale", ["funnel", "status", "--json"])
+		).stdout.trim();
+		const parsed = statusOut
+			? (JSON.parse(statusOut) as Record<string, unknown>)
+			: {};
+		Iif (!parsed || Object.keys(parsed).length === 0) {
+			runtime.error(
+				danger("Tailscale Funnel is not enabled on this tailnet/device."),
+			);
+			runtime.error(
+				info(
+					"Enable in admin console: https://login.tailscale.com/admin (see https://tailscale.com/kb/1223/funnel)",
+				),
+			);
+			runtime.error(
+				info(
+					"macOS user-space tailscaled docs: https://github.com/tailscale/tailscale/wiki/Tailscaled-on-macOS",
+				),
+			);
+			const proceed = await prompt(
+				"Attempt local setup with user-space tailscaled?",
+				true,
+			);
+			if (!proceed) runtime.exit(1);
+			await ensureGoInstalled(exec, prompt, runtime);
+			await ensureTailscaledInstalled(exec, prompt, runtime);
+		}
+ 
+		logVerbose(`Enabling funnel on port ${port}…`);
+		const { stdout } = await exec(
+			"tailscale",
+			["funnel", "--yes", "--bg", `${port}`],
+			{
+				maxBuffer: 200_000,
+				timeoutMs: 15_000,
+			},
+		);
+		Eif (stdout.trim()) console.log(stdout.trim());
+	} catch (err) {
+		const errOutput = err as { stdout?: unknown; stderr?: unknown };
+		const stdout = typeof errOutput.stdout === "string" ? errOutput.stdout : "";
+		const stderr = typeof errOutput.stderr === "string" ? errOutput.stderr : "";
+		Eif (stdout.includes("Funnel is not enabled")) {
+			console.error(danger("Funnel is not enabled on this tailnet/device."));
+			const linkMatch = stdout.match(/https?:\/\/\S+/);
+			Iif (linkMatch) {
+				console.error(info(`Enable it here: ${linkMatch[0]}`));
+			} else {
+				console.error(
+					info(
+						"Enable in admin console: https://login.tailscale.com/admin (see https://tailscale.com/kb/1223/funnel)",
+					),
+				);
+			}
+		}
+		Iif (
+			stderr.includes("client version") ||
+			stdout.includes("client version")
+		) {
+			console.error(
+				warn(
+					"Tailscale client/server version mismatch detected; try updating tailscale/tailscaled.",
+				),
+			);
+		}
+		runtime.error(
+			"Failed to enable Tailscale Funnel. Is it allowed on your tailnet?",
+		);
+		runtime.error(
+			info(
+				"Tip: you can fall back to polling (no webhooks needed): `pnpm warelay poll --interval 5 --lookback 10`",
+			),
+		);
+		Iif (isVerbose()) {
+			if (stdout.trim()) runtime.error(chalk.gray(`stdout: ${stdout.trim()}`));
+			if (stderr.trim()) runtime.error(chalk.gray(`stderr: ${stderr.trim()}`));
+			runtime.error(err as Error);
+		}
+		runtime.exit(1);
+	}
+}
+ 
+async function findWhatsappSenderSid(
+	client: ReturnType<typeof createClient>,
+	from: string,
+	explicitSenderSid?: string,
+	runtime: RuntimeEnv = defaultRuntime,
+) {
+	// Use explicit sender SID if provided, otherwise list and match by sender_id.
+	if (explicitSenderSid) {
+		logVerbose(`Using TWILIO_SENDER_SID from env: ${explicitSenderSid}`);
+		return explicitSenderSid;
+	}
+	try {
+		// Prefer official SDK list helper to avoid request-shape mismatches.
+		// Twilio helper types are broad; we narrow to expected shape.
+		const senderClient = client as unknown as TwilioSenderListClient;
+		const senders = await senderClient.messaging.v2.channelsSenders.list({
+			channel: "whatsapp",
+			pageSize: 50,
+		});
+		Iif (!senders) {
+			throw new Error('List senders response missing "senders" array');
+		}
+		const match = senders.find(
+			(s) =>
+				(typeof s.senderId === "string" &&
+					s.senderId === withWhatsAppPrefix(from)) ||
+				(typeof s.sender_id === "string" &&
+					s.sender_id === withWhatsAppPrefix(from)),
+		);
+		Iif (!match || typeof match.sid !== "string") {
+			throw new Error(
+				`Could not find sender ${withWhatsAppPrefix(from)} in Twilio account`,
+			);
+		}
+		return match.sid;
+	} catch (err) {
+		runtime.error(danger("Unable to list WhatsApp senders via Twilio API."));
+		if (isVerbose()) {
+			runtime.error(err as Error);
+		}
+		runtime.error(
+			info(
+				"Set TWILIO_SENDER_SID in .env to skip discovery (Twilio Console → Messaging → Senders → WhatsApp).",
+			),
+		);
+		runtime.exit(1);
+	}
+}
+ 
+async function findIncomingNumberSid(
+	client: TwilioSenderListClient,
+): Promise<string | null> {
+	// Try to locate the underlying phone number and return its SID for webhook fallback.
+	const env = readEnv();
+	const phone = env.whatsappFrom.replace("whatsapp:", "");
+	try {
+		const list = await client.incomingPhoneNumbers.list({
+			phoneNumber: phone,
+			limit: 2,
+		});
+		Iif (!list || list.length === 0) return null;
+		Iif (list.length > 1 && isVerbose()) {
+			console.error(
+				warn("Multiple incoming numbers matched; using the first."),
+			);
+		}
+		return list[0]?.sid ?? null;
+	} catch (err) {
+		if (isVerbose()) console.error("incomingPhoneNumbers.list failed", err);
+		return null;
+	}
+}
+ 
+async function findMessagingServiceSid(
+	client: TwilioSenderListClient,
+): Promise<string | null> {
+	// Attempt to locate a messaging service tied to the WA phone number (webhook fallback).
+	type IncomingNumberWithService = { messagingServiceSid?: string };
+	try {
+		const env = readEnv();
+		const phone = env.whatsappFrom.replace("whatsapp:", "");
+		const list = await client.incomingPhoneNumbers.list({
+			phoneNumber: phone,
+			limit: 1,
+		});
+		const msid =
+			(list?.[0] as IncomingNumberWithService | undefined)
+				?.messagingServiceSid ?? null;
+		return msid;
+	} catch (err) {
+		if (isVerbose()) console.error("findMessagingServiceSid failed", err);
+		return null;
+	}
+}
+ 
+async function setMessagingServiceWebhook(
+	client: TwilioSenderListClient,
+	url: string,
+	method: "POST" | "GET",
+): Promise<boolean> {
+	const msid = await findMessagingServiceSid(client);
+	Iif (!msid) return false;
+	try {
+		await client.messaging.v1.services(msid).update({
+			InboundRequestUrl: url,
+			InboundRequestMethod: method,
+		});
+		const fetched = await client.messaging.v1.services(msid).fetch();
+		const stored = fetched?.inboundRequestUrl;
+		console.log(
+			success(
+				`✅ Messaging Service webhook set to ${stored ?? url} (service ${msid})`,
+			),
+		);
+		return true;
+	} catch (err) {
+		if (isVerbose()) console.error("Messaging Service update failed", err);
+		return false;
+	}
+}
+ 
+async function updateWebhook(
+	client: ReturnType<typeof createClient>,
+	senderSid: string,
+	url: string,
+	method: "POST" | "GET" = "POST",
+	runtime: RuntimeEnv = defaultRuntime,
+) {
+	// Point Twilio sender webhook at the provided URL.
+	const requester = client as unknown as TwilioRequester;
+	const clientTyped = client as unknown as TwilioSenderListClient;
+ 
+	// 1) Raw request (Channels/Senders) with JSON webhook payload — most reliable for WA
+	try {
+		await requester.request({
+			method: "post",
+			uri: `https://messaging.twilio.com/v2/Channels/Senders/${senderSid}`,
+			body: {
+				webhook: {
+					callback_url: url,
+					callback_method: method,
+				},
+			},
+			contentType: "application/json",
+		});
+		// Fetch to verify what Twilio stored
+		const fetched = await clientTyped.messaging.v2
+			.channelsSenders(senderSid)
+			.fetch();
+		const storedUrl =
+			fetched?.webhook?.callback_url || fetched?.webhook?.fallback_url;
+		Eif (storedUrl) {
+			console.log(success(`✅ Twilio sender webhook set to ${storedUrl}`));
+			return;
+		}
+		if (isVerbose())
+			console.error(
+				"Sender updated but webhook callback_url missing; will try fallbacks",
+			);
+	} catch (err) {
+		if (isVerbose())
+			console.error(
+				"channelsSenders request update failed, will try client helpers",
+				err,
+			);
+	}
+ 
+	// 1b) Form-encoded fallback for older Twilio stacks
+	try {
+		await requester.request({
+			method: "post",
+			uri: `https://messaging.twilio.com/v2/Channels/Senders/${senderSid}`,
+			form: {
+				"Webhook.CallbackUrl": url,
+				"Webhook.CallbackMethod": method,
+			},
+		});
+		const fetched = await clientTyped.messaging.v2
+			.channelsSenders(senderSid)
+			.fetch();
+		const storedUrl =
+			fetched?.webhook?.callback_url || fetched?.webhook?.fallback_url;
+		Iif (storedUrl) {
+			console.log(success(`✅ Twilio sender webhook set to ${storedUrl}`));
+			return;
+		}
+		if (isVerbose())
+			console.error(
+				"Form update succeeded but callback_url missing; will try helper fallback",
+			);
+	} catch (err) {
+		if (isVerbose())
+			console.error(
+				"Form channelsSenders update failed, will try helper fallback",
+				err,
+			);
+	}
+ 
+	// 2) SDK helper fallback (if supported by this client)
+	try {
+		if (clientTyped.messaging?.v2?.channelsSenders) {
+			await clientTyped.messaging.v2.channelsSenders(senderSid).update({
+				callbackUrl: url,
+				callbackMethod: method,
+			});
+			const fetched = await clientTyped.messaging.v2
+				.channelsSenders(senderSid)
+				.fetch();
+			const storedUrl =
+				fetched?.webhook?.callback_url || fetched?.webhook?.fallback_url;
+			console.log(
+				success(
+					`✅ Twilio sender webhook set to ${storedUrl ?? url} (helper API)`,
+				),
+			);
+			return;
+		}
+	} catch (err) {
+		if (isVerbose())
+			console.error(
+				"channelsSenders helper update failed, will try phone number fallback",
+				err,
+			);
+	}
+ 
+	// 3) Incoming phone number fallback (works for many WA senders)
+	try {
+		const phoneSid = await findIncomingNumberSid(clientTyped);
+		if (phoneSid) {
+			const phoneNumberUpdater = clientTyped.incomingPhoneNumbers(phoneSid);
+			await phoneNumberUpdater.update({
+				smsUrl: url,
+				smsMethod: method,
+			});
+			console.log(success(`✅ Twilio phone webhook set to ${url}`));
+			return;
+		}
+	} catch (err) {
+		if (isVerbose()) console.error("Incoming number update failed", err);
+	}
+ 
+	// 4) Messaging Service fallback (some WA senders are tied to a service)
+	const messagingServiceUpdated = await setMessagingServiceWebhook(
+		clientTyped,
+		url,
+		method,
+	);
+	if (messagingServiceUpdated) return;
+ 
+	runtime.error(danger("Failed to set Twilio webhook."));
+	runtime.error(
+		info(
+			"Double-check your sender SID and credentials; you can set TWILIO_SENDER_SID to force a specific sender.",
+		),
+	);
+	runtime.error(
+		info(
+			"Tip: if webhooks are blocked, use polling instead: `pnpm warelay poll --interval 5 --lookback 10`",
+		),
+	);
+	runtime.exit(1);
+}
+ 
+type TwilioApiError = {
+	code?: number | string;
+	status?: number | string;
+	message?: string;
+	moreInfo?: string;
+	response?: { body?: unknown };
+};
+ 
+function formatTwilioError(err: unknown): string {
+	const e = err as TwilioApiError;
+	const pieces = [];
+	if (e.code != null) pieces.push(`code ${e.code}`);
+	if (e.status != null) pieces.push(`status ${e.status}`);
+	if (e.message) pieces.push(e.message);
+	if (e.moreInfo) pieces.push(`more: ${e.moreInfo}`);
+	return pieces.length ? pieces.join(" | ") : String(err);
+}
+ 
+function logTwilioSendError(
+	err: unknown,
+	destination?: string,
+	runtime: RuntimeEnv = defaultRuntime,
+) {
+	const prefix = destination ? `to ${destination}: ` : "";
+	runtime.error(
+		danger(`❌ Twilio send failed ${prefix}${formatTwilioError(err)}`),
+	);
+	const body = (err as TwilioApiError)?.response?.body;
+	if (body) {
+		runtime.error(info("Response body:"), JSON.stringify(body, null, 2));
+	}
+}
+ 
+async function monitor(
+	intervalSeconds: number,
+	lookbackMinutes: number,
+	clientOverride?: ReturnType<typeof createClient>,
+	maxIterations = Infinity,
+) {
+	// Poll Twilio for inbound messages and stream them with de-dupe.
+	const env = readEnv();
+	const client = clientOverride ?? createClient(env);
+	const from = withWhatsAppPrefix(env.whatsappFrom);
+ 
+	let since = new Date(Date.now() - lookbackMinutes * 60_000);
+	const seen = new Set<string>();
+ 
+	console.log(
+		`📡 Monitoring inbound messages to ${from} (poll ${intervalSeconds}s, lookback ${lookbackMinutes}m)`,
+	);
+ 
+	const updateSince = (date?: Date | null) => {
+		Iif (!date) return;
+		Iif (date.getTime() > since.getTime()) {
+			since = date;
+		}
+	};
+ 
+	let keepRunning = true;
+	process.once("SIGINT", () => {
+		if (!keepRunning) return;
+		keepRunning = false;
+		console.log("\n👋 Stopping monitor");
+	});
+ 
+	let iterations = 0;
+	while (keepRunning && iterations < maxIterations) {
+		try {
+			const messages = await client.messages.list({
+				to: from,
+				dateSentAfter: since,
+				limit: 50,
+			});
+ 
+			const inboundMessages = messages
+				.filter((m: MessageInstance) => m.direction === "inbound")
+				.sort((a: MessageInstance, b: MessageInstance) => {
+					const da = a.dateCreated?.getTime() ?? 0;
+					const db = b.dateCreated?.getTime() ?? 0;
+					return da - db;
+				});
+ 
+			for (const m of inboundMessages) {
+				Iif (seen.has(m.sid)) continue;
+				seen.add(m.sid);
+				const time = m.dateCreated?.toISOString() ?? "unknown time";
+				const fromNum = m.from ?? "unknown sender";
+				console.log(`\n[${time}] ${fromNum} -> ${m.to}: ${m.body ?? ""}`);
+				updateSince(m.dateCreated);
+				void autoReplyIfConfigured(client, m);
+			}
+		} catch (err) {
+			console.error("Error while polling messages", err);
+		}
+ 
+		await sleep(intervalSeconds * 1000);
+		iterations += 1;
+	}
+}
+ 
+async function monitorWebProvider(
+	verbose: boolean,
+	listenerFactory = monitorWebInbox,
+	keepAlive = true,
+	replyResolver: typeof getReplyFromConfig = getReplyFromConfig,
+) {
+	// Listen for inbound personal WhatsApp Web messages and auto-reply if configured.
+	const listener = await listenerFactory({
+		verbose,
+		onMessage: async (msg) => {
+			const ts = msg.timestamp
+				? new Date(msg.timestamp).toISOString()
+				: new Date().toISOString();
+			console.log(`\n[${ts}] ${msg.from} -> ${msg.to}: ${msg.body}`);
+ 
+			const replyText = await replyResolver(
+				{
+					Body: msg.body,
+					From: msg.from,
+					To: msg.to,
+					MessageSid: msg.id,
+				},
+				{
+					onReplyStart: msg.sendComposing,
+				},
+			);
+			Iif (!replyText) return;
+			try {
+				await msg.reply(replyText);
+				Iif (isVerbose()) {
+					console.log(success(`↩️  Auto-replied to ${msg.from} (web)`));
+				}
+			} catch (err) {
+				console.error(
+					danger(`Failed sending web auto-reply to ${msg.from}: ${String(err)}`),
+				);
+			}
+		},
+	});
+ 
+	console.log(
+		info(
+			"📡 Listening for personal WhatsApp Web inbound messages. Leave this running; Ctrl+C to stop.",
+		),
+	);
+	process.on("SIGINT", () => {
+		void listener.close().finally(() => {
+			console.log("\n👋 Web monitor stopped");
+			defaultRuntime.exit(0);
+		});
+	});
+ 
+	Iif (keepAlive) {
+		await waitForever();
+	}
+}
+ 
+async function performSend(
+	opts: {
+		to: string;
+		message: string;
+		wait: string;
+		poll: string;
+		provider: Provider;
+	},
+	deps: CliDeps,
+	exitFn: (code: number) => never = defaultRuntime.exit,
+	runtime: RuntimeEnv = defaultRuntime,
+) {
+	deps.assertProvider(opts.provider);
+	const waitSeconds = Number.parseInt(opts.wait, 10);
+	const pollSeconds = Number.parseInt(opts.poll, 10);
+ 
+	if (Number.isNaN(waitSeconds) || waitSeconds < 0) {
+		throw new Error("Wait must be >= 0 seconds");
+	}
+	if (Number.isNaN(pollSeconds) || pollSeconds <= 0) {
+		throw new Error("Poll must be > 0 seconds");
+	}
+ 
+	if (opts.provider === "web") {
+		if (waitSeconds !== 0) {
+			console.log(info("Wait/poll are Twilio-only; ignored for provider=web."));
+		}
+		await deps.sendMessageWeb(opts.to, opts.message, { verbose: isVerbose() });
+		return;
+	}
+ 
+	const result = await deps.sendMessage(opts.to, opts.message, runtime);
+	if (!result) return;
+	if (waitSeconds === 0) return;
+	await deps.waitForFinalStatus(
+		result.client,
+		result.sid,
+		waitSeconds,
+		pollSeconds,
+	);
+}
+ 
+async function performStatus(
+	opts: { limit: string; lookback: string; json?: boolean },
+	deps: CliDeps,
+	exitFn: (code: number) => never = defaultRuntime.exit,
+	runtime: RuntimeEnv = defaultRuntime,
+) {
+	const limit = Number.parseInt(opts.limit, 10);
+	const lookbackMinutes = Number.parseInt(opts.lookback, 10);
+	if (Number.isNaN(limit) || limit <= 0 || limit > 200) {
+		throw new Error("limit must be between 1 and 200");
+	}
+	if (Number.isNaN(lookbackMinutes) || lookbackMinutes <= 0) {
+		throw new Error("lookback must be > 0 minutes");
+	}
+ 
+	const messages = await deps.listRecentMessages(lookbackMinutes, limit);
+	if (opts.json) {
+		console.log(JSON.stringify(messages, null, 2));
+		return;
+	}
+	if (messages.length === 0) {
+		console.log("No messages found in the requested window.");
+		return;
+	}
+	for (const m of messages) {
+		console.log(formatMessageLine(m));
+	}
+}
+ 
+async function performWebhookSetup(
+	opts: {
+		port: string;
+		path: string;
+		reply?: string;
+		verbose?: boolean;
+	},
+	deps: CliDeps,
+	exitFn: (code: number) => never = defaultRuntime.exit,
+	runtime: RuntimeEnv = defaultRuntime,
+) {
+	const port = Number.parseInt(opts.port, 10);
+	if (Number.isNaN(port) || port <= 0 || port >= 65536) {
+		throw new Error("Port must be between 1 and 65535");
+	}
+	await deps.ensurePortAvailable(port);
+ 
+	const server = await deps.startWebhook(
+		port,
+		opts.path,
+		opts.reply,
+		Boolean(opts.verbose),
+	);
+	return server;
+}
+ 
+async function performUp(
+	opts: {
+		port: string;
+		path: string;
+		verbose?: boolean;
+		yes?: boolean;
+	},
+	deps: CliDeps,
+	exitFn: (code: number) => never = defaultRuntime.exit,
+	runtime: RuntimeEnv = defaultRuntime,
+) {
+	const port = Number.parseInt(opts.port, 10);
+	if (Number.isNaN(port) || port <= 0 || port >= 65536) {
+		throw new Error("Port must be between 1 and 65535");
+	}
+ 
+	await deps.ensurePortAvailable(port);
+ 
+	// Validate env and binaries
+	const env = deps.readEnv(runtime);
+	await deps.ensureBinary("tailscale", runExec, runtime);
+ 
+	// Enable Funnel first so we don't keep a webhook running on failure
+	await deps.ensureFunnel(port, runExec, runtime, promptYesNo);
+	const host = await deps.getTailnetHostname(runExec);
+	const publicUrl = `https://${host}${opts.path}`;
+	console.log(`🌐 Public webhook URL (via Funnel): ${publicUrl}`);
+ 
+	// Start webhook locally (after funnel success)
+	const server = await deps.startWebhook(
+		port,
+		opts.path,
+		undefined,
+		Boolean(opts.verbose),
+	);
+ 
+	// Configure Twilio sender webhook
+	const client = createClient(env);
+	const senderSid = await deps.findWhatsappSenderSid(
+		client,
+		env.whatsappFrom,
+		env.whatsappSenderSid,
+	);
+	await deps.updateWebhook(client, senderSid, publicUrl, "POST", runtime);
+ 
+	console.log(
+		"\nSetup complete. Leave this process running to keep the webhook online. Ctrl+C to stop.",
+	);
+	return { server, publicUrl, senderSid };
+}
+ 
+type ListedMessage = {
+	sid: string;
+	status: string | null;
+	direction: string | null;
+	dateCreated?: Date | null;
+	from?: string | null;
+	to?: string | null;
+	body?: string | null;
+	errorCode?: number | null;
+	errorMessage?: string | null;
+};
+ 
+function uniqueBySid(messages: ListedMessage[]): ListedMessage[] {
+	const seen = new Set<string>();
+	const deduped: ListedMessage[] = [];
+	for (const m of messages) {
+		if (seen.has(m.sid)) continue;
+		seen.add(m.sid);
+		deduped.push(m);
+	}
+	return deduped;
+}
+ 
+function sortByDateDesc(messages: ListedMessage[]): ListedMessage[] {
+	return [...messages].sort((a, b) => {
+		const da = a.dateCreated?.getTime() ?? 0;
+		const db = b.dateCreated?.getTime() ?? 0;
+		return db - da;
+	});
+}
+ 
+function formatMessageLine(m: ListedMessage): string {
+	const ts = m.dateCreated?.toISOString() ?? "unknown-time";
+	const dir =
+		m.direction === "inbound"
+			? "⬅️ "
+			: m.direction === "outbound-api" || m.direction === "outbound-reply"
+				? "➡️ "
+				: "↔️ ";
+	const status = m.status ?? "unknown";
+	const err =
+		m.errorCode != null
+			? ` error ${m.errorCode}${m.errorMessage ? ` (${m.errorMessage})` : ""}`
+			: "";
+	const body = (m.body ?? "").replace(/\s+/g, " ").trim();
+	const bodyPreview =
+		body.length > 140 ? `${body.slice(0, 137)}…` : body || "<empty>";
+	return `[${ts}] ${dir}${m.from ?? "?"} -> ${m.to ?? "?"} | ${status}${err} | ${bodyPreview} (sid ${m.sid})`;
+}
+ 
+async function listRecentMessages(
+	lookbackMinutes: number,
+	limit: number,
+	clientOverride?: ReturnType<typeof createClient>,
+): Promise<ListedMessage[]> {
+	const env = readEnv();
+	const client = clientOverride ?? createClient(env);
+	const from = withWhatsAppPrefix(env.whatsappFrom);
+	const since = new Date(Date.now() - lookbackMinutes * 60_000);
+ 
+	// Fetch inbound (to our WA number) and outbound (from our WA number), merge, sort, limit.
+	const fetchLimit = Math.min(Math.max(limit * 2, limit + 10), 100);
+	const inbound = await client.messages.list({
+		to: from,
+		dateSentAfter: since,
+		limit: fetchLimit,
+	});
+	const outbound = await client.messages.list({
+		from,
+		dateSentAfter: since,
+		limit: fetchLimit,
+	});
+ 
+	const combined = uniqueBySid(
+		[...inbound, ...outbound].map((m) => ({
+			sid: m.sid,
+			status: m.status ?? null,
+			direction: m.direction ?? null,
+			dateCreated: m.dateCreated,
+			from: m.from,
+			to: m.to,
+			body: m.body,
+			errorCode: m.errorCode ?? null,
+			errorMessage: m.errorMessage ?? null,
+		})),
+	);
+ 
+	return sortByDateDesc(combined).slice(0, limit);
+}
+ 
+program
+	.name("warelay")
+	.description("WhatsApp relay CLI (Twilio or WhatsApp Web session)")
+	.version("1.0.0");
+ 
+program
+	.command("web:login")
+	.description("Link your personal WhatsApp via QR (web provider)")
+	.option("--verbose", "Verbose connection logs", false)
+	.action(async (opts) => {
+		setVerbose(Boolean(opts.verbose));
+		try {
+			await loginWeb(Boolean(opts.verbose));
+		} catch (err) {
+			defaultRuntime.error(danger(`Web login failed: ${String(err)}`));
+			defaultRuntime.exit(1);
+		}
+	});
+ 
+program
+	.command("send")
+	.description("Send a WhatsApp message")
+	.requiredOption(
+		"-t, --to <number>",
+		"Recipient number in E.164 (e.g. +15551234567)",
+	)
+	.requiredOption("-m, --message <text>", "Message body")
+	.option("-w, --wait <seconds>", "Wait for delivery status (0 to skip)", "20")
+	.option("-p, --poll <seconds>", "Polling interval while waiting", "2")
+	.option("--provider <provider>", "Provider: twilio | web", "twilio")
+	.addHelpText(
+		"after",
+		`
+Examples:
+  warelay send --to +15551234567 --message "Hi"                # wait 20s for delivery (default)
+  warelay send --to +15551234567 --message "Hi" --wait 0       # fire-and-forget
+  warelay send --to +15551234567 --message "Hi" --wait 60 --poll 3`,
+	)
+	.action(async (opts) => {
+		const deps = createDefaultDeps();
+		try {
+			await sendCommand(opts, deps, defaultRuntime);
+		} catch (err) {
+			defaultRuntime.error(String(err));
+			defaultRuntime.exit(1);
+		}
+	});
+ 
+program
+	.command("monitor")
+	.description("Poll Twilio for inbound WhatsApp messages")
+	.option("-i, --interval <seconds>", "Polling interval in seconds", "5")
+	.option("-l, --lookback <minutes>", "Initial lookback window in minutes", "5")
+	.addHelpText(
+		"after",
+		`
+Examples:
+  warelay monitor                         # poll every 5s, look back 5 minutes
+  warelay monitor --interval 2 --lookback 30`,
+	)
+	.action(async (opts) => {
+		const intervalSeconds = Number.parseInt(opts.interval, 10);
+		const lookbackMinutes = Number.parseInt(opts.lookback, 10);
+ 
+		if (Number.isNaN(intervalSeconds) || intervalSeconds <= 0) {
+			defaultRuntime.error("Interval must be a positive integer");
+			defaultRuntime.exit(1);
+		}
+		if (Number.isNaN(lookbackMinutes) || lookbackMinutes < 0) {
+			defaultRuntime.error("Lookback must be >= 0 minutes");
+			defaultRuntime.exit(1);
+		}
+ 
+		await monitor(intervalSeconds, lookbackMinutes);
+	});
+ 
+program
+	.command("web:monitor")
+	.description("Listen for inbound messages via personal WhatsApp Web and auto-reply")
+	.option("--verbose", "Verbose logging", false)
+	.addHelpText(
+		"after",
+		`
+Examples:
+  warelay web:monitor            # start auto-replies on your linked web session
+  warelay web:monitor --verbose  # show low-level Baileys logs
+`,
+	)
+	.action(async (opts) => {
+		setVerbose(Boolean(opts.verbose));
+		await monitorWebProvider(Boolean(opts.verbose));
+	});
+ 
+program
+	.command("status")
+	.description("Show recent WhatsApp messages (sent and received)")
+	.option("-l, --limit <count>", "Number of messages to show", "20")
+	.option("-b, --lookback <minutes>", "How far back to fetch messages", "240")
+	.option("--json", "Output JSON instead of text", false)
+	.addHelpText(
+		"after",
+		`
+Examples:
+  warelay status                            # last 20 msgs in past 4h
+  warelay status --limit 5 --lookback 30    # last 5 msgs in past 30m
+  warelay status --json --limit 50          # machine-readable output`,
+	)
+	.action(async (opts) => {
+		const deps = createDefaultDeps();
+		try {
+			await statusCommand(opts, deps, defaultRuntime);
+		} catch (err) {
+			defaultRuntime.error(String(err));
+			defaultRuntime.exit(1);
+		}
+	});
+ 
+program
+	.command("poll")
+	.description("Poll Twilio for inbound WhatsApp messages (non-webhook mode)")
+	.option("-i, --interval <seconds>", "Polling interval in seconds", "5")
+	.option("-l, --lookback <minutes>", "Initial lookback window in minutes", "5")
+	.option("--verbose", "Verbose logging during polling", false)
+	.addHelpText(
+		"after",
+		`
+Examples:
+  warelay poll                         # poll every 5s, look back 5 minutes
+  warelay poll --interval 2 --lookback 30 --verbose`,
+	)
+	.action(async (opts) => {
+		setVerbose(Boolean(opts.verbose));
+		const intervalSeconds = Number.parseInt(opts.interval, 10);
+		const lookbackMinutes = Number.parseInt(opts.lookback, 10);
+ 
+		if (Number.isNaN(intervalSeconds) || intervalSeconds <= 0) {
+			defaultRuntime.error("Interval must be a positive integer");
+			defaultRuntime.exit(1);
+		}
+		if (Number.isNaN(lookbackMinutes) || lookbackMinutes < 0) {
+			defaultRuntime.error("Lookback must be >= 0 minutes");
+			defaultRuntime.exit(1);
+		}
+ 
+		await monitor(intervalSeconds, lookbackMinutes);
+	});
+ 
+program
+	.command("webhook")
+	.description(
+		"Run a local webhook server for inbound WhatsApp (works with Tailscale/port forward)",
+	)
+	.option("-p, --port <port>", "Port to listen on", "42873")
+	.option("-r, --reply <text>", "Optional auto-reply text")
+	.option("--path <path>", "Webhook path", "/webhook/whatsapp")
+	.option("--verbose", "Log inbound and auto-replies", false)
+	.option("-y, --yes", "Auto-confirm prompts when possible", false)
+	.addHelpText(
+		"after",
+		`
+Examples:
+  warelay webhook                       # listen on 42873
+  warelay webhook --port 45000          # pick a high, less-colliding port
+  warelay webhook --reply "Got it!"     # static auto-reply; otherwise use config file
+ 
+With Tailscale:
+  tailscale serve tcp 42873 127.0.0.1:42873
+  (then set Twilio webhook URL to your tailnet IP:42873/webhook/whatsapp)`,
+	)
+	// istanbul ignore next
+	.action(async (opts) => {
+		setVerbose(Boolean(opts.verbose));
+		setYes(Boolean(opts.yes));
+		const deps = createDefaultDeps();
+		try {
+			const server = await webhookCommand(opts, deps, defaultRuntime);
+			process.on("SIGINT", () => {
+				server.close(() => {
+					console.log("\n👋 Webhook stopped");
+					defaultRuntime.exit(0);
+				});
+			});
+			await deps.waitForever();
+		} catch (err) {
+			defaultRuntime.error(String(err));
+			defaultRuntime.exit(1);
+		}
+	});
+ 
+program
+	.command("up")
+	.description(
+		"Bring up webhook + Tailscale Funnel + Twilio callback (default webhook mode)",
+	)
+	.option("-p, --port <port>", "Port to listen on", "42873")
+	.option("--path <path>", "Webhook path", "/webhook/whatsapp")
+	.option("--verbose", "Verbose logging during setup/webhook", false)
+	.option("-y, --yes", "Auto-confirm prompts when possible", false)
+	// istanbul ignore next
+	.action(async (opts) => {
+		setVerbose(Boolean(opts.verbose));
+		setYes(Boolean(opts.yes));
+		const deps = createDefaultDeps();
+		try {
+			const { server } = await upCommand(opts, deps, defaultRuntime);
+			process.on("SIGINT", () => {
+				server.close(() => {
+					console.log("\n👋 Webhook stopped");
+					defaultRuntime.exit(0);
+				});
+			});
+			await deps.waitForever();
+		} catch (err) {
+			defaultRuntime.error(String(err));
+			defaultRuntime.exit(1);
+		}
+	});
+ 
+export {
+	assertProvider,
+	autoReplyIfConfigured,
+	applyTemplate,
+	createClient,
+	deriveSessionKey,
+	describePortOwner,
+	ensureBinary,
+	ensureFunnel,
+	ensureGoInstalled,
+	ensurePortAvailable,
+	ensureTailscaledInstalled,
+	findIncomingNumberSid,
+	findMessagingServiceSid,
+	findWhatsappSenderSid,
+	formatMessageLine,
+	formatTwilioError,
+	getReplyFromConfig,
+	getTailnetHostname,
+	handlePortError,
+	logTwilioSendError,
+	listRecentMessages,
+	loadConfig,
+	loadSessionStore,
+	monitor,
+	monitorWebProvider,
+	normalizeE164,
+	PortInUseError,
+	promptYesNo,
+	createDefaultDeps,
+	performSend,
+	performStatus,
+	performUp,
+	performWebhookSetup,
+	readEnv,
+	resolveStorePath,
+	runCommandWithTimeout,
+	runExec,
+	saveSessionStore,
+	sendMessage,
+	sendTypingIndicator,
+	setMessagingServiceWebhook,
+	sortByDateDesc,
+	startWebhook,
+	updateWebhook,
+	uniqueBySid,
+	waitForFinalStatus,
+	waitForever,
+	toWhatsappJid,
+	program,
+};
+ 
+const isMain =
+	process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1];
+ 
+Iif (isMain) {
+	program.parseAsync(process.argv);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/provider-web.ts.html b/coverage/src/provider-web.ts.html new file mode 100644 index 000000000..e0ccd18f6 --- /dev/null +++ b/coverage/src/provider-web.ts.html @@ -0,0 +1,892 @@ + + + + + + Code coverage report for src/provider-web.ts + + + + + + + + + +
+
+

All files / src provider-web.ts

+
+ +
+ 64% + Statements + 80/125 +
+ + +
+ 43.67% + Branches + 38/87 +
+ + +
+ 87.5% + Functions + 14/16 +
+ + +
+ 70.53% + Lines + 79/112 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +4x +4x +4x +4x +4x +  +  +  +  +  +  +  +  +  +  +  +  +4x +4x +  +  +3x +3x +  +  +  +3x +  +  +  +  +  +  +  +3x +  +  +  +  +  +4x +  +  +  +4x +  +  +  +4x +  +4x +4x +4x +3x +3x +  +4x +1x +1x +  +  +  +4x +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +  +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +  +1x +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import fs from "node:fs/promises";
+import os from "node:os";
+import path from "node:path";
+import {
+	DisconnectReason,
+	fetchLatestBaileysVersion,
+	makeCacheableSignalKeyStore,
+	makeWASocket,
+	useMultiFileAuthState,
+} from "baileys";
+import type { proto } from "baileys";
+import pino from "pino";
+import qrcode from "qrcode-terminal";
+import { danger, info, logVerbose, success } from "./globals.js";
+import { ensureDir, jidToE164, toWhatsappJid } from "./utils.js";
+ 
+const WA_WEB_AUTH_DIR = path.join(os.homedir(), ".warelay", "waweb");
+ 
+export async function createWaSocket(printQr: boolean, verbose: boolean) {
+	await ensureDir(WA_WEB_AUTH_DIR);
+	const { state, saveCreds } = await useMultiFileAuthState(WA_WEB_AUTH_DIR);
+	const { version } = await fetchLatestBaileysVersion();
+	const logger = pino({ level: verbose ? "info" : "silent" });
+	const sock = makeWASocket({
+		auth: {
+			creds: state.creds,
+			keys: makeCacheableSignalKeyStore(state.keys, logger),
+		},
+		version,
+		logger,
+		printQRInTerminal: false,
+		browser: ["Warelay", "CLI", "1.0.0"],
+		syncFullHistory: false,
+		markOnlineOnConnect: false,
+	});
+ 
+	sock.ev.on("creds.update", saveCreds);
+	sock.ev.on(
+		"connection.update",
+		(update: Partial<import("baileys").ConnectionState>) => {
+			const { connection, lastDisconnect, qr } = update;
+			Iif (qr && printQr) {
+				console.log("Scan this QR in WhatsApp (Linked Devices):");
+				qrcode.generate(qr, { small: true });
+			}
+			Iif (connection === "close") {
+				const status = getStatusCode(lastDisconnect?.error);
+				if (status === DisconnectReason.loggedOut) {
+					console.error(
+						danger("WhatsApp session logged out. Run: warelay web:login"),
+					);
+				}
+			}
+			Iif (connection === "open" && verbose) {
+				console.log(success("WhatsApp Web connected."));
+			}
+		},
+	);
+ 
+	return sock;
+}
+ 
+export async function waitForWaConnection(sock: ReturnType<typeof makeWASocket>) {
+	return new Promise<void>((resolve, reject) => {
+		type OffCapable = {
+			off?: (event: string, listener: (...args: unknown[]) => void) => void;
+		};
+		const evWithOff = sock.ev as unknown as OffCapable;
+ 
+		const handler = (...args: unknown[]) => {
+			const update = (args[0] ?? {}) as Partial<import("baileys").ConnectionState>;
+			if (update.connection === "open") {
+				evWithOff.off?.("connection.update", handler);
+				resolve();
+			}
+			if (update.connection === "close") {
+				evWithOff.off?.("connection.update", handler);
+				reject(update.lastDisconnect ?? new Error("Connection closed"));
+			}
+		};
+ 
+		sock.ev.on("connection.update", handler);
+	});
+}
+ 
+export async function sendMessageWeb(
+	to: string,
+	body: string,
+	options: { verbose: boolean },
+) {
+	const sock = await createWaSocket(false, options.verbose);
+	try {
+		await waitForWaConnection(sock);
+		const jid = toWhatsappJid(to);
+		try {
+			await sock.sendPresenceUpdate("composing", jid);
+		} catch (err) {
+			logVerbose(`Presence update skipped: ${String(err)}`);
+		}
+		const result = await sock.sendMessage(jid, { text: body });
+		const messageId = result?.key?.id ?? "unknown";
+		console.log(success(`✅ Sent via web session. Message ID: ${messageId} -> ${jid}`));
+	} finally {
+		try {
+			sock.ws?.close();
+		} catch (err) {
+			logVerbose(`Socket close failed: ${String(err)}`);
+		}
+	}
+}
+ 
+export async function loginWeb(
+	verbose: boolean,
+	waitForConnection: typeof waitForWaConnection = waitForWaConnection,
+) {
+	const sock = await createWaSocket(true, verbose);
+	console.log(info("Waiting for WhatsApp connection..."));
+	try {
+		await waitForConnection(sock);
+		console.log(success("✅ Linked! Credentials saved for future sends."));
+	} catch (err) {
+		const code =
+			(err as { error?: { output?: { statusCode?: number } } })?.error?.output
+				?.statusCode ??
+			(err as { output?: { statusCode?: number } })?.output?.statusCode;
+		if (code === 515) {
+			console.log(
+				info(
+					"WhatsApp asked for a restart after pairing (code 515); creds are saved. You can now send with provider=web.",
+				),
+			);
+			return;
+		}
+		if (code === DisconnectReason.loggedOut) {
+			await fs.rm(WA_WEB_AUTH_DIR, { recursive: true, force: true });
+			console.error(
+				danger(
+					"WhatsApp reported the session is logged out. Cleared cached web session; please rerun warelay web:login and scan the QR again.",
+				),
+			);
+			throw new Error("Session logged out; cache cleared. Re-run web:login.");
+		}
+		const formatted = formatError(err);
+		console.error(
+			danger(
+				`WhatsApp Web connection ended before fully opening. ${formatted}`,
+			),
+		);
+		throw new Error(formatted);
+	} finally {
+		setTimeout(() => {
+			try {
+				sock.ws?.close();
+			} catch {
+				// ignore
+			}
+		}, 500);
+	}
+}
+ 
+export { WA_WEB_AUTH_DIR };
+ 
+export type WebInboundMessage = {
+	id?: string;
+	from: string;
+	to: string;
+	body: string;
+	pushName?: string;
+	timestamp?: number;
+	sendComposing: () => Promise<void>;
+	reply: (text: string) => Promise<void>;
+};
+ 
+export async function monitorWebInbox(options: {
+	verbose: boolean;
+	onMessage: (msg: WebInboundMessage) => Promise<void>;
+}) {
+	const sock = await createWaSocket(false, options.verbose);
+	await waitForWaConnection(sock);
+	const selfJid = sock.user?.id;
+	const selfE164 = selfJid ? jidToE164(selfJid) : null;
+	const seen = new Set<string>();
+ 
+	sock.ev.on("messages.upsert", async (upsert) => {
+		Iif (upsert.type !== "notify") return;
+		for (const msg of upsert.messages) {
+			const id = msg.key?.id ?? undefined;
+			// De-dupe on message id; Baileys can emit retries.
+			Iif (id && seen.has(id)) continue;
+			Eif (id) seen.add(id);
+			Iif (msg.key?.fromMe) continue;
+			const remoteJid = msg.key?.remoteJid;
+			Iif (!remoteJid) continue;
+			// Ignore status/broadcast traffic; we only care about direct chats.
+			Iif (remoteJid.endsWith("@status") || remoteJid.endsWith("@broadcast"))
+				continue;
+			const from = jidToE164(remoteJid);
+			Iif (!from) continue;
+			const body = extractText(msg.message);
+			Iif (!body) continue;
+			const chatJid = remoteJid;
+			const sendComposing = async () => {
+				try {
+					await sock.sendPresenceUpdate("composing", chatJid);
+				} catch (err) {
+					logVerbose(`Presence update failed: ${String(err)}`);
+				}
+			};
+			const reply = async (text: string) => {
+				await sock.sendMessage(chatJid, { text });
+			};
+			const timestamp = msg.messageTimestamp
+				? Number(msg.messageTimestamp) * 1000
+				: undefined;
+			try {
+				await options.onMessage({
+					id,
+					from,
+					to: selfE164 ?? "me",
+					body,
+					pushName: msg.pushName ?? undefined,
+					timestamp,
+					sendComposing,
+					reply,
+				});
+			} catch (err) {
+				console.error(danger(`Failed handling inbound web message: ${String(err)}`));
+			}
+		}
+	});
+ 
+	return {
+		close: async () => {
+			try {
+				sock.ws?.close();
+			} catch (err) {
+				logVerbose(`Socket close failed: ${String(err)}`);
+			}
+		},
+	};
+}
+ 
+function extractText(message: proto.IMessage | undefined): string | undefined {
+	Iif (!message) return undefined;
+	Eif (typeof message.conversation === "string" && message.conversation.trim()) {
+		return message.conversation.trim();
+	}
+	const extended = message.extendedTextMessage?.text;
+	Iif (extended?.trim()) return extended.trim();
+	const caption = message.imageMessage?.caption ?? message.videoMessage?.caption;
+	Iif (caption?.trim()) return caption.trim();
+	return undefined;
+}
+ 
+function getStatusCode(err: unknown) {
+	return (
+		(err as { output?: { statusCode?: number } })?.output?.statusCode ??
+		(err as { status?: number })?.status
+	);
+}
+ 
+function formatError(err: unknown): string {
+	if (err instanceof Error) return err.message;
+	if (typeof err === "string") return err;
+	const status = getStatusCode(err);
+	const code = (err as { code?: unknown })?.code;
+	if (status || code) return `status=${status ?? "unknown"} code=${code ?? "unknown"}`;
+	return String(err);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/utils.ts.html b/coverage/src/utils.ts.html new file mode 100644 index 000000000..95035c8e5 --- /dev/null +++ b/coverage/src/utils.ts.html @@ -0,0 +1,235 @@ + + + + + + Code coverage report for src/utils.ts + + + + + + + + + +
+
+

All files / src utils.ts

+
+ +
+ 95.65% + Statements + 22/23 +
+ + +
+ 91.66% + Branches + 11/12 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 100% + Lines + 19/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51  +  +  +  +5x +  +  +  +  +  +6x +2x +  +  +  +  +3x +2x +  +  +  +13x +  +  +  +10x +10x +10x +2x +  +  +  +3x +3x +3x +  +  +  +  +2x +2x +2x +2x +  +  +  +833x +  +  +5x + 
import fs from "node:fs";
+import os from "node:os";
+ 
+export async function ensureDir(dir: string) {
+	await fs.promises.mkdir(dir, { recursive: true });
+}
+ 
+export type Provider = "twilio" | "web";
+ 
+export function assertProvider(input: string): asserts input is Provider {
+	if (input !== "twilio" && input !== "web") {
+		throw new Error("Provider must be 'twilio' or 'web'");
+	}
+}
+ 
+export function normalizePath(p: string): string {
+	if (!p.startsWith("/")) return `/${p}`;
+	return p;
+}
+ 
+export function withWhatsAppPrefix(number: string): string {
+	return number.startsWith("whatsapp:") ? number : `whatsapp:${number}`;
+}
+ 
+export function normalizeE164(number: string): string {
+	const withoutPrefix = number.replace(/^whatsapp:/, "").trim();
+	const digits = withoutPrefix.replace(/[^\d+]/g, "");
+	if (digits.startsWith("+")) return `+${digits.slice(1)}`;
+	return `+${digits}`;
+}
+ 
+export function toWhatsappJid(number: string): string {
+	const e164 = normalizeE164(number);
+	const digits = e164.replace(/\D/g, "");
+	return `${digits}@s.whatsapp.net`;
+}
+ 
+export function jidToE164(jid: string): string | null {
+	// Convert a WhatsApp JID (with optional device suffix, e.g. 1234:1@s.whatsapp.net) back to +1234.
+	const match = jid.match(/^(\d+)(?::\d+)?@s\.whatsapp\.net$/);
+	Iif (!match) return null;
+	const digits = match[1];
+	return `+${digits}`;
+}
+ 
+export function sleep(ms: number) {
+	return new Promise((resolve) => setTimeout(resolve, ms));
+}
+ 
+export const CONFIG_DIR = `${os.homedir()}/.warelay`;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/test/mocks/baileys.ts.html b/coverage/test/mocks/baileys.ts.html new file mode 100644 index 000000000..75e6bf41d --- /dev/null +++ b/coverage/test/mocks/baileys.ts.html @@ -0,0 +1,244 @@ + + + + + + Code coverage report for test/mocks/baileys.ts + + + + + + + + + +
+
+

All files / test/mocks baileys.ts

+
+ +
+ 92.85% + Statements + 13/14 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 85.71% + Functions + 6/7 +
+ + +
+ 92.3% + Lines + 12/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +7x +3x +3x +  +  +  +  +  +  +3x +3x +3x +  +  +7x +  +  +4x +  +4x +  +  +  +  +  +  +7x +  +3x +  +  + 
import { vi } from "vitest";
+ 
+export type MockBaileysSocket = {
+	ev: import("events").EventEmitter;
+	ws: { close: ReturnType<typeof vi.fn> };
+	sendPresenceUpdate: ReturnType<typeof vi.fn>;
+	sendMessage: ReturnType<typeof vi.fn>;
+	user?: { id?: string };
+};
+ 
+export type MockBaileysModule = {
+	DisconnectReason: { loggedOut: number };
+	fetchLatestBaileysVersion: ReturnType<typeof vi.fn>;
+	makeCacheableSignalKeyStore: ReturnType<typeof vi.fn>;
+	makeWASocket: ReturnType<typeof vi.fn>;
+	useMultiFileAuthState: ReturnType<typeof vi.fn>;
+	jidToE164?: (jid: string) => string | null;
+	proto?: unknown;
+};
+ 
+export function createMockBaileys(): { mod: MockBaileysModule; lastSocket: () => MockBaileysSocket } {
+	const sockets: MockBaileysSocket[] = [];
+	const makeWASocket = vi.fn((opts: unknown) => {
+		const ev = new (require("events").EventEmitter)();
+		const sock: MockBaileysSocket = {
+			ev,
+			ws: { close: vi.fn() },
+			sendPresenceUpdate: vi.fn().mockResolvedValue(undefined),
+			sendMessage: vi.fn().mockResolvedValue({ key: { id: "msg123" } }),
+			user: { id: "123@s.whatsapp.net" },
+		};
+		setImmediate(() => ev.emit("connection.update", { connection: "open" }));
+		sockets.push(sock);
+		return sock;
+	});
+ 
+	const mod: MockBaileysModule = {
+		DisconnectReason: { loggedOut: 401 },
+		fetchLatestBaileysVersion: vi.fn().mockResolvedValue({ version: [1, 2, 3] }),
+		makeCacheableSignalKeyStore: vi.fn((keys: unknown) => keys),
+		makeWASocket,
+		useMultiFileAuthState: vi.fn(async () => ({
+			state: { creds: {}, keys: {} },
+			saveCreds: vi.fn(),
+		})),
+		jidToE164: (jid: string) => jid.replace(/@.*$/, "").replace(/^/, "+"),
+	};
+ 
+	return {
+		mod,
+		lastSocket: () => sockets[sockets.length - 1]!,
+	};
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/test/mocks/index.html b/coverage/test/mocks/index.html new file mode 100644 index 000000000..26c73ffba --- /dev/null +++ b/coverage/test/mocks/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for test/mocks + + + + + + + + + +
+
+

All files test/mocks

+
+ +
+ 83.87% + Statements + 26/31 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 61.53% + Functions + 8/13 +
+ + +
+ 96% + Lines + 24/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
baileys.ts +
+
92.85%13/14100%0/085.71%6/792.3%12/13
twilio.ts +
+
76.47%13/17100%0/033.33%2/6100%12/12
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/test/mocks/twilio.ts.html b/coverage/test/mocks/twilio.ts.html new file mode 100644 index 000000000..2f4904899 --- /dev/null +++ b/coverage/test/mocks/twilio.ts.html @@ -0,0 +1,232 @@ + + + + + + Code coverage report for test/mocks/twilio.ts + + + + + + + + + +
+
+

All files / test/mocks twilio.ts

+
+ +
+ 76.47% + Statements + 13/17 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 33.33% + Functions + 2/6 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +1x +  +  +  +1x +  +1x +  +1x +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +2x +1x +  +1x +  + 
import { vi } from "vitest";
+ 
+export type MockTwilioClient = {
+	messages: {
+		create: ReturnType<typeof vi.fn>;
+		list: ReturnType<typeof vi.fn>;
+		fetch?: ReturnType<typeof vi.fn>;
+	};
+	request?: ReturnType<typeof vi.fn>;
+	messaging?: {
+		v2: { channelsSenders: ReturnType<typeof vi.fn> };
+		v1: { services: ReturnType<typeof vi.fn> };
+	};
+	incomingPhoneNumbers?: ReturnType<typeof vi.fn>;
+};
+ 
+export function createMockTwilio() {
+	const messages = vi.fn((sid?: string) => ({ fetch: vi.fn() })) as any;
+	messages.create = vi.fn();
+	messages.list = vi.fn();
+ 
+	const channelsSenders = vi.fn((sid?: string) => ({
+		fetch: vi.fn(),
+		update: vi.fn(),
+	})) as any;
+	channelsSenders.list = vi.fn();
+ 
+	const services = vi.fn(() => ({ update: vi.fn(), fetch: vi.fn() }));
+ 
+	const incomingPhoneNumbers = vi.fn((sid?: string) => ({
+		update: vi.fn(),
+	})) as any;
+	incomingPhoneNumbers.list = vi.fn();
+ 
+	const client: MockTwilioClient = {
+		messages,
+		request: vi.fn(),
+		messaging: {
+			v2: { channelsSenders },
+			v1: { services },
+		},
+		incomingPhoneNumbers,
+	};
+ 
+	const factory = vi.fn(() => client) as any;
+	(factory as any)._client = client;
+ 
+	return { client, factory };
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/package.json b/package.json index bbd908f78..95a5db2f1 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,8 @@ "json5": "^2.2.3", "pino": "^10.1.0", "qrcode-terminal": "^0.12.0", - "twilio": "^5.10.6" + "twilio": "^5.10.6", + "zod": "^4.1.13" }, "devDependencies": { "@biomejs/biome": "^2.3.7", @@ -67,7 +68,7 @@ "statements": 70 }, "include": [ - "src/utils.ts" + "src/**/*.ts" ], "exclude": [ "src/**/*.test.ts" diff --git a/src/commands/send.ts b/src/commands/send.ts new file mode 100644 index 000000000..85ca00fee --- /dev/null +++ b/src/commands/send.ts @@ -0,0 +1,44 @@ +import { info } from "../globals.js"; +import type { CliDeps, Provider, RuntimeEnv } from "../index.js"; + +export async function sendCommand( + opts: { + to: string; + message: string; + wait: string; + poll: string; + provider: Provider; + }, + deps: CliDeps, + runtime: RuntimeEnv, +) { + deps.assertProvider(opts.provider); + const waitSeconds = Number.parseInt(opts.wait, 10); + const pollSeconds = Number.parseInt(opts.poll, 10); + + if (Number.isNaN(waitSeconds) || waitSeconds < 0) { + throw new Error("Wait must be >= 0 seconds"); + } + if (Number.isNaN(pollSeconds) || pollSeconds <= 0) { + throw new Error("Poll must be > 0 seconds"); + } + + if (opts.provider === "web") { + if (waitSeconds !== 0) { + runtime.log(info("Wait/poll are Twilio-only; ignored for provider=web.")); + } + await deps.sendMessageWeb(opts.to, opts.message, { verbose: false }); + return; + } + + const result = await deps.sendMessage(opts.to, opts.message, runtime); + if (!result) return; + if (waitSeconds === 0) return; + await deps.waitForFinalStatus( + result.client, + result.sid, + waitSeconds, + pollSeconds, + runtime, + ); +} diff --git a/src/commands/status.ts b/src/commands/status.ts new file mode 100644 index 000000000..ce747056b --- /dev/null +++ b/src/commands/status.ts @@ -0,0 +1,30 @@ +import type { CliDeps, RuntimeEnv } from "../index.js"; +import { formatMessageLine } from "../index.js"; + +export async function statusCommand( + opts: { limit: string; lookback: string; json?: boolean }, + deps: CliDeps, + runtime: RuntimeEnv, +) { + const limit = Number.parseInt(opts.limit, 10); + const lookbackMinutes = Number.parseInt(opts.lookback, 10); + if (Number.isNaN(limit) || limit <= 0 || limit > 200) { + throw new Error("limit must be between 1 and 200"); + } + if (Number.isNaN(lookbackMinutes) || lookbackMinutes <= 0) { + throw new Error("lookback must be > 0 minutes"); + } + + const messages = await deps.listRecentMessages(lookbackMinutes, limit); + if (opts.json) { + runtime.log(JSON.stringify(messages, null, 2)); + return; + } + if (messages.length === 0) { + runtime.log("No messages found in the requested window."); + return; + } + for (const m of messages) { + runtime.log(formatMessageLine(m)); + } +} diff --git a/src/commands/webhook.ts b/src/commands/webhook.ts new file mode 100644 index 000000000..34a346160 --- /dev/null +++ b/src/commands/webhook.ts @@ -0,0 +1,27 @@ +import type { CliDeps, RuntimeEnv } from "../index.js"; + +export async function webhookCommand( + opts: { + port: string; + path: string; + reply?: string; + verbose?: boolean; + yes?: boolean; + }, + deps: CliDeps, + runtime: RuntimeEnv, +) { + const port = Number.parseInt(opts.port, 10); + if (Number.isNaN(port) || port <= 0 || port >= 65536) { + throw new Error("Port must be between 1 and 65535"); + } + await deps.ensurePortAvailable(port); + const server = await deps.startWebhook( + port, + opts.path, + opts.reply, + Boolean(opts.verbose), + runtime, + ); + return server; +} diff --git a/src/globals.test.ts b/src/globals.test.ts new file mode 100644 index 000000000..b2d4f7e2f --- /dev/null +++ b/src/globals.test.ts @@ -0,0 +1,29 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; +import { isVerbose, isYes, logVerbose, setVerbose, setYes } from "./globals.js"; + +describe("globals", () => { + afterEach(() => { + setVerbose(false); + setYes(false); + vi.restoreAllMocks(); + }); + + it("toggles verbose flag and logs when enabled", () => { + const logSpy = vi.spyOn(console, "log").mockImplementation(() => {}); + setVerbose(false); + logVerbose("hidden"); + expect(logSpy).not.toHaveBeenCalled(); + + setVerbose(true); + logVerbose("shown"); + expect(isVerbose()).toBe(true); + expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("shown")); + }); + + it("stores yes flag", () => { + setYes(true); + expect(isYes()).toBe(true); + setYes(false); + expect(isYes()).toBe(false); + }); +}); diff --git a/src/index.test.ts b/src/index.test.ts index a14855cce..7152c3ae9 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -1,8 +1,8 @@ import { describe, expect, it } from "vitest"; -import { assertProvider, normalizeE164, toWhatsappJid } from "./utils.js"; +import { assertProvider, normalizeE164, toWhatsappJid } from "./index.js"; describe("normalizeE164", () => { - it("strips whatsapp: prefix and whitespace", () => { + it("strips whatsapp prefix and whitespace", () => { expect(normalizeE164("whatsapp:+1 555 123 4567")).toBe("+15551234567"); }); diff --git a/src/utils.test.ts b/src/utils.test.ts index e84015ff1..d00aca83f 100644 --- a/src/utils.test.ts +++ b/src/utils.test.ts @@ -34,7 +34,9 @@ describe("withWhatsAppPrefix", () => { describe("ensureDir", () => { it("creates nested directory", async () => { - const tmp = await fs.promises.mkdtemp(path.join(os.tmpdir(), "warelay-test-")); + const tmp = await fs.promises.mkdtemp( + path.join(os.tmpdir(), "warelay-test-"), + ); const target = path.join(tmp, "nested", "dir"); await ensureDir(target); expect(fs.existsSync(target)).toBe(true); @@ -60,6 +62,8 @@ describe("assertProvider", () => { describe("normalizeE164 & toWhatsappJid", () => { it("strips formatting and prefixes", () => { expect(normalizeE164("whatsapp:(555) 123-4567")).toBe("+5551234567"); - expect(toWhatsappJid("whatsapp:+555 123 4567")).toBe("5551234567@s.whatsapp.net"); + expect(toWhatsappJid("whatsapp:+555 123 4567")).toBe( + "5551234567@s.whatsapp.net", + ); }); });