@witnet/sdk 1.0.3 → 1.0.4

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.
Files changed (197) hide show
  1. package/.env_witnet +6 -6
  2. package/LICENSE +21 -21
  3. package/README.md +103 -103
  4. package/dist/bin/helpers.d.ts +88 -0
  5. package/dist/bin/helpers.d.ts.map +1 -0
  6. package/dist/bin/helpers.js +866 -0
  7. package/dist/index.d.ts +4 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +42 -0
  10. package/dist/lib/crypto/account.d.ts +18 -0
  11. package/dist/lib/crypto/account.d.ts.map +1 -0
  12. package/dist/lib/crypto/account.js +152 -0
  13. package/dist/lib/crypto/coinbase.d.ts +9 -0
  14. package/dist/lib/crypto/coinbase.d.ts.map +1 -0
  15. package/dist/lib/crypto/coinbase.js +39 -0
  16. package/dist/lib/crypto/index.d.ts +7 -0
  17. package/dist/lib/crypto/index.d.ts.map +1 -0
  18. package/dist/lib/crypto/index.js +28 -0
  19. package/dist/lib/crypto/interfaces.d.ts +80 -0
  20. package/dist/lib/crypto/interfaces.d.ts.map +1 -0
  21. package/dist/lib/crypto/interfaces.js +3 -0
  22. package/dist/lib/crypto/payloads/DataRequestPayload.d.ts +47 -0
  23. package/dist/lib/crypto/payloads/DataRequestPayload.d.ts.map +1 -0
  24. package/dist/lib/crypto/payloads/DataRequestPayload.js +384 -0
  25. package/dist/lib/crypto/payloads/StakePayload.d.ts +27 -0
  26. package/dist/lib/crypto/payloads/StakePayload.d.ts.map +1 -0
  27. package/dist/lib/crypto/payloads/StakePayload.js +184 -0
  28. package/dist/lib/crypto/payloads/UnstakePayload.d.ts +35 -0
  29. package/dist/lib/crypto/payloads/UnstakePayload.d.ts.map +1 -0
  30. package/dist/lib/crypto/payloads/UnstakePayload.js +244 -0
  31. package/dist/lib/crypto/payloads/ValueTransferPayload.d.ts +24 -0
  32. package/dist/lib/crypto/payloads/ValueTransferPayload.d.ts.map +1 -0
  33. package/dist/lib/crypto/payloads/ValueTransferPayload.js +182 -0
  34. package/dist/lib/crypto/payloads.d.ts +54 -0
  35. package/dist/lib/crypto/payloads.d.ts.map +1 -0
  36. package/dist/lib/crypto/payloads.js +224 -0
  37. package/dist/lib/crypto/signer.d.ts +26 -0
  38. package/dist/lib/crypto/signer.d.ts.map +1 -0
  39. package/dist/lib/crypto/signer.js +299 -0
  40. package/dist/lib/crypto/transmitters/DataRequests.d.ts +14 -0
  41. package/dist/lib/crypto/transmitters/DataRequests.d.ts.map +1 -0
  42. package/dist/lib/crypto/transmitters/DataRequests.js +62 -0
  43. package/dist/lib/crypto/transmitters/StakeDeposits.d.ts +11 -0
  44. package/dist/lib/crypto/transmitters/StakeDeposits.d.ts.map +1 -0
  45. package/dist/lib/crypto/transmitters/StakeDeposits.js +48 -0
  46. package/dist/lib/crypto/transmitters/StakeWithdrawals.d.ts +17 -0
  47. package/dist/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +1 -0
  48. package/dist/lib/crypto/transmitters/StakeWithdrawals.js +115 -0
  49. package/dist/lib/crypto/transmitters/ValueTransfers.d.ts +10 -0
  50. package/dist/lib/crypto/transmitters/ValueTransfers.d.ts.map +1 -0
  51. package/dist/lib/crypto/transmitters/ValueTransfers.js +47 -0
  52. package/dist/lib/crypto/transmitters.d.ts +46 -0
  53. package/dist/lib/crypto/transmitters.d.ts.map +1 -0
  54. package/dist/lib/crypto/transmitters.js +506 -0
  55. package/dist/lib/crypto/types.d.ts +127 -0
  56. package/dist/lib/crypto/types.d.ts.map +1 -0
  57. package/dist/lib/crypto/types.js +261 -0
  58. package/dist/lib/crypto/utils.d.ts +10 -0
  59. package/dist/lib/crypto/utils.d.ts.map +1 -0
  60. package/dist/lib/crypto/utils.js +97 -0
  61. package/dist/lib/crypto/wallet.d.ts +26 -0
  62. package/dist/lib/crypto/wallet.d.ts.map +1 -0
  63. package/dist/lib/crypto/wallet.js +327 -0
  64. package/dist/lib/helpers.d.ts +90 -0
  65. package/dist/lib/helpers.d.ts.map +1 -0
  66. package/dist/lib/helpers.js +1031 -0
  67. package/dist/lib/index.d.ts +5 -0
  68. package/dist/lib/index.d.ts.map +1 -0
  69. package/dist/lib/index.js +21 -0
  70. package/dist/lib/radon/artifacts.d.ts +55 -0
  71. package/dist/lib/radon/artifacts.d.ts.map +1 -0
  72. package/dist/lib/radon/artifacts.js +347 -0
  73. package/dist/lib/radon/ccdr/eth.d.ts +100 -0
  74. package/dist/lib/radon/ccdr/eth.d.ts.map +1 -0
  75. package/dist/lib/radon/ccdr/eth.js +237 -0
  76. package/dist/lib/radon/ccdr/index.d.ts +34 -0
  77. package/dist/lib/radon/ccdr/index.d.ts.map +1 -0
  78. package/dist/lib/radon/ccdr/index.js +63 -0
  79. package/dist/lib/radon/ccdr/wit.d.ts +29 -0
  80. package/dist/lib/radon/ccdr/wit.d.ts.map +1 -0
  81. package/dist/lib/radon/ccdr/wit.js +60 -0
  82. package/dist/lib/radon/filters.d.ts +14 -0
  83. package/dist/lib/radon/filters.d.ts.map +1 -0
  84. package/dist/lib/radon/filters.js +47 -0
  85. package/dist/lib/radon/index.d.ts +36 -0
  86. package/dist/lib/radon/index.d.ts.map +1 -0
  87. package/dist/lib/radon/index.js +154 -0
  88. package/dist/lib/radon/reducers.d.ts +29 -0
  89. package/dist/lib/radon/reducers.d.ts.map +1 -0
  90. package/dist/lib/radon/reducers.js +101 -0
  91. package/dist/lib/radon/retrievals.d.ts +120 -0
  92. package/dist/lib/radon/retrievals.d.ts.map +1 -0
  93. package/dist/lib/radon/retrievals.js +358 -0
  94. package/dist/lib/radon/sources.d.ts +102 -0
  95. package/dist/lib/radon/sources.d.ts.map +1 -0
  96. package/dist/lib/radon/sources.js +294 -0
  97. package/dist/lib/radon/types.d.ts +521 -0
  98. package/dist/lib/radon/types.d.ts.map +1 -0
  99. package/dist/lib/radon/types.js +1066 -0
  100. package/dist/lib/radon/utils.d.ts +55 -0
  101. package/dist/lib/radon/utils.d.ts.map +1 -0
  102. package/dist/lib/radon/utils.js +181 -0
  103. package/dist/lib/rpc/farm.d.ts +66 -0
  104. package/dist/lib/rpc/farm.d.ts.map +1 -0
  105. package/dist/lib/rpc/farm.js +808 -0
  106. package/dist/lib/rpc/index.d.ts +3 -0
  107. package/dist/lib/rpc/index.d.ts.map +1 -0
  108. package/dist/lib/rpc/index.js +19 -0
  109. package/dist/lib/rpc/node.d.ts +38 -0
  110. package/dist/lib/rpc/node.d.ts.map +1 -0
  111. package/dist/lib/rpc/node.js +335 -0
  112. package/dist/lib/rpc/nodes.d.ts +40 -0
  113. package/dist/lib/rpc/nodes.d.ts.map +1 -0
  114. package/dist/lib/rpc/nodes.js +531 -0
  115. package/dist/lib/rpc/provider.d.ts +72 -0
  116. package/dist/lib/rpc/provider.d.ts.map +1 -0
  117. package/dist/lib/rpc/provider.js +402 -0
  118. package/dist/lib/rpc/reporter.d.ts +18 -0
  119. package/dist/lib/rpc/reporter.d.ts.map +1 -0
  120. package/dist/lib/rpc/reporter.js +99 -0
  121. package/dist/lib/rpc/types.d.ts +396 -0
  122. package/dist/lib/rpc/types.d.ts.map +1 -0
  123. package/dist/lib/rpc/types.js +81 -0
  124. package/dist/lib/rpc/wallet.d.ts +72 -0
  125. package/dist/lib/rpc/wallet.d.ts.map +1 -0
  126. package/dist/lib/rpc/wallet.js +41 -0
  127. package/dist/lib/types.d.ts +19 -0
  128. package/dist/lib/types.d.ts.map +1 -0
  129. package/dist/lib/types.js +7 -0
  130. package/dist/lib/utils.d.ts +5 -0
  131. package/dist/lib/utils.d.ts.map +1 -0
  132. package/dist/lib/utils.js +51 -0
  133. package/dist/package.json +1 -1
  134. package/dist/src/bin/helpers.js +1 -1
  135. package/dist/src/index.js +1 -1
  136. package/dist/src/lib/crypto/account.js +1 -1
  137. package/dist/src/lib/crypto/coinbase.js +1 -1
  138. package/dist/src/lib/crypto/index.js +1 -1
  139. package/dist/src/lib/crypto/interfaces.js +1 -1
  140. package/dist/src/lib/crypto/payloads/DataRequestPayload.js +1 -1
  141. package/dist/src/lib/crypto/payloads/StakePayload.js +1 -1
  142. package/dist/src/lib/crypto/payloads/UnstakePayload.js +1 -1
  143. package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +1 -1
  144. package/dist/src/lib/crypto/payloads.js +1 -1
  145. package/dist/src/lib/crypto/signer.js +1 -1
  146. package/dist/src/lib/crypto/transmitters/DataRequests.js +1 -1
  147. package/dist/src/lib/crypto/transmitters/StakeDeposits.js +1 -1
  148. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +1 -1
  149. package/dist/src/lib/crypto/transmitters/ValueTransfers.js +1 -1
  150. package/dist/src/lib/crypto/transmitters.js +1 -1
  151. package/dist/src/lib/crypto/types.js +1 -1
  152. package/dist/src/lib/crypto/utils.js +1 -1
  153. package/dist/src/lib/crypto/wallet.js +1 -1
  154. package/dist/src/lib/index.js +1 -1
  155. package/dist/src/lib/radon/ccdr/eth.js +1 -1
  156. package/dist/src/lib/radon/ccdr/index.js +1 -1
  157. package/dist/src/lib/radon/ccdr/wit.js +1 -1
  158. package/dist/src/lib/radon/filters.js +1 -1
  159. package/dist/src/lib/radon/index.js +1 -1
  160. package/dist/src/lib/radon/reducers.js +1 -1
  161. package/dist/src/lib/radon/types.js +1 -1
  162. package/dist/src/lib/radon/utils.js +1 -1
  163. package/dist/src/lib/rpc/index.js +1 -1
  164. package/dist/src/lib/rpc/nodes.js +1 -1
  165. package/dist/src/lib/rpc/provider.js +1 -1
  166. package/dist/src/lib/rpc/reporter.js +1 -1
  167. package/dist/src/lib/rpc/types.js +1 -1
  168. package/dist/src/lib/types.d.ts +1 -1
  169. package/dist/src/lib/types.d.ts.map +1 -1
  170. package/dist/src/lib/types.js +1 -1
  171. package/dist/src/lib/utils.js +1 -1
  172. package/dist/witnet/assets/index.js +1 -1
  173. package/dist/witnet/assets/modals/index.js +1 -1
  174. package/dist/witnet/assets/modals/web3/eth.js +1 -1
  175. package/dist/witnet/assets/modals/web3/ipfs.js +1 -1
  176. package/dist/witnet/assets/modals/web3/wit.js +1 -1
  177. package/dist/witnet/assets/requests.js +1 -1
  178. package/package.json +1 -1
  179. package/src/bin/cli/history.js +31 -31
  180. package/src/bin/cli/inspect.js +405 -405
  181. package/src/bin/cli/network.js +594 -594
  182. package/src/bin/cli/nodes.js +364 -364
  183. package/src/bin/cli/radon.js +815 -815
  184. package/src/bin/cli/wallet.js +1117 -1117
  185. package/src/bin/helpers.js +840 -840
  186. package/src/bin/postinstall.js +9 -9
  187. package/src/bin/toolkit.js +295 -295
  188. package/witnet/assets/_index.js +8 -8
  189. package/witnet/assets/_requests.js +25 -25
  190. package/witnet/assets/_sources.js +36 -36
  191. package/witnet/assets/_templates.js +36 -36
  192. package/witnet/assets/index.js +4 -4
  193. package/witnet/assets/modals/index.js +9 -9
  194. package/witnet/assets/modals/web3/eth.js +29 -29
  195. package/witnet/assets/modals/web3/ipfs.js +19 -19
  196. package/witnet/assets/modals/web3/wit.js +21 -21
  197. package/witnet/assets/requests.js +95 -95
