UNPKG

74.9 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4// tslint:disable strict-type-predicates
5const client_common_1 = require("@neo-one/client-common");
6const utils_1 = require("@neo-one/utils");
7const bignumber_js_1 = tslib_1.__importDefault(require("bignumber.js"));
8const lodash_1 = tslib_1.__importDefault(require("lodash"));
9const errors_1 = require("./errors");
10exports.assertString = (name, param) => {
11 if (param == undefined || typeof param !== 'string') {
12 throw new errors_1.InvalidArgumentError('string', name, param);
13 }
14 return param;
15};
16exports.assertBoolean = (name, value) => {
17 if (value == undefined || typeof value !== 'boolean') {
18 throw new errors_1.InvalidArgumentError('boolean', name, value);
19 }
20 return value;
21};
22exports.assertNullableBoolean = (name, value) => {
23 if (value == undefined) {
24 return undefined;
25 }
26 return exports.assertBoolean(name, value);
27};
28exports.assertNumber = (name, value) => {
29 if (value == undefined || typeof value !== 'number') {
30 throw new errors_1.InvalidArgumentError('number', name, value);
31 }
32 return value;
33};
34exports.assertAddress = (name, addressIn) => {
35 const address = exports.assertString(name, addressIn);
36 try {
37 client_common_1.addressToScriptHash(address);
38 return address;
39 }
40 catch (_a) {
41 try {
42 return client_common_1.scriptHashToAddress(address);
43 }
44 catch (_b) {
45 throw new errors_1.InvalidArgumentError('Address', name, address);
46 }
47 }
48};
49exports.assertHash256 = (name, hash) => {
50 const value = exports.assertString(name, hash);
51 try {
52 return client_common_1.common.uInt256ToString(client_common_1.common.stringToUInt256(value));
53 }
54 catch (_a) {
55 throw new errors_1.InvalidArgumentError('Hash256', name, value);
56 }
57};
58exports.assertBuffer = (name, buffer) => {
59 const value = exports.assertString(name, buffer);
60 if (Buffer.from(value, 'hex').toString('hex') !== value.toLowerCase()) {
61 throw new errors_1.InvalidArgumentError('Buffer', name, value);
62 }
63 return value;
64};
65exports.assertPublicKey = (name, publicKey) => {
66 const value = exports.assertBuffer(name, publicKey);
67 try {
68 return client_common_1.common.ecPointToString(client_common_1.common.stringToECPoint(value));
69 }
70 catch (_a) {
71 throw new errors_1.InvalidArgumentError('PublicKey', name, value);
72 }
73};
74exports.assertBigNumber = (name, value) => {
75 if (value == undefined || !bignumber_js_1.default.isBigNumber(value)) {
76 throw new errors_1.InvalidArgumentError('BigNumber', name, value);
77 }
78 return value;
79};
80exports.assertNullableBigNumber = (name, value) => {
81 if (value == undefined) {
82 return undefined;
83 }
84 return exports.assertBigNumber(name, value);
85};
86exports.assertArray = (name, value) => {
87 if (!Array.isArray(value)) {
88 throw new errors_1.InvalidArgumentError('Array', name, value);
89 }
90 return value;
91};
92exports.assertNullableArray = (name, value) => {
93 if (value == undefined) {
94 return [];
95 }
96 return exports.assertArray(name, value);
97};
98exports.assertMap = (name, value) => {
99 if (!(value instanceof Map)) {
100 throw new errors_1.InvalidArgumentError('Map', name, value);
101 }
102 return value;
103};
104exports.assertObject = (name, value) => {
105 if (!exports.isObject(value)) {
106 throw new errors_1.InvalidArgumentError('Object', name, value);
107 }
108 return value;
109};
110exports.assertNullableMap = (name, value) => {
111 if (value == undefined) {
112 return new Map();
113 }
114 return exports.assertMap(name, value);
115};
116exports.isObject = (value) => value != undefined && typeof value === 'object';
117exports.assertProperty = (value, objectName, name, assertType) => {
118 // tslint:disable-next-line no-any
119 const valueAny = value;
120 return assertType(`${objectName}.${name}`, valueAny[name]);
121};
122exports.assertUserAccountID = (name, value) => {
123 if (!exports.isObject(value)) {
124 throw new errors_1.InvalidArgumentError('UserAccountID', name, value);
125 }
126 return {
127 network: exports.assertProperty(value, 'UserAccountID', 'network', exports.assertString),
128 address: exports.assertProperty(value, 'UserAccountID', 'address', exports.assertAddress),
129 };
130};
131exports.assertNullableUserAccountID = (name, value) => {
132 if (value == undefined) {
133 return undefined;
134 }
135 return exports.assertUserAccountID(name, value);
136};
137exports.assertUpdateAccountNameOptions = (name, value) => {
138 if (!exports.isObject(value)) {
139 throw new errors_1.InvalidArgumentError('UpdateAccountNameOptions', name, value);
140 }
141 return {
142 id: exports.assertProperty(value, 'UpdateAccountNameOptions', 'id', exports.assertUserAccountID),
143 name: exports.assertProperty(value, 'UpdateAccountNameOptions', 'name', exports.assertString),
144 };
145};
146const ABI_TYPES = new Set([
147 'Signature',
148 'Boolean',
149 'Address',
150 'Hash256',
151 'Buffer',
152 'PublicKey',
153 'String',
154 'Array',
155 'Map',
156 'Object',
157 'Void',
158 'Integer',
159 'ForwardValue',
160]);
161const assertABIType = (name, valueIn) => {
162 const value = exports.assertString(name, valueIn);
163 if (!ABI_TYPES.has(value)) {
164 throw new errors_1.InvalidArgumentError('ABIType', name, value);
165 }
166 return value;
167};
168const assertABIProperties = (name, value) => {
169 if (!exports.isObject(value)) {
170 throw new errors_1.InvalidArgumentError('ABIReturn', name, value);
171 }
172 return lodash_1.default.fromPairs(Object.entries(value).map(([k, v]) => [exports.assertString(name, k), assertABIReturn(name, v)]));
173};
174const assertABIReturn = (name, value) => {
175 if (!exports.isObject(value)) {
176 throw new errors_1.InvalidArgumentError('ABIReturn', name, value);
177 }
178 const type = exports.assertProperty(value, 'ABIReturn', 'type', assertABIType);
179 const optional = exports.assertProperty(value, 'ABIReturn', 'optional', exports.assertNullableBoolean);
180 const forwardedValue = exports.assertProperty(value, 'ABIReturn', 'forwardedValue', exports.assertNullableBoolean);
181 switch (type) {
182 case 'Signature':
183 return { type, optional, forwardedValue };
184 case 'Boolean':
185 return { type, optional, forwardedValue };
186 case 'Address':
187 return { type, optional, forwardedValue };
188 case 'Hash256':
189 return { type, optional, forwardedValue };
190 case 'Buffer':
191 return { type, optional, forwardedValue };
192 case 'PublicKey':
193 return { type, optional, forwardedValue };
194 case 'String':
195 return { type, optional, forwardedValue };
196 case 'Array':
197 return { type, value: exports.assertProperty(value, 'ABIReturn', 'value', assertABIReturn), optional, forwardedValue };
198 case 'Map':
199 return {
200 type,
201 key: exports.assertProperty(value, 'ABIReturn', 'key', assertABIReturn),
202 value: exports.assertProperty(value, 'ABIReturn', 'value', assertABIReturn),
203 optional,
204 forwardedValue,
205 };
206 case 'Object':
207 return {
208 type,
209 properties: exports.assertProperty(value, 'ABIReturn', 'properties', assertABIProperties),
210 optional,
211 forwardedValue,
212 };
213 case 'Void':
214 return { type, optional, forwardedValue };
215 case 'Integer':
216 return { type, decimals: exports.assertProperty(value, 'ABIReturn', 'decimals', exports.assertNumber), optional, forwardedValue };
217 case 'ForwardValue':
218 return { type, optional, forwardedValue };
219 default:
220 /* istanbul ignore next */
221 utils_1.utils.assertNever(type);
222 /* istanbul ignore next */
223 throw new Error('For TS');
224 }
225};
226const assertABIDefaultType = (name, valueIn) => {
227 const value = exports.assertString(name, valueIn);
228 switch (value) {
229 case 'sender':
230 return 'sender';
231 default:
232 throw new errors_1.InvalidArgumentError('ABIDefaultType', name, value);
233 }
234};
235const assertNullableABIDefault = (name, value) => {
236 if (value == undefined) {
237 return undefined;
238 }
239 if (!exports.isObject(value)) {
240 throw new errors_1.InvalidArgumentError('ABIDefault', name, value);
241 }
242 const type = exports.assertProperty(value, 'ABIDefault', 'type', assertABIDefaultType);
243 switch (type) {
244 case 'sender':
245 return { type: 'sender' };
246 default:
247 throw new errors_1.InvalidArgumentError('ABIDefaultType', name, value);
248 }
249};
250const assertABIParameter = (propName, value) => {
251 if (!exports.isObject(value)) {
252 throw new errors_1.InvalidArgumentError('ABIParameter', propName, value);
253 }
254 const type = exports.assertProperty(value, 'ABIParameter', 'type', assertABIType);
255 const name = exports.assertProperty(value, 'ABIParameter', 'name', exports.assertString);
256 const optional = exports.assertProperty(value, 'ABIParameter', 'optional', exports.assertNullableBoolean);
257 const rest = exports.assertProperty(value, 'ABIParameter', 'rest', exports.assertNullableBoolean);
258 const defaultValue = exports.assertProperty(value, 'ABIParameter', 'default', assertNullableABIDefault);
259 const forwardedValue = exports.assertProperty(value, 'ABIParameter', 'forwardedValue', exports.assertNullableBoolean);
260 switch (type) {
261 case 'Signature':
262 return { type, name, optional, default: defaultValue, forwardedValue, rest };
263 case 'Boolean':
264 return { type, name, optional, default: defaultValue, forwardedValue, rest };
265 case 'Address':
266 return { type, name, optional, default: defaultValue, forwardedValue, rest };
267 case 'Hash256':
268 return { type, name, optional, default: defaultValue, forwardedValue, rest };
269 case 'Buffer':
270 return { type, name, optional, default: defaultValue, forwardedValue, rest };
271 case 'PublicKey':
272 return { type, name, optional, default: defaultValue, forwardedValue, rest };
273 case 'String':
274 return { type, name, optional, default: defaultValue, forwardedValue, rest };
275 case 'Array':
276 return {
277 type,
278 name,
279 optional,
280 default: defaultValue,
281 value: exports.assertProperty(value, 'ABIParameter', 'value', assertABIReturn),
282 forwardedValue,
283 rest,
284 };
285 case 'Map':
286 return {
287 type,
288 name,
289 optional,
290 default: defaultValue,
291 key: exports.assertProperty(value, 'ABIParameter', 'key', assertABIReturn),
292 value: exports.assertProperty(value, 'ABIParameter', 'value', assertABIReturn),
293 forwardedValue,
294 rest,
295 };
296 case 'Object':
297 return {
298 type,
299 name,
300 optional,
301 default: defaultValue,
302 properties: exports.assertProperty(value, 'ABIParameter', 'properties', assertABIProperties),
303 forwardedValue,
304 rest,
305 };
306 case 'Void':
307 return { type, name, optional, default: defaultValue, forwardedValue, rest };
308 case 'Integer':
309 return {
310 type,
311 name,
312 optional,
313 default: defaultValue,
314 decimals: exports.assertProperty(value, 'ABIParameter', 'decimals', exports.assertNumber),
315 forwardedValue,
316 };
317 case 'ForwardValue':
318 return { type, name, optional, default: defaultValue, forwardedValue, rest };
319 default:
320 /* istanbul ignore next */
321 utils_1.utils.assertNever(type);
322 /* istanbul ignore next */
323 throw new Error('For TS');
324 }
325};
326const assertABIFunction = (name, value) => {
327 if (!exports.isObject(value)) {
328 throw new errors_1.InvalidArgumentError('ABIFunction', name, value);
329 }
330 return {
331 name: exports.assertProperty(value, 'ABIFunction', 'name', exports.assertString),
332 parameters: exports.assertProperty(value, 'ABIFunction', 'parameters', exports.assertNullableArray).map((parameter) => assertABIParameter('ABIFunction.parameters', parameter)),
333 returnType: exports.assertProperty(value, 'ABIFunction', 'returnType', assertABIReturn),
334 constant: exports.assertProperty(value, 'ABIFunction', 'constant', exports.assertNullableBoolean),
335 send: exports.assertProperty(value, 'ABIFunction', 'send', exports.assertNullableBoolean),
336 sendUnsafe: exports.assertProperty(value, 'ABIFunction', 'sendUnsafe', exports.assertNullableBoolean),
337 receive: exports.assertProperty(value, 'ABIFunction', 'receive', exports.assertNullableBoolean),
338 claim: exports.assertProperty(value, 'ABIFunction', 'claim', exports.assertNullableBoolean),
339 refundAssets: exports.assertProperty(value, 'ABIFunction', 'refundAssets', exports.assertNullableBoolean),
340 completeSend: exports.assertProperty(value, 'ABIFunction', 'completeSend', exports.assertNullableBoolean),
341 };
342};
343const assertABIEvent = (name, value) => {
344 if (!exports.isObject(value)) {
345 throw new errors_1.InvalidArgumentError('ABIEvent', name, value);
346 }
347 return {
348 name: exports.assertProperty(value, 'ABIEvent', 'name', exports.assertString),
349 parameters: exports.assertProperty(value, 'ABIEvent', 'parameters', exports.assertNullableArray).map((parameter) => assertABIParameter('ABIEvent.parameters', parameter)),
350 };
351};
352exports.assertABI = (name, value) => {
353 if (!exports.isObject(value)) {
354 throw new errors_1.InvalidArgumentError('ABI', name, value);
355 }
356 return {
357 functions: exports.assertProperty(value, 'ABI', 'functions', exports.assertNullableArray).map((func) => assertABIFunction('ABI.functions', func)),
358 events: exports.assertProperty(value, 'ABI', 'events', exports.assertNullableArray).map((func) => assertABIEvent('ABI.events', func)),
359 };
360};
361const assertSmartContractNetworkDefinition = (name, value) => {
362 if (!exports.isObject(value)) {
363 throw new errors_1.InvalidArgumentError('SmartContractNetworkDefinition', name, value);
364 }
365 return {
366 address: exports.assertProperty(value, 'SmartContractNetworkDefinition', 'address', exports.assertAddress),
367 };
368};
369const assertSmartContractNetworksDefinition = (name, value) => {
370 if (!exports.isObject(value)) {
371 throw new errors_1.InvalidArgumentError('SmartContractNetworksDefinition', name, value);
372 }
373 return lodash_1.default.mapValues(value, (val) => assertSmartContractNetworkDefinition('SmartContractNetworksDefinition', val));
374};
375// tslint:disable-next-line no-any
376const isPromise = (value) =>
377// tslint:disable-next-line no-any
378typeof value === 'object' && value.then !== undefined;
379exports.assertSourceMaps = (name, value) => {
380 if (value == undefined) {
381 return undefined;
382 }
383 if (!isPromise(value)) {
384 throw new errors_1.InvalidArgumentError('SourceMaps', name, value);
385 }
386 return value;
387};
388exports.assertSmartContractDefinition = (name, value) => {
389 if (!exports.isObject(value)) {
390 throw new errors_1.InvalidArgumentError('SmartContractDefinition', name, value);
391 }
392 return {
393 networks: exports.assertProperty(value, 'SmartContractDefinition', 'networks', assertSmartContractNetworksDefinition),
394 abi: exports.assertProperty(value, 'SmartContractDefinition', 'abi', exports.assertABI),
395 sourceMaps: exports.assertProperty(value, 'SmartContractDefinition', 'sourceMaps', exports.assertSourceMaps),
396 };
397};
398const assertScriptBuilderParam = (name, value) => {
399 if (value == undefined) {
400 throw new errors_1.InvalidArgumentError('ScriptBuilderParam', name, value);
401 }
402 // tslint:disable-next-line no-any
403 return value;
404};
405const assertNullableScriptBuilderParam = (name, value) => {
406 if (value == undefined) {
407 return undefined;
408 }
409 return assertScriptBuilderParam(name, value);
410};
411const assertParam = (name, value) => {
412 if (value == undefined) {
413 throw new errors_1.InvalidArgumentError('Param', name, value);
414 }
415 // tslint:disable-next-line no-any
416 return value;
417};
418const assertNullableParam = (name, value) => {
419 if (value == undefined) {
420 return undefined;
421 }
422 return assertParam(name, value);
423};
424exports.assertForwardValue = (name, value) => {
425 if (!exports.isObject(value)) {
426 throw new errors_1.InvalidArgumentError('ForwardValue', name, value);
427 }
428 return {
429 name: exports.assertProperty(value, 'ForwardValue', 'name', exports.assertString),
430 converted: exports.assertProperty(value, 'ForwardValue', 'converted', assertNullableScriptBuilderParam),
431 param: exports.assertProperty(value, 'ForwardValue', 'param', assertNullableParam),
432 };
433};
434exports.assertTransfer = (name, value) => {
435 if (!exports.isObject(value)) {
436 throw new errors_1.InvalidArgumentError('Transfer', name, value);
437 }
438 return {
439 amount: exports.assertProperty(value, 'Transfer', 'amount', exports.assertBigNumber),
440 asset: exports.assertProperty(value, 'Transfer', 'asset', exports.assertHash256),
441 to: exports.assertProperty(value, 'Transfer', 'to', exports.assertAddress),
442 };
443};
444exports.assertPrivateKey = (name, valueIn) => {
445 const value = exports.assertString(name, valueIn);
446 try {
447 client_common_1.privateKeyToPublicKey(value);
448 return value;
449 }
450 catch (_a) {
451 try {
452 return client_common_1.wifToPrivateKey(value);
453 }
454 catch (_b) {
455 throw new errors_1.InvalidArgumentError('PrivateKey', name, value);
456 }
457 }
458};
459exports.assertTransfers = (name, valueIn) => {
460 const value = exports.assertArray(name, valueIn);
461 return value.map((val) => exports.assertTransfer(name, val));
462};
463const assertAttributeUsage = (name, valueIn) => {
464 const value = exports.assertString(name, valueIn);
465 try {
466 return client_common_1.assertAttributeUsageJSON(value);
467 }
468 catch (_a) {
469 throw new errors_1.InvalidArgumentError('AttributeUsage', name, value);
470 }
471};
472exports.assertAttribute = (name, attribute) => {
473 if (!exports.isObject(attribute)) {
474 throw new errors_1.InvalidArgumentError('Attribute', name, attribute);
475 }
476 const usage = exports.assertProperty(attribute, 'Attribute', 'usage', assertAttributeUsage);
477 switch (usage) {
478 case 'ContractHash':
479 case 'Vote':
480 case 'Hash1':
481 case 'Hash2':
482 case 'Hash3':
483 case 'Hash4':
484 case 'Hash5':
485 case 'Hash6':
486 case 'Hash7':
487 case 'Hash8':
488 case 'Hash9':
489 case 'Hash10':
490 case 'Hash11':
491 case 'Hash12':
492 case 'Hash13':
493 case 'Hash14':
494 case 'Hash15':
495 return {
496 usage,
497 data: exports.assertProperty(attribute, 'Attribute', 'data', exports.assertHash256),
498 };
499 case 'Script':
500 return {
501 usage,
502 data: exports.assertProperty(attribute, 'Attribute', 'data', exports.assertAddress),
503 };
504 case 'ECDH02':
505 case 'ECDH03':
506 return {
507 usage,
508 data: exports.assertProperty(attribute, 'Attribute', 'data', exports.assertPublicKey),
509 };
510 case 'DescriptionUrl':
511 case 'Description':
512 case 'Remark':
513 case 'Remark1':
514 case 'Remark2':
515 case 'Remark3':
516 case 'Remark4':
517 case 'Remark5':
518 case 'Remark6':
519 case 'Remark7':
520 case 'Remark8':
521 case 'Remark9':
522 case 'Remark10':
523 case 'Remark11':
524 case 'Remark12':
525 case 'Remark13':
526 case 'Remark14':
527 case 'Remark15':
528 return {
529 usage,
530 data: exports.assertProperty(attribute, 'Attribute', 'data', exports.assertBuffer),
531 };
532 default:
533 /* istanbul ignore next */
534 utils_1.utils.assertNever(usage);
535 /* istanbul ignore next */
536 throw new Error('For TS');
537 }
538};
539exports.assertTransactionOptions = (name, options) => {
540 if (options == undefined) {
541 return {};
542 }
543 if (!exports.isObject(options)) {
544 throw new errors_1.InvalidArgumentError('TransactionOptions', name, options);
545 }
546 return {
547 from: exports.assertProperty(options, 'TransactionOptions', 'from', exports.assertNullableUserAccountID),
548 attributes: exports.assertProperty(options, 'TransactionOptions', 'attributes', exports.assertNullableArray).map((value) => exports.assertAttribute('TransactionOption.attributes', value)),
549 networkFee: exports.assertProperty(options, 'TransactionOptions', 'networkFee', exports.assertNullableBigNumber),
550 systemFee: exports.assertProperty(options, 'TransactionOptions', 'systemFee', exports.assertNullableBigNumber),
551 // tslint:disable-next-line no-any
552 monitor: options.monitor,
553 };
554};
555
556//# sourceMappingURL=data:application/json;charset=utf8;base64,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VUFBVSxFQUFFLHNCQUFjLENBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSwyQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3pHLHVCQUFlLENBQUMsOEJBQThCLEVBQUUsS0FBSyxDQUFDLENBQ3ZEO1FBQ0QsVUFBVSxFQUFFLHNCQUFjLENBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSwrQkFBdUIsQ0FBQztRQUNoRyxTQUFTLEVBQUUsc0JBQWMsQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLCtCQUF1QixDQUFDO1FBQzlGLGtDQUFrQztRQUNsQyxPQUFPLEVBQUcsT0FBZSxDQUFDLE9BQU87S0FDbEMsQ0FBQztBQUNKLENBQUMsQ0FBQyIsImZpbGUiOiJuZW8tb25lLWNsaWVudC1jb3JlL3NyYy9hcmdzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGUgc3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuaW1wb3J0IHtcbiAgQUJJLFxuICBBQklEZWZhdWx0LFxuICBBQklEZWZhdWx0VHlwZSxcbiAgQUJJRXZlbnQsXG4gIEFCSUZ1bmN0aW9uLFxuICBBQklQYXJhbWV0ZXIsXG4gIEFCSVJldHVybixcbiAgQWRkcmVzc1N0cmluZyxcbiAgYWRkcmVzc1RvU2NyaXB0SGFzaCxcbiAgYXNzZXJ0QXR0cmlidXRlVXNhZ2VKU09OLFxuICBBdHRyaWJ1dGUsXG4gIEF0dHJpYnV0ZVVzYWdlLFxuICBCdWZmZXJTdHJpbmcsXG4gIGNvbW1vbixcbiAgRm9yd2FyZFZhbHVlLFxuICBIYXNoMjU2U3RyaW5nLFxuICBQYXJhbSxcbiAgUHJpdmF0ZUtleVN0cmluZyxcbiAgcHJpdmF0ZUtleVRvUHVibGljS2V5LFxuICBQdWJsaWNLZXlTdHJpbmcsXG4gIFNjcmlwdEJ1aWxkZXJQYXJhbSxcbiAgc2NyaXB0SGFzaFRvQWRkcmVzcyxcbiAgU21hcnRDb250cmFjdERlZmluaXRpb24sXG4gIFNtYXJ0Q29udHJhY3ROZXR3b3JrRGVmaW5pdGlvbixcbiAgU21hcnRDb250cmFjdE5ldHdvcmtzRGVmaW5pdGlvbixcbiAgU291cmNlTWFwcyxcbiAgVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2ZlcixcbiAgVXBkYXRlQWNjb3VudE5hbWVPcHRpb25zLFxuICBVc2VyQWNjb3VudElELFxuICB3aWZUb1ByaXZhdGVLZXksXG59IGZyb20gJ0BuZW8tb25lL2NsaWVudC1jb21tb24nO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAbmVvLW9uZS91dGlscyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5cbmV4cG9ydCBjb25zdCBhc3NlcnRTdHJpbmcgPSAobmFtZTogc3RyaW5nLCBwYXJhbT86IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAocGFyYW0gPT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBwYXJhbSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3N0cmluZycsIG5hbWUsIHBhcmFtKTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbTtcbn07XG5cbmV4cG9ydCBjb25zdCBhc3NlcnRCb29sZWFuID0gKG5hbWU6IHN0cmluZywgdmFsdWU/OiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Jvb2xlYW4nLCBuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgYXNzZXJ0TnVsbGFibGVCb29sZWFuID0gKG5hbWU6IHN0cmluZywgdmFsdWU/OiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGFzc2VydEJvb2xlYW4obmFtZSwgdmFsdWUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFzc2VydE51bWJlciA9IChuYW1lOiBzdHJpbmcsIHZhbHVlPzogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbnVtYmVyJywgbmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGFzc2VydEFkZHJlc3MgPSAobmFtZTogc3RyaW5nLCBhZGRyZXNzSW4/OiB1bmtub3duKTogQWRkcmVzc1N0cmluZyA9PiB7XG4gIGNvbnN0IGFkZHJlc3MgPSBhc3NlcnRTdHJpbmcobmFtZSwgYWRkcmVzc0luKTtcblxuICB0cnkge1xuICAgIGFkZHJlc3NUb1NjcmlwdEhhc2goYWRkcmVzcyk7XG5cbiAgICByZXR1cm4gYWRkcmVzcztcbiAgfSBjYXRjaCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzY3JpcHRIYXNoVG9BZGRyZXNzKGFkZHJlc3MpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdBZGRyZXNzJywgbmFtZSwgYWRkcmVzcyk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgYXNzZXJ0SGFzaDI1NiA9IChuYW1lOiBzdHJpbmcsIGhhc2g/OiB1bmtub3duKTogSGFzaDI1NlN0cmluZyA9PiB7XG4gIGNvbnN0IHZhbHVlID0gYXNzZXJ0U3RyaW5nKG5hbWUsIGhhc2gpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGNvbW1vbi51SW50MjU2VG9TdHJpbmcoY29tbW9uLnN0cmluZ1RvVUludDI1Nih2YWx1ZSkpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0hhc2gyNTYnLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBhc3NlcnRCdWZmZXIgPSAobmFtZTogc3RyaW5nLCBidWZmZXI/OiB1bmtub3duKTogQnVmZmVyU3RyaW5nID0+IHtcbiAgY29uc3QgdmFsdWUgPSBhc3NlcnRTdHJpbmcobmFtZSwgYnVmZmVyKTtcbiAgaWYgKEJ1ZmZlci5mcm9tKHZhbHVlLCAnaGV4JykudG9TdHJpbmcoJ2hleCcpICE9PSB2YWx1ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdCdWZmZXInLCBuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgYXNzZXJ0UHVibGljS2V5ID0gKG5hbWU6IHN0cmluZywgcHVibGljS2V5PzogdW5rbm93bik6IFB1YmxpY0tleVN0cmluZyA9PiB7XG4gIGNvbnN0IHZhbHVlID0gYXNzZXJ0QnVmZmVyKG5hbWUsIHB1YmxpY0tleSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGNvbW1vbi5lY1BvaW50VG9TdHJpbmcoY29tbW9uLnN0cmluZ1RvRUNQb2ludCh2YWx1ZSkpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1B1YmxpY0tleScsIG5hbWUsIHZhbHVlKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGFzc2VydEJpZ051bWJlciA9IChuYW1lOiBzdHJpbmcsIHZhbHVlPzogdW5rbm93bik6IEJpZ051bWJlciA9PiB7XG4gIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQgfHwgIUJpZ051bWJlci5pc0JpZ051bWJlcih2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0JpZ051bWJlcicsIG5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBhc3NlcnROdWxsYWJsZUJpZ051bWJlciA9IChuYW1lOiBzdHJpbmcsIHZhbHVlPzogdW5rbm93bik6IEJpZ051bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGFzc2VydEJpZ051bWJlcihuYW1lLCB2YWx1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgYXNzZXJ0QXJyYXkgPSAobmFtZTogc3RyaW5nLCB2YWx1ZT86IHVua25vd24pOiByZWFkb25seSB1bmtub3duW10gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdBcnJheScsIG5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBhc3NlcnROdWxsYWJsZUFycmF5ID0gKG5hbWU6IHN0cmluZywgdmFsdWU/OiB1bmtub3duKTogcmVhZG9ubHkgdW5rbm93bltdID0+IHtcbiAgaWYgKHZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBhc3NlcnRBcnJheShuYW1lLCB2YWx1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgYXNzZXJ0TWFwID0gKG5hbWU6IHN0cmluZywgdmFsdWU/OiB1bmtub3duKTogUmVhZG9ubHlNYXA8dW5rbm93biwgdW5rbm93bj4gPT4ge1xuICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ01hcCcsIG5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBhc3NlcnRPYmplY3QgPSAobmFtZTogc3RyaW5nLCB2YWx1ZT86IHVua25vd24pOiB7IHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHVua25vd24gfSA9PiB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdPYmplY3QnLCBuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gdmFsdWUgYXMgeyByZWFkb25seSBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG59O1xuXG5leHBvcnQgY29uc3QgYXNzZXJ0TnVsbGFibGVNYXAgPSAobmFtZTogc3RyaW5nLCB2YWx1ZT86IHVua25vd24pOiBSZWFkb25seU1hcDx1bmtub3duLCB1bmtub3duPiA9PiB7XG4gIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IE1hcCgpO1xuICB9XG5cbiAgcmV0dXJuIGFzc2VydE1hcChuYW1lLCB2YWx1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNPYmplY3QgPSAodmFsdWU/OiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0ID0+IHZhbHVlICE9IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xuZXhwb3J0IGNvbnN0IGFzc2VydFByb3BlcnR5ID0gPFQsIE5hbWUgZXh0ZW5kcyBzdHJpbmcsIFA+KFxuICB2YWx1ZTogVCxcbiAgb2JqZWN0TmFtZTogc3RyaW5nLFxuICBuYW1lOiBOYW1lLFxuICBhc3NlcnRUeXBlOiAobmFtZTogc3RyaW5nLCB2PzogdW5rbm93bikgPT4gUCxcbik6IFAgPT4ge1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYW55XG4gIGNvbnN0IHZhbHVlQW55OiBhbnkgPSB2YWx1ZTtcblxuICByZXR1cm4gYXNzZXJ0VHlwZShgJHtvYmplY3ROYW1lfS4ke25hbWV9YCwgdmFsdWVBbnlbbmFtZV0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFzc2VydFVzZXJBY2NvdW50SUQgPSAobmFtZTogc3RyaW5nLCB2YWx1ZT86IHVua25vd24pOiBVc2VyQWNjb3VudElEID0+IHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1VzZXJBY2NvdW50SUQnLCBuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5ldHdvcms6IGFzc2VydFByb3BlcnR5KHZhbHVlLCAnVXNlckFjY291bnRJRCcsICduZXR3b3JrJywgYXNzZXJ0U3RyaW5nKSxcbiAgICBhZGRyZXNzOiBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ1VzZXJBY2NvdW50SUQnLCAnYWRkcmVzcycsIGFzc2VydEFkZHJlc3MpLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGFzc2VydE51bGxhYmxlVXNlckFjY291bnRJRCA9IChuYW1lOiBzdHJpbmcsIHZhbHVlPzogdW5rbm93bik6IFVzZXJBY2NvdW50SUQgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBhc3NlcnRVc2VyQWNjb3VudElEKG5hbWUsIHZhbHVlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhc3NlcnRVcGRhdGVBY2NvdW50TmFtZU9wdGlvbnMgPSAobmFtZTogc3RyaW5nLCB2YWx1ZT86IHVua25vd24pOiBVcGRhdGVBY2NvdW50TmFtZU9wdGlvbnMgPT4ge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignVXBkYXRlQWNjb3VudE5hbWVPcHRpb25zJywgbmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogYXNzZXJ0UHJvcGVydHkodmFsdWUsICdVcGRhdGVBY2NvdW50TmFtZU9wdGlvbnMnLCAnaWQnLCBhc3NlcnRVc2VyQWNjb3VudElEKSxcbiAgICBuYW1lOiBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ1VwZGF0ZUFjY291bnROYW1lT3B0aW9ucycsICduYW1lJywgYXNzZXJ0U3RyaW5nKSxcbiAgfTtcbn07XG5cbmNvbnN0IEFCSV9UWVBFUyA9IG5ldyBTZXQoW1xuICAnU2lnbmF0dXJlJyxcbiAgJ0Jvb2xlYW4nLFxuICAnQWRkcmVzcycsXG4gICdIYXNoMjU2JyxcbiAgJ0J1ZmZlcicsXG4gICdQdWJsaWNLZXknLFxuICAnU3RyaW5nJyxcbiAgJ0FycmF5JyxcbiAgJ01hcCcsXG4gICdPYmplY3QnLFxuICAnVm9pZCcsXG4gICdJbnRlZ2VyJyxcbiAgJ0ZvcndhcmRWYWx1ZScsXG5dKTtcblxuY29uc3QgYXNzZXJ0QUJJVHlwZSA9IChuYW1lOiBzdHJpbmcsIHZhbHVlSW4/OiB1bmtub3duKTogQUJJUmV0dXJuWyd0eXBlJ10gPT4ge1xuICBjb25zdCB2YWx1ZSA9IGFzc2VydFN0cmluZyhuYW1lLCB2YWx1ZUluKTtcblxuICBpZiAoIUFCSV9UWVBFUy5oYXModmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdBQklUeXBlJywgbmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlIGFzIEFCSVJldHVyblsndHlwZSddO1xufTtcblxuY29uc3QgYXNzZXJ0QUJJUHJvcGVydGllcyA9IChuYW1lOiBzdHJpbmcsIHZhbHVlPzogdW5rbm93bik6IHsgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogQUJJUmV0dXJuIH0gPT4ge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQUJJUmV0dXJuJywgbmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIF8uZnJvbVBhaXJzKE9iamVjdC5lbnRyaWVzKHZhbHVlKS5tYXAoKFtrLCB2XSkgPT4gW2Fzc2VydFN0cmluZyhuYW1lLCBrKSwgYXNzZXJ0QUJJUmV0dXJuKG5hbWUsIHYpXSkpO1xufTtcblxuY29uc3QgYXNzZXJ0QUJJUmV0dXJuID0gKG5hbWU6IHN0cmluZywgdmFsdWU/OiB1bmtub3duKTogQUJJUmV0dXJuID0+IHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0FCSVJldHVybicsIG5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ0FCSVJldHVybicsICd0eXBlJywgYXNzZXJ0QUJJVHlwZSk7XG4gIGNvbnN0IG9wdGlvbmFsID0gYXNzZXJ0UHJvcGVydHkodmFsdWUsICdBQklSZXR1cm4nLCAnb3B0aW9uYWwnLCBhc3NlcnROdWxsYWJsZUJvb2xlYW4pO1xuICBjb25zdCBmb3J3YXJkZWRWYWx1ZSA9IGFzc2VydFByb3BlcnR5KHZhbHVlLCAnQUJJUmV0dXJuJywgJ2ZvcndhcmRlZFZhbHVlJywgYXNzZXJ0TnVsbGFibGVCb29sZWFuKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnU2lnbmF0dXJlJzpcbiAgICAgIHJldHVybiB7IHR5cGUsIG9wdGlvbmFsLCBmb3J3YXJkZWRWYWx1ZSB9O1xuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHsgdHlwZSwgb3B0aW9uYWwsIGZvcndhcmRlZFZhbHVlIH07XG4gICAgY2FzZSAnQWRkcmVzcyc6XG4gICAgICByZXR1cm4geyB0eXBlLCBvcHRpb25hbCwgZm9yd2FyZGVkVmFsdWUgfTtcbiAgICBjYXNlICdIYXNoMjU2JzpcbiAgICAgIHJldHVybiB7IHR5cGUsIG9wdGlvbmFsLCBmb3J3YXJkZWRWYWx1ZSB9O1xuICAgIGNhc2UgJ0J1ZmZlcic6XG4gICAgICByZXR1cm4geyB0eXBlLCBvcHRpb25hbCwgZm9yd2FyZGVkVmFsdWUgfTtcbiAgICBjYXNlICdQdWJsaWNLZXknOlxuICAgICAgcmV0dXJuIHsgdHlwZSwgb3B0aW9uYWwsIGZvcndhcmRlZFZhbHVlIH07XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgIHJldHVybiB7IHR5cGUsIG9wdGlvbmFsLCBmb3J3YXJkZWRWYWx1ZSB9O1xuICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgIHJldHVybiB7IHR5cGUsIHZhbHVlOiBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ0FCSVJldHVybicsICd2YWx1ZScsIGFzc2VydEFCSVJldHVybiksIG9wdGlvbmFsLCBmb3J3YXJkZWRWYWx1ZSB9O1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBrZXk6IGFzc2VydFByb3BlcnR5KHZhbHVlLCAnQUJJUmV0dXJuJywgJ2tleScsIGFzc2VydEFCSVJldHVybiksXG4gICAgICAgIHZhbHVlOiBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ0FCSVJldHVybicsICd2YWx1ZScsIGFzc2VydEFCSVJldHVybiksXG4gICAgICAgIG9wdGlvbmFsLFxuICAgICAgICBmb3J3YXJkZWRWYWx1ZSxcbiAgICAgIH07XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHByb3BlcnRpZXM6IGFzc2VydFByb3BlcnR5KHZhbHVlLCAnQUJJUmV0dXJuJywgJ3Byb3BlcnRpZXMnLCBhc3NlcnRBQklQcm9wZXJ0aWVzKSxcbiAgICAgICAgb3B0aW9uYWwsXG4gICAgICAgIGZvcndhcmRlZFZhbHVlLFxuICAgICAgfTtcbiAgICBjYXNlICdWb2lkJzpcbiAgICAgIHJldHVybiB7IHR5cGUsIG9wdGlvbmFsLCBmb3J3YXJkZWRWYWx1ZSB9O1xuICAgIGNhc2UgJ0ludGVnZXInOlxuICAgICAgcmV0dXJuIHsgdHlwZSwgZGVjaW1hbHM6IGFzc2VydFByb3BlcnR5KHZhbHVlLCAnQUJJUmV0dXJuJywgJ2RlY2ltYWxzJywgYXNzZXJ0TnVtYmVyKSwgb3B0aW9uYWwsIGZvcndhcmRlZFZhbHVlIH07XG4gICAgY2FzZSAnRm9yd2FyZFZhbHVlJzpcbiAgICAgIHJldHVybiB7IHR5cGUsIG9wdGlvbmFsLCBmb3J3YXJkZWRWYWx1ZSB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgdXRpbHMuYXNzZXJ0TmV2ZXIodHlwZSk7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3IgVFMnKTtcbiAgfVxufTtcblxuY29uc3QgYXNzZXJ0QUJJRGVmYXVsdFR5cGUgPSAobmFtZTogc3RyaW5nLCB2YWx1ZUluPzogdW5rbm93bik6IEFCSURlZmF1bHRUeXBlID0+IHtcbiAgY29uc3QgdmFsdWUgPSBhc3NlcnRTdHJpbmcobmFtZSwgdmFsdWVJbik7XG4gIHN3aXRjaCAodmFsdWUpIHtcbiAgICBjYXNlICdzZW5kZXInOlxuICAgICAgcmV0dXJuICdzZW5kZXInO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0FCSURlZmF1bHRUeXBlJywgbmFtZSwgdmFsdWUpO1xuICB9XG59O1xuXG5jb25zdCBhc3NlcnROdWxsYWJsZUFCSURlZmF1bHQgPSAobmFtZTogc3RyaW5nLCB2YWx1ZT86IHVua25vd24pOiBBQklEZWZhdWx0IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQUJJRGVmYXVsdCcsIG5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ0FCSURlZmF1bHQnLCAndHlwZScsIGFzc2VydEFCSURlZmF1bHRUeXBlKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc2VuZGVyJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdzZW5kZXInIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQUJJRGVmYXVsdFR5cGUnLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbn07XG5cbmNvbnN0IGFzc2VydEFCSVBhcmFtZXRlciA9IChwcm9wTmFtZTogc3RyaW5nLCB2YWx1ZT86IHVua25vd24pOiBBQklQYXJhbWV0ZXIgPT4ge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQUJJUGFyYW1ldGVyJywgcHJvcE5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ0FCSVBhcmFtZXRlcicsICd0eXBlJywgYXNzZXJ0QUJJVHlwZSk7XG4gIGNvbnN0IG5hbWUgPSBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ0FCSVBhcmFtZXRlcicsICduYW1lJywgYXNzZXJ0U3RyaW5nKTtcbiAgY29uc3Qgb3B0aW9uYWwgPSBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ0FCSVBhcmFtZXRlcicsICdvcHRpb25hbCcsIGFzc2VydE51bGxhYmxlQm9vbGVhbik7XG4gIGNvbnN0IHJlc3QgPSBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ0FCSVBhcmFtZXRlcicsICdyZXN0JywgYXNzZXJ0TnVsbGFibGVCb29sZWFuKTtcbiAgY29uc3QgZGVmYXVsdFZhbHVlID0gYXNzZXJ0UHJvcGVydHkodmFsdWUsICdBQklQYXJhbWV0ZXInLCAnZGVmYXVsdCcsIGFzc2VydE51bGxhYmxlQUJJRGVmYXVsdCk7XG4gIGNvbnN0IGZvcndhcmRlZFZhbHVlID0gYXNzZXJ0UHJvcGVydHkodmFsdWUsICdBQklQYXJhbWV0ZXInLCAnZm9yd2FyZGVkVmFsdWUnLCBhc3NlcnROdWxsYWJsZUJvb2xlYW4pO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ1NpZ25hdHVyZSc6XG4gICAgICByZXR1cm4geyB0eXBlLCBuYW1lLCBvcHRpb25hbCwgZGVmYXVsdDogZGVmYXVsdFZhbHVlLCBmb3J3YXJkZWRWYWx1ZSwgcmVzdCB9O1xuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHsgdHlwZSwgbmFtZSwgb3B0aW9uYWwsIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSwgZm9yd2FyZGVkVmFsdWUsIHJlc3QgfTtcbiAgICBjYXNlICdBZGRyZXNzJzpcbiAgICAgIHJldHVybiB7IHR5cGUsIG5hbWUsIG9wdGlvbmFsLCBkZWZhdWx0OiBkZWZhdWx0VmFsdWUsIGZvcndhcmRlZFZhbHVlLCByZXN0IH07XG4gICAgY2FzZSAnSGFzaDI1Nic6XG4gICAgICByZXR1cm4geyB0eXBlLCBuYW1lLCBvcHRpb25hbCwgZGVmYXVsdDogZGVmYXVsdFZhbHVlLCBmb3J3YXJkZWRWYWx1ZSwgcmVzdCB9O1xuICAgIGNhc2UgJ0J1ZmZlcic6XG4gICAgICByZXR1cm4geyB0eXBlLCBuYW1lLCBvcHRpb25hbCwgZGVmYXVsdDogZGVmYXVsdFZhbHVlLCBmb3J3YXJkZWRWYWx1ZSwgcmVzdCB9O1xuICAgIGNhc2UgJ1B1YmxpY0tleSc6XG4gICAgICByZXR1cm4geyB0eXBlLCBuYW1lLCBvcHRpb25hbCwgZGVmYXVsdDogZGVmYXVsdFZhbHVlLCBmb3J3YXJkZWRWYWx1ZSwgcmVzdCB9O1xuICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICByZXR1cm4geyB0eXBlLCBuYW1lLCBvcHRpb25hbCwgZGVmYXVsdDogZGVmYXVsdFZhbHVlLCBmb3J3YXJkZWRWYWx1ZSwgcmVzdCB9O1xuICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG9wdGlvbmFsLFxuICAgICAgICBkZWZhdWx0OiBkZWZhdWx0VmFsdWUsXG4gICAgICAgIHZhbHVlOiBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ0FCSVBhcmFtZXRlcicsICd2YWx1ZScsIGFzc2VydEFCSVJldHVybiksXG4gICAgICAgIGZvcndhcmRlZFZhbHVlLFxuICAgICAgICByZXN0LFxuICAgICAgfTtcbiAgICBjYXNlICdNYXAnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb3B0aW9uYWwsXG4gICAgICAgIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAga2V5OiBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ0FCSVBhcmFtZXRlcicsICdrZXknLCBhc3NlcnRBQklSZXR1cm4pLFxuICAgICAgICB2YWx1ZTogYXNzZXJ0UHJvcGVydHkodmFsdWUsICdBQklQYXJhbWV0ZXInLCAndmFsdWUnLCBhc3NlcnRBQklSZXR1cm4pLFxuICAgICAgICBmb3J3YXJkZWRWYWx1ZSxcbiAgICAgICAgcmVzdCxcbiAgICAgIH07XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG9wdGlvbmFsLFxuICAgICAgICBkZWZhdWx0OiBkZWZhdWx0VmFsdWUsXG4gICAgICAgIHByb3BlcnRpZXM6IGFzc2VydFByb3BlcnR5KHZhbHVlLCAnQUJJUGFyYW1ldGVyJywgJ3Byb3BlcnRpZXMnLCBhc3NlcnRBQklQcm9wZXJ0aWVzKSxcbiAgICAgICAgZm9yd2FyZGVkVmFsdWUsXG4gICAgICAgIHJlc3QsXG4gICAgICB9O1xuICAgIGNhc2UgJ1ZvaWQnOlxuICAgICAgcmV0dXJuIHsgdHlwZSwgbmFtZSwgb3B0aW9uYWwsIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSwgZm9yd2FyZGVkVmFsdWUsIHJlc3QgfTtcbiAgICBjYXNlICdJbnRlZ2VyJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG9wdGlvbmFsLFxuICAgICAgICBkZWZhdWx0OiBkZWZhdWx0VmFsdWUsXG4gICAgICAgIGRlY2ltYWxzOiBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ0FCSVBhcmFtZXRlcicsICdkZWNpbWFscycsIGFzc2VydE51bWJlciksXG4gICAgICAgIGZvcndhcmRlZFZhbHVlLFxuICAgICAgfTtcbiAgICBjYXNlICdGb3J3YXJkVmFsdWUnOlxuICAgICAgcmV0dXJuIHsgdHlwZSwgbmFtZSwgb3B0aW9uYWwsIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSwgZm9yd2FyZGVkVmFsdWUsIHJlc3QgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHV0aWxzLmFzc2VydE5ldmVyKHR5cGUpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHRocm93IG5ldyBFcnJvcignRm9yIFRTJyk7XG4gIH1cbn07XG5cbmNvbnN0IGFzc2VydEFCSUZ1bmN0aW9uID0gKG5hbWU6IHN0cmluZywgdmFsdWU/OiB1bmtub3duKTogQUJJRnVuY3Rpb24gPT4ge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQUJJRnVuY3Rpb24nLCBuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hbWU6IGFzc2VydFByb3BlcnR5KHZhbHVlLCAnQUJJRnVuY3Rpb24nLCAnbmFtZScsIGFzc2VydFN0cmluZyksXG4gICAgcGFyYW1ldGVyczogYXNzZXJ0UHJvcGVydHkodmFsdWUsICdBQklGdW5jdGlvbicsICdwYXJhbWV0ZXJzJywgYXNzZXJ0TnVsbGFibGVBcnJheSkubWFwKChwYXJhbWV0ZXIpID0+XG4gICAgICBhc3NlcnRBQklQYXJhbWV0ZXIoJ0FCSUZ1bmN0aW9uLnBhcmFtZXRlcnMnLCBwYXJhbWV0ZXIpLFxuICAgICksXG4gICAgcmV0dXJuVHlwZTogYXNzZXJ0UHJvcGVydHkodmFsdWUsICdBQklGdW5jdGlvbicsICdyZXR1cm5UeXBlJywgYXNzZXJ0QUJJUmV0dXJuKSxcbiAgICBjb25zdGFudDogYXNzZXJ0UHJvcGVydHkodmFsdWUsICdBQklGdW5jdGlvbicsICdjb25zdGFudCcsIGFzc2VydE51bGxhYmxlQm9vbGVhbiksXG4gICAgc2VuZDogYXNzZXJ0UHJvcGVydHkodmFsdWUsICdBQklGdW5jdGlvbicsICdzZW5kJywgYXNzZXJ0TnVsbGFibGVCb29sZWFuKSxcbiAgICBzZW5kVW5zYWZlOiBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ0FCSUZ1bmN0aW9uJywgJ3NlbmRVbnNhZmUnLCBhc3NlcnROdWxsYWJsZUJvb2xlYW4pLFxuICAgIHJlY2VpdmU6IGFzc2VydFByb3BlcnR5KHZhbHVlLCAnQUJJRnVuY3Rpb24nLCAncmVjZWl2ZScsIGFzc2VydE51bGxhYmxlQm9vbGVhbiksXG4gICAgY2xhaW06IGFzc2VydFByb3BlcnR5KHZhbHVlLCAnQUJJRnVuY3Rpb24nLCAnY2xhaW0nLCBhc3NlcnROdWxsYWJsZUJvb2xlYW4pLFxuICAgIHJlZnVuZEFzc2V0czogYXNzZXJ0UHJvcGVydHkodmFsdWUsICdBQklGdW5jdGlvbicsICdyZWZ1bmRBc3NldHMnLCBhc3NlcnROdWxsYWJsZUJvb2xlYW4pLFxuICAgIGNvbXBsZXRlU2VuZDogYXNzZXJ0UHJvcGVydHkodmFsdWUsICdBQklGdW5jdGlvbicsICdjb21wbGV0ZVNlbmQnLCBhc3NlcnROdWxsYWJsZUJvb2xlYW4pLFxuICB9O1xufTtcblxuY29uc3QgYXNzZXJ0QUJJRXZlbnQgPSAobmFtZTogc3RyaW5nLCB2YWx1ZT86IHVua25vd24pOiBBQklFdmVudCA9PiB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdBQklFdmVudCcsIG5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogYXNzZXJ0UHJvcGVydHkodmFsdWUsICdBQklFdmVudCcsICduYW1lJywgYXNzZXJ0U3RyaW5nKSxcbiAgICBwYXJhbWV0ZXJzOiBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ0FCSUV2ZW50JywgJ3BhcmFtZXRlcnMnLCBhc3NlcnROdWxsYWJsZUFycmF5KS5tYXAoKHBhcmFtZXRlcikgPT5cbiAgICAgIGFzc2VydEFCSVBhcmFtZXRlcignQUJJRXZlbnQucGFyYW1ldGVycycsIHBhcmFtZXRlciksXG4gICAgKSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBhc3NlcnRBQkkgPSAobmFtZTogc3RyaW5nLCB2YWx1ZT86IHVua25vd24pOiBBQkkgPT4ge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQUJJJywgbmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmdW5jdGlvbnM6IGFzc2VydFByb3BlcnR5KHZhbHVlLCAnQUJJJywgJ2Z1bmN0aW9ucycsIGFzc2VydE51bGxhYmxlQXJyYXkpLm1hcCgoZnVuYykgPT5cbiAgICAgIGFzc2VydEFCSUZ1bmN0aW9uKCdBQkkuZnVuY3Rpb25zJywgZnVuYyksXG4gICAgKSxcbiAgICBldmVudHM6IGFzc2VydFByb3BlcnR5KHZhbHVlLCAnQUJJJywgJ2V2ZW50cycsIGFzc2VydE51bGxhYmxlQXJyYXkpLm1hcCgoZnVuYykgPT5cbiAgICAgIGFzc2VydEFCSUV2ZW50KCdBQkkuZXZlbnRzJywgZnVuYyksXG4gICAgKSxcbiAgfTtcbn07XG5cbmNvbnN0IGFzc2VydFNtYXJ0Q29udHJhY3ROZXR3b3JrRGVmaW5pdGlvbiA9IChuYW1lOiBzdHJpbmcsIHZhbHVlPzogdW5rbm93bik6IFNtYXJ0Q29udHJhY3ROZXR3b3JrRGVmaW5pdGlvbiA9PiB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdTbWFydENvbnRyYWN0TmV0d29ya0RlZmluaXRpb24nLCBuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFkZHJlc3M6IGFzc2VydFByb3BlcnR5KHZhbHVlLCAnU21hcnRDb250cmFjdE5ldHdvcmtEZWZpbml0aW9uJywgJ2FkZHJlc3MnLCBhc3NlcnRBZGRyZXNzKSxcbiAgfTtcbn07XG5cbmNvbnN0IGFzc2VydFNtYXJ0Q29udHJhY3ROZXR3b3Jrc0RlZmluaXRpb24gPSAobmFtZTogc3RyaW5nLCB2YWx1ZT86IHVua25vd24pOiBTbWFydENvbnRyYWN0TmV0d29ya3NEZWZpbml0aW9uID0+IHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1NtYXJ0Q29udHJhY3ROZXR3b3Jrc0RlZmluaXRpb24nLCBuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gXy5tYXBWYWx1ZXModmFsdWUsICh2YWwpID0+XG4gICAgYXNzZXJ0U21hcnRDb250cmFjdE5ldHdvcmtEZWZpbml0aW9uKCdTbWFydENvbnRyYWN0TmV0d29ya3NEZWZpbml0aW9uJywgdmFsKSxcbiAgKSBhcyBTbWFydENvbnRyYWN0TmV0d29ya3NEZWZpbml0aW9uO1xufTtcblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuY29uc3QgaXNQcm9taXNlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvbWlzZTxhbnk+ID0+XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAodmFsdWUgYXMgYW55KS50aGVuICE9PSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBhc3NlcnRTb3VyY2VNYXBzID0gKG5hbWU6IHN0cmluZywgdmFsdWU/OiB1bmtub3duKTogUHJvbWlzZTxTb3VyY2VNYXBzPiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFpc1Byb21pc2UodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdTb3VyY2VNYXBzJywgbmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGFzc2VydFNtYXJ0Q29udHJhY3REZWZpbml0aW9uID0gKG5hbWU6IHN0cmluZywgdmFsdWU/OiB1bmtub3duKTogU21hcnRDb250cmFjdERlZmluaXRpb24gPT4ge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignU21hcnRDb250cmFjdERlZmluaXRpb24nLCBuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5ldHdvcmtzOiBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ1NtYXJ0Q29udHJhY3REZWZpbml0aW9uJywgJ25ldHdvcmtzJywgYXNzZXJ0U21hcnRDb250cmFjdE5ldHdvcmtzRGVmaW5pdGlvbiksXG4gICAgYWJpOiBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ1NtYXJ0Q29udHJhY3REZWZpbml0aW9uJywgJ2FiaScsIGFzc2VydEFCSSksXG4gICAgc291cmNlTWFwczogYXNzZXJ0UHJvcGVydHkodmFsdWUsICdTbWFydENvbnRyYWN0RGVmaW5pdGlvbicsICdzb3VyY2VNYXBzJywgYXNzZXJ0U291cmNlTWFwcyksXG4gIH07XG59O1xuXG5jb25zdCBhc3NlcnRTY3JpcHRCdWlsZGVyUGFyYW0gPSAobmFtZTogc3RyaW5nLCB2YWx1ZT86IHVua25vd24pOiBTY3JpcHRCdWlsZGVyUGFyYW0gPT4ge1xuICBpZiAodmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdTY3JpcHRCdWlsZGVyUGFyYW0nLCBuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYW55XG4gIHJldHVybiB2YWx1ZSBhcyBhbnk7XG59O1xuXG5jb25zdCBhc3NlcnROdWxsYWJsZVNjcmlwdEJ1aWxkZXJQYXJhbSA9IChuYW1lOiBzdHJpbmcsIHZhbHVlPzogdW5rbm93bik6IFNjcmlwdEJ1aWxkZXJQYXJhbSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGFzc2VydFNjcmlwdEJ1aWxkZXJQYXJhbShuYW1lLCB2YWx1ZSk7XG59O1xuXG5jb25zdCBhc3NlcnRQYXJhbSA9IChuYW1lOiBzdHJpbmcsIHZhbHVlPzogdW5rbm93bik6IFBhcmFtID0+IHtcbiAgaWYgKHZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignUGFyYW0nLCBuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYW55XG4gIHJldHVybiB2YWx1ZSBhcyBhbnk7XG59O1xuXG5jb25zdCBhc3NlcnROdWxsYWJsZVBhcmFtID0gKG5hbWU6IHN0cmluZywgdmFsdWU/OiB1bmtub3duKTogUGFyYW0gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBhc3NlcnRQYXJhbShuYW1lLCB2YWx1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgYXNzZXJ0Rm9yd2FyZFZhbHVlID0gKG5hbWU6IHN0cmluZywgdmFsdWU/OiB1bmtub3duKTogRm9yd2FyZFZhbHVlID0+IHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ZvcndhcmRWYWx1ZScsIG5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogYXNzZXJ0UHJvcGVydHkodmFsdWUsICdGb3J3YXJkVmFsdWUnLCAnbmFtZScsIGFzc2VydFN0cmluZyksXG4gICAgY29udmVydGVkOiBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ0ZvcndhcmRWYWx1ZScsICdjb252ZXJ0ZWQnLCBhc3NlcnROdWxsYWJsZVNjcmlwdEJ1aWxkZXJQYXJhbSksXG4gICAgcGFyYW06IGFzc2VydFByb3BlcnR5KHZhbHVlLCAnRm9yd2FyZFZhbHVlJywgJ3BhcmFtJywgYXNzZXJ0TnVsbGFibGVQYXJhbSksXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICB9IGFzIGFueTtcbn07XG5cbmV4cG9ydCBjb25zdCBhc3NlcnRUcmFuc2ZlciA9IChuYW1lOiBzdHJpbmcsIHZhbHVlPzogdW5rbm93bik6IFRyYW5zZmVyID0+IHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1RyYW5zZmVyJywgbmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhbW91bnQ6IGFzc2VydFByb3BlcnR5KHZhbHVlLCAnVHJhbnNmZXInLCAnYW1vdW50JywgYXNzZXJ0QmlnTnVtYmVyKSxcbiAgICBhc3NldDogYXNzZXJ0UHJvcGVydHkodmFsdWUsICdUcmFuc2ZlcicsICdhc3NldCcsIGFzc2VydEhhc2gyNTYpLFxuICAgIHRvOiBhc3NlcnRQcm9wZXJ0eSh2YWx1ZSwgJ1RyYW5zZmVyJywgJ3RvJywgYXNzZXJ0QWRkcmVzcyksXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgYXNzZXJ0UHJpdmF0ZUtleSA9IChuYW1lOiBzdHJpbmcsIHZhbHVlSW4/OiB1bmtub3duKTogUHJpdmF0ZUtleVN0cmluZyA9PiB7XG4gIGNvbnN0IHZhbHVlID0gYXNzZXJ0U3RyaW5nKG5hbWUsIHZhbHVlSW4pO1xuICB0cnkge1xuICAgIHByaXZhdGVLZXlUb1B1YmxpY0tleSh2YWx1ZSk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gY2F0Y2gge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gd2lmVG9Qcml2YXRlS2V5KHZhbHVlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignUHJpdmF0ZUtleScsIG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBhc3NlcnRUcmFuc2ZlcnMgPSAobmFtZTogc3RyaW5nLCB2YWx1ZUluPzogdW5rbm93bik6IHJlYWRvbmx5IFRyYW5zZmVyW10gPT4ge1xuICBjb25zdCB2YWx1ZSA9IGFzc2VydEFycmF5KG5hbWUsIHZhbHVlSW4pO1xuXG4gIHJldHVybiB2YWx1ZS5tYXAoKHZhbCkgPT4gYXNzZXJ0VHJhbnNmZXIobmFtZSwgdmFsKSk7XG59O1xuXG5jb25zdCBhc3NlcnRBdHRyaWJ1dGVVc2FnZSA9IChuYW1lOiBzdHJpbmcsIHZhbHVlSW4/OiB1bmtub3duKTogQXR0cmlidXRlVXNhZ2UgPT4ge1xuICBjb25zdCB2YWx1ZSA9IGFzc2VydFN0cmluZyhuYW1lLCB2YWx1ZUluKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXNzZXJ0QXR0cmlidXRlVXNhZ2VKU09OKHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdBdHRyaWJ1dGVVc2FnZScsIG5hbWUsIHZhbHVlKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGFzc2VydEF0dHJpYnV0ZSA9IChuYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZT86IHVua25vd24pOiBBdHRyaWJ1dGUgPT4ge1xuICBpZiAoIWlzT2JqZWN0KGF0dHJpYnV0ZSkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0F0dHJpYnV0ZScsIG5hbWUsIGF0dHJpYnV0ZSk7XG4gIH1cblxuICBjb25zdCB1c2FnZSA9IGFzc2VydFByb3BlcnR5KGF0dHJpYnV0ZSwgJ0F0dHJpYnV0ZScsICd1c2FnZScsIGFzc2VydEF0dHJpYnV0ZVVzYWdlKTtcbiAgc3dpdGNoICh1c2FnZSkge1xuICAgIGNhc2UgJ0NvbnRyYWN0SGFzaCc6XG4gICAgY2FzZSAnVm90ZSc6XG4gICAgY2FzZSAnSGFzaDEnOlxuICAgIGNhc2UgJ0hhc2gyJzpcbiAgICBjYXNlICdIYXNoMyc6XG4gICAgY2FzZSAnSGFzaDQnOlxuICAgIGNhc2UgJ0hhc2g1JzpcbiAgICBjYXNlICdIYXNoNic6XG4gICAgY2FzZSAnSGFzaDcnOlxuICAgIGNhc2UgJ0hhc2g4JzpcbiAgICBjYXNlICdIYXNoOSc6XG4gICAgY2FzZSAnSGFzaDEwJzpcbiAgICBjYXNlICdIYXNoMTEnOlxuICAgIGNhc2UgJ0hhc2gxMic6XG4gICAgY2FzZSAnSGFzaDEzJzpcbiAgICBjYXNlICdIYXNoMTQnOlxuICAgIGNhc2UgJ0hhc2gxNSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2FnZSxcbiAgICAgICAgZGF0YTogYXNzZXJ0UHJvcGVydHkoYXR0cmlidXRlLCAnQXR0cmlidXRlJywgJ2RhdGEnLCBhc3NlcnRIYXNoMjU2KSxcbiAgICAgIH07XG4gICAgY2FzZSAnU2NyaXB0JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVzYWdlLFxuICAgICAgICBkYXRhOiBhc3NlcnRQcm9wZXJ0eShhdHRyaWJ1dGUsICdBdHRyaWJ1dGUnLCAnZGF0YScsIGFzc2VydEFkZHJlc3MpLFxuICAgICAgfTtcbiAgICBjYXNlICdFQ0RIMDInOlxuICAgIGNhc2UgJ0VDREgwMyc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2FnZSxcbiAgICAgICAgZGF0YTogYXNzZXJ0UHJvcGVydHkoYXR0cmlidXRlLCAnQXR0cmlidXRlJywgJ2RhdGEnLCBhc3NlcnRQdWJsaWNLZXkpLFxuICAgICAgfTtcbiAgICBjYXNlICdEZXNjcmlwdGlvblVybCc6XG4gICAgY2FzZSAnRGVzY3JpcHRpb24nOlxuICAgIGNhc2UgJ1JlbWFyayc6XG4gICAgY2FzZSAnUmVtYXJrMSc6XG4gICAgY2FzZSAnUmVtYXJrMic6XG4gICAgY2FzZSAnUmVtYXJrMyc6XG4gICAgY2FzZSAnUmVtYXJrNCc6XG4gICAgY2FzZSAnUmVtYXJrNSc6XG4gICAgY2FzZSAnUmVtYXJrNic6XG4gICAgY2FzZSAnUmVtYXJrNyc6XG4gICAgY2FzZSAnUmVtYXJrOCc6XG4gICAgY2FzZSAnUmVtYXJrOSc6XG4gICAgY2FzZSAnUmVtYXJrMTAnOlxuICAgIGNhc2UgJ1JlbWFyazExJzpcbiAgICBjYXNlICdSZW1hcmsxMic6XG4gICAgY2FzZSAnUmVtYXJrMTMnOlxuICAgIGNhc2UgJ1JlbWFyazE0JzpcbiAgICBjYXNlICdSZW1hcmsxNSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2FnZSxcbiAgICAgICAgZGF0YTogYXNzZXJ0UHJvcGVydHkoYXR0cmlidXRlLCAnQXR0cmlidXRlJywgJ2RhdGEnLCBhc3NlcnRCdWZmZXIpLFxuICAgICAgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHV0aWxzLmFzc2VydE5ldmVyKHVzYWdlKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvciBUUycpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgYXNzZXJ0VHJhbnNhY3Rpb25PcHRpb25zID0gKG5hbWU6IHN0cmluZywgb3B0aW9ucz86IHVua25vd24pOiBUcmFuc2FjdGlvbk9wdGlvbnMgPT4ge1xuICBpZiAob3B0aW9ucyA9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBpZiAoIWlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdUcmFuc2FjdGlvbk9wdGlvbnMnLCBuYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZnJvbTogYXNzZXJ0UHJvcGVydHkob3B0aW9ucywgJ1RyYW5zYWN0aW9uT3B0aW9ucycsICdmcm9tJywgYXNzZXJ0TnVsbGFibGVVc2VyQWNjb3VudElEKSxcbiAgICBhdHRyaWJ1dGVzOiBhc3NlcnRQcm9wZXJ0eShvcHRpb25zLCAnVHJhbnNhY3Rpb25PcHRpb25zJywgJ2F0dHJpYnV0ZXMnLCBhc3NlcnROdWxsYWJsZUFycmF5KS5tYXAoKHZhbHVlKSA9PlxuICAgICAgYXNzZXJ0QXR0cmlidXRlKCdUcmFuc2FjdGlvbk9wdGlvbi5hdHRyaWJ1dGVzJywgdmFsdWUpLFxuICAgICksXG4gICAgbmV0d29ya0ZlZTogYXNzZXJ0UHJvcGVydHkob3B0aW9ucywgJ1RyYW5zYWN0aW9uT3B0aW9ucycsICduZXR3b3JrRmVlJywgYXNzZXJ0TnVsbGFibGVCaWdOdW1iZXIpLFxuICAgIHN5c3RlbUZlZTogYXNzZXJ0UHJvcGVydHkob3B0aW9ucywgJ1RyYW5zYWN0aW9uT3B0aW9ucycsICdzeXN0ZW1GZWUnLCBhc3NlcnROdWxsYWJsZUJpZ051bWJlciksXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICAgIG1vbml0b3I6IChvcHRpb25zIGFzIGFueSkubW9uaXRvcixcbiAgfTtcbn07XG4iXX0=