@bitgo-beta/sdk-coin-canton 1.0.1-beta.835 → 1.0.1-beta.837
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +68 -1
- package/dist/test/resources.d.ts +12 -0
- package/dist/test/resources.d.ts.map +1 -1
- package/dist/test/resources.js +15 -3
- package/dist/test/unit/utils.js +12 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAA2B,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAO3F,OAAO,EAAE,iBAAiB,EAA+C,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChH,OAAO,EAAe,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,KAAM,YAAW,SAAS;IACrC,kBAAkB;IAClB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAUxC,kBAAkB;IAClB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQrC,kBAAkB;IAClB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC,kBAAkB;IAClB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAItC,kBAAkB;IAClB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI5C,kBAAkB;IAClB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKxC;;;;OAIG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI3C;;;;OAIG;IACH,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAMlD;;;;;OAKG;IACH,6BAA6B,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,qBAAqB;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/src/lib/utils.js
CHANGED
|
@@ -153,6 +153,25 @@ class Utils {
|
|
|
153
153
|
}
|
|
154
154
|
return undefined;
|
|
155
155
|
};
|
|
156
|
+
/** Unwraps a Daml optional (or bare) party value to the party string. */
|
|
157
|
+
const getPartyFromOptional = (fields, label) => {
|
|
158
|
+
const sum = getField(fields, label);
|
|
159
|
+
if (sum?.oneofKind === 'party')
|
|
160
|
+
return sum.party ?? '';
|
|
161
|
+
if (sum?.oneofKind === 'optional') {
|
|
162
|
+
const inner = sum.optional.value?.sum;
|
|
163
|
+
if (inner?.oneofKind === 'party')
|
|
164
|
+
return inner.party ?? '';
|
|
165
|
+
}
|
|
166
|
+
return undefined;
|
|
167
|
+
};
|
|
168
|
+
/** Reads a Daml enum constructor name (e.g. AllocationV2 TransferSide SenderSide/ReceiverSide). */
|
|
169
|
+
const getEnumConstructor = (fields, label) => {
|
|
170
|
+
const sum = getField(fields, label);
|
|
171
|
+
if (sum?.oneofKind === 'enum')
|
|
172
|
+
return sum.enum.constructor ?? '';
|
|
173
|
+
return undefined;
|
|
174
|
+
};
|
|
156
175
|
/**
|
|
157
176
|
* Extracts sender, receiver, amount, and instrument fields from a transfer record.
|
|
158
177
|
* Canton coin transfers and cbtc use instrumentId.admin; regular token transfers use instrumentIdentifier.source.
|
|
@@ -351,6 +370,54 @@ class Utils {
|
|
|
351
370
|
break;
|
|
352
371
|
}
|
|
353
372
|
case sdk_core_1.TransactionType.AllocationAllocate: {
|
|
373
|
+
// V2 (allocation-instruction-v2): AllocationV2 create node
|
|
374
|
+
// → allocation.{authorizer.owner, admin, transferLegSides[].{side, otherside.owner, amount, instrumentId}}.
|
|
375
|
+
// The authorizer is the allocating party; its outgoing leg (side=SenderSide) carries the
|
|
376
|
+
// settlement counterparty (receiver) and amount. A receiver-only allocation has no
|
|
377
|
+
// SenderSide leg — the authorizer receives, so sender/receiver flip to the otherside of
|
|
378
|
+
// its (first) ReceiverSide leg. The first matching leg wins for multi-leg allocations.
|
|
379
|
+
const allocationV2Fields = findCreateNodeFields('AllocationV2');
|
|
380
|
+
if (allocationV2Fields) {
|
|
381
|
+
const allocationField = getField(allocationV2Fields, 'allocation');
|
|
382
|
+
if (allocationField?.oneofKind === 'record') {
|
|
383
|
+
const allocationRecord = allocationField.record?.fields ?? [];
|
|
384
|
+
const authorizer = getField(allocationRecord, 'authorizer');
|
|
385
|
+
const authorizerOwner = authorizer?.oneofKind === 'record'
|
|
386
|
+
? getPartyFromOptional(authorizer.record?.fields ?? [], 'owner')
|
|
387
|
+
: undefined;
|
|
388
|
+
const adminData = getField(allocationRecord, 'admin');
|
|
389
|
+
if (adminData?.oneofKind === 'party')
|
|
390
|
+
instrumentAdmin = adminData.party ?? '';
|
|
391
|
+
const legsData = getField(allocationRecord, 'transferLegSides');
|
|
392
|
+
if (legsData?.oneofKind === 'list') {
|
|
393
|
+
const legRecords = (legsData.list?.elements ?? [])
|
|
394
|
+
.map((leg) => (leg.sum.oneofKind === 'record' ? leg.sum.record.fields : undefined))
|
|
395
|
+
.filter((fields) => fields !== undefined);
|
|
396
|
+
const senderLeg = legRecords.find((leg) => getEnumConstructor(leg, 'side') === 'SenderSide');
|
|
397
|
+
const leg = senderLeg ?? legRecords.find((leg) => getEnumConstructor(leg, 'side') === 'ReceiverSide');
|
|
398
|
+
if (leg) {
|
|
399
|
+
const legOtherside = getField(leg, 'otherside');
|
|
400
|
+
const othersideOwner = legOtherside?.oneofKind === 'record'
|
|
401
|
+
? getPartyFromOptional(legOtherside.record?.fields ?? [], 'owner')
|
|
402
|
+
: undefined;
|
|
403
|
+
const legAmount = getField(leg, 'amount');
|
|
404
|
+
const legInstrumentId = getField(leg, 'instrumentId');
|
|
405
|
+
if (senderLeg) {
|
|
406
|
+
sender = authorizerOwner ?? '';
|
|
407
|
+
receiver = othersideOwner ?? '';
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
sender = othersideOwner ?? '';
|
|
411
|
+
receiver = authorizerOwner ?? '';
|
|
412
|
+
}
|
|
413
|
+
if (legAmount?.oneofKind === 'numeric')
|
|
414
|
+
amount = legAmount.numeric ?? '';
|
|
415
|
+
if (legInstrumentId?.oneofKind === 'text')
|
|
416
|
+
instrumentId = legInstrumentId.text ?? '';
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
354
421
|
// DvpLegAllocation create node → allocation.transferLeg contains the full settlement transfer details:
|
|
355
422
|
// sender, receiver (the actual settlement counterparty), amount, and instrumentId
|
|
356
423
|
const dvpFields = findCreateNodeFields('DvpLegAllocation');
|
|
@@ -995,4 +1062,4 @@ class Utils {
|
|
|
995
1062
|
exports.Utils = Utils;
|
|
996
1063
|
const utils = new Utils();
|
|
997
1064
|
exports.default = utils;
|
|
998
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUFxQztBQUNyQyxvREFBNEI7QUFFNUIsbURBQTJGO0FBQzNGLGlEQUF5RDtBQUV6RCwwREFBMEU7QUFDMUUseUZBQW1GO0FBRW5GLHlDQUFtRjtBQUluRixNQUFhLEtBQUs7SUFDaEIsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxPQUFlO1FBQzVCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNwRCxNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMvQixpRUFBaUU7UUFDakUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLDJFQUEyRTtRQUMzRSxvREFBb0Q7UUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMs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QUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFFMUIsa0JBQWUsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBCYXNlVXRpbHMsIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5LCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBDYW50b25Ub2tlbiwgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcblxuaW1wb3J0IHsgY29tcHV0ZVByZXBhcmVkVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaGFzaC9oYXNoLmpzJztcbmltcG9ydCB7IFByZXBhcmVkVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvcHJvdG8vcHJlcGFyZWRUcmFuc2FjdGlvbi5qcyc7XG5cbmltcG9ydCB7IENyeXB0b0tleUZvcm1hdCwgU2lnbmluZ0FsZ29yaXRobVNwZWMsIFNpZ25pbmdLZXlTcGVjIH0gZnJvbSAnLi9jb25zdGFudCc7XG5pbXBvcnQgeyBDYW50b25Db21tYW5kSW5mbywgUHJlcGFyZWRUcmFuc2FjdGlvbiBhcyBJUHJlcGFyZWRUcmFuc2FjdGlvbiwgUHJlcGFyZWRUeG5QYXJzZWRJbmZvIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBSZWNvcmRGaWVsZCwgVmFsdWUgfSBmcm9tICcuL3Jlc291cmNlc0ludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWFkZHJlc3MgfHwgYWRkcmVzcy50cmltKCkgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgW3BhcnR5SGludCwgZmluZ2VycHJpbnRdID0gYWRkcmVzcy50cmltKCkuc3BsaXQoJzo6Jyk7XG4gICAgaWYgKCFmaW5nZXJwcmludCkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFsbCBtZW1vSWRzIGFyZSBjb25zaWRlcmVkIHZhbGlkIGFzIGxvbmcgYXMgc3RyaW5ncyBhcmUgcGFzc2VkXG4gICAgY29uc3QgW2ZpbmdlcnByaW50UGFydF0gPSBmaW5nZXJwcmludC50cmltKCkuc3BsaXQoJz9tZW1vSWQ9Jyk7XG4gICAgaWYgKCFwYXJ0eUhpbnQgfHwgIWZpbmdlcnByaW50UGFydCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRDYW50b25IZXgoZmluZ2VycHJpbnRQYXJ0KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBJbiBjYW50b24sIHRoZXJlIGlzIG5vIGJsb2NrIGhhc2gsIHdlIHN0b3JlIHRoZSBoZWlnaHQgYXMgdGhlIF9pZCAoaGFzaClcbiAgICAvLyB0aGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0sIDxibG9ja0hlaWdodD5fPHZlcnNpb24+XG4gICAgY29uc3QgW2hlaWdodF0gPSBoYXNoLnNwbGl0KCdfJyk7XG4gICAgY29uc3QgYmxvY2tIZWlnaHQgPSBOdW1iZXIoaGVpZ2h0KTtcbiAgICByZXR1cm4gIWlzTmFOKGJsb2NrSGVpZ2h0KSAmJiBibG9ja0hlaWdodCA+IDA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFByaXZhdGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFB1YmxpY0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ZhbGlkRWQyNTUxOVB1YmxpY0tleShrZXkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgaW5wdXQgaXMgYSB2YWxpZCBjYW50b24gaGV4IHN0cmluZ1xuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgdGhlIGhleCBzdHJpbmcgdmFsdWVcbiAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRDYW50b25IZXgodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlZ2V4ID0gL15bYS1mQS1GMC05XXs2OH0kLztcbiAgICByZXR1cm4gcmVnZXgudGVzdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBjb252ZXJ0IGhleCB2YWx1ZSB0byBiYXNlNjRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGhleFN0cmluZyAtIGhleCBlbmNvZGVkIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBiYXNlNjQgZW5jb2RlZCBzdHJpbmdcbiAgICovXG4gIGdldEJhc2U2NEZyb21IZXgoaGV4U3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShoZXhTdHJpbmcsICdoZXgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGNyZWF0ZSBmaW5nZXJwcmludCAocGFydCBvZiB0aGUgY2FudG9uIHBhcnR5SWQpIGZyb20gcHVibGljIGtleVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHVibGljS2V5IHRoZSBwdWJsaWMga2V5XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5zaWduaW5nUHVibGljS2V5RnJvbUVkMjU1MTkocHVibGljS2V5KTtcbiAgICBjb25zdCBoYXNoUHVycG9zZSA9IDEyO1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGVTaGEyNTZDYW50b25IYXNoKGhhc2hQdXJwb3NlLCBrZXkucHVibGljS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcGFyc2UgcmF3IGNhbnRvbiB0cmFuc2FjdGlvbiAmIGdldCByZXF1aXJlZCBkYXRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByYXdEYXRhIGJhc2U2NCBlbmNvZGVkIHN0cmluZ1xuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHhUeXBlIHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqIEByZXR1cm5zIHtQcmVwYXJlZFR4blBhcnNlZEluZm99XG4gICAqL1xuICBwYXJzZVJhd0NhbnRvblRyYW5zYWN0aW9uRGF0YShyYXdEYXRhOiBzdHJpbmcsIHR4VHlwZTogVHJhbnNhY3Rpb25UeXBlKTogUHJlcGFyZWRUeG5QYXJzZWRJbmZvIHtcbiAgICBjb25zdCBkZWNvZGVkRGF0YSA9IHRoaXMuZGVjb2RlUHJlcGFyZWRUcmFuc2FjdGlvbihyYXdEYXRhKTtcbiAgICBjb25zdCBub2RlcyA9IGRlY29kZWREYXRhLnRyYW5zYWN0aW9uPy5ub2RlcyA/PyBbXTtcbiAgICBjb25zdCBnZXRGaWVsZCA9IChmaWVsZHM6IFJlY29yZEZpZWxkW10sIGxhYmVsOiBzdHJpbmcpID0+IGZpZWxkcy5maW5kKChmKSA9PiBmLmxhYmVsID09PSBsYWJlbCk/LnZhbHVlPy5zdW07XG5cbiAgICBsZXQgc2VuZGVyID0gJyc7XG4gICAgbGV0IHJlY2VpdmVyID0gJyc7XG4gICAgbGV0IGFtb3VudCA9ICcnO1xuICAgIGxldCBtZW1vSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaW5zdHJ1bWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGluc3RydW1lbnRBZG1pbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYXJndW1lbnQgZmllbGRzIG9mIHRoZSBmaXJzdCBjcmVhdGUgbm9kZSBtYXRjaGluZyB0aGUgZ2l2ZW4gZW50aXR5IG5hbWUuXG4gICAgICovXG4gICAgY29uc3QgZmluZENyZWF0ZU5vZGVGaWVsZHMgPSAoZW50aXR5TmFtZTogc3RyaW5nKTogUmVjb3JkRmllbGRbXSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgICAgY29uc3Qgdm4gPSBub2RlLnZlcnNpb25lZE5vZGU7XG4gICAgICAgIGlmICghdm4gfHwgdm4ub25lb2ZLaW5kICE9PSAndjEnKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbnQgPSB2bi52MS5ub2RlVHlwZTtcbiAgICAgICAgaWYgKG50Lm9uZW9mS2luZCAhPT0gJ2NyZWF0ZScpIGNvbnRpbnVlO1xuICAgICAgICBpZiAobnQuY3JlYXRlLnRlbXBsYXRlSWQ/LmVudGl0eU5hbWUgIT09IGVudGl0eU5hbWUpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBhcmdTdW0gPSBudC5jcmVhdGUuYXJndW1lbnQ/LnN1bTtcbiAgICAgICAgaWYgKCFhcmdTdW0gfHwgYXJnU3VtLm9uZW9mS2luZCAhPT0gJ3JlY29yZCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBhcmdTdW0ucmVjb3JkPy5maWVsZHM7XG4gICAgICAgIGlmIChmaWVsZHMpIHJldHVybiBmaWVsZHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjaG9zZW5WYWx1ZSBmaWVsZHMgb2YgdGhlIGZpcnN0IGV4ZXJjaXNlIG5vZGUgbWF0Y2hpbmcgdGhlIGdpdmVuIGNob2ljZUlkLlxuICAgICAqL1xuICAgIGNvbnN0IGZpbmRFeGVyY2lzZU5vZGVGaWVsZHMgPSAoY2hvaWNlSWQ6IHN0cmluZyk6IFJlY29yZEZpZWxkW10gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICAgIGNvbnN0IHZuID0gbm9kZS52ZXJzaW9uZWROb2RlO1xuICAgICAgICBpZiAoIXZuIHx8IHZuLm9uZW9mS2luZCAhPT0gJ3YxJykgY29udGludWU7XG4gICAgICAgIGNvbnN0IG50ID0gdm4udjEubm9kZVR5cGU7XG4gICAgICAgIGlmIChudC5vbmVvZktpbmQgIT09ICdleGVyY2lzZScpIGNvbnRpbnVlO1xuICAgICAgICBpZiAobnQuZXhlcmNpc2UuY2hvaWNlSWQgIT09IGNob2ljZUlkKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYXJnU3VtID0gbnQuZXhlcmNpc2UuY2hvc2VuVmFsdWU/LnN1bTtcbiAgICAgICAgaWYgKCFhcmdTdW0gfHwgYXJnU3VtLm9uZW9mS2luZCAhPT0gJ3JlY29yZCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBhcmdTdW0ucmVjb3JkPy5maWVsZHM7XG4gICAgICAgIGlmIChmaWVsZHMpIHJldHVybiBmaWVsZHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBhY3RpbmcgcGFydHkgb2YgdGhlIGZpcnN0IGV4ZXJjaXNlIG5vZGUgbWF0Y2hpbmcgdGhlIGdpdmVuIGNob2ljZUlkLlxuICAgICAqL1xuICAgIGNvbnN0IGZpbmRFeGVyY2lzZUFjdGluZ1BhcnR5ID0gKGNob2ljZUlkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICAgIGNvbnN0IHZuID0gbm9kZS52ZXJzaW9uZWROb2RlO1xuICAgICAgICBpZiAoIXZuIHx8IHZuLm9uZW9mS2luZCAhPT0gJ3YxJykgY29udGludWU7XG4gICAgICAgIGNvbnN0IG50ID0gdm4udjEubm9kZVR5cGU7XG4gICAgICAgIGlmIChudC5vbmVvZktpbmQgIT09ICdleGVyY2lzZScpIGNvbnRpbnVlO1xuICAgICAgICBpZiAobnQuZXhlcmNpc2UuY2hvaWNlSWQgIT09IGNob2ljZUlkKSBjb250aW51ZTtcbiAgICAgICAgcmV0dXJuIG50LmV4ZXJjaXNlLmFjdGluZ1BhcnRpZXNbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBzZW5kZXIsIHJlY2VpdmVyLCBhbW91bnQsIGFuZCBpbnN0cnVtZW50IGZpZWxkcyBmcm9tIGEgdHJhbnNmZXIgcmVjb3JkLlxuICAgICAqIENhbnRvbiBjb2luIHRyYW5zZmVycyBhbmQgY2J0YyB1c2UgaW5zdHJ1bWVudElkLmFkbWluOyByZWd1bGFyIHRva2VuIHRyYW5zZmVycyB1c2UgaW5zdHJ1bWVudElkZW50aWZpZXIuc291cmNlLlxuICAgICAqL1xuICAgIGNvbnN0IGV4dHJhY3RGcm9tVHJhbnNmZXJSZWNvcmQgPSAoXG4gICAgICB0cmFuc2ZlclJlY29yZDogUmVjb3JkRmllbGRbXSxcbiAgICAgIGluc3RydW1lbnRGaWVsZE5hbWU6IHN0cmluZyxcbiAgICAgIGluc3RydW1lbnRBZG1pbkZpZWxkTmFtZTogc3RyaW5nXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBzZW5kZXJEYXRhID0gZ2V0RmllbGQodHJhbnNmZXJSZWNvcmQsICdzZW5kZXInKTtcbiAgICAgIGlmIChzZW5kZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHNlbmRlciA9IHNlbmRlckRhdGEucGFydHkgPz8gJyc7XG4gICAgICBjb25zdCByZWNlaXZlckRhdGEgPSBnZXRGaWVsZCh0cmFuc2ZlclJlY29yZCwgJ3JlY2VpdmVyJyk7XG4gICAgICBpZiAocmVjZWl2ZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHJlY2VpdmVyID0gcmVjZWl2ZXJEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgY29uc3QgYW1vdW50RGF0YSA9IGdldEZpZWxkKHRyYW5zZmVyUmVjb3JkLCAnYW1vdW50Jyk7XG4gICAgICBpZiAoYW1vdW50RGF0YT8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIGFtb3VudCA9IGFtb3VudERhdGEubnVtZXJpYyA/PyAnJztcbiAgICAgIGNvbnN0IGluc3RydW1lbnRGaWVsZCA9IGdldEZpZWxkKHRyYW5zZmVyUmVjb3JkLCBpbnN0cnVtZW50RmllbGROYW1lKTtcbiAgICAgIGlmIChpbnN0cnVtZW50RmllbGQ/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgY29uc3QgaW5zdHJ1bWVudEZpZWxkcyA9IGluc3RydW1lbnRGaWVsZC5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgY29uc3QgYWRtaW5EYXRhID0gZ2V0RmllbGQoaW5zdHJ1bWVudEZpZWxkcywgaW5zdHJ1bWVudEFkbWluRmllbGROYW1lKTtcbiAgICAgICAgaWYgKGFkbWluRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBpbnN0cnVtZW50QWRtaW4gPSBhZG1pbkRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgIGNvbnN0IGlkRGF0YSA9IGdldEZpZWxkKGluc3RydW1lbnRGaWVsZHMsICdpZCcpO1xuICAgICAgICBpZiAoaWREYXRhPy5vbmVvZktpbmQgPT09ICd0ZXh0JykgaW5zdHJ1bWVudElkID0gaWREYXRhLnRleHQgPz8gJyc7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHN3aXRjaCAodHhUeXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5PbmVTdGVwUHJlQXBwcm92YWw6IHtcbiAgICAgICAgLy8gQ2FudG9uIGNvaW46IFRyYW5zZmVyUHJlYXBwcm92YWxQcm9wb3NhbCBjcmVhdGUgbm9kZSDihpIgcHJvdmlkZXI9c2VuZGVyLCByZWNlaXZlclxuICAgICAgICBjb25zdCBjb2luRmllbGRzID0gZmluZENyZWF0ZU5vZGVGaWVsZHMoJ1RyYW5zZmVyUHJlYXBwcm92YWxQcm9wb3NhbCcpO1xuICAgICAgICBpZiAoY29pbkZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IHByb3ZpZGVyRGF0YSA9IGdldEZpZWxkKGNvaW5GaWVsZHMsICdwcm92aWRlcicpO1xuICAgICAgICAgIGlmIChwcm92aWRlckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5Jykgc2VuZGVyID0gcHJvdmlkZXJEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIGNvbnN0IHJlY2VpdmVyRGF0YSA9IGdldEZpZWxkKGNvaW5GaWVsZHMsICdyZWNlaXZlcicpO1xuICAgICAgICAgIGlmIChyZWNlaXZlckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgcmVjZWl2ZXIgPSByZWNlaXZlckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgYW1vdW50ID0gJzAnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRva2VuOiBUcmFuc2ZlclByZWFwcHJvdmFsIGNyZWF0ZSBub2RlIOKGkiBvcGVyYXRvcj1zZW5kZXIsIHJlY2VpdmVyLCBpbnN0cnVtZW50QWRtaW4sIGluc3RydW1lbnRBbGxvd2FuY2VzXG4gICAgICAgIGNvbnN0IHRva2VuRmllbGRzID0gZmluZENyZWF0ZU5vZGVGaWVsZHMoJ1RyYW5zZmVyUHJlYXBwcm92YWwnKTtcbiAgICAgICAgaWYgKHRva2VuRmllbGRzKSB7XG4gICAgICAgICAgY29uc3Qgb3BlcmF0b3JEYXRhID0gZ2V0RmllbGQodG9rZW5GaWVsZHMsICdvcGVyYXRvcicpO1xuICAgICAgICAgIGlmIChvcGVyYXRvckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5Jykgc2VuZGVyID0gb3BlcmF0b3JEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIGNvbnN0IHJlY2VpdmVyRGF0YSA9IGdldEZpZWxkKHRva2VuRmllbGRzLCAncmVjZWl2ZXInKTtcbiAgICAgICAgICBpZiAocmVjZWl2ZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHJlY2VpdmVyID0gcmVjZWl2ZXJEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIGFtb3VudCA9ICcwJztcbiAgICAgICAgICBjb25zdCBpbnN0cnVtZW50QWRtaW5EYXRhID0gZ2V0RmllbGQodG9rZW5GaWVsZHMsICdpbnN0cnVtZW50QWRtaW4nKTtcbiAgICAgICAgICBpZiAoaW5zdHJ1bWVudEFkbWluRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBpbnN0cnVtZW50QWRtaW4gPSBpbnN0cnVtZW50QWRtaW5EYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIGNvbnN0IGFsbG93YW5jZXNEYXRhID0gZ2V0RmllbGQodG9rZW5GaWVsZHMsICdpbnN0cnVtZW50QWxsb3dhbmNlcycpO1xuICAgICAgICAgIGlmIChhbGxvd2FuY2VzRGF0YT8ub25lb2ZLaW5kID09PSAnbGlzdCcpIHtcbiAgICAgICAgICAgIC8vIGZvciB0aGUgc2FtZSBpbnN0cnVtZW50IGFkbWluLCBpZiBtdWx0aXBsZSB0b2tlbnMgYXJlIHN1cHBvcnRlZCB0aGVuIHdlIGNhbiBlbmFibGUgYWxsIG9mIHRoZW0sXG4gICAgICAgICAgICAvLyBidXQgd2Ugd29uJ3QgYmUgZG9pbmcgdGhhdCBmb3Igbm93XG4gICAgICAgICAgICBjb25zdCBmaXJzdEFsbG93YW5jZSA9IGFsbG93YW5jZXNEYXRhLmxpc3Q/LmVsZW1lbnRzPy5bMF0/LnN1bTtcbiAgICAgICAgICAgIGlmIChmaXJzdEFsbG93YW5jZT8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgICBjb25zdCBhbGxvd2FuY2VGaWVsZHMgPSBmaXJzdEFsbG93YW5jZS5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgICAgICAgY29uc3QgaWREYXRhID0gZ2V0RmllbGQoYWxsb3dhbmNlRmllbGRzLCAnaWQnKTtcbiAgICAgICAgICAgICAgaWYgKGlkRGF0YT8ub25lb2ZLaW5kID09PSAndGV4dCcpIGluc3RydW1lbnRJZCA9IGlkRGF0YS50ZXh0ID8/ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXJBY2NlcHQ6IHtcbiAgICAgICAgLy8gQ2FudG9uIGNvaW46IEFtdWxldCBjcmVhdGUgbm9kZSDihpIgZHNvPXNlbmRlciwgb3duZXI9cmVjZWl2ZXIsIGFtb3VudC5pbml0aWFsQW1vdW50XG4gICAgICAgIGNvbnN0IGFtdWxldEZpZWxkcyA9IGZpbmRDcmVhdGVOb2RlRmllbGRzKCdBbXVsZXQnKTtcbiAgICAgICAgaWYgKGFtdWxldEZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IGRzb0RhdGEgPSBnZXRGaWVsZChhbXVsZXRGaWVsZHMsICdkc28nKTtcbiAgICAgICAgICBpZiAoZHNvRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBzZW5kZXIgPSBkc29EYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIGNvbnN0IG93bmVyRGF0YSA9IGdldEZpZWxkKGFtdWxldEZpZWxkcywgJ293bmVyJyk7XG4gICAgICAgICAgaWYgKG93bmVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSByZWNlaXZlciA9IG93bmVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICBjb25zdCBhbW91bnRGaWVsZCA9IGdldEZpZWxkKGFtdWxldEZpZWxkcywgJ2Ftb3VudCcpO1xuICAgICAgICAgIGlmIChhbW91bnRGaWVsZD8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgY29uc3QgaW5pdGlhbEFtb3VudERhdGEgPSBnZXRGaWVsZChhbW91bnRGaWVsZC5yZWNvcmQ/LmZpZWxkcyA/PyBbXSwgJ2luaXRpYWxBbW91bnQnKTtcbiAgICAgICAgICAgIGlmIChpbml0aWFsQW1vdW50RGF0YT8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIGFtb3VudCA9IGluaXRpYWxBbW91bnREYXRhLm51bWVyaWMgPz8gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlZ3VsYXIgdG9rZW4gKG5vbi1jYnRjKTogRXhlY3V0ZWRUcmFuc2ZlciBjcmVhdGUgbm9kZVxuICAgICAgICAvLyDihpIgdHJhbnNmZXIue3NlbmRlciwgcmVjZWl2ZXIsIGFtb3VudCwgaW5zdHJ1bWVudElkZW50aWZpZXIue3NvdXJjZT1hZG1pbiwgaWR9fVxuICAgICAgICBjb25zdCBleGVjdXRlZFRyYW5zZmVyRmllbGRzID0gZmluZENyZWF0ZU5vZGVGaWVsZHMoJ0V4ZWN1dGVkVHJhbnNmZXInKTtcbiAgICAgICAgaWYgKGV4ZWN1dGVkVHJhbnNmZXJGaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCB0cmFuc2ZlclN1bSA9IGdldEZpZWxkKGV4ZWN1dGVkVHJhbnNmZXJGaWVsZHMsICd0cmFuc2ZlcicpO1xuICAgICAgICAgIGlmICh0cmFuc2ZlclN1bT8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgZXh0cmFjdEZyb21UcmFuc2ZlclJlY29yZCh0cmFuc2ZlclN1bS5yZWNvcmQ/LmZpZWxkcyA/PyBbXSwgJ2luc3RydW1lbnRJZGVudGlmaWVyJywgJ3NvdXJjZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBjYnRjIHRva2VuIGZhbGxiYWNrOiBUcmFuc2ZlclJ1bGVfRGlyZWN0VHJhbnNmZXIgZXhlcmNpc2Ugbm9kZVxuICAgICAgICAvLyDihpIgdHJhbnNmZXIue3NlbmRlciwgcmVjZWl2ZXIsIGFtb3VudCwgaW5zdHJ1bWVudElkLnthZG1pbiwgaWR9fVxuICAgICAgICBjb25zdCBkaXJlY3RUcmFuc2ZlckZpZWxkcyA9IGZpbmRFeGVyY2lzZU5vZGVGaWVsZHMoJ1RyYW5zZmVyUnVsZV9EaXJlY3RUcmFuc2ZlcicpO1xuICAgICAgICBpZiAoZGlyZWN0VHJhbnNmZXJGaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCB0cmFuc2ZlclN1bSA9IGdldEZpZWxkKGRpcmVjdFRyYW5zZmVyRmllbGRzLCAndHJhbnNmZXInKTtcbiAgICAgICAgICBpZiAodHJhbnNmZXJTdW0/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgIGV4dHJhY3RGcm9tVHJhbnNmZXJSZWNvcmQodHJhbnNmZXJTdW0ucmVjb3JkPy5maWVsZHMgPz8gW10sICdpbnN0cnVtZW50SWQnLCAnYWRtaW4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVVNEQ3gvdHdvLXN0ZXAgdG9rZW4gZmFsbGJhY2s6IFRyYW5zZmVyUnVsZV9Ud29TdGVwVHJhbnNmZXIgZXhlcmNpc2Ugbm9kZVxuICAgICAgICAvLyDihpIgdHJhbnNmZXIue3NlbmRlciwgcmVjZWl2ZXIsIGFtb3VudCwgaW5zdHJ1bWVudElkLnthZG1pbiwgaWR9fVxuICAgICAgICBpZiAoIXNlbmRlcikge1xuICAgICAgICAgIGNvbnN0IHR3b1N0ZXBUcmFuc2ZlckZpZWxkcyA9IGZpbmRFeGVyY2lzZU5vZGVGaWVsZHMoJ1RyYW5zZmVyUnVsZV9Ud29TdGVwVHJhbnNmZXInKTtcbiAgICAgICAgICBpZiAodHdvU3RlcFRyYW5zZmVyRmllbGRzKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2ZlclN1bSA9IGdldEZpZWxkKHR3b1N0ZXBUcmFuc2ZlckZpZWxkcywgJ3RyYW5zZmVyJyk7XG4gICAgICAgICAgICBpZiAodHJhbnNmZXJTdW0/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgICAgZXh0cmFjdEZyb21UcmFuc2ZlclJlY29yZCh0cmFuc2ZlclN1bS5yZWNvcmQ/LmZpZWxkcyA/PyBbXSwgJ2luc3RydW1lbnRJZCcsICdhZG1pbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXJSZWplY3Q6IHtcbiAgICAgICAgLy8gQ2FudG9uIGNvaW46IEFtdWxldCBjcmVhdGUgbm9kZSDihpIgZHNvPXNlbmRlciwgb3duZXI9cmVjZWl2ZXIsIGFtb3VudC5pbml0aWFsQW1vdW50XG4gICAgICAgIGNvbnN0IGFtdWxldEZpZWxkcyA9IGZpbmRDcmVhdGVOb2RlRmllbGRzKCdBbXVsZXQnKTtcbiAgICAgICAgaWYgKGFtdWxldEZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IGRzb0RhdGEgPSBnZXRGaWVsZChhbXVsZXRGaWVsZHMsICdkc28nKTtcbiAgICAgICAgICBpZiAoZHNvRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBzZW5kZXIgPSBkc29EYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIGNvbnN0IG93bmVyRGF0YSA9IGdldEZpZWxkKGFtdWxldEZpZWxkcywgJ293bmVyJyk7XG4gICAgICAgICAgaWYgKG93bmVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSByZWNlaXZlciA9IG93bmVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICBjb25zdCBhbW91bnRGaWVsZCA9IGdldEZpZWxkKGFtdWxldEZpZWxkcywgJ2Ftb3VudCcpO1xuICAgICAgICAgIGlmIChhbW91bnRGaWVsZD8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgY29uc3QgaW5pdGlhbEFtb3VudERhdGEgPSBnZXRGaWVsZChhbW91bnRGaWVsZC5yZWNvcmQ/LmZpZWxkcyA/PyBbXSwgJ2luaXRpYWxBbW91bnQnKTtcbiAgICAgICAgICAgIGlmIChpbml0aWFsQW1vdW50RGF0YT8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIGFtb3VudCA9IGluaXRpYWxBbW91bnREYXRhLm51bWVyaWMgPz8gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlZ3VsYXIgdG9rZW4gKG5vbi1jYnRjKTogUmVqZWN0ZWRUcmFuc2ZlciBjcmVhdGUgbm9kZVxuICAgICAgICAvLyDihpIgdHJhbnNmZXIue3NlbmRlciwgcmVjZWl2ZXIsIGFtb3VudCwgaW5zdHJ1bWVudElkZW50aWZpZXIue3NvdXJjZT1hZG1pbiwgaWR9fVxuICAgICAgICBjb25zdCByZWplY3RlZFRyYW5zZmVyRmllbGRzID0gZmluZENyZWF0ZU5vZGVGaWVsZHMoJ1JlamVjdGVkVHJhbnNmZXInKTtcbiAgICAgICAgaWYgKHJlamVjdGVkVHJhbnNmZXJGaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCB0cmFuc2ZlclN1bSA9IGdldEZpZWxkKHJlamVjdGVkVHJhbnNmZXJGaWVsZHMsICd0cmFuc2ZlcicpO1xuICAgICAgICAgIGlmICh0cmFuc2ZlclN1bT8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgZXh0cmFjdEZyb21UcmFuc2ZlclJlY29yZCh0cmFuc2ZlclN1bS5yZWNvcmQ/LmZpZWxkcyA/PyBbXSwgJ2luc3RydW1lbnRJZGVudGlmaWVyJywgJ3NvdXJjZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBjYnRjIHRva2VuIGZhbGxiYWNrOiBIb2xkaW5nIGNyZWF0ZSBub2RlIChvd25lcj1zZW5kZXIsIGluc3RydW1lbnQsIGFtb3VudClcbiAgICAgICAgLy8gKyBUcmFuc2Zlckluc3RydWN0aW9uX1JlamVjdCBleGVyY2lzZSAoYWN0aW5nUGFydGllc1swXT1yZWNlaXZlciB3aG8gcmVqZWN0ZWQpXG4gICAgICAgIGNvbnN0IGhvbGRpbmdGaWVsZHMgPSBmaW5kQ3JlYXRlTm9kZUZpZWxkcygnSG9sZGluZycpO1xuICAgICAgICBpZiAoaG9sZGluZ0ZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IG93bmVyRGF0YSA9IGdldEZpZWxkKGhvbGRpbmdGaWVsZHMsICdvd25lcicpO1xuICAgICAgICAgIGlmIChvd25lckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5Jykgc2VuZGVyID0gb3duZXJEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIGNvbnN0IGFtb3VudERhdGEgPSBnZXRGaWVsZChob2xkaW5nRmllbGRzLCAnYW1vdW50Jyk7XG4gICAgICAgICAgaWYgKGFtb3VudERhdGE/Lm9uZW9mS2luZCA9PT0gJ251bWVyaWMnKSBhbW91bnQgPSBhbW91bnREYXRhLm51bWVyaWMgPz8gJyc7XG4gICAgICAgICAgY29uc3QgaW5zdHJ1bWVudERhdGEgPSBnZXRGaWVsZChob2xkaW5nRmllbGRzLCAnaW5zdHJ1bWVudCcpO1xuICAgICAgICAgIGlmIChpbnN0cnVtZW50RGF0YT8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgY29uc3QgaW5zdHJ1bWVudEZpZWxkcyA9IGluc3RydW1lbnREYXRhLnJlY29yZD8uZmllbGRzID8/IFtdO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlRGF0YSA9IGdldEZpZWxkKGluc3RydW1lbnRGaWVsZHMsICdzb3VyY2UnKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIGluc3RydW1lbnRBZG1pbiA9IHNvdXJjZURhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgICBjb25zdCBpZERhdGEgPSBnZXRGaWVsZChpbnN0cnVtZW50RmllbGRzLCAnaWQnKTtcbiAgICAgICAgICAgIGlmIChpZERhdGE/Lm9uZW9mS2luZCA9PT0gJ3RleHQnKSBpbnN0cnVtZW50SWQgPSBpZERhdGEudGV4dCA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVjZWl2ZXJQYXJ0eSA9IGZpbmRFeGVyY2lzZUFjdGluZ1BhcnR5KCdUcmFuc2Zlckluc3RydWN0aW9uX1JlamVjdCcpO1xuICAgICAgICAgIGlmIChyZWNlaXZlclBhcnR5KSByZWNlaXZlciA9IHJlY2VpdmVyUGFydHk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bjoge1xuICAgICAgICAvLyBIb2xkaW5nIGNyZWF0ZSBub2RlIOKGkiBvd25lcj1zZW5kZXI9cmVjZWl2ZXIgKGFsbG9jYXRpbmcgcGFydHkgZ2V0cyB0aGVpciBob2xkaW5nIGJhY2spLFxuICAgICAgICAvLyBpbnN0cnVtZW50Lntzb3VyY2U9YWRtaW4sIGlkfSwgYW1vdW50XG4gICAgICAgIGNvbnN0IGhvbGRpbmdGaWVsZHMgPSBmaW5kQ3JlYXRlTm9kZUZpZWxkcygnSG9sZGluZycpO1xuICAgICAgICBpZiAoaG9sZGluZ0ZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IG93bmVyRGF0YSA9IGdldEZpZWxkKGhvbGRpbmdGaWVsZHMsICdvd25lcicpO1xuICAgICAgICAgIGlmIChvd25lckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5Jykge1xuICAgICAgICAgICAgcmVjZWl2ZXIgPSBvd25lckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgICBzZW5kZXIgPSByZWNlaXZlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYW1vdW50RGF0YSA9IGdldEZpZWxkKGhvbGRpbmdGaWVsZHMsICdhbW91bnQnKTtcbiAgICAgICAgICBpZiAoYW1vdW50RGF0YT8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIGFtb3VudCA9IGFtb3VudERhdGEubnVtZXJpYyA/PyAnJztcbiAgICAgICAgICBjb25zdCBpbnN0cnVtZW50RGF0YSA9IGdldEZpZWxkKGhvbGRpbmdGaWVsZHMsICdpbnN0cnVtZW50Jyk7XG4gICAgICAgICAgaWYgKGluc3RydW1lbnREYXRhPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICBjb25zdCBpbnN0cnVtZW50RmllbGRzID0gaW5zdHJ1bWVudERhdGEucmVjb3JkPy5maWVsZHMgPz8gW107XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VEYXRhID0gZ2V0RmllbGQoaW5zdHJ1bWVudEZpZWxkcywgJ3NvdXJjZScpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZURhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgaW5zdHJ1bWVudEFkbWluID0gc291cmNlRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IGlkRGF0YSA9IGdldEZpZWxkKGluc3RydW1lbnRGaWVsZHMsICdpZCcpO1xuICAgICAgICAgICAgaWYgKGlkRGF0YT8ub25lb2ZLaW5kID09PSAndGV4dCcpIGluc3RydW1lbnRJZCA9IGlkRGF0YS50ZXh0ID8/ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWxsb2NhdGlvbkFsbG9jYXRlOiB7XG4gICAgICAgIC8vIER2cExlZ0FsbG9jYXRpb24gY3JlYXRlIG5vZGUg4oaSIGFsbG9jYXRpb24udHJhbnNmZXJMZWcgY29udGFpbnMgdGhlIGZ1bGwgc2V0dGxlbWVudCB0cmFuc2ZlciBkZXRhaWxzOlxuICAgICAgICAvLyBzZW5kZXIsIHJlY2VpdmVyICh0aGUgYWN0dWFsIHNldHRsZW1lbnQgY291bnRlcnBhcnR5KSwgYW1vdW50LCBhbmQgaW5zdHJ1bWVudElkXG4gICAgICAgIGNvbnN0IGR2cEZpZWxkcyA9IGZpbmRDcmVhdGVOb2RlRmllbGRzKCdEdnBMZWdBbGxvY2F0aW9uJyk7XG4gICAgICAgIGlmIChkdnBGaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBhbGxvY2F0aW9uRmllbGQgPSBnZXRGaWVsZChkdnBGaWVsZHMsICdhbGxvY2F0aW9uJyk7XG4gICAgICAgICAgaWYgKGFsbG9jYXRpb25GaWVsZD8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgY29uc3QgYWxsb2NhdGlvbkZpZWxkcyA9IGFsbG9jYXRpb25GaWVsZC5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZmVyTGVnRmllbGQgPSBnZXRGaWVsZChhbGxvY2F0aW9uRmllbGRzLCAndHJhbnNmZXJMZWcnKTtcbiAgICAgICAgICAgIGlmICh0cmFuc2ZlckxlZ0ZpZWxkPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRyYW5zZmVyTGVnRmllbGRzID0gdHJhbnNmZXJMZWdGaWVsZC5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgICAgICAgY29uc3Qgc2VuZGVyRGF0YSA9IGdldEZpZWxkKHRyYW5zZmVyTGVnRmllbGRzLCAnc2VuZGVyJyk7XG4gICAgICAgICAgICAgIGlmIChzZW5kZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHNlbmRlciA9IHNlbmRlckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgICAgIGNvbnN0IHJlY2VpdmVyRGF0YSA9IGdldEZpZWxkKHRyYW5zZmVyTGVnRmllbGRzLCAncmVjZWl2ZXInKTtcbiAgICAgICAgICAgICAgaWYgKHJlY2VpdmVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSByZWNlaXZlciA9IHJlY2VpdmVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICAgICAgY29uc3QgYW1vdW50RGF0YSA9IGdldEZpZWxkKHRyYW5zZmVyTGVnRmllbGRzLCAnYW1vdW50Jyk7XG4gICAgICAgICAgICAgIGlmIChhbW91bnREYXRhPy5vbmVvZktpbmQgPT09ICdudW1lcmljJykgYW1vdW50ID0gYW1vdW50RGF0YS5udW1lcmljID8/ICcnO1xuICAgICAgICAgICAgICBjb25zdCBpbnN0cnVtZW50SWRGaWVsZCA9IGdldEZpZWxkKHRyYW5zZmVyTGVnRmllbGRzLCAnaW5zdHJ1bWVudElkJyk7XG4gICAgICAgICAgICAgIGlmIChpbnN0cnVtZW50SWRGaWVsZD8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydW1lbnRJZEZpZWxkcyA9IGluc3RydW1lbnRJZEZpZWxkLnJlY29yZD8uZmllbGRzID8/IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkbWluRGF0YSA9IGdldEZpZWxkKGluc3RydW1lbnRJZEZpZWxkcywgJ2FkbWluJyk7XG4gICAgICAgICAgICAgICAgaWYgKGFkbWluRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBpbnN0cnVtZW50QWRtaW4gPSBhZG1pbkRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgICAgICAgY29uc3QgaWREYXRhID0gZ2V0RmllbGQoaW5zdHJ1bWVudElkRmllbGRzLCAnaWQnKTtcbiAgICAgICAgICAgICAgICBpZiAoaWREYXRhPy5vbmVvZktpbmQgPT09ICd0ZXh0JykgaW5zdHJ1bWVudElkID0gaWREYXRhLnRleHQgPz8gJyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFsbGJhY2s6IGlmIER2cExlZ0FsbG9jYXRpb24gaXMgYWJzZW50LCB1c2UgdGhlIG9wZXJhdG9yIGFzIHJlY2VpdmVyXG4gICAgICAgIGlmICghcmVjZWl2ZXIpIHtcbiAgICAgICAgICBjb25zdCBhbGxvY2F0ZUZpZWxkcyA9IGZpbmRFeGVyY2lzZU5vZGVGaWVsZHMoJ0FsbG9jYXRpb25GYWN0b3J5X0FsbG9jYXRlJyk7XG4gICAgICAgICAgaWYgKGFsbG9jYXRlRmllbGRzKSB7XG4gICAgICAgICAgICBjb25zdCBhZG1pbkRhdGEgPSBnZXRGaWVsZChhbGxvY2F0ZUZpZWxkcywgJ2V4cGVjdGVkQWRtaW4nKTtcbiAgICAgICAgICAgIGlmIChhZG1pbkRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgcmVjZWl2ZXIgPSBhZG1pbkRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghc2VuZGVyKSB7XG4gICAgICAgICAgY29uc3Qgc2VuZGVyUGFydHkgPSBmaW5kRXhlcmNpc2VBY3RpbmdQYXJ0eSgnQWxsb2NhdGlvbkZhY3RvcnlfQWxsb2NhdGUnKTtcbiAgICAgICAgICBpZiAoc2VuZGVyUGFydHkpIHNlbmRlciA9IHNlbmRlclBhcnR5O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BbGxvY2F0aW9uUmVqZWN0OiB7XG4gICAgICAgIC8vIFJlamVjdGVkRHZwIGNyZWF0ZSBub2RlIOKGkiBkdnAue3NlbGxlcj1zZW5kZXIsIGJ1eWVyPXJlY2VpdmVyLCB0ZXJtcy5kZWxpdmVyaWVzWzBdLnthbW91bnQsIGluc3RydW1lbnQue2FkbWluLCBpZH19fVxuICAgICAgICBjb25zdCByZWplY3RlZER2cEZpZWxkcyA9IGZpbmRDcmVhdGVOb2RlRmllbGRzKCdSZWplY3RlZER2cCcpO1xuICAgICAgICBpZiAocmVqZWN0ZWREdnBGaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBkdnBGaWVsZCA9IGdldEZpZWxkKHJlamVjdGVkRHZwRmllbGRzLCAnZHZwJyk7XG4gICAgICAgICAgaWYgKGR2cEZpZWxkPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICBjb25zdCBkdnBGaWVsZHMgPSBkdnBGaWVsZC5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGxlckRhdGEgPSBnZXRGaWVsZChkdnBGaWVsZHMsICdzZWxsZXInKTtcbiAgICAgICAgICAgIGlmIChzZWxsZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHNlbmRlciA9IHNlbGxlckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgICBjb25zdCBidXllckRhdGEgPSBnZXRGaWVsZChkdnBGaWVsZHMsICdidXllcicpO1xuICAgICAgICAgICAgaWYgKGJ1eWVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSByZWNlaXZlciA9IGJ1eWVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IHRlcm1zRmllbGQgPSBnZXRGaWVsZChkdnBGaWVsZHMsICd0ZXJtcycpO1xuICAgICAgICAgICAgaWYgKHRlcm1zRmllbGQ/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgICAgY29uc3QgdGVybXNGaWVsZHMgPSB0ZXJtc0ZpZWxkLnJlY29yZD8uZmllbGRzID8/IFtdO1xuICAgICAgICAgICAgICBjb25zdCBkZWxpdmVyaWVzRmllbGQgPSBnZXRGaWVsZCh0ZXJtc0ZpZWxkcywgJ2RlbGl2ZXJpZXMnKTtcbiAgICAgICAgICAgICAgaWYgKGRlbGl2ZXJpZXNGaWVsZD8ub25lb2ZLaW5kID09PSAnbGlzdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdERlbGl2ZXJ5ID0gZGVsaXZlcmllc0ZpZWxkLmxpc3Q/LmVsZW1lbnRzPy5bMF0/LnN1bTtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3REZWxpdmVyeT8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZGVsaXZlcnlGaWVsZHMgPSBmaXJzdERlbGl2ZXJ5LnJlY29yZD8uZmllbGRzID8/IFtdO1xuICAgICAgICAgICAgICAgICAgY29uc3QgYW1vdW50RGF0YSA9IGdldEZpZWxkKGRlbGl2ZXJ5RmllbGRzLCAnYW1vdW50Jyk7XG4gICAgICAgICAgICAgICAgICBpZiAoYW1vdW50RGF0YT8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIGFtb3VudCA9IGFtb3VudERhdGEubnVtZXJpYyA/PyAnJztcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydW1lbnRGaWVsZCA9IGdldEZpZWxkKGRlbGl2ZXJ5RmllbGRzLCAnaW5zdHJ1bWVudCcpO1xuICAgICAgICAgICAgICAgICAgaWYgKGluc3RydW1lbnRGaWVsZD8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVtZW50RmllbGRzID0gaW5zdHJ1bWVudEZpZWxkLnJlY29yZD8uZmllbGRzID8/IFtdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZG1pbkRhdGEgPSBnZXRGaWVsZChpbnN0cnVtZW50RmllbGRzLCAnYWRtaW4nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkbWluRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBpbnN0cnVtZW50QWRtaW4gPSBhZG1pbkRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkRGF0YSA9IGdldEZpZWxkKGluc3RydW1lbnRGaWVsZHMsICdpZCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaWREYXRhPy5vbmVvZktpbmQgPT09ICd0ZXh0JykgaW5zdHJ1bWVudElkID0gaWREYXRhLnRleHQgPz8gJyc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5Db3NpZ25EZWxlZ2F0aW9uQWNjZXB0OiB7XG4gICAgICAgIC8vIFRyYWRlV2ViOiBDb3NpZ25pbmdEZWxlZ2F0aW9uUHJvcG9zYWxfQWNjZXB0OyBUZW1wbGU6IEFjY2VwdERlbGVnYXRpb25Qcm9wb3NhbC5cbiAgICAgICAgY29uc3Qgc2lnbmVyUGFydHkgPVxuICAgICAgICAgIGZpbmRFeGVyY2lzZUFjdGluZ1BhcnR5KCdDb3NpZ25pbmdEZWxlZ2F0aW9uUHJvcG9zYWxfQWNjZXB0JykgPz9cbiAgICAgICAgICBmaW5kRXhlcmNpc2VBY3RpbmdQYXJ0eSgnQWNjZXB0RGVsZWdhdGlvblByb3Bvc2FsJyk7XG4gICAgICAgIGlmIChzaWduZXJQYXJ0eSkgc2VuZGVyID0gc2lnbmVyUGFydHk7XG5cbiAgICAgICAgLy8gVHJhZGVXZWIgY3JlYXRlcyBDb3NpZ25pbmdEZWxlZ2F0aW9uIHsgYWRtaW4sIHNpZ25lciB9OyBUZW1wbGUgY3JlYXRlc1xuICAgICAgICAvLyBEZWxlZ2F0aW9uIHsgb3BlcmF0b3IsIHVzZXIgfSBmcm9tIHRoZSBzYW1lIGFjY2VwdGFuY2Ugb3BlcmF0aW9uLlxuICAgICAgICBjb25zdCBkZWxlZ2F0aW9uRmllbGRzID0gZmluZENyZWF0ZU5vZGVGaWVsZHMoJ0Nvc2lnbmluZ0RlbGVnYXRpb24nKSA/PyBmaW5kQ3JlYXRlTm9kZUZpZWxkcygnRGVsZWdhdGlvbicpO1xuICAgICAgICBpZiAoZGVsZWdhdGlvbkZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IGFkbWluRGF0YSA9IGdldEZpZWxkKGRlbGVnYXRpb25GaWVsZHMsICdhZG1pbicpID8/IGdldEZpZWxkKGRlbGVnYXRpb25GaWVsZHMsICdvcGVyYXRvcicpO1xuICAgICAgICAgIGlmIChhZG1pbkRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgcmVjZWl2ZXIgPSBhZG1pbkRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgIH1cbiAgICAgICAgYW1vdW50ID0gJzAnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXJPZmZlcldpdGhkcmF3bjoge1xuICAgICAgICAvLyBDYW50b24gY29pbjogQW11bGV0IGNyZWF0ZSBub2RlIOKGkiBvd25lcj1zZW5kZXI9cmVjZWl2ZXIsIGFtb3VudC5pbml0aWFsQW1vdW50XG4gICAgICAgIGNvbnN0IGFtdWxldEZpZWxkcyA9IGZpbmRDcmVhdGVOb2RlRmllbGRzKCdBbXVsZXQnKTtcbiAgICAgICAgaWYgKGFtdWxldEZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IG93bmVyRGF0YSA9IGdldEZpZWxkKGFtdWxldEZpZWxkcywgJ293bmVyJyk7XG4gICAgICAgICAgaWYgKG93bmVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSB7XG4gICAgICAgICAgICByZWNlaXZlciA9IG93bmVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICAgIHNlbmRlciA9IHJlY2VpdmVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhbW91bnRGaWVsZCA9IGdldEZpZWxkKGFtdWxldEZpZWxkcywgJ2Ftb3VudCcpO1xuICAgICAgICAgIGlmIChhbW91bnRGaWVsZD8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgY29uc3QgaW5pdGlhbEFtb3VudERhdGEgPSBnZXRGaWVsZChhbW91bnRGaWVsZC5yZWNvcmQ/LmZpZWxkcyA/PyBbXSwgJ2luaXRpYWxBbW91bnQnKTtcbiAgICAgICAgICAgIGlmIChpbml0aWFsQW1vdW50RGF0YT8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIGFtb3VudCA9IGluaXRpYWxBbW91bnREYXRhLm51bWVyaWMgPz8gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRva2VuOiBIb2xkaW5nIGNyZWF0ZSBub2RlIOKGkiBvd25lcj1zZW5kZXI9cmVjZWl2ZXIsIGluc3RydW1lbnQue3NvdXJjZT1hZG1pbiwgaWR9LCBhbW91bnRcbiAgICAgICAgY29uc3QgaG9sZGluZ0ZpZWxkcyA9IGZpbmRDcmVhdGVOb2RlRmllbGRzKCdIb2xkaW5nJyk7XG4gICAgICAgIGlmIChob2xkaW5nRmllbGRzKSB7XG4gICAgICAgICAgY29uc3Qgb3duZXJEYXRhID0gZ2V0RmllbGQoaG9sZGluZ0ZpZWxkcywgJ293bmVyJyk7XG4gICAgICAgICAgaWYgKG93bmVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSB7XG4gICAgICAgICAgICByZWNlaXZlciA9IG93bmVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICAgIHNlbmRlciA9IHJlY2VpdmVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhbW91bnREYXRhID0gZ2V0RmllbGQoaG9sZGluZ0ZpZWxkcywgJ2Ftb3VudCcpO1xuICAgICAgICAgIGlmIChhbW91bnREYXRhPy5vbmVvZktpbmQgPT09ICdudW1lcmljJykgYW1vdW50ID0gYW1vdW50RGF0YS5udW1lcmljID8/ICcnO1xuICAgICAgICAgIGNvbnN0IGluc3RydW1lbnREYXRhID0gZ2V0RmllbGQoaG9sZGluZ0ZpZWxkcywgJ2luc3RydW1lbnQnKTtcbiAgICAgICAgICBpZiAoaW5zdHJ1bWVudERhdGE/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RydW1lbnRGaWVsZHMgPSBpbnN0cnVtZW50RGF0YS5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZURhdGEgPSBnZXRGaWVsZChpbnN0cnVtZW50RmllbGRzLCAnc291cmNlJyk7XG4gICAgICAgICAgICBpZiAoc291cmNlRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBpbnN0cnVtZW50QWRtaW4gPSBzb3VyY2VEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgICAgY29uc3QgaWREYXRhID0gZ2V0RmllbGQoaW5zdHJ1bWVudEZpZWxkcywgJ2lkJyk7XG4gICAgICAgICAgICBpZiAoaWREYXRhPy5vbmVvZktpbmQgPT09ICd0ZXh0JykgaW5zdHJ1bWVudElkID0gaWREYXRhLnRleHQgPz8gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlclByZWFwcHJvdmFsQ2FuY2VsOiB7XG4gICAgICAgIC8vIENvaW4gY2FuY2VsOiBUcmFuc2ZlclByZWFwcHJvdmFsX0NhbmNlbCBleGVyY2lzZSBvbiBTcGxpY2UuQW11bGV0UnVsZXM6VHJhbnNmZXJQcmVhcHByb3ZhbC5cbiAgICAgICAgLy8gU2VsZi1zZXJ2aWNlIOKAlCB0aGUgYWN0aW5nIHBhcnR5IChvciwgYXMgYSBmYWxsYmFjaywgdGhlIGV4ZXJjaXNlZCBjaG9pY2VBcmd1bWVudC5wKSBpc1xuICAgICAgICAvLyBib3RoIHNlbmRlciBhbmQgcmVjZWl2ZXIuXG4gICAgICAgIGNvbnN0IGFjdGluZ1BhcnR5ID0gZmluZEV4ZXJjaXNlQWN0aW5nUGFydHkoJ1RyYW5zZmVyUHJlYXBwcm92YWxfQ2FuY2VsJyk7XG4gICAgICAgIGlmIChhY3RpbmdQYXJ0eSkge1xuICAgICAgICAgIHNlbmRlciA9IGFjdGluZ1BhcnR5O1xuICAgICAgICAgIHJlY2VpdmVyID0gYWN0aW5nUGFydHk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY2FuY2VsRmllbGRzID0gZmluZEV4ZXJjaXNlTm9kZUZpZWxkcygnVHJhbnNmZXJQcmVhcHByb3ZhbF9DYW5jZWwnKTtcbiAgICAgICAgICBpZiAoY2FuY2VsRmllbGRzKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0eURhdGEgPSBnZXRGaWVsZChjYW5jZWxGaWVsZHMsICdwJyk7XG4gICAgICAgICAgICBpZiAocGFydHlEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHtcbiAgICAgICAgICAgICAgc2VuZGVyID0gcGFydHlEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgICAgICByZWNlaXZlciA9IHNlbmRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVG9rZW4gY2FuY2VsOiBBcmNoaXZlIGV4ZXJjaXNlIG9uIFV0aWxpdHkuUmVnaXN0cnkuQXBwLlYwLk1vZGVsLlRyYW5zZmVyUHJlYXBwcm92YWwuXG4gICAgICAgICAgICAvLyBUaGUgYnVpbHQtaW4gQXJjaGl2ZSBjaG9pY2UgaGFzIGVtcHR5IGNob2ljZUFyZ3VtZW50IHt9LCBzbyB0aGUgYWN0aW5nIHBhcnR5IGlzXG4gICAgICAgICAgICAvLyB0aGUgb25seSB3YXkgdG8gcmVjb3ZlciB0aGUgY2FuY2VsbGluZyBwYXJ0eS5cbiAgICAgICAgICAgIGNvbnN0IHRva2VuQXJjaGl2ZVBhcnR5ID0gZmluZEV4ZXJjaXNlQWN0aW5nUGFydHkoJ0FyY2hpdmUnKTtcbiAgICAgICAgICAgIGlmICh0b2tlbkFyY2hpdmVQYXJ0eSkge1xuICAgICAgICAgICAgICBzZW5kZXIgPSB0b2tlbkFyY2hpdmVQYXJ0eTtcbiAgICAgICAgICAgICAgcmVjZWl2ZXIgPSB0b2tlbkFyY2hpdmVQYXJ0eTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYW1vdW50ID0gJzAnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBJbml0aWFsIHRyYW5zZmVyICgxLXN0ZXAgYW5kIDItc3RlcCwgY29pbiBhbmQgdG9rZW4pOiBUcmFuc2ZlckZhY3RvcnlfVHJhbnNmZXIgZXhlcmNpc2Ugbm9kZVxuICAgICAgICAvLyDihpIgdHJhbnNmZXIue3NlbmRlciwgcmVjZWl2ZXIsIGFtb3VudCwgaW5zdHJ1bWVudElkLnthZG1pbiwgaWR9LCBtZXRhfVxuICAgICAgICBjb25zdCB0cmFuc2ZlckZpZWxkcyA9IGZpbmRFeGVyY2lzZU5vZGVGaWVsZHMoJ1RyYW5zZmVyRmFjdG9yeV9UcmFuc2ZlcicpO1xuICAgICAgICBpZiAodHJhbnNmZXJGaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCB0cmFuc2ZlclN1bSA9IGdldEZpZWxkKHRyYW5zZmVyRmllbGRzLCAndHJhbnNmZXInKTtcbiAgICAgICAgICBpZiAodHJhbnNmZXJTdW0/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZmVyUmVjb3JkID0gdHJhbnNmZXJTdW0ucmVjb3JkPy5maWVsZHMgPz8gW107XG4gICAgICAgICAgICBleHRyYWN0RnJvbVRyYW5zZmVyUmVjb3JkKHRyYW5zZmVyUmVjb3JkLCAnaW5zdHJ1bWVudElkJywgJ2FkbWluJyk7XG4gICAgICAgICAgICBjb25zdCBtZXRhRmllbGQgPSBnZXRGaWVsZCh0cmFuc2ZlclJlY29yZCwgJ21ldGEnKTtcbiAgICAgICAgICAgIGlmIChtZXRhRmllbGQ/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWVzRmllbGQgPSBnZXRGaWVsZChtZXRhRmllbGQucmVjb3JkPy5maWVsZHMgPz8gW10sICd2YWx1ZXMnKTtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlc0ZpZWxkPy5vbmVvZktpbmQgPT09ICd0ZXh0TWFwJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lbW9FbnRyeSA9IHZhbHVlc0ZpZWxkLnRleHRNYXA/LmVudHJpZXMuZmluZChcbiAgICAgICAgICAgICAgICAgIChlKSA9PiBlLmtleSA9PT0gJ3NwbGljZS5sZmRlY2VudHJhbGl6ZWR0cnVzdC5vcmcvcmVhc29uJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKG1lbW9FbnRyeSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbWVtb1ZhbHVlID0gbWVtb0VudHJ5Py52YWx1ZT8uc3VtO1xuICAgICAgICAgICAgICAgICAgaWYgKG1lbW9WYWx1ZT8ub25lb2ZLaW5kID09PSAndGV4dCcpIG1lbW9JZCA9IG1lbW9WYWx1ZS50ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXNlbmRlciB8fCAhcmVjZWl2ZXIgfHwgIWFtb3VudCkge1xuICAgICAgY29uc3QgbWlzc2luZ0ZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICghc2VuZGVyKSBtaXNzaW5nRmllbGRzLnB1c2goJ3NlbmRlcicpO1xuICAgICAgaWYgKCFyZWNlaXZlcikgbWlzc2luZ0ZpZWxkcy5wdXNoKCdyZWNlaXZlcicpO1xuICAgICAgaWYgKCFhbW91bnQpIG1pc3NpbmdGaWVsZHMucHVzaCgnYW1vdW50Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdHJhbnNhY3Rpb24gZGF0YTogbWlzc2luZyAke21pc3NpbmdGaWVsZHMuam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29udmVydGVkQW1vdW50ID0gdGhpcy5jb252ZXJ0QW1vdW50VG9Mb3dlc3RVbml0KG5ldyBCaWdOdW1iZXIoYW1vdW50KSk7XG4gICAgY29uc3QgcGFyc2VkRGF0YTogUHJlcGFyZWRUeG5QYXJzZWRJbmZvID0ge1xuICAgICAgc2VuZGVyLFxuICAgICAgcmVjZWl2ZXIsXG4gICAgICBhbW91bnQ6IGNvbnZlcnRlZEFtb3VudCxcbiAgICB9O1xuICAgIGlmIChtZW1vSWQpIHtcbiAgICAgIHBhcnNlZERhdGEubWVtb0lkID0gbWVtb0lkO1xuICAgIH1cbiAgICBpZiAoaW5zdHJ1bWVudElkICYmIGluc3RydW1lbnRBZG1pbikge1xuICAgICAgcGFyc2VkRGF0YS50b2tlbiA9IHRoaXMuZmluZFRva2VuTmFtZUJ5Q29udHJhY3RBZGRyZXNzKGAke2luc3RydW1lbnRBZG1pbn06JHtpbnN0cnVtZW50SWR9YCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWREYXRhO1xuICB9XG5cbiAgLyoqIFBhcnNlcyBgXCJQa2c6TW9kdWxlOkVudGl0eVwiYCBpbnRvIHBhcnRzLiAqL1xuICBwYXJzZUNhbnRvblRlbXBsYXRlSWQodmFsdWU6IHN0cmluZyk6IHsgcGtnOiBzdHJpbmc7IG1vZHVsZU5hbWU6IHN0cmluZzsgZW50aXR5TmFtZTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc3BsaXQoJzonKTtcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IFtwa2csIG1vZHVsZU5hbWUsIGVudGl0eU5hbWVdID0gcGFydHM7XG4gICAgaWYgKCFwa2cgfHwgIW1vZHVsZU5hbWUgfHwgIWVudGl0eU5hbWUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgcGtnLCBtb2R1bGVOYW1lLCBlbnRpdHlOYW1lIH07XG4gIH1cblxuICBkYW1sVmFsdWVUb0pzb24odmFsdWU6IFZhbHVlIHwgdW5kZWZpbmVkKTogdW5rbm93biB7XG4gICAgaWYgKCF2YWx1ZSB8fCAhdmFsdWUuc3VtKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN1bSA9IHZhbHVlLnN1bTtcbiAgICBzd2l0Y2ggKHN1bS5vbmVvZktpbmQpIHtcbiAgICAgIGNhc2UgJ3VuaXQnOlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIGNhc2UgJ2Jvb2wnOlxuICAgICAgICByZXR1cm4gc3VtLmJvb2w7XG4gICAgICBjYXNlICdpbnQ2NCc6XG4gICAgICAgIHJldHVybiBzdW0uaW50NjQ7XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgcmV0dXJuIHN1bS5kYXRlO1xuICAgICAgY2FzZSAndGltZXN0YW1wJzpcbiAgICAgICAgcmV0dXJuIHN1bS50aW1lc3RhbXA7XG4gICAgICBjYXNlICdudW1lcmljJzpcbiAgICAgICAgcmV0dXJuIHN1bS5udW1lcmljO1xuICAgICAgY2FzZSAncGFydHknOlxuICAgICAgICByZXR1cm4gc3VtLnBhcnR5O1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgIHJldHVybiBzdW0udGV4dDtcbiAgICAgIGNhc2UgJ2NvbnRyYWN0SWQnOlxuICAgICAgICByZXR1cm4gc3VtLmNvbnRyYWN0SWQ7XG4gICAgICBjYXNlICdvcHRpb25hbCc6XG4gICAgICAgIHJldHVybiBzdW0ub3B0aW9uYWw/LnZhbHVlID8gdGhpcy5kYW1sVmFsdWVUb0pzb24oc3VtLm9wdGlvbmFsLnZhbHVlKSA6IG51bGw7XG4gICAgICBjYXNlICdsaXN0JzpcbiAgICAgICAgcmV0dXJuIChzdW0ubGlzdD8uZWxlbWVudHMgPz8gW10pLm1hcCgoZWwpID0+IHRoaXMuZGFtbFZhbHVlVG9Kc29uKGVsKSk7XG4gICAgICBjYXNlICd0ZXh0TWFwJzoge1xuICAgICAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc3VtLnRleHRNYXA/LmVudHJpZXMgPz8gW10pIHtcbiAgICAgICAgICBvYmpbZW50cnkua2V5XSA9IHRoaXMuZGFtbFZhbHVlVG9Kc29uKGVudHJ5LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfVxuICAgICAgY2FzZSAnZ2VuTWFwJzpcbiAgICAgICAgcmV0dXJuIChzdW0uZ2VuTWFwPy5lbnRyaWVzID8/IFtdKS5tYXAoKGVudHJ5KSA9PiBbXG4gICAgICAgICAgdGhpcy5kYW1sVmFsdWVUb0pzb24oZW50cnkua2V5KSxcbiAgICAgICAgICB0aGlzLmRhbWxWYWx1ZVRvSnNvbihlbnRyeS52YWx1ZSksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSAncmVjb3JkJzoge1xuICAgICAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBzdW0ucmVjb3JkPy5maWVsZHMgPz8gW10pIHtcbiAgICAgICAgICBvYmpbZi5sYWJlbF0gPSB0aGlzLmRhbWxWYWx1ZVRvSnNvbihmLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfVxuICAgICAgY2FzZSAndmFyaWFudCc6IHtcbiAgICAgICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICBvYmpbc3VtLnZhcmlhbnQuY29uc3RydWN0b3JdID0gdGhpcy5kYW1sVmFsdWVUb0pzb24oc3VtLnZhcmlhbnQudmFsdWUpO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfVxuICAgICAgY2FzZSAnZW51bSc6XG4gICAgICAgIHJldHVybiBzdW0uZW51bS5jb25zdHJ1Y3RvcjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlYWRzIGFjdEFzIHBhcnRpZXMgZnJvbSBhIGJhc2U2NC1lbmNvZGVkIHByZXBhcmVkIHRyYW5zYWN0aW9uIHByb3RvYnVmLiAqL1xuICBleHRyYWN0U3VibWl0dGVyQWN0QXMocmF3QmFzZTY0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZGVjb2RlZCA9IHRoaXMuZGVjb2RlUHJlcGFyZWRUcmFuc2FjdGlvbihyYXdCYXNlNjQpO1xuICAgIHJldHVybiBkZWNvZGVkLm1ldGFkYXRhPy5zdWJtaXR0ZXJJbmZvPy5hY3RBcyA/PyBbXTtcbiAgfVxuXG4gIC8qKiBEZWNvZGVzIGEgcHJlcGFyZWQgQ2FudG9uIHRyYW5zYWN0aW9uIHByb3RvYnVmIGFuZCBleHRyYWN0cyB0aGUgcm9vdCBDcmVhdGVDb21tYW5kIG9yIEV4ZXJjaXNlQ29tbWFuZC4gKi9cbiAgZXh0cmFjdENhbnRvbkNvbW1hbmRJbmZvKHJhd0Jhc2U2NDogc3RyaW5nKTogQ2FudG9uQ29tbWFuZEluZm8ge1xuICAgIGNvbnN0IGRlY29kZWQgPSB0aGlzLmRlY29kZVByZXBhcmVkVHJhbnNhY3Rpb24ocmF3QmFzZTY0KTtcbiAgICBjb25zdCB0eCA9IGRlY29kZWQudHJhbnNhY3Rpb247XG4gICAgaWYgKCF0eCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZWNvZGVkIHByZXBhcmVkIHRyYW5zYWN0aW9uIGhhcyBubyB0cmFuc2FjdGlvbiBib2R5Jyk7XG4gICAgfVxuICAgIGNvbnN0IHJvb3RzID0gdHgucm9vdHMgPz8gW107XG4gICAgaWYgKHJvb3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZWNvZGVkIHByZXBhcmVkIHRyYW5zYWN0aW9uIGhhcyBubyByb290IG5vZGVzJyk7XG4gICAgfVxuICAgIGlmIChyb290cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGRlY29kZWQgcHJlcGFyZWQgdHJhbnNhY3Rpb24gaGFzICR7cm9vdHMubGVuZ3RofSByb290IG5vZGVzOyBleHBlY3RlZCBleGFjdGx5IDFgKTtcbiAgICB9XG4gICAgY29uc3Qgcm9vdElkID0gcm9vdHNbMF07XG4gICAgY29uc3Qgcm9vdE5vZGUgPSAodHgubm9kZXMgPz8gW10pLmZpbmQoKG4pID0+IG4ubm9kZUlkID09PSByb290SWQpO1xuICAgIGlmICghcm9vdE5vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcm9vdCBub2RlICcke3Jvb3RJZH0nIG5vdCBmb3VuZCBpbiBub2RlcyBsaXN0YCk7XG4gICAgfVxuICAgIGNvbnN0IHZlcnNpb25lZE5vZGUgPSByb290Tm9kZS52ZXJzaW9uZWROb2RlO1xuICAgIGlmICghdmVyc2lvbmVkTm9kZSB8fCB2ZXJzaW9uZWROb2RlLm9uZW9mS2luZCAhPT0gJ3YxJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCByb290IG5vZGUgdmVyc2lvbjogJHt2ZXJzaW9uZWROb2RlPy5vbmVvZktpbmQgPz8gJ3VuZGVmaW5lZCd9YCk7XG4gICAgfVxuICAgIGNvbnN0IG5vZGVUeXBlID0gdmVyc2lvbmVkTm9kZS52MS5ub2RlVHlwZTtcbiAgICBpZiAobm9kZVR5cGUub25lb2ZLaW5kID09PSAnY3JlYXRlJykge1xuICAgICAgY29uc3QgY3JlYXRlTm9kZSA9IG5vZGVUeXBlLmNyZWF0ZTtcbiAgICAgIGlmICghY3JlYXRlTm9kZS50ZW1wbGF0ZUlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlIG5vZGUgbWlzc2luZyB0ZW1wbGF0ZUlkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnQ3JlYXRlQ29tbWFuZCcsXG4gICAgICAgIHRlbXBsYXRlSWQ6IHtcbiAgICAgICAgICBwYWNrYWdlSWQ6IGNyZWF0ZU5vZGUudGVtcGxhdGVJZC5wYWNrYWdlSWQsXG4gICAgICAgICAgbW9kdWxlTmFtZTogY3JlYXRlTm9kZS50ZW1wbGF0ZUlkLm1vZHVsZU5hbWUsXG4gICAgICAgICAgZW50aXR5TmFtZTogY3JlYXRlTm9kZS50ZW1wbGF0ZUlkLmVudGl0eU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGFyZ3VtZW50OiB0aGlzLmRhbWxWYWx1ZVRvSnNvbihjcmVhdGVOb2RlLmFyZ3VtZW50KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChub2RlVHlwZS5vbmVvZktpbmQgPT09ICdleGVyY2lzZScpIHtcbiAgICAgIGNvbnN0IGV4ZXJjaXNlTm9kZSA9IG5vZGVUeXBlLmV4ZXJjaXNlO1xuICAgICAgaWYgKCFleGVyY2lzZU5vZGUudGVtcGxhdGVJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4ZXJjaXNlIG5vZGUgbWlzc2luZyB0ZW1wbGF0ZUlkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnRXhlcmNpc2VDb21tYW5kJyxcbiAgICAgICAgdGVtcGxhdGVJZDoge1xuICAgICAgICAgIHBhY2thZ2VJZDogZXhlcmNpc2VOb2RlLnRlbXBsYXRlSWQucGFja2FnZUlkLFxuICAgICAgICAgIG1vZHVsZU5hbWU6IGV4ZXJjaXNlTm9kZS50ZW1wbGF0ZUlkLm1vZHVsZU5hbWUsXG4gICAgICAgICAgZW50aXR5TmFtZTogZXhlcmNpc2VOb2RlLnRlbXBsYXRlSWQuZW50aXR5TmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgYXJndW1lbnQ6IHRoaXMuZGFtbFZhbHVlVG9Kc29uKGV4ZXJjaXNlTm9kZS5jaG9zZW5WYWx1ZSksXG4gICAgICAgIGNob2ljZTogZXhlcmNpc2VOb2RlLmNob2ljZUlkLFxuICAgICAgICBjb250cmFjdElkOiBleGVyY2lzZU5vZGUuY29udHJhY3RJZCxcbiAgICAgICAgYWN0aW5nUGFydGllczogWy4uLihleGVyY2lzZU5vZGUuYWN0aW5nUGFydGllcyA/PyBbXSldLFxuICAgICAgfTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCByb290IG5vZGUgdHlwZTogJHtub2RlVHlwZS5vbmVvZktpbmQgPz8gJ3VuZGVmaW5lZCd9YCk7XG4gIH1cblxuICBzYW1lRWxlbWVudHMoYTogcmVhZG9ubHkgc3RyaW5nW10sIGI6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHNvcnRlZEEgPSBbLi4uYV0uc29ydCgpO1xuICAgIGNvbnN0IHNvcnRlZEIgPSBbLi4uYl0uc29ydCgpO1xuICAgIHJldHVybiBzb3J0ZWRBLmV2ZXJ5KCh4LCBpKSA9PiB4ID09PSBzb3J0ZWRCW2ldKTtcbiAgfVxuXG4gIC8qKiBTdHJpcHMgdGhlIGBjb21tYW5kLmAgcHJlZml4IGZyb20gaW5qZWN0QXMgcGF0aHMgKGUuZy4gYGNvbW1hbmQuRXhlcmNpc2VDb21tYW5kLmNvbnRyYWN0SWRgIOKGkiBgRXhlcmNpc2VDb21tYW5kLmNvbnRyYWN0SWRgKS4gKi9cbiAgbm9ybWFsaXplSW5qZWN0QXMoc3BlY3M6IHJlYWRvbmx5IHsgaW5qZWN0QXM/OiBzdHJpbmcgfVtdIHwgdW5kZWZpbmVkKTogU2V0PHN0cmluZz4ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGlmICghc3BlY3MpIHJldHVybiBvdXQ7XG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHNwZWNzKSB7XG4gICAgICBpZiAoIXNwZWMgfHwgdHlwZW9mIHNwZWMuaW5qZWN0QXMgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHN0cmlwcGVkID0gc3BlYy5pbmplY3RBcy5zdGFydHNXaXRoKCdjb21tYW5kLicpID8gc3BlYy5pbmplY3RBcy5zbGljZSgnY29tbWFuZC4nLmxlbmd0aCkgOiBzcGVjLmluamVjdEFzO1xuICAgICAgaWYgKHN0cmlwcGVkKSBvdXQuYWRkKHN0cmlwcGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBhc3NlcnRzIHRoYXQgYGFjdHVhbGAgbWF0Y2hlcyBgZXhwZWN0ZWRgLiBQYXRocyBpbiBgaW5qZWN0QXNQYXRoc2AgYXJlIHNraXBwZWQuXG4gICAqIE51bWVyaWMgc3RyaW5ncyBhcmUgY29tcGFyZWQgdmlhIEJpZ051bWJlciB0byBoYW5kbGUgREFNTCBmb3JtYXR0aW5nIGRpZmZlcmVuY2VzIChlLmcuIFwiMTAwXCIgdnMgXCIxMDAuMDAwMDAwMDAwMFwiKS5cbiAgICovXG4gIGFzc2VydERlZXBDYW50b25NYXRjaChleHBlY3RlZDogdW5rbm93biwgYWN0dWFsOiB1bmtub3duLCBpbmplY3RBc1BhdGhzOiBTZXQ8c3RyaW5nPiwgY3VycmVudFBhdGggPSAnJyk6IHZvaWQge1xuICAgIGlmIChpbmplY3RBc1BhdGhzLmhhcyhjdXJyZW50UGF0aCkpIHJldHVybjtcblxuICAgIC8vIE9ubHkgdW5kZWZpbmVkIG1lYW5zIFwidW5zcGVjaWZpZWQg4oCUIHNraXAgY29tcGFyaXNvblwiLiBFbXB0eSB7fSBvciBbXSBhcmUgdmFsaWRcbiAgICAvLyBEYW1sIHZhbHVlcyBhbmQgbXVzdCBiZSB2ZXJpZmllZCBhZ2FpbnN0IGFjdHVhbCB0byBwcmV2ZW50IGFjY2lkZW50YWwgdW5kZXItdmVyaWZpY2F0aW9uLlxuICAgIGlmIChleHBlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4cGVjdGVkID09PSBudWxsIHx8IGFjdHVhbCA9PT0gbnVsbCkge1xuICAgICAgaWYgKGV4cGVjdGVkICE9PSBhY3R1YWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW50b24gY29tbWFuZCBtaXNtYXRjaCBhdCAnJHtjdXJyZW50UGF0aCB8fCAnPHJvb3Q+J30nOiBleHBlY3RlZCAke3RoaXMuc3RyaW5naWZ5Rm9yRXJyb3IoXG4gICAgICAgICAgICBleHBlY3RlZFxuICAgICAgICAgICl9LCBnb3QgJHt0aGlzLnN0cmluZ2lmeUZvckVycm9yKGFjdHVhbCl9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgYWN0dWFsID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHRoaXMuYXJlTnVtZXJpY1N0cmluZ3MoZXhwZWN0ZWQsIGFjdHVhbCkpIHtcbiAgICAgICAgaWYgKCFuZXcgQmlnTnVtYmVyKGV4cGVjdGVkKS5pc0VxdWFsVG8obmV3IEJpZ051bWJlcihhY3R1YWwpKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW50b24gY29tbWFuZCBudW1lcmljIG1pc21hdGNoIGF0ICcke2N1cnJlbnRQYXRoIHx8ICc8cm9vdD4nfSc6IGV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBnb3QgJHthY3R1YWx9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gSVNPIDg2MDEgaW5wdXQgdnMgbWljcm9zZWNvbmQtc2luY2UtZXBvY2ggZW5jb2RpbmcgaW4gdGhlIHByZXBhcmVkLXRyYW5zYWN0aW9uIHByb3RvYnVmLlxuICAgICAgaWYgKHRoaXMuaXNJc29UaW1lc3RhbXAoZXhwZWN0ZWQpICYmIHRoaXMuaXNJbnRlZ2VyU3RyaW5nKGFjdHVhbCkpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRNaWNyb3NlY29uZHMgPSBuZXcgQmlnTnVtYmVyKG5ldyBEYXRlKGV4cGVjdGVkKS5nZXRUaW1lKCkpLm11bHRpcGxpZWRCeSgxMDAwKTtcbiAgICAgICAgaWYgKCFleHBlY3RlZE1pY3Jvc2Vjb25kcy5pc0VxdWFsVG8obmV3IEJpZ051bWJlcihhY3R1YWwpKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW50b24gY29tbWFuZCB0aW1lc3RhbXAgbWlzbWF0Y2ggYXQgJyR7Y3VycmVudFBhdGggfHwgJzxyb290Pid9JzogYCArXG4gICAgICAgICAgICAgIGBleHBlY3RlZCAnJHtleHBlY3RlZH0nICgke2V4cGVjdGVkTWljcm9zZWNvbmRzLnRvRml4ZWQoMCl9IMK1cyksIGdvdCAnJHthY3R1YWx9J2BcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChleHBlY3RlZCAhPT0gYWN0dWFsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2FudG9uIGNvbW1hbmQgbWlzbWF0Y2ggYXQgJyR7Y3VycmVudFBhdGggfHwgJzxyb290Pid9JzogZXhwZWN0ZWQgJyR7ZXhwZWN0ZWR9JywgZ290ICcke2FjdHVhbH0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYWN0dWFsID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGV4cGVjdGVkICE9PSBhY3R1YWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW50b24gY29tbWFuZCBtaXNtYXRjaCBhdCAnJHtjdXJyZW50UGF0aCB8fCAnPHJvb3Q+J30nOiBleHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnYm9vbGVhbicgJiYgdHlwZW9mIGFjdHVhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBpZiAoZXhwZWN0ZWQgIT09IGFjdHVhbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbnRvbiBjb21tYW5kIG1pc21hdGNoIGF0ICcke2N1cnJlbnRQYXRoIHx8ICc8cm9vdD4nfSc6IGV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBnb3QgJHthY3R1YWx9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdGVkKSAmJiBBcnJheS5pc0FycmF5KGFjdHVhbCkpIHtcbiAgICAgIGlmIChleHBlY3RlZC5sZW5ndGggIT09IGFjdHVhbC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW50b24gY29tbWFuZCBsaXN0LWxlbmd0aCBtaXNtYXRjaCBhdCAnJHtjdXJyZW50UGF0aCB8fCAnPHJvb3Q+J30nOiBleHBlY3RlZCAke2V4cGVjdGVkLmxlbmd0aH0sIGdvdCAke1xuICAgICAgICAgICAgYWN0dWFsLmxlbmd0aFxuICAgICAgICAgIH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IGN1cnJlbnRQYXRoID8gYCR7Y3VycmVudFBhdGh9LiR7aX1gIDogU3RyaW5nKGkpO1xuICAgICAgICB0aGlzLmFzc2VydERlZXBDYW50b25NYXRjaChleHBlY3RlZFtpXSwgYWN0dWFsW2ldLCBpbmplY3RBc1BhdGhzLCBjaGlsZFBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1BsYWluT2JqZWN0KGV4cGVjdGVkKSAmJiB0aGlzLmlzUGxhaW5PYmplY3QoYWN0dWFsKSkge1xuICAgICAgY29uc3QgZXhwZWN0ZWRLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhleHBlY3RlZCkpO1xuICAgICAgY29uc3QgYWN0dWFsS2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoYWN0dWFsKSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBleHBlY3RlZEtleXMpIHtcbiAgICAgICAgY29uc3QgY2hpbGRQYXRoID0gY3VycmVudFBhdGggPyBgJHtjdXJyZW50UGF0aH0uJHtrZXl9YCA6IGtleTtcbiAgICAgICAgaWYgKGV4cGVjdGVkW2tleV0gPT09IHVuZGVmaW5lZCB8fCBpbmplY3RBc1BhdGhzLmhhcyhjaGlsZFBhdGgpKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFhY3R1YWxLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW50b24gY29tbWFuZCBtaXNzaW5nIGZpZWxkIGF0ICcke2NoaWxkUGF0aH0nIG9uIHByZXBhcmVkIHRyYW5zYWN0aW9uYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hc3NlcnREZWVwQ2FudG9uTWF0Y2goZXhwZWN0ZWRba2V5XSwgKGFjdHVhbCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSwgaW5qZWN0QXNQYXRocywgY2hpbGRQYXRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENhbnRvbiBjb21tYW5kIHR5cGUgbWlzbWF0Y2ggYXQgJyR7Y3VycmVudFBhdGggfHwgJzxyb290Pid9JzogZXhwZWN0ZWQgJHt0aGlzLmRlc2NyaWJlVHlwZShcbiAgICAgICAgZXhwZWN0ZWRcbiAgICAgICl9LCBnb3QgJHt0aGlzLmRlc2NyaWJlVHlwZShhY3R1YWwpfWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSB0b3BvbG9neSBoYXNoIGZyb20gdGhlIEFQSSByZXNwb25zZSBvZiB0aGUgJ2NyZWF0ZSBwYXJ0eScgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBwYXJhbSB0b3BvbG9neVRyYW5zYWN0aW9ucyAtIExpc3Qgb2YgYmFzZTY0LWVuY29kZWQgdG9wb2xvZ3kgdHJhbnNhY3Rpb25zIGZyb20gdGhlIENhbnRvbiBBUEkuXG4gICAqIEByZXR1cm5zIFRoZSBmaW5hbCBiYXNlNjQtZW5jb2RlZCB0b3BvbG9neSB0cmFuc2FjdGlvbiBoYXNoLlxuICAgKi9cbiAgY29tcHV0ZUhhc2hGcm9tQ3JlYXRlUGFydHlSZXNwb25zZSh0b3BvbG9neVRyYW5zYWN0aW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHR4QnVmZmVycyA9IHRvcG9sb2d5VHJhbnNhY3Rpb25zLm1hcCgodHgpID0+IEJ1ZmZlci5mcm9tKHR4LCAnYmFzZTY0JykpO1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGVIYXNoRnJvbVRvcG9sb2d5VHJhbnNhY3Rpb24odHhCdWZmZXJzKTtcbiAgfVxuXG4gIGFzeW5jIGNvbXB1dGVIYXNoRnJvbVByZXBhcmVTdWJtaXNzaW9uUmVzcG9uc2UocHJlcGFyZWRUcmFuc2FjdGlvbkJhc2U2NDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwcmVwYXJlZFRyYW5zYWN0aW9uID0gdGhpcy5kZWNvZGVQcmVwYXJlZFRyYW5zYWN0aW9uKHByZXBhcmVkVHJhbnNhY3Rpb25CYXNlNjQpO1xuICAgIGNvbnN0IGhhc2ggPSBhd2FpdCBjb21wdXRlUHJlcGFyZWRUcmFuc2FjdGlvbihwcmVwYXJlZFRyYW5zYWN0aW9uKTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oaGFzaCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBmaW5hbCB0b3BvbG9neSB0cmFuc2FjdGlvbiBoYXNoIGZvciBhIGxpc3Qgb2YgcHJlcGFyZWQgQ2FudG9uIHRyYW5zYWN0aW9ucy5cbiAgICpcbiAgICogRWFjaCB0cmFuc2FjdGlvbiBpcyBmaXJzdCBoYXNoZWQgd2l0aCBwdXJwb3NlIGAxMWAsIHRoZW4gYWxsIGhhc2hlcyBhcmUgY29tYmluZWQgYW5kXG4gICAqIGhhc2hlZCBhZ2FpbiB3aXRoIHB1cnBvc2UgYDU1YCwgZm9sbG93aW5nIHRoZSBDYW50b24gdG9wb2xvZ3kgaGFzaCBydWxlcy5cbiAgICpcbiAgICogVGhlIHJlc3VsdGluZyBoYXNoIGlzIGVuY29kZWQgYXMgYSBiYXNlNjQgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcltdfSBwcmVwYXJlZFRyYW5zYWN0aW9ucyAtIEFuIGFycmF5IG9mIENhbnRvbiB0cmFuc2FjdGlvbiBidWZmZXJzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZmluYWwgdG9wb2xvZ3kgaGFzaCwgYmFzZTY0LWVuY29kZWQuXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVIYXNoRnJvbVRvcG9sb2d5VHJhbnNhY3Rpb24ocHJlcGFyZWRUcmFuc2FjdGlvbnM6IEJ1ZmZlcltdKTogc3RyaW5nIHtcbiAgICBjb25zdCByYXdIYXNoZXMgPSBwcmVwYXJlZFRyYW5zYWN0aW9ucy5tYXAoKHR4KSA9PiB0aGlzLmNvbXB1dGVTaGEyNTZDYW50b25IYXNoKDExLCB0eCkpO1xuICAgIGNvbnN0IGNvbWJpbmVkSGFzaGVzID0gdGhpcy5jb21wdXRlTXVsdGlIYXNoRm9yVG9wb2xvZ3kocmF3SGFzaGVzKTtcbiAgICBjb25zdCBjb21wdXRlZEhhc2ggPSB0aGlzLmNvbXB1dGVTaGEyNTZDYW50b25IYXNoKDU1LCBjb21iaW5lZEhhc2hlcyk7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNvbXB1dGVkSGFzaCwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGJhc2U2NC1lbmNvZGVkIEVkMjU1MTkgcHVibGljIGtleSBzdHJpbmcgaW50byBhIHN0cnVjdHVyZWQgc2lnbmluZyBwdWJsaWMga2V5IG9iamVjdC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHB1YmxpY0tleSBUaGUgYmFzZTY0LWVuY29kZWQgRWQyNTUxOSBwdWJsaWMga2V5XG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzdHJ1Y3R1cmVkIHNpZ25pbmcga2V5IG9iamVjdCBmb3JtYXR0ZWQgZm9yIHVzZSB3aXRoIGNyeXB0b2dyYXBoaWMgb3BlcmF0aW9uc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzaWduaW5nUHVibGljS2V5RnJvbUVkMjU1MTkocHVibGljS2V5OiBzdHJpbmcpOiB7XG4gICAgZm9ybWF0OiBudW1iZXI7XG4gICAgcHVibGljS2V5OiBCdWZmZXI7XG4gICAgc2NoZW1lOiBudW1iZXI7XG4gICAga2V5U3BlYzogbnVtYmVyO1xuICAgIHVzYWdlOiBbXTtcbiAgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1hdDogQ3J5cHRvS2V5Rm9ybWF0LlJBVyxcbiAgICAgIHB1YmxpY0tleTogQnVmZmVyLmZyb20ocHVibGljS2V5LCAnYmFzZTY0JyksXG4gICAgICBzY2hlbWU6IFNpZ25pbmdBbGdvcml0aG1TcGVjLkVEMjU1MTksXG4gICAgICBrZXlTcGVjOiBTaWduaW5nS2V5U3BlYy5FQ19DVVJWRTI1NTE5LFxuICAgICAgdXNhZ2U6IFtdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGJ1ZmZlciB3aXRoIGEgNC1ieXRlIGJpZy1lbmRpYW4gaW50ZWdlciBwcmVmaXggZm9sbG93ZWQgYnkgdGhlIHByb3ZpZGVkIGJ5dGUgYnVmZmVyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZSBUaGUgaW50ZWdlciB0byBwcmVmaXgsIHdyaXR0ZW4gYXMgNCBieXRlcyBpbiBiaWctZW5kaWFuIG9yZGVyXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBieXRlcyBUaGUgYnVmZmVyIHRvIGFwcGVuZCBhZnRlciB0aGUgaW50ZWdlciBwcmVmaXhcbiAgICogQHJldHVybnMge0J1ZmZlcn0gVGhlIHJlc3VsdGluZyBidWZmZXIgd2l0aCB0aGUgcHJlZml4ZWQgaW50ZWdlclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBwcmVmaXhlZEludCh2YWx1ZTogbnVtYmVyLCBieXRlczogQnVmZmVyKTogQnVmZmVyIHtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoNCArIGJ5dGVzLmxlbmd0aCk7XG4gICAgYnVmZmVyLndyaXRlVUludDMyQkUodmFsdWUsIDApO1xuICAgIEJ1ZmZlci5mcm9tKGJ5dGVzKS5jb3B5KGJ1ZmZlciwgNCk7XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBhbiBTSEEtMjU2IENhbnRvbi1zdHlsZSBoYXNoIGJ5IHByZWZpeGluZyB0aGUgaW5wdXQgd2l0aCBhIHB1cnBvc2UgaWRlbnRpZmllcixcbiAgICogdGhlbiBoYXNoaW5nIHRoZSByZXN1bHRpbmcgYnVmZmVyIGFuZCBwcmVwZW5kaW5nIGEgbXVsdGktcHJlZml4XG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwdXJwb3NlIEEgbnVtZXJpYyBpZGVudGlmaWVyIHRvIHByZWZpeCB0aGUgaGFzaCBpbnB1dCB3aXRoXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBieXRlcyBUaGUgYnVmZmVyIHRvIGJlIGhhc2hlZFxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBIGhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVzdWx0aW5nIGhhc2ggd2l0aCBtdWx0aS1wcmVmaXhcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZVNoYTI1NkNhbnRvbkhhc2gocHVycG9zZTogbnVtYmVyLCBieXRlczogQnVmZmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBoYXNoSW5wdXQgPSB0aGlzLnByZWZpeGVkSW50KHB1cnBvc2UsIGJ5dGVzKTtcbiAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShoYXNoSW5wdXQpLmRpZ2VzdCgpO1xuICAgIGNvbnN0IG11bHRpcHJlZml4ID0gQnVmZmVyLmZyb20oWzB4MTIsIDB4MjBdKTtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbbXVsdGlwcmVmaXgsIGhhc2hdKS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyBhIEJhc2U2NC1lbmNvZGVkIHN0cmluZyBpbnRvIGEgVWludDhBcnJheVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYjY0IFRoZSBCYXNlNjQtZW5jb2RlZCBzdHJpbmdcbiAgICogQHJldHVybnMge1VpbnQ4QXJyYXl9IFRoZSBkZWNvZGVkIGJ5dGUgYXJyYXlcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZnJvbUJhc2U2NChiNjQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShiNjQsICdiYXNlNjQnKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyBhIEJhc2U2NC1lbmNvZGVkIHByZXBhcmVkIHRyYW5zYWN0aW9uIGludG8gYSBzdHJ1Y3R1cmVkIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gYmFzZTY0IFRoZSBCYXNlNjQtZW5jb2RlZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAqIEByZXR1cm5zIHtJUHJlcGFyZWRUcmFuc2FjdGlvbn0gVGhlIGRlY29kZWQgYElQcmVwYXJlZFRyYW5zYWN0aW9uYCBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZGVjb2RlUHJlcGFyZWRUcmFuc2FjdGlvbihiYXNlNjQ6IHN0cmluZyk6IElQcmVwYXJlZFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBieXRlcyA9IHRoaXMuZnJvbUJhc2U2NChiYXNlNjQpO1xuICAgIHJldHVybiBQcmVwYXJlZFRyYW5zYWN0aW9uLmZyb21CaW5hcnkoYnl0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIGEgZGV0ZXJtaW5pc3RpYyBjb21iaW5lZCBoYXNoIGZyb20gYW4gYXJyYXkgb2YgaW5kaXZpZHVhbCBDYW50b24tc3R5bGUgU0hBLTI1NiBoYXNoZXNcbiAgICpcbiAgICogRWFjaCBoYXNoIGlzIGRlY29kZWQgZnJvbSBoZXgsIHNvcnRlZCBsZXhpY29ncmFwaGljYWxseSAoYnkgaGV4KSwgYW5kIHByZWZpeGVkIHdpdGggaXRzIGxlbmd0aFxuICAgKiBUaGUgZmluYWwgYnVmZmVyIGluY2x1ZGVzIHRoZSBudW1iZXIgb2YgaGFzaGVzIGZvbGxvd2VkIGJ5IGVhY2ggKGxlbmd0aC1wcmVmaXhlZCkgaGFzaFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBoYXNoZXMgLSBBbiBhcnJheSBvZiBDYW50b24tcHJlZml4ZWQgU0hBLTI1NiBoYXNoZXMgaW4gaGV4YWRlY2ltYWwgc3RyaW5nIGZvcm1hdFxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSBBIGJpbmFyeSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBjb21iaW5lZCBoYXNoIGlucHV0XG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVNdWx0aUhhc2hGb3JUb3BvbG9neShoYXNoZXM6IHN0cmluZ1tdKTogQnVmZmVyIHtcbiAgICBjb25zdCBzb3J0ZWRIYXNoZXMgPSBoYXNoZXNcbiAgICAgIC5tYXAoKGhleCkgPT4gQnVmZmVyLmZyb20oaGV4LCAnaGV4JykpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS50b1N0cmluZygnaGV4JykubG9jYWxlQ29tcGFyZShiLnRvU3RyaW5nKCdoZXgnKSkpO1xuXG4gICAgY29uc3QgbnVtSGFzaGVzQnl0ZXMgPSB0aGlzLmVuY29kZUludDMyKHNvcnRlZEhhc2hlcy5sZW5ndGgpO1xuICAgIGNvbnN0IHBhcnRzOiBCdWZmZXJbXSA9IFtudW1IYXNoZXNCeXRlc107XG5cbiAgICBmb3IgKGNvbnN0IGggb2Ygc29ydGVkSGFzaGVzKSB7XG4gICAgICBjb25zdCBsZW5ndGhCeXRlcyA9IHRoaXMuZW5jb2RlSW50MzIoaC5sZW5ndGgpO1xuICAgICAgcGFydHMucHVzaChsZW5ndGhCeXRlcywgaCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQocGFydHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZXMgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIgaW50byBhIDQtYnl0ZSBiaWctZW5kaWFuIEJ1ZmZlclxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgaW50ZWdlciB0byBlbmNvZGVcbiAgICogQHJldHVybnMge0J1ZmZlcn0gQSA0LWJ5dGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgaW50ZWdlciBpbiBiaWctZW5kaWFuIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBlbmNvZGVJbnQzMih2YWx1ZTogbnVtYmVyKTogQnVmZmVyIHtcbiAgICBjb25zdCBidWYgPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgYnVmLndyaXRlSW50MzJCRSh2YWx1ZSwgMCk7XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRvIGNhbnRvbiByYXcgdW5pdHNcbiAgICogQHBhcmFtIHtCaWdOdW1iZXJ9IHZhbHVlXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBjb252ZXJ0ZWQgcmF3IGNhbnRvbiB1bml0c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0QW1vdW50VG9Mb3dlc3RVbml0KHZhbHVlOiBCaWdOdW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZS5tdWx0aXBsaWVkQnkobmV3IEJpZ051bWJlcigxMCkucG93KDEwKSkudG9GaXhlZCgwKTtcbiAgfVxuXG4gIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcmVOdW1lcmljU3RyaW5ncyhhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG51bWVyaWNSZSA9IC9eLT9cXGQrKFxcLlxcZCspPyQvO1xuICAgIHJldHVybiBudW1lcmljUmUudGVzdChhKSAmJiBudW1lcmljUmUudGVzdChiKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJc29UaW1lc3RhbXAodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGR7MSwzfSk/WiQvLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUoRGF0ZS5wYXJzZSh2YWx1ZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ludGVnZXJTdHJpbmcodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXlxcZCskLy50ZXN0KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzY3JpYmVUeXBlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAnbnVsbCc7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gJ2FycmF5JztcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdHJpbmdpZnlGb3JFcnJvcih2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBiaXRnbyB0b2tlbiBuYW1lIHVzaW5nIHRoZSBvbi1jaGFpbiBpbnN0cnVtZW50IGRldGFpbHNcbiAgICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyAtIHRoZSBjb250cmFjdCBhZGRyZXNzIG9mIHRoZSBmb3JtLCBgaW5zdHJ1bWVudEFkbWluOmluc3RydW1lbnRJZGBcbiAgICogQHJldHVybnMgdG9rZW5OYW1lIGlmIGNvbnRyYWN0QWRkcmVzcyBtYXRjaGVzIHdpdGggYW55IHN1cHBvcnRlZCBjYW50b24gdG9rZW5zXG4gICAqL1xuICBwcml2YXRlIGZpbmRUb2tlbk5hbWVCeUNvbnRyYWN0QWRkcmVzcyhjb250cmFjdEFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbnRyYWN0QWRkcmVzcy5pbmNsdWRlcygnQW11bGV0JykpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNhbnRvblRva2VuID0gY29pbnNcbiAgICAgIC5maWx0ZXIoKGNvaW4pID0+IGNvaW4gaW5zdGFuY2VvZiBDYW50b25Ub2tlbiAmJiBjb2luLmNvbnRyYWN0QWRkcmVzcyA9PT0gY29udHJhY3RBZGRyZXNzKVxuICAgICAgLm1hcCgoY29pbikgPT4gY29pbiBhcyBDYW50b25Ub2tlbik7XG4gICAgcmV0dXJuIGNhbnRvblRva2VuID8gY2FudG9uVG9rZW5bMF0ubmFtZSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5jb25zdCB1dGlscyA9IG5ldyBVdGlscygpO1xuXG5leHBvcnQgZGVmYXVsdCB1dGlscztcbiJdfQ==
|
|
1065
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUFxQztBQUNyQyxvREFBNEI7QUFFNUIsbURBQTJGO0FBQzNGLGlEQUF5RDtBQUV6RCwwREFBMEU7QUFDMUUseUZBQW1GO0FBRW5GLHlDQUFtRjtBQUluRixNQUFhLEtBQUs7SUFDaEIsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxPQUFlO1FBQzVCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNwRCxNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMvQixpRUFBaUU7UUFDakUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLDJFQUEyRTtRQUMzRSxvREFBb0Q7UUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMs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QUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZELENBQUM7Q0FDRjtBQTdoQ0Qsc0JBNmhDQztBQUVELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFFMUIsa0JBQWUsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBCYXNlVXRpbHMsIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5LCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBDYW50b25Ub2tlbiwgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcblxuaW1wb3J0IHsgY29tcHV0ZVByZXBhcmVkVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaGFzaC9oYXNoLmpzJztcbmltcG9ydCB7IFByZXBhcmVkVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvcHJvdG8vcHJlcGFyZWRUcmFuc2FjdGlvbi5qcyc7XG5cbmltcG9ydCB7IENyeXB0b0tleUZvcm1hdCwgU2lnbmluZ0FsZ29yaXRobVNwZWMsIFNpZ25pbmdLZXlTcGVjIH0gZnJvbSAnLi9jb25zdGFudCc7XG5pbXBvcnQgeyBDYW50b25Db21tYW5kSW5mbywgUHJlcGFyZWRUcmFuc2FjdGlvbiBhcyBJUHJlcGFyZWRUcmFuc2FjdGlvbiwgUHJlcGFyZWRUeG5QYXJzZWRJbmZvIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBSZWNvcmRGaWVsZCwgVmFsdWUgfSBmcm9tICcuL3Jlc291cmNlc0ludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWFkZHJlc3MgfHwgYWRkcmVzcy50cmltKCkgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgW3BhcnR5SGludCwgZmluZ2VycHJpbnRdID0gYWRkcmVzcy50cmltKCkuc3BsaXQoJzo6Jyk7XG4gICAgaWYgKCFmaW5nZXJwcmludCkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFsbCBtZW1vSWRzIGFyZSBjb25zaWRlcmVkIHZhbGlkIGFzIGxvbmcgYXMgc3RyaW5ncyBhcmUgcGFzc2VkXG4gICAgY29uc3QgW2ZpbmdlcnByaW50UGFydF0gPSBmaW5nZXJwcmludC50cmltKCkuc3BsaXQoJz9tZW1vSWQ9Jyk7XG4gICAgaWYgKCFwYXJ0eUhpbnQgfHwgIWZpbmdlcnByaW50UGFydCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRDYW50b25IZXgoZmluZ2VycHJpbnRQYXJ0KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBJbiBjYW50b24sIHRoZXJlIGlzIG5vIGJsb2NrIGhhc2gsIHdlIHN0b3JlIHRoZSBoZWlnaHQgYXMgdGhlIF9pZCAoaGFzaClcbiAgICAvLyB0aGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0sIDxibG9ja0hlaWdodD5fPHZlcnNpb24+XG4gICAgY29uc3QgW2hlaWdodF0gPSBoYXNoLnNwbGl0KCdfJyk7XG4gICAgY29uc3QgYmxvY2tIZWlnaHQgPSBOdW1iZXIoaGVpZ2h0KTtcbiAgICByZXR1cm4gIWlzTmFOKGJsb2NrSGVpZ2h0KSAmJiBibG9ja0hlaWdodCA+IDA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFByaXZhdGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFB1YmxpY0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ZhbGlkRWQyNTUxOVB1YmxpY0tleShrZXkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgaW5wdXQgaXMgYSB2YWxpZCBjYW50b24gaGV4IHN0cmluZ1xuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgdGhlIGhleCBzdHJpbmcgdmFsdWVcbiAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRDYW50b25IZXgodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlZ2V4ID0gL15bYS1mQS1GMC05XXs2OH0kLztcbiAgICByZXR1cm4gcmVnZXgudGVzdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBjb252ZXJ0IGhleCB2YWx1ZSB0byBiYXNlNjRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGhleFN0cmluZyAtIGhleCBlbmNvZGVkIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBiYXNlNjQgZW5jb2RlZCBzdHJpbmdcbiAgICovXG4gIGdldEJhc2U2NEZyb21IZXgoaGV4U3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShoZXhTdHJpbmcsICdoZXgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGNyZWF0ZSBmaW5nZXJwcmludCAocGFydCBvZiB0aGUgY2FudG9uIHBhcnR5SWQpIGZyb20gcHVibGljIGtleVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHVibGljS2V5IHRoZSBwdWJsaWMga2V5XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5zaWduaW5nUHVibGljS2V5RnJvbUVkMjU1MTkocHVibGljS2V5KTtcbiAgICBjb25zdCBoYXNoUHVycG9zZSA9IDEyO1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGVTaGEyNTZDYW50b25IYXNoKGhhc2hQdXJwb3NlLCBrZXkucHVibGljS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcGFyc2UgcmF3IGNhbnRvbiB0cmFuc2FjdGlvbiAmIGdldCByZXF1aXJlZCBkYXRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByYXdEYXRhIGJhc2U2NCBlbmNvZGVkIHN0cmluZ1xuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHhUeXBlIHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqIEByZXR1cm5zIHtQcmVwYXJlZFR4blBhcnNlZEluZm99XG4gICAqL1xuICBwYXJzZVJhd0NhbnRvblRyYW5zYWN0aW9uRGF0YShyYXdEYXRhOiBzdHJpbmcsIHR4VHlwZTogVHJhbnNhY3Rpb25UeXBlKTogUHJlcGFyZWRUeG5QYXJzZWRJbmZvIHtcbiAgICBjb25zdCBkZWNvZGVkRGF0YSA9IHRoaXMuZGVjb2RlUHJlcGFyZWRUcmFuc2FjdGlvbihyYXdEYXRhKTtcbiAgICBjb25zdCBub2RlcyA9IGRlY29kZWREYXRhLnRyYW5zYWN0aW9uPy5ub2RlcyA/PyBbXTtcbiAgICBjb25zdCBnZXRGaWVsZCA9IChmaWVsZHM6IFJlY29yZEZpZWxkW10sIGxhYmVsOiBzdHJpbmcpID0+IGZpZWxkcy5maW5kKChmKSA9PiBmLmxhYmVsID09PSBsYWJlbCk/LnZhbHVlPy5zdW07XG5cbiAgICBsZXQgc2VuZGVyID0gJyc7XG4gICAgbGV0IHJlY2VpdmVyID0gJyc7XG4gICAgbGV0IGFtb3VudCA9ICcnO1xuICAgIGxldCBtZW1vSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaW5zdHJ1bWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGluc3RydW1lbnRBZG1pbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYXJndW1lbnQgZmllbGRzIG9mIHRoZSBmaXJzdCBjcmVhdGUgbm9kZSBtYXRjaGluZyB0aGUgZ2l2ZW4gZW50aXR5IG5hbWUuXG4gICAgICovXG4gICAgY29uc3QgZmluZENyZWF0ZU5vZGVGaWVsZHMgPSAoZW50aXR5TmFtZTogc3RyaW5nKTogUmVjb3JkRmllbGRbXSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgICAgY29uc3Qgdm4gPSBub2RlLnZlcnNpb25lZE5vZGU7XG4gICAgICAgIGlmICghdm4gfHwgdm4ub25lb2ZLaW5kICE9PSAndjEnKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbnQgPSB2bi52MS5ub2RlVHlwZTtcbiAgICAgICAgaWYgKG50Lm9uZW9mS2luZCAhPT0gJ2NyZWF0ZScpIGNvbnRpbnVlO1xuICAgICAgICBpZiAobnQuY3JlYXRlLnRlbXBsYXRlSWQ/LmVudGl0eU5hbWUgIT09IGVudGl0eU5hbWUpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBhcmdTdW0gPSBudC5jcmVhdGUuYXJndW1lbnQ/LnN1bTtcbiAgICAgICAgaWYgKCFhcmdTdW0gfHwgYXJnU3VtLm9uZW9mS2luZCAhPT0gJ3JlY29yZCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBhcmdTdW0ucmVjb3JkPy5maWVsZHM7XG4gICAgICAgIGlmIChmaWVsZHMpIHJldHVybiBmaWVsZHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjaG9zZW5WYWx1ZSBmaWVsZHMgb2YgdGhlIGZpcnN0IGV4ZXJjaXNlIG5vZGUgbWF0Y2hpbmcgdGhlIGdpdmVuIGNob2ljZUlkLlxuICAgICAqL1xuICAgIGNvbnN0IGZpbmRFeGVyY2lzZU5vZGVGaWVsZHMgPSAoY2hvaWNlSWQ6IHN0cmluZyk6IFJlY29yZEZpZWxkW10gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICAgIGNvbnN0IHZuID0gbm9kZS52ZXJzaW9uZWROb2RlO1xuICAgICAgICBpZiAoIXZuIHx8IHZuLm9uZW9mS2luZCAhPT0gJ3YxJykgY29udGludWU7XG4gICAgICAgIGNvbnN0IG50ID0gdm4udjEubm9kZVR5cGU7XG4gICAgICAgIGlmIChudC5vbmVvZktpbmQgIT09ICdleGVyY2lzZScpIGNvbnRpbnVlO1xuICAgICAgICBpZiAobnQuZXhlcmNpc2UuY2hvaWNlSWQgIT09IGNob2ljZUlkKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYXJnU3VtID0gbnQuZXhlcmNpc2UuY2hvc2VuVmFsdWU/LnN1bTtcbiAgICAgICAgaWYgKCFhcmdTdW0gfHwgYXJnU3VtLm9uZW9mS2luZCAhPT0gJ3JlY29yZCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBhcmdTdW0ucmVjb3JkPy5maWVsZHM7XG4gICAgICAgIGlmIChmaWVsZHMpIHJldHVybiBmaWVsZHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBhY3RpbmcgcGFydHkgb2YgdGhlIGZpcnN0IGV4ZXJjaXNlIG5vZGUgbWF0Y2hpbmcgdGhlIGdpdmVuIGNob2ljZUlkLlxuICAgICAqL1xuICAgIGNvbnN0IGZpbmRFeGVyY2lzZUFjdGluZ1BhcnR5ID0gKGNob2ljZUlkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICAgIGNvbnN0IHZuID0gbm9kZS52ZXJzaW9uZWROb2RlO1xuICAgICAgICBpZiAoIXZuIHx8IHZuLm9uZW9mS2luZCAhPT0gJ3YxJykgY29udGludWU7XG4gICAgICAgIGNvbnN0IG50ID0gdm4udjEubm9kZVR5cGU7XG4gICAgICAgIGlmIChudC5vbmVvZktpbmQgIT09ICdleGVyY2lzZScpIGNvbnRpbnVlO1xuICAgICAgICBpZiAobnQuZXhlcmNpc2UuY2hvaWNlSWQgIT09IGNob2ljZUlkKSBjb250aW51ZTtcbiAgICAgICAgcmV0dXJuIG50LmV4ZXJjaXNlLmFjdGluZ1BhcnRpZXNbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvKiogVW53cmFwcyBhIERhbWwgb3B0aW9uYWwgKG9yIGJhcmUpIHBhcnR5IHZhbHVlIHRvIHRoZSBwYXJ0eSBzdHJpbmcuICovXG4gICAgY29uc3QgZ2V0UGFydHlGcm9tT3B0aW9uYWwgPSAoZmllbGRzOiBSZWNvcmRGaWVsZFtdLCBsYWJlbDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGNvbnN0IHN1bSA9IGdldEZpZWxkKGZpZWxkcywgbGFiZWwpO1xuICAgICAgaWYgKHN1bT8ub25lb2ZLaW5kID09PSAncGFydHknKSByZXR1cm4gc3VtLnBhcnR5ID8/ICcnO1xuICAgICAgaWYgKHN1bT8ub25lb2ZLaW5kID09PSAnb3B0aW9uYWwnKSB7XG4gICAgICAgIGNvbnN0IGlubmVyID0gc3VtLm9wdGlvbmFsLnZhbHVlPy5zdW07XG4gICAgICAgIGlmIChpbm5lcj8ub25lb2ZLaW5kID09PSAncGFydHknKSByZXR1cm4gaW5uZXIucGFydHkgPz8gJyc7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvKiogUmVhZHMgYSBEYW1sIGVudW0gY29uc3RydWN0b3IgbmFtZSAoZS5nLiBBbGxvY2F0aW9uVjIgVHJhbnNmZXJTaWRlIFNlbmRlclNpZGUvUmVjZWl2ZXJTaWRlKS4gKi9cbiAgICBjb25zdCBnZXRFbnVtQ29uc3RydWN0b3IgPSAoZmllbGRzOiBSZWNvcmRGaWVsZFtdLCBsYWJlbDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGNvbnN0IHN1bSA9IGdldEZpZWxkKGZpZWxkcywgbGFiZWwpO1xuICAgICAgaWYgKHN1bT8ub25lb2ZLaW5kID09PSAnZW51bScpIHJldHVybiBzdW0uZW51bS5jb25zdHJ1Y3RvciA/PyAnJztcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHNlbmRlciwgcmVjZWl2ZXIsIGFtb3VudCwgYW5kIGluc3RydW1lbnQgZmllbGRzIGZyb20gYSB0cmFuc2ZlciByZWNvcmQuXG4gICAgICogQ2FudG9uIGNvaW4gdHJhbnNmZXJzIGFuZCBjYnRjIHVzZSBpbnN0cnVtZW50SWQuYWRtaW47IHJlZ3VsYXIgdG9rZW4gdHJhbnNmZXJzIHVzZSBpbnN0cnVtZW50SWRlbnRpZmllci5zb3VyY2UuXG4gICAgICovXG4gICAgY29uc3QgZXh0cmFjdEZyb21UcmFuc2ZlclJlY29yZCA9IChcbiAgICAgIHRyYW5zZmVyUmVjb3JkOiBSZWNvcmRGaWVsZFtdLFxuICAgICAgaW5zdHJ1bWVudEZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgaW5zdHJ1bWVudEFkbWluRmllbGROYW1lOiBzdHJpbmdcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHNlbmRlckRhdGEgPSBnZXRGaWVsZCh0cmFuc2ZlclJlY29yZCwgJ3NlbmRlcicpO1xuICAgICAgaWYgKHNlbmRlckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5Jykgc2VuZGVyID0gc2VuZGVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgIGNvbnN0IHJlY2VpdmVyRGF0YSA9IGdldEZpZWxkKHRyYW5zZmVyUmVjb3JkLCAncmVjZWl2ZXInKTtcbiAgICAgIGlmIChyZWNlaXZlckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgcmVjZWl2ZXIgPSByZWNlaXZlckRhdGEucGFydHkgPz8gJyc7XG4gICAgICBjb25zdCBhbW91bnREYXRhID0gZ2V0RmllbGQodHJhbnNmZXJSZWNvcmQsICdhbW91bnQnKTtcbiAgICAgIGlmIChhbW91bnREYXRhPy5vbmVvZktpbmQgPT09ICdudW1lcmljJykgYW1vdW50ID0gYW1vdW50RGF0YS5udW1lcmljID8/ICcnO1xuICAgICAgY29uc3QgaW5zdHJ1bWVudEZpZWxkID0gZ2V0RmllbGQodHJhbnNmZXJSZWNvcmQsIGluc3RydW1lbnRGaWVsZE5hbWUpO1xuICAgICAgaWYgKGluc3RydW1lbnRGaWVsZD8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICBjb25zdCBpbnN0cnVtZW50RmllbGRzID0gaW5zdHJ1bWVudEZpZWxkLnJlY29yZD8uZmllbGRzID8/IFtdO1xuICAgICAgICBjb25zdCBhZG1pbkRhdGEgPSBnZXRGaWVsZChpbnN0cnVtZW50RmllbGRzLCBpbnN0cnVtZW50QWRtaW5GaWVsZE5hbWUpO1xuICAgICAgICBpZiAoYWRtaW5EYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIGluc3RydW1lbnRBZG1pbiA9IGFkbWluRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgY29uc3QgaWREYXRhID0gZ2V0RmllbGQoaW5zdHJ1bWVudEZpZWxkcywgJ2lkJyk7XG4gICAgICAgIGlmIChpZERhdGE/Lm9uZW9mS2luZCA9PT0gJ3RleHQnKSBpbnN0cnVtZW50SWQgPSBpZERhdGEudGV4dCA/PyAnJztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc3dpdGNoICh0eFR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLk9uZVN0ZXBQcmVBcHByb3ZhbDoge1xuICAgICAgICAvLyBDYW50b24gY29pbjogVHJhbnNmZXJQcmVhcHByb3ZhbFByb3Bvc2FsIGNyZWF0ZSBub2RlIOKGkiBwcm92aWRlcj1zZW5kZXIsIHJlY2VpdmVyXG4gICAgICAgIGNvbnN0IGNvaW5GaWVsZHMgPSBmaW5kQ3JlYXRlTm9kZUZpZWxkcygnVHJhbnNmZXJQcmVhcHByb3ZhbFByb3Bvc2FsJyk7XG4gICAgICAgIGlmIChjb2luRmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgcHJvdmlkZXJEYXRhID0gZ2V0RmllbGQoY29pbkZpZWxkcywgJ3Byb3ZpZGVyJyk7XG4gICAgICAgICAgaWYgKHByb3ZpZGVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBzZW5kZXIgPSBwcm92aWRlckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgY29uc3QgcmVjZWl2ZXJEYXRhID0gZ2V0RmllbGQoY29pbkZpZWxkcywgJ3JlY2VpdmVyJyk7XG4gICAgICAgICAgaWYgKHJlY2VpdmVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSByZWNlaXZlciA9IHJlY2VpdmVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICBhbW91bnQgPSAnMCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVG9rZW46IFRyYW5zZmVyUHJlYXBwcm92YWwgY3JlYXRlIG5vZGUg4oaSIG9wZXJhdG9yPXNlbmRlciwgcmVjZWl2ZXIsIGluc3RydW1lbnRBZG1pbiwgaW5zdHJ1bWVudEFsbG93YW5jZXNcbiAgICAgICAgY29uc3QgdG9rZW5GaWVsZHMgPSBmaW5kQ3JlYXRlTm9kZUZpZWxkcygnVHJhbnNmZXJQcmVhcHByb3ZhbCcpO1xuICAgICAgICBpZiAodG9rZW5GaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBvcGVyYXRvckRhdGEgPSBnZXRGaWVsZCh0b2tlbkZpZWxkcywgJ29wZXJhdG9yJyk7XG4gICAgICAgICAgaWYgKG9wZXJhdG9yRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBzZW5kZXIgPSBvcGVyYXRvckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgY29uc3QgcmVjZWl2ZXJEYXRhID0gZ2V0RmllbGQodG9rZW5GaWVsZHMsICdyZWNlaXZlcicpO1xuICAgICAgICAgIGlmIChyZWNlaXZlckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgcmVjZWl2ZXIgPSByZWNlaXZlckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgYW1vdW50ID0gJzAnO1xuICAgICAgICAgIGNvbnN0IGluc3RydW1lbnRBZG1pbkRhdGEgPSBnZXRGaWVsZCh0b2tlbkZpZWxkcywgJ2luc3RydW1lbnRBZG1pbicpO1xuICAgICAgICAgIGlmIChpbnN0cnVtZW50QWRtaW5EYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIGluc3RydW1lbnRBZG1pbiA9IGluc3RydW1lbnRBZG1pbkRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgY29uc3QgYWxsb3dhbmNlc0RhdGEgPSBnZXRGaWVsZCh0b2tlbkZpZWxkcywgJ2luc3RydW1lbnRBbGxvd2FuY2VzJyk7XG4gICAgICAgICAgaWYgKGFsbG93YW5jZXNEYXRhPy5vbmVvZktpbmQgPT09ICdsaXN0Jykge1xuICAgICAgICAgICAgLy8gZm9yIHRoZSBzYW1lIGluc3RydW1lbnQgYWRtaW4sIGlmIG11bHRpcGxlIHRva2VucyBhcmUgc3VwcG9ydGVkIHRoZW4gd2UgY2FuIGVuYWJsZSBhbGwgb2YgdGhlbSxcbiAgICAgICAgICAgIC8vIGJ1dCB3ZSB3b24ndCBiZSBkb2luZyB0aGF0IGZvciBub3dcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0QWxsb3dhbmNlID0gYWxsb3dhbmNlc0RhdGEubGlzdD8uZWxlbWVudHM/LlswXT8uc3VtO1xuICAgICAgICAgICAgaWYgKGZpcnN0QWxsb3dhbmNlPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFsbG93YW5jZUZpZWxkcyA9IGZpcnN0QWxsb3dhbmNlLnJlY29yZD8uZmllbGRzID8/IFtdO1xuICAgICAgICAgICAgICBjb25zdCBpZERhdGEgPSBnZXRGaWVsZChhbGxvd2FuY2VGaWVsZHMsICdpZCcpO1xuICAgICAgICAgICAgICBpZiAoaWREYXRhPy5vbmVvZktpbmQgPT09ICd0ZXh0JykgaW5zdHJ1bWVudElkID0gaWREYXRhLnRleHQgPz8gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlckFjY2VwdDoge1xuICAgICAgICAvLyBDYW50b24gY29pbjogQW11bGV0IGNyZWF0ZSBub2RlIOKGkiBkc289c2VuZGVyLCBvd25lcj1yZWNlaXZlciwgYW1vdW50LmluaXRpYWxBbW91bnRcbiAgICAgICAgY29uc3QgYW11bGV0RmllbGRzID0gZmluZENyZWF0ZU5vZGVGaWVsZHMoJ0FtdWxldCcpO1xuICAgICAgICBpZiAoYW11bGV0RmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgZHNvRGF0YSA9IGdldEZpZWxkKGFtdWxldEZpZWxkcywgJ2RzbycpO1xuICAgICAgICAgIGlmIChkc29EYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHNlbmRlciA9IGRzb0RhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgY29uc3Qgb3duZXJEYXRhID0gZ2V0RmllbGQoYW11bGV0RmllbGRzLCAnb3duZXInKTtcbiAgICAgICAgICBpZiAob3duZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHJlY2VpdmVyID0gb3duZXJEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIGNvbnN0IGFtb3VudEZpZWxkID0gZ2V0RmllbGQoYW11bGV0RmllbGRzLCAnYW1vdW50Jyk7XG4gICAgICAgICAgaWYgKGFtb3VudEZpZWxkPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsQW1vdW50RGF0YSA9IGdldEZpZWxkKGFtb3VudEZpZWxkLnJlY29yZD8uZmllbGRzID8/IFtdLCAnaW5pdGlhbEFtb3VudCcpO1xuICAgICAgICAgICAgaWYgKGluaXRpYWxBbW91bnREYXRhPy5vbmVvZktpbmQgPT09ICdudW1lcmljJykgYW1vdW50ID0gaW5pdGlhbEFtb3VudERhdGEubnVtZXJpYyA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVndWxhciB0b2tlbiAobm9uLWNidGMpOiBFeGVjdXRlZFRyYW5zZmVyIGNyZWF0ZSBub2RlXG4gICAgICAgIC8vIOKGkiB0cmFuc2Zlci57c2VuZGVyLCByZWNlaXZlciwgYW1vdW50LCBpbnN0cnVtZW50SWRlbnRpZmllci57c291cmNlPWFkbWluLCBpZH19XG4gICAgICAgIGNvbnN0IGV4ZWN1dGVkVHJhbnNmZXJGaWVsZHMgPSBmaW5kQ3JlYXRlTm9kZUZpZWxkcygnRXhlY3V0ZWRUcmFuc2ZlcicpO1xuICAgICAgICBpZiAoZXhlY3V0ZWRUcmFuc2ZlckZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IHRyYW5zZmVyU3VtID0gZ2V0RmllbGQoZXhlY3V0ZWRUcmFuc2ZlckZpZWxkcywgJ3RyYW5zZmVyJyk7XG4gICAgICAgICAgaWYgKHRyYW5zZmVyU3VtPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICBleHRyYWN0RnJvbVRyYW5zZmVyUmVjb3JkKHRyYW5zZmVyU3VtLnJlY29yZD8uZmllbGRzID8/IFtdLCAnaW5zdHJ1bWVudElkZW50aWZpZXInLCAnc291cmNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNidGMgdG9rZW4gZmFsbGJhY2s6IFRyYW5zZmVyUnVsZV9EaXJlY3RUcmFuc2ZlciBleGVyY2lzZSBub2RlXG4gICAgICAgIC8vIOKGkiB0cmFuc2Zlci57c2VuZGVyLCByZWNlaXZlciwgYW1vdW50LCBpbnN0cnVtZW50SWQue2FkbWluLCBpZH19XG4gICAgICAgIGNvbnN0IGRpcmVjdFRyYW5zZmVyRmllbGRzID0gZmluZEV4ZXJjaXNlTm9kZUZpZWxkcygnVHJhbnNmZXJSdWxlX0RpcmVjdFRyYW5zZmVyJyk7XG4gICAgICAgIGlmIChkaXJlY3RUcmFuc2ZlckZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IHRyYW5zZmVyU3VtID0gZ2V0RmllbGQoZGlyZWN0VHJhbnNmZXJGaWVsZHMsICd0cmFuc2ZlcicpO1xuICAgICAgICAgIGlmICh0cmFuc2ZlclN1bT8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgZXh0cmFjdEZyb21UcmFuc2ZlclJlY29yZCh0cmFuc2ZlclN1bS5yZWNvcmQ/LmZpZWxkcyA/PyBbXSwgJ2luc3RydW1lbnRJZCcsICdhZG1pbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVU0RDeC90d28tc3RlcCB0b2tlbiBmYWxsYmFjazogVHJhbnNmZXJSdWxlX1R3b1N0ZXBUcmFuc2ZlciBleGVyY2lzZSBub2RlXG4gICAgICAgIC8vIOKGkiB0cmFuc2Zlci57c2VuZGVyLCByZWNlaXZlciwgYW1vdW50LCBpbnN0cnVtZW50SWQue2FkbWluLCBpZH19XG4gICAgICAgIGlmICghc2VuZGVyKSB7XG4gICAgICAgICAgY29uc3QgdHdvU3RlcFRyYW5zZmVyRmllbGRzID0gZmluZEV4ZXJjaXNlTm9kZUZpZWxkcygnVHJhbnNmZXJSdWxlX1R3b1N0ZXBUcmFuc2ZlcicpO1xuICAgICAgICAgIGlmICh0d29TdGVwVHJhbnNmZXJGaWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZmVyU3VtID0gZ2V0RmllbGQodHdvU3RlcFRyYW5zZmVyRmllbGRzLCAndHJhbnNmZXInKTtcbiAgICAgICAgICAgIGlmICh0cmFuc2ZlclN1bT8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgICBleHRyYWN0RnJvbVRyYW5zZmVyUmVjb3JkKHRyYW5zZmVyU3VtLnJlY29yZD8uZmllbGRzID8/IFtdLCAnaW5zdHJ1bWVudElkJywgJ2FkbWluJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlclJlamVjdDoge1xuICAgICAgICAvLyBDYW50b24gY29pbjogQW11bGV0IGNyZWF0ZSBub2RlIOKGkiBkc289c2VuZGVyLCBvd25lcj1yZWNlaXZlciwgYW1vdW50LmluaXRpYWxBbW91bnRcbiAgICAgICAgY29uc3QgYW11bGV0RmllbGRzID0gZmluZENyZWF0ZU5vZGVGaWVsZHMoJ0FtdWxldCcpO1xuICAgICAgICBpZiAoYW11bGV0RmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgZHNvRGF0YSA9IGdldEZpZWxkKGFtdWxldEZpZWxkcywgJ2RzbycpO1xuICAgICAgICAgIGlmIChkc29EYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHNlbmRlciA9IGRzb0RhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgY29uc3Qgb3duZXJEYXRhID0gZ2V0RmllbGQoYW11bGV0RmllbGRzLCAnb3duZXInKTtcbiAgICAgICAgICBpZiAob3duZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHJlY2VpdmVyID0gb3duZXJEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIGNvbnN0IGFtb3VudEZpZWxkID0gZ2V0RmllbGQoYW11bGV0RmllbGRzLCAnYW1vdW50Jyk7XG4gICAgICAgICAgaWYgKGFtb3VudEZpZWxkPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsQW1vdW50RGF0YSA9IGdldEZpZWxkKGFtb3VudEZpZWxkLnJlY29yZD8uZmllbGRzID8/IFtdLCAnaW5pdGlhbEFtb3VudCcpO1xuICAgICAgICAgICAgaWYgKGluaXRpYWxBbW91bnREYXRhPy5vbmVvZktpbmQgPT09ICdudW1lcmljJykgYW1vdW50ID0gaW5pdGlhbEFtb3VudERhdGEubnVtZXJpYyA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVndWxhciB0b2tlbiAobm9uLWNidGMpOiBSZWplY3RlZFRyYW5zZmVyIGNyZWF0ZSBub2RlXG4gICAgICAgIC8vIOKGkiB0cmFuc2Zlci57c2VuZGVyLCByZWNlaXZlciwgYW1vdW50LCBpbnN0cnVtZW50SWRlbnRpZmllci57c291cmNlPWFkbWluLCBpZH19XG4gICAgICAgIGNvbnN0IHJlamVjdGVkVHJhbnNmZXJGaWVsZHMgPSBmaW5kQ3JlYXRlTm9kZUZpZWxkcygnUmVqZWN0ZWRUcmFuc2ZlcicpO1xuICAgICAgICBpZiAocmVqZWN0ZWRUcmFuc2ZlckZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IHRyYW5zZmVyU3VtID0gZ2V0RmllbGQocmVqZWN0ZWRUcmFuc2ZlckZpZWxkcywgJ3RyYW5zZmVyJyk7XG4gICAgICAgICAgaWYgKHRyYW5zZmVyU3VtPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICBleHRyYWN0RnJvbVRyYW5zZmVyUmVjb3JkKHRyYW5zZmVyU3VtLnJlY29yZD8uZmllbGRzID8/IFtdLCAnaW5zdHJ1bWVudElkZW50aWZpZXInLCAnc291cmNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNidGMgdG9rZW4gZmFsbGJhY2s6IEhvbGRpbmcgY3JlYXRlIG5vZGUgKG93bmVyPXNlbmRlciwgaW5zdHJ1bWVudCwgYW1vdW50KVxuICAgICAgICAvLyArIFRyYW5zZmVySW5zdHJ1Y3Rpb25fUmVqZWN0IGV4ZXJjaXNlIChhY3RpbmdQYXJ0aWVzWzBdPXJlY2VpdmVyIHdobyByZWplY3RlZClcbiAgICAgICAgY29uc3QgaG9sZGluZ0ZpZWxkcyA9IGZpbmRDcmVhdGVOb2RlRmllbGRzKCdIb2xkaW5nJyk7XG4gICAgICAgIGlmIChob2xkaW5nRmllbGRzKSB7XG4gICAgICAgICAgY29uc3Qgb3duZXJEYXRhID0gZ2V0RmllbGQoaG9sZGluZ0ZpZWxkcywgJ293bmVyJyk7XG4gICAgICAgICAgaWYgKG93bmVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBzZW5kZXIgPSBvd25lckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgY29uc3QgYW1vdW50RGF0YSA9IGdldEZpZWxkKGhvbGRpbmdGaWVsZHMsICdhbW91bnQnKTtcbiAgICAgICAgICBpZiAoYW1vdW50RGF0YT8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIGFtb3VudCA9IGFtb3VudERhdGEubnVtZXJpYyA/PyAnJztcbiAgICAgICAgICBjb25zdCBpbnN0cnVtZW50RGF0YSA9IGdldEZpZWxkKGhvbGRpbmdGaWVsZHMsICdpbnN0cnVtZW50Jyk7XG4gICAgICAgICAgaWYgKGluc3RydW1lbnREYXRhPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICBjb25zdCBpbnN0cnVtZW50RmllbGRzID0gaW5zdHJ1bWVudERhdGEucmVjb3JkPy5maWVsZHMgPz8gW107XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VEYXRhID0gZ2V0RmllbGQoaW5zdHJ1bWVudEZpZWxkcywgJ3NvdXJjZScpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZURhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgaW5zdHJ1bWVudEFkbWluID0gc291cmNlRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IGlkRGF0YSA9IGdldEZpZWxkKGluc3RydW1lbnRGaWVsZHMsICdpZCcpO1xuICAgICAgICAgICAgaWYgKGlkRGF0YT8ub25lb2ZLaW5kID09PSAndGV4dCcpIGluc3RydW1lbnRJZCA9IGlkRGF0YS50ZXh0ID8/ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByZWNlaXZlclBhcnR5ID0gZmluZEV4ZXJjaXNlQWN0aW5nUGFydHkoJ1RyYW5zZmVySW5zdHJ1Y3Rpb25fUmVqZWN0Jyk7XG4gICAgICAgICAgaWYgKHJlY2VpdmVyUGFydHkpIHJlY2VpdmVyID0gcmVjZWl2ZXJQYXJ0eTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduOiB7XG4gICAgICAgIC8vIEhvbGRpbmcgY3JlYXRlIG5vZGUg4oaSIG93bmVyPXNlbmRlcj1yZWNlaXZlciAoYWxsb2NhdGluZyBwYXJ0eSBnZXRzIHRoZWlyIGhvbGRpbmcgYmFjayksXG4gICAgICAgIC8vIGluc3RydW1lbnQue3NvdXJjZT1hZG1pbiwgaWR9LCBhbW91bnRcbiAgICAgICAgY29uc3QgaG9sZGluZ0ZpZWxkcyA9IGZpbmRDcmVhdGVOb2RlRmllbGRzKCdIb2xkaW5nJyk7XG4gICAgICAgIGlmIChob2xkaW5nRmllbGRzKSB7XG4gICAgICAgICAgY29uc3Qgb3duZXJEYXRhID0gZ2V0RmllbGQoaG9sZGluZ0ZpZWxkcywgJ293bmVyJyk7XG4gICAgICAgICAgaWYgKG93bmVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSB7XG4gICAgICAgICAgICByZWNlaXZlciA9IG93bmVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICAgIHNlbmRlciA9IHJlY2VpdmVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhbW91bnREYXRhID0gZ2V0RmllbGQoaG9sZGluZ0ZpZWxkcywgJ2Ftb3VudCcpO1xuICAgICAgICAgIGlmIChhbW91bnREYXRhPy5vbmVvZktpbmQgPT09ICdudW1lcmljJykgYW1vdW50ID0gYW1vdW50RGF0YS5udW1lcmljID8/ICcnO1xuICAgICAgICAgIGNvbnN0IGluc3RydW1lbnREYXRhID0gZ2V0RmllbGQoaG9sZGluZ0ZpZWxkcywgJ2luc3RydW1lbnQnKTtcbiAgICAgICAgICBpZiAoaW5zdHJ1bWVudERhdGE/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RydW1lbnRGaWVsZHMgPSBpbnN0cnVtZW50RGF0YS5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZURhdGEgPSBnZXRGaWVsZChpbnN0cnVtZW50RmllbGRzLCAnc291cmNlJyk7XG4gICAgICAgICAgICBpZiAoc291cmNlRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBpbnN0cnVtZW50QWRtaW4gPSBzb3VyY2VEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgICAgY29uc3QgaWREYXRhID0gZ2V0RmllbGQoaW5zdHJ1bWVudEZpZWxkcywgJ2lkJyk7XG4gICAgICAgICAgICBpZiAoaWREYXRhPy5vbmVvZktpbmQgPT09ICd0ZXh0JykgaW5zdHJ1bWVudElkID0gaWREYXRhLnRleHQgPz8gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BbGxvY2F0aW9uQWxsb2NhdGU6IHtcbiAgICAgICAgLy8gVjIgKGFsbG9jYXRpb24taW5zdHJ1Y3Rpb24tdjIpOiBBbGxvY2F0aW9uVjIgY3JlYXRlIG5vZGVcbiAgICAgICAgLy8g4oaSIGFsbG9jYXRpb24ue2F1dGhvcml6ZXIub3duZXIsIGFkbWluLCB0cmFuc2ZlckxlZ1NpZGVzW10ue3NpZGUsIG90aGVyc2lkZS5vd25lciwgYW1vdW50LCBpbnN0cnVtZW50SWR9fS5cbiAgICAgICAgLy8gVGhlIGF1dGhvcml6ZXIgaXMgdGhlIGFsbG9jYXRpbmcgcGFydHk7IGl0cyBvdXRnb2luZyBsZWcgKHNpZGU9U2VuZGVyU2lkZSkgY2FycmllcyB0aGVcbiAgICAgICAgLy8gc2V0dGxlbWVudCBjb3VudGVycGFydHkgKHJlY2VpdmVyKSBhbmQgYW1vdW50LiBBIHJlY2VpdmVyLW9ubHkgYWxsb2NhdGlvbiBoYXMgbm9cbiAgICAgICAgLy8gU2VuZGVyU2lkZSBsZWcg4oCUIHRoZSBhdXRob3JpemVyIHJlY2VpdmVzLCBzbyBzZW5kZXIvcmVjZWl2ZXIgZmxpcCB0byB0aGUgb3RoZXJzaWRlIG9mXG4gICAgICAgIC8vIGl0cyAoZmlyc3QpIFJlY2VpdmVyU2lkZSBsZWcuIFRoZSBmaXJzdCBtYXRjaGluZyBsZWcgd2lucyBmb3IgbXVsdGktbGVnIGFsbG9jYXRpb25zLlxuICAgICAgICBjb25zdCBhbGxvY2F0aW9uVjJGaWVsZHMgPSBmaW5kQ3JlYXRlTm9kZUZpZWxkcygnQWxsb2NhdGlvblYyJyk7XG4gICAgICAgIGlmIChhbGxvY2F0aW9uVjJGaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBhbGxvY2F0aW9uRmllbGQgPSBnZXRGaWVsZChhbGxvY2F0aW9uVjJGaWVsZHMsICdhbGxvY2F0aW9uJyk7XG4gICAgICAgICAgaWYgKGFsbG9jYXRpb25GaWVsZD8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgY29uc3QgYWxsb2NhdGlvblJlY29yZCA9IGFsbG9jYXRpb25GaWVsZC5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IGF1dGhvcml6ZXIgPSBnZXRGaWVsZChhbGxvY2F0aW9uUmVjb3JkLCAnYXV0aG9yaXplcicpO1xuICAgICAgICAgICAgY29uc3QgYXV0aG9yaXplck93bmVyID1cbiAgICAgICAgICAgICAgYXV0aG9yaXplcj8ub25lb2ZLaW5kID09PSAncmVjb3JkJ1xuICAgICAgICAgICAgICAgID8gZ2V0UGFydHlGcm9tT3B0aW9uYWwoYXV0aG9yaXplci5yZWNvcmQ/LmZpZWxkcyA/PyBbXSwgJ293bmVyJylcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGFkbWluRGF0YSA9IGdldEZpZWxkKGFsbG9jYXRpb25SZWNvcmQsICdhZG1pbicpO1xuICAgICAgICAgICAgaWYgKGFkbWluRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBpbnN0cnVtZW50QWRtaW4gPSBhZG1pbkRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgICBjb25zdCBsZWdzRGF0YSA9IGdldEZpZWxkKGFsbG9jYXRpb25SZWNvcmQsICd0cmFuc2ZlckxlZ1NpZGVzJyk7XG4gICAgICAgICAgICBpZiAobGVnc0RhdGE/Lm9uZW9mS2luZCA9PT0gJ2xpc3QnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxlZ1JlY29yZHMgPSAobGVnc0RhdGEubGlzdD8uZWxlbWVudHMgPz8gW10pXG4gICAgICAgICAgICAgICAgLm1hcCgobGVnKSA9PiAobGVnLnN1bS5vbmVvZktpbmQgPT09ICdyZWNvcmQnID8gbGVnLnN1bS5yZWNvcmQuZmllbGRzIDogdW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChmaWVsZHMpOiBmaWVsZHMgaXMgUmVjb3JkRmllbGRbXSA9PiBmaWVsZHMgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIGNvbnN0IHNlbmRlckxlZyA9IGxlZ1JlY29yZHMuZmluZCgobGVnKSA9PiBnZXRFbnVtQ29uc3RydWN0b3IobGVnLCAnc2lkZScpID09PSAnU2VuZGVyU2lkZScpO1xuICAgICAgICAgICAgICBjb25zdCBsZWcgPSBzZW5kZXJMZWcgPz8gbGVnUmVjb3Jkcy5maW5kKChsZWcpID0+IGdldEVudW1Db25zdHJ1Y3RvcihsZWcsICdzaWRlJykgPT09ICdSZWNlaXZlclNpZGUnKTtcbiAgICAgICAgICAgICAgaWYgKGxlZykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZ090aGVyc2lkZSA9IGdldEZpZWxkKGxlZywgJ290aGVyc2lkZScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyc2lkZU93bmVyID1cbiAgICAgICAgICAgICAgICAgIGxlZ090aGVyc2lkZT8ub25lb2ZLaW5kID09PSAncmVjb3JkJ1xuICAgICAgICAgICAgICAgICAgICA/IGdldFBhcnR5RnJvbU9wdGlvbmFsKGxlZ090aGVyc2lkZS5yZWNvcmQ/LmZpZWxkcyA/PyBbXSwgJ293bmVyJylcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVnQW1vdW50ID0gZ2V0RmllbGQobGVnLCAnYW1vdW50Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVnSW5zdHJ1bWVudElkID0gZ2V0RmllbGQobGVnLCAnaW5zdHJ1bWVudElkJyk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbmRlckxlZykge1xuICAgICAgICAgICAgICAgICAgc2VuZGVyID0gYXV0aG9yaXplck93bmVyID8/ICcnO1xuICAgICAgICAgICAgICAgICAgcmVjZWl2ZXIgPSBvdGhlcnNpZGVPd25lciA/PyAnJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc2VuZGVyID0gb3RoZXJzaWRlT3duZXIgPz8gJyc7XG4gICAgICAgICAgICAgICAgICByZWNlaXZlciA9IGF1dGhvcml6ZXJPd25lciA/PyAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGxlZ0Ftb3VudD8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIGFtb3VudCA9IGxlZ0Ftb3VudC5udW1lcmljID8/ICcnO1xuICAgICAgICAgICAgICAgIGlmIChsZWdJbnN0cnVtZW50SWQ/Lm9uZW9mS2luZCA9PT0gJ3RleHQnKSBpbnN0cnVtZW50SWQgPSBsZWdJbnN0cnVtZW50SWQudGV4dCA/PyAnJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBEdnBMZWdBbGxvY2F0aW9uIGNyZWF0ZSBub2RlIOKGkiBhbGxvY2F0aW9uLnRyYW5zZmVyTGVnIGNvbnRhaW5zIHRoZSBmdWxsIHNldHRsZW1lbnQgdHJhbnNmZXIgZGV0YWlsczpcbiAgICAgICAgLy8gc2VuZGVyLCByZWNlaXZlciAodGhlIGFjdHVhbCBzZXR0bGVtZW50IGNvdW50ZXJwYXJ0eSksIGFtb3VudCwgYW5kIGluc3RydW1lbnRJZFxuICAgICAgICBjb25zdCBkdnBGaWVsZHMgPSBmaW5kQ3JlYXRlTm9kZUZpZWxkcygnRHZwTGVnQWxsb2NhdGlvbicpO1xuICAgICAgICBpZiAoZHZwRmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgYWxsb2NhdGlvbkZpZWxkID0gZ2V0RmllbGQoZHZwRmllbGRzLCAnYWxsb2NhdGlvbicpO1xuICAgICAgICAgIGlmIChhbGxvY2F0aW9uRmllbGQ/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRpb25GaWVsZHMgPSBhbGxvY2F0aW9uRmllbGQucmVjb3JkPy5maWVsZHMgPz8gW107XG4gICAgICAgICAgICBjb25zdCB0cmFuc2ZlckxlZ0ZpZWxkID0gZ2V0RmllbGQoYWxsb2NhdGlvbkZpZWxkcywgJ3RyYW5zZmVyTGVnJyk7XG4gICAgICAgICAgICBpZiAodHJhbnNmZXJMZWdGaWVsZD8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgICBjb25zdCB0cmFuc2ZlckxlZ0ZpZWxkcyA9IHRyYW5zZmVyTGVnRmllbGQucmVjb3JkPy5maWVsZHMgPz8gW107XG4gICAgICAgICAgICAgIGNvbnN0IHNlbmRlckRhdGEgPSBnZXRGaWVsZCh0cmFuc2ZlckxlZ0ZpZWxkcywgJ3NlbmRlcicpO1xuICAgICAgICAgICAgICBpZiAoc2VuZGVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBzZW5kZXIgPSBzZW5kZXJEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgICAgICBjb25zdCByZWNlaXZlckRhdGEgPSBnZXRGaWVsZCh0cmFuc2ZlckxlZ0ZpZWxkcywgJ3JlY2VpdmVyJyk7XG4gICAgICAgICAgICAgIGlmIChyZWNlaXZlckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgcmVjZWl2ZXIgPSByZWNlaXZlckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgICAgIGNvbnN0IGFtb3VudERhdGEgPSBnZXRGaWVsZCh0cmFuc2ZlckxlZ0ZpZWxkcywgJ2Ftb3VudCcpO1xuICAgICAgICAgICAgICBpZiAoYW1vdW50RGF0YT8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIGFtb3VudCA9IGFtb3VudERhdGEubnVtZXJpYyA/PyAnJztcbiAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1bWVudElkRmllbGQgPSBnZXRGaWVsZCh0cmFuc2ZlckxlZ0ZpZWxkcywgJ2luc3RydW1lbnRJZCcpO1xuICAgICAgICAgICAgICBpZiAoaW5zdHJ1bWVudElkRmllbGQ/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVtZW50SWRGaWVsZHMgPSBpbnN0cnVtZW50SWRGaWVsZC5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBhZG1pbkRhdGEgPSBnZXRGaWVsZChpbnN0cnVtZW50SWRGaWVsZHMsICdhZG1pbicpO1xuICAgICAgICAgICAgICAgIGlmIChhZG1pbkRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgaW5zdHJ1bWVudEFkbWluID0gYWRtaW5EYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkRGF0YSA9IGdldEZpZWxkKGluc3RydW1lbnRJZEZpZWxkcywgJ2lkJyk7XG4gICAgICAgICAgICAgICAgaWYgKGlkRGF0YT8ub25lb2ZLaW5kID09PSAndGV4dCcpIGluc3RydW1lbnRJZCA9IGlkRGF0YS50ZXh0ID8/ICcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZhbGxiYWNrOiBpZiBEdnBMZWdBbGxvY2F0aW9uIGlzIGFic2VudCwgdXNlIHRoZSBvcGVyYXRvciBhcyByZWNlaXZlclxuICAgICAgICBpZiAoIXJlY2VpdmVyKSB7XG4gICAgICAgICAgY29uc3QgYWxsb2NhdGVGaWVsZHMgPSBmaW5kRXhlcmNpc2VOb2RlRmllbGRzKCdBbGxvY2F0aW9uRmFjdG9yeV9BbGxvY2F0ZScpO1xuICAgICAgICAgIGlmIChhbGxvY2F0ZUZpZWxkcykge1xuICAgICAgICAgICAgY29uc3QgYWRtaW5EYXRhID0gZ2V0RmllbGQoYWxsb2NhdGVGaWVsZHMsICdleHBlY3RlZEFkbWluJyk7XG4gICAgICAgICAgICBpZiAoYWRtaW5EYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHJlY2VpdmVyID0gYWRtaW5EYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbmRlcikge1xuICAgICAgICAgIGNvbnN0IHNlbmRlclBhcnR5ID0gZmluZEV4ZXJjaXNlQWN0aW5nUGFydHkoJ0FsbG9jYXRpb25GYWN0b3J5X0FsbG9jYXRlJyk7XG4gICAgICAgICAgaWYgKHNlbmRlclBhcnR5KSBzZW5kZXIgPSBzZW5kZXJQYXJ0eTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWxsb2NhdGlvblJlamVjdDoge1xuICAgICAgICAvLyBSZWplY3RlZER2cCBjcmVhdGUgbm9kZSDihpIgZHZwLntzZWxsZXI9c2VuZGVyLCBidXllcj1yZWNlaXZlciwgdGVybXMuZGVsaXZlcmllc1swXS57YW1vdW50LCBpbnN0cnVtZW50LnthZG1pbiwgaWR9fX1cbiAgICAgICAgY29uc3QgcmVqZWN0ZWREdnBGaWVsZHMgPSBmaW5kQ3JlYXRlTm9kZUZpZWxkcygnUmVqZWN0ZWREdnAnKTtcbiAgICAgICAgaWYgKHJlamVjdGVkRHZwRmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgZHZwRmllbGQgPSBnZXRGaWVsZChyZWplY3RlZER2cEZpZWxkcywgJ2R2cCcpO1xuICAgICAgICAgIGlmIChkdnBGaWVsZD8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgY29uc3QgZHZwRmllbGRzID0gZHZwRmllbGQucmVjb3JkPy5maWVsZHMgPz8gW107XG4gICAgICAgICAgICBjb25zdCBzZWxsZXJEYXRhID0gZ2V0RmllbGQoZHZwRmllbGRzLCAnc2VsbGVyJyk7XG4gICAgICAgICAgICBpZiAoc2VsbGVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBzZW5kZXIgPSBzZWxsZXJEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgICAgY29uc3QgYnV5ZXJEYXRhID0gZ2V0RmllbGQoZHZwRmllbGRzLCAnYnV5ZXInKTtcbiAgICAgICAgICAgIGlmIChidXllckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgcmVjZWl2ZXIgPSBidXllckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgICBjb25zdCB0ZXJtc0ZpZWxkID0gZ2V0RmllbGQoZHZwRmllbGRzLCAndGVybXMnKTtcbiAgICAgICAgICAgIGlmICh0ZXJtc0ZpZWxkPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRlcm1zRmllbGRzID0gdGVybXNGaWVsZC5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgICAgICAgY29uc3QgZGVsaXZlcmllc0ZpZWxkID0gZ2V0RmllbGQodGVybXNGaWVsZHMsICdkZWxpdmVyaWVzJyk7XG4gICAgICAgICAgICAgIGlmIChkZWxpdmVyaWVzRmllbGQ/Lm9uZW9mS2luZCA9PT0gJ2xpc3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3REZWxpdmVyeSA9IGRlbGl2ZXJpZXNGaWVsZC5saXN0Py5lbGVtZW50cz8uWzBdPy5zdW07XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0RGVsaXZlcnk/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGl2ZXJ5RmllbGRzID0gZmlyc3REZWxpdmVyeS5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFtb3VudERhdGEgPSBnZXRGaWVsZChkZWxpdmVyeUZpZWxkcywgJ2Ftb3VudCcpO1xuICAgICAgICAgICAgICAgICAgaWYgKGFtb3VudERhdGE/Lm9uZW9mS2luZCA9PT0gJ251bWVyaWMnKSBhbW91bnQgPSBhbW91bnREYXRhLm51bWVyaWMgPz8gJyc7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVtZW50RmllbGQgPSBnZXRGaWVsZChkZWxpdmVyeUZpZWxkcywgJ2luc3RydW1lbnQnKTtcbiAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVtZW50RmllbGQ/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1bWVudEZpZWxkcyA9IGluc3RydW1lbnRGaWVsZC5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRtaW5EYXRhID0gZ2V0RmllbGQoaW5zdHJ1bWVudEZpZWxkcywgJ2FkbWluJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhZG1pbkRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgaW5zdHJ1bWVudEFkbWluID0gYWRtaW5EYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZERhdGEgPSBnZXRGaWVsZChpbnN0cnVtZW50RmllbGRzLCAnaWQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkRGF0YT8ub25lb2ZLaW5kID09PSAndGV4dCcpIGluc3RydW1lbnRJZCA9IGlkRGF0YS50ZXh0ID8/ICcnO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQ29zaWduRGVsZWdhdGlvbkFjY2VwdDoge1xuICAgICAgICAvLyBUcmFkZVdlYjogQ29zaWduaW5nRGVsZWdhdGlvblByb3Bvc2FsX0FjY2VwdDsgVGVtcGxlOiBBY2NlcHREZWxlZ2F0aW9uUHJvcG9zYWwuXG4gICAgICAgIGNvbnN0IHNpZ25lclBhcnR5ID1cbiAgICAgICAgICBmaW5kRXhlcmNpc2VBY3RpbmdQYXJ0eSgnQ29zaWduaW5nRGVsZWdhdGlvblByb3Bvc2FsX0FjY2VwdCcpID8/XG4gICAgICAgICAgZmluZEV4ZXJjaXNlQWN0aW5nUGFydHkoJ0FjY2VwdERlbGVnYXRpb25Qcm9wb3NhbCcpO1xuICAgICAgICBpZiAoc2lnbmVyUGFydHkpIHNlbmRlciA9IHNpZ25lclBhcnR5O1xuXG4gICAgICAgIC8vIFRyYWRlV2ViIGNyZWF0ZXMgQ29zaWduaW5nRGVsZWdhdGlvbiB7IGFkbWluLCBzaWduZXIgfTsgVGVtcGxlIGNyZWF0ZXNcbiAgICAgICAgLy8gRGVsZWdhdGlvbiB7IG9wZXJhdG9yLCB1c2VyIH0gZnJvbSB0aGUgc2FtZSBhY2NlcHRhbmNlIG9wZXJhdGlvbi5cbiAgICAgICAgY29uc3QgZGVsZWdhdGlvbkZpZWxkcyA9IGZpbmRDcmVhdGVOb2RlRmllbGRzKCdDb3NpZ25pbmdEZWxlZ2F0aW9uJykgPz8gZmluZENyZWF0ZU5vZGVGaWVsZHMoJ0RlbGVnYXRpb24nKTtcbiAgICAgICAgaWYgKGRlbGVnYXRpb25GaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBhZG1pbkRhdGEgPSBnZXRGaWVsZChkZWxlZ2F0aW9uRmllbGRzLCAnYWRtaW4nKSA/PyBnZXRGaWVsZChkZWxlZ2F0aW9uRmllbGRzLCAnb3BlcmF0b3InKTtcbiAgICAgICAgICBpZiAoYWRtaW5EYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHJlY2VpdmVyID0gYWRtaW5EYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICB9XG4gICAgICAgIGFtb3VudCA9ICcwJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyT2ZmZXJXaXRoZHJhd246IHtcbiAgICAgICAgLy8gQ2FudG9uIGNvaW46IEFtdWxldCBjcmVhdGUgbm9kZSDihpIgb3duZXI9c2VuZGVyPXJlY2VpdmVyLCBhbW91bnQuaW5pdGlhbEFtb3VudFxuICAgICAgICBjb25zdCBhbXVsZXRGaWVsZHMgPSBmaW5kQ3JlYXRlTm9kZUZpZWxkcygnQW11bGV0Jyk7XG4gICAgICAgIGlmIChhbXVsZXRGaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBvd25lckRhdGEgPSBnZXRGaWVsZChhbXVsZXRGaWVsZHMsICdvd25lcicpO1xuICAgICAgICAgIGlmIChvd25lckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5Jykge1xuICAgICAgICAgICAgcmVjZWl2ZXIgPSBvd25lckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgICBzZW5kZXIgPSByZWNlaXZlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYW1vdW50RmllbGQgPSBnZXRGaWVsZChhbXVsZXRGaWVsZHMsICdhbW91bnQnKTtcbiAgICAgICAgICBpZiAoYW1vdW50RmllbGQ/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxBbW91bnREYXRhID0gZ2V0RmllbGQoYW1vdW50RmllbGQucmVjb3JkPy5maWVsZHMgPz8gW10sICdpbml0aWFsQW1vdW50Jyk7XG4gICAgICAgICAgICBpZiAoaW5pdGlhbEFtb3VudERhdGE/Lm9uZW9mS2luZCA9PT0gJ251bWVyaWMnKSBhbW91bnQgPSBpbml0aWFsQW1vdW50RGF0YS5udW1lcmljID8/ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBUb2tlbjogSG9sZGluZyBjcmVhdGUgbm9kZSDihpIgb3duZXI9c2VuZGVyPXJlY2VpdmVyLCBpbnN0cnVtZW50Lntzb3VyY2U9YWRtaW4sIGlkfSwgYW1vdW50XG4gICAgICAgIGNvbnN0IGhvbGRpbmdGaWVsZHMgPSBmaW5kQ3JlYXRlTm9kZUZpZWxkcygnSG9sZGluZycpO1xuICAgICAgICBpZiAoaG9sZGluZ0ZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IG93bmVyRGF0YSA9IGdldEZpZWxkKGhvbGRpbmdGaWVsZHMsICdvd25lcicpO1xuICAgICAgICAgIGlmIChvd25lckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5Jykge1xuICAgICAgICAgICAgcmVjZWl2ZXIgPSBvd25lckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgICBzZW5kZXIgPSByZWNlaXZlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYW1vdW50RGF0YSA9IGdldEZpZWxkKGhvbGRpbmdGaWVsZHMsICdhbW91bnQnKTtcbiAgICAgICAgICBpZiAoYW1vdW50RGF0YT8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIGFtb3VudCA9IGFtb3VudERhdGEubnVtZXJpYyA/PyAnJztcbiAgICAgICAgICBjb25zdCBpbnN0cnVtZW50RGF0YSA9IGdldEZpZWxkKGhvbGRpbmdGaWVsZHMsICdpbnN0cnVtZW50Jyk7XG4gICAgICAgICAgaWYgKGluc3RydW1lbnREYXRhPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICBjb25zdCBpbnN0cnVtZW50RmllbGRzID0gaW5zdHJ1bWVudERhdGEucmVjb3JkPy5maWVsZHMgPz8gW107XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VEYXRhID0gZ2V0RmllbGQoaW5zdHJ1bWVudEZpZWxkcywgJ3NvdXJjZScpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZURhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgaW5zdHJ1bWVudEFkbWluID0gc291cmNlRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IGlkRGF0YSA9IGdldEZpZWxkKGluc3RydW1lbnRGaWVsZHMsICdpZCcpO1xuICAgICAgICAgICAgaWYgKGlkRGF0YT8ub25lb2ZLaW5kID09PSAndGV4dCcpIGluc3RydW1lbnRJZCA9IGlkRGF0YS50ZXh0ID8/ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXJQcmVhcHByb3ZhbENhbmNlbDoge1xuICAgICAgICAvLyBDb2luIGNhbmNlbDogVHJhbnNmZXJQcmVhcHByb3ZhbF9DYW5jZWwgZXhlcmNpc2Ugb24gU3BsaWNlLkFtdWxldFJ1bGVzOlRyYW5zZmVyUHJlYXBwcm92YWwuXG4gICAgICAgIC8vIFNlbGYtc2VydmljZSDigJQgdGhlIGFjdGluZyBwYXJ0eSAob3IsIGFzIGEgZmFsbGJhY2ssIHRoZSBleGVyY2lzZWQgY2hvaWNlQXJndW1lbnQucCkgaXNcbiAgICAgICAgLy8gYm90aCBzZW5kZXIgYW5kIHJlY2VpdmVyLlxuICAgICAgICBjb25zdCBhY3RpbmdQYXJ0eSA9IGZpbmRFeGVyY2lzZUFjdGluZ1BhcnR5KCdUcmFuc2ZlclByZWFwcHJvdmFsX0NhbmNlbCcpO1xuICAgICAgICBpZiAoYWN0aW5nUGFydHkpIHtcbiAgICAgICAgICBzZW5kZXIgPSBhY3RpbmdQYXJ0eTtcbiAgICAgICAgICByZWNlaXZlciA9IGFjdGluZ1BhcnR5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGNhbmNlbEZpZWxkcyA9IGZpbmRFeGVyY2lzZU5vZGVGaWVsZHMoJ1RyYW5zZmVyUHJlYXBwcm92YWxfQ2FuY2VsJyk7XG4gICAgICAgICAgaWYgKGNhbmNlbEZpZWxkcykge1xuICAgICAgICAgICAgY29uc3QgcGFydHlEYXRhID0gZ2V0RmllbGQoY2FuY2VsRmllbGRzLCAncCcpO1xuICAgICAgICAgICAgaWYgKHBhcnR5RGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSB7XG4gICAgICAgICAgICAgIHNlbmRlciA9IHBhcnR5RGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICAgICAgcmVjZWl2ZXIgPSBzZW5kZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRva2VuIGNhbmNlbDogQXJjaGl2ZSBleGVyY2lzZSBvbiBVdGlsaXR5LlJlZ2lzdHJ5LkFwcC5WMC5Nb2RlbC5UcmFuc2ZlclByZWFwcHJvdmFsLlxuICAgICAgICAgICAgLy8gVGhlIGJ1aWx0LWluIEFyY2hpdmUgY2hvaWNlIGhhcyBlbXB0eSBjaG9pY2VBcmd1bWVudCB7fSwgc28gdGhlIGFjdGluZyBwYXJ0eSBpc1xuICAgICAgICAgICAgLy8gdGhlIG9ubHkgd2F5IHRvIHJlY292ZXIgdGhlIGNhbmNlbGxpbmcgcGFydHkuXG4gICAgICAgICAgICBjb25zdCB0b2tlbkFyY2hpdmVQYXJ0eSA9IGZpbmRFeGVyY2lzZUFjdGluZ1BhcnR5KCdBcmNoaXZlJyk7XG4gICAgICAgICAgICBpZiAodG9rZW5BcmNoaXZlUGFydHkpIHtcbiAgICAgICAgICAgICAgc2VuZGVyID0gdG9rZW5BcmNoaXZlUGFydHk7XG4gICAgICAgICAgICAgIHJlY2VpdmVyID0gdG9rZW5BcmNoaXZlUGFydHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFtb3VudCA9ICcwJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gSW5pdGlhbCB0cmFuc2ZlciAoMS1zdGVwIGFuZCAyLXN0ZXAsIGNvaW4gYW5kIHRva2VuKTogVHJhbnNmZXJGYWN0b3J5X1RyYW5zZmVyIGV4ZXJjaXNlIG5vZGVcbiAgICAgICAgLy8g4oaSIHRyYW5zZmVyLntzZW5kZXIsIHJlY2VpdmVyLCBhbW91bnQsIGluc3RydW1lbnRJZC57YWRtaW4sIGlkfSwgbWV0YX1cbiAgICAgICAgY29uc3QgdHJhbnNmZXJGaWVsZHMgPSBmaW5kRXhlcmNpc2VOb2RlRmllbGRzKCdUcmFuc2ZlckZhY3RvcnlfVHJhbnNmZXInKTtcbiAgICAgICAgaWYgKHRyYW5zZmVyRmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgdHJhbnNmZXJTdW0gPSBnZXRGaWVsZCh0cmFuc2ZlckZpZWxkcywgJ3RyYW5zZmVyJyk7XG4gICAgICAgICAgaWYgKHRyYW5zZmVyU3VtPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2ZlclJlY29yZCA9IHRyYW5zZmVyU3VtLnJlY29yZD8uZmllbGRzID8/IFtdO1xuICAgICAgICAgICAgZXh0cmFjdEZyb21UcmFuc2ZlclJlY29yZCh0cmFuc2ZlclJlY29yZCwgJ2luc3RydW1lbnRJZCcsICdhZG1pbicpO1xuICAgICAgICAgICAgY29uc3QgbWV0YUZpZWxkID0gZ2V0RmllbGQodHJhbnNmZXJSZWNvcmQsICdtZXRhJyk7XG4gICAgICAgICAgICBpZiAobWV0YUZpZWxkPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlc0ZpZWxkID0gZ2V0RmllbGQobWV0YUZpZWxkLnJlY29yZD8uZmllbGRzID8/IFtdLCAndmFsdWVzJyk7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZXNGaWVsZD8ub25lb2ZLaW5kID09PSAndGV4dE1hcCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZW1vRW50cnkgPSB2YWx1ZXNGaWVsZC50ZXh0TWFwPy5lbnRyaWVzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAoZSkgPT4gZS5rZXkgPT09ICdzcGxpY2UubGZkZWNlbnRyYWxpemVkdHJ1c3Qub3JnL3JlYXNvbidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChtZW1vRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG1lbW9WYWx1ZSA9IG1lbW9FbnRyeT8udmFsdWU/LnN1bTtcbiAgICAgICAgICAgICAgICAgIGlmIChtZW1vVmFsdWU/Lm9uZW9mS2luZCA9PT0gJ3RleHQnKSBtZW1vSWQgPSBtZW1vVmFsdWUudGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFzZW5kZXIgfHwgIXJlY2VpdmVyIHx8ICFhbW91bnQpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdGaWVsZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoIXNlbmRlcikgbWlzc2luZ0ZpZWxkcy5wdXNoKCdzZW5kZXInKTtcbiAgICAgIGlmICghcmVjZWl2ZXIpIG1pc3NpbmdGaWVsZHMucHVzaCgncmVjZWl2ZXInKTtcbiAgICAgIGlmICghYW1vdW50KSBtaXNzaW5nRmllbGRzLnB1c2goJ2Ftb3VudCcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHRyYW5zYWN0aW9uIGRhdGE6IG1pc3NpbmcgJHttaXNzaW5nRmllbGRzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnZlcnRlZEFtb3VudCA9IHRoaXMuY29udmVydEFtb3VudFRvTG93ZXN0VW5pdChuZXcgQmlnTnVtYmVyKGFtb3VudCkpO1xuICAgIGNvbnN0IHBhcnNlZERhdGE6IFByZXBhcmVkVHhuUGFyc2VkSW5mbyA9IHtcbiAgICAgIHNlbmRlcixcbiAgICAgIHJlY2VpdmVyLFxuICAgICAgYW1vdW50OiBjb252ZXJ0ZWRBbW91bnQsXG4gICAgfTtcbiAgICBpZiAobWVtb0lkKSB7XG4gICAgICBwYXJzZWREYXRhLm1lbW9JZCA9IG1lbW9JZDtcbiAgICB9XG4gICAgaWYgKGluc3RydW1lbnRJZCAmJiBpbnN0cnVtZW50QWRtaW4pIHtcbiAgICAgIHBhcnNlZERhdGEudG9rZW4gPSB0aGlzLmZpbmRUb2tlbk5hbWVCeUNvbnRyYWN0QWRkcmVzcyhgJHtpbnN0cnVtZW50QWRtaW59OiR7aW5zdHJ1bWVudElkfWApO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkRGF0YTtcbiAgfVxuXG4gIC8qKiBQYXJzZXMgYFwiUGtnOk1vZHVsZTpFbnRpdHlcImAgaW50byBwYXJ0cy4gKi9cbiAgcGFyc2VDYW50b25UZW1wbGF0ZUlkKHZhbHVlOiBzdHJpbmcpOiB7IHBrZzogc3RyaW5nOyBtb2R1bGVOYW1lOiBzdHJpbmc7IGVudGl0eU5hbWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KCc6Jyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBbcGtnLCBtb2R1bGVOYW1lLCBlbnRpdHlOYW1lXSA9IHBhcnRzO1xuICAgIGlmICghcGtnIHx8ICFtb2R1bGVOYW1lIHx8ICFlbnRpdHlOYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IHBrZywgbW9kdWxlTmFtZSwgZW50aXR5TmFtZSB9O1xuICB9XG5cbiAgZGFtbFZhbHVlVG9Kc29uKHZhbHVlOiBWYWx1ZSB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICAgIGlmICghdmFsdWUgfHwgIXZhbHVlLnN1bSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdW0gPSB2YWx1ZS5zdW07XG4gICAgc3dpdGNoIChzdW0ub25lb2ZLaW5kKSB7XG4gICAgICBjYXNlICd1bml0JzpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBjYXNlICdib29sJzpcbiAgICAgICAgcmV0dXJuIHN1bS5ib29sO1xuICAgICAgY2FzZSAnaW50NjQnOlxuICAgICAgICByZXR1cm4gc3VtLmludDY0O1xuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIHJldHVybiBzdW0uZGF0ZTtcbiAgICAgIGNhc2UgJ3RpbWVzdGFtcCc6XG4gICAgICAgIHJldHVybiBzdW0udGltZXN0YW1wO1xuICAgICAgY2FzZSAnbnVtZXJpYyc6XG4gICAgICAgIHJldHVybiBzdW0ubnVtZXJpYztcbiAgICAgIGNhc2UgJ3BhcnR5JzpcbiAgICAgICAgcmV0dXJuIHN1bS5wYXJ0eTtcbiAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICByZXR1cm4gc3VtLnRleHQ7XG4gICAgICBjYXNlICdjb250cmFjdElkJzpcbiAgICAgICAgcmV0dXJuIHN1bS5jb250cmFjdElkO1xuICAgICAgY2FzZSAnb3B0aW9uYWwnOlxuICAgICAgICByZXR1cm4gc3VtLm9wdGlvbmFsPy52YWx1ZSA/IHRoaXMuZGFtbFZhbHVlVG9Kc29uKHN1bS5vcHRpb25hbC52YWx1ZSkgOiBudWxsO1xuICAgICAgY2FzZSAnbGlzdCc6XG4gICAgICAgIHJldHVybiAoc3VtLmxpc3Q/LmVsZW1lbnRzID8/IFtdKS5tYXAoKGVsKSA9PiB0aGlzLmRhbWxWYWx1ZVRvSnNvbihlbCkpO1xuICAgICAgY2FzZSAndGV4dE1hcCc6IHtcbiAgICAgICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHN1bS50ZXh0TWFwPy5lbnRyaWVzID8/IFtdKSB7XG4gICAgICAgICAgb2JqW2VudHJ5LmtleV0gPSB0aGlzLmRhbWxWYWx1ZVRvSnNvbihlbnRyeS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2dlbk1hcCc6XG4gICAgICAgIHJldHVybiAoc3VtLmdlbk1hcD8uZW50cmllcyA/PyBbXSkubWFwKChlbnRyeSkgPT4gW1xuICAgICAgICAgIHRoaXMuZGFtbFZhbHVlVG9Kc29uKGVudHJ5LmtleSksXG4gICAgICAgICAgdGhpcy5kYW1sVmFsdWVUb0pzb24oZW50cnkudmFsdWUpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgJ3JlY29yZCc6IHtcbiAgICAgICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGYgb2Ygc3VtLnJlY29yZD8uZmllbGRzID8/IFtdKSB7XG4gICAgICAgICAgb2JqW2YubGFiZWxdID0gdGhpcy5kYW1sVmFsdWVUb0pzb24oZi52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3ZhcmlhbnQnOiB7XG4gICAgICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgICAgb2JqW3N1bS52YXJpYW50LmNvbnN0cnVjdG9yXSA9IHRoaXMuZGFtbFZhbHVlVG9Kc29uKHN1bS52YXJpYW50LnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2VudW0nOlxuICAgICAgICByZXR1cm4gc3VtLmVudW0uY29uc3RydWN0b3I7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWFkcyBhY3RBcyBwYXJ0aWVzIGZyb20gYSBiYXNlNjQtZW5jb2RlZCBwcmVwYXJlZCB0cmFuc2FjdGlvbiBwcm90b2J1Zi4gKi9cbiAgZXh0cmFjdFN1Ym1pdHRlckFjdEFzKHJhd0Jhc2U2NDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGRlY29kZWQgPSB0aGlzLmRlY29kZVByZXBhcmVkVHJhbnNhY3Rpb24ocmF3QmFzZTY0KTtcbiAgICByZXR1cm4gZGVjb2RlZC5tZXRhZGF0YT8uc3VibWl0dGVySW5mbz8uYWN0QXMgPz8gW107XG4gIH1cblxuICAvKiogRGVjb2RlcyBhIHByZXBhcmVkIENhbnRvbiB0cmFuc2FjdGlvbiBwcm90b2J1ZiBhbmQgZXh0cmFjdHMgdGhlIHJvb3QgQ3JlYXRlQ29tbWFuZCBvciBFeGVyY2lzZUNvbW1hbmQuICovXG4gIGV4dHJhY3RDYW50b25Db21tYW5kSW5mbyhyYXdCYXNlNjQ6IHN0cmluZyk6IENhbnRvbkNvbW1hbmRJbmZvIHtcbiAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5kZWNvZGVQcmVwYXJlZFRyYW5zYWN0aW9uKHJhd0Jhc2U2NCk7XG4gICAgY29uc3QgdHggPSBkZWNvZGVkLnRyYW5zYWN0aW9uO1xuICAgIGlmICghdHgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGVjb2RlZCBwcmVwYXJlZCB0cmFuc2FjdGlvbiBoYXMgbm8gdHJhbnNhY3Rpb24gYm9keScpO1xuICAgIH1cbiAgICBjb25zdCByb290cyA9IHR4LnJvb3RzID8/IFtdO1xuICAgIGlmIChyb290cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGVjb2RlZCBwcmVwYXJlZCB0cmFuc2FjdGlvbiBoYXMgbm8gcm9vdCBub2RlcycpO1xuICAgIH1cbiAgICBpZiAocm9vdHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBkZWNvZGVkIHByZXBhcmVkIHRyYW5zYWN0aW9uIGhhcyAke3Jvb3RzLmxlbmd0aH0gcm9vdCBub2RlczsgZXhwZWN0ZWQgZXhhY3RseSAxYCk7XG4gICAgfVxuICAgIGNvbnN0IHJvb3RJZCA9IHJvb3RzWzBdO1xuICAgIGNvbnN0IHJvb3ROb2RlID0gKHR4Lm5vZGVzID8/IFtdKS5maW5kKChuKSA9PiBuLm5vZGVJZCA9PT0gcm9vdElkKTtcbiAgICBpZiAoIXJvb3ROb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHJvb3Qgbm9kZSAnJHtyb290SWR9JyBub3QgZm91bmQgaW4gbm9kZXMgbGlzdGApO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uZWROb2RlID0gcm9vdE5vZGUudmVyc2lvbmVkTm9kZTtcbiAgICBpZiAoIXZlcnNpb25lZE5vZGUgfHwgdmVyc2lvbmVkTm9kZS5vbmVvZktpbmQgIT09ICd2MScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgcm9vdCBub2RlIHZlcnNpb246ICR7dmVyc2lvbmVkTm9kZT8ub25lb2ZLaW5kID8/ICd1bmRlZmluZWQnfWApO1xuICAgIH1cbiAgICBjb25zdCBub2RlVHlwZSA9IHZlcnNpb25lZE5vZGUudjEubm9kZVR5cGU7XG4gICAgaWYgKG5vZGVUeXBlLm9uZW9mS2luZCA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgIGNvbnN0IGNyZWF0ZU5vZGUgPSBub2RlVHlwZS5jcmVhdGU7XG4gICAgICBpZiAoIWNyZWF0ZU5vZGUudGVtcGxhdGVJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZSBub2RlIG1pc3NpbmcgdGVtcGxhdGVJZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogJ0NyZWF0ZUNvbW1hbmQnLFxuICAgICAgICB0ZW1wbGF0ZUlkOiB7XG4gICAgICAgICAgcGFja2FnZUlkOiBjcmVhdGVOb2RlLnRlbXBsYXRlSWQucGFja2FnZUlkLFxuICAgICAgICAgIG1vZHVsZU5hbWU6IGNyZWF0ZU5vZGUudGVtcGxhdGVJZC5tb2R1bGVOYW1lLFxuICAgICAgICAgIGVudGl0eU5hbWU6IGNyZWF0ZU5vZGUudGVtcGxhdGVJZC5lbnRpdHlOYW1lLFxuICAgICAgICB9LFxuICAgICAgICBhcmd1bWVudDogdGhpcy5kYW1sVmFsdWVUb0pzb24oY3JlYXRlTm9kZS5hcmd1bWVudCksXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAobm9kZVR5cGUub25lb2ZLaW5kID09PSAnZXhlcmNpc2UnKSB7XG4gICAgICBjb25zdCBleGVyY2lzZU5vZGUgPSBub2RlVHlwZS5leGVyY2lzZTtcbiAgICAgIGlmICghZXhlcmNpc2VOb2RlLnRlbXBsYXRlSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleGVyY2lzZSBub2RlIG1pc3NpbmcgdGVtcGxhdGVJZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogJ0V4ZXJjaXNlQ29tbWFuZCcsXG4gICAgICAgIHRlbXBsYXRlSWQ6IHtcbiAgICAgICAgICBwYWNrYWdlSWQ6IGV4ZXJjaXNlTm9kZS50ZW1wbGF0ZUlkLnBhY2thZ2VJZCxcbiAgICAgICAgICBtb2R1bGVOYW1lOiBleGVyY2lzZU5vZGUudGVtcGxhdGVJZC5tb2R1bGVOYW1lLFxuICAgICAgICAgIGVudGl0eU5hbWU6IGV4ZXJjaXNlTm9kZS50ZW1wbGF0ZUlkLmVudGl0eU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGFyZ3VtZW50OiB0aGlzLmRhbWxWYWx1ZVRvSnNvbihleGVyY2lzZU5vZGUuY2hvc2VuVmFsdWUpLFxuICAgICAgICBjaG9pY2U6IGV4ZXJjaXNlTm9kZS5jaG9pY2VJZCxcbiAgICAgICAgY29udHJhY3RJZDogZXhlcmNpc2VOb2RlLmNvbnRyYWN0SWQsXG4gICAgICAgIGFjdGluZ1BhcnRpZXM6IFsuLi4oZXhlcmNpc2VOb2RlLmFjdGluZ1BhcnRpZXMgPz8gW10pXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgcm9vdCBub2RlIHR5cGU6ICR7bm9kZVR5cGUub25lb2ZLaW5kID8/ICd1bmRlZmluZWQnfWApO1xuICB9XG5cbiAgc2FtZUVsZW1lbnRzKGE6IHJlYWRvbmx5IHN0cmluZ1tdLCBiOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzb3J0ZWRBID0gWy4uLmFdLnNvcnQoKTtcbiAgICBjb25zdCBzb3J0ZWRCID0gWy4uLmJdLnNvcnQoKTtcbiAgICByZXR1cm4gc29ydGVkQS5ldmVyeSgoeCwgaSkgPT4geCA9PT0gc29ydGVkQltpXSk7XG4gIH1cblxuICAvKiogU3RyaXBzIHRoZSBgY29tbWFuZC5gIHByZWZpeCBmcm9tIGluamVjdEFzIHBhdGhzIChlLmcuIGBjb21tYW5kLkV4ZXJjaXNlQ29tbWFuZC5jb250cmFjdElkYCDihpIgYEV4ZXJjaXNlQ29tbWFuZC5jb250cmFjdElkYCkuICovXG4gIG5vcm1hbGl6ZUluamVjdEFzKHNwZWNzOiByZWFkb25seSB7IGluamVjdEFzPzogc3RyaW5nIH1bXSB8IHVuZGVmaW5lZCk6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBpZiAoIXNwZWNzKSByZXR1cm4gb3V0O1xuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBzcGVjcykge1xuICAgICAgaWYgKCFzcGVjIHx8IHR5cGVvZiBzcGVjLmluamVjdEFzICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgICBjb25zdCBzdHJpcHBlZCA9IHNwZWMuaW5qZWN0QXMuc3RhcnRzV2l0aCgnY29tbWFuZC4nKSA/IHNwZWMuaW5qZWN0QXMuc2xpY2UoJ2NvbW1hbmQuJy5sZW5ndGgpIDogc3BlYy5pbmplY3RBcztcbiAgICAgIGlmIChzdHJpcHBlZCkgb3V0LmFkZChzdHJpcHBlZCk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgYXNzZXJ0cyB0aGF0IGBhY3R1YWxgIG1hdGNoZXMgYGV4cGVjdGVkYC4gUGF0aHMgaW4gYGluamVjdEFzUGF0aHNgIGFyZSBza2lwcGVkLlxuICAgKiBOdW1lcmljIHN0cmluZ3MgYXJlIGNvbXBhcmVkIHZpYSBCaWdOdW1iZXIgdG8gaGFuZGxlIERBTUwgZm9ybWF0dGluZyBkaWZmZXJlbmNlcyAoZS5nLiBcIjEwMFwiIHZzIFwiMTAwLjAwMDAwMDAwMDBcIikuXG4gICAqL1xuICBhc3NlcnREZWVwQ2FudG9uTWF0Y2goZXhwZWN0ZWQ6IHVua25vd24sIGFjdHVhbDogdW5rbm93biwgaW5qZWN0QXNQYXRoczogU2V0PHN0cmluZz4sIGN1cnJlbnRQYXRoID0gJycpOiB2b2lkIHtcbiAgICBpZiAoaW5qZWN0QXNQYXRocy5oYXMoY3VycmVudFBhdGgpKSByZXR1cm47XG5cbiAgICAvLyBPbmx5IHVuZGVmaW5lZCBtZWFucyBcInVuc3BlY2lmaWVkIOKAlCBza2lwIGNvbXBhcmlzb25cIi4gRW1wdHkge30gb3IgW10gYXJlIHZhbGlkXG4gICAgLy8gRGFtbCB2YWx1ZXMgYW5kIG11c3QgYmUgdmVyaWZpZWQgYWdhaW5zdCBhY3R1YWwgdG8gcHJldmVudCBhY2NpZGVudGFsIHVuZGVyLXZlcmlmaWNhdGlvbi5cbiAgICBpZiAoZXhwZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChleHBlY3RlZCA9PT0gbnVsbCB8fCBhY3R1YWwgPT09IG51bGwpIHtcbiAgICAgIGlmIChleHBlY3RlZCAhPT0gYWN0dWFsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2FudG9uIGNvbW1hbmQgbWlzbWF0Y2ggYXQgJyR7Y3VycmVudFBhdGggfHwgJzxyb290Pid9JzogZXhwZWN0ZWQgJHt0aGlzLnN0cmluZ2lmeUZvckVycm9yKFxuICAgICAgICAgICAgZXhwZWN0ZWRcbiAgICAgICAgICApfSwgZ290ICR7dGhpcy5zdHJpbmdpZnlGb3JFcnJvcihhY3R1YWwpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBleHBlY3RlZCA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGFjdHVhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh0aGlzLmFyZU51bWVyaWNTdHJpbmdzKGV4cGVjdGVkLCBhY3R1YWwpKSB7XG4gICAgICAgIGlmICghbmV3IEJpZ051bWJlcihleHBlY3RlZCkuaXNFcXVhbFRvKG5ldyBCaWdOdW1iZXIoYWN0dWFsKSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2FudG9uIGNvbW1hbmQgbnVtZXJpYyBtaXNtYXRjaCBhdCAnJHtjdXJyZW50UGF0aCB8fCAnPHJvb3Q+J30nOiBleHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIElTTyA4NjAxIGlucHV0IHZzIG1pY3Jvc2Vjb25kLXNpbmNlLWVwb2NoIGVuY29kaW5nIGluIHRoZSBwcmVwYXJlZC10cmFuc2FjdGlvbiBwcm90b2J1Zi5cbiAgICAgIGlmICh0aGlzLmlzSXNvVGltZXN0YW1wKGV4cGVjdGVkKSAmJiB0aGlzLmlzSW50ZWdlclN0cmluZyhhY3R1YWwpKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkTWljcm9zZWNvbmRzID0gbmV3IEJpZ051bWJlcihuZXcgRGF0ZShleHBlY3RlZCkuZ2V0VGltZSgpKS5tdWx0aXBsaWVkQnkoMTAwMCk7XG4gICAgICAgIGlmICghZXhwZWN0ZWRNaWNyb3NlY29uZHMuaXNFcXVhbFRvKG5ldyBCaWdOdW1iZXIoYWN0dWFsKSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2FudG9uIGNvbW1hbmQgdGltZXN0YW1wIG1pc21hdGNoIGF0ICcke2N1cnJlbnRQYXRoIHx8ICc8cm9vdD4nfSc6IGAgK1xuICAgICAgICAgICAgICBgZXhwZWN0ZWQgJyR7ZXhwZWN0ZWR9JyAoJHtleHBlY3RlZE1pY3Jvc2Vjb25kcy50b0ZpeGVkKDApfSDCtXMpLCBnb3QgJyR7YWN0dWFsfSdgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXhwZWN0ZWQgIT09IGFjdHVhbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbnRvbiBjb21tYW5kIG1pc21hdGNoIGF0ICcke2N1cnJlbnRQYXRoIHx8ICc8cm9vdD4nfSc6IGV4cGVjdGVkICcke2V4cGVjdGVkfScsIGdvdCAnJHthY3R1YWx9J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBleHBlY3RlZCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGFjdHVhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChleHBlY3RlZCAhPT0gYWN0dWFsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FudG9uIGNvbW1hbmQgbWlzbWF0Y2ggYXQgJyR7Y3VycmVudFBhdGggfHwgJzxyb290Pid9JzogZXhwZWN0ZWQgJHtleHBlY3RlZH0sIGdvdCAke2FjdHVhbH1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBleHBlY3RlZCA9PT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiBhY3R1YWwgPT09ICdib29sZWFuJykge1xuICAgICAgaWYgKGV4cGVjdGVkICE9PSBhY3R1YWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW50b24gY29tbWFuZCBtaXNtYXRjaCBhdCAnJHtjdXJyZW50UGF0aCB8fCAnPHJvb3Q+J30nOiBleHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZCkgJiYgQXJyYXkuaXNBcnJheShhY3R1YWwpKSB7XG4gICAgICBpZiAoZXhwZWN0ZWQubGVuZ3RoICE9PSBhY3R1YWwubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2FudG9uIGNvbW1hbmQgbGlzdC1sZW5ndGggbWlzbWF0Y2ggYXQgJyR7Y3VycmVudFBhdGggfHwgJzxyb290Pid9JzogZXhwZWN0ZWQgJHtleHBlY3RlZC5sZW5ndGh9LCBnb3QgJHtcbiAgICAgICAgICAgIGFjdHVhbC5sZW5ndGhcbiAgICAgICAgICB9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZFBhdGggPSBjdXJyZW50UGF0aCA/IGAke2N1cnJlbnRQYXRofS4ke2l9YCA6IFN0cmluZyhpKTtcbiAgICAgICAgdGhpcy5hc3NlcnREZWVwQ2FudG9uTWF0Y2goZXhwZWN0ZWRbaV0sIGFjdHVhbFtpXSwgaW5qZWN0QXNQYXRocywgY2hpbGRQYXRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChleHBlY3RlZCkgJiYgdGhpcy5pc1BsYWluT2JqZWN0KGFjdHVhbCkpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkS2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoZXhwZWN0ZWQpKTtcbiAgICAgIGNvbnN0IGFjdHVhbEtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKGFjdHVhbCkpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgZXhwZWN0ZWRLZXlzKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IGN1cnJlbnRQYXRoID8gYCR7Y3VycmVudFBhdGh9LiR7a2V5fWAgOiBrZXk7XG4gICAgICAgIGlmIChleHBlY3RlZFtrZXldID09PSB1bmRlZmluZWQgfHwgaW5qZWN0QXNQYXRocy5oYXMoY2hpbGRQYXRoKSkgY29udGludWU7XG4gICAgICAgIGlmICghYWN0dWFsS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FudG9uIGNvbW1hbmQgbWlzc2luZyBmaWVsZCBhdCAnJHtjaGlsZFBhdGh9JyBvbiBwcmVwYXJlZCB0cmFuc2FjdGlvbmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXNzZXJ0RGVlcENhbnRvbk1hdGNoKGV4cGVjdGVkW2tleV0sIChhY3R1YWwgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sIGluamVjdEFzUGF0aHMsIGNoaWxkUGF0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW50b24gY29tbWFuZCB0eXBlIG1pc21hdGNoIGF0ICcke2N1cnJlbnRQYXRoIHx8ICc8cm9vdD4nfSc6IGV4cGVjdGVkICR7dGhpcy5kZXNjcmliZVR5cGUoXG4gICAgICAgIGV4cGVjdGVkXG4gICAgICApfSwgZ290ICR7dGhpcy5kZXNjcmliZVR5cGUoYWN0dWFsKX1gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgdG9wb2xvZ3kgaGFzaCBmcm9tIHRoZSBBUEkgcmVzcG9uc2Ugb2YgdGhlICdjcmVhdGUgcGFydHknIGVuZHBvaW50LlxuICAgKlxuICAgKiBAcGFyYW0gdG9wb2xvZ3lUcmFuc2FjdGlvbnMgLSBMaXN0IG9mIGJhc2U2NC1lbmNvZGVkIHRvcG9sb2d5IHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBDYW50b24gQVBJLlxuICAgKiBAcmV0dXJucyBUaGUgZmluYWwgYmFzZTY0LWVuY29kZWQgdG9wb2xvZ3kgdHJhbnNhY3Rpb24gaGFzaC5cbiAgICovXG4gIGNvbXB1dGVIYXNoRnJvbUNyZWF0ZVBhcnR5UmVzcG9uc2UodG9wb2xvZ3lUcmFuc2FjdGlvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCB0eEJ1ZmZlcnMgPSB0b3BvbG9neVRyYW5zYWN0aW9ucy5tYXAoKHR4KSA9PiBCdWZmZXIuZnJvbSh0eCwgJ2Jhc2U2NCcpKTtcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlSGFzaEZyb21Ub3BvbG9neVRyYW5zYWN0aW9uKHR4QnVmZmVycyk7XG4gIH1cblxuICBhc3luYyBjb21wdXRlSGFzaEZyb21QcmVwYXJlU3VibWlzc2lvblJlc3BvbnNlKHByZXBhcmVkVHJhbnNhY3Rpb25CYXNlNjQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcHJlcGFyZWRUcmFuc2FjdGlvbiA9IHRoaXMuZGVjb2RlUHJlcGFyZWRUcmFuc2FjdGlvbihwcmVwYXJlZFRyYW5zYWN0aW9uQmFzZTY0KTtcbiAgICBjb25zdCBoYXNoID0gYXdhaXQgY29tcHV0ZVByZXBhcmVkVHJhbnNhY3Rpb24ocHJlcGFyZWRUcmFuc2FjdGlvbik7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGhhc2gpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgZmluYWwgdG9wb2xvZ3kgdHJhbnNhY3Rpb24gaGFzaCBmb3IgYSBsaXN0IG9mIHByZXBhcmVkIENhbnRvbiB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIEVhY2ggdHJhbnNhY3Rpb24gaXMgZmlyc3QgaGFzaGVkIHdpdGggcHVycG9zZSBgMTFgLCB0aGVuIGFsbCBoYXNoZXMgYXJlIGNvbWJpbmVkIGFuZFxuICAgKiBoYXNoZWQgYWdhaW4gd2l0aCBwdXJwb3NlIGA1NWAsIGZvbGxvd2luZyB0aGUgQ2FudG9uIHRvcG9sb2d5IGhhc2ggcnVsZXMuXG4gICAqXG4gICAqIFRoZSByZXN1bHRpbmcgaGFzaCBpcyBlbmNvZGVkIGFzIGEgYmFzZTY0IHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtCdWZmZXJbXX0gcHJlcGFyZWRUcmFuc2FjdGlvbnMgLSBBbiBhcnJheSBvZiBDYW50b24gdHJhbnNhY3Rpb24gYnVmZmVycy5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGZpbmFsIHRvcG9sb2d5IGhhc2gsIGJhc2U2NC1lbmNvZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlSGFzaEZyb21Ub3BvbG9neVRyYW5zYWN0aW9uKHByZXBhcmVkVHJhbnNhY3Rpb25zOiBCdWZmZXJbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgcmF3SGFzaGVzID0gcHJlcGFyZWRUcmFuc2FjdGlvbnMubWFwKCh0eCkgPT4gdGhpcy5jb21wdXRlU2hhMjU2Q2FudG9uSGFzaCgxMSwgdHgpKTtcbiAgICBjb25zdCBjb21iaW5lZEhhc2hlcyA9IHRoaXMuY29tcHV0ZU11bHRpSGFzaEZvclRvcG9sb2d5KHJhd0hhc2hlcyk7XG4gICAgY29uc3QgY29tcHV0ZWRIYXNoID0gdGhpcy5jb21wdXRlU2hhMjU2Q2FudG9uSGFzaCg1NSwgY29tYmluZWRIYXNoZXMpO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShjb21wdXRlZEhhc2gsICdoZXgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBiYXNlNjQtZW5jb2RlZCBFZDI1NTE5IHB1YmxpYyBrZXkgc3RyaW5nIGludG8gYSBzdHJ1Y3R1cmVkIHNpZ25pbmcgcHVibGljIGtleSBvYmplY3QuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwdWJsaWNLZXkgVGhlIGJhc2U2NC1lbmNvZGVkIEVkMjU1MTkgcHVibGljIGtleVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgc3RydWN0dXJlZCBzaWduaW5nIGtleSBvYmplY3QgZm9ybWF0dGVkIGZvciB1c2Ugd2l0aCBjcnlwdG9ncmFwaGljIG9wZXJhdGlvbnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc2lnbmluZ1B1YmxpY0tleUZyb21FZDI1NTE5KHB1YmxpY0tleTogc3RyaW5nKToge1xuICAgIGZvcm1hdDogbnVtYmVyO1xuICAgIHB1YmxpY0tleTogQnVmZmVyO1xuICAgIHNjaGVtZTogbnVtYmVyO1xuICAgIGtleVNwZWM6IG51bWJlcjtcbiAgICB1c2FnZTogW107XG4gIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6IENyeXB0b0tleUZvcm1hdC5SQVcsXG4gICAgICBwdWJsaWNLZXk6IEJ1ZmZlci5mcm9tKHB1YmxpY0tleSwgJ2Jhc2U2NCcpLFxuICAgICAgc2NoZW1lOiBTaWduaW5nQWxnb3JpdGhtU3BlYy5FRDI1NTE5LFxuICAgICAga2V5U3BlYzogU2lnbmluZ0tleVNwZWMuRUNfQ1VSVkUyNTUxOSxcbiAgICAgIHVzYWdlOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBidWZmZXIgd2l0aCBhIDQtYnl0ZSBiaWctZW5kaWFuIGludGVnZXIgcHJlZml4IGZvbGxvd2VkIGJ5IHRoZSBwcm92aWRlZCBieXRlIGJ1ZmZlclxuICAgKiBAcGFyYW0ge051bWJlcn0gdmFsdWUgVGhlIGludGVnZXIgdG8gcHJlZml4LCB3cml0dGVuIGFzIDQgYnl0ZXMgaW4gYmlnLWVuZGlhbiBvcmRlclxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnl0ZXMgVGhlIGJ1ZmZlciB0byBhcHBlbmQgYWZ0ZXIgdGhlIGludGVnZXIgcHJlZml4XG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IFRoZSByZXN1bHRpbmcgYnVmZmVyIHdpdGggdGhlIHByZWZpeGVkIGludGVnZXJcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcHJlZml4ZWRJbnQodmFsdWU6IG51bWJlciwgYnl0ZXM6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDQgKyBieXRlcy5sZW5ndGgpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQzMkJFKHZhbHVlLCAwKTtcbiAgICBCdWZmZXIuZnJvbShieXRlcykuY29weShidWZmZXIsIDQpO1xuICAgIHJldHVybiBidWZmZXI7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgYW4gU0hBLTI1NiBDYW50b24tc3R5bGUgaGFzaCBieSBwcmVmaXhpbmcgdGhlIGlucHV0IHdpdGggYSBwdXJwb3NlIGlkZW50aWZpZXIsXG4gICAqIHRoZW4gaGFzaGluZyB0aGUgcmVzdWx0aW5nIGJ1ZmZlciBhbmQgcHJlcGVuZGluZyBhIG11bHRpLXByZWZpeFxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gcHVycG9zZSBBIG51bWVyaWMgaWRlbnRpZmllciB0byBwcmVmaXggdGhlIGhhc2ggaW5wdXQgd2l0aFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnl0ZXMgVGhlIGJ1ZmZlciB0byBiZSBoYXNoZWRcbiAgICogQHJldHVybnMge1N0cmluZ30gQSBoZXhhZGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlc3VsdGluZyBoYXNoIHdpdGggbXVsdGktcHJlZml4XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVTaGEyNTZDYW50b25IYXNoKHB1cnBvc2U6IG51bWJlciwgYnl0ZXM6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaGFzaElucHV0ID0gdGhpcy5wcmVmaXhlZEludChwdXJwb3NlLCBieXRlcyk7XG4gICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoaGFzaElucHV0KS5kaWdlc3QoKTtcbiAgICBjb25zdCBtdWx0aXByZWZpeCA9IEJ1ZmZlci5mcm9tKFsweDEyLCAweDIwXSk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW211bHRpcHJlZml4LCBoYXNoXSkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgYSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXlcbiAgICogQHBhcmFtIHtTdHJpbmd9IGI2NCBUaGUgQmFzZTY0LWVuY29kZWQgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBUaGUgZGVjb2RlZCBieXRlIGFycmF5XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGZyb21CYXNlNjQoYjY0OiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oYjY0LCAnYmFzZTY0JykpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgYSBCYXNlNjQtZW5jb2RlZCBwcmVwYXJlZCB0cmFuc2FjdGlvbiBpbnRvIGEgc3RydWN0dXJlZCBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IGJhc2U2NCBUaGUgQmFzZTY0LWVuY29kZWQgdHJhbnNhY3Rpb24gZGF0YVxuICAgKiBAcmV0dXJucyB7SVByZXBhcmVkVHJhbnNhY3Rpb259IFRoZSBkZWNvZGVkIGBJUHJlcGFyZWRUcmFuc2FjdGlvbmAgb2JqZWN0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGRlY29kZVByZXBhcmVkVHJhbnNhY3Rpb24oYmFzZTY0OiBzdHJpbmcpOiBJUHJlcGFyZWRUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgYnl0ZXMgPSB0aGlzLmZyb21CYXNlNjQoYmFzZTY0KTtcbiAgICByZXR1cm4gUHJlcGFyZWRUcmFuc2FjdGlvbi5mcm9tQmluYXJ5KGJ5dGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBhIGRldGVybWluaXN0aWMgY29tYmluZWQgaGFzaCBmcm9tIGFuIGFycmF5IG9mIGluZGl2aWR1YWwgQ2FudG9uLXN0eWxlIFNIQS0yNTYgaGFzaGVzXG4gICAqXG4gICAqIEVhY2ggaGFzaCBpcyBkZWNvZGVkIGZyb20gaGV4LCBzb3J0ZWQgbGV4aWNvZ3JhcGhpY2FsbHkgKGJ5IGhleCksIGFuZCBwcmVmaXhlZCB3aXRoIGl0cyBsZW5ndGhcbiAgICogVGhlIGZpbmFsIGJ1ZmZlciBpbmNsdWRlcyB0aGUgbnVtYmVyIG9mIGhhc2hlcyBmb2xsb3dlZCBieSBlYWNoIChsZW5ndGgtcHJlZml4ZWQpIGhhc2hcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gaGFzaGVzIC0gQW4gYXJyYXkgb2YgQ2FudG9uLXByZWZpeGVkIFNIQS0yNTYgaGFzaGVzIGluIGhleGFkZWNpbWFsIHN0cmluZyBmb3JtYXRcbiAgICogQHJldHVybnMge0J1ZmZlcn0gQSBiaW5hcnkgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgY29tYmluZWQgaGFzaCBpbnB1dFxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlTXVsdGlIYXNoRm9yVG9wb2xvZ3koaGFzaGVzOiBzdHJpbmdbXSk6IEJ1ZmZlciB7XG4gICAgY29uc3Qgc29ydGVkSGFzaGVzID0gaGFzaGVzXG4gICAgICAubWFwKChoZXgpID0+IEJ1ZmZlci5mcm9tKGhleCwgJ2hleCcpKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEudG9TdHJpbmcoJ2hleCcpLmxvY2FsZUNvbXBhcmUoYi50b1N0cmluZygnaGV4JykpKTtcblxuICAgIGNvbnN0IG51bUhhc2hlc0J5dGVzID0gdGhpcy5lbmNvZGVJbnQzMihzb3J0ZWRIYXNoZXMubGVuZ3RoKTtcbiAgICBjb25zdCBwYXJ0czogQnVmZmVyW10gPSBbbnVtSGFzaGVzQnl0ZXNdO1xuXG4gICAgZm9yIChjb25zdCBoIG9mIHNvcnRlZEhhc2hlcykge1xuICAgICAgY29uc3QgbGVuZ3RoQnl0ZXMgPSB0aGlzLmVuY29kZUludDMyKGgubGVuZ3RoKTtcbiAgICAgIHBhcnRzLnB1c2gobGVuZ3RoQnl0ZXMsIGgpO1xuICAgIH1cblxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KHBhcnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGVzIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIGludG8gYSA0LWJ5dGUgYmlnLWVuZGlhbiBCdWZmZXJcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGludGVnZXIgdG8gZW5jb2RlXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IEEgNC1ieXRlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIGludGVnZXIgaW4gYmlnLWVuZGlhbiBmb3JtYXRcbiAgICovXG4gIHByaXZhdGUgZW5jb2RlSW50MzIodmFsdWU6IG51bWJlcik6IEJ1ZmZlciB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIGJ1Zi53cml0ZUludDMyQkUodmFsdWUsIDApO1xuICAgIHJldHVybiBidWY7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0byBjYW50b24gcmF3IHVuaXRzXG4gICAqIEBwYXJhbSB7QmlnTnVtYmVyfSB2YWx1ZVxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgY29udmVydGVkIHJhdyBjYW50b24gdW5pdHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY29udmVydEFtb3VudFRvTG93ZXN0VW5pdCh2YWx1ZTogQmlnTnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUubXVsdGlwbGllZEJ5KG5ldyBCaWdOdW1iZXIoMTApLnBvdygxMCkpLnRvRml4ZWQoMCk7XG4gIH1cblxuICBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXJlTnVtZXJpY1N0cmluZ3MoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBudW1lcmljUmUgPSAvXi0/XFxkKyhcXC5cXGQrKT8kLztcbiAgICByZXR1cm4gbnVtZXJpY1JlLnRlc3QoYSkgJiYgbnVtZXJpY1JlLnRlc3QoYik7XG4gIH1cblxuICBwcml2YXRlIGlzSXNvVGltZXN0YW1wKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIS9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkezEsM30pP1okLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKERhdGUucGFyc2UodmFsdWUpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnRlZ2VyU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL15cXGQrJC8udGVzdCh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGRlc2NyaWJlVHlwZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJ251bGwnO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuICdhcnJheSc7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RyaW5naWZ5Rm9yRXJyb3IodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYml0Z28gdG9rZW4gbmFtZSB1c2luZyB0aGUgb24tY2hhaW4gaW5zdHJ1bWVudCBkZXRhaWxzXG4gICAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3MgLSB0aGUgY29udHJhY3QgYWRkcmVzcyBvZiB0aGUgZm9ybSwgYGluc3RydW1lbnRBZG1pbjppbnN0cnVtZW50SWRgXG4gICAqIEByZXR1cm5zIHRva2VuTmFtZSBpZiBjb250cmFjdEFkZHJlc3MgbWF0Y2hlcyB3aXRoIGFueSBzdXBwb3J0ZWQgY2FudG9uIHRva2Vuc1xuICAgKi9cbiAgcHJpdmF0ZSBmaW5kVG9rZW5OYW1lQnlDb250cmFjdEFkZHJlc3MoY29udHJhY3RBZGRyZXNzOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChjb250cmFjdEFkZHJlc3MuaW5jbHVkZXMoJ0FtdWxldCcpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBjYW50b25Ub2tlbiA9IGNvaW5zXG4gICAgICAuZmlsdGVyKChjb2luKSA9PiBjb2luIGluc3RhbmNlb2YgQ2FudG9uVG9rZW4gJiYgY29pbi5jb250cmFjdEFkZHJlc3MgPT09IGNvbnRyYWN0QWRkcmVzcylcbiAgICAgIC5tYXAoKGNvaW4pID0+IGNvaW4gYXMgQ2FudG9uVG9rZW4pO1xuICAgIHJldHVybiBjYW50b25Ub2tlbiA/IGNhbnRvblRva2VuWzBdLm5hbWUgOiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=
|