@@ -0,0 +1,1066 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ var __read = (this && this.__read) || function (o, n) {
51
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
52
+ if (!m) return o;
53
+ var i = m.call(o), r, ar = [], e;
54
+ try {
55
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
56
+ }
57
+ catch (error) { e = { error: error }; }
58
+ finally {
59
+ try {
60
+ if (r && !r.done && (m = i["return"])) m.call(i);
61
+ }
62
+ finally { if (e) throw e.error; }
63
+ }
64
+ return ar;
65
+ };
66
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
67
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
68
+ if (ar || !(i in from)) {
69
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
70
+ ar[i] = from[i];
71
+ }
72
+ }
73
+ return to.concat(ar || Array.prototype.slice.call(from));
74
+ };
75
+ Object.defineProperty(exports, "__esModule", { value: true });
76
+ exports.RadonString = exports.RadonMap = exports.RadonInteger = exports.RadonFloat = exports.RadonBytes = exports.RadonBoolean = exports.RadonArray = exports.RadonAny = exports.RadonScript = exports.RadonOperator = exports.RadonOperators = exports.RadonEncodings = void 0;
77
+ var cbor_1 = require("cbor");
78
+ var helpers = __importStar(require("../../bin/helpers"));
79
+ var Utils = __importStar(require("../utils"));
80
+ var RadonEncodings;
81
+ (function (RadonEncodings) {
82
+ RadonEncodings[RadonEncodings["HexString"] = 0] = "HexString";
83
+ RadonEncodings[RadonEncodings["Base64"] = 1] = "Base64";
84
+ })(RadonEncodings || (exports.RadonEncodings = RadonEncodings = {}));
85
+ var RadonOperators;
86
+ (function (RadonOperators) {
87
+ RadonOperators[RadonOperators["ArrayLength"] = 16] = "ArrayLength";
88
+ RadonOperators[RadonOperators["ArrayFilter"] = 17] = "ArrayFilter";
89
+ RadonOperators[RadonOperators["ArrayJoin"] = 18] = "ArrayJoin";
90
+ RadonOperators[RadonOperators["ArrayGetArray"] = 19] = "ArrayGetArray";
91
+ RadonOperators[RadonOperators["ArrayGetBoolean"] = 20] = "ArrayGetBoolean";
92
+ RadonOperators[RadonOperators["ArrayGetBytes"] = 21] = "ArrayGetBytes";
93
+ RadonOperators[RadonOperators["ArrayGetFloat"] = 22] = "ArrayGetFloat";
94
+ RadonOperators[RadonOperators["ArrayGetInteger"] = 23] = "ArrayGetInteger";
95
+ RadonOperators[RadonOperators["ArrayGetMap"] = 24] = "ArrayGetMap";
96
+ RadonOperators[RadonOperators["ArrayGetString"] = 25] = "ArrayGetString";
97
+ RadonOperators[RadonOperators["ArrayMap"] = 26] = "ArrayMap";
98
+ RadonOperators[RadonOperators["ArrayReduce"] = 27] = "ArrayReduce";
99
+ RadonOperators[RadonOperators["ArraySort"] = 29] = "ArraySort";
100
+ RadonOperators[RadonOperators["ArrayPick"] = 30] = "ArrayPick";
101
+ RadonOperators[RadonOperators["BooleanStringify"] = 32] = "BooleanStringify";
102
+ RadonOperators[RadonOperators["BooleanNegate"] = 34] = "BooleanNegate";
103
+ RadonOperators[RadonOperators["BytesStringify"] = 48] = "BytesStringify";
104
+ RadonOperators[RadonOperators["BytesHash"] = 49] = "BytesHash";
105
+ RadonOperators[RadonOperators["BytesAsInteger"] = 50] = "BytesAsInteger";
106
+ RadonOperators[RadonOperators["BytesLength"] = 52] = "BytesLength";
107
+ RadonOperators[RadonOperators["BytesSlice"] = 60] = "BytesSlice";
108
+ RadonOperators[RadonOperators["FloatAbsolute"] = 80] = "FloatAbsolute";
109
+ RadonOperators[RadonOperators["FloatStringify"] = 81] = "FloatStringify";
110
+ RadonOperators[RadonOperators["FloatCeiling"] = 82] = "FloatCeiling";
111
+ RadonOperators[RadonOperators["FloatGreaterThan"] = 83] = "FloatGreaterThan";
112
+ RadonOperators[RadonOperators["FloatFloor"] = 84] = "FloatFloor";
113
+ RadonOperators[RadonOperators["FloatLessThan"] = 85] = "FloatLessThan";
114
+ RadonOperators[RadonOperators["FloatModule"] = 86] = "FloatModule";
115
+ RadonOperators[RadonOperators["FloatMultiply"] = 87] = "FloatMultiply";
116
+ RadonOperators[RadonOperators["FloatNegate"] = 88] = "FloatNegate";
117
+ RadonOperators[RadonOperators["FloatPower"] = 89] = "FloatPower";
118
+ RadonOperators[RadonOperators["FloatRound"] = 91] = "FloatRound";
119
+ RadonOperators[RadonOperators["FloatTruncate"] = 93] = "FloatTruncate";
120
+ RadonOperators[RadonOperators["IntegerAbsolute"] = 64] = "IntegerAbsolute";
121
+ RadonOperators[RadonOperators["IntegerToFloat"] = 65] = "IntegerToFloat";
122
+ RadonOperators[RadonOperators["IntegerStringify"] = 66] = "IntegerStringify";
123
+ RadonOperators[RadonOperators["IntegerGreaterThan"] = 67] = "IntegerGreaterThan";
124
+ RadonOperators[RadonOperators["IntegerLessThan"] = 68] = "IntegerLessThan";
125
+ RadonOperators[RadonOperators["IntegerModulo"] = 70] = "IntegerModulo";
126
+ RadonOperators[RadonOperators["IntegerMultiply"] = 71] = "IntegerMultiply";
127
+ RadonOperators[RadonOperators["IntegerNegate"] = 72] = "IntegerNegate";
128
+ RadonOperators[RadonOperators["IntegerPower"] = 73] = "IntegerPower";
129
+ RadonOperators[RadonOperators["IntegerToBytes"] = 74] = "IntegerToBytes";
130
+ RadonOperators[RadonOperators["MapStringify"] = 96] = "MapStringify";
131
+ RadonOperators[RadonOperators["MapGetArray"] = 97] = "MapGetArray";
132
+ RadonOperators[RadonOperators["MapGetBoolean"] = 98] = "MapGetBoolean";
133
+ RadonOperators[RadonOperators["MapGetFloat"] = 100] = "MapGetFloat";
134
+ RadonOperators[RadonOperators["MapGetInteger"] = 101] = "MapGetInteger";
135
+ RadonOperators[RadonOperators["MapGetMap"] = 102] = "MapGetMap";
136
+ RadonOperators[RadonOperators["MapGetString"] = 103] = "MapGetString";
137
+ RadonOperators[RadonOperators["MapKeys"] = 104] = "MapKeys";
138
+ RadonOperators[RadonOperators["MapValues"] = 105] = "MapValues";
139
+ RadonOperators[RadonOperators["MapAlter"] = 107] = "MapAlter";
140
+ RadonOperators[RadonOperators["MapPick"] = 110] = "MapPick";
141
+ RadonOperators[RadonOperators["StringAsBoolean"] = 112] = "StringAsBoolean";
142
+ RadonOperators[RadonOperators["StringAsBytes"] = 113] = "StringAsBytes";
143
+ RadonOperators[RadonOperators["StringAsFloat"] = 114] = "StringAsFloat";
144
+ RadonOperators[RadonOperators["StringLength"] = 116] = "StringLength";
145
+ RadonOperators[RadonOperators["StringMatch"] = 117] = "StringMatch";
146
+ RadonOperators[RadonOperators["StringParseJSONArray"] = 118] = "StringParseJSONArray";
147
+ RadonOperators[RadonOperators["StringParseJSONMap"] = 119] = "StringParseJSONMap";
148
+ RadonOperators[RadonOperators["StringParseXMLMap"] = 120] = "StringParseXMLMap";
149
+ RadonOperators[RadonOperators["StringToLowerCase"] = 121] = "StringToLowerCase";
150
+ RadonOperators[RadonOperators["StringToUppserCase"] = 122] = "StringToUppserCase";
151
+ RadonOperators[RadonOperators["StringParseReplace"] = 123] = "StringParseReplace";
152
+ RadonOperators[RadonOperators["StringParseSlice"] = 124] = "StringParseSlice";
153
+ RadonOperators[RadonOperators["StringParseSplit"] = 125] = "StringParseSplit";
154
+ })(RadonOperators || (exports.RadonOperators = RadonOperators = {}));
155
+ var RadonClass = /** @class */ (function () {
156
+ function RadonClass(prev) {
157
+ this.prev = prev;
158
+ }
159
+ return RadonClass;
160
+ }());
161
+ var RadonOperator = /** @class */ (function (_super) {
162
+ __extends(RadonOperator, _super);
163
+ function RadonOperator(opcode, params, ops) {
164
+ var _this = _super.call(this, ops) || this;
165
+ _this.opcode = opcode;
166
+ _this.params = params || [];
167
+ return _this;
168
+ }
169
+ RadonOperator.prototype.argsCount = function () {
170
+ var _a, _b;
171
+ var maxCount = 0;
172
+ (_a = this.params) === null || _a === void 0 ? void 0 : _a.forEach(function (param) {
173
+ if (typeof param === 'string') {
174
+ var count = helpers.getWildcardsCountFromString(param);
175
+ if (count > maxCount)
176
+ maxCount = count;
177
+ }
178
+ else if (typeof param === 'object' && param instanceof RadonScript) {
179
+ var count = param.argsCount();
180
+ if (count > maxCount)
181
+ maxCount = count;
182
+ }
183
+ });
184
+ return Math.max(maxCount, ((_b = this.prev) === null || _b === void 0 ? void 0 : _b.argsCount()) || 0);
185
+ };
186
+ RadonOperator.prototype.disect = function (level) {
187
+ var _a, _b;
188
+ if (level === void 0) { level = 0; }
189
+ var result = ((_a = this === null || this === void 0 ? void 0 : this.prev) === null || _a === void 0 ? void 0 : _a.disect(level)) || [];
190
+ var operator = RadonOperators[this.opcode];
191
+ var inputType = "Radon".concat(operator.split(/(?=[A-Z])/)[0]);
192
+ var radonCall = operator.split(/(?=[A-Z])/).slice(1).join('');
193
+ radonCall = radonCall.charAt(0).toLowerCase() + radonCall.slice(1);
194
+ var args = "";
195
+ var script;
196
+ if (this.params && this.params[0] !== undefined) {
197
+ this.params.map(function (param) {
198
+ if (typeof param !== 'object' || !(param instanceof RadonScript)) {
199
+ args += (typeof param === 'string' ? "\"".concat(param, "\"") : param.toString()) + ", ";
200
+ }
201
+ else {
202
+ script = param;
203
+ }
204
+ });
205
+ if (script)
206
+ args += "RadonOperator {";
207
+ else
208
+ args = args.slice(0, -2);
209
+ }
210
+ if (script) {
211
+ var outputType = "".concat(((_b = script.outputType) === null || _b === void 0 ? void 0 : _b.constructor.name) || "RadonAny");
212
+ radonCall += "(".concat(args);
213
+ result.push([level, inputType, radonCall]);
214
+ result.push.apply(result, __spreadArray([], __read(script.disect(level + 1)), false));
215
+ result.push([level, outputType, "})"]);
216
+ }
217
+ else {
218
+ radonCall += "(".concat(args, ")");
219
+ result.push([level, inputType, radonCall]);
220
+ }
221
+ return result;
222
+ };
223
+ RadonOperator.prototype.encode = function () {
224
+ var encoded;
225
+ if ((this === null || this === void 0 ? void 0 : this.params) && this.params[0] !== undefined) {
226
+ var args = this.params.map(function (param) {
227
+ var _a;
228
+ if (typeof param === 'object') {
229
+ if (param instanceof RadonAny) {
230
+ return (_a = param.prev) === null || _a === void 0 ? void 0 : _a.encode();
231
+ }
232
+ else if (param instanceof RadonOperator) {
233
+ return param.encode();
234
+ }
235
+ else if (param instanceof RadonScript) {
236
+ return param.encode();
237
+ }
238
+ }
239
+ else {
240
+ return param;
241
+ }
242
+ });
243
+ encoded = __spreadArray([this.opcode], __read(args), false);
244
+ }
245
+ else {
246
+ encoded = this.opcode;
247
+ }
248
+ if (this.prev) {
249
+ return __spreadArray(__spreadArray([], __read(this.prev.encode()), false), [encoded], false);
250
+ }
251
+ else {
252
+ return [encoded];
253
+ }
254
+ };
255
+ RadonOperator.prototype.replaceWildcards = function (args) {
256
+ var _a, _b;
257
+ if (args.length < this.argsCount()) {
258
+ throw EvalError("Insufficent args were provided (".concat(args.length, " < ").concat(this.argsCount(), ")"));
259
+ }
260
+ return new RadonOperator(this.opcode, (_a = this.params) === null || _a === void 0 ? void 0 : _a.map(function (param) {
261
+ if (typeof param === 'string') {
262
+ return helpers.replaceWildcards(param, args);
263
+ }
264
+ else if (typeof param === 'object' && param instanceof RadonScript) {
265
+ return param.replaceWildcards.apply(param, __spreadArray([], __read(args), false));
266
+ }
267
+ else {
268
+ return param;
269
+ }
270
+ }), (_b = this === null || this === void 0 ? void 0 : this.prev) === null || _b === void 0 ? void 0 : _b.replaceWildcards(args));
271
+ };
272
+ RadonOperator.prototype.spliceWildcard = function (argIndex, argValue) {
273
+ var _this = this;
274
+ var _a, _b;
275
+ return new RadonOperator(this.opcode, (_a = this.params) === null || _a === void 0 ? void 0 : _a.map(function (param) {
276
+ if (typeof param === 'string') {
277
+ return helpers.spliceWildcard(param, argIndex, argValue, _this.argsCount());
278
+ }
279
+ else if (typeof param === 'object' && param instanceof RadonScript) {
280
+ return param.spliceWildcard(argIndex, argValue);
281
+ }
282
+ else {
283
+ return param;
284
+ }
285
+ }), (_b = this === null || this === void 0 ? void 0 : this.prev) === null || _b === void 0 ? void 0 : _b.spliceWildcard(argIndex, argValue));
286
+ };
287
+ RadonOperator.prototype.toString = function (left, indent, level) {
288
+ var _a;
289
+ if (left === void 0) { left = ""; }
290
+ if (indent === void 0) { indent = 4; }
291
+ if (level === void 0) { level = 0; }
292
+ var lf = left !== "" ? "\n" : "";
293
+ var str = ((_a = this === null || this === void 0 ? void 0 : this.prev) === null || _a === void 0 ? void 0 : _a.toString(left, indent, level)) || "";
294
+ var methodName = RadonOperators[this.opcode].split(/(?=[A-Z])/).slice(1).join('');
295
+ methodName = methodName.charAt(0).toLowerCase() + methodName.slice(1);
296
+ str += "".concat(left).concat(" ".repeat(indent * level), ".").concat(methodName, "(");
297
+ if (this.params && this.params[0] !== undefined) {
298
+ this.params.forEach(function (param) {
299
+ if (typeof param === 'string') {
300
+ str += "\"".concat(param, "\", ");
301
+ }
302
+ else if (typeof param === 'object' && param instanceof RadonScript) {
303
+ str += "".concat(param.toString(left, indent, level + 1)).concat(left).concat(" ".repeat(indent * level), ", ");
304
+ }
305
+ else {
306
+ str += param.toString() + ", ";
307
+ }
308
+ });
309
+ str = str.slice(0, -2);
310
+ }
311
+ str += ")".concat(lf);
312
+ return str;
313
+ };
314
+ return RadonOperator;
315
+ }(RadonClass));
316
+ exports.RadonOperator = RadonOperator;
317
+ var RadonScript = /** @class */ (function () {
318
+ function RadonScript(output) {
319
+ this.ops = output === null || output === void 0 ? void 0 : output.prev;
320
+ var radonTypes = {
321
+ "Array": RadonArray,
322
+ "Boolean": RadonBoolean,
323
+ "Bytes": RadonBytes,
324
+ "Float": RadonFloat,
325
+ "Integer": RadonInteger,
326
+ "Map": RadonMap,
327
+ "String": RadonString,
328
+ };
329
+ var input = output === null || output === void 0 ? void 0 : output.prev;
330
+ while (input === null || input === void 0 ? void 0 : input.prev)
331
+ input = input === null || input === void 0 ? void 0 : input.prev;
332
+ var inputType = Object.entries(radonTypes).find(function (_a) {
333
+ var _b = __read(_a, 2), prefix = _b[0], _ = _b[1];
334
+ return input && RadonOperators[input.opcode].startsWith(prefix);
335
+ });
336
+ if (inputType && inputType[1])
337
+ this.inputType = new inputType[1]();
338
+ var outputType = Object.values(radonTypes).find(function (outputType) { return output instanceof outputType; });
339
+ if (outputType)
340
+ this.outputType = new outputType();
341
+ }
342
+ RadonScript.prototype.argsCount = function () {
343
+ var _a;
344
+ return ((_a = this.ops) === null || _a === void 0 ? void 0 : _a.argsCount()) || 0;
345
+ };
346
+ RadonScript.prototype.disect = function (level) {
347
+ var _a;
348
+ if (level === void 0) { level = 0; }
349
+ return ((_a = this.ops) === null || _a === void 0 ? void 0 : _a.disect(level)) || [[level, "RadonAny", ""]];
350
+ };
351
+ RadonScript.prototype.encode = function () {
352
+ var _a;
353
+ return ((_a = this.ops) === null || _a === void 0 ? void 0 : _a.encode()) || [];
354
+ };
355
+ RadonScript.prototype.replaceWildcards = function () {
356
+ var _this = this;
357
+ var _a;
358
+ var args = [];
359
+ for (var _i = 0; _i < arguments.length; _i++) {
360
+ args[_i] = arguments[_i];
361
+ }
362
+ var OutputType = [
363
+ RadonArray,
364
+ RadonBoolean,
365
+ RadonBytes,
366
+ RadonFloat,
367
+ RadonInteger,
368
+ RadonMap,
369
+ RadonString,
370
+ ].find(function (OutputType) { return _this.outputType instanceof OutputType; });
371
+ if (OutputType) {
372
+ return new OutputType((_a = this.ops) === null || _a === void 0 ? void 0 : _a.replaceWildcards(args));
373
+ }
374
+ else {
375
+ throw EvalError("Cannot replace wildcards on empty script");
376
+ }
377
+ };
378
+ RadonScript.prototype.spliceWildcard = function (argIndex, argValue) {
379
+ var _this = this;
380
+ var _a;
381
+ var OutputType = [
382
+ RadonArray,
383
+ RadonBoolean,
384
+ RadonBytes,
385
+ RadonFloat,
386
+ RadonInteger,
387
+ RadonMap,
388
+ RadonString,
389
+ ].find(function (OutputType) { return _this.outputType instanceof OutputType; });
390
+ if (OutputType) {
391
+ return new OutputType((_a = this.ops) === null || _a === void 0 ? void 0 : _a.spliceWildcard(argIndex, argValue));
392
+ }
393
+ else {
394
+ throw EvalError("Cannot splice wildcards on empty script");
395
+ }
396
+ };
397
+ RadonScript.prototype.toBytecode = function () {
398
+ return Utils.toHexString(Object.values(Uint8Array.from((0, cbor_1.encode)(this.encode()))), true);
399
+ };
400
+ RadonScript.prototype.toString = function (left, indent, level) {
401
+ var _a, _b;
402
+ if (left === void 0) { left = ""; }
403
+ if (indent === void 0) { indent = 0; }
404
+ if (level === void 0) { level = 0; }
405
+ var lf = left !== "" ? "\n" : "";
406
+ return "RadonOperator(".concat(((_a = this.inputType) === null || _a === void 0 ? void 0 : _a.constructor.name) || "", ")").concat(lf).concat((_b = this.ops) === null || _b === void 0 ? void 0 : _b.toString(left, indent, level + 1));
407
+ };
408
+ return RadonScript;
409
+ }());
410
+ exports.RadonScript = RadonScript;
411
+ var RadonAny = /** @class */ (function (_super) {
412
+ __extends(RadonAny, _super);
413
+ function RadonAny() {
414
+ return _super !== null && _super.apply(this, arguments) || this;
415
+ }
416
+ RadonAny.prototype._pushOperator = function (outputType, params) {
417
+ var _a;
418
+ var name;
419
+ try {
420
+ throw new Error();
421
+ }
422
+ catch (err) {
423
+ var result = err;
424
+ name = (_a = result.stack) === null || _a === void 0 ? void 0 : _a.split(' at ')[2].split(' ')[0].split('.').map(function (part) { return helpers.toUpperCamelCase(part); }).join('').split(/(?=[A-Z])/).slice(1).join('');
425
+ }
426
+ var opcode = RadonOperators[name];
427
+ if (!opcode) {
428
+ throw Error("Fatal: unknown Radon Operator opcode '".concat(name, "'"));
429
+ }
430
+ else {
431
+ return new outputType(new RadonOperator(opcode, __spreadArray([], __read(params), false), this === null || this === void 0 ? void 0 : this.prev));
432
+ }
433
+ };
434
+ return RadonAny;
435
+ }(RadonClass));
436
+ exports.RadonAny = RadonAny;
437
+ var RadonArray = /** @class */ (function (_super) {
438
+ __extends(RadonArray, _super);
439
+ function RadonArray() {
440
+ return _super !== null && _super.apply(this, arguments) || this;
441
+ }
442
+ /**
443
+ * Discard the items in the input array that make the given `innerScript` to return a `false` value.
444
+ * @param script Filtering script ultimately returning a `RadonBoolean` object.
445
+ * Must accept as input the same data types as the ones of the items being iterated.
446
+ * @returns A `RadonArray` object containing only the items that make the `innerScript` to return a `true` value.
447
+ */
448
+ RadonArray.prototype.filter = function (innerScript) {
449
+ if (!(innerScript instanceof RadonBoolean)) {
450
+ throw new EvalError("Inner script must fetch a RadonBoolean value");
451
+ }
452
+ return this._pushOperator((RadonArray), [new RadonScript(innerScript)]);
453
+ };
454
+ /**
455
+ * Fetch the item at the given `index` as a `RadonArray` object.
456
+ * @param index
457
+ */
458
+ RadonArray.prototype.getArray = function (index) {
459
+ return this._pushOperator((RadonArray), [index]);
460
+ };
461
+ /**
462
+ * Fetch the item at the given `index` as a `RadonBoolean` object.
463
+ * @param index
464
+ */
465
+ RadonArray.prototype.getBoolean = function (index) {
466
+ return this._pushOperator(RadonBoolean, [index]);
467
+ };
468
+ /**
469
+ * Fetch the item at the given `index` as a `RadonBytes` object.
470
+ * @param index
471
+ */
472
+ RadonArray.prototype.getBytes = function (index) {
473
+ return this._pushOperator(RadonBytes, [index]);
474
+ };
475
+ /**
476
+ * Fetch the item at the given `index` as a `RadonFloat` object.
477
+ * @param index
478
+ */
479
+ RadonArray.prototype.getFloat = function (index) {
480
+ return this._pushOperator(RadonFloat, [index]);
481
+ };
482
+ /**
483
+ * Fetch the item at the given `index` as a `RadonInteger` object.
484
+ * @param index
485
+ */
486
+ RadonArray.prototype.getInteger = function (index) {
487
+ return this._pushOperator(RadonInteger, [index]);
488
+ };
489
+ /**
490
+ * Fetch the item at the given `index` as a `RadonMap` object.
491
+ * @param index
492
+ */
493
+ RadonArray.prototype.getMap = function (index) {
494
+ return this._pushOperator(RadonMap, [index]);
495
+ };
496
+ /**
497
+ * Fetch the item at the given `index` as a `RadonString` object.
498
+ * @param index
499
+ */
500
+ RadonArray.prototype.getString = function (index) {
501
+ return this._pushOperator(RadonString, [index]);
502
+ };
503
+ /**
504
+ * Join all items of the array into a value of the given type. The array must be homogeneous,
505
+ * all items being of the same type as the outputType`, if specified, or the Array's itemsType otherwise.
506
+ * @param separator Separator to be used when joining strings. When joining RadonMaps, it can be used to settle base schema on resulting object.
507
+ * @param outputType Radon type of the output value.
508
+ */
509
+ RadonArray.prototype.join = function (separator, outputType) {
510
+ if (separator === void 0) { separator = ""; }
511
+ if (outputType)
512
+ this._pushOperator((RadonArray), [separator]);
513
+ else
514
+ this._pushOperator((RadonArray), [separator]);
515
+ };
516
+ /**
517
+ * Count the number of items.
518
+ * @returns A `RadonInteger` object.
519
+ */
520
+ RadonArray.prototype.length = function () {
521
+ return this._pushOperator(RadonInteger, []);
522
+ };
523
+ /**
524
+ * Map all items in the array with the given `innerScript`.
525
+ * @param innerScript Mapping script returning some `RadonAny` object.
526
+ * Must accept as input the same data type as the one of the items being iterated.
527
+ * @returns A `RadonArray` object containing the mapped values.
528
+ */
529
+ RadonArray.prototype.map = function (innerScript) {
530
+ return this._pushOperator(RadonArray, [innerScript]);
531
+ };
532
+ // public map<OutputItemsType extends RadonAny>(innerScript: RadonOperator<OutputItemsType>) {
533
+ // // todo: check script's input type matches array's items type, if any ??
534
+ // return this._pushOperator(RadonArray<OutputItemsType>, [innerScript])
535
+ // }
536
+ /**
537
+ * Reduce all items in the array into a single value.
538
+ * @param reductor The reductor method to be applied. All array items must be
539
+ * convertable into float values.
540
+ * @returns A `RadonFloat` object.
541
+ */
542
+ RadonArray.prototype.reduce = function (reductor) {
543
+ return this._pushOperator(RadonFloat, [reductor]);
544
+ };
545
+ /**
546
+ * Order the array items based either on the results of applying the given `innerScript` to every item, or on the
547
+ * actual item values (as long as these are either integers or strings).
548
+ * Fails if applied on non-homegenous arrays (i.e. not all items sharing the same `RadonAny`).
549
+ * @param innerScript (Optional) Sorting script returning either a `RadonInteger` or a `RadonString` object.
550
+ * @returns A `RadonArray` object.
551
+ */
552
+ // TODO
553
+ // public sort(innerScript?: RadonOperator<RadonString | RadonInteger>) {
554
+ // return this._pushOperator(RadonArray<ItemsType>, [innerScript])
555
+ // }
556
+ /**
557
+ * Take a selection of items from the input array.
558
+ * @param indexes Indexes of the input items to take into the output array.
559
+ * @return A `RadonArray` object.
560
+ */
561
+ RadonArray.prototype.pick = function () {
562
+ var indexes = [];
563
+ for (var _i = 0; _i < arguments.length; _i++) {
564
+ indexes[_i] = arguments[_i];
565
+ }
566
+ if (Array(indexes).length == 0) {
567
+ throw new EvalError("\u001B[1;33mRadonArray::pick: a non-empty array of numbers must be provided\u001B[0m");
568
+ }
569
+ return this._pushOperator((RadonArray), __spreadArray([], __read(indexes), false));
570
+ };
571
+ return RadonArray;
572
+ }(RadonAny));
573
+ exports.RadonArray = RadonArray;
574
+ var RadonBoolean = /** @class */ (function (_super) {
575
+ __extends(RadonBoolean, _super);
576
+ function RadonBoolean() {
577
+ return _super !== null && _super.apply(this, arguments) || this;
578
+ }
579
+ /**
580
+ * Reverse value.
581
+ * @returns A `RadonBoolean` object.
582
+ */
583
+ RadonBoolean.prototype.negate = function () {
584
+ return this._pushOperator(RadonBoolean, []);
585
+ };
586
+ /**
587
+ * Cast value into a string.
588
+ * @returns A `RadonString` object.
589
+ */
590
+ RadonBoolean.prototype.stringify = function () {
591
+ return this._pushOperator(RadonString, []);
592
+ };
593
+ return RadonBoolean;
594
+ }(RadonAny));
595
+ exports.RadonBoolean = RadonBoolean;
596
+ var RadonBytes = /** @class */ (function (_super) {
597
+ __extends(RadonBytes, _super);
598
+ function RadonBytes() {
599
+ return _super !== null && _super.apply(this, arguments) || this;
600
+ }
601
+ /**
602
+ * Convert buffer into (big-endian) integer.
603
+ * @returns A `RadonBytes` object.
604
+ */
605
+ RadonBytes.prototype.asInteger = function () {
606
+ return this._pushOperator(RadonInteger, []);
607
+ };
608
+ /**
609
+ * Apply the SHA2-256 hash function.
610
+ * @returns A `RadonBytes` object.
611
+ */
612
+ RadonBytes.prototype.hash = function () {
613
+ return this._pushOperator(RadonBytes, []);
614
+ };
615
+ /**
616
+ * Count the number of bytes.
617
+ * @returns A `RadonInteger` object.
618
+ */
619
+ RadonBytes.prototype.length = function () {
620
+ return this._pushOperator(RadonInteger, []);
621
+ };
622
+ /**
623
+ * Returns a slice extracted from the input buffer.
624
+ * A `startIndex` of 0 refers to the beginning of the input buffer. If no `endIndex` is provided, it will be assumed
625
+ * the length of the input buffer. Negative values will be relative to the end of the input buffer.
626
+ * @param startIndex Position within input buffer where the output buffer will start.
627
+ * @param endIndex Position within input buffer where the output buffer will end
628
+ * @returns A `RadonBytes` object.
629
+ */
630
+ RadonBytes.prototype.slice = function (startIndex, endIndex) {
631
+ if (startIndex === void 0) { startIndex = 0; }
632
+ return this._pushOperator(RadonBytes, [startIndex, endIndex]);
633
+ };
634
+ /**
635
+ * Convert the input buffer into a string.
636
+ * @param encoding Enum integer value specifying the encoding schema on the output string, standing:
637
+ * 0 -> Hex string (default, if none was specified)
638
+ * 1 -> Base64 string
639
+ * @returns A `RadonString` object.
640
+ */
641
+ RadonBytes.prototype.stringify = function (encoding) {
642
+ if (encoding === void 0) { encoding = RadonEncodings.HexString; }
643
+ return this._pushOperator(RadonString, [encoding]);
644
+ };
645
+ RadonBytes.Encodings = RadonEncodings;
646
+ return RadonBytes;
647
+ }(RadonAny));
648
+ exports.RadonBytes = RadonBytes;
649
+ var RadonFloat = /** @class */ (function (_super) {
650
+ __extends(RadonFloat, _super);
651
+ function RadonFloat() {
652
+ return _super !== null && _super.apply(this, arguments) || this;
653
+ }
654
+ /**
655
+ * Compute the absolute value.
656
+ * @returns A `RadonFloat` object.
657
+ */
658
+ RadonFloat.prototype.absolute = function () {
659
+ return this._pushOperator(RadonFloat, []);
660
+ };
661
+ /**
662
+ * Compute the lowest integer greater than or equal to the float value.
663
+ * @returns A `RadonInteger` object.
664
+ */
665
+ RadonFloat.prototype.ceiling = function () {
666
+ return this._pushOperator(RadonFloat, []);
667
+ };
668
+ /**
669
+ * Compute the greatest integer less than or equal to the float value.
670
+ * @returns A `RadonInteger` object.
671
+ */
672
+ RadonFloat.prototype.floor = function () {
673
+ return this._pushOperator(RadonInteger, []);
674
+ };
675
+ /**
676
+ * Determine if the float value is greater than the given `input`.
677
+ * @param input
678
+ * @returns A `RadonBoolean` object.
679
+ */
680
+ RadonFloat.prototype.greaterThan = function (input) {
681
+ return this._pushOperator(RadonBoolean, [input]);
682
+ };
683
+ /**
684
+ * Determine if the float value is less than the given `input`.
685
+ * @param input
686
+ * @returns A `RadonBoolean` object.
687
+ */
688
+ RadonFloat.prototype.lessThan = function (input) {
689
+ return this._pushOperator(RadonBoolean, [input]);
690
+ };
691
+ /**
692
+ * Compute the float remainder of dividing the value by the given `integer`.
693
+ * @param integer
694
+ * @returns A `RadonFloat` object.
695
+ */
696
+ RadonFloat.prototype.modulo = function (integer) {
697
+ return this._pushOperator(RadonFloat, [integer]);
698
+ };
699
+ /**
700
+ * Multiply the float value by the given `factor`.
701
+ * @param factor
702
+ * @returns A `RadonFloat` object.
703
+ */
704
+ RadonFloat.prototype.multiply = function (factor) {
705
+ return this._pushOperator(RadonFloat, [factor]);
706
+ };
707
+ /**
708
+ * Negate the float value.
709
+ * @returns A `RadonFloat` object.
710
+ */
711
+ RadonFloat.prototype.negate = function () {
712
+ return this._pushOperator(RadonFloat, []);
713
+ };
714
+ /**
715
+ * Compute the float value raised to the power of given `exponent`
716
+ * @param exponent
717
+ * @returns A `RadonFloat` object.
718
+ */
719
+ RadonFloat.prototype.power = function (exponent) {
720
+ return this._pushOperator(RadonFloat, [exponent]);
721
+ };
722
+ /**
723
+ * Round to the closest integer value.
724
+ * @returns A `RadonInteger` object.
725
+ */
726
+ RadonFloat.prototype.round = function () {
727
+ return this._pushOperator(RadonInteger, []);
728
+ };
729
+ /**
730
+ * Stringify the float value.
731
+ * @returns A `RadonString` object.
732
+ */
733
+ RadonFloat.prototype.stringify = function () {
734
+ return this._pushOperator(RadonString, []);
735
+ };
736
+ /**
737
+ * Take the integer part of the float value.
738
+ * @returns A `RadonInteger` object.
739
+ */
740
+ RadonFloat.prototype.truncate = function () {
741
+ return this._pushOperator(RadonInteger, []);
742
+ };
743
+ return RadonFloat;
744
+ }(RadonAny));
745
+ exports.RadonFloat = RadonFloat;
746
+ var RadonInteger = /** @class */ (function (_super) {
747
+ __extends(RadonInteger, _super);
748
+ function RadonInteger() {
749
+ return _super !== null && _super.apply(this, arguments) || this;
750
+ }
751
+ /**
752
+ * Compute the absolute value.
753
+ * @returns A `RadonInteger` object.
754
+ */
755
+ RadonInteger.prototype.absolute = function () {
756
+ return this._pushOperator(RadonInteger, []);
757
+ };
758
+ /**
759
+ * Determine if the integer value is greater than the given `input`.
760
+ * @param input
761
+ * @returns A `RadonBoolean` object.
762
+ */
763
+ RadonInteger.prototype.greaterThan = function (input) {
764
+ return this._pushOperator(RadonBoolean, [input]);
765
+ };
766
+ /**
767
+ * Determine if the integer value is less than the given `input`.
768
+ * @param input
769
+ * @returns A `RadonBoolean` object.
770
+ */
771
+ RadonInteger.prototype.lessThan = function (input) {
772
+ return this._pushOperator(RadonBoolean, [input]);
773
+ };
774
+ /**
775
+ * Compute the remainder of dividing the value by the given `integer`.
776
+ * @param integer
777
+ * @returns A `RadonFloat` object.
778
+ */
779
+ RadonInteger.prototype.modulo = function (integer) {
780
+ return this._pushOperator(RadonInteger, [integer]);
781
+ };
782
+ /**
783
+ * Multiply the value by the given `integer`.
784
+ * @param integer
785
+ * @returns A `RadonInteger` object.
786
+ */
787
+ RadonInteger.prototype.multiply = function (integer) {
788
+ return this._pushOperator(RadonInteger, [integer]);
789
+ };
790
+ /**
791
+ * Negate the integer value.
792
+ * @returns A `RadonFloat` object.
793
+ */
794
+ RadonInteger.prototype.negate = function () {
795
+ return this._pushOperator(RadonInteger, []);
796
+ };
797
+ /**
798
+ * Compute the value raised to the power of given `exponent`
799
+ * @param exponent
800
+ * @returns A `RadonInteger` object.
801
+ */
802
+ RadonInteger.prototype.power = function (exponent) {
803
+ return this._pushOperator(RadonInteger, [exponent]);
804
+ };
805
+ /**
806
+ * Stringify the value.
807
+ * @returns A `RadonString` object.
808
+ */
809
+ RadonInteger.prototype.stringify = function () {
810
+ return this._pushOperator(RadonString, []);
811
+ };
812
+ /**
813
+ * Cast into a big-endian bytes buffer.
814
+ * @returns A `RadonBytes` object.
815
+ */
816
+ RadonInteger.prototype.toBytes = function () {
817
+ return this._pushOperator(RadonBytes, []);
818
+ };
819
+ /**
820
+ * Cast into a float value.
821
+ * @returns A `RadonFloat` object.
822
+ */
823
+ RadonInteger.prototype.toFloat = function () {
824
+ return this._pushOperator(RadonFloat, []);
825
+ };
826
+ return RadonInteger;
827
+ }(RadonAny));
828
+ exports.RadonInteger = RadonInteger;
829
+ var RadonMap = /** @class */ (function (_super) {
830
+ __extends(RadonMap, _super);
831
+ function RadonMap() {
832
+ return _super !== null && _super.apply(this, arguments) || this;
833
+ }
834
+ /**
835
+ * Alter the value of the item(s) identified by `keys`, applying the given `innerScript` to each one of them.
836
+ * @param key
837
+ * @param innerScript
838
+ * @returns The same RadonMap upon which this operator is executed, with the specified item(s) altered
839
+ * by the given `innerScript`.
840
+ */
841
+ // TODO
842
+ // public alter<AlteredOutputType extends RadonAny>(innerScript: RadonOperator<AlteredOutputType>, ...keys: string[]) {
843
+ // return this._pushOperator(RadonMap, [innerScript, ...keys])
844
+ // }
845
+ /**
846
+ * Fetch the array within the specified `key` field.
847
+ * @param key
848
+ * @returns A `RadonArray` object.
849
+ */
850
+ RadonMap.prototype.getArray = function (key, _itemsType) {
851
+ return this._pushOperator((RadonArray), [key]);
852
+ };
853
+ /**
854
+ * Fetch the boolean within the specified `key` field.
855
+ * @param key
856
+ * @returns A `RadonBoolean` object.
857
+ */
858
+ RadonMap.prototype.getBoolean = function (key) {
859
+ return this._pushOperator(RadonBoolean, [key]);
860
+ };
861
+ /**
862
+ * Fetch the float value within the specified `key` field.
863
+ * @param key
864
+ * @returns A `RadonFloat` object.
865
+ */
866
+ RadonMap.prototype.getFloat = function (key) {
867
+ return this._pushOperator(RadonFloat, [key]);
868
+ };
869
+ /**
870
+ * Fetch the integer value within the specified `key` field.
871
+ * @param key
872
+ * @returns A `RadonInteger` object.
873
+ */
874
+ RadonMap.prototype.getInteger = function (key) {
875
+ return this._pushOperator(RadonInteger, [key]);
876
+ };
877
+ /**
878
+ * Fetch the map object within the specified `key` field.
879
+ * @param key
880
+ * @returns A `RadonMap` object.
881
+ */
882
+ RadonMap.prototype.getMap = function (key) {
883
+ return this._pushOperator(RadonMap, [key]);
884
+ };
885
+ /**
886
+ * Fetch the string within the specified `key` field.
887
+ * @param key
888
+ * @returns A `RadonString` object.
889
+ */
890
+ RadonMap.prototype.getString = function (key) {
891
+ return this._pushOperator(RadonString, [key]);
892
+ };
893
+ /**
894
+ * Extract key names of the map into an array of strings.
895
+ * @returns A `RadonArray` object.
896
+ */
897
+ RadonMap.prototype.keys = function () {
898
+ return this._pushOperator((RadonArray), []);
899
+ };
900
+ /**
901
+ * Take a selection of items from the input map. Fails if unexistent items are referred.
902
+ * @param keys Key string of the input items to take into the output map.
903
+ * @return A `RadonMap` object.
904
+ */
905
+ RadonMap.prototype.pick = function () {
906
+ var keys = [];
907
+ for (var _i = 0; _i < arguments.length; _i++) {
908
+ keys[_i] = arguments[_i];
909
+ }
910
+ if (Array(keys).length == 0) {
911
+ throw new EvalError("\u001B[1;33mRadonMap::pick: a non-empty array of key strings must be provided\u001B[0m");
912
+ }
913
+ return this._pushOperator(RadonMap, __spreadArray([], __read(keys), false));
914
+ };
915
+ /**
916
+ * Extract the map values into an array.
917
+ * @returns A `RadonArray` object.
918
+ */
919
+ RadonMap.prototype.values = function () {
920
+ return this._pushOperator(RadonArray, []);
921
+ };
922
+ /**
923
+ * Stringify input `RadonMap` object into a JSON string.
924
+ * @return A `RadonString` object.
925
+ */
926
+ RadonMap.prototype.stringify = function () {
927
+ return this._pushOperator(RadonString, []);
928
+ };
929
+ return RadonMap;
930
+ }(RadonAny));
931
+ exports.RadonMap = RadonMap;
932
+ var RadonString = /** @class */ (function (_super) {
933
+ __extends(RadonString, _super);
934
+ function RadonString() {
935
+ return _super !== null && _super.apply(this, arguments) || this;
936
+ }
937
+ /**
938
+ * Cast into a boolean value.
939
+ * @returns A `RadonBoolean` object.
940
+ */
941
+ RadonString.prototype.asBoolean = function () {
942
+ return this._pushOperator(RadonBoolean, []);
943
+ };
944
+ /**
945
+ * Convert the input string into a bytes buffer.
946
+ * @param encoding Enum integer value specifying the encoding schema on the input string, standing:
947
+ * 0 -> Hex string (default, if none was specified)
948
+ * 1 -> Base64 string
949
+ * @returns A `RadonBytes` object.
950
+ */
951
+ RadonString.prototype.asBytes = function (encoding) {
952
+ if (encoding === void 0) { encoding = RadonEncodings.HexString; }
953
+ return this._pushOperator(RadonBytes, [encoding]);
954
+ };
955
+ /**
956
+ * Cast into a float number.
957
+ * @returns A `RadonFloat` object.
958
+ */
959
+ RadonString.prototype.asFloat = function () {
960
+ return this._pushOperator(RadonFloat, []);
961
+ };
962
+ /**
963
+ * Count the number of chars.
964
+ * @returns A `RadonInteger` object.
965
+ */
966
+ RadonString.prototype.length = function () {
967
+ return this._pushOperator(RadonInteger, []);
968
+ };
969
+ /**
970
+ * Replace the string by a value of type `outputType`, determined on whether the string value matches
971
+ * any of the keys within the provided `matchingMap`, or set to a `defaultValue` if no match is found.
972
+ * @param outputType Radon type of the output value.
973
+ * @param matchingMap Map determining the output value depending on the string value.
974
+ * @param defaultValue Value returned if no match is found.
975
+ * @returns
976
+ */
977
+ RadonString.prototype.match = function (outputType, matchingMap, defaultValue) {
978
+ return this._pushOperator(outputType, [matchingMap, defaultValue]);
979
+ // this._bytecode = [
980
+ // 0x75,
981
+ // matchingMap,
982
+ // defaultValue
983
+ // ]
984
+ // this._method = "match"
985
+ // this._params = `{ ${Object.entries(matchingMap).map((entry: [string, any]) => `\"${entry[0]}\": ${entry[1]}, `)}}, ${defaultValue}`
986
+ // let keys: string = ""
987
+ // Object.keys(matchingMap).map((key: string) => keys += key + ";")
988
+ // return new outputType(this, keys)
989
+ };
990
+ /**
991
+ * Parse input string as an array of JSON items.
992
+ * @param jsonPaths (optional) Array of JSON paths within input `RadonString` from where to fetch items that will be appended to the output `RadonArray`.
993
+ * @returns A `RadonArray` object.
994
+ */
995
+ RadonString.prototype.parseJSONArray = function () {
996
+ var jsonPaths = [];
997
+ for (var _i = 0; _i < arguments.length; _i++) {
998
+ jsonPaths[_i] = arguments[_i];
999
+ }
1000
+ return this._pushOperator((RadonArray), __spreadArray([], __read(jsonPaths), false));
1001
+ };
1002
+ /**
1003
+ * Parse string as a JSON-encoded map.
1004
+ * @param jsonPath (optional) JSON path within input `RadonString` from where to extract the output `RadonMap`.
1005
+ * @returns A `RadonMap` object.
1006
+ */
1007
+ RadonString.prototype.parseJSONMap = function (jsonPath) {
1008
+ return this._pushOperator(RadonMap, [jsonPath]);
1009
+ };
1010
+ /**
1011
+ * Parse string as an XML-encoded map.
1012
+ * @returns A `RadonMap` object.
1013
+ */
1014
+ RadonString.prototype.parseXMLMap = function () {
1015
+ return this._pushOperator(RadonMap, []);
1016
+ };
1017
+ /**
1018
+ * Replace with given `replacement` string, all parts of the input string that match with given regular expression.
1019
+ * @param regex Regular expression to be matched.
1020
+ * @param replacement Text that will replace all occurences.
1021
+ * @returns A `RadonString` object.
1022
+ */
1023
+ RadonString.prototype.replace = function (regex, replacement) {
1024
+ if (regex === void 0) { regex = ""; }
1025
+ if (replacement === void 0) { replacement = ""; }
1026
+ return this._pushOperator(RadonString, [regex, replacement]);
1027
+ };
1028
+ /**
1029
+ * Returns a slice extracted from the input string.
1030
+ * A `startIndex` of 0 refers to the beginning of the input string. If no `endIndex` is provided, it will be assumed
1031
+ * the length of the input string. Negative values will be relative to the end of the input string.
1032
+ * @param startIndex Position within input string where the output string will start.
1033
+ * @param endIndex Position within input string where the output string will end.
1034
+ * @returns A `RadonString` object.
1035
+ */
1036
+ RadonString.prototype.slice = function (startIndex, endIndex) {
1037
+ if (startIndex === void 0) { startIndex = 0; }
1038
+ return this._pushOperator(RadonString, [startIndex, endIndex]);
1039
+ };
1040
+ /**
1041
+ * Divides input string into an array of substrings,
1042
+ * @param regex The string or regular expression to use for splitting.
1043
+ * @returns A `RadonArray` object.
1044
+ */
1045
+ RadonString.prototype.split = function (regex) {
1046
+ if (regex === void 0) { regex = "\r"; }
1047
+ return this._pushOperator((RadonArray), [regex]);
1048
+ };
1049
+ /**
1050
+ * Lower case all characters.
1051
+ * @returns A `RadonString` object.
1052
+ */
1053
+ RadonString.prototype.toLowercase = function () {
1054
+ return this._pushOperator(RadonString, []);
1055
+ };
1056
+ /**
1057
+ * Upper case all characters.
1058
+ * @returns A `RadonString` object.
1059
+ */
1060
+ RadonString.prototype.toUpperCase = function () {
1061
+ return this._pushOperator(RadonString, []);
1062
+ };
1063
+ return RadonString;
1064
+ }(RadonAny));
1065
+ exports.RadonString = RadonString;
1066
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JhZG9uL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2QkFBMkM7QUFDM0MseURBQTRDO0FBRzVDLDhDQUFpQztBQUVqQyxJQUFZLGNBR1g7QUFIRCxXQUFZLGNBQWM7SUFDdEIsNkRBQWEsQ0FBQTtJQUNiLHVEQUFVLENBQUE7QUFDZCxDQUFDLEVBSFcsY0FBYyw4QkFBZCxjQUFjLFFBR3pCO0FBRUQsSUFBWSxjQW9FWDtBQXBFRCxXQUFZLGNBQWM7SUFDdEIsa0VBQWtCLENBQUE7SUFDbEIsa0VBQWtCLENBQUE7SUFDbEIsOERBQWdCLENBQUE7SUFDaEIsc0VBQW9CLENBQUE7SUFDcEIsMEVBQXNCLENBQUE7SUFDdEIsc0VBQW9CLENBQUE7SUFDcEIsc0VBQW9CLENBQUE7SUFDcEIsMEVBQXNCLENBQUE7SUFDdEIsa0VBQWtCLENBQUE7SUFDbEIsd0VBQXFCLENBQUE7SUFDckIsNERBQWUsQ0FBQTtJQUNmLGtFQUFrQixDQUFBO0lBQ2xCLDhEQUFnQixDQUFBO0lBQ2hCLDhEQUFnQixDQUFBO0lBQ2hCLDRFQUF1QixDQUFBO0lBQ3ZCLHNFQUFvQixDQUFBO0lBQ3BCLHdFQUFxQixDQUFBO0lBQ3JCLDhEQUFnQixDQUFBO0lBQ2hCLHdFQUFxQixDQUFBO0lBQ3JCLGtFQUFrQixDQUFBO0lBQ2xCLGdFQUFpQixDQUFBO0lBQ2pCLHNFQUFvQixDQUFBO0lBQ3BCLHdFQUFxQixDQUFBO0lBQ3JCLG9FQUFtQixDQUFBO0lBQ25CLDRFQUF1QixDQUFBO0lBQ3ZCLGdFQUFpQixDQUFBO0lBQ2pCLHNFQUFvQixDQUFBO0lBQ3BCLGtFQUFrQixDQUFBO0lBQ2xCLHNFQUFvQixDQUFBO0lBQ3BCLGtFQUFrQixDQUFB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QUNEOzs7O09BSUc7SUFDSSwyQkFBSyxHQUFaLFVBQWEsS0FBb0I7UUFBcEIsc0JBQUEsRUFBQSxZQUFvQjtRQUM3QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQSxVQUF1QixDQUFBLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFDRDs7O09BR0c7SUFDSSxpQ0FBVyxHQUFsQjtRQUNJLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUNEOzs7T0FHRztJQUNJLGlDQUFXLEdBQWxCO1FBQ0ksT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBQ0wsa0JBQUM7QUFBRCxDQUFDLEFBMUhELENBQWlDLFFBQVEsR0EwSHhDO0FBMUhZLGtDQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZW5jb2RlIGFzIGNib3JFbmNvZGUgfSBmcm9tIFwiY2JvclwiXG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gXCIuLi8uLi9iaW4vaGVscGVyc1wiXG5cbmltcG9ydCB7IE9wY29kZXMgYXMgUmFkb25SZWR1Y2VyT3Bjb2RlcyB9IGZyb20gJy4vcmVkdWNlcnMnXG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuLi91dGlscydcblxuZXhwb3J0IGVudW0gUmFkb25FbmNvZGluZ3Mge1xuICAgIEhleFN0cmluZyA9IDAsXG4gICAgQmFzZTY0ID0gMSxcbn1cblxuZXhwb3J0IGVudW0gUmFkb25PcGVyYXRvcnMge1xuICAgIEFycmF5TGVuZ3RoID0gMHgxMCxcbiAgICBBcnJheUZpbHRlciA9IDB4MTEsXG4gICAgQXJyYXlKb2luID0gMHgxMixcbiAgICBBcnJheUdldEFycmF5ID0gMHgxMyxcbiAgICBBcnJheUdldEJvb2xlYW4gPSAweDE0LFxuICAgIEFycmF5R2V0Qnl0ZXMgPSAweDE1LFxuICAgIEFycmF5R2V0RmxvYXQgPSAweDE2LFxuICAgIEFycmF5R2V0SW50ZWdlciA9IDB4MTcsXG4gICAgQXJyYXlHZXRNYXAgPSAweDE4LFxuICAgIEFycmF5R2V0U3RyaW5nID0gMHgxOSxcbiAgICBBcnJheU1hcCA9IDB4MWEsXG4gICAgQXJyYXlSZWR1Y2UgPSAweDFiLFxuICAgIEFycmF5U29ydCA9IDB4MWQsXG4gICAgQXJyYXlQaWNrID0gMHgxZSxcbiAgICBCb29sZWFuU3RyaW5naWZ5ID0gMHgyMCxcbiAgICBCb29sZWFuTmVnYXRlID0gMHgyMixcbiAgICBCeXRlc1N0cmluZ2lmeSA9IDB4MzAsXG4gICAgQnl0ZXNIYXNoID0gMHgzMSxcbiAgICBCeXRlc0FzSW50ZWdlciA9IDB4MzIsXG4gICAgQnl0ZXNMZW5ndGggPSAweDM0LFxuICAgIEJ5dGVzU2xpY2UgPSAweDNjLFxuICAgIEZsb2F0QWJzb2x1dGUgPSAweDUwLFxuICAgIEZsb2F0U3RyaW5naWZ5ID0gMHg1MSxcbiAgICBGbG9hdENlaWxpbmcgPSAweDUyLFxuICAgIEZsb2F0R3JlYXRlclRoYW4gPSAweDUzLFxuICAgIEZsb2F0Rmxvb3IgPSAweDU0LFxuICAgIEZsb2F0TGVzc1RoYW4gPSAweDU1LFxuICAgIEZsb2F0TW9kdWxlID0gMHg1NixcbiAgICBGbG9hdE11bHRpcGx5ID0gMHg1NyxcbiAgICBGbG9hdE5lZ2F0ZSA9IDB4NTgsXG4gICAgRmxvYXRQb3dlciA9IDB4NTksXG4gICAgRmxvYXRSb3VuZCA9IDB4NWIsXG4gICAgRmxvYXRUcnVuY2F0ZSA9IDB4NWQsXG4gICAgSW50ZWdlckFic29sdXRlID0gMHg0MCxcbiAgICBJbnRlZ2VyVG9GbG9hdCA9IDB4NDEsXG4gICAgSW50ZWdlclN0cmluZ2lmeSA9IDB4NDIsXG4gICAgSW50ZWdlckdyZWF0ZXJUaGFuID0gMHg0MyxcbiAgICBJbnRlZ2VyTGVzc1RoYW4gPSAweDQ0LFxuICAgIEludGVnZXJNb2R1bG8gPSAweDQ2LFxuICAgIEludGVnZXJNdWx0aXBseSA9IDB4NDcsXG4gICAgSW50ZWdlck5lZ2F0ZSA9IDB4NDgsXG4gICAgSW50ZWdlclBvd2VyID0gMHg0OSxcbiAgICBJbnRlZ2VyVG9CeXRlcyA9IDB4NGEsXG4gICAgTWFwU3RyaW5naWZ5ID0gMHg2MCxcbiAgICBNYXBHZXRBcnJheSA9IDB4NjEsXG4gICAgTWFwR2V0Qm9vbGVhbiA9IDB4NjIsXG4gICAgTWFwR2V0RmxvYXQgPSAweDY0LFxuICAgIE1hcEdldEludGVnZXIgPSAweDY1LFxuICAgIE1hcEdldE1hcCA9IDB4NjYsXG4gICAgTWFwR2V0U3RyaW5nID0gMHg2NyxcbiAgICBNYXBLZXlzID0gMHg2OCxcbiAgICBNYXBWYWx1ZXMgPSAweDY5LFxuICAgIE1hcEFsdGVyID0gMHg2YixcbiAgICBNYXBQaWNrID0gMHg2ZSwgICBcbiAgICBTdHJpbmdBc0Jvb2xlYW4gPSAweDcwLFxuICAgIFN0cmluZ0FzQnl0ZXMgPSAweDcxLFxuICAgIFN0cmluZ0FzRmxvYXQgPSAweDcyLFxuICAgIFN0cmluZ0xlbmd0aCA9IDB4NzQsXG4gICAgU3RyaW5nTWF0Y2ggPSAweDc1LFxuICAgIFN0cmluZ1BhcnNlSlNPTkFycmF5ID0gMHg3NixcbiAgICBTdHJpbmdQYXJzZUpTT05NYXAgPSAweDc3LFxuICAgIFN0cmluZ1BhcnNlWE1MTWFwID0gMHg3OCxcbiAgICBTdHJpbmdUb0xvd2VyQ2FzZSA9IDB4NzksXG4gICAgU3RyaW5nVG9VcHBzZXJDYXNlID0gMHg3YSxcbiAgICBTdHJpbmdQYXJzZVJlcGxhY2UgPSAweDdiLFxuICAgIFN0cmluZ1BhcnNlU2xpY2UgPSAweDdjLFxuICAgIFN0cmluZ1BhcnNlU3BsaXQgPSAweDdkLFxufVxuXG5hYnN0cmFjdCBjbGFzcyBSYWRvbkNsYXNzIHtcbiAgICByZWFkb25seSBwcmV2PzogUmFkb25PcGVyYXRvcjtcbiAgICBjb25zdHJ1Y3RvcihwcmV2PzogUmFkb25PcGVyYXRvcikge1xuICAgICAgICB0aGlzLnByZXYgPSBwcmV2XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFkb25PcGVyYXRvciBleHRlbmRzIFJhZG9uQ2xhc3Mge1xuICAgIHJlYWRvbmx5IG9wY29kZTogUmFkb25PcGVyYXRvcnNcbiAgICByZWFkb25seSBwYXJhbXM/OiBhbnlbXVxuICAgIGNvbnN0cnVjdG9yKG9wY29kZTogUmFkb25PcGVyYXRvcnMsIHBhcmFtcz86IGFueVtdLCBvcHM/OiBSYWRvbk9wZXJhdG9yKSB7XG4gICAgICAgIHN1cGVyKG9wcylcbiAgICAgICAgdGhpcy5vcGNvZGUgPSBvcGNvZGVcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXMgfHwgW11cbiAgICB9XG4gICAgcHVibGljIGFyZ3NDb3VudCgpOiBudW1iZXIgeyBcbiAgICAgICAgbGV0IG1heENvdW50OiBudW1iZXIgPSAwXG4gICAgICAgIHRoaXMucGFyYW1zPy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSBoZWxwZXJzLmdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyhwYXJhbSlcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBtYXhDb3VudCkgbWF4Q291bnQgPSBjb3VudFxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnICYmIHBhcmFtIGluc3RhbmNlb2YgUmFkb25TY3JpcHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb3VudCA9IHBhcmFtLmFyZ3NDb3VudCgpXG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gbWF4Q291bnQpIG1heENvdW50ID0gY291bnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KFxuICAgICAgICAgICAgbWF4Q291bnQsXG4gICAgICAgICAgICB0aGlzLnByZXY/LmFyZ3NDb3VudCgpIHx8IDBcbiAgICAgICAgKVxuICAgIH1cbiAgICBwdWJsaWMgZGlzZWN0KGxldmVsID0gMCk6IFtudW1iZXIsIHN0cmluZywgc3RyaW5nXVtdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcz8ucHJldj8uZGlzZWN0KGxldmVsKSB8fCBbXVxuICAgICAgICBjb25zdCBvcGVyYXRvciA9IFJhZG9uT3BlcmF0b3JzW3RoaXMub3Bjb2RlXVxuICAgICAgICBjb25zdCBpbnB1dFR5cGUgPSBgUmFkb24ke29wZXJhdG9yLnNwbGl0KC8oPz1bQS1aXSkvKVswXX1gXG4gICAgICAgIGxldCByYWRvbkNhbGwgPSBvcGVyYXRvci5zcGxpdCgvKD89W0EtWl0pLykuc2xpY2UoMSkuam9pbignJylcbiAgICAgICAgcmFkb25DYWxsID0gcmFkb25DYWxsLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgcmFkb25DYWxsLnNsaWNlKDEpXG4gICAgICAgIGxldCBhcmdzID0gXCJcIlxuICAgICAgICBsZXQgc2NyaXB0XG4gICAgICAgIGlmICh0aGlzLnBhcmFtcyAmJiB0aGlzLnBhcmFtc1swXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5tYXAocGFyYW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gIT09ICdvYmplY3QnIHx8ICEocGFyYW0gaW5zdGFuY2VvZiBSYWRvblNjcmlwdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncyArPSAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJyA/ICBgXCIke3BhcmFtfVwiYCA6IHBhcmFtLnRvU3RyaW5nKCkpICsgXCIsIFwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0ID0gcGFyYW1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYgKHNjcmlwdCkgYXJncyArPSBcIlJhZG9uT3BlcmF0b3Ige1wiXG4gICAgICAgICAgICBlbHNlIGFyZ3MgPSBhcmdzLnNsaWNlKDAsIC0yKVxuICAgICAgICB9XG4gICAgICAgIGlmIChzY3JpcHQpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dFR5cGUgPSBgJHsoc2NyaXB0IGFzIFJhZG9uU2NyaXB0KS5vdXRwdXRUeXBlPy5jb25zdHJ1Y3Rvci5uYW1lIHx8IFwiUmFkb25BbnlcIn1gXG4gICAgICAgICAgICByYWRvbkNhbGwgKz0gYCgke2FyZ3N9YFxuICAgICAgICAgICAgcmVzdWx0LnB1c2goW2xldmVsLCBpbnB1dFR5cGUsIHJhZG9uQ2FsbF0pXG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi4oc2NyaXB0IGFzIFJhZG9uU2NyaXB0KS5kaXNlY3QobGV2ZWwgKyAxKSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtsZXZlbCwgb3V0cHV0VHlwZSwgXCJ9KVwiXSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJhZG9uQ2FsbCArPSBgKCR7YXJnc30pYFxuICAgICAgICAgICAgcmVzdWx0LnB1c2goW2xldmVsLCBpbnB1dFR5cGUsIHJhZG9uQ2FsbF0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbiAgICBwdWJsaWMgZW5jb2RlKCk6IGFueVtdIHsgXG4gICAgICAgIGxldCBlbmNvZGVkXG4gICAgICAgIGlmICh0aGlzPy5wYXJhbXMgJiYgdGhpcy5wYXJhbXNbMF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IHRoaXMucGFyYW1zLm1hcChwYXJhbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtIGluc3RhbmNlb2YgUmFkb25BbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5wcmV2Py5lbmNvZGUoKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgUmFkb25PcGVyYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLmVuY29kZSgpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0gaW5zdGFuY2VvZiBSYWRvblNjcmlwdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLmVuY29kZSgpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZW5jb2RlZCA9IFt0aGlzLm9wY29kZSwgLi4uYXJnc11cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuY29kZWQgPSB0aGlzLm9wY29kZVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByZXYpIHtcbiAgICAgICAgICAgIHJldHVybiBbLi4udGhpcy5wcmV2LmVuY29kZSgpLCBlbmNvZGVkXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtlbmNvZGVkXVxuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyByZXBsYWNlV2lsZGNhcmRzKGFyZ3M6IHN0cmluZ1tdKTogUmFkb25PcGVyYXRvciB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IHRoaXMuYXJnc0NvdW50KCkpIHtcbiAgICAgICAgICAgIHRocm93IEV2YWxFcnJvcihgSW5zdWZmaWNlbnQgYXJncyB3ZXJlIHByb3ZpZGVkICgke2FyZ3MubGVuZ3RofSA8ICR7dGhpcy5hcmdzQ291bnQoKX0pYClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJhZG9uT3BlcmF0b3IoXG4gICAgICAgICAgICB0aGlzLm9wY29kZSwgXG4gICAgICAgICAgICB0aGlzLnBhcmFtcz8ubWFwKHBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGVscGVycy5yZXBsYWNlV2lsZGNhcmRzKHBhcmFtLCBhcmdzKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJiBwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5yZXBsYWNlV2lsZGNhcmRzKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksIFxuICAgICAgICAgICAgdGhpcz8ucHJldj8ucmVwbGFjZVdpbGRjYXJkcyhhcmdzKVxuICAgICAgICApXG4gICAgfVxuICAgIHB1YmxpYyBzcGxpY2VXaWxkY2FyZChhcmdJbmRleDogbnVtYmVyLCBhcmdWYWx1ZTogc3RyaW5nKTogUmFkb25PcGVyYXRvciB7XG4gICAgICAgIHJldHVybiBuZXcgUmFkb25PcGVyYXRvcihcbiAgICAgICAgICAgIHRoaXMub3Bjb2RlLFxuICAgICAgICAgICAgdGhpcy5wYXJhbXM/Lm1hcChwYXJhbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlcnMuc3BsaWNlV2lsZGNhcmQocGFyYW0sIGFyZ0luZGV4LCBhcmdWYWx1ZSwgdGhpcy5hcmdzQ291bnQoKSlcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCcgJiYgcGFyYW0gaW5zdGFuY2VvZiBSYWRvblNjcmlwdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW0uc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXgsIGFyZ1ZhbHVlKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGhpcz8ucHJldj8uc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXgsIGFyZ1ZhbHVlKVxuICAgICAgICApXG4gICAgfVxuICAgIHB1YmxpYyB0b1N0cmluZyhsZWZ0ID0gXCJcIiwgaW5kZW50ID0gNCwgbGV2ZWwgPSAwKTogc3RyaW5nIHsgXG4gICAgICAgIGNvbnN0IGxmID0gbGVmdCAhPT0gXCJcIiA/IFwiXFxuXCIgOiBcIlwiXG4gICAgICAgIGxldCBzdHIgPSB0aGlzPy5wcmV2Py50b1N0cmluZyhsZWZ0LCBpbmRlbnQsIGxldmVsKSB8fCBcIlwiXG4gICAgICAgIGxldCBtZXRob2ROYW1lID0gUmFkb25PcGVyYXRvcnNbdGhpcy5vcGNvZGVdLnNwbGl0KC8oPz1bQS1aXSkvKS5zbGljZSgxKS5qb2luKCcnKVxuICAgICAgICBtZXRob2ROYW1lID0gbWV0aG9kTmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIG1ldGhvZE5hbWUuc2xpY2UoMSlcbiAgICAgICAgc3RyICs9IGAke2xlZnR9JHtcIiBcIi5yZXBlYXQoaW5kZW50ICogbGV2ZWwpfS4ke21ldGhvZE5hbWV9KGBcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zICYmIHRoaXMucGFyYW1zWzBdICE9PSB1bmRlZmluZWQpIHsgXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gYFwiJHtwYXJhbX1cIiwgYFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJiBwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSBgJHtwYXJhbS50b1N0cmluZyhsZWZ0LCBpbmRlbnQsIGxldmVsICsgMSl9JHtsZWZ0fSR7XCIgXCIucmVwZWF0KGluZGVudCAqIGxldmVsKX0sIGBcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gcGFyYW0udG9TdHJpbmcoKSArIFwiLCBcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMCwgLTIpXG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IGApJHtsZn1gXG4gICAgICAgIHJldHVybiBzdHJcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYWRvblNjcmlwdCB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wcz86IFJhZG9uT3BlcmF0b3I7XG4gICAgcHVibGljIHJlYWRvbmx5IGlucHV0VHlwZT86IFJhZG9uQW55O1xuICAgIHB1YmxpYyByZWFkb25seSBvdXRwdXRUeXBlPzogUmFkb25Bbnk7XG4gICAgY29uc3RydWN0b3IgKG91dHB1dDogUmFkb25BbnkpIHtcbiAgICAgICAgdGhpcy5vcHMgPSBvdXRwdXQ/LnByZXY7XG4gICAgICAgIGNvbnN0IHJhZG9uVHlwZXMgPSB7XG4gICAgICAgICAgICBcIkFycmF5XCI6IFJhZG9uQXJyYXksXG4gICAgICAgICAgICBcIkJvb2xlYW5cIjogUmFkb25Cb29sZWFuLFxuICAgICAgICAgICAgXCJCeXRlc1wiOiBSYWRvbkJ5dGVzLFxuICAgICAgICAgICAgXCJGbG9hdFwiOiBSYWRvbkZsb2F0LFxuICAgICAgICAgICAgXCJJbnRlZ2VyXCI6IFJhZG9uSW50ZWdlcixcbiAgICAgICAgICAgIFwiTWFwXCI6IFJhZG9uTWFwLFxuICAgICAgICAgICAgXCJTdHJpbmdcIjogUmFkb25TdHJpbmcsXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlucHV0ID0gb3V0cHV0Py5wcmV2XG4gICAgICAgIHdoaWxlIChpbnB1dD8ucHJldikgaW5wdXQgPSBpbnB1dD8ucHJldlxuICAgICAgICBjb25zdCBpbnB1dFR5cGUgPSBPYmplY3QuZW50cmllcyhyYWRvblR5cGVzKS5maW5kKChbcHJlZml4LCBfXSkgPT4gaW5wdXQgJiYgUmFkb25PcGVyYXRvcnNbaW5wdXQub3Bjb2RlXS5zdGFydHNXaXRoKHByZWZpeCkpXG4gICAgICAgIGlmIChpbnB1dFR5cGUgJiYgaW5wdXRUeXBlWzFdKSB0aGlzLmlucHV0VHlwZSA9IG5ldyBpbnB1dFR5cGVbMV0oKVxuICAgICAgICBjb25zdCBvdXRwdXRUeXBlID0gT2JqZWN0LnZhbHVlcyhyYWRvblR5cGVzKS5maW5kKG91dHB1dFR5cGUgPT4gb3V0cHV0IGluc3RhbmNlb2Ygb3V0cHV0VHlwZSk7XG4gICAgICAgIGlmIChvdXRwdXRUeXBlKSB0aGlzLm91dHB1dFR5cGUgPSBuZXcgb3V0cHV0VHlwZSgpXG4gICAgfVxuICAgIHB1YmxpYyBhcmdzQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BzPy5hcmdzQ291bnQoKSB8fCAwO1xuICAgIH1cbiAgICBwdWJsaWMgZGlzZWN0KGxldmVsID0gMCk6IFtudW1iZXIsIHN0cmluZywgc3RyaW5nXVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BzPy5kaXNlY3QobGV2ZWwpIHx8IFtbbGV2ZWwsIFwiUmFkb25BbnlcIiwgXCJcIl1dXG4gICAgfVxuICAgIHB1YmxpYyBlbmNvZGUoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHM/LmVuY29kZSgpIHx8IFtdO1xuICAgIH1cbiAgICBwdWJsaWMgcmVwbGFjZVdpbGRjYXJkcyguLi5hcmdzOiBzdHJpbmdbXSk6IFJhZG9uQW55IHtcbiAgICAgICAgY29uc3QgT3V0cHV0VHlwZSA9IFtcbiAgICAgICAgICAgIFJhZG9uQXJyYXksXG4gICAgICAgICAgICBSYWRvbkJvb2xlYW4sXG4gICAgICAgICAgICBSYWRvbkJ5dGVzLFxuICAgICAgICAgICAgUmFkb25GbG9hdCxcbiAgICAgICAgICAgIFJhZG9uSW50ZWdlcixcbiAgICAgICAgICAgIFJhZG9uTWFwLFxuICAgICAgICAgICAgUmFkb25TdHJpbmcsXG4gICAgICAgIF0uZmluZChPdXRwdXRUeXBlID0+IHRoaXMub3V0cHV0VHlwZSBpbnN0YW5jZW9mIE91dHB1dFR5cGUpO1xuICAgICAgICBpZiAoT3V0cHV0VHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBPdXRwdXRUeXBlKHRoaXMub3BzPy5yZXBsYWNlV2lsZGNhcmRzKGFyZ3MpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXZhbEVycm9yKGBDYW5ub3QgcmVwbGFjZSB3aWxkY2FyZHMgb24gZW1wdHkgc2NyaXB0YClcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXg6IG51bWJlciwgYXJnVmFsdWU6IHN0cmluZyk6IFJhZG9uQW55IHtcbiAgICAgICAgY29uc3QgT3V0cHV0VHlwZSA9IFtcbiAgICAgICAgICAgIFJhZG9uQXJyYXksXG4gICAgICAgICAgICBSYWRvbkJvb2xlYW4sXG4gICAgICAgICAgICBSYWRvbkJ5dGVzLFxuICAgICAgICAgICAgUmFkb25GbG9hdCxcbiAgICAgICAgICAgIFJhZG9uSW50ZWdlcixcbiAgICAgICAgICAgIFJhZG9uTWFwLFxuICAgICAgICAgICAgUmFkb25TdHJpbmcsXG4gICAgICAgIF0uZmluZChPdXRwdXRUeXBlID0+IHRoaXMub3V0cHV0VHlwZSBpbnN0YW5jZW9mIE91dHB1dFR5cGUpO1xuICAgICAgICBpZiAoT3V0cHV0VHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBPdXRwdXRUeXBlKHRoaXMub3BzPy5zcGxpY2VXaWxkY2FyZChhcmdJbmRleCwgYXJnVmFsdWUpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXZhbEVycm9yKGBDYW5ub3Qgc3BsaWNlIHdpbGRjYXJkcyBvbiBlbXB0eSBzY3JpcHRgKVxuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyB0b0J5dGVjb2RlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBVdGlscy50b0hleFN0cmluZyhPYmplY3QudmFsdWVzKFVpbnQ4QXJyYXkuZnJvbShjYm9yRW5jb2RlKHRoaXMuZW5jb2RlKCkpKSksIHRydWUpXG4gICAgfVxuICAgIHB1YmxpYyB0b1N0cmluZyhsZWZ0ID0gXCJcIiwgaW5kZW50ID0gMCwgbGV2ZWwgPSAwKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbGYgPSBsZWZ0ICE9PSBcIlwiID8gXCJcXG5cIiA6IFwiXCJcbiAgICAgICAgcmV0dXJuIGBSYWRvbk9wZXJhdG9yKCR7dGhpcy5pbnB1dFR5cGU/LmNvbnN0cnVjdG9yLm5hbWUgfHwgXCJcIn0pJHtsZn0ke3RoaXMub3BzPy50b1N0cmluZyhsZWZ0LCBpbmRlbnQsIGxldmVsICsgMSl9YFxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJhZG9uQW55IGV4dGVuZHMgUmFkb25DbGFzcyB7XG4gICAgcHJvdGVjdGVkIF9wdXNoT3BlcmF0b3I8T3V0cHV0VHlwZSBleHRlbmRzIFJhZG9uQW55PihcbiAgICAgICAgb3V0cHV0VHlwZTogeyBuZXcob3BzPzogUmFkb25PcGVyYXRvcik6IE91dHB1dFR5cGU7IH0sIFxuICAgICAgICBwYXJhbXM6IGFueVtdLFxuICAgICk6IE91dHB1dFR5cGUge1xuICAgICAgICBsZXQgbmFtZVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gKGVyciBhcyBFcnJvcilcbiAgICAgICAgICAgIG5hbWUgPSByZXN1bHQuc3RhY2s/LnNwbGl0KCcgYXQgJylbMl1cbiAgICAgICAgICAgICAgICAuc3BsaXQoJyAnKVswXVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnLicpXG4gICAgICAgICAgICAgICAgLm1hcChwYXJ0ID0+IGhlbHBlcnMudG9VcHBlckNhbWVsQ2FzZShwYXJ0KSlcbiAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAuc3BsaXQoLyg/PVtBLVpdKS8pLnNsaWNlKDEpXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3Bjb2RlID0gUmFkb25PcGVyYXRvcnNbbmFtZSBhcyBrZXlvZiB0eXBlb2YgUmFkb25PcGVyYXRvcnNdXG4gICAgICAgIGlmICghb3Bjb2RlKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgRmF0YWw6IHVua25vd24gUmFkb24gT3BlcmF0b3Igb3Bjb2RlICcke25hbWV9J2ApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IG91dHB1dFR5cGUobmV3IFJhZG9uT3BlcmF0b3IoXG4gICAgICAgICAgICAgICAgb3Bjb2RlLCBcbiAgICAgICAgICAgICAgICBbLi4ucGFyYW1zXSwgXG4gICAgICAgICAgICAgICAgdGhpcz8ucHJldlxuICAgICAgICAgICAgKSlcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSYWRvbkFycmF5PEl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55PiB7XG4gICAgaXRlbXNUeXBlOiBJdGVtc1R5cGU7XG59XG5cbmV4cG9ydCBjbGFzcyBSYWRvbkFycmF5PEl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25Bbnk+IGV4dGVuZHMgUmFkb25Bbnkge1xuICAgIC8qKlxuICAgICAqIERpc2NhcmQgdGhlIGl0ZW1zIGluIHRoZSBpbnB1dCBhcnJheSB0aGF0IG1ha2UgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gcmV0dXJuIGEgYGZhbHNlYCB2YWx1ZS4gXG4gICAgICogQHBhcmFtIHNjcmlwdCBGaWx0ZXJpbmcgc2NyaXB0IHVsdGltYXRlbHkgcmV0dXJuaW5nIGEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxuICAgICAqIE11c3QgYWNjZXB0IGFzIGlucHV0IHRoZSBzYW1lIGRhdGEgdHlwZXMgYXMgdGhlIG9uZXMgb2YgdGhlIGl0ZW1zIGJlaW5nIGl0ZXJhdGVkLiBcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QgY29udGFpbmluZyBvbmx5IHRoZSBpdGVtcyB0aGF0IG1ha2UgdGhlIGBpbm5lclNjcmlwdGAgdG8gcmV0dXJuIGEgYHRydWVgIHZhbHVlLiBcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyKGlubmVyU2NyaXB0OiBSYWRvbkJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCEoaW5uZXJTY3JpcHQgaW5zdGFuY2VvZiBSYWRvbkJvb2xlYW4pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXZhbEVycm9yKGBJbm5lciBzY3JpcHQgbXVzdCBmZXRjaCBhIFJhZG9uQm9vbGVhbiB2YWx1ZWApXG4gICAgICAgIH0gXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbbmV3IFJhZG9uU2NyaXB0KGlubmVyU2NyaXB0KV0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uQXJyYXlgIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gaW5kZXggXG4gICAgICovXG4gICAgcHVibGljIGdldEFycmF5PFN1Ykl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25Bbnk+KGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFN1Ykl0ZW1zVHlwZT4sIFtpbmRleF0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSBpbmRleCBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Qm9vbGVhbihpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5kZXhdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaCB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBhcyBhIGBSYWRvbkJ5dGVzYCBvYmplY3QuXG4gICAgICogQHBhcmFtIGluZGV4IFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCeXRlcyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW2luZGV4XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25GbG9hdGAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSBpbmRleCBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmxvYXQoaW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtpbmRleF0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSBpbmRleCBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SW50ZWdlcihpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbaW5kZXhdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaCB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBhcyBhIGBSYWRvbk1hcGAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSBpbmRleCBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWFwKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2luZGV4XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25TdHJpbmdgIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gaW5kZXggXG4gICAgICovXG4gICAgcHVibGljIGdldFN0cmluZyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtpbmRleF0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEpvaW4gYWxsIGl0ZW1zIG9mIHRoZSBhcnJheSBpbnRvIGEgdmFsdWUgb2YgdGhlIGdpdmVuIHR5cGUuIFRoZSBhcnJheSBtdXN0IGJlIGhvbW9nZW5lb3VzLCBcbiAgICAgKiBhbGwgaXRlbXMgYmVpbmcgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgb3V0cHV0VHlwZWAsIGlmIHNwZWNpZmllZCwgb3IgdGhlIEFycmF5J3MgaXRlbXNUeXBlIG90aGVyd2lzZS5cbiAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIFNlcGFyYXRvciB0byBiZSB1c2VkIHdoZW4gam9pbmluZyBzdHJpbmdzLiBXaGVuIGpvaW5pbmcgUmFkb25NYXBzLCBpdCBjYW4gYmUgdXNlZCB0byBzZXR0bGUgYmFzZSBzY2hlbWEgb24gcmVzdWx0aW5nIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gb3V0cHV0VHlwZSBSYWRvbiB0eXBlIG9mIHRoZSBvdXRwdXQgdmFsdWUuIFxuICAgICAqL1xuICAgIHB1YmxpYyBqb2luPE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uQW55PihzZXBhcmF0b3IgPSBcIlwiLCBvdXRwdXRUeXBlPzogeyBuZXcoKTogSXRlbXNUeXBlOyB9KSB7XG4gICAgICAgIGlmIChvdXRwdXRUeXBlKSB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxPdXRwdXRUeXBlPiwgW3NlcGFyYXRvcl0pXG4gICAgICAgIGVsc2UgdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8SXRlbXNUeXBlPiwgW3NlcGFyYXRvcl0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvdW50IHRoZSBudW1iZXIgb2YgaXRlbXMuIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFwIGFsbCBpdGVtcyBpbiB0aGUgYXJyYXkgd2l0aCB0aGUgZ2l2ZW4gYGlubmVyU2NyaXB0YC4gXG4gICAgICogQHBhcmFtIGlubmVyU2NyaXB0IE1hcHBpbmcgc2NyaXB0IHJldHVybmluZyBzb21lIGBSYWRvbkFueWAgb2JqZWN0LlxuICAgICAqIE11c3QgYWNjZXB0IGFzIGlucHV0IHRoZSBzYW1lIGRhdGEgdHlwZSBhcyB0aGUgb25lIG9mIHRoZSBpdGVtcyBiZWluZyBpdGVyYXRlZC4gXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1hcHBlZCB2YWx1ZXMuIFxuICAgICAqL1xuICAgIHB1YmxpYyBtYXAoaW5uZXJTY3JpcHQ6IFJhZG9uT3BlcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5LCBbaW5uZXJTY3JpcHRdKVxuICAgIH1cbiAgICAvLyBwdWJsaWMgbWFwPE91dHB1dEl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55Pihpbm5lclNjcmlwdDogUmFkb25PcGVyYXRvcjxPdXRwdXRJdGVtc1R5cGU+KSB7XG4gICAgLy8gICAgIC8vIHRvZG86IGNoZWNrIHNjcmlwdCdzIGlucHV0IHR5cGUgbWF0Y2hlcyBhcnJheSdzIGl0ZW1zIHR5cGUsIGlmIGFueSA/P1xuICAgIC8vICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8T3V0cHV0SXRlbXNUeXBlPiwgW2lubmVyU2NyaXB0XSlcbiAgICAvLyB9XG4gICAgLyoqXG4gICAgICogUmVkdWNlIGFsbCBpdGVtcyBpbiB0aGUgYXJyYXkgaW50byBhIHNpbmdsZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gcmVkdWN0b3IgVGhlIHJlZHVjdG9yIG1ldGhvZCB0byBiZSBhcHBsaWVkLiBBbGwgYXJyYXkgaXRlbXMgbXVzdCBiZSBcbiAgICAgKiBjb252ZXJ0YWJsZSBpbnRvIGZsb2F0IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHJlZHVjZShyZWR1Y3RvcjogUmFkb25SZWR1Y2VyT3Bjb2Rlcykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtyZWR1Y3Rvcl0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9yZGVyIHRoZSBhcnJheSBpdGVtcyBiYXNlZCBlaXRoZXIgb24gdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gZXZlcnkgaXRlbSwgb3Igb24gdGhlIFxuICAgICAqIGFjdHVhbCBpdGVtIHZhbHVlcyAoYXMgbG9uZyBhcyB0aGVzZSBhcmUgZWl0aGVyIGludGVnZXJzIG9yIHN0cmluZ3MpLlxuICAgICAqIEZhaWxzIGlmIGFwcGxpZWQgb24gbm9uLWhvbWVnZW5vdXMgYXJyYXlzIChpLmUuIG5vdCBhbGwgaXRlbXMgc2hhcmluZyB0aGUgc2FtZSBgUmFkb25BbnlgKS4gXG4gICAgICogQHBhcmFtIGlubmVyU2NyaXB0IChPcHRpb25hbCkgU29ydGluZyBzY3JpcHQgcmV0dXJuaW5nIGVpdGhlciBhIGBSYWRvbkludGVnZXJgIG9yIGEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0LlxuICAgICAqL1xuICAgIC8vIFRPRE9cbiAgICAvLyBwdWJsaWMgc29ydChpbm5lclNjcmlwdD86IFJhZG9uT3BlcmF0b3I8UmFkb25TdHJpbmcgfCBSYWRvbkludGVnZXI+KSB7XG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbaW5uZXJTY3JpcHRdKVxuICAgIC8vIH1cbiAgICAvKipcbiAgICAgKiBUYWtlIGEgc2VsZWN0aW9uIG9mIGl0ZW1zIGZyb20gdGhlIGlucHV0IGFycmF5LlxuICAgICAqIEBwYXJhbSBpbmRleGVzIEluZGV4ZXMgb2YgdGhlIGlucHV0IGl0ZW1zIHRvIHRha2UgaW50byB0aGUgb3V0cHV0IGFycmF5LiBcbiAgICAgKiBAcmV0dXJuIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGljayguLi5pbmRleGVzOiBudW1iZXJbXSkge1xuICAgICAgICBpZiAoQXJyYXkoaW5kZXhlcykubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYFxceDFiWzE7MzNtUmFkb25BcnJheTo6cGljazogYSBub24tZW1wdHkgYXJyYXkgb2YgbnVtYmVycyBtdXN0IGJlIHByb3ZpZGVkXFx4MWJbMG1gKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbLi4uaW5kZXhlc10pXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFkb25Cb29sZWFuIGV4dGVuZHMgUmFkb25Bbnkge1xuICAgIC8qKlxuICAgICAqIFJldmVyc2UgdmFsdWUuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIG5lZ2F0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYXN0IHZhbHVlIGludG8gYSBzdHJpbmcuIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHN0cmluZ2lmeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW10pXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFkb25CeXRlcyBleHRlbmRzIFJhZG9uQW55IHtcbiAgICBzdGF0aWMgcmVhZG9ubHkgRW5jb2RpbmdzID0gUmFkb25FbmNvZGluZ3M7XG4gICAgLyoqXG4gICAgICogQ29udmVydCBidWZmZXIgaW50byAoYmlnLWVuZGlhbikgaW50ZWdlci5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJ5dGVzYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGFzSW50ZWdlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHBseSB0aGUgU0hBMi0yNTYgaGFzaCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJ5dGVzYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGhhc2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW10pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvdW50IHRoZSBudW1iZXIgb2YgYnl0ZXMuIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHNsaWNlIGV4dHJhY3RlZCBmcm9tIHRoZSBpbnB1dCBidWZmZXIuIFxuICAgICAqIEEgYHN0YXJ0SW5kZXhgIG9mIDAgcmVmZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGJ1ZmZlci4gSWYgbm8gYGVuZEluZGV4YCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBhc3N1bWVkIFxuICAgICAqIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlci4gTmVnYXRpdmUgdmFsdWVzIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgYnVmZmVyLlxuICAgICAqIEBwYXJhbSBzdGFydEluZGV4IFBvc2l0aW9uIHdpdGhpbiBpbnB1dCBidWZmZXIgd2hlcmUgdGhlIG91dHB1dCBidWZmZXIgd2lsbCBzdGFydC5cbiAgICAgKiBAcGFyYW0gZW5kSW5kZXggUG9zaXRpb24gd2l0aGluIGlucHV0IGJ1ZmZlciB3aGVyZSB0aGUgb3V0cHV0IGJ1ZmZlciB3aWxsIGVuZFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2xpY2Uoc3RhcnRJbmRleDogbnVtYmVyID0gMCwgZW5kSW5kZXg/OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJ5dGVzLCBbc3RhcnRJbmRleCwgZW5kSW5kZXhdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRoZSBpbnB1dCBidWZmZXIgaW50byBhIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgRW51bSBpbnRlZ2VyIHZhbHVlIHNwZWNpZnlpbmcgdGhlIGVuY29kaW5nIHNjaGVtYSBvbiB0aGUgb3V0cHV0IHN0cmluZywgc3RhbmRpbmc6XG4gICAgICogICAwIC0+IEhleCBzdHJpbmcgKGRlZmF1bHQsIGlmIG5vbmUgd2FzIHNwZWNpZmllZClcbiAgICAgKiAgIDEgLT4gQmFzZTY0IHN0cmluZ1xuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHN0cmluZ2lmeShlbmNvZGluZyA9IFJhZG9uRW5jb2RpbmdzLkhleFN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbZW5jb2RpbmddKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhZG9uRmxvYXQgZXh0ZW5kcyBSYWRvbkFueSB7XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgYWJzb2x1dGUgdmFsdWUuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnNvbHV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgbG93ZXN0IGludGVnZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBmbG9hdCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC4gXG4gICAgICovXG4gICAgcHVibGljIGNlaWxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW10pXG5cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgZ3JlYXRlc3QgaW50ZWdlciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGZsb2F0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBmbG9vcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGZsb2F0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC4gXG4gICAgICogQHBhcmFtIGlucHV0XG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdyZWF0ZXJUaGFuKGlucHV0OiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbnB1dF0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiB0aGUgZmxvYXQgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBgaW5wdXRgLlxuICAgICAqIEBwYXJhbSBpbnB1dCBcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJvb2xlYW5gIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgbGVzc1RoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW2lucHV0XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgZmxvYXQgcmVtYWluZGVyIG9mIGRpdmlkaW5nIHRoZSB2YWx1ZSBieSB0aGUgZ2l2ZW4gYGludGVnZXJgLlxuICAgICAqIEBwYXJhbSBpbnRlZ2VyIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgbW9kdWxvKGludGVnZXI6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtpbnRlZ2VyXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdGhlIGZsb2F0IHZhbHVlIGJ5IHRoZSBnaXZlbiBgZmFjdG9yYC5cbiAgICAgKiBAcGFyYW0gZmFjdG9yIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC4gXG4gICAgICovXG4gICAgcHVibGljIG11bHRpcGx5KGZhY3RvcjogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2ZhY3Rvcl0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5lZ2F0ZSB0aGUgZmxvYXQgdmFsdWUuIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmVnYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIHRoZSBmbG9hdCB2YWx1ZSByYWlzZWQgdG8gdGhlIHBvd2VyIG9mIGdpdmVuIGBleHBvbmVudGBcbiAgICAgKiBAcGFyYW0gZXhwb25lbnRcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHBvd2VyKGV4cG9uZW50OiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbZXhwb25lbnRdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb3VuZCB0byB0aGUgY2xvc2VzdCBpbnRlZ2VyIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyByb3VuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdHJpbmdpZnkgdGhlIGZsb2F0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHN0cmluZ2lmeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW10pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRha2UgdGhlIGludGVnZXIgcGFydCBvZiB0aGUgZmxvYXQgdmFsdWUuIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyB0cnVuY2F0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhZG9uSW50ZWdlciBleHRlbmRzIFJhZG9uQW55IHtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlIHRoZSBhYnNvbHV0ZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzb2x1dGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBpbnRlZ2VyIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC4gXG4gICAgICogQHBhcmFtIGlucHV0XG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdyZWF0ZXJUaGFuKGlucHV0OiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbnB1dF0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiB0aGUgaW50ZWdlciB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIGBpbnB1dGAuIFxuICAgICAqIEBwYXJhbSBpbnB1dFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBsZXNzVGhhbihpbnB1dDogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5wdXRdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcgdGhlIHZhbHVlIGJ5IHRoZSBnaXZlbiBgaW50ZWdlcmAuXG4gICAgICogQHBhcmFtIGludGVnZXIgXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBtb2R1bG8oaW50ZWdlcjogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbaW50ZWdlcl0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHRoZSB2YWx1ZSBieSB0aGUgZ2l2ZW4gYGludGVnZXJgLlxuICAgICAqIEBwYXJhbSBpbnRlZ2VyIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LiBcbiAgICAgKi9cbiAgICBwdWJsaWMgbXVsdGlwbHkoaW50ZWdlcjogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbaW50ZWdlcl0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5lZ2F0ZSB0aGUgaW50ZWdlciB2YWx1ZS4gXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBuZWdhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgdmFsdWUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiBnaXZlbiBgZXhwb25lbnRgXG4gICAgICogQHBhcmFtIGV4cG9uZW50XG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHBvd2VyKGV4cG9uZW50OiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtleHBvbmVudF0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0cmluZ2lmeSB0aGUgdmFsdWUuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RyaW5naWZ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FzdCBpbnRvIGEgYmlnLWVuZGlhbiBieXRlcyBidWZmZXIuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25CeXRlc2Agb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyB0b0J5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYXN0IGludG8gYSBmbG9hdCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHRvRmxvYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW10pXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFkb25NYXAgZXh0ZW5kcyBSYWRvbkFueSB7XG4gICAgLyoqXG4gICAgICogQWx0ZXIgdGhlIHZhbHVlIG9mIHRoZSBpdGVtKHMpIGlkZW50aWZpZWQgYnkgYGtleXNgLCBhcHBseWluZyB0aGUgZ2l2ZW4gYGlubmVyU2NyaXB0YCB0byBlYWNoIG9uZSBvZiB0aGVtLlxuICAgICAqIEBwYXJhbSBrZXkgXG4gICAgICogQHBhcmFtIGlubmVyU2NyaXB0IFxuICAgICAqIEByZXR1cm5zIFRoZSBzYW1lIFJhZG9uTWFwIHVwb24gd2hpY2ggdGhpcyBvcGVyYXRvciBpcyBleGVjdXRlZCwgd2l0aCB0aGUgc3BlY2lmaWVkIGl0ZW0ocykgYWx0ZXJlZFxuICAgICAqIGJ5IHRoZSBnaXZlbiBgaW5uZXJTY3JpcHRgLlxuICAgICAqL1xuICAgIC8vIFRPRE9cbiAgICAvLyBwdWJsaWMgYWx0ZXI8QWx0ZXJlZE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueT4oaW5uZXJTY3JpcHQ6IFJhZG9uT3BlcmF0b3I8QWx0ZXJlZE91dHB1dFR5cGU+LCAuLi5rZXlzOiBzdHJpbmdbXSkge1xuICAgIC8vICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBbaW5uZXJTY3JpcHQsIC4uLmtleXNdKVxuICAgIC8vIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaCB0aGUgYXJyYXkgd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuXG4gICAgICogQHBhcmFtIGtleSBcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdldEFycmF5PEl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25Bbnk+KGtleTogc3RyaW5nLCBfaXRlbXNUeXBlPzogeyBuZXcoKTogSXRlbXNUeXBlOyB9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBba2V5XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggdGhlIGJvb2xlYW4gd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuIFxuICAgICAqIEBwYXJhbSBrZXkgXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuIFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCb29sZWFuKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBba2V5XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggdGhlIGZsb2F0IHZhbHVlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLlxuICAgICAqIEBwYXJhbSBrZXkgXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGbG9hdChrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtrZXldKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaCB0aGUgaW50ZWdlciB2YWx1ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC4gXG4gICAgICogQHBhcmFtIGtleSBcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SW50ZWdlcihrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2tleV0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoIHRoZSBtYXAgb2JqZWN0IHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLiBcbiAgICAgKiBAcGFyYW0ga2V5IFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uTWFwYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdldE1hcChrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBba2V5XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggdGhlIHN0cmluZyB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC5cbiAgICAgKiBAcGFyYW0ga2V5IFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdldFN0cmluZyhrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBba2V5XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXh0cmFjdCBrZXkgbmFtZXMgb2YgdGhlIG1hcCBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBrZXlzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8UmFkb25TdHJpbmc+LCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGFrZSBhIHNlbGVjdGlvbiBvZiBpdGVtcyBmcm9tIHRoZSBpbnB1dCBtYXAuIEZhaWxzIGlmIHVuZXhpc3RlbnQgaXRlbXMgYXJlIHJlZmVycmVkLlxuICAgICAqIEBwYXJhbSBrZXlzIEtleSBzdHJpbmcgb2YgdGhlIGlucHV0IGl0ZW1zIHRvIHRha2UgaW50byB0aGUgb3V0cHV0IG1hcC4gXG4gICAgICogQHJldHVybiBBIGBSYWRvbk1hcGAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBwaWNrKC4uLmtleXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmIChBcnJheShrZXlzKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEV2YWxFcnJvcihgXFx4MWJbMTszM21SYWRvbk1hcDo6cGljazogYSBub24tZW1wdHkgYXJyYXkgb2Yga2V5IHN0cmluZ3MgbXVzdCBiZSBwcm92aWRlZFxceDFiWzBtYClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBbLi4ua2V5c10pXG5cbiAgICB9XG4gICAgLyoqXG4gICAgICogRXh0cmFjdCB0aGUgbWFwIHZhbHVlcyBpbnRvIGFuIGFycmF5LlxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXksIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdHJpbmdpZnkgaW5wdXQgYFJhZG9uTWFwYCBvYmplY3QgaW50byBhIEpTT04gc3RyaW5nLlxuICAgICAqIEByZXR1cm4gQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RyaW5naWZ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYWRvblN0cmluZyBleHRlbmRzIFJhZG9uQW55IHtcbiAgICAvKipcbiAgICAgKiBDYXN0IGludG8gYSBib29sZWFuIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhc0Jvb2xlYW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCB0aGUgaW5wdXQgc3RyaW5nIGludG8gYSBieXRlcyBidWZmZXIuXG4gICAgICogQHBhcmFtIGVuY29kaW5nIEVudW0gaW50ZWdlciB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZyBzY2hlbWEgb24gdGhlIGlucHV0IHN0cmluZywgc3RhbmRpbmc6XG4gICAgICogICAwIC0+IEhleCBzdHJpbmcgKGRlZmF1bHQsIGlmIG5vbmUgd2FzIHNwZWNpZmllZClcbiAgICAgKiAgIDEgLT4gQmFzZTY0IHN0cmluZ1xuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXNCeXRlcyhlbmNvZGluZyA9IFJhZG9uRW5jb2RpbmdzLkhleFN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtlbmNvZGluZ10pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhc3QgaW50byBhIGZsb2F0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGFzRmxvYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW10pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hhcnMuIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVwbGFjZSB0aGUgc3RyaW5nIGJ5IGEgdmFsdWUgb2YgdHlwZSBgb3V0cHV0VHlwZWAsIGRldGVybWluZWQgb24gd2hldGhlciB0aGUgc3RyaW5nIHZhbHVlIG1hdGNoZXMgXG4gICAgICogYW55IG9mIHRoZSBrZXlzIHdpdGhpbiB0aGUgcHJvdmlkZWQgYG1hdGNoaW5nTWFwYCwgb3Igc2V0IHRvIGEgYGRlZmF1bHRWYWx1ZWAgaWYgbm8gbWF0Y2ggaXMgZm91bmQuXG4gICAgICogQHBhcmFtIG91dHB1dFR5cGUgUmFkb24gdHlwZSBvZiB0aGUgb3V0cHV0IHZhbHVlLiBcbiAgICAgKiBAcGFyYW0gbWF0Y2hpbmdNYXAgTWFwIGRldGVybWluaW5nIHRoZSBvdXRwdXQgdmFsdWUgZGVwZW5kaW5nIG9uIHRoZSBzdHJpbmcgdmFsdWUuXG4gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBWYWx1ZSByZXR1cm5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZC4gXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIG1hdGNoPE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uU3RyaW5nPihcbiAgICAgICAgb3V0cHV0VHlwZTogeyBuZXcocHJldj86IFJhZG9uT3BlcmF0b3IpOiBPdXRwdXRUeXBlOyB9LCBcbiAgICAgICAgbWF0Y2hpbmdNYXA6IE1hcDxzdHJpbmcsIGFueT4sIFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGFueVxuICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKG91dHB1dFR5cGUsIFttYXRjaGluZ01hcCwgZGVmYXVsdFZhbHVlXSlcbiAgICAgICAgLy8gdGhpcy5fYnl0ZWNvZGUgPSBbIFxuICAgICAgICAvLyAgICAgMHg3NSwgIFxuICAgICAgICAvLyAgICAgbWF0Y2hpbmdNYXAsXG4gICAgICAgIC8vICAgICBkZWZhdWx0VmFsdWVcbiAgICAgICAgLy8gXVxuICAgICAgICAvLyB0aGlzLl9tZXRob2QgPSBcIm1hdGNoXCJcbiAgICAgICAgLy8gdGhpcy5fcGFyYW1zID0gYHsgJHtPYmplY3QuZW50cmllcyhtYXRjaGluZ01hcCkubWFwKChlbnRyeTogW3N0cmluZywgYW55XSkgPT4gYFxcXCIke2VudHJ5WzBdfVxcXCI6ICR7ZW50cnlbMV19LCBgKX19LCAke2RlZmF1bHRWYWx1ZX1gXG4gICAgICAgIC8vIGxldCBrZXlzOiBzdHJpbmcgPSBcIlwiXG4gICAgICAgIC8vIE9iamVjdC5rZXlzKG1hdGNoaW5nTWFwKS5tYXAoKGtleTogc3RyaW5nKSA9PiBrZXlzICs9IGtleSArIFwiO1wiKVxuICAgICAgICAvLyByZXR1cm4gbmV3IG91dHB1dFR5cGUodGhpcywga2V5cylcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2UgaW5wdXQgc3RyaW5nIGFzIGFuIGFycmF5IG9mIEpTT04gaXRlbXMuIFxuICAgICAqIEBwYXJhbSBqc29uUGF0aHMgKG9wdGlvbmFsKSBBcnJheSBvZiBKU09OIHBhdGhzIHdpdGhpbiBpbnB1dCBgUmFkb25TdHJpbmdgIGZyb20gd2hlcmUgdG8gZmV0Y2ggaXRlbXMgdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBvdXRwdXQgYFJhZG9uQXJyYXlgLiBcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHBhcnNlSlNPTkFycmF5KC4uLmpzb25QYXRoczogc3RyaW5nW10pOiBSYWRvbkFycmF5PFJhZG9uQW55PiB7IFxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8UmFkb25Bbnk+LCBbLi4uanNvblBhdGhzXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2Ugc3RyaW5nIGFzIGEgSlNPTi1lbmNvZGVkIG1hcC4gXG4gICAgICogQHBhcmFtIGpzb25QYXRoIChvcHRpb25hbCkgSlNPTiBwYXRoIHdpdGhpbiBpbnB1dCBgUmFkb25TdHJpbmdgIGZyb20gd2hlcmUgdG8gZXh0cmFjdCB0aGUgb3V0cHV0IGBSYWRvbk1hcGAuIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uTWFwYCBvYmplY3QuIFxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJzZUpTT05NYXAoanNvblBhdGg/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2pzb25QYXRoXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2Ugc3RyaW5nIGFzIGFuIFhNTC1lbmNvZGVkIG1hcC4gXG4gICAgICogQHJldHVybnMgQSBgUmFkb25NYXBgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyc2VYTUxNYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25NYXAsIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlIHdpdGggZ2l2ZW4gYHJlcGxhY2VtZW50YCBzdHJpbmcsIGFsbCBwYXJ0cyBvZiB0aGUgaW5wdXQgc3RyaW5nIHRoYXQgbWF0Y2ggd2l0aCBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uIFxuICAgICAqIEBwYXJhbSByZWdleCBSZWd1bGFyIGV4cHJlc3Npb24gdG8gYmUgbWF0Y2hlZC5cbiAgICAgKiBAcGFyYW0gcmVwbGFjZW1lbnQgVGV4dCB0aGF0IHdpbGwgcmVwbGFjZSBhbGwgb2NjdXJlbmNlcy4gXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVwbGFjZShyZWdleDogc3RyaW5nID0gXCJcIiwgcmVwbGFjZW1lbnQ6IHN0cmluZyA9IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW3JlZ2V4LCByZXBsYWNlbWVudF0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBzbGljZSBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLiBcbiAgICAgKiBBIGBzdGFydEluZGV4YCBvZiAwIHJlZmVycyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBzdHJpbmcuIElmIG5vIGBlbmRJbmRleGAgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgYXNzdW1lZCBcbiAgICAgKiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBzdHJpbmcuIE5lZ2F0aXZlIHZhbHVlcyB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmluZy5cbiAgICAgKiBAcGFyYW0gc3RhcnRJbmRleCBQb3NpdGlvbiB3aXRoaW4gaW5wdXQgc3RyaW5nIHdoZXJlIHRoZSBvdXRwdXQgc3RyaW5nIHdpbGwgc3RhcnQuXG4gICAgICogQHBhcmFtIGVuZEluZGV4IFBvc2l0aW9uIHdpdGhpbiBpbnB1dCBzdHJpbmcgd2hlcmUgdGhlIG91dHB1dCBzdHJpbmcgd2lsbCBlbmQuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2xpY2Uoc3RhcnRJbmRleDogbnVtYmVyID0gMCwgZW5kSW5kZXg/OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW3N0YXJ0SW5kZXgsIGVuZEluZGV4XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGl2aWRlcyBpbnB1dCBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdWJzdHJpbmdzLCBcbiAgICAgKiBAcGFyYW0gcmVnZXggVGhlIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb24gdG8gdXNlIGZvciBzcGxpdHRpbmcuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBzcGxpdChyZWdleDogc3RyaW5nID0gXCJcXHJcIikge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8UmFkb25TdHJpbmc+LCBbcmVnZXhdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb3dlciBjYXNlIGFsbCBjaGFyYWN0ZXJzLlxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHRvTG93ZXJjYXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBwZXIgY2FzZSBhbGwgY2hhcmFjdGVycy5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyB0b1VwcGVyQ2FzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW10pXG4gICAgfVxufVxuIl19