@witnet/sdk 1.0.4 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env_witnet +6 -6
- package/LICENSE +21 -21
- package/README.md +103 -103
- package/dist/package.json +3 -4
- package/dist/src/bin/helpers.js +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/lib/crypto/account.d.ts +3 -1
- package/dist/src/lib/crypto/account.d.ts.map +1 -1
- package/dist/src/lib/crypto/account.js +7 -1
- package/dist/src/lib/crypto/coinbase.js +1 -1
- package/dist/src/lib/crypto/index.js +1 -1
- package/dist/src/lib/crypto/interfaces.d.ts +2 -0
- package/dist/src/lib/crypto/interfaces.d.ts.map +1 -1
- package/dist/src/lib/crypto/interfaces.js +1 -1
- package/dist/src/lib/crypto/payloads/DataRequestPayload.js +1 -1
- package/dist/src/lib/crypto/payloads/StakePayload.js +1 -1
- package/dist/src/lib/crypto/payloads/UnstakePayload.js +1 -1
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +1 -1
- package/dist/src/lib/crypto/payloads.d.ts.map +1 -1
- package/dist/src/lib/crypto/payloads.js +12 -1
- package/dist/src/lib/crypto/signer.d.ts +1 -0
- package/dist/src/lib/crypto/signer.d.ts.map +1 -1
- package/dist/src/lib/crypto/signer.js +18 -1
- package/dist/src/lib/crypto/transmitters/DataRequests.js +1 -1
- package/dist/src/lib/crypto/transmitters/StakeDeposits.js +1 -1
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +1 -1
- package/dist/src/lib/crypto/transmitters/ValueTransfers.js +1 -1
- package/dist/src/lib/crypto/transmitters.js +4 -4
- package/dist/src/lib/crypto/types.d.ts.map +1 -1
- package/dist/src/lib/crypto/types.js +2 -1
- package/dist/src/lib/crypto/utils.js +1 -1
- package/dist/src/lib/crypto/wallet.d.ts +3 -1
- package/dist/src/lib/crypto/wallet.d.ts.map +1 -1
- package/dist/src/lib/crypto/wallet.js +10 -1
- package/dist/src/lib/index.js +1 -1
- package/dist/src/lib/radon/ccdr/eth.js +1 -1
- package/dist/src/lib/radon/ccdr/index.js +1 -1
- package/dist/src/lib/radon/ccdr/wit.js +1 -1
- package/dist/src/lib/radon/filters.js +1 -1
- package/dist/src/lib/radon/index.js +1 -1
- package/dist/src/lib/radon/reducers.js +1 -1
- package/dist/src/lib/radon/types.js +1 -1
- package/dist/src/lib/radon/utils.js +1 -1
- package/dist/src/lib/rpc/index.js +1 -1
- package/dist/src/lib/rpc/nodes.js +1 -1
- package/dist/src/lib/rpc/provider.js +1 -1
- package/dist/src/lib/rpc/types.d.ts +6 -4
- package/dist/src/lib/rpc/types.d.ts.map +1 -1
- package/dist/src/lib/rpc/types.js +1 -1
- package/dist/src/lib/types.d.ts +0 -1
- package/dist/src/lib/types.d.ts.map +1 -1
- package/dist/src/lib/types.js +1 -1
- package/dist/src/lib/utils.js +1 -1
- package/dist/witnet/assets/index.js +1 -1
- package/dist/witnet/assets/modals/index.js +1 -1
- package/dist/witnet/assets/modals/web3/eth.js +1 -1
- package/dist/witnet/assets/modals/web3/ipfs.js +1 -1
- package/dist/witnet/assets/modals/web3/wit.js +1 -1
- package/dist/witnet/assets/requests.js +1 -1
- package/package.json +3 -4
- package/src/bin/cli/history.js +31 -31
- package/src/bin/cli/inspect.js +405 -405
- package/src/bin/cli/network.js +594 -594
- package/src/bin/cli/nodes.js +364 -364
- package/src/bin/cli/radon.js +817 -815
- package/src/bin/cli/wallet.js +1121 -1117
- package/src/bin/helpers.js +840 -840
- package/src/bin/postinstall.js +9 -9
- package/src/bin/toolkit.js +295 -295
- package/witnet/assets/_index.js +8 -8
- package/witnet/assets/_requests.js +25 -25
- package/witnet/assets/_sources.js +36 -36
- package/witnet/assets/_templates.js +36 -36
- package/witnet/assets/index.js +4 -4
- package/witnet/assets/modals/index.js +9 -9
- package/witnet/assets/modals/web3/eth.js +29 -29
- package/witnet/assets/modals/web3/ipfs.js +19 -19
- package/witnet/assets/modals/web3/wit.js +21 -21
- package/witnet/assets/requests.js +95 -95
- package/dist/bin/helpers.d.ts +0 -88
- package/dist/bin/helpers.d.ts.map +0 -1
- package/dist/bin/helpers.js +0 -866
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -42
- package/dist/lib/crypto/account.d.ts +0 -18
- package/dist/lib/crypto/account.d.ts.map +0 -1
- package/dist/lib/crypto/account.js +0 -152
- package/dist/lib/crypto/coinbase.d.ts +0 -9
- package/dist/lib/crypto/coinbase.d.ts.map +0 -1
- package/dist/lib/crypto/coinbase.js +0 -39
- package/dist/lib/crypto/index.d.ts +0 -7
- package/dist/lib/crypto/index.d.ts.map +0 -1
- package/dist/lib/crypto/index.js +0 -28
- package/dist/lib/crypto/interfaces.d.ts +0 -80
- package/dist/lib/crypto/interfaces.d.ts.map +0 -1
- package/dist/lib/crypto/interfaces.js +0 -3
- package/dist/lib/crypto/payloads/DataRequestPayload.d.ts +0 -47
- package/dist/lib/crypto/payloads/DataRequestPayload.d.ts.map +0 -1
- package/dist/lib/crypto/payloads/DataRequestPayload.js +0 -384
- package/dist/lib/crypto/payloads/StakePayload.d.ts +0 -27
- package/dist/lib/crypto/payloads/StakePayload.d.ts.map +0 -1
- package/dist/lib/crypto/payloads/StakePayload.js +0 -184
- package/dist/lib/crypto/payloads/UnstakePayload.d.ts +0 -35
- package/dist/lib/crypto/payloads/UnstakePayload.d.ts.map +0 -1
- package/dist/lib/crypto/payloads/UnstakePayload.js +0 -244
- package/dist/lib/crypto/payloads/ValueTransferPayload.d.ts +0 -24
- package/dist/lib/crypto/payloads/ValueTransferPayload.d.ts.map +0 -1
- package/dist/lib/crypto/payloads/ValueTransferPayload.js +0 -182
- package/dist/lib/crypto/payloads.d.ts +0 -54
- package/dist/lib/crypto/payloads.d.ts.map +0 -1
- package/dist/lib/crypto/payloads.js +0 -224
- package/dist/lib/crypto/signer.d.ts +0 -26
- package/dist/lib/crypto/signer.d.ts.map +0 -1
- package/dist/lib/crypto/signer.js +0 -299
- package/dist/lib/crypto/transmitters/DataRequests.d.ts +0 -14
- package/dist/lib/crypto/transmitters/DataRequests.d.ts.map +0 -1
- package/dist/lib/crypto/transmitters/DataRequests.js +0 -62
- package/dist/lib/crypto/transmitters/StakeDeposits.d.ts +0 -11
- package/dist/lib/crypto/transmitters/StakeDeposits.d.ts.map +0 -1
- package/dist/lib/crypto/transmitters/StakeDeposits.js +0 -48
- package/dist/lib/crypto/transmitters/StakeWithdrawals.d.ts +0 -17
- package/dist/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +0 -1
- package/dist/lib/crypto/transmitters/StakeWithdrawals.js +0 -115
- package/dist/lib/crypto/transmitters/ValueTransfers.d.ts +0 -10
- package/dist/lib/crypto/transmitters/ValueTransfers.d.ts.map +0 -1
- package/dist/lib/crypto/transmitters/ValueTransfers.js +0 -47
- package/dist/lib/crypto/transmitters.d.ts +0 -46
- package/dist/lib/crypto/transmitters.d.ts.map +0 -1
- package/dist/lib/crypto/transmitters.js +0 -506
- package/dist/lib/crypto/types.d.ts +0 -127
- package/dist/lib/crypto/types.d.ts.map +0 -1
- package/dist/lib/crypto/types.js +0 -261
- package/dist/lib/crypto/utils.d.ts +0 -10
- package/dist/lib/crypto/utils.d.ts.map +0 -1
- package/dist/lib/crypto/utils.js +0 -97
- package/dist/lib/crypto/wallet.d.ts +0 -26
- package/dist/lib/crypto/wallet.d.ts.map +0 -1
- package/dist/lib/crypto/wallet.js +0 -327
- package/dist/lib/helpers.d.ts +0 -90
- package/dist/lib/helpers.d.ts.map +0 -1
- package/dist/lib/helpers.js +0 -1031
- package/dist/lib/index.d.ts +0 -5
- package/dist/lib/index.d.ts.map +0 -1
- package/dist/lib/index.js +0 -21
- package/dist/lib/radon/artifacts.d.ts +0 -55
- package/dist/lib/radon/artifacts.d.ts.map +0 -1
- package/dist/lib/radon/artifacts.js +0 -347
- package/dist/lib/radon/ccdr/eth.d.ts +0 -100
- package/dist/lib/radon/ccdr/eth.d.ts.map +0 -1
- package/dist/lib/radon/ccdr/eth.js +0 -237
- package/dist/lib/radon/ccdr/index.d.ts +0 -34
- package/dist/lib/radon/ccdr/index.d.ts.map +0 -1
- package/dist/lib/radon/ccdr/index.js +0 -63
- package/dist/lib/radon/ccdr/wit.d.ts +0 -29
- package/dist/lib/radon/ccdr/wit.d.ts.map +0 -1
- package/dist/lib/radon/ccdr/wit.js +0 -60
- package/dist/lib/radon/filters.d.ts +0 -14
- package/dist/lib/radon/filters.d.ts.map +0 -1
- package/dist/lib/radon/filters.js +0 -47
- package/dist/lib/radon/index.d.ts +0 -36
- package/dist/lib/radon/index.d.ts.map +0 -1
- package/dist/lib/radon/index.js +0 -154
- package/dist/lib/radon/reducers.d.ts +0 -29
- package/dist/lib/radon/reducers.d.ts.map +0 -1
- package/dist/lib/radon/reducers.js +0 -101
- package/dist/lib/radon/retrievals.d.ts +0 -120
- package/dist/lib/radon/retrievals.d.ts.map +0 -1
- package/dist/lib/radon/retrievals.js +0 -358
- package/dist/lib/radon/sources.d.ts +0 -102
- package/dist/lib/radon/sources.d.ts.map +0 -1
- package/dist/lib/radon/sources.js +0 -294
- package/dist/lib/radon/types.d.ts +0 -521
- package/dist/lib/radon/types.d.ts.map +0 -1
- package/dist/lib/radon/types.js +0 -1066
- package/dist/lib/radon/utils.d.ts +0 -55
- package/dist/lib/radon/utils.d.ts.map +0 -1
- package/dist/lib/radon/utils.js +0 -181
- package/dist/lib/rpc/farm.d.ts +0 -66
- package/dist/lib/rpc/farm.d.ts.map +0 -1
- package/dist/lib/rpc/farm.js +0 -808
- package/dist/lib/rpc/index.d.ts +0 -3
- package/dist/lib/rpc/index.d.ts.map +0 -1
- package/dist/lib/rpc/index.js +0 -19
- package/dist/lib/rpc/node.d.ts +0 -38
- package/dist/lib/rpc/node.d.ts.map +0 -1
- package/dist/lib/rpc/node.js +0 -335
- package/dist/lib/rpc/nodes.d.ts +0 -40
- package/dist/lib/rpc/nodes.d.ts.map +0 -1
- package/dist/lib/rpc/nodes.js +0 -531
- package/dist/lib/rpc/provider.d.ts +0 -72
- package/dist/lib/rpc/provider.d.ts.map +0 -1
- package/dist/lib/rpc/provider.js +0 -402
- package/dist/lib/rpc/reporter.d.ts +0 -18
- package/dist/lib/rpc/reporter.d.ts.map +0 -1
- package/dist/lib/rpc/reporter.js +0 -99
- package/dist/lib/rpc/types.d.ts +0 -396
- package/dist/lib/rpc/types.d.ts.map +0 -1
- package/dist/lib/rpc/types.js +0 -81
- package/dist/lib/rpc/wallet.d.ts +0 -72
- package/dist/lib/rpc/wallet.d.ts.map +0 -1
- package/dist/lib/rpc/wallet.js +0 -41
- package/dist/lib/types.d.ts +0 -19
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js +0 -7
- package/dist/lib/utils.d.ts +0 -5
- package/dist/lib/utils.d.ts.map +0 -1
- package/dist/lib/utils.js +0 -51
- package/dist/src/lib/rpc/reporter.d.ts +0 -17
- package/dist/src/lib/rpc/reporter.d.ts.map +0 -1
- package/dist/src/lib/rpc/reporter.js +0 -27
package/dist/bin/helpers.js
DELETED
|
@@ -1,866 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
13
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
39
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
40
|
-
if (!m) return o;
|
|
41
|
-
var i = m.call(o), r, ar = [], e;
|
|
42
|
-
try {
|
|
43
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
44
|
-
}
|
|
45
|
-
catch (error) { e = { error: error }; }
|
|
46
|
-
finally {
|
|
47
|
-
try {
|
|
48
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
49
|
-
}
|
|
50
|
-
finally { if (e) throw e.error; }
|
|
51
|
-
}
|
|
52
|
-
return ar;
|
|
53
|
-
};
|
|
54
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
55
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
56
|
-
if (ar || !(i in from)) {
|
|
57
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
58
|
-
ar[i] = from[i];
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
62
|
-
};
|
|
63
|
-
var cbor = require("cbor");
|
|
64
|
-
var exec = require("child_process").exec;
|
|
65
|
-
var net = require("net");
|
|
66
|
-
var os = require("os");
|
|
67
|
-
var readline = require('readline');
|
|
68
|
-
var colorstrip = function (str) { return str.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, ''); };
|
|
69
|
-
var commas = function (number) {
|
|
70
|
-
parts = number.toString().split('.');
|
|
71
|
-
var result = parts.length <= 1
|
|
72
|
-
? "".concat(parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","))
|
|
73
|
-
: "".concat(parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","), ".").concat(parts[1]);
|
|
74
|
-
return result;
|
|
75
|
-
};
|
|
76
|
-
var fromNanowits = function (x, d) { return (parseInt(x) / Math.pow(10, 9)).toFixed(d || 2); };
|
|
77
|
-
var fromWits = function (x) { return Math.floor(parseFloat(x) * Math.pow(10, 9)); };
|
|
78
|
-
function toFixedTrunc(x, n) {
|
|
79
|
-
var v = (typeof x === 'string' ? x : x.toString()).split('.');
|
|
80
|
-
if (n <= 0)
|
|
81
|
-
return v[0];
|
|
82
|
-
var f = v[1] || '';
|
|
83
|
-
if (f.length > n)
|
|
84
|
-
return "".concat(v[0], ".").concat(f.substr(0, n));
|
|
85
|
-
while (f.length < n)
|
|
86
|
-
f += '0';
|
|
87
|
-
return "".concat(v[0], ".").concat(f);
|
|
88
|
-
}
|
|
89
|
-
;
|
|
90
|
-
var whole_wits = function (number, digits) {
|
|
91
|
-
var lookup = [
|
|
92
|
-
{ value: 1, symbol: " nWits" },
|
|
93
|
-
{ value: 1e3, symbol: " μWits" },
|
|
94
|
-
{ value: 1e6, symbol: " mWits" },
|
|
95
|
-
{ value: 1e9, symbol: " Wits" },
|
|
96
|
-
{ value: 1e12, symbol: " KWits" },
|
|
97
|
-
{ value: 1e15, symbol: " MWits" },
|
|
98
|
-
];
|
|
99
|
-
var regexp = /\.0+$|(?<=\.[0-9])0+$/;
|
|
100
|
-
var item = lookup.findLast(function (item) { return number >= item.value; });
|
|
101
|
-
return item ? toFixedTrunc(commas(number / item.value), digits). /*replace(regexp, "")*/concat(item.symbol) : "(no Wits)";
|
|
102
|
-
};
|
|
103
|
-
var bblue = function (str) { return "\u001B[1;98;44m".concat(str, "\u001B[0;0;0m"); };
|
|
104
|
-
var bcyan = function (str) { return "\u001B[38;46m".concat(str, "\u001B[0;0m"); };
|
|
105
|
-
var bgreen = function (str) { return "\u001B[30;42m".concat(str, "\u001B[0;0m"); };
|
|
106
|
-
var bred = function (str) { return "\u001B[30;41m".concat(str, "\u001B[0;0m"); };
|
|
107
|
-
var bviolet = function (str) { return "\u001B[30;45m".concat(str, "\u001B[0;0m"); };
|
|
108
|
-
var lcyan = function (str) { return "\u001B[1;96m".concat(str, "\u001B[0m"); };
|
|
109
|
-
var lgray = function (str) { return "\u001B[1;90m".concat(str, "\u001B[0m"); };
|
|
110
|
-
var lgreen = function (str) { return "\u001B[1;92m".concat(str, "\u001B[0m"); };
|
|
111
|
-
var lmagenta = function (str) { return "\u001B[1;95m".concat(str, "\u001B[0m"); };
|
|
112
|
-
var lyellow = function (str) { return "\u001B[1;93m".concat(str, "\u001B[0m"); };
|
|
113
|
-
var mblue = function (str) { return "\u001B[94m".concat(str, "\u001B[0m"); };
|
|
114
|
-
var mcyan = function (str) { return "\u001B[96m".concat(str, "\u001B[0m"); };
|
|
115
|
-
var mgreen = function (str) { return "\u001B[92m".concat(str, "\u001B[0m"); };
|
|
116
|
-
var mmagenta = function (str) { return "\u001B[0;95m".concat(str, "\u001B[0m"); };
|
|
117
|
-
var mred = function (str) { return "\u001B[91m".concat(str, "\u001B[0m"); };
|
|
118
|
-
var myellow = function (str) { return "\u001B[93m".concat(str, "\u001B[0m"); };
|
|
119
|
-
var blue = function (str) { return "\u001B[34m".concat(str, "\u001B[0m"); };
|
|
120
|
-
var cyan = function (str) { return "\u001B[36m".concat(str, "\u001B[0m"); };
|
|
121
|
-
var gray = function (str) { return "\u001B[90m".concat(str, "\u001B[0m"); };
|
|
122
|
-
var green = function (str) { return "\u001B[32m".concat(str, "\u001B[0m"); };
|
|
123
|
-
var magenta = function (str) { return "\u001B[0;35m".concat(str, "\u001B[0m"); };
|
|
124
|
-
var normal = function (str) { return "\u001B[98m".concat(str, "\u001B[0m"); };
|
|
125
|
-
var red = function (str) { return "\u001B[31m".concat(str, "\u001B[0m"); };
|
|
126
|
-
var white = function (str) { return "\u001B[1;98m".concat(str, "\u001B[0m"); };
|
|
127
|
-
var yellow = function (str) { return "\u001B[33m".concat(str, "\u001B[0m"); };
|
|
128
|
-
function countLeaves(t, obj) {
|
|
129
|
-
if (!obj)
|
|
130
|
-
return 0;
|
|
131
|
-
if (obj instanceof t)
|
|
132
|
-
return 1;
|
|
133
|
-
if (Array.isArray(obj))
|
|
134
|
-
return obj.reduce(function (sum, item) { return sum + countLeaves(t, item); }, 0);
|
|
135
|
-
else
|
|
136
|
-
return Object.values(obj).reduce(function (sum, item) { return sum + countLeaves(t, item); }, 0);
|
|
137
|
-
}
|
|
138
|
-
function deleteExtraFlags(args) {
|
|
139
|
-
return args.filter(function (arg) { return !arg.startsWith('--'); });
|
|
140
|
-
}
|
|
141
|
-
function cmd() {
|
|
142
|
-
var command = [];
|
|
143
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
144
|
-
command[_i] = arguments[_i];
|
|
145
|
-
}
|
|
146
|
-
return new Promise(function (resolve, reject) {
|
|
147
|
-
exec(command.join(" "), { maxBuffer: 1024 * 1024 * 10 }, function (error, stdout, stderr) {
|
|
148
|
-
if (error) {
|
|
149
|
-
reject(error);
|
|
150
|
-
}
|
|
151
|
-
if (stderr) {
|
|
152
|
-
reject(stderr);
|
|
153
|
-
}
|
|
154
|
-
resolve(stdout);
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
;
|
|
159
|
-
function execRadonBytecode(bytecode) {
|
|
160
|
-
var flags = [];
|
|
161
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
162
|
-
flags[_i - 1] = arguments[_i];
|
|
163
|
-
}
|
|
164
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
165
|
-
var npx;
|
|
166
|
-
return __generator(this, function (_a) {
|
|
167
|
-
if (!isHexString(bytecode)) {
|
|
168
|
-
throw EvalError("invalid hex string");
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
npx = os.type() === "Windows_NT" ? "npx.cmd" : "npx";
|
|
172
|
-
return [2 /*return*/, cmd.apply(void 0, __spreadArray([npx, "witnet", "radon", "dryrun", bytecode], __read(flags), false)).catch(function (err) {
|
|
173
|
-
var errorMessage = err.message.split('\n').slice(1).join('\n').trim();
|
|
174
|
-
var errorRegex = /.*^error: (?<message>.*)$.*/gm;
|
|
175
|
-
var matched = errorRegex.exec(err.message);
|
|
176
|
-
if (matched) {
|
|
177
|
-
errorMessage = matched.groups.message;
|
|
178
|
-
}
|
|
179
|
-
console.error(errorMessage || err);
|
|
180
|
-
})];
|
|
181
|
-
}
|
|
182
|
-
return [2 /*return*/];
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
function extractFromArgs(args, flags) {
|
|
187
|
-
var curated = {};
|
|
188
|
-
if (args && flags) {
|
|
189
|
-
Object.keys(flags).forEach(function (flag) {
|
|
190
|
-
var flagIndex = args.indexOf("--".concat(flag));
|
|
191
|
-
if (flagIndex >= 0) {
|
|
192
|
-
if (flags[flag].param) {
|
|
193
|
-
curated[flag] = args[flagIndex];
|
|
194
|
-
if (!args[flagIndex + 1] || args[flagIndex + 1].startsWith('--')) {
|
|
195
|
-
throw "Missing required parameter for --".concat(flag);
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
curated[flag] = args[flagIndex + 1];
|
|
199
|
-
args.splice(flagIndex, 2);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
curated[flag] = true;
|
|
204
|
-
args.splice(flagIndex, 1);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
return [args, curated,];
|
|
210
|
-
}
|
|
211
|
-
function fromHexString(hexString) {
|
|
212
|
-
if (hexString.startsWith("0x"))
|
|
213
|
-
hexString = hexString.slice(2);
|
|
214
|
-
return Uint8Array.from(hexString.match(/.{1,2}/g).map(function (byte) { return parseInt(byte, 16); }));
|
|
215
|
-
}
|
|
216
|
-
function ipIsPrivateOrLocalhost(ip) {
|
|
217
|
-
if (ip.substring(0, 7) === "::ffff:")
|
|
218
|
-
ip = ip.substring(7);
|
|
219
|
-
if (net.isIPv4(ip)) {
|
|
220
|
-
// check localhost
|
|
221
|
-
if (ip === '127.0.0.1')
|
|
222
|
-
return true;
|
|
223
|
-
// 10.0.0.0 - 10.255.255.255 || 172.16.0.0 - 172.31.255.255 || 192.168.0.0 - 192.168.255.255
|
|
224
|
-
return /^(10)\.(.*)\.(.*)\.(.*)$/.test(ip) || /^(172)\.(1[6-9]|2[0-9]|3[0-1])\.(.*)\.(.*)$/.test(ip) || /^(192)\.(168)\.(.*)\.(.*)$/.test(ip);
|
|
225
|
-
}
|
|
226
|
-
// else: ip is IPv6
|
|
227
|
-
var firstWord = ip.split(":").find(function (el) { return !!el; }); //get first not empty word
|
|
228
|
-
// equivalent of 127.0.0.1 in IPv6
|
|
229
|
-
if (ip === "::1")
|
|
230
|
-
return true;
|
|
231
|
-
// The original IPv6 Site Local addresses (fec0::/10) are deprecated. Range: fec0 - feff
|
|
232
|
-
else if (/^fe[c-f][0-f]$/.test(firstWord))
|
|
233
|
-
return true;
|
|
234
|
-
// These days Unique Local Addresses (ULA) are used in place of Site Local.
|
|
235
|
-
// Range: fc00 - fcff
|
|
236
|
-
else if (/^fc[0-f]{2}$/.test(firstWord))
|
|
237
|
-
return true;
|
|
238
|
-
// Range: fd00 - fcff
|
|
239
|
-
else if (/^fd[0-f]{2}$/.test(firstWord))
|
|
240
|
-
return true;
|
|
241
|
-
// Link local addresses (prefixed with fe80) are not routable
|
|
242
|
-
else if (firstWord === "fe80")
|
|
243
|
-
return true;
|
|
244
|
-
// Discard Prefix
|
|
245
|
-
else if (firstWord === "100")
|
|
246
|
-
return true;
|
|
247
|
-
// Any other IP address is not Unique Local Address (ULA)
|
|
248
|
-
return false;
|
|
249
|
-
}
|
|
250
|
-
function isHexStringOfLength(str, length) {
|
|
251
|
-
return (isHexString(str)
|
|
252
|
-
&& ((str.startsWith('0x') && str.slice(2).length === length * 2)
|
|
253
|
-
|| str.length === length * 2)) || isWildcard(str);
|
|
254
|
-
}
|
|
255
|
-
function isHexString(str) {
|
|
256
|
-
return (typeof str === 'string'
|
|
257
|
-
&& ((str.startsWith("0x") && /^[a-fA-F0-9]+$/i.test(str.slice(2)))
|
|
258
|
-
|| /^[a-fA-F0-9]+$/i.test(str))) || isWildcard(str);
|
|
259
|
-
}
|
|
260
|
-
function toHexString(buffer, prefix0x) {
|
|
261
|
-
if (prefix0x === void 0) { prefix0x = false; }
|
|
262
|
-
if (buffer instanceof Uint8Array)
|
|
263
|
-
buffer = Buffer.from(buffer);
|
|
264
|
-
return (prefix0x ? "0x" : "") + Array.prototype.map.call(buffer, function (x) { return ('00' + x.toString(16)).slice(-2); })
|
|
265
|
-
.join('')
|
|
266
|
-
.match(/[a-fA-F0-9]{2}/g)
|
|
267
|
-
.join('');
|
|
268
|
-
}
|
|
269
|
-
function parseURL(url) {
|
|
270
|
-
try {
|
|
271
|
-
var parsedUrl = new URL(url);
|
|
272
|
-
return [
|
|
273
|
-
parsedUrl.protocol + "//",
|
|
274
|
-
parsedUrl.host,
|
|
275
|
-
parsedUrl.pathname.slice(1),
|
|
276
|
-
parsedUrl.search.slice(1)
|
|
277
|
-
];
|
|
278
|
-
}
|
|
279
|
-
catch (_a) {
|
|
280
|
-
throw new TypeError("Invalid URL was provided: ".concat(url));
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
function showUsage(cmd, module) {
|
|
284
|
-
showUsageHeadline(cmd);
|
|
285
|
-
if (module === null || module === void 0 ? void 0 : module.flags)
|
|
286
|
-
showUsageFlags(module.flags);
|
|
287
|
-
if (module === null || module === void 0 ? void 0 : module.router)
|
|
288
|
-
showUsageRouter(module.router);
|
|
289
|
-
if (module === null || module === void 0 ? void 0 : module.envars)
|
|
290
|
-
showUsageEnvars(module.envars);
|
|
291
|
-
}
|
|
292
|
-
function showUsageRouter(router) {
|
|
293
|
-
var cmds = Object.entries(router);
|
|
294
|
-
if (cmds.length > 0) {
|
|
295
|
-
console.info("\nSUBCOMMANDS:");
|
|
296
|
-
var maxLength_1 = Math.max.apply(Math, __spreadArray([], __read(cmds.map(function (_a) {
|
|
297
|
-
var _b = __read(_a, 1), cmd = _b[0];
|
|
298
|
-
return cmd.length;
|
|
299
|
-
})), false));
|
|
300
|
-
cmds.forEach(function (cmd) {
|
|
301
|
-
console.info(" ", "".concat(cmd[0]).concat(" ".repeat(maxLength_1 - cmd[0].length)), " ", cmd[1].hint);
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
function showUsageError(cmd, subcmd, module, flags, error) {
|
|
306
|
-
var _a;
|
|
307
|
-
if (flags === void 0) { flags = {}; }
|
|
308
|
-
showUsageSubcommand(cmd, subcmd, module, error);
|
|
309
|
-
if (error) {
|
|
310
|
-
console.info("\nERROR:");
|
|
311
|
-
if (flags === null || flags === void 0 ? void 0 : flags.debug) {
|
|
312
|
-
console.error(error);
|
|
313
|
-
}
|
|
314
|
-
else {
|
|
315
|
-
console.error(((_a = error === null || error === void 0 ? void 0 : error.stack) === null || _a === void 0 ? void 0 : _a.split('\n')[0]) || error);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
function showUsageEnvars(envars) {
|
|
320
|
-
envars = Object.entries(envars);
|
|
321
|
-
if (envars.length > 0) {
|
|
322
|
-
console.info("\nENVARS:");
|
|
323
|
-
var maxWidth_1 = Math.max.apply(Math, __spreadArray([], __read(envars.map(function (_a) {
|
|
324
|
-
var _b = __read(_a, 1), envar = _b[0];
|
|
325
|
-
return envar.length;
|
|
326
|
-
})), false));
|
|
327
|
-
envars.forEach(function (_a) {
|
|
328
|
-
var _b = __read(_a, 2), envar = _b[0], hint = _b[1];
|
|
329
|
-
if (envar.toUpperCase().indexOf("KEY") < 0 && process.env[envar]) {
|
|
330
|
-
console.info(" ", "".concat(yellow(envar.toUpperCase())).concat(" ".repeat(maxWidth_1 - envar.length)), " => Settled to \"".concat(myellow(process.env[envar]), "\""));
|
|
331
|
-
}
|
|
332
|
-
else {
|
|
333
|
-
console.info(" ", "".concat(yellow(envar.toUpperCase())).concat(" ".repeat(maxWidth_1 - envar.length)), " ".concat(hint));
|
|
334
|
-
}
|
|
335
|
-
});
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
function showUsageFlags(flags) {
|
|
339
|
-
flags = Object.entries(flags);
|
|
340
|
-
if (flags.length > 0) {
|
|
341
|
-
console.info("\nFLAGS:");
|
|
342
|
-
var maxLength_2 = Math.max.apply(Math, __spreadArray([], __read(flags.filter(function (_a) {
|
|
343
|
-
var _b = __read(_a, 2), hint = _b[1].hint;
|
|
344
|
-
return hint;
|
|
345
|
-
}).map(function (_a) {
|
|
346
|
-
var _b = __read(_a, 2), key = _b[0], param = _b[1].param;
|
|
347
|
-
return param ? key.length + param.length + 3 : key.length;
|
|
348
|
-
})), false));
|
|
349
|
-
flags.forEach(function (flag) {
|
|
350
|
-
var str = "".concat(flag[0]).concat(flag[1].param ? gray(" <".concat(flag[1].param, ">")) : "");
|
|
351
|
-
if (flag[1].hint) {
|
|
352
|
-
console.info(" ", "--".concat(str).concat(" ".repeat(maxLength_2 - colorstrip(str).length)), " ", flag[1].hint);
|
|
353
|
-
}
|
|
354
|
-
});
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
function showUsageHeadline(cmd, subcmd, module) {
|
|
358
|
-
var _a, _b, _c;
|
|
359
|
-
console.info("USAGE:");
|
|
360
|
-
if (subcmd) {
|
|
361
|
-
var params = (_a = module.router[subcmd]) === null || _a === void 0 ? void 0 : _a.params;
|
|
362
|
-
var options = (_b = module.router[subcmd]) === null || _b === void 0 ? void 0 : _b.options;
|
|
363
|
-
if (params) {
|
|
364
|
-
var optionalize_1 = function (str) { return str.endsWith(' ...]') ? "[<".concat(str.slice(1, -5), "> ...]") : (str[0] === '[' ? "[<".concat(str.slice(1, -1), ">]") : "<".concat(str, ">")); };
|
|
365
|
-
if (Array.isArray(params)) {
|
|
366
|
-
params = params.map(function (param) { return optionalize_1(param); }).join(' ') + " ";
|
|
367
|
-
}
|
|
368
|
-
else {
|
|
369
|
-
params = optionalize_1(params);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
console.info(" ".concat(white("npx witnet ".concat(cmd)), " [FLAGS] ").concat(white(subcmd), " ").concat(params ? green(params) + " " : "").concat(options && Object.keys(options).length > 0 ? "[OPTIONS]" : ""));
|
|
373
|
-
if ((_c = module === null || module === void 0 ? void 0 : module.router[subcmd]) === null || _c === void 0 ? void 0 : _c.hint) {
|
|
374
|
-
console.info("\nDESCRIPTION:");
|
|
375
|
-
console.info(" ".concat(module.router[subcmd].hint));
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
else {
|
|
379
|
-
console.info(" ".concat(white("npx witnet ".concat(cmd)), " [FLAGS] <SUBCOMMAND> ... [OPTIONS]"));
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
function showUsageOptions(options) {
|
|
383
|
-
options = Object.entries(options);
|
|
384
|
-
if (options.length > 0) {
|
|
385
|
-
console.info("\nOPTIONS:");
|
|
386
|
-
var maxLength_3 = options
|
|
387
|
-
.map(function (option) { return option[1].param ? option[1].param.length + option[0].length + 3 : option[0].length; })
|
|
388
|
-
.reduce(function (prev, curr) { return curr > prev ? curr : prev; });
|
|
389
|
-
options.forEach(function (option) {
|
|
390
|
-
if (option[1].hint) {
|
|
391
|
-
var str = "".concat(option[0]).concat(option[1].param ? gray(" <".concat(option[1].param, ">")) : "");
|
|
392
|
-
console.info(" ", "--".concat(str).concat(" ".repeat(maxLength_3 - colorstrip(str).length)), " ", option[1].hint);
|
|
393
|
-
}
|
|
394
|
-
});
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
function showUsageSubcommand(cmd, subcmd, module) {
|
|
398
|
-
var _a, _b;
|
|
399
|
-
showUsageHeadline(cmd, subcmd, module);
|
|
400
|
-
if (module === null || module === void 0 ? void 0 : module.flags)
|
|
401
|
-
showUsageFlags(module === null || module === void 0 ? void 0 : module.flags);
|
|
402
|
-
if ((_a = module === null || module === void 0 ? void 0 : module.router[subcmd]) === null || _a === void 0 ? void 0 : _a.options)
|
|
403
|
-
showUsageOptions((_b = module.router[subcmd]) === null || _b === void 0 ? void 0 : _b.options);
|
|
404
|
-
if (module === null || module === void 0 ? void 0 : module.envars)
|
|
405
|
-
showUsageEnvars(module === null || module === void 0 ? void 0 : module.envars);
|
|
406
|
-
}
|
|
407
|
-
function showVersion() {
|
|
408
|
-
console.info("".concat(mcyan("Wit/Oracle Toolkit CLI v".concat(require("../../package.json").version))));
|
|
409
|
-
}
|
|
410
|
-
function getWildcardsCountFromString(str) {
|
|
411
|
-
var maxArgsIndex = 0;
|
|
412
|
-
if (str) {
|
|
413
|
-
var match = void 0;
|
|
414
|
-
var regexp = /\\\d\\/g;
|
|
415
|
-
while ((match = regexp.exec(str)) !== null) {
|
|
416
|
-
var argsIndex = parseInt(match[0][1]) + 1;
|
|
417
|
-
if (argsIndex > maxArgsIndex)
|
|
418
|
-
maxArgsIndex = argsIndex;
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
return maxArgsIndex;
|
|
422
|
-
}
|
|
423
|
-
function isWildcard(str) {
|
|
424
|
-
return str.length == 3 && /\\\d\\/g.test(str);
|
|
425
|
-
}
|
|
426
|
-
function replaceWildcards(obj, args) {
|
|
427
|
-
if (args.length > 10)
|
|
428
|
-
args = args.slice(0, 10);
|
|
429
|
-
if (obj && typeof obj === "string") {
|
|
430
|
-
for (var argIndex = 0; argIndex < args.length; argIndex++) {
|
|
431
|
-
var wildcard = "\\".concat(argIndex, "\\");
|
|
432
|
-
obj = obj.replaceAll(wildcard, args[argIndex]);
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
else if (obj && Array.isArray(obj)) {
|
|
436
|
-
obj = obj.map(function (value) { return typeof value === "string" || Array.isArray(value)
|
|
437
|
-
? replaceWildcards(value, args)
|
|
438
|
-
: value; });
|
|
439
|
-
}
|
|
440
|
-
return obj;
|
|
441
|
-
}
|
|
442
|
-
function spliceWildcard(obj, argIndex, argValue, argsCount) {
|
|
443
|
-
if (obj && typeof obj === "string") {
|
|
444
|
-
var wildcard = "\\".concat(argIndex, "\\");
|
|
445
|
-
obj = obj.replaceAll(wildcard, argValue);
|
|
446
|
-
for (var j = argIndex + 1; j < argsCount; j++) {
|
|
447
|
-
obj = obj.replaceAll("\\".concat(j, "\\"), "\\".concat(j - 1, "\\"));
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
else if (obj && Array.isArray(obj)) {
|
|
451
|
-
obj = obj.map(function (value) { return typeof value === "string" || Array.isArray(value)
|
|
452
|
-
? spliceWildcard(value, argIndex, argValue, argsCount)
|
|
453
|
-
: value; });
|
|
454
|
-
}
|
|
455
|
-
return obj;
|
|
456
|
-
}
|
|
457
|
-
function toolkitRun(settings, args) {
|
|
458
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
459
|
-
var cmd;
|
|
460
|
-
return __generator(this, function (_a) {
|
|
461
|
-
cmd = "".concat(settings.paths.toolkitBinPath, " ").concat(args.join(' '));
|
|
462
|
-
return [2 /*return*/, new Promise(function (resolve, reject) {
|
|
463
|
-
exec(cmd, { maxBuffer: 1024 * 1024 * 10 }, function (error, stdout, stderr) {
|
|
464
|
-
if (error) {
|
|
465
|
-
reject(error);
|
|
466
|
-
}
|
|
467
|
-
if (stderr) {
|
|
468
|
-
reject(stderr);
|
|
469
|
-
}
|
|
470
|
-
resolve(stdout);
|
|
471
|
-
});
|
|
472
|
-
})];
|
|
473
|
-
});
|
|
474
|
-
});
|
|
475
|
-
}
|
|
476
|
-
function toUpperCamelCase(str) {
|
|
477
|
-
return str.replace(/\b(\w)/g, function (match, capture) {
|
|
478
|
-
return capture.toUpperCase();
|
|
479
|
-
}).replace(/\s+/g, '');
|
|
480
|
-
}
|
|
481
|
-
function toUtf8Array(str) {
|
|
482
|
-
var utf8 = [];
|
|
483
|
-
for (var i = 0; i < str.length; i++) {
|
|
484
|
-
var charcode = str.charCodeAt(i);
|
|
485
|
-
if (charcode < 0x80)
|
|
486
|
-
utf8.push(charcode);
|
|
487
|
-
else if (charcode < 0x800) {
|
|
488
|
-
utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));
|
|
489
|
-
}
|
|
490
|
-
else if (charcode < 0xd800 || charcode >= 0xe000) {
|
|
491
|
-
utf8.push(0xe0 | (charcode >> 12), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f));
|
|
492
|
-
}
|
|
493
|
-
// surrogate pair
|
|
494
|
-
else {
|
|
495
|
-
i++;
|
|
496
|
-
// UTF-16 encodes 0x10000-0x10FFFF by
|
|
497
|
-
// subtracting 0x10000 and splitting the
|
|
498
|
-
// 20 bits of 0x0-0xFFFFF into two halves
|
|
499
|
-
charcode = 0x10000 + (((charcode & 0x3ff) << 10)
|
|
500
|
-
| (str.charCodeAt(i) & 0x3ff));
|
|
501
|
-
utf8.push(0xf0 | (charcode >> 18), 0x80 | ((charcode >> 12) & 0x3f), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f));
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
return utf8;
|
|
505
|
-
}
|
|
506
|
-
function utf8ArrayToStr(array) {
|
|
507
|
-
var out, i, len, c;
|
|
508
|
-
var char2, char3;
|
|
509
|
-
out = "";
|
|
510
|
-
len = array.length;
|
|
511
|
-
i = 0;
|
|
512
|
-
while (i < len) {
|
|
513
|
-
c = array[i++];
|
|
514
|
-
switch (c >> 4) {
|
|
515
|
-
case 0:
|
|
516
|
-
case 1:
|
|
517
|
-
case 2:
|
|
518
|
-
case 3:
|
|
519
|
-
case 4:
|
|
520
|
-
case 5:
|
|
521
|
-
case 6:
|
|
522
|
-
case 7:
|
|
523
|
-
// 0xxxxxxx
|
|
524
|
-
out += String.fromCharCode(c);
|
|
525
|
-
break;
|
|
526
|
-
case 12:
|
|
527
|
-
case 13:
|
|
528
|
-
// 110x xxxx 10xx xxxx
|
|
529
|
-
char2 = array[i++];
|
|
530
|
-
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
|
|
531
|
-
break;
|
|
532
|
-
case 14:
|
|
533
|
-
// 1110 xxxx 10xx xxxx 10xx xxxx
|
|
534
|
-
char2 = array[i++];
|
|
535
|
-
char3 = array[i++];
|
|
536
|
-
out += String.fromCharCode(((c & 0x0F) << 12) |
|
|
537
|
-
((char2 & 0x3F) << 6) |
|
|
538
|
-
((char3 & 0x3F) << 0));
|
|
539
|
-
break;
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
return out;
|
|
543
|
-
}
|
|
544
|
-
function prompt(question) {
|
|
545
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
546
|
-
var readlineInterface;
|
|
547
|
-
return __generator(this, function (_a) {
|
|
548
|
-
readlineInterface = readline.createInterface({
|
|
549
|
-
input: process.stdin,
|
|
550
|
-
output: process.stdout
|
|
551
|
-
});
|
|
552
|
-
return [2 /*return*/, new Promise(function (resolve, _) {
|
|
553
|
-
readlineInterface.question("".concat(question, " "), function (response) {
|
|
554
|
-
readlineInterface.close();
|
|
555
|
-
resolve(response.trim());
|
|
556
|
-
});
|
|
557
|
-
})];
|
|
558
|
-
});
|
|
559
|
-
});
|
|
560
|
-
}
|
|
561
|
-
function prompter(promise) {
|
|
562
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
563
|
-
var loading;
|
|
564
|
-
return __generator(this, function (_a) {
|
|
565
|
-
loading = (function () {
|
|
566
|
-
var h = ['|', '/', '-', '\\'];
|
|
567
|
-
var i = 0;
|
|
568
|
-
return setInterval(function () {
|
|
569
|
-
i = (i > 3) ? 0 : i;
|
|
570
|
-
process.stdout.write("\b\b".concat(h[i], " "));
|
|
571
|
-
i++;
|
|
572
|
-
}, 50);
|
|
573
|
-
})();
|
|
574
|
-
return [2 /*return*/, promise
|
|
575
|
-
.then(function (result) {
|
|
576
|
-
clearInterval(loading);
|
|
577
|
-
process.stdout.write('\b\b');
|
|
578
|
-
return result;
|
|
579
|
-
})];
|
|
580
|
-
});
|
|
581
|
-
});
|
|
582
|
-
}
|
|
583
|
-
function traceChecklists(checklists) {
|
|
584
|
-
if (checklists && Object.keys(checklists).length > 0) {
|
|
585
|
-
var headlines = __spreadArray(["NODES"], __read(Object.keys(checklists).map(function (key) { return ":".concat(key); })), false);
|
|
586
|
-
checklists = Object.values(checklists);
|
|
587
|
-
var urls = Object.keys(checklists[0]);
|
|
588
|
-
var records = urls.map(function (url) {
|
|
589
|
-
var errors = checklists.filter(function (checklist) { return checklist[url] instanceof Error; }).length;
|
|
590
|
-
return __spreadArray([
|
|
591
|
-
errors === checklists.length ? red(url) : (errors > 0 ? myellow(url) : mcyan(url))
|
|
592
|
-
], __read(checklists.map(function (checklist) { return checklist[url] instanceof Error
|
|
593
|
-
? red(checklist[url])
|
|
594
|
-
: (checklist[url] === true ? lcyan("Aye") : cyan("Nay")); })), false);
|
|
595
|
-
});
|
|
596
|
-
traceTable(records, {
|
|
597
|
-
headlines: headlines,
|
|
598
|
-
maxColumnWidth: 31,
|
|
599
|
-
});
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
function traceHeader(headline, color, indent) {
|
|
603
|
-
if (color === void 0) { color = normal; }
|
|
604
|
-
if (indent === void 0) { indent = ""; }
|
|
605
|
-
console.info("".concat(indent, "\u250C\u2500").concat("─".repeat(headline.length), "\u2500\u2510"));
|
|
606
|
-
console.info("".concat(indent, "\u2502 ").concat(color(headline), " \u2502"));
|
|
607
|
-
console.info("".concat(indent, "\u2514\u2500").concat("─".repeat(headline.length), "\u2500\u2518"));
|
|
608
|
-
}
|
|
609
|
-
function traceTable(records, options) {
|
|
610
|
-
var stringify = function (data, humanizers, index) { var _a; return humanizers && humanizers[index] ? humanizers[index](data).toString() : (_a = data === null || data === void 0 ? void 0 : data.toString()) !== null && _a !== void 0 ? _a : ""; };
|
|
611
|
-
var max = function (a, b) { return a > b ? a : b; };
|
|
612
|
-
var reduceMax = function (numbers) { return numbers.reduce(function (curr, prev) { return prev > curr ? prev : curr; }, 0); };
|
|
613
|
-
if (!options)
|
|
614
|
-
options = {};
|
|
615
|
-
var indent = (options === null || options === void 0 ? void 0 : options.indent) || "";
|
|
616
|
-
var numColumns = reduceMax(records.map(function (record) { return (record === null || record === void 0 ? void 0 : record.length) || 1; }));
|
|
617
|
-
var maxColumnWidth = (options === null || options === void 0 ? void 0 : options.maxColumnWidth) || 80;
|
|
618
|
-
var table = transpose(records, numColumns);
|
|
619
|
-
options.widths = (options === null || options === void 0 ? void 0 : options.widths) || table.map(function (column, index) {
|
|
620
|
-
var maxWidth = reduceMax(column.map(function (field) { return colorstrip(stringify(field, options === null || options === void 0 ? void 0 : options.humanizers, index)).length; }));
|
|
621
|
-
if ((options === null || options === void 0 ? void 0 : options.headlines) && options.headlines[index]) {
|
|
622
|
-
maxWidth = max(maxWidth, colorstrip(options.headlines[index].replaceAll(':', '')).length);
|
|
623
|
-
}
|
|
624
|
-
return Math.min(maxWidth, maxColumnWidth);
|
|
625
|
-
});
|
|
626
|
-
var headline = options.widths.map(function (maxWidth) { return "─".repeat(maxWidth); });
|
|
627
|
-
console.info("".concat(indent, "\u250C\u2500").concat(headline.join("─┬─"), "\u2500\u2510"));
|
|
628
|
-
if (options === null || options === void 0 ? void 0 : options.headlines) {
|
|
629
|
-
headline = options.widths.map(function (maxWidth, index) {
|
|
630
|
-
var caption = options.headlines[index].replaceAll(':', '');
|
|
631
|
-
var captionLength = colorstrip(caption).length;
|
|
632
|
-
return "".concat(white(caption)).concat(" ".repeat(maxWidth - captionLength));
|
|
633
|
-
});
|
|
634
|
-
console.info("".concat(indent, "\u2502 ").concat(headline.join(" │ "), " \u2502"));
|
|
635
|
-
headline = options.widths.map(function (maxWidth) { return "─".repeat(maxWidth); });
|
|
636
|
-
console.info("".concat(indent, "\u251C\u2500").concat(headline.join("─┼─"), "\u2500\u2524"));
|
|
637
|
-
}
|
|
638
|
-
for (var i = 0; i < records.length; i++) {
|
|
639
|
-
var line = "";
|
|
640
|
-
for (var j = 0; j < numColumns; j++) {
|
|
641
|
-
var data = table[j][i];
|
|
642
|
-
var color = void 0;
|
|
643
|
-
if ((options === null || options === void 0 ? void 0 : options.colors) && options.colors[j]) {
|
|
644
|
-
color = options.colors[j];
|
|
645
|
-
}
|
|
646
|
-
else {
|
|
647
|
-
color = typeof data === 'string'
|
|
648
|
-
? green
|
|
649
|
-
: (Number(data) === data && data % 1 !== 0 // is float number?
|
|
650
|
-
? yellow
|
|
651
|
-
: function (x) { return x; });
|
|
652
|
-
}
|
|
653
|
-
data = stringify(data, options === null || options === void 0 ? void 0 : options.humanizers, j);
|
|
654
|
-
if (colorstrip(data).length > maxColumnWidth) {
|
|
655
|
-
while (colorstrip(data).length > maxColumnWidth - 3) {
|
|
656
|
-
data = data.slice(0, -1);
|
|
657
|
-
}
|
|
658
|
-
data += "...";
|
|
659
|
-
}
|
|
660
|
-
var dataLength = colorstrip(data).length;
|
|
661
|
-
if ((options === null || options === void 0 ? void 0 : options.headlines) && options.headlines[j][0] === ':') {
|
|
662
|
-
data = "".concat(color(data)).concat(" ".repeat(options.widths[j] - dataLength));
|
|
663
|
-
}
|
|
664
|
-
else {
|
|
665
|
-
data = "".concat(" ".repeat(options.widths[j] - dataLength)).concat(color(data));
|
|
666
|
-
}
|
|
667
|
-
line += "\u2502 ".concat(data, " ");
|
|
668
|
-
}
|
|
669
|
-
console.info("".concat(indent).concat(line, "\u2502"));
|
|
670
|
-
}
|
|
671
|
-
headline = options.widths.map(function (maxWidth) { return "─".repeat(maxWidth); });
|
|
672
|
-
console.info("".concat(indent, "\u2514\u2500").concat(headline.join("─┴─"), "\u2500\u2518"));
|
|
673
|
-
}
|
|
674
|
-
function transpose(records, numColumns) {
|
|
675
|
-
var columns = [];
|
|
676
|
-
var _loop_1 = function (index) {
|
|
677
|
-
columns.push(records.map(function (row) { return row[index]; }));
|
|
678
|
-
};
|
|
679
|
-
for (var index = 0; index < numColumns; index++) {
|
|
680
|
-
_loop_1(index);
|
|
681
|
-
}
|
|
682
|
-
return columns;
|
|
683
|
-
}
|
|
684
|
-
function txJsonReplacer(key, value) {
|
|
685
|
-
switch (key) {
|
|
686
|
-
case 'bytes':
|
|
687
|
-
case 'der':
|
|
688
|
-
return toHexString(value, true);
|
|
689
|
-
case 'tx':
|
|
690
|
-
return JSON.stringify(value, txJsonReplacer);
|
|
691
|
-
default:
|
|
692
|
-
return value;
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
function traceTransactionOnCheckpoint(receipt) {
|
|
696
|
-
if (receipt === null || receipt === void 0 ? void 0 : receipt.confirmations) {
|
|
697
|
-
console.info(" > Checkpoint: ".concat(commas(receipt.blockEpoch + receipt.confirmations)));
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
function traceTransactionOnStatusChange(receipt) {
|
|
701
|
-
if (receipt.status === "mined" && (receipt === null || receipt === void 0 ? void 0 : receipt.blockHash)
|
|
702
|
-
|| (receipt.status === "confirmed" && !(receipt === null || receipt === void 0 ? void 0 : receipt.confirmations))) {
|
|
703
|
-
console.info(" > Block hash: ".concat(gray(receipt === null || receipt === void 0 ? void 0 : receipt.blockHash)));
|
|
704
|
-
console.info(" > Block miner: ".concat(mcyan(receipt === null || receipt === void 0 ? void 0 : receipt.blockMiner)));
|
|
705
|
-
console.info(" > Block epoch: ".concat(white(commas(receipt === null || receipt === void 0 ? void 0 : receipt.blockEpoch))));
|
|
706
|
-
}
|
|
707
|
-
var captions = {
|
|
708
|
-
"pending": "Awaiting relay...",
|
|
709
|
-
"confirmed": (receipt === null || receipt === void 0 ? void 0 : receipt.confirmations) ? "Transaction confirmed." : "Transaction mined.",
|
|
710
|
-
"finalized": "Transaction finalized.",
|
|
711
|
-
"relayed": "Awaiting inclusion...",
|
|
712
|
-
"mined": "Awaiting confirmations...",
|
|
713
|
-
};
|
|
714
|
-
var caption = captions[receipt.status];
|
|
715
|
-
if (caption)
|
|
716
|
-
console.info(" > ".concat(captions[receipt.status]));
|
|
717
|
-
}
|
|
718
|
-
function traceTransactionReceipt(receipt) {
|
|
719
|
-
var captions = {
|
|
720
|
-
"DataRequests": " > DR TX hash: ",
|
|
721
|
-
"ValueTransfer": " > VTT hash: ",
|
|
722
|
-
};
|
|
723
|
-
console.info("".concat(captions[receipt.type] || " > TX hash: ").concat(white(receipt.hash)));
|
|
724
|
-
if (receipt === null || receipt === void 0 ? void 0 : receipt.droHash)
|
|
725
|
-
console.info(" > DRO hash: ".concat(green(receipt.droHash)));
|
|
726
|
-
if (receipt === null || receipt === void 0 ? void 0 : receipt.radHash)
|
|
727
|
-
console.info(" > RAD hash: ".concat(mgreen(receipt.radHash)));
|
|
728
|
-
if (receipt === null || receipt === void 0 ? void 0 : receipt.droSLA)
|
|
729
|
-
console.info(" > SLA params: ".concat(JSON.stringify(receipt.droSLA)));
|
|
730
|
-
if (receipt === null || receipt === void 0 ? void 0 : receipt.withdrawer) {
|
|
731
|
-
if (receipt === null || receipt === void 0 ? void 0 : receipt.validator) {
|
|
732
|
-
console.info(" > Validator: ".concat(mcyan(receipt.validator)));
|
|
733
|
-
}
|
|
734
|
-
console.info(" > Withdrawer: ".concat(mmagenta(receipt.withdrawer)));
|
|
735
|
-
}
|
|
736
|
-
else {
|
|
737
|
-
console.info(" > Account/s: ".concat(mmagenta(receipt.from)));
|
|
738
|
-
}
|
|
739
|
-
if (receipt === null || receipt === void 0 ? void 0 : receipt.recipients) {
|
|
740
|
-
console.info(" > Recipient/s: ".concat(mmagenta(receipt.recipients.filter(function (pkh, index, array) { return index === array.indexOf(pkh); }))));
|
|
741
|
-
}
|
|
742
|
-
console.info(" > Fees: ".concat(yellow(whole_wits(receipt.fees, 2))));
|
|
743
|
-
console.info(" > Value: ".concat(myellow(whole_wits(receipt.value, 2))));
|
|
744
|
-
console.info(" > Weight: ".concat(mgreen(commas(receipt.weight))));
|
|
745
|
-
}
|
|
746
|
-
function traceTransaction(transmitter, options) {
|
|
747
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
748
|
-
var color, receipt, err_1;
|
|
749
|
-
var _a;
|
|
750
|
-
return __generator(this, function (_b) {
|
|
751
|
-
switch (_b.label) {
|
|
752
|
-
case 0:
|
|
753
|
-
color = (options === null || options === void 0 ? void 0 : options.color) || (function (x) { return "\u001B[30;45m".concat(x, "\u001B[0m"); });
|
|
754
|
-
return [4 /*yield*/, transmitter.signTransaction(options, options === null || options === void 0 ? void 0 : options.strategy)];
|
|
755
|
-
case 1:
|
|
756
|
-
receipt = _b.sent();
|
|
757
|
-
if ((options === null || options === void 0 ? void 0 : options.dryrun) || (options === null || options === void 0 ? void 0 : options.verbose)) {
|
|
758
|
-
console.info("\n".concat(gray(JSON.stringify(receipt.tx, txJsonReplacer))));
|
|
759
|
-
}
|
|
760
|
-
if (options === null || options === void 0 ? void 0 : options.headline) {
|
|
761
|
-
console.info("\n ".concat(color(" ".concat(options.headline, " ")), "\n"));
|
|
762
|
-
}
|
|
763
|
-
traceTransactionReceipt(receipt);
|
|
764
|
-
if (!!(options === null || options === void 0 ? void 0 : options.dryrun)) return [3 /*break*/, 9];
|
|
765
|
-
_b.label = 2;
|
|
766
|
-
case 2:
|
|
767
|
-
_b.trys.push([2, 7, , 8]);
|
|
768
|
-
if (!((options === null || options === void 0 ? void 0 : options.confirmations) !== undefined)) return [3 /*break*/, 4];
|
|
769
|
-
return [4 /*yield*/, transmitter.waitTransaction({
|
|
770
|
-
confirmations: options === null || options === void 0 ? void 0 : options.confirmations,
|
|
771
|
-
onCheckpoint: traceTransactionOnCheckpoint,
|
|
772
|
-
onStatusChange: traceTransactionOnStatusChange,
|
|
773
|
-
})];
|
|
774
|
-
case 3:
|
|
775
|
-
receipt = _b.sent();
|
|
776
|
-
return [3 /*break*/, 6];
|
|
777
|
-
case 4: return [4 /*yield*/, transmitter.sendTransaction(options, options === null || options === void 0 ? void 0 : options.strategy)];
|
|
778
|
-
case 5:
|
|
779
|
-
receipt = _b.sent();
|
|
780
|
-
_b.label = 6;
|
|
781
|
-
case 6: return [3 /*break*/, 8];
|
|
782
|
-
case 7:
|
|
783
|
-
err_1 = _b.sent();
|
|
784
|
-
if ((err_1 === null || err_1 === void 0 ? void 0 : err_1.inFlight) && err_1.inFlight) {
|
|
785
|
-
console.info("\n".concat(gray(JSON.stringify((_a = err_1.inFligt) === null || _a === void 0 ? void 0 : _a.message, txJsonReplacer))));
|
|
786
|
-
}
|
|
787
|
-
throw err_1;
|
|
788
|
-
case 8:
|
|
789
|
-
if (options === null || options === void 0 ? void 0 : options.verbose) {
|
|
790
|
-
console.info("\n".concat(yellow(JSON.stringify(receipt, txJsonReplacer))));
|
|
791
|
-
}
|
|
792
|
-
return [3 /*break*/, 10];
|
|
793
|
-
case 9:
|
|
794
|
-
console.info("\n".concat(mred(" ^^^ DRY-RUN ^^^ ")));
|
|
795
|
-
_b.label = 10;
|
|
796
|
-
case 10: return [2 /*return*/, receipt];
|
|
797
|
-
}
|
|
798
|
-
});
|
|
799
|
-
});
|
|
800
|
-
}
|
|
801
|
-
module.exports = {
|
|
802
|
-
colors: {
|
|
803
|
-
bblue: bblue,
|
|
804
|
-
bcyan: bcyan,
|
|
805
|
-
bgreen: bgreen,
|
|
806
|
-
bred: bred,
|
|
807
|
-
bviolet: bviolet,
|
|
808
|
-
cyan: cyan,
|
|
809
|
-
gray: gray,
|
|
810
|
-
green: green,
|
|
811
|
-
magenta: magenta,
|
|
812
|
-
red: red,
|
|
813
|
-
white: white,
|
|
814
|
-
yellow: yellow,
|
|
815
|
-
normal: normal,
|
|
816
|
-
lcyan: lcyan,
|
|
817
|
-
lgray: lgray,
|
|
818
|
-
lgreen: lgreen,
|
|
819
|
-
lmagenta: lmagenta,
|
|
820
|
-
lyellow: lyellow,
|
|
821
|
-
mcyan: mcyan,
|
|
822
|
-
mgreen: mgreen,
|
|
823
|
-
mmagenta: mmagenta,
|
|
824
|
-
mred: mred,
|
|
825
|
-
myellow: myellow,
|
|
826
|
-
},
|
|
827
|
-
colorstrip: colorstrip,
|
|
828
|
-
commas: commas,
|
|
829
|
-
whole_wits: whole_wits,
|
|
830
|
-
toFixedTrunc: toFixedTrunc,
|
|
831
|
-
fromNanowits: fromNanowits,
|
|
832
|
-
fromWits: fromWits,
|
|
833
|
-
countLeaves: countLeaves,
|
|
834
|
-
execRadonBytecode: execRadonBytecode,
|
|
835
|
-
deleteExtraFlags: deleteExtraFlags,
|
|
836
|
-
extractFromArgs: extractFromArgs,
|
|
837
|
-
fromHexString: fromHexString,
|
|
838
|
-
isHexString: isHexString,
|
|
839
|
-
isHexStringOfLength: isHexStringOfLength,
|
|
840
|
-
toHexString: toHexString,
|
|
841
|
-
parseURL: parseURL,
|
|
842
|
-
ipIsPrivateOrLocalhost: ipIsPrivateOrLocalhost,
|
|
843
|
-
showUsage: showUsage,
|
|
844
|
-
showUsageError: showUsageError,
|
|
845
|
-
showUsageSubcommand: showUsageSubcommand,
|
|
846
|
-
showVersion: showVersion,
|
|
847
|
-
toolkitRun: toolkitRun,
|
|
848
|
-
toUpperCamelCase: toUpperCamelCase,
|
|
849
|
-
toUtf8Array: toUtf8Array,
|
|
850
|
-
utf8ArrayToStr: utf8ArrayToStr,
|
|
851
|
-
prompt: prompt,
|
|
852
|
-
prompter: prompter,
|
|
853
|
-
traceChecklists: traceChecklists,
|
|
854
|
-
traceHeader: traceHeader,
|
|
855
|
-
traceTable: traceTable,
|
|
856
|
-
traceTransaction: traceTransaction,
|
|
857
|
-
traceTransactionOnStatusChange: traceTransactionOnStatusChange,
|
|
858
|
-
traceTransactionOnCheckpoint: traceTransactionOnCheckpoint,
|
|
859
|
-
traceTransactionReceipt: traceTransactionReceipt,
|
|
860
|
-
isWildcard: isWildcard,
|
|
861
|
-
getWildcardsCountFromString: getWildcardsCountFromString,
|
|
862
|
-
replaceWildcards: replaceWildcards,
|
|
863
|
-
spliceWildcard: spliceWildcard,
|
|
864
|
-
txJsonReplacer: txJsonReplacer,
|
|
865
|
-
};
|
|
866
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vaGVscGVycy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNwQixJQUFBLElBQUksR0FBSyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQTdCLENBQThCO0FBQzFDLElBQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMxQixJQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDeEIsSUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0FBRXBDLElBQU0sVUFBVSxHQUFHLFVBQUMsR0FBRyxJQUFLLE9BQUEsR0FBRyxDQUFDLE9BQU8sQ0FDbkMsNkVBQTZFLEVBQUUsRUFBRSxDQUNwRixFQUYyQixDQUUzQixDQUFDO0FBRUYsSUFBTSxNQUFNLEdBQUcsVUFBQyxNQUFNO0lBQ2xCLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3BDLElBQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQztRQUM1QixDQUFDLENBQUMsVUFBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxDQUFFO1FBQ3JELENBQUMsQ0FBQyxVQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLGNBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUE7SUFDckUsT0FBTyxNQUFNLENBQUE7QUFDakIsQ0FBQyxDQUFDO0FBRUYsSUFBTSxZQUFZ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QUE7UUFBRSxJQUFJLE1BQUE7UUFBRSxPQUFPLFNBQUE7S0FDekM7SUFDRCxVQUFVLFlBQUE7SUFBRSxNQUFNLFFBQUE7SUFBRSxVQUFVLFlBQUE7SUFBRSxZQUFZLGNBQUE7SUFDNUMsWUFBWSxjQUFBO0lBQUUsUUFBUSxVQUFBO0lBQ3RCLFdBQVcsYUFBQTtJQUNYLGlCQUFpQixtQkFBQTtJQUNqQixnQkFBZ0Isa0JBQUE7SUFBRSxlQUFlLGlCQUFBO0lBQ2pDLGFBQWEsZUFBQTtJQUFFLFdBQVcsYUFBQTtJQUFFLG1CQUFtQixxQkFBQTtJQUFFLFdBQVcsYUFBQTtJQUM1RCxRQUFRLFVBQUE7SUFBRSxzQkFBc0Isd0JBQUE7SUFDaEMsU0FBUyxXQUFBO0lBQUUsY0FBYyxnQkFBQTtJQUFFLG1CQUFtQixxQkFBQTtJQUFFLFdBQVcsYUFBQTtJQUMzRCxVQUFVLFlBQUE7SUFDVixnQkFBZ0Isa0JBQUE7SUFBRSxXQUFXLGFBQUE7SUFBRSxjQUFjLGdCQUFBO0lBQzdDLE1BQU0sUUFBQTtJQUFFLFFBQVEsVUFBQTtJQUNoQixlQUFlLGlCQUFBO0lBQUUsV0FBVyxhQUFBO0lBQUUsVUFBVSxZQUFBO0lBQ3hDLGdCQUFnQixrQkFBQTtJQUFFLDhCQUE4QixnQ0FBQTtJQUFFLDRCQUE0Qiw4QkFBQTtJQUFFLHVCQUF1Qix5QkFBQTtJQUN2RyxVQUFVLFlBQUE7SUFBRSwyQkFBMkIsNkJBQUE7SUFBRSxnQkFBZ0Isa0JBQUE7SUFBRSxjQUFjLGdCQUFBO0lBQ3pFLGNBQWMsZ0JBQUE7Q0FDakIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGNib3IgPSByZXF1aXJlKFwiY2JvclwiKVxuY29uc3QgeyBleGVjIH0gPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTtcbmNvbnN0IG5ldCA9IHJlcXVpcmUoXCJuZXRcIilcbmNvbnN0IG9zID0gcmVxdWlyZShcIm9zXCIpXG5jb25zdCByZWFkbGluZSA9IHJlcXVpcmUoJ3JlYWRsaW5lJylcblxuY29uc3QgY29sb3JzdHJpcCA9IChzdHIpID0+IHN0ci5yZXBsYWNlKFxuICAgIC9bXFx1MDAxYlxcdTAwOWJdW1soKSM7P10qKD86WzAtOV17MSw0fSg/OjtbMC05XXswLDR9KSopP1swLTlBLU9SWmNmLW5xcnk9PjxdL2csICcnXG4pO1xuXG5jb25zdCBjb21tYXMgPSAobnVtYmVyKSA9PiB7XG4gICAgcGFydHMgPSBudW1iZXIudG9TdHJpbmcoKS5zcGxpdCgnLicpXG4gICAgY29uc3QgcmVzdWx0ID0gcGFydHMubGVuZ3RoIDw9IDFcbiAgICAgICAgPyBgJHtwYXJ0c1swXS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCBcIixcIil9YFxuICAgICAgICA6IGAke3BhcnRzWzBdLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csIFwiLFwiKX0uJHtwYXJ0c1sxXX1gXG4gICAgcmV0dXJuIHJlc3VsdFxufTtcblxuY29uc3QgZnJvbU5hbm93aXRzID0gKHgsIGQpID0+IChwYXJzZUludCh4KSAvIDEwICoqIDkpLnRvRml4ZWQoZCB8fCAyKVxuY29uc3QgZnJvbVdpdHMgPSAoeCkgPT4gTWF0aC5mbG9vcihwYXJzZUZsb2F0KHgpICogMTAgKiogOSlcblxuZnVuY3Rpb24gdG9GaXhlZFRydW5jKHgsIG4pIHtcbiAgICBjb25zdCB2ID0gKHR5cGVvZiB4ID09PSAnc3RyaW5nJyA/IHggOiB4LnRvU3RyaW5nKCkpLnNwbGl0KCcuJyk7XG4gICAgaWYgKG4gPD0gMCkgcmV0dXJuIHZbMF07XG4gICAgbGV0IGYgPSB2WzFdIHx8ICcnO1xuICAgIGlmIChmLmxlbmd0aCA+IG4pIHJldHVybiBgJHt2WzBdfS4ke2Yuc3Vic3RyKDAsIG4pfWA7XG4gICAgd2hpbGUgKGYubGVuZ3RoIDwgbikgZiArPSAnMCc7XG4gICAgcmV0dXJuIGAke3ZbMF19LiR7Zn1gXG59O1xuXG5jb25zdCB3aG9sZV93aXRzID0gKG51bWJlciwgZGlnaXRzKSA9PiB7XG4gICAgY29uc3QgbG9va3VwID0gW1xuICAgICAgICB7IHZhbHVlOiAxLCBzeW1ib2w6IFwiIG5XaXRzXCIgfSxcbiAgICAgICAgeyB2YWx1ZTogMWUzLCBzeW1ib2w6IFwiIM68V2l0c1wiIH0sXG4gICAgICAgIHsgdmFsdWU6IDFlNiwgc3ltYm9sOiBcIiBtV2l0c1wiIH0sXG4gICAgICAgIHsgdmFsdWU6IDFlOSwgc3ltYm9sOiBcIiAgV2l0c1wiIH0sXG4gICAgICAgIHsgdmFsdWU6IDFlMTIsIHN5bWJvbDogXCIgS1dpdHNcIiB9LFxuICAgICAgICB7IHZhbHVlOiAxZTE1LCBzeW1ib2w6IFwiIE1XaXRzXCIgfSxcbiAgICBdO1xuICAgIGNvbnN0IHJlZ2V4cCA9IC9cXC4wKyR8KD88PVxcLlswLTldKTArJC87XG4gICAgY29uc3QgaXRlbSA9IGxvb2t1cC5maW5kTGFzdChpdGVtID0+IG51bWJlciA+PSBpdGVtLnZhbHVlKTtcbiAgICByZXR1cm4gaXRlbSA/IHRvRml4ZWRUcnVuYyhjb21tYXMobnVtYmVyIC8gaXRlbS52YWx1ZSksIGRpZ2l0cykuLypyZXBsYWNlKHJlZ2V4cCwgXCJcIikqL2NvbmNhdChpdGVtLnN5bWJvbCkgOiBcIihubyBXaXRzKVwiO1xufTtcblxuY29uc3QgYmJsdWUgPSAoc3RyKSA9PiBgXFx4MWJbMTs5ODs0NG0ke3N0cn1cXHgxYlswOzA7MG1gXG5jb25zdCBiY3lhbiA9IChzdHIpID0+IGBcXHgxYlszODs0Nm0ke3N0cn1cXHgxYlswOzBtYFxuY29uc3QgYmdyZWVuID0gKHN0cikgPT4gYFxceDFiWzMwOzQybSR7c3RyfVxceDFiWzA7MG1gXG5jb25zdCBicmVkID0gKHN0cikgPT4gYFxceDFiWzMwOzQxbSR7c3RyfVxceDFiWzA7MG1gXG5jb25zdCBidmlvbGV0ID0gKHN0cikgPT4gYFxceDFiWzMwOzQ1bSR7c3RyfVxceDFiWzA7MG1gXG5cbmNvbnN0IGxjeWFuID0gKHN0cikgPT4gYFxceDFiWzE7OTZtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCBsZ3JheSA9IChzdHIpID0+IGBcXHgxYlsxOzkwbSR7c3RyfVxceDFiWzBtYFxuY29uc3QgbGdyZWVuID0gKHN0cikgPT4gYFxceDFiWzE7OTJtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCBsbWFnZW50YSA9IChzdHIpID0+IGBcXHgxYlsxOzk1bSR7c3RyfVxceDFiWzBtYFxuY29uc3QgbHllbGxvdyA9IChzdHIpID0+IGBcXHgxYlsxOzkzbSR7c3RyfVxceDFiWzBtYFxuY29uc3QgbWJsdWUgPSAoc3RyKSA9PiBgXFx4MWJbOTRtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCBtY3lhbiA9IChzdHIpID0+IGBcXHgxYls5Nm0ke3N0cn1cXHgxYlswbWBcbmNvbnN0IG1ncmVlbiA9IChzdHIpID0+IGBcXHgxYls5Mm0ke3N0cn1cXHgxYlswbWBcbmNvbnN0IG1tYWdlbnRhID0gKHN0cikgPT4gYFxceDFiWzA7OTVtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCBtcmVkID0gKHN0cikgPT4gYFxceDFiWzkxbSR7c3RyfVxceDFiWzBtYFxuY29uc3QgbXllbGxvdyA9IChzdHIpID0+IGBcXHgxYls5M20ke3N0cn1cXHgxYlswbWBcblxuY29uc3QgYmx1ZSA9IChzdHIpID0+IGBcXHgxYlszNG0ke3N0cn1cXHgxYlswbWBcbmNvbnN0IGN5YW4gPSAoc3RyKSA9PiBgXFx4MWJbMzZtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCBncmF5ID0gKHN0cikgPT4gYFxceDFiWzkwbSR7c3RyfVxceDFiWzBtYFxuY29uc3QgZ3JlZW4gPSAoc3RyKSA9PiBgXFx4MWJbMzJtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCBtYWdlbnRhID0gKHN0cikgPT4gYFxceDFiWzA7MzVtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCBub3JtYWwgPSAoc3RyKSA9PiBgXFx4MWJbOThtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCByZWQgPSAoc3RyKSA9PiBgXFx4MWJbMzFtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCB3aGl0ZSA9IChzdHIpID0+IGBcXHgxYlsxOzk4bSR7c3RyfVxceDFiWzBtYFxuY29uc3QgeWVsbG93ID0gKHN0cikgPT4gYFxceDFiWzMzbSR7c3RyfVxceDFiWzBtYFxuXG5mdW5jdGlvbiBjb3VudExlYXZlcyh0LCBvYmopIHtcbiAgICBpZiAoIW9iaikgcmV0dXJuIDA7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIHQpIHJldHVybiAxO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGNvdW50TGVhdmVzKHQsIGl0ZW0pLCAwKVxuICAgIGVsc2UgcmV0dXJuIE9iamVjdC52YWx1ZXMob2JqKS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgY291bnRMZWF2ZXModCwgaXRlbSksIDApO1xufVxuXG5mdW5jdGlvbiBkZWxldGVFeHRyYUZsYWdzKGFyZ3MpIHtcbiAgICByZXR1cm4gYXJncy5maWx0ZXIoYXJnID0+ICFhcmcuc3RhcnRzV2l0aCgnLS0nKSlcbn1cblxuZnVuY3Rpb24gY21kKC4uLmNvbW1hbmQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBleGVjKGNvbW1hbmQuam9pbihcIiBcIiksIHsgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCAqIDEwIH0sIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3Qoc3RkZXJyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQpXG4gICAgICAgIH0pXG4gICAgfSlcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWNSYWRvbkJ5dGVjb2RlKGJ5dGVjb2RlLCAuLi5mbGFncykge1xuICAgIGlmICghaXNIZXhTdHJpbmcoYnl0ZWNvZGUpKSB7XG4gICAgICAgIHRocm93IEV2YWxFcnJvcihcImludmFsaWQgaGV4IHN0cmluZ1wiKVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5weCA9IG9zLnR5cGUoKSA9PT0gXCJXaW5kb3dzX05UXCIgPyBcIm5weC5jbWRcIiA6IFwibnB4XCJcbiAgICAgICAgcmV0dXJuIGNtZChucHgsIFwid2l0bmV0XCIsIFwicmFkb25cIiwgXCJkcnlydW5cIiwgYnl0ZWNvZGUsIC4uLmZsYWdzKVxuICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gZXJyLm1lc3NhZ2Uuc3BsaXQoJ1xcbicpLnNsaWNlKDEpLmpvaW4oJ1xcbicpLnRyaW0oKVxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yUmVnZXggPSAvLipeZXJyb3I6ICg/PG1lc3NhZ2U+LiopJC4qL2dtXG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IGVycm9yUmVnZXguZXhlYyhlcnIubWVzc2FnZSlcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBtYXRjaGVkLmdyb3Vwcy5tZXNzYWdlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3JNZXNzYWdlIHx8IGVycilcbiAgICAgICAgICAgIH0pXG4gICAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0RnJvbUFyZ3MoYXJncywgZmxhZ3MpIHtcbiAgICBjb25zdCBjdXJhdGVkID0ge31cbiAgICBpZiAoYXJncyAmJiBmbGFncykge1xuICAgICAgICBPYmplY3Qua2V5cyhmbGFncykuZm9yRWFjaChmbGFnID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZsYWdJbmRleCA9IGFyZ3MuaW5kZXhPZihgLS0ke2ZsYWd9YClcbiAgICAgICAgICAgIGlmIChmbGFnSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChmbGFnc1tmbGFnXS5wYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJhdGVkW2ZsYWddID0gYXJnc1tmbGFnSW5kZXhdXG4gICAgICAgICAgICAgICAgICAgIGlmICghYXJnc1tmbGFnSW5kZXggKyAxXSB8fCBhcmdzW2ZsYWdJbmRleCArIDFdLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBmb3IgLS0ke2ZsYWd9YFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyYXRlZFtmbGFnXSA9IGFyZ3NbZmxhZ0luZGV4ICsgMV1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc3BsaWNlKGZsYWdJbmRleCwgMilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cmF0ZWRbZmxhZ10gPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgIGFyZ3Muc3BsaWNlKGZsYWdJbmRleCwgMSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBbYXJncywgY3VyYXRlZCxdXG59XG5cbmZ1bmN0aW9uIGZyb21IZXhTdHJpbmcoaGV4U3RyaW5nKSB7XG4gICAgaWYgKGhleFN0cmluZy5zdGFydHNXaXRoKFwiMHhcIikpIGhleFN0cmluZyA9IGhleFN0cmluZy5zbGljZSgyKVxuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oaGV4U3RyaW5nLm1hdGNoKC8uezEsMn0vZykubWFwKChieXRlKSA9PiBwYXJzZUludChieXRlLCAxNikpKVxufVxuXG5mdW5jdGlvbiBpcElzUHJpdmF0ZU9yTG9jYWxob3N0KGlwKSB7XG4gICAgaWYgKGlwLnN1YnN0cmluZygwLCA3KSA9PT0gXCI6OmZmZmY6XCIpXG4gICAgICAgIGlwID0gaXAuc3Vic3RyaW5nKDcpO1xuXG4gICAgaWYgKG5ldC5pc0lQdjQoaXApKSB7XG4gICAgICAgIC8vIGNoZWNrIGxvY2FsaG9zdFxuICAgICAgICBpZiAoaXAgPT09ICcxMjcuMC4wLjEnKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgLy8gICAgICAgICAxMC4wLjAuMCAtIDEwLjI1NS4yNTUuMjU1ICAgICAgICB8fCAgIDE3Mi4xNi4wLjAgLSAxNzIuMzEuMjU1LjI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgICAgMTkyLjE2OC4wLjAgLSAxOTIuMTY4LjI1NS4yNTVcbiAgICAgICAgcmV0dXJuIC9eKDEwKVxcLiguKilcXC4oLiopXFwuKC4qKSQvLnRlc3QoaXApIHx8IC9eKDE3MilcXC4oMVs2LTldfDJbMC05XXwzWzAtMV0pXFwuKC4qKVxcLiguKikkLy50ZXN0KGlwKSB8fCAvXigxOTIpXFwuKDE2OClcXC4oLiopXFwuKC4qKSQvLnRlc3QoaXApXG4gICAgfVxuXG4gICAgLy8gZWxzZTogaXAgaXMgSVB2NlxuICAgIGNvbnN0IGZpcnN0V29yZCA9IGlwLnNwbGl0KFwiOlwiKS5maW5kKGVsID0+ICEhZWwpOyAvL2dldCBmaXJzdCBub3QgZW1wdHkgd29yZFxuXG4gICAgLy8gZXF1aXZhbGVudCBvZiAxMjcuMC4wLjEgaW4gSVB2NlxuICAgIGlmIChpcCA9PT0gXCI6OjFcIilcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBUaGUgb3JpZ2luYWwgSVB2NiBTaXRlIExvY2FsIGFkZHJlc3NlcyAoZmVjMDo6LzEwKSBhcmUgZGVwcmVjYXRlZC4gUmFuZ2U6IGZlYzAgLSBmZWZmXG4gICAgZWxzZSBpZiAoL15mZVtjLWZdWzAtZl0kLy50ZXN0KGZpcnN0V29yZCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgLy8gVGhlc2UgZGF5cyBVbmlxdWUgTG9jYWwgQWRkcmVzc2VzIChVTEEpIGFyZSB1c2VkIGluIHBsYWNlIG9mIFNpdGUgTG9jYWwuXG4gICAgLy8gUmFuZ2U6IGZjMDAgLSBmY2ZmXG4gICAgZWxzZSBpZiAoL15mY1swLWZdezJ9JC8udGVzdChmaXJzdFdvcmQpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIFJhbmdlOiBmZDAwIC0gZmNmZlxuICAgIGVsc2UgaWYgKC9eZmRbMC1mXXsyfSQvLnRlc3QoZmlyc3RXb3JkKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBMaW5rIGxvY2FsIGFkZHJlc3NlcyAocHJlZml4ZWQgd2l0aCBmZTgwKSBhcmUgbm90IHJvdXRhYmxlXG4gICAgZWxzZSBpZiAoZmlyc3RXb3JkID09PSBcImZlODBcIilcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBEaXNjYXJkIFByZWZpeFxuICAgIGVsc2UgaWYgKGZpcnN0V29yZCA9PT0gXCIxMDBcIilcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBBbnkgb3RoZXIgSVAgYWRkcmVzcyBpcyBub3QgVW5pcXVlIExvY2FsIEFkZHJlc3MgKFVMQSlcbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzSGV4U3RyaW5nT2ZMZW5ndGgoc3RyLCBsZW5ndGgpIHtcbiAgICByZXR1cm4gKGlzSGV4U3RyaW5nKHN0cilcbiAgICAgICAgJiYgKFxuICAgICAgICAgICAgKHN0ci5zdGFydHNXaXRoKCcweCcpICYmIHN0ci5zbGljZSgyKS5sZW5ndGggPT09IGxlbmd0aCAqIDIpXG4gICAgICAgICAgICB8fCBzdHIubGVuZ3RoID09PSBsZW5ndGggKiAyXG4gICAgICAgIClcbiAgICApIHx8IGlzV2lsZGNhcmQoc3RyKTtcbn1cblxuZnVuY3Rpb24gaXNIZXhTdHJpbmcoc3RyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZydcbiAgICAgICAgJiYgKFxuICAgICAgICAgICAgKHN0ci5zdGFydHNXaXRoKFwiMHhcIikgJiYgL15bYS1mQS1GMC05XSskL2kudGVzdChzdHIuc2xpY2UoMikpKVxuICAgICAgICAgICAgfHwgL15bYS1mQS1GMC05XSskL2kudGVzdChzdHIpXG4gICAgICAgIClcbiAgICApIHx8IGlzV2lsZGNhcmQoc3RyKTtcbn1cblxuZnVuY3Rpb24gdG9IZXhTdHJpbmcoYnVmZmVyLCBwcmVmaXgweCA9IGZhbHNlKSB7XG4gICAgaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAgICByZXR1cm4gKHByZWZpeDB4ID8gXCIweFwiIDogXCJcIikgKyBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoYnVmZmVyLCB4ID0+ICgnMDAnICsgeC50b1N0cmluZygxNikpLnNsaWNlKC0yKSlcbiAgICAgICAgLmpvaW4oJycpXG4gICAgICAgIC5tYXRjaCgvW2EtZkEtRjAtOV17Mn0vZylcbiAgICAgICAgLmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIHBhcnNlVVJMKHVybCkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgcGFyc2VkVXJsLnByb3RvY29sICsgXCIvL1wiLFxuICAgICAgICAgICAgcGFyc2VkVXJsLmhvc3QsXG4gICAgICAgICAgICBwYXJzZWRVcmwucGF0aG5hbWUuc2xpY2UoMSksXG4gICAgICAgICAgICBwYXJzZWRVcmwuc2VhcmNoLnNsaWNlKDEpXG4gICAgICAgIF1cbiAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBVUkwgd2FzIHByb3ZpZGVkOiAke3VybH1gKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc2hvd1VzYWdlKGNtZCwgbW9kdWxlKSB7XG4gICAgc2hvd1VzYWdlSGVhZGxpbmUoY21kKVxuICAgIGlmIChtb2R1bGU/LmZsYWdzKSBzaG93VXNhZ2VGbGFncyhtb2R1bGUuZmxhZ3MpXG4gICAgaWYgKG1vZHVsZT8ucm91dGVyKSBzaG93VXNhZ2VSb3V0ZXIobW9kdWxlLnJvdXRlcilcbiAgICBpZiAobW9kdWxlPy5lbnZhcnMpIHNob3dVc2FnZUVudmFycyhtb2R1bGUuZW52YXJzKVxufVxuXG5mdW5jdGlvbiBzaG93VXNhZ2VSb3V0ZXIocm91dGVyKSB7XG4gICAgY29uc3QgY21kcyA9IE9iamVjdC5lbnRyaWVzKHJvdXRlcilcbiAgICBpZiAoY21kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuU1VCQ09NTUFORFM6YClcbiAgICAgICAgY29uc3QgbWF4TGVuZ3RoID0gTWF0aC5tYXgoLi4uY21kcy5tYXAoKFtjbWRdKSA9PiBjbWQubGVuZ3RoKSlcbiAgICAgICAgY21kcy5mb3JFYWNoKGNtZCA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oXCIgIFwiLCBgJHtjbWRbMF19JHtcIiBcIi5yZXBlYXQobWF4TGVuZ3RoIC0gY21kWzBdLmxlbmd0aCl9YCwgXCIgIFwiLCBjbWRbMV0uaGludClcbiAgICAgICAgfSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNob3dVc2FnZUVycm9yKGNtZCwgc3ViY21kLCBtb2R1bGUsIGZsYWdzID0ge30sIGVycm9yKSB7XG4gICAgc2hvd1VzYWdlU3ViY29tbWFuZChjbWQsIHN1YmNtZCwgbW9kdWxlLCBlcnJvcilcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG5FUlJPUjpgKVxuICAgICAgICBpZiAoZmxhZ3M/LmRlYnVnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcj8uc3RhY2s/LnNwbGl0KCdcXG4nKVswXSB8fCBlcnJvcilcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc2hvd1VzYWdlRW52YXJzKGVudmFycykge1xuICAgIGVudmFycyA9IE9iamVjdC5lbnRyaWVzKGVudmFycylcbiAgICBpZiAoZW52YXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG5FTlZBUlM6YClcbiAgICAgICAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heCguLi5lbnZhcnMubWFwKChbZW52YXJdKSA9PiBlbnZhci5sZW5ndGgpKVxuICAgICAgICBlbnZhcnMuZm9yRWFjaCgoW2VudmFyLCBoaW50XSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVudmFyLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIktFWVwiKSA8IDAgJiYgcHJvY2Vzcy5lbnZbZW52YXJdKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiICBcIiwgYCR7eWVsbG93KGVudmFyLnRvVXBwZXJDYXNlKCkpfSR7XCIgXCIucmVwZWF0KG1heFdpZHRoIC0gZW52YXIubGVuZ3RoKX1gLCBgID0+IFNldHRsZWQgdG8gXCIke215ZWxsb3cocHJvY2Vzcy5lbnZbZW52YXJdKX1cImApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIiAgXCIsIGAke3llbGxvdyhlbnZhci50b1VwcGVyQ2FzZSgpKX0ke1wiIFwiLnJlcGVhdChtYXhXaWR0aCAtIGVudmFyLmxlbmd0aCl9YCwgYCAke2hpbnR9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNob3dVc2FnZUZsYWdzKGZsYWdzKSB7XG4gICAgZmxhZ3MgPSBPYmplY3QuZW50cmllcyhmbGFncylcbiAgICBpZiAoZmxhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbkZMQUdTOmApXG4gICAgICAgIGNvbnN0IG1heExlbmd0aCA9IE1hdGgubWF4KC4uLmZsYWdzLmZpbHRlcigoWyx7aGludH1dKSA9PiBoaW50KS5tYXAoKFtrZXksIHsgcGFyYW0gfV0pID0+IHBhcmFtID8ga2V5Lmxlbmd0aCArIHBhcmFtLmxlbmd0aCArIDMgOiBrZXkubGVuZ3RoKSlcbiAgICAgICAgZmxhZ3MuZm9yRWFjaChmbGFnID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IGAke2ZsYWdbMF19JHtmbGFnWzFdLnBhcmFtID8gZ3JheShgIDwke2ZsYWdbMV0ucGFyYW19PmApIDogXCJcIn1gXG4gICAgICAgICAgICBpZiAoZmxhZ1sxXS5oaW50KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiICBcIiwgYC0tJHtzdHJ9JHtcIiBcIi5yZXBlYXQobWF4TGVuZ3RoIC0gY29sb3JzdHJpcChzdHIpLmxlbmd0aCl9YCwgXCIgIFwiLCBmbGFnWzFdLmhpbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxufVxuXG5mdW5jdGlvbiBzaG93VXNhZ2VIZWFkbGluZShjbWQsIHN1YmNtZCwgbW9kdWxlKSB7XG4gICAgY29uc29sZS5pbmZvKFwiVVNBR0U6XCIpXG4gICAgaWYgKHN1YmNtZCkge1xuICAgICAgICBsZXQgcGFyYW1zID0gbW9kdWxlLnJvdXRlcltzdWJjbWRdPy5wYXJhbXNcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IG1vZHVsZS5yb3V0ZXJbc3ViY21kXT8ub3B0aW9uc1xuICAgICAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25hbGl6ZSA9IChzdHIpID0+IHN0ci5lbmRzV2l0aCgnIC4uLl0nKSA/IGBbPCR7c3RyLnNsaWNlKDEsIC01KX0+IC4uLl1gIDogKFxuICAgICAgICAgICAgICAgIHN0clswXSA9PT0gJ1snID8gYFs8JHtzdHIuc2xpY2UoMSwgLTEpfT5dYCA6IGA8JHtzdHJ9PmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMubWFwKHBhcmFtID0+IG9wdGlvbmFsaXplKHBhcmFtKSkuam9pbignICcpICsgXCIgXCJcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0gb3B0aW9uYWxpemUocGFyYW1zKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgICAgJHt3aGl0ZShgbnB4IHdpdG5ldCAke2NtZH1gKX0gW0ZMQUdTXSAke3doaXRlKHN1YmNtZCl9ICR7cGFyYW1zID8gZ3JlZW4ocGFyYW1zKSArIFwiIFwiIDogXCJcIn0ke29wdGlvbnMgJiYgT2JqZWN0LmtleXMob3B0aW9ucykubGVuZ3RoID4gMCA/IFwiW09QVElPTlNdXCIgOiBcIlwifWApXG4gICAgICAgIGlmIChtb2R1bGU/LnJvdXRlcltzdWJjbWRdPy5oaW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oYFxcbkRFU0NSSVBUSU9OOmApXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oYCAgICR7bW9kdWxlLnJvdXRlcltzdWJjbWRdLmhpbnR9YClcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgICAgJHt3aGl0ZShgbnB4IHdpdG5ldCAke2NtZH1gKX0gW0ZMQUdTXSA8U1VCQ09NTUFORD4gLi4uIFtPUFRJT05TXWApXG4gICAgfVxufVxuXG5mdW5jdGlvbiBzaG93VXNhZ2VPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucylcbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuT1BUSU9OUzpgKVxuICAgICAgICBjb25zdCBtYXhMZW5ndGggPSBvcHRpb25zXG4gICAgICAgICAgICAubWFwKG9wdGlvbiA9PiBvcHRpb25bMV0ucGFyYW0gPyBvcHRpb25bMV0ucGFyYW0ubGVuZ3RoICsgb3B0aW9uWzBdLmxlbmd0aCArIDMgOiBvcHRpb25bMF0ubGVuZ3RoKVxuICAgICAgICAgICAgLnJlZHVjZSgocHJldiwgY3VycikgPT4gY3VyciA+IHByZXYgPyBjdXJyIDogcHJldik7XG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvblsxXS5oaW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyID0gYCR7b3B0aW9uWzBdfSR7b3B0aW9uWzFdLnBhcmFtID8gZ3JheShgIDwke29wdGlvblsxXS5wYXJhbX0+YCkgOiBcIlwifWBcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXCIgIFwiLCBgLS0ke3N0cn0ke1wiIFwiLnJlcGVhdChtYXhMZW5ndGggLSBjb2xvcnN0cmlwKHN0cikubGVuZ3RoKX1gLCBcIiAgXCIsIG9wdGlvblsxXS5oaW50KVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc2hvd1VzYWdlU3ViY29tbWFuZChjbWQsIHN1YmNtZCwgbW9kdWxlKSB7XG4gICAgc2hvd1VzYWdlSGVhZGxpbmUoY21kLCBzdWJjbWQsIG1vZHVsZSlcbiAgICBpZiAobW9kdWxlPy5mbGFncykgc2hvd1VzYWdlRmxhZ3MobW9kdWxlPy5mbGFncylcbiAgICBpZiAobW9kdWxlPy5yb3V0ZXJbc3ViY21kXT8ub3B0aW9ucykgc2hvd1VzYWdlT3B0aW9ucyhtb2R1bGUucm91dGVyW3N1YmNtZF0/Lm9wdGlvbnMpXG4gICAgaWYgKG1vZHVsZT8uZW52YXJzKSBzaG93VXNhZ2VFbnZhcnMobW9kdWxlPy5lbnZhcnMpXG59XG5cbmZ1bmN0aW9uIHNob3dWZXJzaW9uKCkge1xuICAgIGNvbnNvbGUuaW5mbyhgJHttY3lhbihgV2l0L09yYWNsZSBUb29sa2l0IENMSSB2JHtyZXF1aXJlKFwiLi4vLi4vcGFja2FnZS5qc29uXCIpLnZlcnNpb259YCl9YClcbn1cblxuZnVuY3Rpb24gZ2V0V2lsZGNhcmRzQ291bnRGcm9tU3RyaW5nKHN0cikge1xuICAgIGxldCBtYXhBcmdzSW5kZXggPSAwXG4gICAgaWYgKHN0cikge1xuICAgICAgICBsZXQgbWF0Y2hcbiAgICAgICAgY29uc3QgcmVnZXhwID0gL1xcXFxcXGRcXFxcL2dcbiAgICAgICAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4cC5leGVjKHN0cikpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgYXJnc0luZGV4ID0gcGFyc2VJbnQobWF0Y2hbMF1bMV0pICsgMVxuICAgICAgICAgICAgaWYgKGFyZ3NJbmRleCA+IG1heEFyZ3NJbmRleCkgbWF4QXJnc0luZGV4ID0gYXJnc0luZGV4XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heEFyZ3NJbmRleFxufVxuXG5cbmZ1bmN0aW9uIGlzV2lsZGNhcmQoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5sZW5ndGggPT0gMyAmJiAvXFxcXFxcZFxcXFwvZy50ZXN0KHN0cilcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpbGRjYXJkcyhvYmosIGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAxMCkgYXJncyA9IGFyZ3Muc2xpY2UoMCwgMTApO1xuICAgIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBmb3IgKGxldCBhcmdJbmRleCA9IDA7IGFyZ0luZGV4IDwgYXJncy5sZW5ndGg7IGFyZ0luZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHdpbGRjYXJkID0gYFxcXFwke2FyZ0luZGV4fVxcXFxgXG4gICAgICAgICAgICBvYmogPSBvYmoucmVwbGFjZUFsbCh3aWxkY2FyZCwgYXJnc1thcmdJbmRleF0pXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9iaiAmJiBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgb2JqID0gb2JqLm1hcCh2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgID8gcmVwbGFjZVdpbGRjYXJkcyh2YWx1ZSwgYXJncylcbiAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBzcGxpY2VXaWxkY2FyZChvYmosIGFyZ0luZGV4LCBhcmdWYWx1ZSwgYXJnc0NvdW50KSB7XG4gICAgaWYgKG9iaiAmJiB0eXBlb2Ygb2JqID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IHdpbGRjYXJkID0gYFxcXFwke2FyZ0luZGV4fVxcXFxgXG4gICAgICAgIG9iaiA9IG9iai5yZXBsYWNlQWxsKHdpbGRjYXJkLCBhcmdWYWx1ZSlcbiAgICAgICAgZm9yIChsZXQgaiA9IGFyZ0luZGV4ICsgMTsgaiA8IGFyZ3NDb3VudDsgaisrKSB7XG4gICAgICAgICAgICBvYmogPSBvYmoucmVwbGFjZUFsbChgXFxcXCR7an1cXFxcYCwgYFxcXFwke2ogLSAxfVxcXFxgKVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChvYmogJiYgQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIG9iaiA9IG9iai5tYXAodmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgICA/IHNwbGljZVdpbGRjYXJkKHZhbHVlLCBhcmdJbmRleCwgYXJnVmFsdWUsIGFyZ3NDb3VudClcbiAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0b29sa2l0UnVuKHNldHRpbmdzLCBhcmdzKSB7XG4gICAgY29uc3QgY21kID0gYCR7c2V0dGluZ3MucGF0aHMudG9vbGtpdEJpblBhdGh9ICR7YXJncy5qb2luKCcgJyl9YFxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGV4ZWMoY21kLCB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQgKiAxMCB9LCAoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHN0ZGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0KVxuICAgICAgICB9KVxuICAgIH0pXG59XG5cbmZ1bmN0aW9uIHRvVXBwZXJDYW1lbENhc2Uoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXGIoXFx3KS9nLCBmdW5jdGlvbiAobWF0Y2gsIGNhcHR1cmUpIHtcbiAgICAgICAgcmV0dXJuIGNhcHR1cmUudG9VcHBlckNhc2UoKTtcbiAgICB9KS5yZXBsYWNlKC9cXHMrL2csICcnKTtcbn1cblxuZnVuY3Rpb24gdG9VdGY4QXJyYXkoc3RyKSB7XG4gICAgY29uc3QgdXRmOCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoYXJjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjaGFyY29kZSA8IDB4ODApIHV0ZjgucHVzaChjaGFyY29kZSk7XG4gICAgICAgIGVsc2UgaWYgKGNoYXJjb2RlIDwgMHg4MDApIHtcbiAgICAgICAgICAgIHV0ZjgucHVzaCgweGMwIHwgKGNoYXJjb2RlID4+IDYpLFxuICAgICAgICAgICAgICAgIDB4ODAgfCAoY2hhcmNvZGUgJiAweDNmKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hhcmNvZGUgPCAweGQ4MDAgfHwgY2hhcmNvZGUgPj0gMHhlMDAwKSB7XG4gICAgICAgICAgICB1dGY4LnB1c2goMHhlMCB8IChjaGFyY29kZSA+PiAxMiksXG4gICAgICAgICAgICAgICAgMHg4MCB8ICgoY2hhcmNvZGUgPj4gNikgJiAweDNmKSxcbiAgICAgICAgICAgICAgICAweDgwIHwgKGNoYXJjb2RlICYgMHgzZikpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgLy8gVVRGLTE2IGVuY29kZXMgMHgxMDAwMC0weDEwRkZGRiBieVxuICAgICAgICAgICAgLy8gc3VidHJhY3RpbmcgMHgxMDAwMCBhbmQgc3BsaXR0aW5nIHRoZVxuICAgICAgICAgICAgLy8gMjAgYml0cyBvZiAweDAtMHhGRkZGRiBpbnRvIHR3byBoYWx2ZXNcbiAgICAgICAgICAgIGNoYXJjb2RlID0gMHgxMDAwMCArICgoKGNoYXJjb2RlICYgMHgzZmYpIDw8IDEwKVxuICAgICAgICAgICAgICAgIHwgKHN0ci5jaGFyQ29kZUF0KGkpICYgMHgzZmYpKTtcbiAgICAgICAgICAgIHV0ZjgucHVzaCgweGYwIHwgKGNoYXJjb2RlID4+IDE4KSxcbiAgICAgICAgICAgICAgICAweDgwIHwgKChjaGFyY29kZSA+PiAxMikgJiAweDNmKSxcbiAgICAgICAgICAgICAgICAweDgwIHwgKChjaGFyY29kZSA+PiA2KSAmIDB4M2YpLFxuICAgICAgICAgICAgICAgIDB4ODAgfCAoY2hhcmNvZGUgJiAweDNmKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHV0Zjg7XG59XG5cbmZ1bmN0aW9uIHV0ZjhBcnJheVRvU3RyKGFycmF5KSB7XG4gICAgbGV0IG91dCwgaSwgbGVuLCBjO1xuICAgIGxldCBjaGFyMiwgY2hhcjM7XG5cbiAgICBvdXQgPSBcIlwiO1xuICAgIGxlbiA9IGFycmF5Lmxlbmd0aDtcbiAgICBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgICBjID0gYXJyYXlbaSsrXTtcbiAgICAgICAgc3dpdGNoIChjID4+IDQpIHtcbiAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiBjYXNlIDI6IGNhc2UgMzogY2FzZSA0OiBjYXNlIDU6IGNhc2UgNjogY2FzZSA3OlxuICAgICAgICAgICAgICAgIC8vIDB4eHh4eHh4XG4gICAgICAgICAgICAgICAgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEyOiBjYXNlIDEzOlxuICAgICAgICAgICAgICAgIC8vIDExMHggeHh4eCAgIDEweHggeHh4eFxuICAgICAgICAgICAgICAgIGNoYXIyID0gYXJyYXlbaSsrXTtcbiAgICAgICAgICAgICAgICBvdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAweDFGKSA8PCA2KSB8IChjaGFyMiAmIDB4M0YpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgLy8gMTExMCB4eHh4ICAxMHh4IHh4eHggIDEweHggeHh4eFxuICAgICAgICAgICAgICAgIGNoYXIyID0gYXJyYXlbaSsrXTtcbiAgICAgICAgICAgICAgICBjaGFyMyA9IGFycmF5W2krK107XG4gICAgICAgICAgICAgICAgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMHgwRikgPDwgMTIpIHxcbiAgICAgICAgICAgICAgICAgICAgKChjaGFyMiAmIDB4M0YpIDw8IDYpIHxcbiAgICAgICAgICAgICAgICAgICAgKChjaGFyMyAmIDB4M0YpIDw8IDApKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHQocXVlc3Rpb24pIHtcbiAgICBjb25zdCByZWFkbGluZUludGVyZmFjZSA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgICAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0XG4gICAgfSlcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIF8pID0+IHtcbiAgICAgICAgcmVhZGxpbmVJbnRlcmZhY2UucXVlc3Rpb24oYCR7cXVlc3Rpb259IGAsIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgcmVhZGxpbmVJbnRlcmZhY2UuY2xvc2UoKVxuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS50cmltKCkpXG4gICAgICAgIH0pXG4gICAgfSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvbXB0ZXIocHJvbWlzZSkge1xuICAgIGNvbnN0IGxvYWRpbmcgPSAoKCkgPT4ge1xuICAgICAgICBjb25zdCBoID0gWyd8JywgJy8nLCAnLScsICdcXFxcJ107XG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgcmV0dXJuIHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGkgPSAoaSA+IDMpID8gMCA6IGlcbiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGBcXGJcXGIke2hbaV19IGApXG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH0sIDUwKTtcbiAgICB9KSgpO1xuICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGxvYWRpbmcpXG4gICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxiXFxiJylcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfSlcbn1cblxuZnVuY3Rpb24gdHJhY2VDaGVja2xpc3RzKGNoZWNrbGlzdHMpIHtcbiAgICBpZiAoY2hlY2tsaXN0cyAmJiBPYmplY3Qua2V5cyhjaGVja2xpc3RzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGhlYWRsaW5lcyA9IFtcIk5PREVTXCIsIC4uLk9iamVjdC5rZXlzKGNoZWNrbGlzdHMpLm1hcChrZXkgPT4gYDoke2tleX1gKSxdXG4gICAgICAgIGNoZWNrbGlzdHMgPSBPYmplY3QudmFsdWVzKGNoZWNrbGlzdHMpXG4gICAgICAgIGNvbnN0IHVybHMgPSBPYmplY3Qua2V5cyhjaGVja2xpc3RzWzBdKVxuICAgICAgICBjb25zdCByZWNvcmRzID0gdXJscy5tYXAodXJsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IGNoZWNrbGlzdHMuZmlsdGVyKGNoZWNrbGlzdCA9PiBjaGVja2xpc3RbdXJsXSBpbnN0YW5jZW9mIEVycm9yKS5sZW5ndGhcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgZXJyb3JzID09PSBjaGVja2xpc3RzLmxlbmd0aCA/IHJlZCh1cmwpIDogKGVycm9ycyA+IDAgPyBteWVsbG93KHVybCkgOiBtY3lhbih1cmwpKSxcbiAgICAgICAgICAgICAgICAuLi5jaGVja2xpc3RzLm1hcChjaGVja2xpc3QgPT4gY2hlY2tsaXN0W3VybF0gaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgICAgICAgICA/IHJlZChjaGVja2xpc3RbdXJsXSlcbiAgICAgICAgICAgICAgICAgICAgOiAoY2hlY2tsaXN0W3VybF0gPT09IHRydWUgPyBsY3lhbihcIkF5ZVwiKSA6IGN5YW4oXCJOYXlcIikpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcbiAgICAgICAgdHJhY2VUYWJsZShyZWNvcmRzLCB7XG4gICAgICAgICAgICBoZWFkbGluZXMsXG4gICAgICAgICAgICBtYXhDb2x1bW5XaWR0aDogMzEsXG4gICAgICAgIH0pXG4gICAgfVxufVxuXG5mdW5jdGlvbiB0cmFjZUhlYWRlcihoZWFkbGluZSwgY29sb3IgPSBub3JtYWwsIGluZGVudCA9IFwiXCIsKSB7XG4gICAgY29uc29sZS5pbmZvKGAke2luZGVudH3ilIzilIAke1wi4pSAXCIucmVwZWF0KGhlYWRsaW5lLmxlbmd0aCl94pSA4pSQYClcbiAgICBjb25zb2xlLmluZm8oYCR7aW5kZW50feKUgiAke2NvbG9yKGhlYWRsaW5lKX0g4pSCYClcbiAgICBjb25zb2xlLmluZm8oYCR7aW5kZW50feKUlOKUgCR7XCLilIBcIi5yZXBlYXQoaGVhZGxpbmUubGVuZ3RoKX3ilIDilJhgKVxufVxuXG5mdW5jdGlvbiB0cmFjZVRhYmxlKHJlY29yZHMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBzdHJpbmdpZnkgPSAoZGF0YSwgaHVtYW5pemVycywgaW5kZXgpID0+IGh1bWFuaXplcnMgJiYgaHVtYW5pemVyc1tpbmRleF0gPyBodW1hbml6ZXJzW2luZGV4XShkYXRhKS50b1N0cmluZygpIDogZGF0YT8udG9TdHJpbmcoKSA/PyBcIlwiXG4gICAgY29uc3QgbWF4ID0gKGEsIGIpID0+IGEgPiBiID8gYSA6IGJcbiAgICBjb25zdCByZWR1Y2VNYXggPSAobnVtYmVycykgPT4gbnVtYmVycy5yZWR1Y2UoKGN1cnIsIHByZXYpID0+IHByZXYgPiBjdXJyID8gcHJldiA6IGN1cnIsIDApXG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge31cbiAgICBjb25zdCBpbmRlbnQgPSBvcHRpb25zPy5pbmRlbnQgfHwgXCJcIlxuICAgIGNvbnN0IG51bUNvbHVtbnMgPSByZWR1Y2VNYXgocmVjb3Jkcy5tYXAocmVjb3JkID0+IHJlY29yZD8ubGVuZ3RoIHx8IDEpKVxuICAgIGNvbnN0IG1heENvbHVtbldpZHRoID0gb3B0aW9ucz8ubWF4Q29sdW1uV2lkdGggfHwgODBcbiAgICBjb25zdCB0YWJsZSA9IHRyYW5zcG9zZShyZWNvcmRzLCBudW1Db2x1bW5zKVxuICAgIG9wdGlvbnMud2lkdGhzID0gb3B0aW9ucz8ud2lkdGhzIHx8IHRhYmxlLm1hcCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgbWF4V2lkdGggPSByZWR1Y2VNYXgoY29sdW1uLm1hcChmaWVsZCA9PiBjb2xvcnN0cmlwKHN0cmluZ2lmeShmaWVsZCwgb3B0aW9ucz8uaHVtYW5pemVycywgaW5kZXgpKS5sZW5ndGgpKVxuICAgICAgICBpZiAob3B0aW9ucz8uaGVhZGxpbmVzICYmIG9wdGlvbnMuaGVhZGxpbmVzW2luZGV4XSkge1xuICAgICAgICAgICAgbWF4V2lkdGggPSBtYXgobWF4V2lkdGgsIGNvbG9yc3RyaXAob3B0aW9ucy5oZWFkbGluZXNbaW5kZXhdLnJlcGxhY2VBbGwoJzonLCAnJykpLmxlbmd0aClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWF0aC5taW4obWF4V2lkdGgsIG1heENvbHVtbldpZHRoKVxuICAgIH0pXG4gICAgbGV0IGhlYWRsaW5lID0gb3B0aW9ucy53aWR0aHMubWFwKG1heFdpZHRoID0+IFwi4pSAXCIucmVwZWF0KG1heFdpZHRoKSlcbiAgICBjb25zb2xlLmluZm8oYCR7aW5kZW50feKUjOKUgCR7aGVhZGxpbmUuam9pbihcIuKUgOKUrOKUgFwiKX3ilIDilJBgKVxuICAgIGlmIChvcHRpb25zPy5oZWFkbGluZXMpIHtcbiAgICAgICAgaGVhZGxpbmUgPSBvcHRpb25zLndpZHRocy5tYXAoKG1heFdpZHRoLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2FwdGlvbiA9IG9wdGlvbnMuaGVhZGxpbmVzW2luZGV4XS5yZXBsYWNlQWxsKCc6JywgJycpXG4gICAgICAgICAgICBjb25zdCBjYXB0aW9uTGVuZ3RoID0gY29sb3JzdHJpcChjYXB0aW9uKS5sZW5ndGhcbiAgICAgICAgICAgIHJldHVybiBgJHt3aGl0ZShjYXB0aW9uKX0ke1wiIFwiLnJlcGVhdChtYXhXaWR0aCAtIGNhcHRpb25MZW5ndGgpfWBcbiAgICAgICAgfSlcbiAgICAgICAgY29uc29sZS5pbmZvKGAke2luZGVudH3ilIIgJHtoZWFkbGluZS5qb2luKFwiIOKUgiBcIil9IOKUgmApXG4gICAgICAgIGhlYWRsaW5lID0gb3B0aW9ucy53aWR0aHMubWFwKG1heFdpZHRoID0+IFwi4pSAXCIucmVwZWF0KG1heFdpZHRoKSlcbiAgICAgICAgY29uc29sZS5pbmZvKGAke2luZGVudH3ilJzilIAke2hlYWRsaW5lLmpvaW4oXCLilIDilLzilIBcIil94pSA4pSkYClcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBsaW5lID0gXCJcIlxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUNvbHVtbnM7IGorKykge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB0YWJsZVtqXVtpXVxuICAgICAgICAgICAgbGV0IGNvbG9yXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uY29sb3JzICYmIG9wdGlvbnMuY29sb3JzW2pdKSB7XG4gICAgICAgICAgICAgICAgY29sb3IgPSBvcHRpb25zLmNvbG9yc1tqXVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2xvciA9IHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IGdyZWVuXG4gICAgICAgICAgICAgICAgICAgIDogKE51bWJlcihkYXRhKSA9PT0gZGF0YSAmJiBkYXRhICUgMSAhPT0gMCAvLyBpcyBmbG9hdCBudW1iZXI/XG4gICAgICAgICAgICAgICAgICAgICAgICA/IHllbGxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAoeCkgPT4geFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhID0gc3RyaW5naWZ5KGRhdGEsIG9wdGlvbnM/Lmh1bWFuaXplcnMsIGopXG4gICAgICAgICAgICBpZiAoY29sb3JzdHJpcChkYXRhKS5sZW5ndGggPiBtYXhDb2x1bW5XaWR0aCkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChjb2xvcnN0cmlwKGRhdGEpLmxlbmd0aCA+IG1heENvbHVtbldpZHRoIC0gMykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zbGljZSgwLCAtMSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGF0YSArPSBcIi4uLlwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZGF0YUxlbmd0aCA9IGNvbG9yc3RyaXAoZGF0YSkubGVuZ3RoXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uaGVhZGxpbmVzICYmIG9wdGlvbnMuaGVhZGxpbmVzW2pdWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gYCR7Y29sb3IoZGF0YSl9JHtcIiBcIi5yZXBlYXQob3B0aW9ucy53aWR0aHNbal0gLSBkYXRhTGVuZ3RoKX1gXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgJHtcIiBcIi5yZXBlYXQob3B0aW9ucy53aWR0aHNbal0gLSBkYXRhTGVuZ3RoKX0ke2NvbG9yKGRhdGEpfWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpbmUgKz0gYOKUgiAke2RhdGF9IGBcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmluZm8oYCR7aW5kZW50fSR7bGluZX3ilIJgKVxuICAgIH1cbiAgICBoZWFkbGluZSA9IG9wdGlvbnMud2lkdGhzLm1hcChtYXhXaWR0aCA9PiBcIuKUgFwiLnJlcGVhdChtYXhXaWR0aCkpXG4gICAgY29uc29sZS5pbmZvKGAke2luZGVudH3ilJTilIAke2hlYWRsaW5lLmpvaW4oXCLilIDilLTilIBcIil94pSA4pSYYClcbn1cblxuZnVuY3Rpb24gdHJhbnNwb3NlKHJlY29yZHMsIG51bUNvbHVtbnMpIHtcbiAgICBjb25zdCBjb2x1bW5zID0gW11cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbnVtQ29sdW1uczsgaW5kZXgrKykge1xuICAgICAgICBjb2x1bW5zLnB1c2gocmVjb3Jkcy5tYXAocm93ID0+IHJvd1tpbmRleF0pKVxuICAgIH1cbiAgICByZXR1cm4gY29sdW1uc1xufVxuXG5mdW5jdGlvbiB0eEpzb25SZXBsYWNlcihrZXksIHZhbHVlKSB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSAnYnl0ZXMnOlxuICAgICAgICBjYXNlICdkZXInOlxuICAgICAgICAgICAgcmV0dXJuIHRvSGV4U3RyaW5nKHZhbHVlLCB0cnVlKVxuICAgICAgICBjYXNlICd0eCc6XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIHR4SnNvblJlcGxhY2VyKVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxufVxuXG5mdW5jdGlvbiB0cmFjZVRyYW5zYWN0aW9uT25DaGVja3BvaW50KHJlY2VpcHQpIHtcbiAgICBpZiAocmVjZWlwdD8uY29uZmlybWF0aW9ucykge1xuICAgICAgICBjb25zb2xlLmluZm8oYCA+IENoZWNrcG9pbnQ6ICAke2NvbW1hcyhyZWNlaXB0LmJsb2NrRXBvY2ggKyByZWNlaXB0LmNvbmZpcm1hdGlvbnMpfWApXG4gICAgfVxufVxuXG5mdW5jdGlvbiB0cmFjZVRyYW5zYWN0aW9uT25TdGF0dXNDaGFuZ2UocmVjZWlwdCkge1xuICAgIGlmIChcbiAgICAgICAgcmVjZWlwdC5zdGF0dXMgPT09IFwibWluZWRcIiAmJiByZWNlaXB0Py5ibG9ja0hhc2hcbiAgICAgICAgICAgIHx8IChyZWNlaXB0LnN0YXR1cyA9PT0gXCJjb25maXJtZWRcIiAmJiAhcmVjZWlwdD8uY29uZmlybWF0aW9ucylcbiAgICApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGAgPiBCbG9jayBoYXNoOiAgJHtncmF5KHJlY2VpcHQ/LmJsb2NrSGFzaCl9YCkgXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgID4gQmxvY2sgbWluZXI6ICR7bWN5YW4ocmVjZWlwdD8uYmxvY2tNaW5lcil9YCkgXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgID4gQmxvY2sgZXBvY2g6ICR7d2hpdGUoY29tbWFzKHJlY2VpcHQ/LmJsb2NrRXBvY2gpKX1gKVxuICAgIH1cbiAgICBjb25zdCBjYXB0aW9ucyA9IHtcbiAgICAgICAgXCJwZW5kaW5nXCI6IFwiQXdhaXRpbmcgcmVsYXkuLi5cIixcbiAgICAgICAgXCJjb25maXJtZWRcIjogcmVjZWlwdD8uY29uZmlybWF0aW9ucyA/IFwiVHJhbnNhY3Rpb24gY29uZmlybWVkLlwiIDogXCJUcmFuc2FjdGlvbiBtaW5lZC5cIixcbiAgICAgICAgXCJmaW5hbGl6ZWRcIjogXCJUcmFuc2FjdGlvbiBmaW5hbGl6ZWQuXCIsXG4gICAgICAgIFwicmVsYXllZFwiOiBcIkF3YWl0aW5nIGluY2x1c2lvbi4uLlwiLFxuICAgICAgICBcIm1pbmVkXCI6IFwiQXdhaXRpbmcgY29uZmlybWF0aW9ucy4uLlwiLFxuICAgIH1cbiAgICBjb25zdCBjYXB0aW9uID0gY2FwdGlvbnNbcmVjZWlwdC5zdGF0dXNdXG4gICAgaWYgKGNhcHRpb24pIGNvbnNvbGUuaW5mbyhgID4gJHtjYXB0aW9uc1tyZWNlaXB0LnN0YXR1c119YClcbn1cblxuZnVuY3Rpb24gdHJhY2VUcmFuc2FjdGlvblJlY2VpcHQocmVjZWlwdCkge1xuICAgIGNvbnN0IGNhcHRpb25zID0ge1xuICAgICAgICBcIkRhdGFSZXF1ZXN0c1wiOiBgID4gRFIgVFggaGFzaDogIGAsXG4gICAgICAgIFwiVmFsdWVUcmFuc2ZlclwiOiBgID4gVlRUIGhhc2g6ICAgIGAsXG4gICAgfVxuICAgIGNvbnNvbGUuaW5mbyhgJHtjYXB0aW9uc1tyZWNlaXB0LnR5cGVdIHx8IGAgPiBUWCBoYXNoOiAgICAgYH0ke3doaXRlKHJlY2VpcHQuaGFzaCl9YClcbiAgICBpZiAocmVjZWlwdD8uZHJvSGFzaCkgY29uc29sZS5pbmZvKGAgPiBEUk8gaGFzaDogICAgJHtncmVlbihyZWNlaXB0LmRyb0hhc2gpfWApXG4gICAgaWYgKHJlY2VpcHQ/LnJhZEhhc2gpIGNvbnNvbGUuaW5mbyhgID4gUkFEIGhhc2g6ICAgICR7bWdyZWVuKHJlY2VpcHQucmFkSGFzaCl9YClcbiAgICBpZiAocmVjZWlwdD8uZHJvU0xBKSAgY29uc29sZS5pbmZvKGAgPiBTTEEgcGFyYW1zOiAgJHtKU09OLnN0cmluZ2lmeShyZWNlaXB0LmRyb1NMQSl9YClcbiAgICBpZiAocmVjZWlwdD8ud2l0aGRyYXdlcikge1xuICAgICAgICBpZiAocmVjZWlwdD8udmFsaWRhdG9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oYCA+IFZhbGlkYXRvcjogICAke21jeWFuKHJlY2VpcHQudmFsaWRhdG9yKX1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgID4gV2l0aGRyYXdlcjogICR7bW1hZ2VudGEocmVjZWlwdC53aXRoZHJhd2VyKX1gKVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgID4gQWNjb3VudC9zOiAgICR7bW1hZ2VudGEocmVjZWlwdC5mcm9tKX1gKVxuICAgIH1cbiAgICBpZiAocmVjZWlwdD8ucmVjaXBpZW50cykge1xuICAgICAgICBjb25zb2xlLmluZm8oYCA+IFJlY2lwaWVudC9zOiAke1xuICAgICAgICAgICAgbW1hZ2VudGEocmVjZWlwdC5yZWNpcGllbnRzLmZpbHRlcigocGtoLCBpbmRleCwgYXJyYXkpID0+IGluZGV4ID09PSBhcnJheS5pbmRleE9mKHBraCkpKVxuICAgICAgICB9YClcbiAgICB9XG4gICAgY29uc29sZS5pbmZvKGAgPiBGZWVzOiAgICAgICAgJHt5ZWxsb3cod2hvbGVfd2l0cyhyZWNlaXB0LmZlZXMsIDIpKX1gKVxuICAgIGNvbnNvbGUuaW5mbyhgID4gVmFsdWU6ICAgICAgICR7bXllbGxvdyh3aG9sZV93aXRzKHJlY2VpcHQudmFsdWUsIDIpKX1gKVxuICAgIGNvbnNvbGUuaW5mbyhgID4gV2VpZ2h0OiAgICAgICR7bWdyZWVuKGNvbW1hcyhyZWNlaXB0LndlaWdodCkpfWApIFxufVxuXG5hc3luYyBmdW5jdGlvbiB0cmFjZVRyYW5zYWN0aW9uKHRyYW5zbWl0dGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgY29sb3IgPSBvcHRpb25zPy5jb2xvciB8fCAoKHgpID0+IGBcXHgxYlszMDs0NW0ke3h9XFx4MWJbMG1gKVxuICAgIGxldCByZWNlaXB0ID0gYXdhaXQgdHJhbnNtaXR0ZXIuc2lnblRyYW5zYWN0aW9uKG9wdGlvbnMsIG9wdGlvbnM/LnN0cmF0ZWd5KVxuICAgIGlmIChvcHRpb25zPy5kcnlydW4gfHwgb3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgICBgXFxuJHtncmF5KEpTT04uc3RyaW5naWZ5KHJlY2VpcHQudHgsIHR4SnNvblJlcGxhY2VyKSl9YFxuICAgICAgICApXG4gICAgfVxuICAgIGlmIChvcHRpb25zPy5oZWFkbGluZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiAke2NvbG9yKGAgICR7b3B0aW9ucy5oZWFkbGluZX0gIGApfVxcbmApXG4gICAgfVxuICAgIHRyYWNlVHJhbnNhY3Rpb25SZWNlaXB0KHJlY2VpcHQpXG4gICAgaWYgKCFvcHRpb25zPy5kcnlydW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5jb25maXJtYXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZWNlaXB0ID0gYXdhaXQgdHJhbnNtaXR0ZXIud2FpdFRyYW5zYWN0aW9uKHsgXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvbnM6IG9wdGlvbnM/LmNvbmZpcm1hdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hlY2twb2ludDogdHJhY2VUcmFuc2FjdGlvbk9uQ2hlY2twb2ludCxcbiAgICAgICAgICAgICAgICAgICAgb25TdGF0dXNDaGFuZ2U6IHRyYWNlVHJhbnNhY3Rpb25PblN0YXR1c0NoYW5nZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWNlaXB0ID0gYXdhaXQgdHJhbnNtaXR0ZXIuc2VuZFRyYW5zYWN0aW9uKG9wdGlvbnMsIG9wdGlvbnM/LnN0cmF0ZWd5KVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnI/LmluRmxpZ2h0ICYmIGVyci5pbkZsaWdodCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtncmF5KEpTT04uc3RyaW5naWZ5KGVyci5pbkZsaWd0Py5tZXNzYWdlLCB0eEpzb25SZXBsYWNlcikpfWApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke3llbGxvdyhKU09OLnN0cmluZ2lmeShyZWNlaXB0LCB0eEpzb25SZXBsYWNlcikpfWApXG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7bXJlZChgIF5eXiBEUlktUlVOIF5eXiBgKX1gKVxuICAgIH1cbiAgICByZXR1cm4gcmVjZWlwdFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBjb2xvcnM6IHtcbiAgICAgICAgYmJsdWUsIGJjeWFuLCBiZ3JlZW4sIGJyZWQsIGJ2aW9sZXQsXG4gICAgICAgIGN5YW4sIGdyYXksIGdyZWVuLCBtYWdlbnRhLCByZWQsIHdoaXRlLCB5ZWxsb3csIG5vcm1hbCxcbiAgICAgICAgbGN5YW4sIGxncmF5LCBsZ3JlZW4sIGxtYWdlbnRhLCBseWVsbG93LFxuICAgICAgICBtY3lhbiwgbWdyZWVuLCBtbWFnZW50YSwgbXJlZCwgbXllbGxvdyxcbiAgICB9LFxuICAgIGNvbG9yc3RyaXAsIGNvbW1hcywgd2hvbGVfd2l0cywgdG9GaXhlZFRydW5jLCBcbiAgICBmcm9tTmFub3dpdHMsIGZyb21XaXRzLFxuICAgIGNvdW50TGVhdmVzLFxuICAgIGV4ZWNSYWRvbkJ5dGVjb2RlLFxuICAgIGRlbGV0ZUV4dHJhRmxhZ3MsIGV4dHJhY3RGcm9tQXJncyxcbiAgICBmcm9tSGV4U3RyaW5nLCBpc0hleFN0cmluZywgaXNIZXhTdHJpbmdPZkxlbmd0aCwgdG9IZXhTdHJpbmcsXG4gICAgcGFyc2VVUkwsIGlwSXNQcml2YXRlT3JMb2NhbGhvc3QsXG4gICAgc2hvd1VzYWdlLCBzaG93VXNhZ2VFcnJvciwgc2hvd1VzYWdlU3ViY29tbWFuZCwgc2hvd1ZlcnNpb24sXG4gICAgdG9vbGtpdFJ1bixcbiAgICB0b1VwcGVyQ2FtZWxDYXNlLCB0b1V0ZjhBcnJheSwgdXRmOEFycmF5VG9TdHIsXG4gICAgcHJvbXB0LCBwcm9tcHRlcixcbiAgICB0cmFjZUNoZWNrbGlzdHMsIHRyYWNlSGVhZGVyLCB0cmFjZVRhYmxlLCBcbiAgICB0cmFjZVRyYW5zYWN0aW9uLCB0cmFjZVRyYW5zYWN0aW9uT25TdGF0dXNDaGFuZ2UsIHRyYWNlVHJhbnNhY3Rpb25PbkNoZWNrcG9pbnQsIHRyYWNlVHJhbnNhY3Rpb25SZWNlaXB0LCBcbiAgICBpc1dpbGRjYXJkLCBnZXRXaWxkY2FyZHNDb3VudEZyb21TdHJpbmcsIHJlcGxhY2VXaWxkY2FyZHMsIHNwbGljZVdpbGRjYXJkLFxuICAgIHR4SnNvblJlcGxhY2VyLCBcbn1cbiJdfQ==
|