velocious 1.0.407 → 1.0.409
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/README.md +18 -1
- package/build/src/background-jobs/worker.d.ts +44 -11
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +90 -25
- package/build/src/cli/commands/db/tenants/migrate.d.ts.map +1 -1
- package/build/src/cli/commands/db/tenants/migrate.js +3 -2
- package/build/src/configuration-types.d.ts +3 -2
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -2
- package/build/src/database/migrator.d.ts +4 -2
- package/build/src/database/migrator.d.ts.map +1 -1
- package/build/src/database/migrator.js +11 -2
- package/build/src/database/pool/async-tracked-multi-connection.d.ts +16 -0
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +47 -5
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +9 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.js +24 -2
- package/build/src/frontend-model-controller.d.ts +18 -0
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +38 -4
- package/build/src/frontend-models/base.d.ts +29 -0
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +37 -1
- package/build/src/frontend-models/preloader.d.ts +66 -0
- package/build/src/frontend-models/preloader.d.ts.map +1 -0
- package/build/src/frontend-models/preloader.js +139 -0
- package/build/src/frontend-models/query.d.ts +24 -1
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +31 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -2
|
@@ -21,6 +21,7 @@ import { isModelScopeDescriptor } from "../utils/model-scope.js";
|
|
|
21
21
|
/**
|
|
22
22
|
* @typedef {object} FrontendModelProjectionOptions
|
|
23
23
|
* @property {Record<string, string[] | string> | string | string[]} [select] - Model-aware attribute select map or root-model shorthand.
|
|
24
|
+
* @property {Record<string, string[] | string> | string | string[]} [selectsExtra] - Extra attributes to load in addition to the defaults, keyed by model name or root-model shorthand.
|
|
24
25
|
* @property {import("../database/query/index.js").NestedPreloadRecord | string | Array<string | import("../database/query/index.js").NestedPreloadRecord>} [preload] - Relationship preload tree.
|
|
25
26
|
* @property {string | string[] | Record<string, boolean | {relationship?: string, where?: Record<string, FrontendModelTransportValue>}>} [withCount] - Association count spec.
|
|
26
27
|
* @property {string[] | Record<string, string[]>} [abilities] - Ability actions to compute per record.
|
|
@@ -29,6 +30,7 @@ import { isModelScopeDescriptor } from "../utils/model-scope.js";
|
|
|
29
30
|
/**
|
|
30
31
|
* @typedef {object} FrontendModelProjectionPayload
|
|
31
32
|
* @property {Record<string, string[]>} [select] - Normalized select map.
|
|
33
|
+
* @property {Record<string, string[]>} [selectsExtra] - Normalized extra select map.
|
|
32
34
|
* @property {import("../database/query/index.js").NestedPreloadRecord} [preload] - Normalized preload tree.
|
|
33
35
|
* @property {FrontendModelWithCountPayloadEntry[]} [withCount] - Normalized count specs.
|
|
34
36
|
* @property {FrontendModelAbilitiesPayloadEntry[]} [abilities] - Normalized ability specs.
|
|
@@ -877,7 +879,10 @@ export default class FrontendModelQuery {
|
|
|
877
879
|
this._joins = {};
|
|
878
880
|
this._where = {};
|
|
879
881
|
this._searches = [];
|
|
882
|
+
/** @type {Record<string, string[]>} */
|
|
880
883
|
this._select = {};
|
|
884
|
+
/** @type {Record<string, string[]>} */
|
|
885
|
+
this._selectsExtra = {};
|
|
881
886
|
this._sort = [];
|
|
882
887
|
this._group = [];
|
|
883
888
|
this._distinct = false;
|
|
@@ -1069,6 +1074,17 @@ export default class FrontendModelQuery {
|
|
|
1069
1074
|
mergeSelectRecord(this._select, normalizeSelect(select, this.modelClass.getModelName()));
|
|
1070
1075
|
return this;
|
|
1071
1076
|
}
|
|
1077
|
+
/**
|
|
1078
|
+
* Like `select(...)`, but keeps the default serialized attributes and loads
|
|
1079
|
+
* the given extras in addition (for example attributes declared
|
|
1080
|
+
* `selectedByDefault: false`). Keyed by model name, with root-model shorthand.
|
|
1081
|
+
* @param {Record<string, string[] | string> | string | string[]} select - Extra attributes to load, keyed by model name or root-model shorthand.
|
|
1082
|
+
* @returns {this} - Query with merged extra selected attributes.
|
|
1083
|
+
*/
|
|
1084
|
+
selectsExtra(select) {
|
|
1085
|
+
mergeSelectRecord(this._selectsExtra, normalizeSelect(select, this.modelClass.getModelName()));
|
|
1086
|
+
return this;
|
|
1087
|
+
}
|
|
1072
1088
|
/**
|
|
1073
1089
|
* @param {Record<string, any> | Array<Record<string, any>>} joins - Relationship descriptor joins.
|
|
1074
1090
|
* @returns {this} - Query with merged joins.
|
|
@@ -1200,6 +1216,7 @@ export default class FrontendModelQuery {
|
|
|
1200
1216
|
value: search.value
|
|
1201
1217
|
}));
|
|
1202
1218
|
newQuery._select = normalizeSelect(this._select);
|
|
1219
|
+
newQuery._selectsExtra = normalizeSelect(this._selectsExtra);
|
|
1203
1220
|
newQuery._sort = this._sort.map((sortEntry) => ({
|
|
1204
1221
|
column: sortEntry.column,
|
|
1205
1222
|
direction: sortEntry.direction,
|
|
@@ -1288,6 +1305,14 @@ export default class FrontendModelQuery {
|
|
|
1288
1305
|
return {};
|
|
1289
1306
|
return { select };
|
|
1290
1307
|
}
|
|
1308
|
+
/**
|
|
1309
|
+
* @returns {Record<string, any>} - Payload selectsExtra hash when present.
|
|
1310
|
+
*/
|
|
1311
|
+
selectsExtraPayload() {
|
|
1312
|
+
if (Object.keys(this._selectsExtra).length === 0)
|
|
1313
|
+
return {};
|
|
1314
|
+
return { selectsExtra: this._selectsExtra };
|
|
1315
|
+
}
|
|
1291
1316
|
/**
|
|
1292
1317
|
* @returns {Record<string, any>} - Payload searches array when present.
|
|
1293
1318
|
*/
|
|
@@ -1385,6 +1410,7 @@ export default class FrontendModelQuery {
|
|
|
1385
1410
|
...this.joinsPayload(),
|
|
1386
1411
|
...this.searchPayload(),
|
|
1387
1412
|
...this.selectPayload(),
|
|
1413
|
+
...this.selectsExtraPayload(),
|
|
1388
1414
|
...this.groupPayload(),
|
|
1389
1415
|
...this.distinctPayload(),
|
|
1390
1416
|
...this.sortPayload(),
|
|
@@ -1530,6 +1556,7 @@ export default class FrontendModelQuery {
|
|
|
1530
1556
|
...this.joinsPayload(),
|
|
1531
1557
|
...this.searchPayload(),
|
|
1532
1558
|
...this.selectPayload(Object.keys(mergedWhere)),
|
|
1559
|
+
...this.selectsExtraPayload(),
|
|
1533
1560
|
...this.groupPayload(),
|
|
1534
1561
|
...this.distinctPayload(),
|
|
1535
1562
|
...this.sortPayload(),
|
|
@@ -1606,6 +1633,8 @@ export function frontendModelProjectionPayload(modelClass, options = {}) {
|
|
|
1606
1633
|
const query = new FrontendModelQuery({ modelClass });
|
|
1607
1634
|
if (options.select !== undefined)
|
|
1608
1635
|
query.select(options.select);
|
|
1636
|
+
if (options.selectsExtra !== undefined)
|
|
1637
|
+
query.selectsExtra(options.selectsExtra);
|
|
1609
1638
|
if (options.preload !== undefined)
|
|
1610
1639
|
query.preload(options.preload);
|
|
1611
1640
|
if (options.withCount !== undefined)
|
|
@@ -1617,6 +1646,7 @@ export function frontendModelProjectionPayload(modelClass, options = {}) {
|
|
|
1617
1646
|
return {
|
|
1618
1647
|
...query.preloadPayload(),
|
|
1619
1648
|
...query.selectPayload(),
|
|
1649
|
+
...query.selectsExtraPayload(),
|
|
1620
1650
|
...query.withCountPayload(),
|
|
1621
1651
|
...query.abilitiesPayload(),
|
|
1622
1652
|
...query.queryDataPayload()
|
|
@@ -1660,4 +1690,4 @@ function frontendRansackLikeValue(condition) {
|
|
|
1660
1690
|
return `%${condition.value}`;
|
|
1661
1691
|
throw new Error(`Unsupported frontend ransack predicate: ${condition.predicate}`);
|
|
1662
1692
|
}
|
|
1663
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZnJvbnRlbmQtbW9kZWxzL3F1ZXJ5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUM3RCxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUM1RSxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUU5RDs7Ozs7O0dBTUc7QUFDSDs7R0FFRztBQUNIOztHQUVHO0FBQ0g7O0dBRUc7QUFDSDs7Ozs7OztHQU9HO0FBQ0g7Ozs7Ozs7R0FPRztBQUVIOzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUFDLEtBQUs7SUFDMUIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUU3RSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTlDLE9BQU8sU0FBUyxLQUFLLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQTtBQUM3RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFPO0lBQy9CLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFdkIsSUFBSSxPQUFPLEtBQUssSUFBSTtRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRS9CLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEMsT0FBTyxFQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFDLENBQUE7SUFDMUIsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxD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QyxTQUFTLENBQUMsQ0FBQyxDQUFBO0FBQ3BHLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHdCQUF3QixDQUFDLFNBQVM7SUFDekMsSUFBSSxTQUFTLENBQUMsU0FBUyxLQUFLLE1BQU07UUFBRSxPQUFPLElBQUksU0FBUyxDQUFDLEtBQUssR0FBRyxDQUFBO0lBQ2pFLElBQUksU0FBUyxDQUFDLFNBQVMsS0FBSyxPQUFPO1FBQUUsT0FBTyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQTtJQUNqRSxJQUFJLFNBQVMsQ0FBQyxTQUFTLEtBQUssS0FBSztRQUFFLE9BQU8sSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUE7SUFFL0QsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7QUFDbkYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3Jlc29sdmVGcm9udGVuZE1vZGVsQ2xhc3N9IGZyb20gXCIuL21vZGVsLXJlZ2lzdHJ5LmpzXCJcbmltcG9ydCB7bm9ybWFsaXplUmFuc2Fja1BhcmFtcywgcGFyc2VSYW5zYWNrU29ydH0gZnJvbSBcIi4uL3V0aWxzL3JhbnNhY2suanNcIlxuaW1wb3J0IHtpc01vZGVsU2NvcGVEZXNjcmlwdG9yfSBmcm9tIFwiLi4vdXRpbHMvbW9kZWwtc2NvcGUuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxTZWFyY2hcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2x1bW4gLSBBdHRyaWJ1dGUgbmFtZSB0byBzZWFyY2guXG4gKiBAcHJvcGVydHkge1wiZXFcIiB8IFwibGlrZVwiIHwgXCJub3RFcVwiIHwgXCJndFwiIHwgXCJndGVxXCIgfCBcImx0XCIgfCBcImx0ZXFcIn0gb3BlcmF0b3IgLSBTZWFyY2ggb3BlcmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBwYXRoIC0gUmVsYXRpb25zaGlwIHBhdGggZnJvbSByb290IG1vZGVsLlxuICogQHByb3BlcnR5IHt1bmtub3dufSB2YWx1ZSAtIFNlYXJjaCB2YWx1ZS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7bnVsbCB8IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBvYmplY3R9IEZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHt7YXR0cmlidXRlTmFtZTogc3RyaW5nLCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHdoZXJlPzogUmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn19IEZyb250ZW5kTW9kZWxXaXRoQ291bnRQYXlsb2FkRW50cnlcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7e21vZGVsTmFtZTogc3RyaW5nLCBhY3Rpb25zOiBzdHJpbmdbXX19IEZyb250ZW5kTW9kZWxBYmlsaXRpZXNQYXlsb2FkRW50cnlcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUHJvamVjdGlvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10gfCBzdHJpbmc+IHwgc3RyaW5nIHwgc3RyaW5nW119IFtzZWxlY3RdIC0gTW9kZWwtYXdhcmUgYXR0cmlidXRlIHNlbGVjdCBtYXAgb3Igcm9vdC1tb2RlbCBzaG9ydGhhbmQuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmQgfCBzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkPn0gW3ByZWxvYWRdIC0gUmVsYXRpb25zaGlwIHByZWxvYWQgdHJlZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwge3JlbGF0aW9uc2hpcD86IHN0cmluZywgd2hlcmU/OiBSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+fT59IFt3aXRoQ291bnRdIC0gQXNzb2NpYXRpb24gY291bnQgc3BlYy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IFthYmlsaXRpZXNdIC0gQWJpbGl0eSBhY3Rpb25zIHRvIGNvbXB1dGUgcGVyIHJlY29yZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPj4gfCBSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+fSBbcXVlcnlEYXRhXSAtIEJhY2tlbmQgcXVlcnkgZGF0YSBuYW1lcy9zcGVjLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxQcm9qZWN0aW9uUGF5bG9hZFxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IFtzZWxlY3RdIC0gTm9ybWFsaXplZCBzZWxlY3QgbWFwLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkfSBbcHJlbG9hZF0gLSBOb3JtYWxpemVkIHByZWxvYWQgdHJlZS5cbiAqIEBwcm9wZXJ0eSB7RnJvbnRlbmRNb2RlbFdpdGhDb3VudFBheWxvYWRFbnRyeVtdfSBbd2l0aENvdW50XSAtIE5vcm1hbGl6ZWQgY291bnQgc3BlY3MuXG4gKiBAcHJvcGVydHkge0Zyb250ZW5kTW9kZWxBYmlsaXRpZXNQYXlsb2FkRW50cnlbXX0gW2FiaWxpdGllc10gLSBOb3JtYWxpemVkIGFiaWxpdHkgc3BlY3MuXG4gKiBAcHJvcGVydHkge0Zyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZX0gW3F1ZXJ5RGF0YV0gLSBOb3JtYWxpemVkIHF1ZXJ5RGF0YSBzcGVjLlxuICovXG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIFdoZXRoZXIgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSlcblxuICByZXR1cm4gcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvdHlwZSA9PT0gbnVsbFxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZCB8IHN0cmluZyB8IEFycmF5PHN0cmluZyB8IGltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmQ+IHwgYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGx9IHByZWxvYWQgLSBQcmVsb2FkIHNob3J0aGFuZC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkfSAtIE5vcm1hbGl6ZWQgcHJlbG9hZC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUHJlbG9hZChwcmVsb2FkKSB7XG4gIGlmICghcHJlbG9hZCkgcmV0dXJuIHt9XG5cbiAgaWYgKHByZWxvYWQgPT09IHRydWUpIHJldHVybiB7fVxuXG4gIGlmICh0eXBlb2YgcHJlbG9hZCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB7W3ByZWxvYWRdOiB0cnVlfVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocHJlbG9hZCkpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmR9ICovXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHByZWxvYWQpIHtcbiAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbm9ybWFsaXplZFtlbnRyeV0gPSB0cnVlXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGVudHJ5KSkge1xuICAgICAgICBtZXJnZVByZWxvYWRSZWNvcmQobm9ybWFsaXplZCwgbm9ybWFsaXplUHJlbG9hZChlbnRyeSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcmVsb2FkIGVudHJ5IHR5cGU6ICR7dHlwZW9mIGVudHJ5fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChwcmVsb2FkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcmVsb2FkIHR5cGU6ICR7dHlwZW9mIHByZWxvYWR9YClcbiAgfVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZH0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9XG5cbiAgZm9yIChjb25zdCBbcmVsYXRpb25zaGlwTmFtZSwgcmVsYXRpb25zaGlwUHJlbG9hZF0gb2YgT2JqZWN0LmVudHJpZXMocHJlbG9hZCkpIHtcbiAgICBpZiAocmVsYXRpb25zaGlwUHJlbG9hZCA9PT0gdHJ1ZSB8fCByZWxhdGlvbnNoaXBQcmVsb2FkID09PSBmYWxzZSkge1xuICAgICAgbm9ybWFsaXplZFtyZWxhdGlvbnNoaXBOYW1lXSA9IHJlbGF0aW9uc2hpcFByZWxvYWRcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWxhdGlvbnNoaXBQcmVsb2FkID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkocmVsYXRpb25zaGlwUHJlbG9hZCkgfHwgaXNQbGFpbk9iamVjdChyZWxhdGlvbnNoaXBQcmVsb2FkKSkge1xuICAgICAgbm9ybWFsaXplZFtyZWxhdGlvbnNoaXBOYW1lXSA9IG5vcm1hbGl6ZVByZWxvYWQocmVsYXRpb25zaGlwUHJlbG9hZClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByZWxvYWQgdmFsdWUgZm9yICR7cmVsYXRpb25zaGlwTmFtZX06ICR7dHlwZW9mIHJlbGF0aW9uc2hpcFByZWxvYWR9YClcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSBzaG9ydGhhbmQgYHdpdGhDb3VudGAgYXJndW1lbnQgZnJvbSB0aGUgZnJvbnRlbmQtbW9kZWxcbiAqIHF1ZXJ5IEFQSSBpbnRvIHRoZSBzdHJpY3QgaW50ZXJuYWwgZW50cmllcyB1c2VkIGluIHRoZSB0cmFuc3BvcnRcbiAqIHBheWxvYWQuIFNoYXJlcyB0aGUgc2hhcGUgc2VtYW50aWNzIHdpdGggdGhlIGJhY2tlbmQgbm9ybWFsaXplciBpblxuICogYGRhdGFiYXNlL3F1ZXJ5L3dpdGgtY291bnQuanNgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwge3JlbGF0aW9uc2hpcD86IHN0cmluZywgd2hlcmU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0+fSBzcGVjXG4gKiBAcmV0dXJucyB7QXJyYXk8e2F0dHJpYnV0ZU5hbWU6IHN0cmluZywgcmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCB3aGVyZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+fT59XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVdpdGhDb3VudEZyb250ZW5kKHNwZWMpIHtcbiAgaWYgKHNwZWMgPT0gbnVsbCkgcmV0dXJuIFtdXG5cbiAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFt7YXR0cmlidXRlTmFtZTogYCR7c3BlY31Db3VudGAsIHJlbGF0aW9uc2hpcE5hbWU6IHNwZWN9XVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc3BlYykpIHtcbiAgICByZXR1cm4gc3BlYy5mbGF0TWFwKChpdGVtKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoQ291bnQgYXJyYXkgZW50cmllcyBtdXN0IGJlIHN0cmluZ3M7IGdvdCAke3R5cGVvZiBpdGVtfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbe2F0dHJpYnV0ZU5hbWU6IGAke2l0ZW19Q291bnRgLCByZWxhdGlvbnNoaXBOYW1lOiBpdGVtfV1cbiAgICB9KVxuICB9XG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KHNwZWMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdpdGhDb3VudCBzcGVjOiAke3R5cGVvZiBzcGVjfWApXG4gIH1cblxuICBjb25zdCBlbnRyaWVzID0gW11cblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzcGVjKSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgZW50cmllcy5wdXNoKHthdHRyaWJ1dGVOYW1lOiBgJHtrZXl9Q291bnRgLCByZWxhdGlvbnNoaXBOYW1lOiBrZXl9KVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSBjb250aW51ZVxuXG4gICAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gLyoqIEB0eXBlIHt7cmVsYXRpb25zaGlwPzogc3RyaW5nLCB3aGVyZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+fX0gKi8gKHZhbHVlKVxuICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgYXR0cmlidXRlTmFtZToga2V5LFxuICAgICAgICByZWxhdGlvbnNoaXBOYW1lOiBvcHRpb25zLnJlbGF0aW9uc2hpcCB8fCBrZXksXG4gICAgICAgIHdoZXJlOiBvcHRpb25zLndoZXJlXG4gICAgICB9KVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgd2l0aENvdW50IHZhbHVlIGZvciAke2tleX06ICR7dHlwZW9mIHZhbHVlfWApXG4gIH1cblxuICByZXR1cm4gZW50cmllc1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIGZyb250ZW5kIGAuYWJpbGl0aWVzKC4uLilgIHNwZWMgaW50byBhIGZsYXQgbGlzdCBvZlxuICogYHttb2RlbE5hbWUsIGFjdGlvbnN9YCBlbnRyaWVzLiBBY2NlcHRzIHRoZSBmbGF0IGFjdGlvbnMtYXJyYXlcbiAqIHNob3J0aGFuZCAoYXBwbGllcyB0byB0aGUgcXVlcnkncyBvd24gbW9kZWwgY2xhc3MpIGFuZCB0aGUga2V5ZWRcbiAqIGB7TW9kZWxOYW1lOiBbYWN0aW9uLCAuLi5dfWAgZm9ybSAoYXBwbGllcyB0byByZWNvcmRzIG9mIHRoYXQgbW9kZWxcbiAqIGNsYXNzLCB1c2VmdWwgZm9yIHByZWxvYWRlZCBjaGlsZHJlbikuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gc3BlY1xuICogQHBhcmFtIHt7Z2V0TW9kZWxOYW1lOiAoKSA9PiBzdHJpbmd9fSByb290TW9kZWxDbGFzc1xuICogQHJldHVybnMge0FycmF5PHttb2RlbE5hbWU6IHN0cmluZywgYWN0aW9uczogc3RyaW5nW119Pn1cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQWJpbGl0aWVzU3BlYyhzcGVjLCByb290TW9kZWxDbGFzcykge1xuICBpZiAoc3BlYyA9PSBudWxsKSByZXR1cm4gW11cblxuICBpZiAoQXJyYXkuaXNBcnJheShzcGVjKSkge1xuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHNwZWMpIHtcbiAgICAgIGlmICh0eXBlb2YgYWN0aW9uICE9PSBcInN0cmluZ1wiIHx8IGFjdGlvbi5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYWJpbGl0aWVzIGZsYXQtZm9ybSBhY3Rpb25zIG11c3QgYmUgbm9uLWVtcHR5IHN0cmluZ3M7IGdvdCAke3R5cGVvZiBhY3Rpb259YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByb290TW9kZWxOYW1lID0gdHlwZW9mIHJvb3RNb2RlbENsYXNzPy5nZXRNb2RlbE5hbWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyByb290TW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICAgICAgOiB1bmRlZmluZWRcbiAgICBpZiAoIXJvb3RNb2RlbE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFiaWxpdGllcyBmbGF0LWZvcm0gcmVxdWlyZXMgYSByb290IG1vZGVsIGNsYXNzIHdpdGggZ2V0TW9kZWxOYW1lKClcIilcbiAgICB9XG5cbiAgICByZXR1cm4gW3thY3Rpb25zOiBbLi4uc3BlY10sIG1vZGVsTmFtZTogcm9vdE1vZGVsTmFtZX1dXG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3Qoc3BlYykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYWJpbGl0aWVzIHNwZWM6ICR7dHlwZW9mIHNwZWN9YClcbiAgfVxuXG4gIC8qKiBAdHlwZSB7QXJyYXk8e21vZGVsTmFtZTogc3RyaW5nLCBhY3Rpb25zOiBzdHJpbmdbXX0+fSAqL1xuICBjb25zdCBlbnRyaWVzID0gW11cblxuICBmb3IgKGNvbnN0IFttb2RlbE5hbWUsIGFjdGlvbnNdIG9mIE9iamVjdC5lbnRyaWVzKHNwZWMpKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFjdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGFiaWxpdGllc1ske21vZGVsTmFtZX1dIG11c3QgYmUgYW4gYXJyYXkgb2YgYWN0aW9uIG5hbWVzOyBnb3QgJHt0eXBlb2YgYWN0aW9uc31gKVxuICAgIH1cblxuICAgIGNvbnN0IHNhbml0aXplZCA9IGFjdGlvbnMubWFwKChhY3Rpb24pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgYWN0aW9uICE9PSBcInN0cmluZ1wiIHx8IGFjdGlvbi5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYWJpbGl0aWVzWyR7bW9kZWxOYW1lfV0gZW50cmllcyBtdXN0IGJlIG5vbi1lbXB0eSBzdHJpbmdzOyBnb3QgJHt0eXBlb2YgYWN0aW9ufWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY3Rpb25cbiAgICB9KVxuXG4gICAgZW50cmllcy5wdXNoKHthY3Rpb25zOiBzYW5pdGl6ZWQsIG1vZGVsTmFtZX0pXG4gIH1cblxuICByZXR1cm4gZW50cmllc1xufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZH0gdGFyZ2V0UHJlbG9hZCAtIEV4aXN0aW5nIHByZWxvYWQgZGF0YS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZH0gaW5jb21pbmdQcmVsb2FkIC0gTmV3IHByZWxvYWQgZGF0YS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBtZXJnZVByZWxvYWRSZWNvcmQodGFyZ2V0UHJlbG9hZCwgaW5jb21pbmdQcmVsb2FkKSB7XG4gIGZvciAoY29uc3QgW3JlbGF0aW9uc2hpcE5hbWUsIGluY29taW5nVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluY29taW5nUHJlbG9hZCkpIHtcbiAgICBjb25zdCBleGlzdGluZ1ZhbHVlID0gdGFyZ2V0UHJlbG9hZFtyZWxhdGlvbnNoaXBOYW1lXVxuXG4gICAgaWYgKGluY29taW5nVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICB0YXJnZXRQcmVsb2FkW3JlbGF0aW9uc2hpcE5hbWVdID0gZmFsc2VcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGluY29taW5nVmFsdWUgPT09IHRydWUpIHtcbiAgICAgIGlmIChleGlzdGluZ1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGFyZ2V0UHJlbG9hZFtyZWxhdGlvbnNoaXBOYW1lXSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGluY29taW5nVmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJlbG9hZCB2YWx1ZSBmb3IgJHtyZWxhdGlvbnNoaXBOYW1lfTogJHt0eXBlb2YgaW5jb21pbmdWYWx1ZX1gKVxuICAgIH1cblxuICAgIGlmIChpc1BsYWluT2JqZWN0KGV4aXN0aW5nVmFsdWUpKSB7XG4gICAgICBtZXJnZVByZWxvYWRSZWNvcmQoXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZH0gKi8gKGV4aXN0aW5nVmFsdWUpLFxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmR9ICovIChpbmNvbWluZ1ZhbHVlKVxuICAgICAgKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB0YXJnZXRQcmVsb2FkW3JlbGF0aW9uc2hpcE5hbWVdID0gbm9ybWFsaXplUHJlbG9hZChpbmNvbWluZ1ZhbHVlKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBzZWxlY3QgLSBTZWxlY3QgcGF5bG9hZC5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gW3Jvb3RNb2RlbE5hbWVdIC0gT3B0aW9uYWwgcm9vdCBtb2RlbCBuYW1lIGZvciBzaG9ydGhhbmQgc2VsZWN0IHBheWxvYWRzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gLSBOb3JtYWxpemVkIG1vZGVsLW5hbWUga2V5ZWQgc2VsZWN0IHJlY29yZC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0KHNlbGVjdCwgcm9vdE1vZGVsTmFtZSA9IG51bGwpIHtcbiAgaWYgKCFzZWxlY3QpIHJldHVybiB7fVxuXG4gIGlmICh0eXBlb2Ygc2VsZWN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKCFyb290TW9kZWxOYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHNlbGVjdCBzaG9ydGhhbmQgd2l0aG91dCByb290IG1vZGVsIG5hbWVcIilcblxuICAgIHJldHVybiB7W3Jvb3RNb2RlbE5hbWVdOiBbc2VsZWN0XX1cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdCkpIHtcbiAgICBpZiAoIXJvb3RNb2RlbE5hbWUpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2VsZWN0IHNob3J0aGFuZCB3aXRob3V0IHJvb3QgbW9kZWwgbmFtZVwiKVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIHNlbGVjdCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVOYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZWxlY3QgYXR0cmlidXRlIGZvciAke3Jvb3RNb2RlbE5hbWV9OiAke3R5cGVvZiBhdHRyaWJ1dGVOYW1lfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtbcm9vdE1vZGVsTmFtZV06IEFycmF5LmZyb20obmV3IFNldChzZWxlY3QpKX1cbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChzZWxlY3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlbGVjdCB0eXBlOiAke3R5cGVvZiBzZWxlY3R9YClcbiAgfVxuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSAqL1xuICBjb25zdCBub3JtYWxpemVkID0ge31cblxuICBmb3IgKGNvbnN0IFttb2RlbE5hbWUsIHNlbGVjdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoc2VsZWN0KSkge1xuICAgIGlmICh0eXBlb2Ygc2VsZWN0aW9uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBub3JtYWxpemVkW21vZGVsTmFtZV0gPSBbc2VsZWN0aW9uXVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2VsZWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlbGVjdCB2YWx1ZSBmb3IgJHttb2RlbE5hbWV9OiAke3R5cGVvZiBzZWxlY3Rpb259YClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2Ygc2VsZWN0aW9uKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZU5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlbGVjdCBhdHRyaWJ1dGUgZm9yICR7bW9kZWxOYW1lfTogJHt0eXBlb2YgYXR0cmlidXRlTmFtZX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIG5vcm1hbGl6ZWRbbW9kZWxOYW1lXSA9IEFycmF5LmZyb20obmV3IFNldChzZWxlY3Rpb24pKVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gdGFyZ2V0U2VsZWN0IC0gRXhpc3Rpbmcgc2VsZWN0IHJlY29yZC5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBpbmNvbWluZ1NlbGVjdCAtIEluY29taW5nIHNlbGVjdCByZWNvcmQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gbWVyZ2VTZWxlY3RSZWNvcmQodGFyZ2V0U2VsZWN0LCBpbmNvbWluZ1NlbGVjdCkge1xuICBmb3IgKGNvbnN0IFttb2RlbE5hbWUsIGluY29taW5nQXR0cmlidXRlc10gb2YgT2JqZWN0LmVudHJpZXMoaW5jb21pbmdTZWxlY3QpKSB7XG4gICAgY29uc3QgZXhpc3RpbmdBdHRyaWJ1dGVzID0gdGFyZ2V0U2VsZWN0W21vZGVsTmFtZV0gfHwgW11cblxuICAgIHRhcmdldFNlbGVjdFttb2RlbE5hbWVdID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5leGlzdGluZ0F0dHJpYnV0ZXMsIC4uLmluY29taW5nQXR0cmlidXRlc10pKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdG9yIC0gUmF3IHNlYXJjaCBvcGVyYXRvci5cbiAqIEByZXR1cm5zIHtcImVxXCIgfCBcImxpa2VcIiB8IFwibm90RXFcIiB8IFwiZ3RcIiB8IFwiZ3RlcVwiIHwgXCJsdFwiIHwgXCJsdGVxXCJ9IC0gTm9ybWFsaXplZCBvcGVyYXRvci5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2VhcmNoT3BlcmF0b3Iob3BlcmF0b3IpIHtcbiAgY29uc3Qgb3BlcmF0b3JBbGlhc2VzID0ge1xuICAgIFwiPFwiOiBcImx0XCIsXG4gICAgXCI8PVwiOiBcImx0ZXFcIixcbiAgICBcIj5cIjogXCJndFwiLFxuICAgIFwiPj1cIjogXCJndGVxXCJcbiAgfVxuICBjb25zdCBub3JtYWxpemVkT3BlcmF0b3IgPSBvcGVyYXRvckFsaWFzZXNbLyoqIEB0eXBlIHtcIjxcIiB8IFwiPD1cIiB8IFwiPlwiIHwgXCI+PVwifSAqLyAob3BlcmF0b3IpXSB8fCBvcGVyYXRvclxuICBjb25zdCBzdXBwb3J0ZWRPcGVyYXRvcnMgPSBuZXcgU2V0KFtcImVxXCIsIFwibGlrZVwiLCBcIm5vdEVxXCIsIFwiZ3RcIiwgXCJndGVxXCIsIFwibHRcIiwgXCJsdGVxXCJdKVxuXG4gIGlmICghc3VwcG9ydGVkT3BlcmF0b3JzLmhhcyhub3JtYWxpemVkT3BlcmF0b3IpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBzZWFyY2ggb3BlcmF0b3IgbXVzdCBiZSBvbmUgb2Y6IGVxLCBsaWtlLCBub3RFcSwgZ3QsIGd0ZXEsIGx0LCBsdGVxLCA+LCA+PSwgPCwgPD0gKGdvdDogJHtvcGVyYXRvcn0pYClcbiAgfVxuXG4gIHJldHVybiAvKiogQHR5cGUge1wiZXFcIiB8IFwibGlrZVwiIHwgXCJub3RFcVwiIHwgXCJndFwiIHwgXCJndGVxXCIgfCBcImx0XCIgfCBcImx0ZXFcIn0gKi8gKG5vcm1hbGl6ZWRPcGVyYXRvcilcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRhcmdldEpvaW5zIC0gRXhpc3Rpbmcgam9pbiByZWNvcmQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGluY29taW5nSm9pbnMgLSBJbmNvbWluZyBqb2luIHJlY29yZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBtZXJnZUpvaW5SZWNvcmQodGFyZ2V0Sm9pbnMsIGluY29taW5nSm9pbnMpIHtcbiAgZm9yIChjb25zdCBbcmVsYXRpb25zaGlwTmFtZSwgaW5jb21pbmdWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5jb21pbmdKb2lucykpIHtcbiAgICBjb25zdCBleGlzdGluZ1ZhbHVlID0gdGFyZ2V0Sm9pbnNbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgIGlmIChpbmNvbWluZ1ZhbHVlID09PSB0cnVlKSB7XG4gICAgICBpZiAoZXhpc3RpbmdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRhcmdldEpvaW5zW3JlbGF0aW9uc2hpcE5hbWVdID0gdHJ1ZVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoaW5jb21pbmdWYWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBqb2luIHZhbHVlIGZvciAke3JlbGF0aW9uc2hpcE5hbWV9OiAke3R5cGVvZiBpbmNvbWluZ1ZhbHVlfWApXG4gICAgfVxuXG4gICAgaWYgKGlzUGxhaW5PYmplY3QoZXhpc3RpbmdWYWx1ZSkpIHtcbiAgICAgIG1lcmdlSm9pblJlY29yZChleGlzdGluZ1ZhbHVlLCBpbmNvbWluZ1ZhbHVlKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoZXhpc3RpbmdWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgdGFyZ2V0Sm9pbnNbcmVsYXRpb25zaGlwTmFtZV0gPSBub3JtYWxpemVKb2lucyhpbmNvbWluZ1ZhbHVlKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB0YXJnZXRKb2luc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG5vcm1hbGl6ZUpvaW5zKGluY29taW5nVmFsdWUpXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGpvaW5zIC0gSm9pbiBwYXlsb2FkLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gTm9ybWFsaXplZCByZWxhdGlvbnNoaXAgZGVzY3JpcHRvciBqb2lucy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSm9pbnMoam9pbnMpIHtcbiAgaWYgKCFqb2lucykgcmV0dXJuIHt9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoam9pbnMpKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBqb2luRW50cnkgb2Ygam9pbnMpIHtcbiAgICAgIGlmICghaXNQbGFpbk9iamVjdChqb2luRW50cnkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBqb2lucyBlbnRyeSB0eXBlOiAke3R5cGVvZiBqb2luRW50cnl9YClcbiAgICAgIH1cblxuICAgICAgbWVyZ2VKb2luUmVjb3JkKG5vcm1hbGl6ZWQsIG5vcm1hbGl6ZUpvaW5zKGpvaW5FbnRyeSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChqb2lucykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgam9pbnMgdHlwZTogJHt0eXBlb2Ygam9pbnN9YClcbiAgfVxuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9XG5cbiAgZm9yIChjb25zdCBbcmVsYXRpb25zaGlwTmFtZSwgcmVsYXRpb25zaGlwSm9pbl0gb2YgT2JqZWN0LmVudHJpZXMoam9pbnMpKSB7XG4gICAgaWYgKHJlbGF0aW9uc2hpcEpvaW4gPT09IHRydWUpIHtcbiAgICAgIG5vcm1hbGl6ZWRbcmVsYXRpb25zaGlwTmFtZV0gPSB0cnVlXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChpc1BsYWluT2JqZWN0KHJlbGF0aW9uc2hpcEpvaW4pKSB7XG4gICAgICBub3JtYWxpemVkW3JlbGF0aW9uc2hpcE5hbWVdID0gbm9ybWFsaXplSm9pbnMocmVsYXRpb25zaGlwSm9pbilcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGpvaW4gZGVmaW5pdGlvbiBmb3IgXCIke3JlbGF0aW9uc2hpcE5hbWV9XCI6ICR7dHlwZW9mIHJlbGF0aW9uc2hpcEpvaW59YClcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFNvcnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2x1bW4gLSBBdHRyaWJ1dGUgbmFtZSB0byBzb3J0IGJ5LlxuICogQHByb3BlcnR5IHtcImFzY1wiIHwgXCJkZXNjXCJ9IGRpcmVjdGlvbiAtIFNvcnQgZGlyZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gcGF0aCAtIFJlbGF0aW9uc2hpcCBwYXRoIGZyb20gcm9vdCBtb2RlbC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxHcm91cFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbHVtbiAtIEF0dHJpYnV0ZSBuYW1lIHRvIGdyb3VwIGJ5LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gcGF0aCAtIFJlbGF0aW9uc2hpcCBwYXRoIGZyb20gcm9vdCBtb2RlbC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxQbHVja1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbHVtbiAtIEF0dHJpYnV0ZSBuYW1lIHRvIHBsdWNrLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gcGF0aCAtIFJlbGF0aW9uc2hpcCBwYXRoIGZyb20gcm9vdCBtb2RlbC5cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gZGlyZWN0aW9uIC0gRGlyZWN0aW9uIHZhbHVlLlxuICogQHJldHVybnMge1wiYXNjXCIgfCBcImRlc2NcIn0gLSBOb3JtYWxpemVkIGRpcmVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU29ydERpcmVjdGlvbihkaXJlY3Rpb24pIHtcbiAgaWYgKHR5cGVvZiBkaXJlY3Rpb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc29ydCBkaXJlY3Rpb24gdHlwZTogJHt0eXBlb2YgZGlyZWN0aW9ufWApXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRGlyZWN0aW9uID0gZGlyZWN0aW9uLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG5cbiAgaWYgKG5vcm1hbGl6ZWREaXJlY3Rpb24gIT09IFwiYXNjXCIgJiYgbm9ybWFsaXplZERpcmVjdGlvbiAhPT0gXCJkZXNjXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc29ydCBkaXJlY3Rpb246ICR7ZGlyZWN0aW9ufWApXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZERpcmVjdGlvblxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdHVwbGUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgW3N0cmluZywgc3RyaW5nXX0gLSBXaGV0aGVyIHZhbHVlIGlzIGEgc29ydCB0dXBsZS5cbiAqL1xuZnVuY3Rpb24gc29ydFR1cGxlKHZhbHVlKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZVxuICBpZiAodmFsdWUubGVuZ3RoICE9PSAyKSByZXR1cm4gZmFsc2VcbiAgaWYgKHR5cGVvZiB2YWx1ZVswXSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlXG4gIGlmICh0eXBlb2YgdmFsdWVbMV0gIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZVxuICBpZiAodmFsdWVbMF0udHJpbSgpLmxlbmd0aCA8IDEpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IGRpcmVjdGlvbiA9IHZhbHVlWzFdLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG5cbiAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gXCJhc2NcIiB8fCBkaXJlY3Rpb24gPT09IFwiZGVzY1wiXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHNvcnRWYWx1ZSAtIFNvcnQgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gW3BhdGhdIC0gUmVsYXRpb25zaGlwIHBhdGguXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFNvcnR9IC0gTm9ybWFsaXplZCBzb3J0IGRlc2NyaXB0b3IuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU29ydFN0cmluZyhzb3J0VmFsdWUsIHBhdGggPSBbXSkge1xuICBjb25zdCB0cmltbWVkID0gc29ydFZhbHVlLnRyaW0oKVxuXG4gIGlmICh0cmltbWVkLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzb3J0IHZhbHVlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nXCIpXG4gIH1cblxuICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRyaW1tZWQuc2xpY2UoMSkudHJpbSgpXG5cbiAgICBpZiAoY29sdW1uLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzb3J0IGRlZmluaXRpb246ICR7c29ydFZhbHVlfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbHVtbixcbiAgICAgIGRpcmVjdGlvbjogXCJkZXNjXCIsXG4gICAgICBwYXRoOiBbLi4ucGF0aF1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzb3J0UGFydHMgPSB0cmltbWVkLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pXG5cbiAgaWYgKHNvcnRQYXJ0cy5sZW5ndGggPiAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNvcnQgZGVmaW5pdGlvbjogJHtzb3J0VmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGNvbHVtbiA9IHNvcnRQYXJ0c1swXVxuXG4gIGlmIChjb2x1bW4ubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzb3J0IGRlZmluaXRpb246ICR7c29ydFZhbHVlfWApXG4gIH1cblxuICBjb25zdCBkaXJlY3Rpb24gPSBzb3J0UGFydHMubGVuZ3RoID09PSAyXG4gICAgPyBub3JtYWxpemVTb3J0RGlyZWN0aW9uKHNvcnRQYXJ0c1sxXSlcbiAgICA6IFwiYXNjXCJcblxuICByZXR1cm4ge1xuICAgIGNvbHVtbixcbiAgICBkaXJlY3Rpb24sXG4gICAgcGF0aDogWy4uLnBhdGhdXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1tzdHJpbmcsIHN0cmluZ119IHNvcnRWYWx1ZSAtIFNvcnQgdHVwbGUuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbcGF0aF0gLSBSZWxhdGlvbnNoaXAgcGF0aC5cbiAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsU29ydH0gLSBOb3JtYWxpemVkIHNvcnQgZGVzY3JpcHRvci5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTb3J0VHVwbGUoc29ydFZhbHVlLCBwYXRoID0gW10pIHtcbiAgY29uc3QgW2NvbHVtblZhbHVlLCBkaXJlY3Rpb25WYWx1ZV0gPSBzb3J0VmFsdWVcbiAgY29uc3QgY29sdW1uID0gY29sdW1uVmFsdWUudHJpbSgpXG5cbiAgaWYgKGNvbHVtbi5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic29ydCB0dXBsZSBjb2x1bW4gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmdcIilcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY29sdW1uLFxuICAgIGRpcmVjdGlvbjogbm9ybWFsaXplU29ydERpcmVjdGlvbihkaXJlY3Rpb25WYWx1ZSksXG4gICAgcGF0aDogWy4uLnBhdGhdXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHNvcnRWYWx1ZSAtIE5lc3RlZCBzb3J0IG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aC5cbiAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsU29ydFtdfSAtIE5vcm1hbGl6ZWQgc29ydCBkZXNjcmlwdG9ycy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU29ydE9iamVjdChzb3J0VmFsdWUsIHBhdGgpIHtcbiAgLyoqIEB0eXBlIHtGcm9udGVuZE1vZGVsU29ydFtdfSAqL1xuICBjb25zdCBub3JtYWxpemVkU29ydHMgPSBbXVxuXG4gIGZvciAoY29uc3QgW3NvcnRLZXksIHNvcnRFbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoc29ydFZhbHVlKSkge1xuICAgIGlmICh0eXBlb2Ygc29ydEVudHJ5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBub3JtYWxpemVkU29ydHMucHVzaCh7XG4gICAgICAgIGNvbHVtbjogc29ydEtleSxcbiAgICAgICAgZGlyZWN0aW9uOiBub3JtYWxpemVTb3J0RGlyZWN0aW9uKHNvcnRFbnRyeSksXG4gICAgICAgIHBhdGg6IFsuLi5wYXRoXVxuICAgICAgfSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKHNvcnRUdXBsZShzb3J0RW50cnkpKSB7XG4gICAgICBub3JtYWxpemVkU29ydHMucHVzaChwYXJzZVNvcnRUdXBsZShzb3J0RW50cnksIFsuLi5wYXRoLCBzb3J0S2V5XSkpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNvcnRFbnRyeSkpIHtcbiAgICAgIGlmIChzb3J0RW50cnkubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc29ydCBkZWZpbml0aW9uIGZvciBcIiR7c29ydEtleX1cIjogZW1wdHkgYXJyYXlgKVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IG5lc3RlZFNvcnRFbnRyeSBvZiBzb3J0RW50cnkpIHtcbiAgICAgICAgaWYgKCFzb3J0VHVwbGUobmVzdGVkU29ydEVudHJ5KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzb3J0IGRlZmluaXRpb24gZm9yIFwiJHtzb3J0S2V5fVwiOiBleHBlY3RlZCBbY29sdW1uLCBkaXJlY3Rpb25dIHR1cGxlc2ApXG4gICAgICAgIH1cblxuICAgICAgICBub3JtYWxpemVkU29ydHMucHVzaChwYXJzZVNvcnRUdXBsZShuZXN0ZWRTb3J0RW50cnksIFsuLi5wYXRoLCBzb3J0S2V5XSkpXG4gICAgICB9XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChpc1BsYWluT2JqZWN0KHNvcnRFbnRyeSkpIHtcbiAgICAgIG5vcm1hbGl6ZWRTb3J0cy5wdXNoKC4uLm5vcm1hbGl6ZVNvcnRPYmplY3Qoc29ydEVudHJ5LCBbLi4ucGF0aCwgc29ydEtleV0pKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc29ydCBkZWZpbml0aW9uIGZvciBcIiR7c29ydEtleX1cIjogJHt0eXBlb2Ygc29ydEVudHJ5fWApXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZFNvcnRzXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBzb3J0IC0gU29ydCBwYXlsb2FkLlxuICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxTb3J0W119IC0gTm9ybWFsaXplZCBzb3J0IGRlZmluaXRpb25zLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTb3J0KHNvcnQpIHtcbiAgaWYgKCFzb3J0KSByZXR1cm4gW11cblxuICBpZiAodHlwZW9mIHNvcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gW3BhcnNlU29ydFN0cmluZyhzb3J0KV1cbiAgfVxuXG4gIGlmIChzb3J0VHVwbGUoc29ydCkpIHtcbiAgICByZXR1cm4gW3BhcnNlU29ydFR1cGxlKHNvcnQpXVxuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3Qoc29ydCkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplU29ydE9iamVjdChzb3J0LCBbXSlcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHNvcnQpKSB7XG4gICAgLyoqIEB0eXBlIHtGcm9udGVuZE1vZGVsU29ydFtdfSAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBzb3J0RW50cnkgb2Ygc29ydCkge1xuICAgICAgaWYgKHR5cGVvZiBzb3J0RW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbm9ybWFsaXplZC5wdXNoKHBhcnNlU29ydFN0cmluZyhzb3J0RW50cnkpKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoc29ydFR1cGxlKHNvcnRFbnRyeSkpIHtcbiAgICAgICAgbm9ybWFsaXplZC5wdXNoKHBhcnNlU29ydFR1cGxlKHNvcnRFbnRyeSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KHNvcnRFbnRyeSkpIHtcbiAgICAgICAgbm9ybWFsaXplZC5wdXNoKC4uLm5vcm1hbGl6ZVNvcnRPYmplY3Qoc29ydEVudHJ5LCBbXSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzb3J0IGVudHJ5IHR5cGU6ICR7dHlwZW9mIHNvcnRFbnRyeX1gKVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc29ydCB0eXBlOiAke3R5cGVvZiBzb3J0fWApXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGdyb3VwVmFsdWUgLSBHcm91cCBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbcGF0aF0gLSBSZWxhdGlvbnNoaXAgcGF0aC5cbiAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsR3JvdXB9IC0gTm9ybWFsaXplZCBncm91cCBkZXNjcmlwdG9yLlxuICovXG5mdW5jdGlvbiBwYXJzZUdyb3VwU3RyaW5nKGdyb3VwVmFsdWUsIHBhdGggPSBbXSkge1xuICBjb25zdCB0cmltbWVkID0gZ3JvdXBWYWx1ZS50cmltKClcblxuICBpZiAoIS9eW2EtekEtWl9dW2EtekEtWjAtOV9dKiQvLnRlc3QodHJpbW1lZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZ3JvdXAgY29sdW1uOiAke2dyb3VwVmFsdWV9YClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY29sdW1uOiB0cmltbWVkLFxuICAgIHBhdGg6IFsuLi5wYXRoXVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBkZXNjcmlwdG9yLlxuICogQHJldHVybnMge3ZhbHVlIGlzIHtjb2x1bW46IHN0cmluZywgcGF0aDogc3RyaW5nW119fSAtIFdoZXRoZXIgY2FuZGlkYXRlIGlzIGFuIGV4cGxpY2l0IGdyb3VwIGRlc2NyaXB0b3Igb2JqZWN0LlxuICovXG5mdW5jdGlvbiBncm91cERlc2NyaXB0b3IodmFsdWUpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkgcmV0dXJuIGZhbHNlXG4gIGlmICghKFwiY29sdW1uXCIgaW4gdmFsdWUpIHx8ICEoXCJwYXRoXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2VcbiAgaWYgKHR5cGVvZiB2YWx1ZS5jb2x1bW4gIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZVxuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUucGF0aCkpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiB2YWx1ZS5wYXRoLmV2ZXJ5KChwYXRoRW50cnkpID0+IHR5cGVvZiBwYXRoRW50cnkgPT09IFwic3RyaW5nXCIpXG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBncm91cFZhbHVlIC0gTmVzdGVkIGdyb3VwIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aC5cbiAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsR3JvdXBbXX0gLSBOb3JtYWxpemVkIGdyb3VwIGRlc2NyaXB0b3JzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVHcm91cE9iamVjdChncm91cFZhbHVlLCBwYXRoKSB7XG4gIC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbEdyb3VwW119ICovXG4gIGNvbnN0IG5vcm1hbGl6ZWRHcm91cHMgPSBbXVxuXG4gIGZvciAoY29uc3QgW2dyb3VwS2V5LCBncm91cEVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhncm91cFZhbHVlKSkge1xuICAgIGlmICh0eXBlb2YgZ3JvdXBFbnRyeSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbm9ybWFsaXplZEdyb3Vwcy5wdXNoKHBhcnNlR3JvdXBTdHJpbmcoZ3JvdXBFbnRyeSwgWy4uLnBhdGgsIGdyb3VwS2V5XSkpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGdyb3VwRW50cnkpKSB7XG4gICAgICBpZiAoZ3JvdXBFbnRyeS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBncm91cCBkZWZpbml0aW9uIGZvciBcIiR7Z3JvdXBLZXl9XCI6IGVtcHR5IGFycmF5YClcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBuZXN0ZWRHcm91cEVudHJ5IG9mIGdyb3VwRW50cnkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuZXN0ZWRHcm91cEVudHJ5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdyb3VwIGRlZmluaXRpb24gZm9yIFwiJHtncm91cEtleX1cIjogZXhwZWN0ZWQgc3RyaW5nIGNvbHVtbnNgKVxuICAgICAgICB9XG5cbiAgICAgICAgbm9ybWFsaXplZEdyb3Vwcy5wdXNoKHBhcnNlR3JvdXBTdHJpbmcobmVzdGVkR3JvdXBFbnRyeSwgWy4uLnBhdGgsIGdyb3VwS2V5XSkpXG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGlzUGxhaW5PYmplY3QoZ3JvdXBFbnRyeSkpIHtcbiAgICAgIG5vcm1hbGl6ZWRHcm91cHMucHVzaCguLi5ub3JtYWxpemVHcm91cE9iamVjdChncm91cEVudHJ5LCBbLi4ucGF0aCwgZ3JvdXBLZXldKSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdyb3VwIGRlZmluaXRpb24gZm9yIFwiJHtncm91cEtleX1cIjogJHt0eXBlb2YgZ3JvdXBFbnRyeX1gKVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRHcm91cHNcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGdyb3VwIC0gR3JvdXAgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsR3JvdXBbXX0gLSBOb3JtYWxpemVkIGdyb3VwIGRlZmluaXRpb25zLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVHcm91cChncm91cCkge1xuICBpZiAoIWdyb3VwKSByZXR1cm4gW11cblxuICBpZiAodHlwZW9mIGdyb3VwID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFtwYXJzZUdyb3VwU3RyaW5nKGdyb3VwKV1cbiAgfVxuXG4gIGlmIChncm91cERlc2NyaXB0b3IoZ3JvdXApKSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICBjb2x1bW46IHBhcnNlR3JvdXBTdHJpbmcoZ3JvdXAuY29sdW1uKS5jb2x1bW4sXG4gICAgICBwYXRoOiBbLi4uZ3JvdXAucGF0aF1cbiAgICB9XVxuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3QoZ3JvdXApKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUdyb3VwT2JqZWN0KGdyb3VwLCBbXSlcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGdyb3VwKSkge1xuICAgIC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbEdyb3VwW119ICovXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwRW50cnkgb2YgZ3JvdXApIHtcbiAgICAgIGlmICh0eXBlb2YgZ3JvdXBFbnRyeSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBub3JtYWxpemVkLnB1c2gocGFyc2VHcm91cFN0cmluZyhncm91cEVudHJ5KSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdyb3VwRGVzY3JpcHRvcihncm91cEVudHJ5KSkge1xuICAgICAgICBub3JtYWxpemVkLnB1c2goe1xuICAgICAgICAgIGNvbHVtbjogcGFyc2VHcm91cFN0cmluZyhncm91cEVudHJ5LmNvbHVtbikuY29sdW1uLFxuICAgICAgICAgIHBhdGg6IFsuLi5ncm91cEVudHJ5LnBhdGhdXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGdyb3VwRW50cnkpKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQucHVzaCguLi5ub3JtYWxpemVHcm91cE9iamVjdChncm91cEVudHJ5LCBbXSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBncm91cCBlbnRyeSB0eXBlOiAke3R5cGVvZiBncm91cEVudHJ5fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBncm91cCB0eXBlOiAke3R5cGVvZiBncm91cH1gKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbHVja1ZhbHVlIC0gUGx1Y2sgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gW3BhdGhdIC0gUmVsYXRpb25zaGlwIHBhdGguXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFBsdWNrfSAtIE5vcm1hbGl6ZWQgcGx1Y2sgZGVzY3JpcHRvci5cbiAqL1xuZnVuY3Rpb24gcGFyc2VQbHVja1N0cmluZyhwbHVja1ZhbHVlLCBwYXRoID0gW10pIHtcbiAgY29uc3QgdHJpbW1lZCA9IHBsdWNrVmFsdWUudHJpbSgpXG5cbiAgaWYgKCEvXlthLXpBLVpfXVthLXpBLVowLTlfXSokLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBsdWNrIGNvbHVtbjogJHtwbHVja1ZhbHVlfWApXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbHVtbjogdHJpbW1lZCxcbiAgICBwYXRoOiBbLi4ucGF0aF1cbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyB7Y29sdW1uOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdfX0gLSBXaGV0aGVyIGNhbmRpZGF0ZSBpcyBhbiBleHBsaWNpdCBwbHVjayBkZXNjcmlwdG9yIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcGx1Y2tEZXNjcmlwdG9yKHZhbHVlKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHJldHVybiBmYWxzZVxuICBpZiAoIShcImNvbHVtblwiIGluIHZhbHVlKSB8fCAhKFwicGF0aFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlXG4gIGlmICh0eXBlb2YgdmFsdWUuY29sdW1uICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2VcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlLnBhdGgpKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gdmFsdWUucGF0aC5ldmVyeSgocGF0aEVudHJ5KSA9PiB0eXBlb2YgcGF0aEVudHJ5ID09PSBcInN0cmluZ1wiKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcGx1Y2tWYWx1ZSAtIE5lc3RlZCBwbHVjayBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoIC0gUmVsYXRpb25zaGlwIHBhdGguXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFBsdWNrW119IC0gTm9ybWFsaXplZCBwbHVjayBkZXNjcmlwdG9ycy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGx1Y2tPYmplY3QocGx1Y2tWYWx1ZSwgcGF0aCkge1xuICAvKiogQHR5cGUge0Zyb250ZW5kTW9kZWxQbHVja1tdfSAqL1xuICBjb25zdCBub3JtYWxpemVkUGx1Y2tzID0gW11cblxuICBmb3IgKGNvbnN0IFtwbHVja0tleSwgcGx1Y2tFbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMocGx1Y2tWYWx1ZSkpIHtcbiAgICBpZiAodHlwZW9mIHBsdWNrRW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5vcm1hbGl6ZWRQbHVja3MucHVzaChwYXJzZVBsdWNrU3RyaW5nKHBsdWNrRW50cnksIFsuLi5wYXRoLCBwbHVja0tleV0pKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwbHVja0VudHJ5KSkge1xuICAgICAgaWYgKHBsdWNrRW50cnkubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGx1Y2sgZGVmaW5pdGlvbiBmb3IgXCIke3BsdWNrS2V5fVwiOiBlbXB0eSBhcnJheWApXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbmVzdGVkUGx1Y2tFbnRyeSBvZiBwbHVja0VudHJ5KSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmVzdGVkUGx1Y2tFbnRyeSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwbHVjayBkZWZpbml0aW9uIGZvciBcIiR7cGx1Y2tLZXl9XCI6IGV4cGVjdGVkIHN0cmluZyBjb2x1bW5zYClcbiAgICAgICAgfVxuXG4gICAgICAgIG5vcm1hbGl6ZWRQbHVja3MucHVzaChwYXJzZVBsdWNrU3RyaW5nKG5lc3RlZFBsdWNrRW50cnksIFsuLi5wYXRoLCBwbHVja0tleV0pKVxuICAgICAgfVxuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChpc1BsYWluT2JqZWN0KHBsdWNrRW50cnkpKSB7XG4gICAgICBub3JtYWxpemVkUGx1Y2tzLnB1c2goLi4ubm9ybWFsaXplUGx1Y2tPYmplY3QocGx1Y2tFbnRyeSwgWy4uLnBhdGgsIHBsdWNrS2V5XSkpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwbHVjayBkZWZpbml0aW9uIGZvciBcIiR7cGx1Y2tLZXl9XCI6ICR7dHlwZW9mIHBsdWNrRW50cnl9YClcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkUGx1Y2tzXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBwbHVjayAtIFBsdWNrIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFBsdWNrW119IC0gTm9ybWFsaXplZCBwbHVjayBkZWZpbml0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGx1Y2socGx1Y2spIHtcbiAgaWYgKCFwbHVjaykgcmV0dXJuIFtdXG5cbiAgaWYgKHR5cGVvZiBwbHVjayA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBbcGFyc2VQbHVja1N0cmluZyhwbHVjayldXG4gIH1cblxuICBpZiAocGx1Y2tEZXNjcmlwdG9yKHBsdWNrKSkge1xuICAgIHJldHVybiBbe1xuICAgICAgY29sdW1uOiBwYXJzZVBsdWNrU3RyaW5nKHBsdWNrLmNvbHVtbikuY29sdW1uLFxuICAgICAgcGF0aDogWy4uLnBsdWNrLnBhdGhdXG4gICAgfV1cbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHBsdWNrKSkge1xuICAgIHJldHVybiBub3JtYWxpemVQbHVja09iamVjdChwbHVjaywgW10pXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShwbHVjaykpIHtcbiAgICAvKiogQHR5cGUge0Zyb250ZW5kTW9kZWxQbHVja1tdfSAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBwbHVja0VudHJ5IG9mIHBsdWNrKSB7XG4gICAgICBpZiAodHlwZW9mIHBsdWNrRW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbm9ybWFsaXplZC5wdXNoKHBhcnNlUGx1Y2tTdHJpbmcocGx1Y2tFbnRyeSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChwbHVja0Rlc2NyaXB0b3IocGx1Y2tFbnRyeSkpIHtcbiAgICAgICAgbm9ybWFsaXplZC5wdXNoKHtcbiAgICAgICAgICBjb2x1bW46IHBhcnNlUGx1Y2tTdHJpbmcocGx1Y2tFbnRyeS5jb2x1bW4pLmNvbHVtbixcbiAgICAgICAgICBwYXRoOiBbLi4ucGx1Y2tFbnRyeS5wYXRoXVxuICAgICAgICB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChwbHVja0VudHJ5KSkge1xuICAgICAgICBub3JtYWxpemVkLnB1c2goLi4ubm9ybWFsaXplUGx1Y2tPYmplY3QocGx1Y2tFbnRyeSwgW10pKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGx1Y2sgZW50cnkgdHlwZTogJHt0eXBlb2YgcGx1Y2tFbnRyeX1gKVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGx1Y2sgdHlwZTogJHt0eXBlb2YgcGx1Y2t9YClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2Jhc2UuanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge1NldDxzdHJpbmc+fSAtIFJlc291cmNlIGF0dHJpYnV0ZSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFJlc291cmNlQXR0cmlidXRlcyhtb2RlbENsYXNzKSB7XG4gIGNvbnN0IHJlc291cmNlQ29uZmlnID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAobW9kZWxDbGFzcy5yZXNvdXJjZUNvbmZpZygpKVxuICBjb25zdCBhdHRyaWJ1dGVzID0gcmVzb3VyY2VDb25maWcuYXR0cmlidXRlc1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoYXR0cmlidXRlcylcbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoT2JqZWN0LmtleXMoYXR0cmlidXRlcykpXG4gIH1cblxuICByZXR1cm4gbmV3IFNldCgpXG59XG5cbi8qKlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aCAtIFJlbGF0aW9uc2hpcCBwYXRoLlxuICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL2Jhc2UuanNcIikuZGVmYXVsdH0gLSBUYXJnZXQgbW9kZWwgY2xhc3MgZm9yIHBhdGguXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxQbHVja1RhcmdldE1vZGVsQ2xhc3MobW9kZWxDbGFzcywgcGF0aCkge1xuICBsZXQgdGFyZ2V0TW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3NcblxuICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgcGF0aCkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcERlZmluaXRpb25zID0gdHlwZW9mIHRhcmdldE1vZGVsQ2xhc3MucmVsYXRpb25zaGlwRGVmaW5pdGlvbnMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyB0YXJnZXRNb2RlbENsYXNzLnJlbGF0aW9uc2hpcERlZmluaXRpb25zKClcbiAgICAgIDoge31cbiAgICBjb25zdCByZWxhdGlvbnNoaXBNb2RlbENsYXNzZXMgPSB0eXBlb2YgdGFyZ2V0TW9kZWxDbGFzcy5yZWxhdGlvbnNoaXBNb2RlbENsYXNzZXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyB0YXJnZXRNb2RlbENsYXNzLnJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcygpXG4gICAgICA6IHt9XG4gICAgY29uc3QgcmVsYXRpb25zaGlwRGVmaW5pdGlvbiA9IHJlbGF0aW9uc2hpcERlZmluaXRpb25zW3JlbGF0aW9uc2hpcE5hbWVdXG4gICAgY29uc3QgcmVsYXRpb25zaGlwVGFyZ2V0TW9kZWxDbGFzcyA9IHJlc29sdmVGcm9udGVuZE1vZGVsQ2xhc3MocmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzW3JlbGF0aW9uc2hpcE5hbWVdKVxuXG4gICAgaWYgKCFyZWxhdGlvbnNoaXBEZWZpbml0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcGx1Y2sgcmVsYXRpb25zaGlwIFwiJHtyZWxhdGlvbnNoaXBOYW1lfVwiIGZvciAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX1gKVxuICAgIH1cblxuICAgIGlmICghcmVsYXRpb25zaGlwVGFyZ2V0TW9kZWxDbGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyByZWxhdGlvbnNoaXAgbW9kZWwgY2xhc3MgY29uZmlndXJlZCBmb3IgJHt0YXJnZXRNb2RlbENsYXNzLm5hbWV9IyR7cmVsYXRpb25zaGlwTmFtZX1gKVxuICAgIH1cblxuICAgIHRhcmdldE1vZGVsQ2xhc3MgPSByZWxhdGlvbnNoaXBUYXJnZXRNb2RlbENsYXNzXG4gIH1cblxuICByZXR1cm4gdGFyZ2V0TW9kZWxDbGFzc1xufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUGx1Y2sgdmFsaWRhdGlvbiBhcmdzLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIFJvb3QgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxQbHVja1tdfSBhcmdzLnBsdWNrIC0gUGx1Y2sgZGVzY3JpcHRvcnMuXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFBsdWNrW119IC0gVmFsaWRhdGVkIHBsdWNrIGRlc2NyaXB0b3JzLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVBsdWNrRGVmaW5pdGlvbnMoe21vZGVsQ2xhc3MsIHBsdWNrfSkge1xuICByZXR1cm4gcGx1Y2subWFwKChwbHVja0VudHJ5KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IGZyb250ZW5kTW9kZWxQbHVja1RhcmdldE1vZGVsQ2xhc3MobW9kZWxDbGFzcywgcGx1Y2tFbnRyeS5wYXRoKVxuICAgIGNvbnN0IHRhcmdldEF0dHJpYnV0ZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VBdHRyaWJ1dGVzKHRhcmdldE1vZGVsQ2xhc3MpXG5cbiAgICBpZiAoIXRhcmdldEF0dHJpYnV0ZXMuaGFzKHBsdWNrRW50cnkuY29sdW1uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHBsdWNrIGNvbHVtbiBcIiR7cGx1Y2tFbnRyeS5jb2x1bW59XCIgZm9yICR7dGFyZ2V0TW9kZWxDbGFzcy5uYW1lfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbHVtbjogcGx1Y2tFbnRyeS5jb2x1bW4sXG4gICAgICBwYXRoOiBbLi4ucGx1Y2tFbnRyeS5wYXRoXVxuICAgIH1cbiAgfSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmRpdGlvbnMgLSBmaW5kQnkgY29uZGl0aW9ucy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2VyaWFsaXplZCBjb25kaXRpb25zIGZvciBlcnJvciBtZXNzYWdlcy5cbiAqL1xuZnVuY3Rpb24gc2VyaWFsaXplRmluZENvbmRpdGlvbnMoY29uZGl0aW9ucykge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShjb25kaXRpb25zKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCJbdW5zZXJpYWxpemFibGUgY29uZGl0aW9uc11cIlxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gZmluZEJ5IGNvbmRpdGlvbnMuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBKU09OLW5vcm1hbGl6ZWQgY29uZGl0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRmluZENvbmRpdGlvbnMoY29uZGl0aW9ucykge1xuICB0cnkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbmRpdGlvbnMpKSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBjb25kaXRpb25zIGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgaW50ZWdlciB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmd1bWVudE5hbWUgLSBBcmd1bWVudCBuYW1lIGZvciBlcnJvcnMuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIFZhbGlkYXRpb24gb3B0aW9ucy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLm1pbiAtIE1pbmltdW0gYWxsb3dlZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gTm9ybWFsaXplZCBpbnRlZ2VyIHZhbHVlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVJbnRlZ2VyQXJndW1lbnQodmFsdWUsIGFyZ3VtZW50TmFtZSwge21pbn0pIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YXJndW1lbnROYW1lfSBtdXN0IGJlIGFuIGludGVnZXIgbnVtYmVyYClcbiAgfVxuXG4gIGlmICh2YWx1ZSA8IG1pbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHthcmd1bWVudE5hbWV9IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7bWlufWApXG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1wiYXNjXCIgfCBcImRlc2NcIn0gZGlyZWN0aW9uIC0gQ3VycmVudCBzb3J0IGRpcmVjdGlvbi5cbiAqIEByZXR1cm5zIHtcImFzY1wiIHwgXCJkZXNjXCJ9IC0gUmV2ZXJzZWQgZGlyZWN0aW9uLlxuICovXG5mdW5jdGlvbiByZXZlcnNlU29ydERpcmVjdGlvbihkaXJlY3Rpb24pIHtcbiAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gXCJhc2NcIiA/IFwiZGVzY1wiIDogXCJhc2NcIlxufVxuXG4vKipcbiAqIFF1ZXJ5IHdyYXBwZXIgZm9yIGZyb250ZW5kIG1vZGVsIGNvbW1hbmRzLlxuICogQHRlbXBsYXRlIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLmpzXCIpLmRlZmF1bHR9IFRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRnJvbnRlbmRNb2RlbFF1ZXJ5IHtcbiAgLyoqIEB0eXBlIHtGcm9udGVuZE1vZGVsU2VhcmNoW119ICovXG4gIF9zZWFyY2hlcyA9IFtdXG4gIC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFNvcnRbXX0gKi9cbiAgX3NvcnQgPSBbXVxuICAvKiogQHR5cGUge0Zyb250ZW5kTW9kZWxHcm91cFtdfSAqL1xuICBfZ3JvdXAgPSBbXVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIENvbnN0cnVjdG9yIGFyZ3MuXG4gICAqIEBwYXJhbSB7VH0gYXJncy5tb2RlbENsYXNzIC0gRnJvbnRlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZH0gW2FyZ3MucHJlbG9hZF0gLSBQcmVsb2FkIG1hcC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHttb2RlbENsYXNzLCBwcmVsb2FkID0ge319KSB7XG4gICAgdGhpcy5tb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuICAgIHRoaXMuX3ByZWxvYWQgPSBub3JtYWxpemVQcmVsb2FkKHByZWxvYWQpXG4gICAgdGhpcy5fam9pbnMgPSB7fVxuICAgIHRoaXMuX3doZXJlID0ge31cbiAgICB0aGlzLl9zZWFyY2hlcyA9IFtdXG4gICAgdGhpcy5fc2VsZWN0ID0ge31cbiAgICB0aGlzLl9zb3J0ID0gW11cbiAgICB0aGlzLl9ncm91cCA9IFtdXG4gICAgdGhpcy5fZGlzdGluY3QgPSBmYWxzZVxuICAgIHRoaXMuX2xpbWl0ID0gbnVsbFxuICAgIHRoaXMuX29mZnNldCA9IG51bGxcbiAgICB0aGlzLl9wYWdlID0gbnVsbFxuICAgIHRoaXMuX3BlclBhZ2UgPSBudWxsXG4gICAgLyoqIEB0eXBlIHtBcnJheTx7YXR0cmlidXRlTmFtZTogc3RyaW5nLCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHdoZXJlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj59Pn0gKi9cbiAgICB0aGlzLl93aXRoQ291bnQgPSBbXVxuICAgIC8qKiBAdHlwZSB7QXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55Pj59ICovXG4gICAgdGhpcy5fcXVlcnlEYXRhID0gW11cbiAgICAvKipcbiAgICAgKiBQZXItcmVjb3JkIGFiaWxpdHkgc3BlYy4gTm9ybWFsaXplZCB0byBhIGxpc3Qgb2ZcbiAgICAgKiBge21vZGVsTmFtZSwgYWN0aW9uc31gIGVudHJpZXMg4oCUIG9uZSBlbnRyeSBwZXIgbW9kZWwgdGhhdCBzaG91bGRcbiAgICAgKiBoYXZlIGFiaWxpdHkgcmVzdWx0cyBhdHRhY2hlZC4gVGhlIHJvb3QgcXVlcnkncyBtb2RlbCBjbGFzc1xuICAgICAqIG5hbWUgaXMgaW1wbGljaXQgdmlhIGBcIl9fcm9vdF9fXCJgIHdoZW4gdGhlIGNhbGxlciB1c2VkIHRoZSBmbGF0XG4gICAgICogYXJyYXkgZm9ybS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8e21vZGVsTmFtZTogc3RyaW5nLCBhY3Rpb25zOiBzdHJpbmdbXX0+fVxuICAgICAqL1xuICAgIHRoaXMuX2FiaWxpdGllcyA9IFtdXG4gIH1cblxuICAvKipcbiAgICogVGVsbCB0aGUgYmFja2VuZCB0byBldmFsdWF0ZSBvbmUgb3IgbW9yZSBhYmlsaXR5IGFjdGlvbnMgYWdhaW5zdFxuICAgKiBlYWNoIHJldHVybmVkIHJlY29yZCAoYW5kIGl0cyBwcmVsb2FkZWQgcmVsYXRpb25zLCB3aGVuIGtleWVkIGJ5XG4gICAqIG1vZGVsIG5hbWUpIGFuZCBzaGlwIHRoZSByZXN1bHRzIGJhY2sgc28gdGhlIGZyb250ZW5kIGNhbiByZWFkXG4gICAqIHRoZW0gdmlhIGByZWNvcmQuY2FuKGFjdGlvbilgLlxuICAgKlxuICAgKiBGbGF0IGZvcm0g4oCUIGFwcGxpZXMgdG8gdGhlIHF1ZXJ5J3Mgb3duIG1vZGVsIGNsYXNzOlxuICAgKiAgIGBgYFxuICAgKiAgIGNvbnN0IHRpbWVsb2dzID0gYXdhaXQgVGltZWxvZy53aGVyZSh7dGFza0lkfSlcbiAgICogICAgIC5hYmlsaXRpZXMoW1widXBkYXRlXCIsIFwiZGVzdHJveVwiXSlcbiAgICogICAgIC50b0FycmF5KClcbiAgICogICB0aW1lbG9nc1swXS5jYW4oXCJ1cGRhdGVcIikgLy8g4oaSIGJvb2xlYW5cbiAgICogICBgYGBcbiAgICpcbiAgICogS2V5ZWQgZm9ybSDigJQgdGFyZ2V0cyByZWNvcmRzIGJ5IG1vZGVsIG5hbWUsIHVzZWZ1bCBmb3IgcHJlbG9hZGVkXG4gICAqIGNoaWxkcmVuOlxuICAgKiAgIGBgYFxuICAgKiAgIGNvbnN0IHByb2plY3QgPSBhd2FpdCBQcm9qZWN0XG4gICAqICAgICAucHJlbG9hZChcInRpbWVsb2dzXCIpXG4gICAqICAgICAuYWJpbGl0aWVzKHtUaW1lbG9nOiBbXCJ1cGRhdGVcIiwgXCJkZXN0cm95XCJdfSlcbiAgICogICAgIC5maXJzdCgpXG4gICAqICAgcHJvamVjdC50aW1lbG9ncygpLmxvYWRlZCgpWzBdLmNhbihcInVwZGF0ZVwiKSAvLyDihpIgYm9vbGVhblxuICAgKiAgIGBgYFxuICAgKlxuICAgKiBLZXlzIGluIHRoZSBrZXllZCBmb3JtIGFyZSB0aGUgYmFja2VuZCBtb2RlbCBuYW1lcyAoYXMgcmV0dXJuZWQgYnlcbiAgICogYE1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClgIC8gdGhlIGBtb2RlbE5hbWVgIGZpZWxkIG9mIHRoZVxuICAgKiBmcm9udGVuZC1tb2RlbCByZXNvdXJjZSBjb25maWcpLiBWYWx1ZXMgYXJlIHRoZSBhYmlsaXR5LWFjdGlvblxuICAgKiBzdHJpbmdzIOKAlCB0eXBpY2FsbHkgYFwidXBkYXRlXCJgIC8gYFwiZGVzdHJveVwiYCAvIGBcImNyZWF0ZVwiYCAvXG4gICAqIGBcInJlYWRcImAsIGJ1dCBhbnkgY3VzdG9tIGFjdGlvbiByZWdpc3RlcmVkIG9uIHRoZSByZXNvdXJjZSdzXG4gICAqIGF1dGhvcml6YXRpb24gYWJpbGl0eSBpcyBhY2NlcHRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gc3BlY1xuICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICovXG4gIGFiaWxpdGllcyhzcGVjKSB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBub3JtYWxpemVBYmlsaXRpZXNTcGVjKHNwZWMsIHRoaXMubW9kZWxDbGFzcykpIHtcbiAgICAgIHRoaXMuX21lcmdlQWJpbGl0eUVudHJ5KGVudHJ5KVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7bW9kZWxOYW1lOiBzdHJpbmcsIGFjdGlvbnM6IHN0cmluZ1tdfX0gZW50cnlcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfbWVyZ2VBYmlsaXR5RW50cnkoZW50cnkpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX2FiaWxpdGllcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5tb2RlbE5hbWUgPT09IGVudHJ5Lm1vZGVsTmFtZSlcblxuICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgIHRoaXMuX2FiaWxpdGllcy5wdXNoKHthY3Rpb25zOiBbLi4uZW50cnkuYWN0aW9uc10sIG1vZGVsTmFtZTogZW50cnkubW9kZWxOYW1lfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGVudHJ5LmFjdGlvbnMpIHtcbiAgICAgIGlmICghZXhpc3RpbmcuYWN0aW9ucy5pbmNsdWRlcyhhY3Rpb24pKSBleGlzdGluZy5hY3Rpb25zLnB1c2goYWN0aW9uKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUZWxsIHRoZSBiYWNrZW5kIGluZGV4IHF1ZXJ5IHRvIGF0dGFjaCBvbmUgb3IgbW9yZSBhc3NvY2lhdGlvblxuICAgKiBjb3VudHMgdG8gZWFjaCByZXR1cm5lZCByZWNvcmQuIFBhcnNlcyB0aGUgc2FtZSBzaGFwZXMgYXMgdGhlXG4gICAqIGJhY2tlbmQgYE1vZGVsQ2xhc3NRdWVyeSN3aXRoQ291bnRgLCB0aGVuIHNoaXBzIHRoZSBub3JtYWxpemVkXG4gICAqIGVudHJpZXMgYXMgcGFydCBvZiB0aGUgYGluZGV4YCBjb21tYW5kIHBheWxvYWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwge3JlbGF0aW9uc2hpcD86IHN0cmluZywgd2hlcmU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0+fSBzcGVjXG4gICAqIEByZXR1cm5zIHt0aGlzfVxuICAgKi9cbiAgd2l0aENvdW50KHNwZWMpIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG5vcm1hbGl6ZVdpdGhDb3VudEZyb250ZW5kKHNwZWMpKSB7XG4gICAgICB0aGlzLl93aXRoQ291bnQucHVzaChlbnRyeSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3Qgb25lIG9yIG1vcmUgYmFja2VuZCBxdWVyeURhdGEgZW50cmllcyBmb3IgZWFjaCByZXR1cm5lZFxuICAgKiByZWNvcmQuIFRoZSBzcGVjIGlzIGEgbmFtZSBvciBuZXN0ZWQtcmVjb3JkIHNoYXBlIG1hdGNoaW5nIHRoZVxuICAgKiBgTW9kZWwucXVlcnlEYXRhKG5hbWUsIGZuKWAgcmVnaXN0cmF0aW9ucyBvbiB0aGUgYmFja2VuZCDigJQgdGhlXG4gICAqIGZyb250ZW5kIHNoaXBzIG9ubHkgdGhlc2UgbmFtZXM7IHRoZSBTUUwgZnJhZ21lbnRzIHN0YXkgc2VydmVyLVxuICAgKiBzaWRlLiBBbGwgcmVzdWx0aW5nIGFsaWFzZXMgYXJlIGF0dGFjaGVkIHRvIHRoZSByb290IHJlY29yZCBhbmRcbiAgICogcmVhZCBiYWNrIHdpdGggYHJlY29yZC5xdWVyeURhdGEoYWxpYXNOYW1lKWAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55Pj4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzcGVjXG4gICAqIEByZXR1cm5zIHt0aGlzfVxuICAgKi9cbiAgcXVlcnlEYXRhKHNwZWMpIHtcbiAgICBpZiAoc3BlYyA9PSBudWxsKSByZXR1cm4gdGhpc1xuXG4gICAgdGhpcy5fcXVlcnlEYXRhLnB1c2goLyoqIEB0eXBlIHthbnl9ICovIChzcGVjKSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gUm9vdC1tb2RlbCB3aGVyZSBjb25kaXRpb25zLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBRdWVyeSB3aXRoIG1lcmdlZCB3aGVyZSBjb25kaXRpb25zLlxuICAgKi9cbiAgd2hlcmUoY29uZGl0aW9ucykge1xuICAgIHRoaXMubW9kZWxDbGFzcy5hc3NlcnRGaW5kQnlDb25kaXRpb25zKGNvbmRpdGlvbnMpXG4gICAgY29uc3Qgbm9ybWFsaXplZENvbmRpdGlvbnMgPSBub3JtYWxpemVGaW5kQ29uZGl0aW9ucyhjb25kaXRpb25zKVxuXG4gICAgdGhpcy5fd2hlcmUgPSB7XG4gICAgICAuLi50aGlzLl93aGVyZSxcbiAgICAgIC4uLm5vcm1hbGl6ZWRDb25kaXRpb25zXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3V0aWxzL21vZGVsLXNjb3BlLmpzXCIpLk1vZGVsU2NvcGVEZXNjcmlwdG9yfSBzY29wZURlc2NyaXB0b3IgLSBTY29wZSBkZXNjcmlwdG9yLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBTY29wZWQgcXVlcnkuXG4gICAqL1xuICBzY29wZShzY29wZURlc2NyaXB0b3IpIHtcbiAgICBpZiAoIWlzTW9kZWxTY29wZURlc2NyaXB0b3Ioc2NvcGVEZXNjcmlwdG9yKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2NvcGUoKSBleHBlY3RzIGEgZGVzY3JpcHRvciByZXR1cm5lZCBieSBkZWZpbmVTY29wZSguLi4pLnNjb3BlKC4uLilcIilcbiAgICB9XG5cbiAgICBpZiAoc2NvcGVEZXNjcmlwdG9yLm1vZGVsQ2xhc3MgIT09IHRoaXMubW9kZWxDbGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYXBwbHkgJHtzY29wZURlc2NyaXB0b3IubW9kZWxDbGFzcy5uYW1lfSBzY29wZSB0byAke3RoaXMubW9kZWxDbGFzcy5uYW1lfSBxdWVyeWApXG4gICAgfVxuXG4gICAgY29uc3Qgc2NvcGVkUXVlcnkgPSAvKiogQHR5cGUge3RoaXMgfCB2b2lkfSAqLyAoc2NvcGVEZXNjcmlwdG9yLmNhbGxiYWNrKHtcbiAgICAgIGRyaXZlcjogbnVsbCxcbiAgICAgIG1vZGVsQ2xhc3M6IHRoaXMubW9kZWxDbGFzcyxcbiAgICAgIHF1ZXJ5OiB0aGlzLFxuICAgICAgdGFibGU6IG51bGxcbiAgICB9LCAuLi5zY29wZURlc2NyaXB0b3Iuc2NvcGVBcmdzKSlcblxuICAgIHJldHVybiBzY29wZWRRdWVyeSB8fCB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXJhbXMgLSBSYW5zYWNrLXN0eWxlIHBhcmFtcyBoYXNoLiBTdXBwb3J0cyBgc2Aga2V5IGZvciBzb3J0aW5nIChlLmcuLCBge3M6IFwibmFtZSBhc2NcIn1gKS5cbiAgICogQHJldHVybnMge3RoaXN9IC0gUXVlcnkgd2l0aCBSYW5zYWNrIGZpbHRlcnMgYW5kIHNvcnQgYXBwbGllZC5cbiAgICovXG4gIHJhbnNhY2socGFyYW1zKSB7XG4gICAgY29uc3Qge3MsIC4uLmZpbHRlclBhcmFtc30gPSBwYXJhbXNcbiAgICBjb25zdCBjb25kaXRpb25zID0gbm9ybWFsaXplUmFuc2Fja1BhcmFtcyh0aGlzLm1vZGVsQ2xhc3MsIGZpbHRlclBhcmFtcylcblxuICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcbiAgICAgIGFwcGx5RnJvbnRlbmRSYW5zYWNrQ29uZGl0aW9uKHtjb25kaXRpb24sIHF1ZXJ5OiB0aGlzfSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHMgPT09IFwic3RyaW5nXCIgJiYgcy50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydHMgPSBwYXJzZVJhbnNhY2tTb3J0KHRoaXMubW9kZWxDbGFzcywgcylcblxuICAgICAgZm9yIChjb25zdCBzb3J0RGVmIG9mIHNvcnRzKSB7XG4gICAgICAgIHRoaXMuc29ydChbW3NvcnREZWYuYXR0cmlidXRlLCBzb3J0RGVmLmRpcmVjdGlvbl1dKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW3JlcXVpcmVkQXR0cmlidXRlc10gLSBFeHRyYSByZXF1aXJlZCBhdHRyaWJ1dGVzIGZvciB0aGUgcm9vdCBtb2RlbC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gLSBTZWxlY3QgbWFwIHdpdGggcmVxdWlyZWQgcm9vdCBhdHRyaWJ1dGVzIG1lcmdlZCB3aGVuIHJvb3Qgc2VsZWN0IGV4aXN0cy5cbiAgICovXG4gIHNlbGVjdFdpdGhSZXF1aXJlZFJvb3RBdHRyaWJ1dGVzKHJlcXVpcmVkQXR0cmlidXRlcyA9IFtdKSB7XG4gICAgY29uc3Qgcm9vdE1vZGVsTmFtZSA9IHRoaXMubW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICAgIGNvbnN0IHNlbGVjdE1hcCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSAqLyAodGhpcy5fc2VsZWN0KVxuICAgIGNvbnN0IGV4aXN0aW5nUm9vdEF0dHJpYnV0ZXMgPSBzZWxlY3RNYXBbcm9vdE1vZGVsTmFtZV1cblxuICAgIGlmICghZXhpc3RpbmdSb290QXR0cmlidXRlcykge1xuICAgICAgcmV0dXJuIHNlbGVjdE1hcFxuICAgIH1cblxuICAgIGNvbnN0IHJvb3RQcmltYXJ5S2V5ID0gdGhpcy5tb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNlbGVjdE1hcCxcbiAgICAgIFtyb290TW9kZWxOYW1lXTogQXJyYXkuZnJvbShuZXcgU2V0KFtyb290UHJpbWFyeUtleSwgLi4uZXhpc3RpbmdSb290QXR0cmlidXRlcywgLi4ucmVxdWlyZWRBdHRyaWJ1dGVzXSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZCB8IHN0cmluZyB8IEFycmF5PHN0cmluZyB8IGltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmQ+fSBwcmVsb2FkIC0gUHJlbG9hZCB0byBtZXJnZS5cbiAgICogQHJldHVybnMge3RoaXN9IC0gUXVlcnkgd2l0aCBtZXJnZWQgcHJlbG9hZHMuXG4gICAqL1xuICBwcmVsb2FkKHByZWxvYWQpIHtcbiAgICBtZXJnZVByZWxvYWRSZWNvcmQodGhpcy5fcHJlbG9hZCwgbm9ybWFsaXplUHJlbG9hZChwcmVsb2FkKSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IHN0cmluZz4gfCBzdHJpbmcgfCBzdHJpbmdbXX0gc2VsZWN0IC0gTW9kZWwtYXdhcmUgYXR0cmlidXRlIHNlbGVjdCBtYXAgb3Igcm9vdC1tb2RlbCBzaG9ydGhhbmQuXG4gICAqIEByZXR1cm5zIHt0aGlzfSAtIFF1ZXJ5IHdpdGggbWVyZ2VkIHNlbGVjdGVkIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBzZWxlY3Qoc2VsZWN0KSB7XG4gICAgbWVyZ2VTZWxlY3RSZWNvcmQodGhpcy5fc2VsZWN0LCBub3JtYWxpemVTZWxlY3Qoc2VsZWN0LCB0aGlzLm1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCkpKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT4gfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gam9pbnMgLSBSZWxhdGlvbnNoaXAgZGVzY3JpcHRvciBqb2lucy5cbiAgICogQHJldHVybnMge3RoaXN9IC0gUXVlcnkgd2l0aCBtZXJnZWQgam9pbnMuXG4gICAqL1xuICBqb2lucyhqb2lucykge1xuICAgIG1lcmdlSm9pblJlY29yZCh0aGlzLl9qb2lucywgbm9ybWFsaXplSm9pbnMoam9pbnMpKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoIC0gUmVsYXRpb25zaGlwIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW4gLSBDb2x1bW4gb3IgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7XCJlcVwiIHwgXCJsaWtlXCIgfCBcIm5vdEVxXCIgfCBcImd0XCIgfCBcImd0ZXFcIiB8IFwibHRcIiB8IFwibHRlcVwiIHwgXCI+XCIgfCBcIj49XCIgfCBcIjxcIiB8IFwiPD1cIn0gb3BlcmF0b3IgLSBTZWFyY2ggb3BlcmF0b3IuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFNlYXJjaCB2YWx1ZS5cbiAgICogQHJldHVybnMge3RoaXN9IC0gUXVlcnkgd2l0aCBhcHBlbmRlZCBzZWFyY2guXG4gICAqL1xuICBzZWFyY2gocGF0aCwgY29sdW1uLCBvcGVyYXRvciwgdmFsdWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc2VhcmNoIHBhdGggbXVzdCBiZSBhbiBhcnJheSwgZ290OiAke3R5cGVvZiBwYXRofWApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwYXRoRW50cnkgb2YgcGF0aCkge1xuICAgICAgaWYgKHR5cGVvZiBwYXRoRW50cnkgIT09IFwic3RyaW5nXCIgfHwgcGF0aEVudHJ5Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2VhcmNoIHBhdGggZW50cmllcyBtdXN0IGJlIG5vbi1lbXB0eSBzdHJpbmdzXCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb2x1bW4gIT09IFwic3RyaW5nXCIgfHwgY29sdW1uLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlYXJjaCBjb2x1bW4gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmdcIilcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wZXJhdG9yICE9PSBcInN0cmluZ1wiIHx8IG9wZXJhdG9yLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlYXJjaCBvcGVyYXRvciBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ1wiKVxuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRPcGVyYXRvciA9IG5vcm1hbGl6ZVNlYXJjaE9wZXJhdG9yKG9wZXJhdG9yKVxuXG4gICAgdGhpcy5fc2VhcmNoZXMucHVzaCh7XG4gICAgICBjb2x1bW4sXG4gICAgICBvcGVyYXRvcjogbm9ybWFsaXplZE9wZXJhdG9yLFxuICAgICAgcGF0aDogWy4uLnBhdGhdLFxuICAgICAgdmFsdWVcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdIHwgW3N0cmluZywgc3RyaW5nXSB8IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+IHwgUmVjb3JkPHN0cmluZywgYW55PiB8IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBzb3J0IC0gU29ydCBkZWZpbml0aW9uKHMpLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBRdWVyeSB3aXRoIGFwcGVuZGVkIHNvcnQgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBzb3J0KHNvcnQpIHtcbiAgICB0aGlzLl9zb3J0LnB1c2goLi4ubm9ybWFsaXplU29ydChzb3J0KSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXSB8IFtzdHJpbmcsIHN0cmluZ10gfCBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gb3JkZXIgLSBPcmRlciBkZWZpbml0aW9uKHMpLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBRdWVyeSB3aXRoIGFwcGVuZGVkIHNvcnQgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBvcmRlcihvcmRlcikge1xuICAgIHJldHVybiB0aGlzLnNvcnQob3JkZXIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gZ3JvdXAgLSBHcm91cCBkZWZpbml0aW9uKHMpLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBRdWVyeSB3aXRoIGFwcGVuZGVkIGdyb3VwIGRlZmluaXRpb25zLlxuICAgKi9cbiAgZ3JvdXAoZ3JvdXApIHtcbiAgICB0aGlzLl9ncm91cC5wdXNoKC4uLm5vcm1hbGl6ZUdyb3VwKGdyb3VwKSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufSBbdmFsdWVdIC0gV2hldGhlciB0byByZXF1ZXN0IGRpc3RpbmN0IHJvd3MuXG4gICAqIEByZXR1cm5zIHt0aGlzfSAtIFF1ZXJ5IHdpdGggZGlzdGluY3QgZmxhZy5cbiAgICovXG4gIGRpc3RpbmN0KHZhbHVlID0gdHJ1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGRpc3RpbmN0IG11c3QgYmUgYSBib29sZWFuLCBnb3Q6ICR7dHlwZW9mIHZhbHVlfWApXG4gICAgfVxuXG4gICAgdGhpcy5fZGlzdGluY3QgPSB2YWx1ZVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBNYXhpbXVtIG51bWJlciBvZiByZWNvcmRzLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBRdWVyeSB3aXRoIGxpbWl0LlxuICAgKi9cbiAgbGltaXQodmFsdWUpIHtcbiAgICB0aGlzLl9saW1pdCA9IG5vcm1hbGl6ZUludGVnZXJBcmd1bWVudCh2YWx1ZSwgXCJsaW1pdFwiLCB7bWluOiAwfSlcbiAgICB0aGlzLl9wYWdlID0gbnVsbFxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBOdW1iZXIgb2YgcmVjb3JkcyB0byBza2lwLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBRdWVyeSB3aXRoIG9mZnNldC5cbiAgICovXG4gIG9mZnNldCh2YWx1ZSkge1xuICAgIHRoaXMuX29mZnNldCA9IG5vcm1hbGl6ZUludGVnZXJBcmd1bWVudCh2YWx1ZSwgXCJvZmZzZXRcIiwge21pbjogMH0pXG4gICAgdGhpcy5fcGFnZSA9IG51bGxcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VOdW1iZXIgLSAxLWJhc2VkIHBhZ2UgbnVtYmVyLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBRdWVyeSB3aXRoIHBhZ2UgYXBwbGllZC5cbiAgICovXG4gIHBhZ2UocGFnZU51bWJlcikge1xuICAgIHRoaXMuX3BhZ2UgPSBub3JtYWxpemVJbnRlZ2VyQXJndW1lbnQocGFnZU51bWJlciwgXCJwYWdlXCIsIHttaW46IDF9KVxuICAgIGNvbnN0IHBhZ2VTaXplID0gdGhpcy5fcGVyUGFnZSB8fCAzMFxuXG4gICAgdGhpcy5fbGltaXQgPSBwYWdlU2l6ZVxuICAgIHRoaXMuX29mZnNldCA9ICh0aGlzLl9wYWdlIC0gMSkgKiBwYWdlU2l6ZVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcGVyUGFnZSAtIFBhZ2Ugc2l6ZS5cbiAgICogQHJldHVybnMge3RoaXN9IC0gUXVlcnkgd2l0aCBwZXItcGFnZSBhcHBsaWVkLlxuICAgKi9cbiAgcGVyUGFnZShwZXJQYWdlKSB7XG4gICAgdGhpcy5fcGVyUGFnZSA9IG5vcm1hbGl6ZUludGVnZXJBcmd1bWVudChwZXJQYWdlLCBcInBlclBhZ2VcIiwge21pbjogMX0pXG5cbiAgICBpZiAodGhpcy5fcGFnZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fbGltaXQgPSB0aGlzLl9wZXJQYWdlXG4gICAgICB0aGlzLl9vZmZzZXQgPSAodGhpcy5fcGFnZSAtIDEpICogdGhpcy5fcGVyUGFnZVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxRdWVyeTxUPn0gLSBDbG9uZWQgcXVlcnkgaW5zdGFuY2UuXG4gICAqL1xuICBjbG9uZSgpIHtcbiAgICBjb25zdCBuZXdRdWVyeSA9IC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAqLyAobmV3IEZyb250ZW5kTW9kZWxRdWVyeSh7XG4gICAgICBtb2RlbENsYXNzOiB0aGlzLm1vZGVsQ2xhc3MsXG4gICAgICBwcmVsb2FkOiBub3JtYWxpemVQcmVsb2FkKHRoaXMuX3ByZWxvYWQpXG4gICAgfSkpXG5cbiAgICBuZXdRdWVyeS5fam9pbnMgPSBub3JtYWxpemVKb2lucyh0aGlzLl9qb2lucylcbiAgICBuZXdRdWVyeS5fd2hlcmUgPSBub3JtYWxpemVGaW5kQ29uZGl0aW9ucyh0aGlzLl93aGVyZSlcbiAgICBuZXdRdWVyeS5fc2VhcmNoZXMgPSB0aGlzLl9zZWFyY2hlcy5tYXAoKHNlYXJjaCkgPT4gKHtcbiAgICAgIGNvbHVtbjogc2VhcmNoLmNvbHVtbixcbiAgICAgIG9wZXJhdG9yOiBzZWFyY2gub3BlcmF0b3IsXG4gICAgICBwYXRoOiBbLi4uc2VhcmNoLnBhdGhdLFxuICAgICAgdmFsdWU6IHNlYXJjaC52YWx1ZVxuICAgIH0pKVxuICAgIG5ld1F1ZXJ5Ll9zZWxlY3QgPSBub3JtYWxpemVTZWxlY3QodGhpcy5fc2VsZWN0KVxuICAgIG5ld1F1ZXJ5Ll9zb3J0ID0gdGhpcy5fc29ydC5tYXAoKHNvcnRFbnRyeSkgPT4gKHtcbiAgICAgIGNvbHVtbjogc29ydEVudHJ5LmNvbHVtbixcbiAgICAgIGRpcmVjdGlvbjogc29ydEVudHJ5LmRpcmVjdGlvbixcbiAgICAgIHBhdGg6IFsuLi5zb3J0RW50cnkucGF0aF1cbiAgICB9KSlcbiAgICBuZXdRdWVyeS5fZ3JvdXAgPSB0aGlzLl9ncm91cC5tYXAoKGdyb3VwRW50cnkpID0+ICh7XG4gICAgICBjb2x1bW46IGdyb3VwRW50cnkuY29sdW1uLFxuICAgICAgcGF0aDogWy4uLmdyb3VwRW50cnkucGF0aF1cbiAgICB9KSlcbiAgICBuZXdRdWVyeS5fZGlzdGluY3QgPSB0aGlzLl9kaXN0aW5jdFxuICAgIG5ld1F1ZXJ5Ll9saW1pdCA9IHRoaXMuX2xpbWl0XG4gICAgbmV3UXVlcnkuX29mZnNldCA9IHRoaXMuX29mZnNldFxuICAgIG5ld1F1ZXJ5Ll9wYWdlID0gdGhpcy5fcGFnZVxuICAgIG5ld1F1ZXJ5Ll9wZXJQYWdlID0gdGhpcy5fcGVyUGFnZVxuICAgIG5ld1F1ZXJ5Ll93aXRoQ291bnQgPSB0aGlzLl93aXRoQ291bnQubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIGF0dHJpYnV0ZU5hbWU6IGVudHJ5LmF0dHJpYnV0ZU5hbWUsXG4gICAgICByZWxhdGlvbnNoaXBOYW1lOiBlbnRyeS5yZWxhdGlvbnNoaXBOYW1lLFxuICAgICAgd2hlcmU6IGVudHJ5LndoZXJlID8gey4uLmVudHJ5LndoZXJlfSA6IHVuZGVmaW5lZFxuICAgIH0pKVxuICAgIG5ld1F1ZXJ5Ll9xdWVyeURhdGEgPSB0aGlzLl9xdWVyeURhdGEubWFwKChlbnRyeSkgPT4gKFxuICAgICAgdHlwZW9mIGVudHJ5ID09PSBcInN0cmluZ1wiID8gZW50cnkgOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGVudHJ5KSlcbiAgICApKVxuICAgIG5ld1F1ZXJ5Ll9hYmlsaXRpZXMgPSB0aGlzLl9hYmlsaXRpZXMubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIGFjdGlvbnM6IFsuLi5lbnRyeS5hY3Rpb25zXSxcbiAgICAgIG1vZGVsTmFtZTogZW50cnkubW9kZWxOYW1lXG4gICAgfSkpXG5cbiAgICByZXR1cm4gbmV3UXVlcnlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7VH0gLSBSb290IG1vZGVsIGNsYXNzLiAqL1xuICBnZXRNb2RlbENsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLm1vZGVsQ2xhc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBQYXlsb2FkIHByZWxvYWQgaGFzaCB3aGVuIHByZXNlbnQuXG4gICAqL1xuICBwcmVsb2FkUGF5bG9hZCgpIHtcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fcHJlbG9hZCkubGVuZ3RoID09PSAwKSByZXR1cm4ge31cblxuICAgIHJldHVybiB7cHJlbG9hZDogdGhpcy5fcHJlbG9hZH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBQYXlsb2FkIHdpdGhDb3VudCBhcnJheSB3aGVuIHByZXNlbnQuXG4gICAqL1xuICB3aXRoQ291bnRQYXlsb2FkKCkge1xuICAgIGlmICh0aGlzLl93aXRoQ291bnQubGVuZ3RoID09PSAwKSByZXR1cm4ge31cblxuICAgIHJldHVybiB7XG4gICAgICB3aXRoQ291bnQ6IHRoaXMuX3dpdGhDb3VudC5tYXAoKGVudHJ5KSA9PiAoe1xuICAgICAgICBhdHRyaWJ1dGVOYW1lOiBlbnRyeS5hdHRyaWJ1dGVOYW1lLFxuICAgICAgICByZWxhdGlvbnNoaXBOYW1lOiBlbnRyeS5yZWxhdGlvbnNoaXBOYW1lLFxuICAgICAgICB3aGVyZTogZW50cnkud2hlcmUgfHwgdW5kZWZpbmVkXG4gICAgICB9KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gUGF5bG9hZCBhYmlsaXRpZXMgYXJyYXkgd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgYWJpbGl0aWVzUGF5bG9hZCgpIHtcbiAgICBpZiAodGhpcy5fYWJpbGl0aWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWJpbGl0aWVzOiB0aGlzLl9hYmlsaXRpZXMubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgICAgYWN0aW9uczogWy4uLmVudHJ5LmFjdGlvbnNdLFxuICAgICAgICBtb2RlbE5hbWU6IGVudHJ5Lm1vZGVsTmFtZVxuICAgICAgfSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIFBheWxvYWQgcXVlcnlEYXRhIHNwZWMgd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgcXVlcnlEYXRhUGF5bG9hZCgpIHtcbiAgICBpZiAodGhpcy5fcXVlcnlEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9XG5cbiAgICAvLyBTaW5nbGUgYWNjdW11bGF0ZWQgc3BlYyBnb2VzIG9uIHRoZSB3aXJlIHZlcmJhdGltLiBUaGUgYmFja2VuZFxuICAgIC8vIG5vcm1hbGl6ZXIgYWNjZXB0cyBzdHJpbmcvYXJyYXkvb2JqZWN0IGF0IGVhY2ggbGV2ZWwsIHNvIHdlIGNhblxuICAgIC8vIHNoaXAgbXVsdGlwbGUgYC5xdWVyeURhdGEoLi4uKWAgY2FsbHMgYXMgYW4gYXJyYXkuXG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXJ5RGF0YTogdGhpcy5fcXVlcnlEYXRhLmxlbmd0aCA9PT0gMSA/IHRoaXMuX3F1ZXJ5RGF0YVswXSA6IHRoaXMuX3F1ZXJ5RGF0YVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcmVxdWlyZWRBdHRyaWJ1dGVzXSAtIEV4dHJhIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZm9yIHJvb3QgbW9kZWwgc2VsZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBQYXlsb2FkIHNlbGVjdCBoYXNoIHdoZW4gcHJlc2VudC5cbiAgICovXG4gIHNlbGVjdFBheWxvYWQocmVxdWlyZWRBdHRyaWJ1dGVzID0gW10pIHtcbiAgICBjb25zdCBzZWxlY3QgPSB0aGlzLnNlbGVjdFdpdGhSZXF1aXJlZFJvb3RBdHRyaWJ1dGVzKHJlcXVpcmVkQXR0cmlidXRlcylcblxuICAgIGlmIChPYmplY3Qua2V5cyhzZWxlY3QpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9XG5cbiAgICByZXR1cm4ge3NlbGVjdH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBQYXlsb2FkIHNlYXJjaGVzIGFycmF5IHdoZW4gcHJlc2VudC5cbiAgICovXG4gIHNlYXJjaFBheWxvYWQoKSB7XG4gICAgaWYgKHRoaXMuX3NlYXJjaGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VhcmNoZXM6IHRoaXMuX3NlYXJjaGVzLm1hcCgoc2VhcmNoKSA9PiAoe1xuICAgICAgICBjb2x1bW46IHNlYXJjaC5jb2x1bW4sXG4gICAgICAgIG9wZXJhdG9yOiBzZWFyY2gub3BlcmF0b3IsXG4gICAgICAgIHBhdGg6IFsuLi5zZWFyY2gucGF0aF0sXG4gICAgICAgIHZhbHVlOiBzZWFyY2gudmFsdWVcbiAgICAgIH0pKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBQYXlsb2FkIGpvaW5zIGhhc2ggd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgam9pbnNQYXlsb2FkKCkge1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9qb2lucykubGVuZ3RoID09PSAwKSByZXR1cm4ge31cblxuICAgIHJldHVybiB7XG4gICAgICBqb2luczogbm9ybWFsaXplSm9pbnModGhpcy5fam9pbnMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIFBheWxvYWQgc29ydCBhcnJheSB3aGVuIHByZXNlbnQuXG4gICAqL1xuICBzb3J0UGF5bG9hZCgpIHtcbiAgICBpZiAodGhpcy5fc29ydC5sZW5ndGggPT09IDApIHJldHVybiB7fVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNvcnQ6IHRoaXMuX3NvcnQubWFwKChzb3J0RW50cnkpID0+ICh7XG4gICAgICAgIGNvbHVtbjogc29ydEVudHJ5LmNvbHVtbixcbiAgICAgICAgZGlyZWN0aW9uOiBzb3J0RW50cnkuZGlyZWN0aW9uLFxuICAgICAgICBwYXRoOiBbLi4uc29ydEVudHJ5LnBhdGhdXG4gICAgICB9KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gUGF5bG9hZCBncm91cCBhcnJheSB3aGVuIHByZXNlbnQuXG4gICAqL1xuICBncm91cFBheWxvYWQoKSB7XG4gICAgaWYgKHRoaXMuX2dyb3VwLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ3JvdXA6IHRoaXMuX2dyb3VwLm1hcCgoZ3JvdXBFbnRyeSkgPT4gKHtcbiAgICAgICAgY29sdW1uOiBncm91cEVudHJ5LmNvbHVtbixcbiAgICAgICAgcGF0aDogWy4uLmdyb3VwRW50cnkucGF0aF1cbiAgICAgIH0pKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBQYXlsb2FkIGRpc3RpbmN0IGZsYWcgd2hlbiBlbmFibGVkLlxuICAgKi9cbiAgZGlzdGluY3RQYXlsb2FkKCkge1xuICAgIGlmICghdGhpcy5fZGlzdGluY3QpIHJldHVybiB7fVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3RpbmN0OiB0cnVlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIFBheWxvYWQgd2hlcmUgaGFzaCB3aGVuIHByZXNlbnQuXG4gICAqL1xuICB3aGVyZVBheWxvYWQoKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3doZXJlKS5sZW5ndGggPT09IDApIHJldHVybiB7fVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdoZXJlOiB0aGlzLl93aGVyZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBQYXlsb2FkIHBhZ2luYXRpb24gcGFyYW1zIHdoZW4gcHJlc2VudC5cbiAgICovXG4gIHBhZ2luYXRpb25QYXlsb2FkKCkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBjb25zdCBwYXlsb2FkID0ge31cblxuICAgIGlmICh0aGlzLl9saW1pdCAhPT0gbnVsbCkgcGF5bG9hZC5saW1pdCA9IHRoaXMuX2xpbWl0XG4gICAgaWYgKHRoaXMuX29mZnNldCAhPT0gbnVsbCkgcGF5bG9hZC5vZmZzZXQgPSB0aGlzLl9vZmZzZXRcbiAgICBpZiAodGhpcy5fcGFnZSAhPT0gbnVsbCkgcGF5bG9hZC5wYWdlID0gdGhpcy5fcGFnZVxuICAgIGlmICh0aGlzLl9wZXJQYWdlICE9PSBudWxsKSBwYXlsb2FkLnBlclBhZ2UgPSB0aGlzLl9wZXJQYWdlXG5cbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPltdPn0gLSBMb2FkZWQgbW9kZWwgaW5zdGFuY2VzLlxuICAgKi9cbiAgYXN5bmMgbG9hZCgpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubW9kZWxDbGFzcy5leGVjdXRlQ29tbWFuZChcImluZGV4XCIsIHtcbiAgICAgIC4uLnRoaXMucHJlbG9hZFBheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMuam9pbnNQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLnNlYXJjaFBheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMuc2VsZWN0UGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5ncm91cFBheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMuZGlzdGluY3RQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLnNvcnRQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLndoZXJlUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy53aXRoQ291bnRQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLmFiaWxpdGllc1BheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMucXVlcnlEYXRhUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5wYWdpbmF0aW9uUGF5bG9hZCgpXG4gICAgfSlcblxuICAgIGlmICghcmVzcG9uc2UgfHwgdHlwZW9mIHJlc3BvbnNlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9iamVjdCByZXNwb25zZSBidXQgZ290OiAke3Jlc3BvbnNlfWApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxzRGF0YSA9IEFycmF5LmlzQXJyYXkocmVzcG9uc2UubW9kZWxzKSA/IHJlc3BvbnNlLm1vZGVscyA6IFtdXG4gICAgLyoqIEB0eXBlIHtJbnN0YW5jZVR5cGU8VD5bXX0gKi9cbiAgICBjb25zdCBtb2RlbHMgPSBtb2RlbHNEYXRhLm1hcCgobW9kZWwpID0+IHRoaXMubW9kZWxDbGFzcy5pbnN0YW50aWF0ZUZyb21SZXNwb25zZShtb2RlbCkpXG5cbiAgICAvLyBTaGFyZSBhIHNpbmdsZSBjb2hvcnQgcmVmZXJlbmNlIGFjcm9zcyBldmVyeSBzaWJsaW5nIHNvIGF1dG8tYmF0Y2gtcHJlbG9hZFxuICAgIC8vIGNhbiBiYXRjaCBsYXp5IHJlbGF0aW9uc2hpcCBhY2Nlc3MgbGF0ZXIuIFNpbmdsZS1yZWNvcmQgbG9va3VwcyBzdGlsbCBmbG93XG4gICAgLy8gdGhyb3VnaCBoZXJlICh3aXRoIGEgY29ob3J0IG9mIG9uZSkgYW5kIGRlZ3JhZGUgY2xlYW5seSB0byBwZXItcmVjb3JkIGxvYWQuXG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiBtb2RlbHMpIHtcbiAgICAgIC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWwpLl9sb2FkQ29ob3J0ID0gbW9kZWxzXG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsc1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPltdPn0gLSBMb2FkZWQgbW9kZWwgaW5zdGFuY2VzLlxuICAgKi9cbiAgYXN5bmMgdG9BcnJheSgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIE51bWJlciBvZiBsb2FkZWQgbW9kZWwgaW5zdGFuY2VzLlxuICAgKi9cbiAgYXN5bmMgY291bnQoKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJpbmRleFwiLCB7XG4gICAgICAuLi50aGlzLmpvaW5zUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5zZWFyY2hQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLmdyb3VwUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5kaXN0aW5jdFBheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMud2hlcmVQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLnBhZ2luYXRpb25QYXlsb2FkKCksXG4gICAgICBjb3VudDogdHJ1ZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3BvbnNlIHx8IHR5cGVvZiByZXNwb25zZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvYmplY3QgcmVzcG9uc2UgYnV0IGdvdDogJHtyZXNwb25zZX1gKVxuICAgIH1cblxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHJlc3BvbnNlLmNvdW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBudW1lcmljIGNvdW50IHJlc3BvbnNlIGJ1dCBnb3Q6ICR7cmVzcG9uc2UuY291bnR9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2UuY291bnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4gfCBudWxsPn0gLSBGaXJzdCBtb2RlbCBtYXRjaGluZyBxdWVyeS5cbiAgICovXG4gIGFzeW5jIGZpcnN0KCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5jbG9uZSgpXG5cbiAgICBpZiAocXVlcnkuX3NvcnQubGVuZ3RoIDwgMSkge1xuICAgICAgcXVlcnkuc29ydChbW3RoaXMubW9kZWxDbGFzcy5wcmltYXJ5S2V5KCksIFwiYXNjXCJdXSlcbiAgICB9XG5cbiAgICBxdWVyeS5saW1pdCgxKVxuXG4gICAgY29uc3QgbW9kZWxzID0gYXdhaXQgcXVlcnkudG9BcnJheSgpXG5cbiAgICByZXR1cm4gbW9kZWxzWzBdIHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4gfCBudWxsPn0gLSBMYXN0IG1vZGVsIG1hdGNoaW5nIHF1ZXJ5LlxuICAgKi9cbiAgYXN5bmMgbGFzdCgpIHtcbiAgICAvLyBXaGVuIHBhZ2luYXRpb24gaXMgYWxyZWFkeSBhcHBsaWVkLCBmZXRjaCB0aGF0IHNjb3BlZCB3aW5kb3cgYW5kIHJldHVybiBpdHMgbGFzdCBpdGVtLlxuICAgIGlmICh0aGlzLl9vZmZzZXQgIT09IG51bGwgfHwgdGhpcy5fcGFnZSAhPT0gbnVsbCB8fCB0aGlzLl9wZXJQYWdlICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnRvQXJyYXkoKVxuXG4gICAgICBpZiAobW9kZWxzLmxlbmd0aCA8IDEpIHJldHVybiBudWxsXG5cbiAgICAgIHJldHVybiBtb2RlbHNbbW9kZWxzLmxlbmd0aCAtIDFdXG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLmNsb25lKClcblxuICAgIGlmIChxdWVyeS5fc29ydC5sZW5ndGggPCAxKSB7XG4gICAgICBxdWVyeS5zb3J0KFtbdGhpcy5tb2RlbENsYXNzLnByaW1hcnlLZXkoKSwgXCJkZXNjXCJdXSlcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkuX3NvcnQgPSBxdWVyeS5fc29ydC5tYXAoKHNvcnRFbnRyeSkgPT4gKHtcbiAgICAgICAgLi4uc29ydEVudHJ5LFxuICAgICAgICBkaXJlY3Rpb246IHJldmVyc2VTb3J0RGlyZWN0aW9uKHNvcnRFbnRyeS5kaXJlY3Rpb24pXG4gICAgICB9KSlcbiAgICB9XG5cbiAgICBxdWVyeS5saW1pdCgxKVxuXG4gICAgY29uc3QgbW9kZWxzID0gYXdhaXQgcXVlcnkudG9BcnJheSgpXG5cbiAgICByZXR1cm4gbW9kZWxzWzBdIHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gey4uLihzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pil9IGNvbHVtbnMgLSBQbHVjayBkZWZpbml0aW9uKHMpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnlbXT59IC0gUGx1Y2tlZCB2YWx1ZXMuXG4gICAqL1xuICBhc3luYyBwbHVjayguLi5jb2x1bW5zKSB7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29sdW1ucyBnaXZlbiB0byBwbHVja1wiKVxuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRQbHVjayA9IG5vcm1hbGl6ZVBsdWNrKGNvbHVtbnMubGVuZ3RoID09PSAxID8gY29sdW1uc1swXSA6IGNvbHVtbnMpXG4gICAgY29uc3QgdmFsaWRhdGVkUGx1Y2sgPSB2YWxpZGF0ZVBsdWNrRGVmaW5pdGlvbnMoe1xuICAgICAgbW9kZWxDbGFzczogdGhpcy5tb2RlbENsYXNzLFxuICAgICAgcGx1Y2s6IG5vcm1hbGl6ZWRQbHVja1xuICAgIH0pXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJpbmRleFwiLCB7XG4gICAgICAuLi50aGlzLmpvaW5zUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5zZWFyY2hQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLmdyb3VwUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5kaXN0aW5jdFBheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMuc29ydFBheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMud2hlcmVQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLnBhZ2luYXRpb25QYXlsb2FkKCksXG4gICAgICBwbHVjazogdmFsaWRhdGVkUGx1Y2tcbiAgICB9KVxuXG4gICAgaWYgKCFyZXNwb25zZSB8fCB0eXBlb2YgcmVzcG9uc2UgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb2JqZWN0IHJlc3BvbnNlIGJ1dCBnb3Q6ICR7cmVzcG9uc2V9YClcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzcG9uc2UudmFsdWVzKSkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlLnZhbHVlc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSBpZCAtIFJlY29yZCBpZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn0gLSBGb3VuZCBtb2RlbC5cbiAgICovXG4gIGFzeW5jIGZpbmQoaWQpIHtcbiAgICBjb25zdCBwayA9IHRoaXMubW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZmluZEJ5KHtbcGtdOiBpZH0pXG5cbiAgICBpZiAoIW1vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5tb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpfSBub3QgZm91bmQgd2l0aCAke3BrfT0ke2lkfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gQ29uZGl0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD59IC0gRm91bmQgbW9kZWwgb3IgbnVsbC5cbiAgICovXG4gIGFzeW5jIGZpbmRCeShjb25kaXRpb25zKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENvbmRpdGlvbnMgPSB0aGlzLnZhbGlkYXRlZFN0cnVjdHVyZWRDb25kaXRpb25zKGNvbmRpdGlvbnMpXG4gICAgY29uc3QgbWVyZ2VkV2hlcmUgPSB7XG4gICAgICAuLi50aGlzLl93aGVyZSxcbiAgICAgIC4uLm5vcm1hbGl6ZWRDb25kaXRpb25zXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJpbmRleFwiLCB7XG4gICAgICAuLi50aGlzLnByZWxvYWRQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLmpvaW5zUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5zZWFyY2hQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLnNlbGVjdFBheWxvYWQoT2JqZWN0LmtleXMobWVyZ2VkV2hlcmUpKSxcbiAgICAgIC4uLnRoaXMuZ3JvdXBQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLmRpc3RpbmN0UGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5zb3J0UGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5hYmlsaXRpZXNQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLnBhZ2luYXRpb25QYXlsb2FkKCksXG4gICAgICB3aGVyZTogbWVyZ2VkV2hlcmVcbiAgICB9KVxuXG4gICAgaWYgKCFyZXNwb25zZSB8fCB0eXBlb2YgcmVzcG9uc2UgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb2JqZWN0IHJlc3BvbnNlIGJ1dCBnb3Q6ICR7cmVzcG9uc2V9YClcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbHMgPSBBcnJheS5pc0FycmF5KHJlc3BvbnNlLm1vZGVscykgPyByZXNwb25zZS5tb2RlbHMgOiBbXVxuXG4gICAgZm9yIChjb25zdCBtb2RlbERhdGEgb2YgbW9kZWxzKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxDbGFzcy5pbnN0YW50aWF0ZUZyb21SZXNwb25zZShtb2RlbERhdGEpXG5cbiAgICAgIGlmICh0aGlzLm1vZGVsQ2xhc3MubWF0Y2hlc0ZpbmRCeUNvbmRpdGlvbnMobW9kZWwsIG1lcmdlZFdoZXJlKSkge1xuICAgICAgICByZXR1cm4gbW9kZWxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZGl0aW9ucyAtIENvbmRpdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPj59IC0gRm91bmQgbW9kZWwuXG4gICAqL1xuICBhc3luYyBmaW5kQnlPckZhaWwoY29uZGl0aW9ucykge1xuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5maW5kQnkoY29uZGl0aW9ucylcblxuICAgIGlmICghbW9kZWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm1vZGVsQ2xhc3MubmFtZX0gbm90IGZvdW5kIGZvciBjb25kaXRpb25zOiAke3NlcmlhbGl6ZUZpbmRDb25kaXRpb25zKGNvbmRpdGlvbnMpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gQ29uZGl0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn0gLSBFeGlzdGluZyBvciBpbml0aWFsaXplZCBtb2RlbC5cbiAgICovXG4gIGFzeW5jIGZpbmRPckluaXRpYWxpemVCeShjb25kaXRpb25zKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENvbmRpdGlvbnMgPSB0aGlzLnZhbGlkYXRlZFN0cnVjdHVyZWRDb25kaXRpb25zKGNvbmRpdGlvbnMpXG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLmZpbmRCeShjb25kaXRpb25zKVxuXG4gICAgaWYgKG1vZGVsKSByZXR1cm4gbW9kZWxcblxuICAgIHJldHVybiAvKiogQHR5cGUge0luc3RhbmNlVHlwZTxUPn0gKi8gKG5ldyB0aGlzLm1vZGVsQ2xhc3Mobm9ybWFsaXplZENvbmRpdGlvbnMpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZGl0aW9ucyAtIENvbmRpdGlvbnMuXG4gICAqIEBwYXJhbSB7KG1vZGVsOiBJbnN0YW5jZVR5cGU8VD4pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkfSBbY2FsbGJhY2tdIC0gT3B0aW9uYWwgY2FsbGJhY2sgYmVmb3JlIHNhdmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPj59IC0gRXhpc3Rpbmcgb3IgbmV3bHkgY3JlYXRlZCBtb2RlbC5cbiAgICovXG4gIGFzeW5jIGZpbmRPckNyZWF0ZUJ5KGNvbmRpdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENvbmRpdGlvbnMgPSB0aGlzLnZhbGlkYXRlZFN0cnVjdHVyZWRDb25kaXRpb25zKGNvbmRpdGlvbnMpXG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLmZpbmRCeShjb25kaXRpb25zKVxuXG4gICAgaWYgKG1vZGVsKSByZXR1cm4gbW9kZWxcblxuICAgIGNvbnN0IG5ld01vZGVsID0gLyoqIEB0eXBlIHtJbnN0YW5jZVR5cGU8VD59ICovIChuZXcgdGhpcy5tb2RlbENsYXNzKG5vcm1hbGl6ZWRDb25kaXRpb25zKSlcblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgYXdhaXQgY2FsbGJhY2sobmV3TW9kZWwpXG4gICAgfVxuXG4gICAgYXdhaXQgbmV3TW9kZWwuc2F2ZSgpXG5cbiAgICByZXR1cm4gbmV3TW9kZWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmRpdGlvbnMgLSBDYW5kaWRhdGUgc3RydWN0dXJlZCBjb25kaXRpb25zLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBWYWxpZGF0ZWQgYW5kIG5vcm1hbGl6ZWQgY29uZGl0aW9ucy5cbiAgICovXG4gIHZhbGlkYXRlZFN0cnVjdHVyZWRDb25kaXRpb25zKGNvbmRpdGlvbnMpIHtcbiAgICB0aGlzLm1vZGVsQ2xhc3MuYXNzZXJ0RmluZEJ5Q29uZGl0aW9ucyhjb25kaXRpb25zKVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZUZpbmRDb25kaXRpb25zKGNvbmRpdGlvbnMpXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2Jhc2UuanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIEZyb250ZW5kIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtGcm9udGVuZE1vZGVsUHJvamVjdGlvbk9wdGlvbnN9IFtvcHRpb25zXSAtIFByb2plY3Rpb24gb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUHJvamVjdGlvblBheWxvYWR9IC0gTm9ybWFsaXplZCBmcm9udGVuZC1tb2RlbCBwcm9qZWN0aW9uIHBheWxvYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9udGVuZE1vZGVsUHJvamVjdGlvblBheWxvYWQobW9kZWxDbGFzcywgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHF1ZXJ5ID0gbmV3IEZyb250ZW5kTW9kZWxRdWVyeSh7bW9kZWxDbGFzc30pXG5cbiAgaWYgKG9wdGlvbnMuc2VsZWN0ICE9PSB1bmRlZmluZWQpIHF1ZXJ5LnNlbGVjdChvcHRpb25zLnNlbGVjdClcbiAgaWYgKG9wdGlvbnMucHJlbG9hZCAhPT0gdW5kZWZpbmVkKSBxdWVyeS5wcmVsb2FkKG9wdGlvbnMucHJlbG9hZClcbiAgaWYgKG9wdGlvbnMud2l0aENvdW50ICE9PSB1bmRlZmluZWQpIHF1ZXJ5LndpdGhDb3VudChvcHRpb25zLndpdGhDb3VudClcbiAgaWYgKG9wdGlvbnMuYWJpbGl0aWVzICE9PSB1bmRlZmluZWQpIHF1ZXJ5LmFiaWxpdGllcyhvcHRpb25zLmFiaWxpdGllcylcbiAgaWYgKG9wdGlvbnMucXVlcnlEYXRhICE9PSB1bmRlZmluZWQpIHF1ZXJ5LnF1ZXJ5RGF0YShvcHRpb25zLnF1ZXJ5RGF0YSlcblxuICByZXR1cm4ge1xuICAgIC4uLnF1ZXJ5LnByZWxvYWRQYXlsb2FkKCksXG4gICAgLi4ucXVlcnkuc2VsZWN0UGF5bG9hZCgpLFxuICAgIC4uLnF1ZXJ5LndpdGhDb3VudFBheWxvYWQoKSxcbiAgICAuLi5xdWVyeS5hYmlsaXRpZXNQYXlsb2FkKCksXG4gICAgLi4ucXVlcnkucXVlcnlEYXRhUGF5bG9hZCgpXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3V0aWxzL3JhbnNhY2suanNcIikuUmFuc2Fja0NvbmRpdGlvbn0gYXJncy5jb25kaXRpb24gLSBOb3JtYWxpemVkIFJhbnNhY2sgY29uZGl0aW9uLlxuICogQHBhcmFtIHtGcm9udGVuZE1vZGVsUXVlcnk8YW55Pn0gYXJncy5xdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFwcGx5RnJvbnRlbmRSYW5zYWNrQ29uZGl0aW9uKHtjb25kaXRpb24sIHF1ZXJ5fSkge1xuICBpZiAoY29uZGl0aW9uLnByZWRpY2F0ZSA9PT0gXCJudWxsXCIpIHtcbiAgICBxdWVyeS5zZWFyY2goY29uZGl0aW9uLnBhdGgsIGNvbmRpdGlvbi5hdHRyaWJ1dGVOYW1lLCBjb25kaXRpb24udmFsdWUgPyBcImVxXCIgOiBcIm5vdEVxXCIsIG51bGwpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoY29uZGl0aW9uLnByZWRpY2F0ZSA9PT0gXCJlcVwiIHx8IGNvbmRpdGlvbi5wcmVkaWNhdGUgPT09IFwiaW5cIikge1xuICAgIHF1ZXJ5LnNlYXJjaChjb25kaXRpb24ucGF0aCwgY29uZGl0aW9uLmF0dHJpYnV0ZU5hbWUsIFwiZXFcIiwgY29uZGl0aW9uLnZhbHVlKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGNvbmRpdGlvbi5wcmVkaWNhdGUgPT09IFwibm90X2VxXCIgfHwgY29uZGl0aW9uLnByZWRpY2F0ZSA9PT0gXCJub3RfaW5cIikge1xuICAgIHF1ZXJ5LnNlYXJjaChjb25kaXRpb24ucGF0aCwgY29uZGl0aW9uLmF0dHJpYnV0ZU5hbWUsIFwibm90RXFcIiwgY29uZGl0aW9uLnZhbHVlKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGNvbmRpdGlvbi5wcmVkaWNhdGUgPT09IFwiZ3RcIiB8fCBjb25kaXRpb24ucHJlZGljYXRlID09PSBcImd0ZXFcIiB8fCBjb25kaXRpb24ucHJlZGljYXRlID09PSBcImx0XCIgfHwgY29uZGl0aW9uLnByZWRpY2F0ZSA9PT0gXCJsdGVxXCIpIHtcbiAgICBxdWVyeS5zZWFyY2goY29uZGl0aW9uLnBhdGgsIGNvbmRpdGlvbi5hdHRyaWJ1dGVOYW1lLCBjb25kaXRpb24ucHJlZGljYXRlLCBjb25kaXRpb24udmFsdWUpXG4gICAgcmV0dXJuXG4gIH1cblxuICBxdWVyeS5zZWFyY2goY29uZGl0aW9uLnBhdGgsIGNvbmRpdGlvbi5hdHRyaWJ1dGVOYW1lLCBcImxpa2VcIiwgZnJvbnRlbmRSYW5zYWNrTGlrZVZhbHVlKGNvbmRpdGlvbikpXG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi91dGlscy9yYW5zYWNrLmpzXCIpLlJhbnNhY2tDb25kaXRpb259IGNvbmRpdGlvbiAtIFJhbnNhY2sgY29uZGl0aW9uLlxuICogQHJldHVybnMge3N0cmluZ30gLSBTUUwtbGlrZSBwYXR0ZXJuLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZFJhbnNhY2tMaWtlVmFsdWUoY29uZGl0aW9uKSB7XG4gIGlmIChjb25kaXRpb24ucHJlZGljYXRlID09PSBcImNvbnRcIikgcmV0dXJuIGAlJHtjb25kaXRpb24udmFsdWV9JWBcbiAgaWYgKGNvbmRpdGlvbi5wcmVkaWNhdGUgPT09IFwic3RhcnRcIikgcmV0dXJuIGAke2NvbmRpdGlvbi52YWx1ZX0lYFxuICBpZiAoY29uZGl0aW9uLnByZWRpY2F0ZSA9PT0gXCJlbmRcIikgcmV0dXJuIGAlJHtjb25kaXRpb24udmFsdWV9YFxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZnJvbnRlbmQgcmFuc2FjayBwcmVkaWNhdGU6ICR7Y29uZGl0aW9uLnByZWRpY2F0ZX1gKVxufVxuIl19
|
|
1693
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZnJvbnRlbmQtbW9kZWxzL3F1ZXJ5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUM3RCxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUM1RSxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUU5RDs7Ozs7O0dBTUc7QUFDSDs7R0FFRztBQUNIOztHQUVHO0FBQ0g7O0dBRUc7QUFDSDs7Ozs7Ozs7R0FRRztBQUNIOzs7Ozs7OztHQVFHO0FBRUg7OztHQUdHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRTdFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFOUMsT0FBTyxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVMsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFBO0FBQzdELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLE9BQU87SUFDL0IsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUV2QixJQUFJLE9BQU8sS0FBSyxJQUFJO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFL0IsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxPQUFPLEVBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQTtJQUMxQixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFF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U0FBUyxLQUFLLEtBQUs7UUFBRSxPQUFPLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBRS9ELE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO0FBQ25GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtyZXNvbHZlRnJvbnRlbmRNb2RlbENsYXNzfSBmcm9tIFwiLi9tb2RlbC1yZWdpc3RyeS5qc1wiXG5pbXBvcnQge25vcm1hbGl6ZVJhbnNhY2tQYXJhbXMsIHBhcnNlUmFuc2Fja1NvcnR9IGZyb20gXCIuLi91dGlscy9yYW5zYWNrLmpzXCJcbmltcG9ydCB7aXNNb2RlbFNjb3BlRGVzY3JpcHRvcn0gZnJvbSBcIi4uL3V0aWxzL21vZGVsLXNjb3BlLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsU2VhcmNoXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sdW1uIC0gQXR0cmlidXRlIG5hbWUgdG8gc2VhcmNoLlxuICogQHByb3BlcnR5IHtcImVxXCIgfCBcImxpa2VcIiB8IFwibm90RXFcIiB8IFwiZ3RcIiB8IFwiZ3RlcVwiIHwgXCJsdFwiIHwgXCJsdGVxXCJ9IG9wZXJhdG9yIC0gU2VhcmNoIG9wZXJhdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gcGF0aCAtIFJlbGF0aW9uc2hpcCBwYXRoIGZyb20gcm9vdCBtb2RlbC5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bn0gdmFsdWUgLSBTZWFyY2ggdmFsdWUuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge251bGwgfCBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgb2JqZWN0fSBGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7e2F0dHJpYnV0ZU5hbWU6IHN0cmluZywgcmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCB3aGVyZT86IFJlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT59fSBGcm9udGVuZE1vZGVsV2l0aENvdW50UGF5bG9hZEVudHJ5XG4gKi9cbi8qKlxuICogQHR5cGVkZWYge3ttb2RlbE5hbWU6IHN0cmluZywgYWN0aW9uczogc3RyaW5nW119fSBGcm9udGVuZE1vZGVsQWJpbGl0aWVzUGF5bG9hZEVudHJ5XG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFByb2plY3Rpb25PcHRpb25zXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdIHwgc3RyaW5nPiB8IHN0cmluZyB8IHN0cmluZ1tdfSBbc2VsZWN0XSAtIE1vZGVsLWF3YXJlIGF0dHJpYnV0ZSBzZWxlY3QgbWFwIG9yIHJvb3QtbW9kZWwgc2hvcnRoYW5kLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IHN0cmluZz4gfCBzdHJpbmcgfCBzdHJpbmdbXX0gW3NlbGVjdHNFeHRyYV0gLSBFeHRyYSBhdHRyaWJ1dGVzIHRvIGxvYWQgaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHRzLCBrZXllZCBieSBtb2RlbCBuYW1lIG9yIHJvb3QtbW9kZWwgc2hvcnRoYW5kLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkIHwgc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZD59IFtwcmVsb2FkXSAtIFJlbGF0aW9uc2hpcCBwcmVsb2FkIHRyZWUuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHtyZWxhdGlvbnNoaXA/OiBzdHJpbmcsIHdoZXJlPzogUmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn0+fSBbd2l0aENvdW50XSAtIEFzc29jaWF0aW9uIGNvdW50IHNwZWMuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBbYWJpbGl0aWVzXSAtIEFiaWxpdHkgYWN0aW9ucyB0byBjb21wdXRlIHBlciByZWNvcmQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT4+IHwgUmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn0gW3F1ZXJ5RGF0YV0gLSBCYWNrZW5kIHF1ZXJ5IGRhdGEgbmFtZXMvc3BlYy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUHJvamVjdGlvblBheWxvYWRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBbc2VsZWN0XSAtIE5vcm1hbGl6ZWQgc2VsZWN0IG1hcC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBbc2VsZWN0c0V4dHJhXSAtIE5vcm1hbGl6ZWQgZXh0cmEgc2VsZWN0IG1hcC5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZH0gW3ByZWxvYWRdIC0gTm9ybWFsaXplZCBwcmVsb2FkIHRyZWUuXG4gKiBAcHJvcGVydHkge0Zyb250ZW5kTW9kZWxXaXRoQ291bnRQYXlsb2FkRW50cnlbXX0gW3dpdGhDb3VudF0gLSBOb3JtYWxpemVkIGNvdW50IHNwZWNzLlxuICogQHByb3BlcnR5IHtGcm9udGVuZE1vZGVsQWJpbGl0aWVzUGF5bG9hZEVudHJ5W119IFthYmlsaXRpZXNdIC0gTm9ybWFsaXplZCBhYmlsaXR5IHNwZWNzLlxuICogQHByb3BlcnR5IHtGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWV9IFtxdWVyeURhdGFdIC0gTm9ybWFsaXplZCBxdWVyeURhdGEgc3BlYy5cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgYW55Pn0gLSBXaGV0aGVyIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG5cbiAgcmV0dXJuIHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90b3R5cGUgPT09IG51bGxcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmQgfCBzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkPiB8IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsfSBwcmVsb2FkIC0gUHJlbG9hZCBzaG9ydGhhbmQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZH0gLSBOb3JtYWxpemVkIHByZWxvYWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByZWxvYWQocHJlbG9hZCkge1xuICBpZiAoIXByZWxvYWQpIHJldHVybiB7fVxuXG4gIGlmIChwcmVsb2FkID09PSB0cnVlKSByZXR1cm4ge31cblxuICBpZiAodHlwZW9mIHByZWxvYWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4ge1twcmVsb2FkXTogdHJ1ZX1cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHByZWxvYWQpKSB7XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkfSAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBwcmVsb2FkKSB7XG4gICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbZW50cnldID0gdHJ1ZVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChlbnRyeSkpIHtcbiAgICAgICAgbWVyZ2VQcmVsb2FkUmVjb3JkKG5vcm1hbGl6ZWQsIG5vcm1hbGl6ZVByZWxvYWQoZW50cnkpKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJlbG9hZCBlbnRyeSB0eXBlOiAke3R5cGVvZiBlbnRyeX1gKVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkXG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3QocHJlbG9hZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJlbG9hZCB0eXBlOiAke3R5cGVvZiBwcmVsb2FkfWApXG4gIH1cblxuICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmR9ICovXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fVxuXG4gIGZvciAoY29uc3QgW3JlbGF0aW9uc2hpcE5hbWUsIHJlbGF0aW9uc2hpcFByZWxvYWRdIG9mIE9iamVjdC5lbnRyaWVzKHByZWxvYWQpKSB7XG4gICAgaWYgKHJlbGF0aW9uc2hpcFByZWxvYWQgPT09IHRydWUgfHwgcmVsYXRpb25zaGlwUHJlbG9hZCA9PT0gZmFsc2UpIHtcbiAgICAgIG5vcm1hbGl6ZWRbcmVsYXRpb25zaGlwTmFtZV0gPSByZWxhdGlvbnNoaXBQcmVsb2FkXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVsYXRpb25zaGlwUHJlbG9hZCA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KHJlbGF0aW9uc2hpcFByZWxvYWQpIHx8IGlzUGxhaW5PYmplY3QocmVsYXRpb25zaGlwUHJlbG9hZCkpIHtcbiAgICAgIG5vcm1hbGl6ZWRbcmVsYXRpb25zaGlwTmFtZV0gPSBub3JtYWxpemVQcmVsb2FkKHJlbGF0aW9uc2hpcFByZWxvYWQpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcmVsb2FkIHZhbHVlIGZvciAke3JlbGF0aW9uc2hpcE5hbWV9OiAke3R5cGVvZiByZWxhdGlvbnNoaXBQcmVsb2FkfWApXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgc2hvcnRoYW5kIGB3aXRoQ291bnRgIGFyZ3VtZW50IGZyb20gdGhlIGZyb250ZW5kLW1vZGVsXG4gKiBxdWVyeSBBUEkgaW50byB0aGUgc3RyaWN0IGludGVybmFsIGVudHJpZXMgdXNlZCBpbiB0aGUgdHJhbnNwb3J0XG4gKiBwYXlsb2FkLiBTaGFyZXMgdGhlIHNoYXBlIHNlbWFudGljcyB3aXRoIHRoZSBiYWNrZW5kIG5vcm1hbGl6ZXIgaW5cbiAqIGBkYXRhYmFzZS9xdWVyeS93aXRoLWNvdW50LmpzYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHtyZWxhdGlvbnNoaXA/OiBzdHJpbmcsIHdoZXJlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj59Pn0gc3BlY1xuICogQHJldHVybnMge0FycmF5PHthdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgd2hlcmU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0+fVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVXaXRoQ291bnRGcm9udGVuZChzcGVjKSB7XG4gIGlmIChzcGVjID09IG51bGwpIHJldHVybiBbXVxuXG4gIGlmICh0eXBlb2Ygc3BlYyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBbe2F0dHJpYnV0ZU5hbWU6IGAke3NwZWN9Q291bnRgLCByZWxhdGlvbnNoaXBOYW1lOiBzcGVjfV1cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHNwZWMpKSB7XG4gICAgcmV0dXJuIHNwZWMuZmxhdE1hcCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBpdGVtICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2l0aENvdW50IGFycmF5IGVudHJpZXMgbXVzdCBiZSBzdHJpbmdzOyBnb3QgJHt0eXBlb2YgaXRlbX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gW3thdHRyaWJ1dGVOYW1lOiBgJHtpdGVtfUNvdW50YCwgcmVsYXRpb25zaGlwTmFtZTogaXRlbX1dXG4gICAgfSlcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChzcGVjKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB3aXRoQ291bnQgc3BlYzogJHt0eXBlb2Ygc3BlY31gKVxuICB9XG5cbiAgY29uc3QgZW50cmllcyA9IFtdXG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3BlYykpIHtcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgIGVudHJpZXMucHVzaCh7YXR0cmlidXRlTmFtZTogYCR7a2V5fUNvdW50YCwgcmVsYXRpb25zaGlwTmFtZToga2V5fSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkgY29udGludWVcblxuICAgIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IC8qKiBAdHlwZSB7e3JlbGF0aW9uc2hpcD86IHN0cmluZywgd2hlcmU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn19ICovICh2YWx1ZSlcbiAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgIGF0dHJpYnV0ZU5hbWU6IGtleSxcbiAgICAgICAgcmVsYXRpb25zaGlwTmFtZTogb3B0aW9ucy5yZWxhdGlvbnNoaXAgfHwga2V5LFxuICAgICAgICB3aGVyZTogb3B0aW9ucy53aGVyZVxuICAgICAgfSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdpdGhDb3VudCB2YWx1ZSBmb3IgJHtrZXl9OiAke3R5cGVvZiB2YWx1ZX1gKVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYSBmcm9udGVuZCBgLmFiaWxpdGllcyguLi4pYCBzcGVjIGludG8gYSBmbGF0IGxpc3Qgb2ZcbiAqIGB7bW9kZWxOYW1lLCBhY3Rpb25zfWAgZW50cmllcy4gQWNjZXB0cyB0aGUgZmxhdCBhY3Rpb25zLWFycmF5XG4gKiBzaG9ydGhhbmQgKGFwcGxpZXMgdG8gdGhlIHF1ZXJ5J3Mgb3duIG1vZGVsIGNsYXNzKSBhbmQgdGhlIGtleWVkXG4gKiBge01vZGVsTmFtZTogW2FjdGlvbiwgLi4uXX1gIGZvcm0gKGFwcGxpZXMgdG8gcmVjb3JkcyBvZiB0aGF0IG1vZGVsXG4gKiBjbGFzcywgdXNlZnVsIGZvciBwcmVsb2FkZWQgY2hpbGRyZW4pLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IHNwZWNcbiAqIEBwYXJhbSB7e2dldE1vZGVsTmFtZTogKCkgPT4gc3RyaW5nfX0gcm9vdE1vZGVsQ2xhc3NcbiAqIEByZXR1cm5zIHtBcnJheTx7bW9kZWxOYW1lOiBzdHJpbmcsIGFjdGlvbnM6IHN0cmluZ1tdfT59XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFiaWxpdGllc1NwZWMoc3BlYywgcm9vdE1vZGVsQ2xhc3MpIHtcbiAgaWYgKHNwZWMgPT0gbnVsbCkgcmV0dXJuIFtdXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc3BlYykpIHtcbiAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBzcGVjKSB7XG4gICAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gXCJzdHJpbmdcIiB8fCBhY3Rpb24ubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGFiaWxpdGllcyBmbGF0LWZvcm0gYWN0aW9ucyBtdXN0IGJlIG5vbi1lbXB0eSBzdHJpbmdzOyBnb3QgJHt0eXBlb2YgYWN0aW9ufWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgcm9vdE1vZGVsTmFtZSA9IHR5cGVvZiByb290TW9kZWxDbGFzcz8uZ2V0TW9kZWxOYW1lID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gcm9vdE1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcbiAgICAgIDogdW5kZWZpbmVkXG4gICAgaWYgKCFyb290TW9kZWxOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhYmlsaXRpZXMgZmxhdC1mb3JtIHJlcXVpcmVzIGEgcm9vdCBtb2RlbCBjbGFzcyB3aXRoIGdldE1vZGVsTmFtZSgpXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIFt7YWN0aW9uczogWy4uLnNwZWNdLCBtb2RlbE5hbWU6IHJvb3RNb2RlbE5hbWV9XVxuICB9XG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KHNwZWMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFiaWxpdGllcyBzcGVjOiAke3R5cGVvZiBzcGVjfWApXG4gIH1cblxuICAvKiogQHR5cGUge0FycmF5PHttb2RlbE5hbWU6IHN0cmluZywgYWN0aW9uczogc3RyaW5nW119Pn0gKi9cbiAgY29uc3QgZW50cmllcyA9IFtdXG5cbiAgZm9yIChjb25zdCBbbW9kZWxOYW1lLCBhY3Rpb25zXSBvZiBPYmplY3QuZW50cmllcyhzcGVjKSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhY3Rpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBhYmlsaXRpZXNbJHttb2RlbE5hbWV9XSBtdXN0IGJlIGFuIGFycmF5IG9mIGFjdGlvbiBuYW1lczsgZ290ICR7dHlwZW9mIGFjdGlvbnN9YClcbiAgICB9XG5cbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBhY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gXCJzdHJpbmdcIiB8fCBhY3Rpb24ubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGFiaWxpdGllc1ske21vZGVsTmFtZX1dIGVudHJpZXMgbXVzdCBiZSBub24tZW1wdHkgc3RyaW5nczsgZ290ICR7dHlwZW9mIGFjdGlvbn1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWN0aW9uXG4gICAgfSlcblxuICAgIGVudHJpZXMucHVzaCh7YWN0aW9uczogc2FuaXRpemVkLCBtb2RlbE5hbWV9KVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmR9IHRhcmdldFByZWxvYWQgLSBFeGlzdGluZyBwcmVsb2FkIGRhdGEuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmR9IGluY29taW5nUHJlbG9hZCAtIE5ldyBwcmVsb2FkIGRhdGEuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gbWVyZ2VQcmVsb2FkUmVjb3JkKHRhcmdldFByZWxvYWQsIGluY29taW5nUHJlbG9hZCkge1xuICBmb3IgKGNvbnN0IFtyZWxhdGlvbnNoaXBOYW1lLCBpbmNvbWluZ1ZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbmNvbWluZ1ByZWxvYWQpKSB7XG4gICAgY29uc3QgZXhpc3RpbmdWYWx1ZSA9IHRhcmdldFByZWxvYWRbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgIGlmIChpbmNvbWluZ1ZhbHVlID09PSBmYWxzZSkge1xuICAgICAgdGFyZ2V0UHJlbG9hZFtyZWxhdGlvbnNoaXBOYW1lXSA9IGZhbHNlXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChpbmNvbWluZ1ZhbHVlID09PSB0cnVlKSB7XG4gICAgICBpZiAoZXhpc3RpbmdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRhcmdldFByZWxvYWRbcmVsYXRpb25zaGlwTmFtZV0gPSB0cnVlXG4gICAgICB9XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmICghaXNQbGFpbk9iamVjdChpbmNvbWluZ1ZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByZWxvYWQgdmFsdWUgZm9yICR7cmVsYXRpb25zaGlwTmFtZX06ICR7dHlwZW9mIGluY29taW5nVmFsdWV9YClcbiAgICB9XG5cbiAgICBpZiAoaXNQbGFpbk9iamVjdChleGlzdGluZ1ZhbHVlKSkge1xuICAgICAgbWVyZ2VQcmVsb2FkUmVjb3JkKFxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmR9ICovIChleGlzdGluZ1ZhbHVlKSxcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkfSAqLyAoaW5jb21pbmdWYWx1ZSlcbiAgICAgIClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdGFyZ2V0UHJlbG9hZFtyZWxhdGlvbnNoaXBOYW1lXSA9IG5vcm1hbGl6ZVByZWxvYWQoaW5jb21pbmdWYWx1ZSlcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc2VsZWN0IC0gU2VsZWN0IHBheWxvYWQuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IFtyb290TW9kZWxOYW1lXSAtIE9wdGlvbmFsIHJvb3QgbW9kZWwgbmFtZSBmb3Igc2hvcnRoYW5kIHNlbGVjdCBwYXlsb2Fkcy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IC0gTm9ybWFsaXplZCBtb2RlbC1uYW1lIGtleWVkIHNlbGVjdCByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdChzZWxlY3QsIHJvb3RNb2RlbE5hbWUgPSBudWxsKSB7XG4gIGlmICghc2VsZWN0KSByZXR1cm4ge31cblxuICBpZiAodHlwZW9mIHNlbGVjdCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmICghcm9vdE1vZGVsTmFtZSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzZWxlY3Qgc2hvcnRoYW5kIHdpdGhvdXQgcm9vdCBtb2RlbCBuYW1lXCIpXG5cbiAgICByZXR1cm4ge1tyb290TW9kZWxOYW1lXTogW3NlbGVjdF19XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3QpKSB7XG4gICAgaWYgKCFyb290TW9kZWxOYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHNlbGVjdCBzaG9ydGhhbmQgd2l0aG91dCByb290IG1vZGVsIG5hbWVcIilcblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBzZWxlY3QpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlTmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2VsZWN0IGF0dHJpYnV0ZSBmb3IgJHtyb290TW9kZWxOYW1lfTogJHt0eXBlb2YgYXR0cmlidXRlTmFtZX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7W3Jvb3RNb2RlbE5hbWVdOiBBcnJheS5mcm9tKG5ldyBTZXQoc2VsZWN0KSl9XG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3Qoc2VsZWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZWxlY3QgdHlwZTogJHt0eXBlb2Ygc2VsZWN0fWApXG4gIH1cblxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9XG5cbiAgZm9yIChjb25zdCBbbW9kZWxOYW1lLCBzZWxlY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKHNlbGVjdCkpIHtcbiAgICBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbm9ybWFsaXplZFttb2RlbE5hbWVdID0gW3NlbGVjdGlvbl1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNlbGVjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZWxlY3QgdmFsdWUgZm9yICR7bW9kZWxOYW1lfTogJHt0eXBlb2Ygc2VsZWN0aW9ufWApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIHNlbGVjdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVOYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZWxlY3QgYXR0cmlidXRlIGZvciAke21vZGVsTmFtZX06ICR7dHlwZW9mIGF0dHJpYnV0ZU5hbWV9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub3JtYWxpemVkW21vZGVsTmFtZV0gPSBBcnJheS5mcm9tKG5ldyBTZXQoc2VsZWN0aW9uKSlcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IHRhcmdldFNlbGVjdCAtIEV4aXN0aW5nIHNlbGVjdCByZWNvcmQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gaW5jb21pbmdTZWxlY3QgLSBJbmNvbWluZyBzZWxlY3QgcmVjb3JkLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIG1lcmdlU2VsZWN0UmVjb3JkKHRhcmdldFNlbGVjdCwgaW5jb21pbmdTZWxlY3QpIHtcbiAgZm9yIChjb25zdCBbbW9kZWxOYW1lLCBpbmNvbWluZ0F0dHJpYnV0ZXNdIG9mIE9iamVjdC5lbnRyaWVzKGluY29taW5nU2VsZWN0KSkge1xuICAgIGNvbnN0IGV4aXN0aW5nQXR0cmlidXRlcyA9IHRhcmdldFNlbGVjdFttb2RlbE5hbWVdIHx8IFtdXG5cbiAgICB0YXJnZXRTZWxlY3RbbW9kZWxOYW1lXSA9IEFycmF5LmZyb20obmV3IFNldChbLi4uZXhpc3RpbmdBdHRyaWJ1dGVzLCAuLi5pbmNvbWluZ0F0dHJpYnV0ZXNdKSlcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIFJhdyBzZWFyY2ggb3BlcmF0b3IuXG4gKiBAcmV0dXJucyB7XCJlcVwiIHwgXCJsaWtlXCIgfCBcIm5vdEVxXCIgfCBcImd0XCIgfCBcImd0ZXFcIiB8IFwibHRcIiB8IFwibHRlcVwifSAtIE5vcm1hbGl6ZWQgb3BlcmF0b3IuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNlYXJjaE9wZXJhdG9yKG9wZXJhdG9yKSB7XG4gIGNvbnN0IG9wZXJhdG9yQWxpYXNlcyA9IHtcbiAgICBcIjxcIjogXCJsdFwiLFxuICAgIFwiPD1cIjogXCJsdGVxXCIsXG4gICAgXCI+XCI6IFwiZ3RcIixcbiAgICBcIj49XCI6IFwiZ3RlcVwiXG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZE9wZXJhdG9yID0gb3BlcmF0b3JBbGlhc2VzWy8qKiBAdHlwZSB7XCI8XCIgfCBcIjw9XCIgfCBcIj5cIiB8IFwiPj1cIn0gKi8gKG9wZXJhdG9yKV0gfHwgb3BlcmF0b3JcbiAgY29uc3Qgc3VwcG9ydGVkT3BlcmF0b3JzID0gbmV3IFNldChbXCJlcVwiLCBcImxpa2VcIiwgXCJub3RFcVwiLCBcImd0XCIsIFwiZ3RlcVwiLCBcImx0XCIsIFwibHRlcVwiXSlcblxuICBpZiAoIXN1cHBvcnRlZE9wZXJhdG9ycy5oYXMobm9ybWFsaXplZE9wZXJhdG9yKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgc2VhcmNoIG9wZXJhdG9yIG11c3QgYmUgb25lIG9mOiBlcSwgbGlrZSwgbm90RXEsIGd0LCBndGVxLCBsdCwgbHRlcSwgPiwgPj0sIDwsIDw9IChnb3Q6ICR7b3BlcmF0b3J9KWApXG4gIH1cblxuICByZXR1cm4gLyoqIEB0eXBlIHtcImVxXCIgfCBcImxpa2VcIiB8IFwibm90RXFcIiB8IFwiZ3RcIiB8IFwiZ3RlcVwiIHwgXCJsdFwiIHwgXCJsdGVxXCJ9ICovIChub3JtYWxpemVkT3BlcmF0b3IpXG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0YXJnZXRKb2lucyAtIEV4aXN0aW5nIGpvaW4gcmVjb3JkLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBpbmNvbWluZ0pvaW5zIC0gSW5jb21pbmcgam9pbiByZWNvcmQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gbWVyZ2VKb2luUmVjb3JkKHRhcmdldEpvaW5zLCBpbmNvbWluZ0pvaW5zKSB7XG4gIGZvciAoY29uc3QgW3JlbGF0aW9uc2hpcE5hbWUsIGluY29taW5nVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluY29taW5nSm9pbnMpKSB7XG4gICAgY29uc3QgZXhpc3RpbmdWYWx1ZSA9IHRhcmdldEpvaW5zW3JlbGF0aW9uc2hpcE5hbWVdXG5cbiAgICBpZiAoaW5jb21pbmdWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKGV4aXN0aW5nVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0YXJnZXRKb2luc1tyZWxhdGlvbnNoaXBOYW1lXSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGluY29taW5nVmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgam9pbiB2YWx1ZSBmb3IgJHtyZWxhdGlvbnNoaXBOYW1lfTogJHt0eXBlb2YgaW5jb21pbmdWYWx1ZX1gKVxuICAgIH1cblxuICAgIGlmIChpc1BsYWluT2JqZWN0KGV4aXN0aW5nVmFsdWUpKSB7XG4gICAgICBtZXJnZUpvaW5SZWNvcmQoZXhpc3RpbmdWYWx1ZSwgaW5jb21pbmdWYWx1ZSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nVmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHRhcmdldEpvaW5zW3JlbGF0aW9uc2hpcE5hbWVdID0gbm9ybWFsaXplSm9pbnMoaW5jb21pbmdWYWx1ZSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdGFyZ2V0Sm9pbnNbcmVsYXRpb25zaGlwTmFtZV0gPSBub3JtYWxpemVKb2lucyhpbmNvbWluZ1ZhbHVlKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBqb2lucyAtIEpvaW4gcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIE5vcm1hbGl6ZWQgcmVsYXRpb25zaGlwIGRlc2NyaXB0b3Igam9pbnMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUpvaW5zKGpvaW5zKSB7XG4gIGlmICgham9pbnMpIHJldHVybiB7fVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGpvaW5zKSkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBjb25zdCBub3JtYWxpemVkID0ge31cblxuICAgIGZvciAoY29uc3Qgam9pbkVudHJ5IG9mIGpvaW5zKSB7XG4gICAgICBpZiAoIWlzUGxhaW5PYmplY3Qoam9pbkVudHJ5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgam9pbnMgZW50cnkgdHlwZTogJHt0eXBlb2Ygam9pbkVudHJ5fWApXG4gICAgICB9XG5cbiAgICAgIG1lcmdlSm9pblJlY29yZChub3JtYWxpemVkLCBub3JtYWxpemVKb2lucyhqb2luRW50cnkpKVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkXG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3Qoam9pbnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGpvaW5zIHR5cGU6ICR7dHlwZW9mIGpvaW5zfWApXG4gIH1cblxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fVxuXG4gIGZvciAoY29uc3QgW3JlbGF0aW9uc2hpcE5hbWUsIHJlbGF0aW9uc2hpcEpvaW5dIG9mIE9iamVjdC5lbnRyaWVzKGpvaW5zKSkge1xuICAgIGlmIChyZWxhdGlvbnNoaXBKb2luID09PSB0cnVlKSB7XG4gICAgICBub3JtYWxpemVkW3JlbGF0aW9uc2hpcE5hbWVdID0gdHJ1ZVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoaXNQbGFpbk9iamVjdChyZWxhdGlvbnNoaXBKb2luKSkge1xuICAgICAgbm9ybWFsaXplZFtyZWxhdGlvbnNoaXBOYW1lXSA9IG5vcm1hbGl6ZUpvaW5zKHJlbGF0aW9uc2hpcEpvaW4pXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBqb2luIGRlZmluaXRpb24gZm9yIFwiJHtyZWxhdGlvbnNoaXBOYW1lfVwiOiAke3R5cGVvZiByZWxhdGlvbnNoaXBKb2lufWApXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxTb3J0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sdW1uIC0gQXR0cmlidXRlIG5hbWUgdG8gc29ydCBieS5cbiAqIEBwcm9wZXJ0eSB7XCJhc2NcIiB8IFwiZGVzY1wifSBkaXJlY3Rpb24gLSBTb3J0IGRpcmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aCBmcm9tIHJvb3QgbW9kZWwuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsR3JvdXBcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2x1bW4gLSBBdHRyaWJ1dGUgbmFtZSB0byBncm91cCBieS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aCBmcm9tIHJvb3QgbW9kZWwuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUGx1Y2tcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2x1bW4gLSBBdHRyaWJ1dGUgbmFtZSB0byBwbHVjay5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aCBmcm9tIHJvb3QgbW9kZWwuXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGRpcmVjdGlvbiAtIERpcmVjdGlvbiB2YWx1ZS5cbiAqIEByZXR1cm5zIHtcImFzY1wiIHwgXCJkZXNjXCJ9IC0gTm9ybWFsaXplZCBkaXJlY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNvcnREaXJlY3Rpb24oZGlyZWN0aW9uKSB7XG4gIGlmICh0eXBlb2YgZGlyZWN0aW9uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNvcnQgZGlyZWN0aW9uIHR5cGU6ICR7dHlwZW9mIGRpcmVjdGlvbn1gKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZERpcmVjdGlvbiA9IGRpcmVjdGlvbi50cmltKCkudG9Mb3dlckNhc2UoKVxuXG4gIGlmIChub3JtYWxpemVkRGlyZWN0aW9uICE9PSBcImFzY1wiICYmIG5vcm1hbGl6ZWREaXJlY3Rpb24gIT09IFwiZGVzY1wiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNvcnQgZGlyZWN0aW9uOiAke2RpcmVjdGlvbn1gKVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWREaXJlY3Rpb25cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHR1cGxlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFtzdHJpbmcsIHN0cmluZ119IC0gV2hldGhlciB2YWx1ZSBpcyBhIHNvcnQgdHVwbGUuXG4gKi9cbmZ1bmN0aW9uIHNvcnRUdXBsZSh2YWx1ZSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2VcbiAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMikgcmV0dXJuIGZhbHNlXG4gIGlmICh0eXBlb2YgdmFsdWVbMF0gIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mIHZhbHVlWzFdICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2VcbiAgaWYgKHZhbHVlWzBdLnRyaW0oKS5sZW5ndGggPCAxKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBkaXJlY3Rpb24gPSB2YWx1ZVsxXS50cmltKCkudG9Mb3dlckNhc2UoKVxuXG4gIHJldHVybiBkaXJlY3Rpb24gPT09IFwiYXNjXCIgfHwgZGlyZWN0aW9uID09PSBcImRlc2NcIlxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3J0VmFsdWUgLSBTb3J0IHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtwYXRoXSAtIFJlbGF0aW9uc2hpcCBwYXRoLlxuICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxTb3J0fSAtIE5vcm1hbGl6ZWQgc29ydCBkZXNjcmlwdG9yLlxuICovXG5mdW5jdGlvbiBwYXJzZVNvcnRTdHJpbmcoc29ydFZhbHVlLCBwYXRoID0gW10pIHtcbiAgY29uc3QgdHJpbW1lZCA9IHNvcnRWYWx1ZS50cmltKClcblxuICBpZiAodHJpbW1lZC5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic29ydCB2YWx1ZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ1wiKVxuICB9XG5cbiAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0cmltbWVkLnNsaWNlKDEpLnRyaW0oKVxuXG4gICAgaWYgKGNvbHVtbi5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc29ydCBkZWZpbml0aW9uOiAke3NvcnRWYWx1ZX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb2x1bW4sXG4gICAgICBkaXJlY3Rpb246IFwiZGVzY1wiLFxuICAgICAgcGF0aDogWy4uLnBhdGhdXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc29ydFBhcnRzID0gdHJpbW1lZC5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKVxuXG4gIGlmIChzb3J0UGFydHMubGVuZ3RoID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzb3J0IGRlZmluaXRpb246ICR7c29ydFZhbHVlfWApXG4gIH1cblxuICBjb25zdCBjb2x1bW4gPSBzb3J0UGFydHNbMF1cblxuICBpZiAoY29sdW1uLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc29ydCBkZWZpbml0aW9uOiAke3NvcnRWYWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgZGlyZWN0aW9uID0gc29ydFBhcnRzLmxlbmd0aCA9PT0gMlxuICAgID8gbm9ybWFsaXplU29ydERpcmVjdGlvbihzb3J0UGFydHNbMV0pXG4gICAgOiBcImFzY1wiXG5cbiAgcmV0dXJuIHtcbiAgICBjb2x1bW4sXG4gICAgZGlyZWN0aW9uLFxuICAgIHBhdGg6IFsuLi5wYXRoXVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtbc3RyaW5nLCBzdHJpbmddfSBzb3J0VmFsdWUgLSBTb3J0IHR1cGxlLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gW3BhdGhdIC0gUmVsYXRpb25zaGlwIHBhdGguXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFNvcnR9IC0gTm9ybWFsaXplZCBzb3J0IGRlc2NyaXB0b3IuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU29ydFR1cGxlKHNvcnRWYWx1ZSwgcGF0aCA9IFtdKSB7XG4gIGNvbnN0IFtjb2x1bW5WYWx1ZSwgZGlyZWN0aW9uVmFsdWVdID0gc29ydFZhbHVlXG4gIGNvbnN0IGNvbHVtbiA9IGNvbHVtblZhbHVlLnRyaW0oKVxuXG4gIGlmIChjb2x1bW4ubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInNvcnQgdHVwbGUgY29sdW1uIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nXCIpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbHVtbixcbiAgICBkaXJlY3Rpb246IG5vcm1hbGl6ZVNvcnREaXJlY3Rpb24oZGlyZWN0aW9uVmFsdWUpLFxuICAgIHBhdGg6IFsuLi5wYXRoXVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzb3J0VmFsdWUgLSBOZXN0ZWQgc29ydCBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoIC0gUmVsYXRpb25zaGlwIHBhdGguXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFNvcnRbXX0gLSBOb3JtYWxpemVkIHNvcnQgZGVzY3JpcHRvcnMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNvcnRPYmplY3Qoc29ydFZhbHVlLCBwYXRoKSB7XG4gIC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFNvcnRbXX0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZFNvcnRzID0gW11cblxuICBmb3IgKGNvbnN0IFtzb3J0S2V5LCBzb3J0RW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHNvcnRWYWx1ZSkpIHtcbiAgICBpZiAodHlwZW9mIHNvcnRFbnRyeSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbm9ybWFsaXplZFNvcnRzLnB1c2goe1xuICAgICAgICBjb2x1bW46IHNvcnRLZXksXG4gICAgICAgIGRpcmVjdGlvbjogbm9ybWFsaXplU29ydERpcmVjdGlvbihzb3J0RW50cnkpLFxuICAgICAgICBwYXRoOiBbLi4ucGF0aF1cbiAgICAgIH0pXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChzb3J0VHVwbGUoc29ydEVudHJ5KSkge1xuICAgICAgbm9ybWFsaXplZFNvcnRzLnB1c2gocGFyc2VTb3J0VHVwbGUoc29ydEVudHJ5LCBbLi4ucGF0aCwgc29ydEtleV0pKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3J0RW50cnkpKSB7XG4gICAgICBpZiAoc29ydEVudHJ5Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNvcnQgZGVmaW5pdGlvbiBmb3IgXCIke3NvcnRLZXl9XCI6IGVtcHR5IGFycmF5YClcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBuZXN0ZWRTb3J0RW50cnkgb2Ygc29ydEVudHJ5KSB7XG4gICAgICAgIGlmICghc29ydFR1cGxlKG5lc3RlZFNvcnRFbnRyeSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc29ydCBkZWZpbml0aW9uIGZvciBcIiR7c29ydEtleX1cIjogZXhwZWN0ZWQgW2NvbHVtbiwgZGlyZWN0aW9uXSB0dXBsZXNgKVxuICAgICAgICB9XG5cbiAgICAgICAgbm9ybWFsaXplZFNvcnRzLnB1c2gocGFyc2VTb3J0VHVwbGUobmVzdGVkU29ydEVudHJ5LCBbLi4ucGF0aCwgc29ydEtleV0pKVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoaXNQbGFpbk9iamVjdChzb3J0RW50cnkpKSB7XG4gICAgICBub3JtYWxpemVkU29ydHMucHVzaCguLi5ub3JtYWxpemVTb3J0T2JqZWN0KHNvcnRFbnRyeSwgWy4uLnBhdGgsIHNvcnRLZXldKSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNvcnQgZGVmaW5pdGlvbiBmb3IgXCIke3NvcnRLZXl9XCI6ICR7dHlwZW9mIHNvcnRFbnRyeX1gKVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRTb3J0c1xufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc29ydCAtIFNvcnQgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsU29ydFtdfSAtIE5vcm1hbGl6ZWQgc29ydCBkZWZpbml0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU29ydChzb3J0KSB7XG4gIGlmICghc29ydCkgcmV0dXJuIFtdXG5cbiAgaWYgKHR5cGVvZiBzb3J0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFtwYXJzZVNvcnRTdHJpbmcoc29ydCldXG4gIH1cblxuICBpZiAoc29ydFR1cGxlKHNvcnQpKSB7XG4gICAgcmV0dXJuIFtwYXJzZVNvcnRUdXBsZShzb3J0KV1cbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHNvcnQpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVNvcnRPYmplY3Qoc29ydCwgW10pXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShzb3J0KSkge1xuICAgIC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFNvcnRbXX0gKi9cbiAgICBjb25zdCBub3JtYWxpemVkID0gW11cblxuICAgIGZvciAoY29uc3Qgc29ydEVudHJ5IG9mIHNvcnQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc29ydEVudHJ5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQucHVzaChwYXJzZVNvcnRTdHJpbmcoc29ydEVudHJ5KSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHNvcnRUdXBsZShzb3J0RW50cnkpKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQucHVzaChwYXJzZVNvcnRUdXBsZShzb3J0RW50cnkpKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChzb3J0RW50cnkpKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQucHVzaCguLi5ub3JtYWxpemVTb3J0T2JqZWN0KHNvcnRFbnRyeSwgW10pKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc29ydCBlbnRyeSB0eXBlOiAke3R5cGVvZiBzb3J0RW50cnl9YClcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZFxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNvcnQgdHlwZTogJHt0eXBlb2Ygc29ydH1gKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBncm91cFZhbHVlIC0gR3JvdXAgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gW3BhdGhdIC0gUmVsYXRpb25zaGlwIHBhdGguXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbEdyb3VwfSAtIE5vcm1hbGl6ZWQgZ3JvdXAgZGVzY3JpcHRvci5cbiAqL1xuZnVuY3Rpb24gcGFyc2VHcm91cFN0cmluZyhncm91cFZhbHVlLCBwYXRoID0gW10pIHtcbiAgY29uc3QgdHJpbW1lZCA9IGdyb3VwVmFsdWUudHJpbSgpXG5cbiAgaWYgKCEvXlthLXpBLVpfXVthLXpBLVowLTlfXSokLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdyb3VwIGNvbHVtbjogJHtncm91cFZhbHVlfWApXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbHVtbjogdHJpbW1lZCxcbiAgICBwYXRoOiBbLi4ucGF0aF1cbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyB7Y29sdW1uOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdfX0gLSBXaGV0aGVyIGNhbmRpZGF0ZSBpcyBhbiBleHBsaWNpdCBncm91cCBkZXNjcmlwdG9yIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZ3JvdXBEZXNjcmlwdG9yKHZhbHVlKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHJldHVybiBmYWxzZVxuICBpZiAoIShcImNvbHVtblwiIGluIHZhbHVlKSB8fCAhKFwicGF0aFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlXG4gIGlmICh0eXBlb2YgdmFsdWUuY29sdW1uICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2VcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlLnBhdGgpKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gdmFsdWUucGF0aC5ldmVyeSgocGF0aEVudHJ5KSA9PiB0eXBlb2YgcGF0aEVudHJ5ID09PSBcInN0cmluZ1wiKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gZ3JvdXBWYWx1ZSAtIE5lc3RlZCBncm91cCBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoIC0gUmVsYXRpb25zaGlwIHBhdGguXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbEdyb3VwW119IC0gTm9ybWFsaXplZCBncm91cCBkZXNjcmlwdG9ycy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplR3JvdXBPYmplY3QoZ3JvdXBWYWx1ZSwgcGF0aCkge1xuICAvKiogQHR5cGUge0Zyb250ZW5kTW9kZWxHcm91cFtdfSAqL1xuICBjb25zdCBub3JtYWxpemVkR3JvdXBzID0gW11cblxuICBmb3IgKGNvbnN0IFtncm91cEtleSwgZ3JvdXBFbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoZ3JvdXBWYWx1ZSkpIHtcbiAgICBpZiAodHlwZW9mIGdyb3VwRW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5vcm1hbGl6ZWRHcm91cHMucHVzaChwYXJzZUdyb3VwU3RyaW5nKGdyb3VwRW50cnksIFsuLi5wYXRoLCBncm91cEtleV0pKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShncm91cEVudHJ5KSkge1xuICAgICAgaWYgKGdyb3VwRW50cnkubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZ3JvdXAgZGVmaW5pdGlvbiBmb3IgXCIke2dyb3VwS2V5fVwiOiBlbXB0eSBhcnJheWApXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbmVzdGVkR3JvdXBFbnRyeSBvZiBncm91cEVudHJ5KSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmVzdGVkR3JvdXBFbnRyeSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBncm91cCBkZWZpbml0aW9uIGZvciBcIiR7Z3JvdXBLZXl9XCI6IGV4cGVjdGVkIHN0cmluZyBjb2x1bW5zYClcbiAgICAgICAgfVxuXG4gICAgICAgIG5vcm1hbGl6ZWRHcm91cHMucHVzaChwYXJzZUdyb3VwU3RyaW5nKG5lc3RlZEdyb3VwRW50cnksIFsuLi5wYXRoLCBncm91cEtleV0pKVxuICAgICAgfVxuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChpc1BsYWluT2JqZWN0KGdyb3VwRW50cnkpKSB7XG4gICAgICBub3JtYWxpemVkR3JvdXBzLnB1c2goLi4ubm9ybWFsaXplR3JvdXBPYmplY3QoZ3JvdXBFbnRyeSwgWy4uLnBhdGgsIGdyb3VwS2V5XSkpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBncm91cCBkZWZpbml0aW9uIGZvciBcIiR7Z3JvdXBLZXl9XCI6ICR7dHlwZW9mIGdyb3VwRW50cnl9YClcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkR3JvdXBzXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBncm91cCAtIEdyb3VwIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbEdyb3VwW119IC0gTm9ybWFsaXplZCBncm91cCBkZWZpbml0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplR3JvdXAoZ3JvdXApIHtcbiAgaWYgKCFncm91cCkgcmV0dXJuIFtdXG5cbiAgaWYgKHR5cGVvZiBncm91cCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBbcGFyc2VHcm91cFN0cmluZyhncm91cCldXG4gIH1cblxuICBpZiAoZ3JvdXBEZXNjcmlwdG9yKGdyb3VwKSkge1xuICAgIHJldHVybiBbe1xuICAgICAgY29sdW1uOiBwYXJzZUdyb3VwU3RyaW5nKGdyb3VwLmNvbHVtbikuY29sdW1uLFxuICAgICAgcGF0aDogWy4uLmdyb3VwLnBhdGhdXG4gICAgfV1cbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KGdyb3VwKSkge1xuICAgIHJldHVybiBub3JtYWxpemVHcm91cE9iamVjdChncm91cCwgW10pXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShncm91cCkpIHtcbiAgICAvKiogQHR5cGUge0Zyb250ZW5kTW9kZWxHcm91cFtdfSAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBncm91cEVudHJ5IG9mIGdyb3VwKSB7XG4gICAgICBpZiAodHlwZW9mIGdyb3VwRW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbm9ybWFsaXplZC5wdXNoKHBhcnNlR3JvdXBTdHJpbmcoZ3JvdXBFbnRyeSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChncm91cERlc2NyaXB0b3IoZ3JvdXBFbnRyeSkpIHtcbiAgICAgICAgbm9ybWFsaXplZC5wdXNoKHtcbiAgICAgICAgICBjb2x1bW46IHBhcnNlR3JvdXBTdHJpbmcoZ3JvdXBFbnRyeS5jb2x1bW4pLmNvbHVtbixcbiAgICAgICAgICBwYXRoOiBbLi4uZ3JvdXBFbnRyeS5wYXRoXVxuICAgICAgICB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChncm91cEVudHJ5KSkge1xuICAgICAgICBub3JtYWxpemVkLnB1c2goLi4ubm9ybWFsaXplR3JvdXBPYmplY3QoZ3JvdXBFbnRyeSwgW10pKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZ3JvdXAgZW50cnkgdHlwZTogJHt0eXBlb2YgZ3JvdXBFbnRyeX1gKVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZ3JvdXAgdHlwZTogJHt0eXBlb2YgZ3JvdXB9YClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGx1Y2tWYWx1ZSAtIFBsdWNrIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtwYXRoXSAtIFJlbGF0aW9uc2hpcCBwYXRoLlxuICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxQbHVja30gLSBOb3JtYWxpemVkIHBsdWNrIGRlc2NyaXB0b3IuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUGx1Y2tTdHJpbmcocGx1Y2tWYWx1ZSwgcGF0aCA9IFtdKSB7XG4gIGNvbnN0IHRyaW1tZWQgPSBwbHVja1ZhbHVlLnRyaW0oKVxuXG4gIGlmICghL15bYS16QS1aX11bYS16QS1aMC05X10qJC8udGVzdCh0cmltbWVkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwbHVjayBjb2x1bW46ICR7cGx1Y2tWYWx1ZX1gKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb2x1bW46IHRyaW1tZWQsXG4gICAgcGF0aDogWy4uLnBhdGhdXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMge2NvbHVtbjogc3RyaW5nLCBwYXRoOiBzdHJpbmdbXX19IC0gV2hldGhlciBjYW5kaWRhdGUgaXMgYW4gZXhwbGljaXQgcGx1Y2sgZGVzY3JpcHRvciBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIHBsdWNrRGVzY3JpcHRvcih2YWx1ZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSByZXR1cm4gZmFsc2VcbiAgaWYgKCEoXCJjb2x1bW5cIiBpbiB2YWx1ZSkgfHwgIShcInBhdGhcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mIHZhbHVlLmNvbHVtbiAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZS5wYXRoKSkgcmV0dXJuIGZhbHNlXG5cbiAgcmV0dXJuIHZhbHVlLnBhdGguZXZlcnkoKHBhdGhFbnRyeSkgPT4gdHlwZW9mIHBhdGhFbnRyeSA9PT0gXCJzdHJpbmdcIilcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHBsdWNrVmFsdWUgLSBOZXN0ZWQgcGx1Y2sgb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aCAtIFJlbGF0aW9uc2hpcCBwYXRoLlxuICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxQbHVja1tdfSAtIE5vcm1hbGl6ZWQgcGx1Y2sgZGVzY3JpcHRvcnMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBsdWNrT2JqZWN0KHBsdWNrVmFsdWUsIHBhdGgpIHtcbiAgLyoqIEB0eXBlIHtGcm9udGVuZE1vZGVsUGx1Y2tbXX0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZFBsdWNrcyA9IFtdXG5cbiAgZm9yIChjb25zdCBbcGx1Y2tLZXksIHBsdWNrRW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHBsdWNrVmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiBwbHVja0VudHJ5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBub3JtYWxpemVkUGx1Y2tzLnB1c2gocGFyc2VQbHVja1N0cmluZyhwbHVja0VudHJ5LCBbLi4ucGF0aCwgcGx1Y2tLZXldKSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGx1Y2tFbnRyeSkpIHtcbiAgICAgIGlmIChwbHVja0VudHJ5Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBsdWNrIGRlZmluaXRpb24gZm9yIFwiJHtwbHVja0tleX1cIjogZW1wdHkgYXJyYXlgKVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IG5lc3RlZFBsdWNrRW50cnkgb2YgcGx1Y2tFbnRyeSkge1xuICAgICAgICBpZiAodHlwZW9mIG5lc3RlZFBsdWNrRW50cnkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGx1Y2sgZGVmaW5pdGlvbiBmb3IgXCIke3BsdWNrS2V5fVwiOiBleHBlY3RlZCBzdHJpbmcgY29sdW1uc2ApXG4gICAgICAgIH1cblxuICAgICAgICBub3JtYWxpemVkUGx1Y2tzLnB1c2gocGFyc2VQbHVja1N0cmluZyhuZXN0ZWRQbHVja0VudHJ5LCBbLi4ucGF0aCwgcGx1Y2tLZXldKSlcbiAgICAgIH1cblxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoaXNQbGFpbk9iamVjdChwbHVja0VudHJ5KSkge1xuICAgICAgbm9ybWFsaXplZFBsdWNrcy5wdXNoKC4uLm5vcm1hbGl6ZVBsdWNrT2JqZWN0KHBsdWNrRW50cnksIFsuLi5wYXRoLCBwbHVja0tleV0pKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGx1Y2sgZGVmaW5pdGlvbiBmb3IgXCIke3BsdWNrS2V5fVwiOiAke3R5cGVvZiBwbHVja0VudHJ5fWApXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZFBsdWNrc1xufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gcGx1Y2sgLSBQbHVjayBwYXlsb2FkLlxuICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxQbHVja1tdfSAtIE5vcm1hbGl6ZWQgcGx1Y2sgZGVmaW5pdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBsdWNrKHBsdWNrKSB7XG4gIGlmICghcGx1Y2spIHJldHVybiBbXVxuXG4gIGlmICh0eXBlb2YgcGx1Y2sgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gW3BhcnNlUGx1Y2tTdHJpbmcocGx1Y2spXVxuICB9XG5cbiAgaWYgKHBsdWNrRGVzY3JpcHRvcihwbHVjaykpIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIGNvbHVtbjogcGFyc2VQbHVja1N0cmluZyhwbHVjay5jb2x1bW4pLmNvbHVtbixcbiAgICAgIHBhdGg6IFsuLi5wbHVjay5wYXRoXVxuICAgIH1dXG4gIH1cblxuICBpZiAoaXNQbGFpbk9iamVjdChwbHVjaykpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplUGx1Y2tPYmplY3QocGx1Y2ssIFtdKVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocGx1Y2spKSB7XG4gICAgLyoqIEB0eXBlIHtGcm9udGVuZE1vZGVsUGx1Y2tbXX0gKi9cbiAgICBjb25zdCBub3JtYWxpemVkID0gW11cblxuICAgIGZvciAoY29uc3QgcGx1Y2tFbnRyeSBvZiBwbHVjaykge1xuICAgICAgaWYgKHR5cGVvZiBwbHVja0VudHJ5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQucHVzaChwYXJzZVBsdWNrU3RyaW5nKHBsdWNrRW50cnkpKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAocGx1Y2tEZXNjcmlwdG9yKHBsdWNrRW50cnkpKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQucHVzaCh7XG4gICAgICAgICAgY29sdW1uOiBwYXJzZVBsdWNrU3RyaW5nKHBsdWNrRW50cnkuY29sdW1uKS5jb2x1bW4sXG4gICAgICAgICAgcGF0aDogWy4uLnBsdWNrRW50cnkucGF0aF1cbiAgICAgICAgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUGxhaW5PYmplY3QocGx1Y2tFbnRyeSkpIHtcbiAgICAgICAgbm9ybWFsaXplZC5wdXNoKC4uLm5vcm1hbGl6ZVBsdWNrT2JqZWN0KHBsdWNrRW50cnksIFtdKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBsdWNrIGVudHJ5IHR5cGU6ICR7dHlwZW9mIHBsdWNrRW50cnl9YClcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZFxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBsdWNrIHR5cGU6ICR7dHlwZW9mIHBsdWNrfWApXG59XG5cbi8qKlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtTZXQ8c3RyaW5nPn0gLSBSZXNvdXJjZSBhdHRyaWJ1dGUgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxSZXNvdXJjZUF0dHJpYnV0ZXMobW9kZWxDbGFzcykge1xuICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKG1vZGVsQ2xhc3MucmVzb3VyY2VDb25maWcoKSlcbiAgY29uc3QgYXR0cmlidXRlcyA9IHJlc291cmNlQ29uZmlnLmF0dHJpYnV0ZXNcblxuICBpZiAoQXJyYXkuaXNBcnJheShhdHRyaWJ1dGVzKSkge1xuICAgIHJldHVybiBuZXcgU2V0KGF0dHJpYnV0ZXMpXG4gIH1cblxuICBpZiAoaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSkge1xuICAgIHJldHVybiBuZXcgU2V0KE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZXQoKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vYmFzZS5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gUm9vdCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aC5cbiAqIEByZXR1cm5zIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLmpzXCIpLmRlZmF1bHR9IC0gVGFyZ2V0IG1vZGVsIGNsYXNzIGZvciBwYXRoLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsUGx1Y2tUYXJnZXRNb2RlbENsYXNzKG1vZGVsQ2xhc3MsIHBhdGgpIHtcbiAgbGV0IHRhcmdldE1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzXG5cbiAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIHBhdGgpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBEZWZpbml0aW9ucyA9IHR5cGVvZiB0YXJnZXRNb2RlbENsYXNzLnJlbGF0aW9uc2hpcERlZmluaXRpb25zID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gdGFyZ2V0TW9kZWxDbGFzcy5yZWxhdGlvbnNoaXBEZWZpbml0aW9ucygpXG4gICAgICA6IHt9XG4gICAgY29uc3QgcmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzID0gdHlwZW9mIHRhcmdldE1vZGVsQ2xhc3MucmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gdGFyZ2V0TW9kZWxDbGFzcy5yZWxhdGlvbnNoaXBNb2RlbENsYXNzZXMoKVxuICAgICAgOiB7fVxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcERlZmluaXRpb24gPSByZWxhdGlvbnNoaXBEZWZpbml0aW9uc1tyZWxhdGlvbnNoaXBOYW1lXVxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcFRhcmdldE1vZGVsQ2xhc3MgPSByZXNvbHZlRnJvbnRlbmRNb2RlbENsYXNzKHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3Nlc1tyZWxhdGlvbnNoaXBOYW1lXSlcblxuICAgIGlmICghcmVsYXRpb25zaGlwRGVmaW5pdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHBsdWNrIHJlbGF0aW9uc2hpcCBcIiR7cmVsYXRpb25zaGlwTmFtZX1cIiBmb3IgJHt0YXJnZXRNb2RlbENsYXNzLm5hbWV9YClcbiAgICB9XG5cbiAgICBpZiAoIXJlbGF0aW9uc2hpcFRhcmdldE1vZGVsQ2xhc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcmVsYXRpb25zaGlwIG1vZGVsIGNsYXNzIGNvbmZpZ3VyZWQgZm9yICR7dGFyZ2V0TW9kZWxDbGFzcy5uYW1lfSMke3JlbGF0aW9uc2hpcE5hbWV9YClcbiAgICB9XG5cbiAgICB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwVGFyZ2V0TW9kZWxDbGFzc1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldE1vZGVsQ2xhc3Ncbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFBsdWNrIHZhbGlkYXRpb24gYXJncy5cbiAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vYmFzZS5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtGcm9udGVuZE1vZGVsUGx1Y2tbXX0gYXJncy5wbHVjayAtIFBsdWNrIGRlc2NyaXB0b3JzLlxuICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxQbHVja1tdfSAtIFZhbGlkYXRlZCBwbHVjayBkZXNjcmlwdG9ycy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQbHVja0RlZmluaXRpb25zKHttb2RlbENsYXNzLCBwbHVja30pIHtcbiAgcmV0dXJuIHBsdWNrLm1hcCgocGx1Y2tFbnRyeSkgPT4ge1xuICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSBmcm9udGVuZE1vZGVsUGx1Y2tUYXJnZXRNb2RlbENsYXNzKG1vZGVsQ2xhc3MsIHBsdWNrRW50cnkucGF0aClcbiAgICBjb25zdCB0YXJnZXRBdHRyaWJ1dGVzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQXR0cmlidXRlcyh0YXJnZXRNb2RlbENsYXNzKVxuXG4gICAgaWYgKCF0YXJnZXRBdHRyaWJ1dGVzLmhhcyhwbHVja0VudHJ5LmNvbHVtbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwbHVjayBjb2x1bW4gXCIke3BsdWNrRW50cnkuY29sdW1ufVwiIGZvciAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb2x1bW46IHBsdWNrRW50cnkuY29sdW1uLFxuICAgICAgcGF0aDogWy4uLnBsdWNrRW50cnkucGF0aF1cbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gZmluZEJ5IGNvbmRpdGlvbnMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNlcmlhbGl6ZWQgY29uZGl0aW9ucyBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKi9cbmZ1bmN0aW9uIHNlcmlhbGl6ZUZpbmRDb25kaXRpb25zKGNvbmRpdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY29uZGl0aW9ucylcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFwiW3Vuc2VyaWFsaXphYmxlIGNvbmRpdGlvbnNdXCJcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZGl0aW9ucyAtIGZpbmRCeSBjb25kaXRpb25zLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gSlNPTi1ub3JtYWxpemVkIGNvbmRpdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZpbmRDb25kaXRpb25zKGNvbmRpdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjb25kaXRpb25zKSkpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgY29uZGl0aW9ucyBjb3VsZCBub3QgYmUgc2VyaWFsaXplZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCwge2NhdXNlOiBlcnJvcn0pXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGludGVnZXIgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJndW1lbnROYW1lIC0gQXJndW1lbnQgbmFtZSBmb3IgZXJyb3JzLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBWYWxpZGF0aW9uIG9wdGlvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5taW4gLSBNaW5pbXVtIGFsbG93ZWQgdmFsdWUuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIE5vcm1hbGl6ZWQgaW50ZWdlciB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSW50ZWdlckFyZ3VtZW50KHZhbHVlLCBhcmd1bWVudE5hbWUsIHttaW59KSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2FyZ3VtZW50TmFtZX0gbXVzdCBiZSBhbiBpbnRlZ2VyIG51bWJlcmApXG4gIH1cblxuICBpZiAodmFsdWUgPCBtaW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YXJndW1lbnROYW1lfSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke21pbn1gKVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogQHBhcmFtIHtcImFzY1wiIHwgXCJkZXNjXCJ9IGRpcmVjdGlvbiAtIEN1cnJlbnQgc29ydCBkaXJlY3Rpb24uXG4gKiBAcmV0dXJucyB7XCJhc2NcIiB8IFwiZGVzY1wifSAtIFJldmVyc2VkIGRpcmVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZVNvcnREaXJlY3Rpb24oZGlyZWN0aW9uKSB7XG4gIHJldHVybiBkaXJlY3Rpb24gPT09IFwiYXNjXCIgPyBcImRlc2NcIiA6IFwiYXNjXCJcbn1cblxuLyoqXG4gKiBRdWVyeSB3cmFwcGVyIGZvciBmcm9udGVuZCBtb2RlbCBjb21tYW5kcy5cbiAqIEB0ZW1wbGF0ZSB7dHlwZW9mIGltcG9ydChcIi4vYmFzZS5qc1wiKS5kZWZhdWx0fSBUXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZyb250ZW5kTW9kZWxRdWVyeSB7XG4gIC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFNlYXJjaFtdfSAqL1xuICBfc2VhcmNoZXMgPSBbXVxuICAvKiogQHR5cGUge0Zyb250ZW5kTW9kZWxTb3J0W119ICovXG4gIF9zb3J0ID0gW11cbiAgLyoqIEB0eXBlIHtGcm9udGVuZE1vZGVsR3JvdXBbXX0gKi9cbiAgX2dyb3VwID0gW11cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBDb25zdHJ1Y3RvciBhcmdzLlxuICAgKiBAcGFyYW0ge1R9IGFyZ3MubW9kZWxDbGFzcyAtIEZyb250ZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmR9IFthcmdzLnByZWxvYWRdIC0gUHJlbG9hZCBtYXAuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7bW9kZWxDbGFzcywgcHJlbG9hZCA9IHt9fSkge1xuICAgIHRoaXMubW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3NcbiAgICB0aGlzLl9wcmVsb2FkID0gbm9ybWFsaXplUHJlbG9hZChwcmVsb2FkKVxuICAgIHRoaXMuX2pvaW5zID0ge31cbiAgICB0aGlzLl93aGVyZSA9IHt9XG4gICAgdGhpcy5fc2VhcmNoZXMgPSBbXVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSAqL1xuICAgIHRoaXMuX3NlbGVjdCA9IHt9XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59ICovXG4gICAgdGhpcy5fc2VsZWN0c0V4dHJhID0ge31cbiAgICB0aGlzLl9zb3J0ID0gW11cbiAgICB0aGlzLl9ncm91cCA9IFtdXG4gICAgdGhpcy5fZGlzdGluY3QgPSBmYWxzZVxuICAgIHRoaXMuX2xpbWl0ID0gbnVsbFxuICAgIHRoaXMuX29mZnNldCA9IG51bGxcbiAgICB0aGlzLl9wYWdlID0gbnVsbFxuICAgIHRoaXMuX3BlclBhZ2UgPSBudWxsXG4gICAgLyoqIEB0eXBlIHtBcnJheTx7YXR0cmlidXRlTmFtZTogc3RyaW5nLCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHdoZXJlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj59Pn0gKi9cbiAgICB0aGlzLl93aXRoQ291bnQgPSBbXVxuICAgIC8qKiBAdHlwZSB7QXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55Pj59ICovXG4gICAgdGhpcy5fcXVlcnlEYXRhID0gW11cbiAgICAvKipcbiAgICAgKiBQZXItcmVjb3JkIGFiaWxpdHkgc3BlYy4gTm9ybWFsaXplZCB0byBhIGxpc3Qgb2ZcbiAgICAgKiBge21vZGVsTmFtZSwgYWN0aW9uc31gIGVudHJpZXMg4oCUIG9uZSBlbnRyeSBwZXIgbW9kZWwgdGhhdCBzaG91bGRcbiAgICAgKiBoYXZlIGFiaWxpdHkgcmVzdWx0cyBhdHRhY2hlZC4gVGhlIHJvb3QgcXVlcnkncyBtb2RlbCBjbGFzc1xuICAgICAqIG5hbWUgaXMgaW1wbGljaXQgdmlhIGBcIl9fcm9vdF9fXCJgIHdoZW4gdGhlIGNhbGxlciB1c2VkIHRoZSBmbGF0XG4gICAgICogYXJyYXkgZm9ybS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8e21vZGVsTmFtZTogc3RyaW5nLCBhY3Rpb25zOiBzdHJpbmdbXX0+fVxuICAgICAqL1xuICAgIHRoaXMuX2FiaWxpdGllcyA9IFtdXG4gIH1cblxuICAvKipcbiAgICogVGVsbCB0aGUgYmFja2VuZCB0byBldmFsdWF0ZSBvbmUgb3IgbW9yZSBhYmlsaXR5IGFjdGlvbnMgYWdhaW5zdFxuICAgKiBlYWNoIHJldHVybmVkIHJlY29yZCAoYW5kIGl0cyBwcmVsb2FkZWQgcmVsYXRpb25zLCB3aGVuIGtleWVkIGJ5XG4gICAqIG1vZGVsIG5hbWUpIGFuZCBzaGlwIHRoZSByZXN1bHRzIGJhY2sgc28gdGhlIGZyb250ZW5kIGNhbiByZWFkXG4gICAqIHRoZW0gdmlhIGByZWNvcmQuY2FuKGFjdGlvbilgLlxuICAgKlxuICAgKiBGbGF0IGZvcm0g4oCUIGFwcGxpZXMgdG8gdGhlIHF1ZXJ5J3Mgb3duIG1vZGVsIGNsYXNzOlxuICAgKiAgIGBgYFxuICAgKiAgIGNvbnN0IHRpbWVsb2dzID0gYXdhaXQgVGltZWxvZy53aGVyZSh7dGFza0lkfSlcbiAgICogICAgIC5hYmlsaXRpZXMoW1widXBkYXRlXCIsIFwiZGVzdHJveVwiXSlcbiAgICogICAgIC50b0FycmF5KClcbiAgICogICB0aW1lbG9nc1swXS5jYW4oXCJ1cGRhdGVcIikgLy8g4oaSIGJvb2xlYW5cbiAgICogICBgYGBcbiAgICpcbiAgICogS2V5ZWQgZm9ybSDigJQgdGFyZ2V0cyByZWNvcmRzIGJ5IG1vZGVsIG5hbWUsIHVzZWZ1bCBmb3IgcHJlbG9hZGVkXG4gICAqIGNoaWxkcmVuOlxuICAgKiAgIGBgYFxuICAgKiAgIGNvbnN0IHByb2plY3QgPSBhd2FpdCBQcm9qZWN0XG4gICAqICAgICAucHJlbG9hZChcInRpbWVsb2dzXCIpXG4gICAqICAgICAuYWJpbGl0aWVzKHtUaW1lbG9nOiBbXCJ1cGRhdGVcIiwgXCJkZXN0cm95XCJdfSlcbiAgICogICAgIC5maXJzdCgpXG4gICAqICAgcHJvamVjdC50aW1lbG9ncygpLmxvYWRlZCgpWzBdLmNhbihcInVwZGF0ZVwiKSAvLyDihpIgYm9vbGVhblxuICAgKiAgIGBgYFxuICAgKlxuICAgKiBLZXlzIGluIHRoZSBrZXllZCBmb3JtIGFyZSB0aGUgYmFja2VuZCBtb2RlbCBuYW1lcyAoYXMgcmV0dXJuZWQgYnlcbiAgICogYE1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClgIC8gdGhlIGBtb2RlbE5hbWVgIGZpZWxkIG9mIHRoZVxuICAgKiBmcm9udGVuZC1tb2RlbCByZXNvdXJjZSBjb25maWcpLiBWYWx1ZXMgYXJlIHRoZSBhYmlsaXR5LWFjdGlvblxuICAgKiBzdHJpbmdzIOKAlCB0eXBpY2FsbHkgYFwidXBkYXRlXCJgIC8gYFwiZGVzdHJveVwiYCAvIGBcImNyZWF0ZVwiYCAvXG4gICAqIGBcInJlYWRcImAsIGJ1dCBhbnkgY3VzdG9tIGFjdGlvbiByZWdpc3RlcmVkIG9uIHRoZSByZXNvdXJjZSdzXG4gICAqIGF1dGhvcml6YXRpb24gYWJpbGl0eSBpcyBhY2NlcHRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gc3BlY1xuICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICovXG4gIGFiaWxpdGllcyhzcGVjKSB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBub3JtYWxpemVBYmlsaXRpZXNTcGVjKHNwZWMsIHRoaXMubW9kZWxDbGFzcykpIHtcbiAgICAgIHRoaXMuX21lcmdlQWJpbGl0eUVudHJ5KGVudHJ5KVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7bW9kZWxOYW1lOiBzdHJpbmcsIGFjdGlvbnM6IHN0cmluZ1tdfX0gZW50cnlcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfbWVyZ2VBYmlsaXR5RW50cnkoZW50cnkpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX2FiaWxpdGllcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5tb2RlbE5hbWUgPT09IGVudHJ5Lm1vZGVsTmFtZSlcblxuICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgIHRoaXMuX2FiaWxpdGllcy5wdXNoKHthY3Rpb25zOiBbLi4uZW50cnkuYWN0aW9uc10sIG1vZGVsTmFtZTogZW50cnkubW9kZWxOYW1lfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGVudHJ5LmFjdGlvbnMpIHtcbiAgICAgIGlmICghZXhpc3RpbmcuYWN0aW9ucy5pbmNsdWRlcyhhY3Rpb24pKSBleGlzdGluZy5hY3Rpb25zLnB1c2goYWN0aW9uKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUZWxsIHRoZSBiYWNrZW5kIGluZGV4IHF1ZXJ5IHRvIGF0dGFjaCBvbmUgb3IgbW9yZSBhc3NvY2lhdGlvblxuICAgKiBjb3VudHMgdG8gZWFjaCByZXR1cm5lZCByZWNvcmQuIFBhcnNlcyB0aGUgc2FtZSBzaGFwZXMgYXMgdGhlXG4gICAqIGJhY2tlbmQgYE1vZGVsQ2xhc3NRdWVyeSN3aXRoQ291bnRgLCB0aGVuIHNoaXBzIHRoZSBub3JtYWxpemVkXG4gICAqIGVudHJpZXMgYXMgcGFydCBvZiB0aGUgYGluZGV4YCBjb21tYW5kIHBheWxvYWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwge3JlbGF0aW9uc2hpcD86IHN0cmluZywgd2hlcmU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0+fSBzcGVjXG4gICAqIEByZXR1cm5zIHt0aGlzfVxuICAgKi9cbiAgd2l0aENvdW50KHNwZWMpIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG5vcm1hbGl6ZVdpdGhDb3VudEZyb250ZW5kKHNwZWMpKSB7XG4gICAgICB0aGlzLl93aXRoQ291bnQucHVzaChlbnRyeSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3Qgb25lIG9yIG1vcmUgYmFja2VuZCBxdWVyeURhdGEgZW50cmllcyBmb3IgZWFjaCByZXR1cm5lZFxuICAgKiByZWNvcmQuIFRoZSBzcGVjIGlzIGEgbmFtZSBvciBuZXN0ZWQtcmVjb3JkIHNoYXBlIG1hdGNoaW5nIHRoZVxuICAgKiBgTW9kZWwucXVlcnlEYXRhKG5hbWUsIGZuKWAgcmVnaXN0cmF0aW9ucyBvbiB0aGUgYmFja2VuZCDigJQgdGhlXG4gICAqIGZyb250ZW5kIHNoaXBzIG9ubHkgdGhlc2UgbmFtZXM7IHRoZSBTUUwgZnJhZ21lbnRzIHN0YXkgc2VydmVyLVxuICAgKiBzaWRlLiBBbGwgcmVzdWx0aW5nIGFsaWFzZXMgYXJlIGF0dGFjaGVkIHRvIHRoZSByb290IHJlY29yZCBhbmRcbiAgICogcmVhZCBiYWNrIHdpdGggYHJlY29yZC5xdWVyeURhdGEoYWxpYXNOYW1lKWAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55Pj4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzcGVjXG4gICAqIEByZXR1cm5zIHt0aGlzfVxuICAgKi9cbiAgcXVlcnlEYXRhKHNwZWMpIHtcbiAgICBpZiAoc3BlYyA9PSBudWxsKSByZXR1cm4gdGhpc1xuXG4gICAgdGhpcy5fcXVlcnlEYXRhLnB1c2goLyoqIEB0eXBlIHthbnl9ICovIChzcGVjKSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gUm9vdC1tb2RlbCB3aGVyZSBjb25kaXRpb25zLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBRdWVyeSB3aXRoIG1lcmdlZCB3aGVyZSBjb25kaXRpb25zLlxuICAgKi9cbiAgd2hlcmUoY29uZGl0aW9ucykge1xuICAgIHRoaXMubW9kZWxDbGFzcy5hc3NlcnRGaW5kQnlDb25kaXRpb25zKGNvbmRpdGlvbnMpXG4gICAgY29uc3Qgbm9ybWFsaXplZENvbmRpdGlvbnMgPSBub3JtYWxpemVGaW5kQ29uZGl0aW9ucyhjb25kaXRpb25zKVxuXG4gICAgdGhpcy5fd2hlcmUgPSB7XG4gICAgICAuLi50aGlzLl93aGVyZSxcbiAgICAgIC4uLm5vcm1hbGl6ZWRDb25kaXRpb25zXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3V0aWxzL21vZGVsLXNjb3BlLmpzXCIpLk1vZGVsU2NvcGVEZXNjcmlwdG9yfSBzY29wZURlc2NyaXB0b3IgLSBTY29wZSBkZXNjcmlwdG9yLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBTY29wZWQgcXVlcnkuXG4gICAqL1xuICBzY29wZShzY29wZURlc2NyaXB0b3IpIHtcbiAgICBpZiAoIWlzTW9kZWxTY29wZURlc2NyaXB0b3Ioc2NvcGVEZXNjcmlwdG9yKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2NvcGUoKSBleHBlY3RzIGEgZGVzY3JpcHRvciByZXR1cm5lZCBieSBkZWZpbmVTY29wZSguLi4pLnNjb3BlKC4uLilcIilcbiAgICB9XG5cbiAgICBpZiAoc2NvcGVEZXNjcmlwdG9yLm1vZGVsQ2xhc3MgIT09IHRoaXMubW9kZWxDbGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYXBwbHkgJHtzY29wZURlc2NyaXB0b3IubW9kZWxDbGFzcy5uYW1lfSBzY29wZSB0byAke3RoaXMubW9kZWxDbGFzcy5uYW1lfSBxdWVyeWApXG4gICAgfVxuXG4gICAgY29uc3Qgc2NvcGVkUXVlcnkgPSAvKiogQHR5cGUge3RoaXMgfCB2b2lkfSAqLyAoc2NvcGVEZXNjcmlwdG9yLmNhbGxiYWNrKHtcbiAgICAgIGRyaXZlcjogbnVsbCxcbiAgICAgIG1vZGVsQ2xhc3M6IHRoaXMubW9kZWxDbGFzcyxcbiAgICAgIHF1ZXJ5OiB0aGlzLFxuICAgICAgdGFibGU6IG51bGxcbiAgICB9LCAuLi5zY29wZURlc2NyaXB0b3Iuc2NvcGVBcmdzKSlcblxuICAgIHJldHVybiBzY29wZWRRdWVyeSB8fCB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXJhbXMgLSBSYW5zYWNrLXN0eWxlIHBhcmFtcyBoYXNoLiBTdXBwb3J0cyBgc2Aga2V5IGZvciBzb3J0aW5nIChlLmcuLCBge3M6IFwibmFtZSBhc2NcIn1gKS5cbiAgICogQHJldHVybnMge3RoaXN9IC0gUXVlcnkgd2l0aCBSYW5zYWNrIGZpbHRlcnMgYW5kIHNvcnQgYXBwbGllZC5cbiAgICovXG4gIHJhbnNhY2socGFyYW1zKSB7XG4gICAgY29uc3Qge3MsIC4uLmZpbHRlclBhcmFtc30gPSBwYXJhbXNcbiAgICBjb25zdCBjb25kaXRpb25zID0gbm9ybWFsaXplUmFuc2Fja1BhcmFtcyh0aGlzLm1vZGVsQ2xhc3MsIGZpbHRlclBhcmFtcylcblxuICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcbiAgICAgIGFwcGx5RnJvbnRlbmRSYW5zYWNrQ29uZGl0aW9uKHtjb25kaXRpb24sIHF1ZXJ5OiB0aGlzfSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHMgPT09IFwic3RyaW5nXCIgJiYgcy50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydHMgPSBwYXJzZVJhbnNhY2tTb3J0KHRoaXMubW9kZWxDbGFzcywgcylcblxuICAgICAgZm9yIChjb25zdCBzb3J0RGVmIG9mIHNvcnRzKSB7XG4gICAgICAgIHRoaXMuc29ydChbW3NvcnREZWYuYXR0cmlidXRlLCBzb3J0RGVmLmRpcmVjdGlvbl1dKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW3JlcXVpcmVkQXR0cmlidXRlc10gLSBFeHRyYSByZXF1aXJlZCBhdHRyaWJ1dGVzIGZvciB0aGUgcm9vdCBtb2RlbC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gLSBTZWxlY3QgbWFwIHdpdGggcmVxdWlyZWQgcm9vdCBhdHRyaWJ1dGVzIG1lcmdlZCB3aGVuIHJvb3Qgc2VsZWN0IGV4aXN0cy5cbiAgICovXG4gIHNlbGVjdFdpdGhSZXF1aXJlZFJvb3RBdHRyaWJ1dGVzKHJlcXVpcmVkQXR0cmlidXRlcyA9IFtdKSB7XG4gICAgY29uc3Qgcm9vdE1vZGVsTmFtZSA9IHRoaXMubW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICAgIGNvbnN0IHNlbGVjdE1hcCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSAqLyAodGhpcy5fc2VsZWN0KVxuICAgIGNvbnN0IGV4aXN0aW5nUm9vdEF0dHJpYnV0ZXMgPSBzZWxlY3RNYXBbcm9vdE1vZGVsTmFtZV1cblxuICAgIGlmICghZXhpc3RpbmdSb290QXR0cmlidXRlcykge1xuICAgICAgcmV0dXJuIHNlbGVjdE1hcFxuICAgIH1cblxuICAgIGNvbnN0IHJvb3RQcmltYXJ5S2V5ID0gdGhpcy5tb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNlbGVjdE1hcCxcbiAgICAgIFtyb290TW9kZWxOYW1lXTogQXJyYXkuZnJvbShuZXcgU2V0KFtyb290UHJpbWFyeUtleSwgLi4uZXhpc3RpbmdSb290QXR0cmlidXRlcywgLi4ucmVxdWlyZWRBdHRyaWJ1dGVzXSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZCB8IHN0cmluZyB8IEFycmF5PHN0cmluZyB8IGltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmQ+fSBwcmVsb2FkIC0gUHJlbG9hZCB0byBtZXJnZS5cbiAgICogQHJldHVybnMge3RoaXN9IC0gUXVlcnkgd2l0aCBtZXJnZWQgcHJlbG9hZHMuXG4gICAqL1xuICBwcmVsb2FkKHByZWxvYWQpIHtcbiAgICBtZXJnZVByZWxvYWRSZWNvcmQodGhpcy5fcHJlbG9hZCwgbm9ybWFsaXplUHJlbG9hZChwcmVsb2FkKSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IHN0cmluZz4gfCBzdHJpbmcgfCBzdHJpbmdbXX0gc2VsZWN0IC0gTW9kZWwtYXdhcmUgYXR0cmlidXRlIHNlbGVjdCBtYXAgb3Igcm9vdC1tb2RlbCBzaG9ydGhhbmQuXG4gICAqIEByZXR1cm5zIHt0aGlzfSAtIFF1ZXJ5IHdpdGggbWVyZ2VkIHNlbGVjdGVkIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBzZWxlY3Qoc2VsZWN0KSB7XG4gICAgbWVyZ2VTZWxlY3RSZWNvcmQodGhpcy5fc2VsZWN0LCBub3JtYWxpemVTZWxlY3Qoc2VsZWN0LCB0aGlzLm1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCkpKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWtlIGBzZWxlY3QoLi4uKWAsIGJ1dCBrZWVwcyB0aGUgZGVmYXVsdCBzZXJpYWxpemVkIGF0dHJpYnV0ZXMgYW5kIGxvYWRzXG4gICAqIHRoZSBnaXZlbiBleHRyYXMgaW4gYWRkaXRpb24gKGZvciBleGFtcGxlIGF0dHJpYnV0ZXMgZGVjbGFyZWRcbiAgICogYHNlbGVjdGVkQnlEZWZhdWx0OiBmYWxzZWApLiBLZXllZCBieSBtb2RlbCBuYW1lLCB3aXRoIHJvb3QtbW9kZWwgc2hvcnRoYW5kLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdIHwgc3RyaW5nPiB8IHN0cmluZyB8IHN0cmluZ1tdfSBzZWxlY3QgLSBFeHRyYSBhdHRyaWJ1dGVzIHRvIGxvYWQsIGtleWVkIGJ5IG1vZGVsIG5hbWUgb3Igcm9vdC1tb2RlbCBzaG9ydGhhbmQuXG4gICAqIEByZXR1cm5zIHt0aGlzfSAtIFF1ZXJ5IHdpdGggbWVyZ2VkIGV4dHJhIHNlbGVjdGVkIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBzZWxlY3RzRXh0cmEoc2VsZWN0KSB7XG4gICAgbWVyZ2VTZWxlY3RSZWNvcmQodGhpcy5fc2VsZWN0c0V4dHJhLCBub3JtYWxpemVTZWxlY3Qoc2VsZWN0LCB0aGlzLm1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCkpKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT4gfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gam9pbnMgLSBSZWxhdGlvbnNoaXAgZGVzY3JpcHRvciBqb2lucy5cbiAgICogQHJldHVybnMge3RoaXN9IC0gUXVlcnkgd2l0aCBtZXJnZWQgam9pbnMuXG4gICAqL1xuICBqb2lucyhqb2lucykge1xuICAgIG1lcmdlSm9pblJlY29yZCh0aGlzLl9qb2lucywgbm9ybWFsaXplSm9pbnMoam9pbnMpKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoIC0gUmVsYXRpb25zaGlwIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW4gLSBDb2x1bW4gb3IgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7XCJlcVwiIHwgXCJsaWtlXCIgfCBcIm5vdEVxXCIgfCBcImd0XCIgfCBcImd0ZXFcIiB8IFwibHRcIiB8IFwibHRlcVwiIHwgXCI+XCIgfCBcIj49XCIgfCBcIjxcIiB8IFwiPD1cIn0gb3BlcmF0b3IgLSBTZWFyY2ggb3BlcmF0b3IuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFNlYXJjaCB2YWx1ZS5cbiAgICogQHJldHVybnMge3RoaXN9IC0gUXVlcnkgd2l0aCBhcHBlbmRlZCBzZWFyY2guXG4gICAqL1xuICBzZWFyY2gocGF0aCwgY29sdW1uLCBvcGVyYXRvciwgdmFsdWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc2VhcmNoIHBhdGggbXVzdCBiZSBhbiBhcnJheSwgZ290OiAke3R5cGVvZiBwYXRofWApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwYXRoRW50cnkgb2YgcGF0aCkge1xuICAgICAgaWYgKHR5cGVvZiBwYXRoRW50cnkgIT09IFwic3RyaW5nXCIgfHwgcGF0aEVudHJ5Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2VhcmNoIHBhdGggZW50cmllcyBtdXN0IGJlIG5vbi1lbXB0eSBzdHJpbmdzXCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb2x1bW4gIT09IFwic3RyaW5nXCIgfHwgY29sdW1uLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlYXJjaCBjb2x1bW4gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmdcIilcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wZXJhdG9yICE9PSBcInN0cmluZ1wiIHx8IG9wZXJhdG9yLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlYXJjaCBvcGVyYXRvciBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ1wiKVxuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRPcGVyYXRvciA9IG5vcm1hbGl6ZVNlYXJjaE9wZXJhdG9yKG9wZXJhdG9yKVxuXG4gICAgdGhpcy5fc2VhcmNoZXMucHVzaCh7XG4gICAgICBjb2x1bW4sXG4gICAgICBvcGVyYXRvcjogbm9ybWFsaXplZE9wZXJhdG9yLFxuICAgICAgcGF0aDogWy4uLnBhdGhdLFxuICAgICAgdmFsdWVcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdIHwgW3N0cmluZywgc3RyaW5nXSB8IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+IHwgUmVjb3JkPHN0cmluZywgYW55PiB8IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBzb3J0IC0gU29ydCBkZWZpbml0aW9uKHMpLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBRdWVyeSB3aXRoIGFwcGVuZGVkIHNvcnQgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBzb3J0KHNvcnQpIHtcbiAgICB0aGlzLl9zb3J0LnB1c2goLi4ubm9ybWFsaXplU29ydChzb3J0KSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXSB8IFtzdHJpbmcsIHN0cmluZ10gfCBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gb3JkZXIgLSBPcmRlciBkZWZpbml0aW9uKHMpLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBRdWVyeSB3aXRoIGFwcGVuZGVkIHNvcnQgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBvcmRlcihvcmRlcikge1xuICAgIHJldHVybiB0aGlzLnNvcnQob3JkZXIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gZ3JvdXAgLSBHcm91cCBkZWZpbml0aW9uKHMpLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBRdWVyeSB3aXRoIGFwcGVuZGVkIGdyb3VwIGRlZmluaXRpb25zLlxuICAgKi9cbiAgZ3JvdXAoZ3JvdXApIHtcbiAgICB0aGlzLl9ncm91cC5wdXNoKC4uLm5vcm1hbGl6ZUdyb3VwKGdyb3VwKSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufSBbdmFsdWVdIC0gV2hldGhlciB0byByZXF1ZXN0IGRpc3RpbmN0IHJvd3MuXG4gICAqIEByZXR1cm5zIHt0aGlzfSAtIFF1ZXJ5IHdpdGggZGlzdGluY3QgZmxhZy5cbiAgICovXG4gIGRpc3RpbmN0KHZhbHVlID0gdHJ1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGRpc3RpbmN0IG11c3QgYmUgYSBib29sZWFuLCBnb3Q6ICR7dHlwZW9mIHZhbHVlfWApXG4gICAgfVxuXG4gICAgdGhpcy5fZGlzdGluY3QgPSB2YWx1ZVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBNYXhpbXVtIG51bWJlciBvZiByZWNvcmRzLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBRdWVyeSB3aXRoIGxpbWl0LlxuICAgKi9cbiAgbGltaXQodmFsdWUpIHtcbiAgICB0aGlzLl9saW1pdCA9IG5vcm1hbGl6ZUludGVnZXJBcmd1bWVudCh2YWx1ZSwgXCJsaW1pdFwiLCB7bWluOiAwfSlcbiAgICB0aGlzLl9wYWdlID0gbnVsbFxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBOdW1iZXIgb2YgcmVjb3JkcyB0byBza2lwLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBRdWVyeSB3aXRoIG9mZnNldC5cbiAgICovXG4gIG9mZnNldCh2YWx1ZSkge1xuICAgIHRoaXMuX29mZnNldCA9IG5vcm1hbGl6ZUludGVnZXJBcmd1bWVudCh2YWx1ZSwgXCJvZmZzZXRcIiwge21pbjogMH0pXG4gICAgdGhpcy5fcGFnZSA9IG51bGxcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VOdW1iZXIgLSAxLWJhc2VkIHBhZ2UgbnVtYmVyLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBRdWVyeSB3aXRoIHBhZ2UgYXBwbGllZC5cbiAgICovXG4gIHBhZ2UocGFnZU51bWJlcikge1xuICAgIHRoaXMuX3BhZ2UgPSBub3JtYWxpemVJbnRlZ2VyQXJndW1lbnQocGFnZU51bWJlciwgXCJwYWdlXCIsIHttaW46IDF9KVxuICAgIGNvbnN0IHBhZ2VTaXplID0gdGhpcy5fcGVyUGFnZSB8fCAzMFxuXG4gICAgdGhpcy5fbGltaXQgPSBwYWdlU2l6ZVxuICAgIHRoaXMuX29mZnNldCA9ICh0aGlzLl9wYWdlIC0gMSkgKiBwYWdlU2l6ZVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcGVyUGFnZSAtIFBhZ2Ugc2l6ZS5cbiAgICogQHJldHVybnMge3RoaXN9IC0gUXVlcnkgd2l0aCBwZXItcGFnZSBhcHBsaWVkLlxuICAgKi9cbiAgcGVyUGFnZShwZXJQYWdlKSB7XG4gICAgdGhpcy5fcGVyUGFnZSA9IG5vcm1hbGl6ZUludGVnZXJBcmd1bWVudChwZXJQYWdlLCBcInBlclBhZ2VcIiwge21pbjogMX0pXG5cbiAgICBpZiAodGhpcy5fcGFnZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fbGltaXQgPSB0aGlzLl9wZXJQYWdlXG4gICAgICB0aGlzLl9vZmZzZXQgPSAodGhpcy5fcGFnZSAtIDEpICogdGhpcy5fcGVyUGFnZVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxRdWVyeTxUPn0gLSBDbG9uZWQgcXVlcnkgaW5zdGFuY2UuXG4gICAqL1xuICBjbG9uZSgpIHtcbiAgICBjb25zdCBuZXdRdWVyeSA9IC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAqLyAobmV3IEZyb250ZW5kTW9kZWxRdWVyeSh7XG4gICAgICBtb2RlbENsYXNzOiB0aGlzLm1vZGVsQ2xhc3MsXG4gICAgICBwcmVsb2FkOiBub3JtYWxpemVQcmVsb2FkKHRoaXMuX3ByZWxvYWQpXG4gICAgfSkpXG5cbiAgICBuZXdRdWVyeS5fam9pbnMgPSBub3JtYWxpemVKb2lucyh0aGlzLl9qb2lucylcbiAgICBuZXdRdWVyeS5fd2hlcmUgPSBub3JtYWxpemVGaW5kQ29uZGl0aW9ucyh0aGlzLl93aGVyZSlcbiAgICBuZXdRdWVyeS5fc2VhcmNoZXMgPSB0aGlzLl9zZWFyY2hlcy5tYXAoKHNlYXJjaCkgPT4gKHtcbiAgICAgIGNvbHVtbjogc2VhcmNoLmNvbHVtbixcbiAgICAgIG9wZXJhdG9yOiBzZWFyY2gub3BlcmF0b3IsXG4gICAgICBwYXRoOiBbLi4uc2VhcmNoLnBhdGhdLFxuICAgICAgdmFsdWU6IHNlYXJjaC52YWx1ZVxuICAgIH0pKVxuICAgIG5ld1F1ZXJ5Ll9zZWxlY3QgPSBub3JtYWxpemVTZWxlY3QodGhpcy5fc2VsZWN0KVxuICAgIG5ld1F1ZXJ5Ll9zZWxlY3RzRXh0cmEgPSBub3JtYWxpemVTZWxlY3QodGhpcy5fc2VsZWN0c0V4dHJhKVxuICAgIG5ld1F1ZXJ5Ll9zb3J0ID0gdGhpcy5fc29ydC5tYXAoKHNvcnRFbnRyeSkgPT4gKHtcbiAgICAgIGNvbHVtbjogc29ydEVudHJ5LmNvbHVtbixcbiAgICAgIGRpcmVjdGlvbjogc29ydEVudHJ5LmRpcmVjdGlvbixcbiAgICAgIHBhdGg6IFsuLi5zb3J0RW50cnkucGF0aF1cbiAgICB9KSlcbiAgICBuZXdRdWVyeS5fZ3JvdXAgPSB0aGlzLl9ncm91cC5tYXAoKGdyb3VwRW50cnkpID0+ICh7XG4gICAgICBjb2x1bW46IGdyb3VwRW50cnkuY29sdW1uLFxuICAgICAgcGF0aDogWy4uLmdyb3VwRW50cnkucGF0aF1cbiAgICB9KSlcbiAgICBuZXdRdWVyeS5fZGlzdGluY3QgPSB0aGlzLl9kaXN0aW5jdFxuICAgIG5ld1F1ZXJ5Ll9saW1pdCA9IHRoaXMuX2xpbWl0XG4gICAgbmV3UXVlcnkuX29mZnNldCA9IHRoaXMuX29mZnNldFxuICAgIG5ld1F1ZXJ5Ll9wYWdlID0gdGhpcy5fcGFnZVxuICAgIG5ld1F1ZXJ5Ll9wZXJQYWdlID0gdGhpcy5fcGVyUGFnZVxuICAgIG5ld1F1ZXJ5Ll93aXRoQ291bnQgPSB0aGlzLl93aXRoQ291bnQubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIGF0dHJpYnV0ZU5hbWU6IGVudHJ5LmF0dHJpYnV0ZU5hbWUsXG4gICAgICByZWxhdGlvbnNoaXBOYW1lOiBlbnRyeS5yZWxhdGlvbnNoaXBOYW1lLFxuICAgICAgd2hlcmU6IGVudHJ5LndoZXJlID8gey4uLmVudHJ5LndoZXJlfSA6IHVuZGVmaW5lZFxuICAgIH0pKVxuICAgIG5ld1F1ZXJ5Ll9xdWVyeURhdGEgPSB0aGlzLl9xdWVyeURhdGEubWFwKChlbnRyeSkgPT4gKFxuICAgICAgdHlwZW9mIGVudHJ5ID09PSBcInN0cmluZ1wiID8gZW50cnkgOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGVudHJ5KSlcbiAgICApKVxuICAgIG5ld1F1ZXJ5Ll9hYmlsaXRpZXMgPSB0aGlzLl9hYmlsaXRpZXMubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIGFjdGlvbnM6IFsuLi5lbnRyeS5hY3Rpb25zXSxcbiAgICAgIG1vZGVsTmFtZTogZW50cnkubW9kZWxOYW1lXG4gICAgfSkpXG5cbiAgICByZXR1cm4gbmV3UXVlcnlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7VH0gLSBSb290IG1vZGVsIGNsYXNzLiAqL1xuICBnZXRNb2RlbENsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLm1vZGVsQ2xhc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBQYXlsb2FkIHByZWxvYWQgaGFzaCB3aGVuIHByZXNlbnQuXG4gICAqL1xuICBwcmVsb2FkUGF5bG9hZCgpIHtcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fcHJlbG9hZCkubGVuZ3RoID09PSAwKSByZXR1cm4ge31cblxuICAgIHJldHVybiB7cHJlbG9hZDogdGhpcy5fcHJlbG9hZH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBQYXlsb2FkIHdpdGhDb3VudCBhcnJheSB3aGVuIHByZXNlbnQuXG4gICAqL1xuICB3aXRoQ291bnRQYXlsb2FkKCkge1xuICAgIGlmICh0aGlzLl93aXRoQ291bnQubGVuZ3RoID09PSAwKSByZXR1cm4ge31cblxuICAgIHJldHVybiB7XG4gICAgICB3aXRoQ291bnQ6IHRoaXMuX3dpdGhDb3VudC5tYXAoKGVudHJ5KSA9PiAoe1xuICAgICAgICBhdHRyaWJ1dGVOYW1lOiBlbnRyeS5hdHRyaWJ1dGVOYW1lLFxuICAgICAgICByZWxhdGlvbnNoaXBOYW1lOiBlbnRyeS5yZWxhdGlvbnNoaXBOYW1lLFxuICAgICAgICB3aGVyZTogZW50cnkud2hlcmUgfHwgdW5kZWZpbmVkXG4gICAgICB9KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gUGF5bG9hZCBhYmlsaXRpZXMgYXJyYXkgd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgYWJpbGl0aWVzUGF5bG9hZCgpIHtcbiAgICBpZiAodGhpcy5fYWJpbGl0aWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWJpbGl0aWVzOiB0aGlzLl9hYmlsaXRpZXMubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgICAgYWN0aW9uczogWy4uLmVudHJ5LmFjdGlvbnNdLFxuICAgICAgICBtb2RlbE5hbWU6IGVudHJ5Lm1vZGVsTmFtZVxuICAgICAgfSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIFBheWxvYWQgcXVlcnlEYXRhIHNwZWMgd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgcXVlcnlEYXRhUGF5bG9hZCgpIHtcbiAgICBpZiAodGhpcy5fcXVlcnlEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9XG5cbiAgICAvLyBTaW5nbGUgYWNjdW11bGF0ZWQgc3BlYyBnb2VzIG9uIHRoZSB3aXJlIHZlcmJhdGltLiBUaGUgYmFja2VuZFxuICAgIC8vIG5vcm1hbGl6ZXIgYWNjZXB0cyBzdHJpbmcvYXJyYXkvb2JqZWN0IGF0IGVhY2ggbGV2ZWwsIHNvIHdlIGNhblxuICAgIC8vIHNoaXAgbXVsdGlwbGUgYC5xdWVyeURhdGEoLi4uKWAgY2FsbHMgYXMgYW4gYXJyYXkuXG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXJ5RGF0YTogdGhpcy5fcXVlcnlEYXRhLmxlbmd0aCA9PT0gMSA/IHRoaXMuX3F1ZXJ5RGF0YVswXSA6IHRoaXMuX3F1ZXJ5RGF0YVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcmVxdWlyZWRBdHRyaWJ1dGVzXSAtIEV4dHJhIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZm9yIHJvb3QgbW9kZWwgc2VsZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBQYXlsb2FkIHNlbGVjdCBoYXNoIHdoZW4gcHJlc2VudC5cbiAgICovXG4gIHNlbGVjdFBheWxvYWQocmVxdWlyZWRBdHRyaWJ1dGVzID0gW10pIHtcbiAgICBjb25zdCBzZWxlY3QgPSB0aGlzLnNlbGVjdFdpdGhSZXF1aXJlZFJvb3RBdHRyaWJ1dGVzKHJlcXVpcmVkQXR0cmlidXRlcylcblxuICAgIGlmIChPYmplY3Qua2V5cyhzZWxlY3QpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9XG5cbiAgICByZXR1cm4ge3NlbGVjdH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBQYXlsb2FkIHNlbGVjdHNFeHRyYSBoYXNoIHdoZW4gcHJlc2VudC5cbiAgICovXG4gIHNlbGVjdHNFeHRyYVBheWxvYWQoKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3NlbGVjdHNFeHRyYSkubGVuZ3RoID09PSAwKSByZXR1cm4ge31cblxuICAgIHJldHVybiB7c2VsZWN0c0V4dHJhOiB0aGlzLl9zZWxlY3RzRXh0cmF9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gUGF5bG9hZCBzZWFyY2hlcyBhcnJheSB3aGVuIHByZXNlbnQuXG4gICAqL1xuICBzZWFyY2hQYXlsb2FkKCkge1xuICAgIGlmICh0aGlzLl9zZWFyY2hlcy5sZW5ndGggPT09IDApIHJldHVybiB7fVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlYXJjaGVzOiB0aGlzLl9zZWFyY2hlcy5tYXAoKHNlYXJjaCkgPT4gKHtcbiAgICAgICAgY29sdW1uOiBzZWFyY2guY29sdW1uLFxuICAgICAgICBvcGVyYXRvcjogc2VhcmNoLm9wZXJhdG9yLFxuICAgICAgICBwYXRoOiBbLi4uc2VhcmNoLnBhdGhdLFxuICAgICAgICB2YWx1ZTogc2VhcmNoLnZhbHVlXG4gICAgICB9KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gUGF5bG9hZCBqb2lucyBoYXNoIHdoZW4gcHJlc2VudC5cbiAgICovXG4gIGpvaW5zUGF5bG9hZCgpIHtcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fam9pbnMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9XG5cbiAgICByZXR1cm4ge1xuICAgICAgam9pbnM6IG5vcm1hbGl6ZUpvaW5zKHRoaXMuX2pvaW5zKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBQYXlsb2FkIHNvcnQgYXJyYXkgd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgc29ydFBheWxvYWQoKSB7XG4gICAgaWYgKHRoaXMuX3NvcnQubGVuZ3RoID09PSAwKSByZXR1cm4ge31cblxuICAgIHJldHVybiB7XG4gICAgICBzb3J0OiB0aGlzLl9zb3J0Lm1hcCgoc29ydEVudHJ5KSA9PiAoe1xuICAgICAgICBjb2x1bW46IHNvcnRFbnRyeS5jb2x1bW4sXG4gICAgICAgIGRpcmVjdGlvbjogc29ydEVudHJ5LmRpcmVjdGlvbixcbiAgICAgICAgcGF0aDogWy4uLnNvcnRFbnRyeS5wYXRoXVxuICAgICAgfSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIFBheWxvYWQgZ3JvdXAgYXJyYXkgd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgZ3JvdXBQYXlsb2FkKCkge1xuICAgIGlmICh0aGlzLl9ncm91cC5sZW5ndGggPT09IDApIHJldHVybiB7fVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdyb3VwOiB0aGlzLl9ncm91cC5tYXAoKGdyb3VwRW50cnkpID0+ICh7XG4gICAgICAgIGNvbHVtbjogZ3JvdXBFbnRyeS5jb2x1bW4sXG4gICAgICAgIHBhdGg6IFsuLi5ncm91cEVudHJ5LnBhdGhdXG4gICAgICB9KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gUGF5bG9hZCBkaXN0aW5jdCBmbGFnIHdoZW4gZW5hYmxlZC5cbiAgICovXG4gIGRpc3RpbmN0UGF5bG9hZCgpIHtcbiAgICBpZiAoIXRoaXMuX2Rpc3RpbmN0KSByZXR1cm4ge31cblxuICAgIHJldHVybiB7XG4gICAgICBkaXN0aW5jdDogdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBQYXlsb2FkIHdoZXJlIGhhc2ggd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgd2hlcmVQYXlsb2FkKCkge1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl93aGVyZSkubGVuZ3RoID09PSAwKSByZXR1cm4ge31cblxuICAgIHJldHVybiB7XG4gICAgICB3aGVyZTogdGhpcy5fd2hlcmVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gUGF5bG9hZCBwYWdpbmF0aW9uIHBhcmFtcyB3aGVuIHByZXNlbnQuXG4gICAqL1xuICBwYWdpbmF0aW9uUGF5bG9hZCgpIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgY29uc3QgcGF5bG9hZCA9IHt9XG5cbiAgICBpZiAodGhpcy5fbGltaXQgIT09IG51bGwpIHBheWxvYWQubGltaXQgPSB0aGlzLl9saW1pdFxuICAgIGlmICh0aGlzLl9vZmZzZXQgIT09IG51bGwpIHBheWxvYWQub2Zmc2V0ID0gdGhpcy5fb2Zmc2V0XG4gICAgaWYgKHRoaXMuX3BhZ2UgIT09IG51bGwpIHBheWxvYWQucGFnZSA9IHRoaXMuX3BhZ2VcbiAgICBpZiAodGhpcy5fcGVyUGFnZSAhPT0gbnVsbCkgcGF5bG9hZC5wZXJQYWdlID0gdGhpcy5fcGVyUGFnZVxuXG4gICAgcmV0dXJuIHBheWxvYWRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8VD5bXT59IC0gTG9hZGVkIG1vZGVsIGluc3RhbmNlcy5cbiAgICovXG4gIGFzeW5jIGxvYWQoKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJpbmRleFwiLCB7XG4gICAgICAuLi50aGlzLnByZWxvYWRQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLmpvaW5zUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5zZWFyY2hQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLnNlbGVjdFBheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMuc2VsZWN0c0V4dHJhUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5ncm91cFBheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMuZGlzdGluY3RQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLnNvcnRQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLndoZXJlUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy53aXRoQ291bnRQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLmFiaWxpdGllc1BheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMucXVlcnlEYXRhUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5wYWdpbmF0aW9uUGF5bG9hZCgpXG4gICAgfSlcblxuICAgIGlmICghcmVzcG9uc2UgfHwgdHlwZW9mIHJlc3BvbnNlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9iamVjdCByZXNwb25zZSBidXQgZ290OiAke3Jlc3BvbnNlfWApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxzRGF0YSA9IEFycmF5LmlzQXJyYXkocmVzcG9uc2UubW9kZWxzKSA/IHJlc3BvbnNlLm1vZGVscyA6IFtdXG4gICAgLyoqIEB0eXBlIHtJbnN0YW5jZVR5cGU8VD5bXX0gKi9cbiAgICBjb25zdCBtb2RlbHMgPSBtb2RlbHNEYXRhLm1hcCgobW9kZWwpID0+IHRoaXMubW9kZWxDbGFzcy5pbnN0YW50aWF0ZUZyb21SZXNwb25zZShtb2RlbCkpXG5cbiAgICAvLyBTaGFyZSBhIHNpbmdsZSBjb2hvcnQgcmVmZXJlbmNlIGFjcm9zcyBldmVyeSBzaWJsaW5nIHNvIGF1dG8tYmF0Y2gtcHJlbG9hZFxuICAgIC8vIGNhbiBiYXRjaCBsYXp5IHJlbGF0aW9uc2hpcCBhY2Nlc3MgbGF0ZXIuIFNpbmdsZS1yZWNvcmQgbG9va3VwcyBzdGlsbCBmbG93XG4gICAgLy8gdGhyb3VnaCBoZXJlICh3aXRoIGEgY29ob3J0IG9mIG9uZSkgYW5kIGRlZ3JhZGUgY2xlYW5seSB0byBwZXItcmVjb3JkIGxvYWQuXG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiBtb2RlbHMpIHtcbiAgICAgIC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWwpLl9sb2FkQ29ob3J0ID0gbW9kZWxzXG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsc1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPltdPn0gLSBMb2FkZWQgbW9kZWwgaW5zdGFuY2VzLlxuICAgKi9cbiAgYXN5bmMgdG9BcnJheSgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIE51bWJlciBvZiBsb2FkZWQgbW9kZWwgaW5zdGFuY2VzLlxuICAgKi9cbiAgYXN5bmMgY291bnQoKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJpbmRleFwiLCB7XG4gICAgICAuLi50aGlzLmpvaW5zUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5zZWFyY2hQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLmdyb3VwUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5kaXN0aW5jdFBheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMud2hlcmVQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLnBhZ2luYXRpb25QYXlsb2FkKCksXG4gICAgICBjb3VudDogdHJ1ZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3BvbnNlIHx8IHR5cGVvZiByZXNwb25zZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvYmplY3QgcmVzcG9uc2UgYnV0IGdvdDogJHtyZXNwb25zZX1gKVxuICAgIH1cblxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHJlc3BvbnNlLmNvdW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBudW1lcmljIGNvdW50IHJlc3BvbnNlIGJ1dCBnb3Q6ICR7cmVzcG9uc2UuY291bnR9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2UuY291bnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4gfCBudWxsPn0gLSBGaXJzdCBtb2RlbCBtYXRjaGluZyBxdWVyeS5cbiAgICovXG4gIGFzeW5jIGZpcnN0KCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5jbG9uZSgpXG5cbiAgICBpZiAocXVlcnkuX3NvcnQubGVuZ3RoIDwgMSkge1xuICAgICAgcXVlcnkuc29ydChbW3RoaXMubW9kZWxDbGFzcy5wcmltYXJ5S2V5KCksIFwiYXNjXCJdXSlcbiAgICB9XG5cbiAgICBxdWVyeS5saW1pdCgxKVxuXG4gICAgY29uc3QgbW9kZWxzID0gYXdhaXQgcXVlcnkudG9BcnJheSgpXG5cbiAgICByZXR1cm4gbW9kZWxzWzBdIHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4gfCBudWxsPn0gLSBMYXN0IG1vZGVsIG1hdGNoaW5nIHF1ZXJ5LlxuICAgKi9cbiAgYXN5bmMgbGFzdCgpIHtcbiAgICAvLyBXaGVuIHBhZ2luYXRpb24gaXMgYWxyZWFkeSBhcHBsaWVkLCBmZXRjaCB0aGF0IHNjb3BlZCB3aW5kb3cgYW5kIHJldHVybiBpdHMgbGFzdCBpdGVtLlxuICAgIGlmICh0aGlzLl9vZmZzZXQgIT09IG51bGwgfHwgdGhpcy5fcGFnZSAhPT0gbnVsbCB8fCB0aGlzLl9wZXJQYWdlICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnRvQXJyYXkoKVxuXG4gICAgICBpZiAobW9kZWxzLmxlbmd0aCA8IDEpIHJldHVybiBudWxsXG5cbiAgICAgIHJldHVybiBtb2RlbHNbbW9kZWxzLmxlbmd0aCAtIDFdXG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLmNsb25lKClcblxuICAgIGlmIChxdWVyeS5fc29ydC5sZW5ndGggPCAxKSB7XG4gICAgICBxdWVyeS5zb3J0KFtbdGhpcy5tb2RlbENsYXNzLnByaW1hcnlLZXkoKSwgXCJkZXNjXCJdXSlcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkuX3NvcnQgPSBxdWVyeS5fc29ydC5tYXAoKHNvcnRFbnRyeSkgPT4gKHtcbiAgICAgICAgLi4uc29ydEVudHJ5LFxuICAgICAgICBkaXJlY3Rpb246IHJldmVyc2VTb3J0RGlyZWN0aW9uKHNvcnRFbnRyeS5kaXJlY3Rpb24pXG4gICAgICB9KSlcbiAgICB9XG5cbiAgICBxdWVyeS5saW1pdCgxKVxuXG4gICAgY29uc3QgbW9kZWxzID0gYXdhaXQgcXVlcnkudG9BcnJheSgpXG5cbiAgICByZXR1cm4gbW9kZWxzWzBdIHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gey4uLihzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pil9IGNvbHVtbnMgLSBQbHVjayBkZWZpbml0aW9uKHMpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnlbXT59IC0gUGx1Y2tlZCB2YWx1ZXMuXG4gICAqL1xuICBhc3luYyBwbHVjayguLi5jb2x1bW5zKSB7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29sdW1ucyBnaXZlbiB0byBwbHVja1wiKVxuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRQbHVjayA9IG5vcm1hbGl6ZVBsdWNrKGNvbHVtbnMubGVuZ3RoID09PSAxID8gY29sdW1uc1swXSA6IGNvbHVtbnMpXG4gICAgY29uc3QgdmFsaWRhdGVkUGx1Y2sgPSB2YWxpZGF0ZVBsdWNrRGVmaW5pdGlvbnMoe1xuICAgICAgbW9kZWxDbGFzczogdGhpcy5tb2RlbENsYXNzLFxuICAgICAgcGx1Y2s6IG5vcm1hbGl6ZWRQbHVja1xuICAgIH0pXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJpbmRleFwiLCB7XG4gICAgICAuLi50aGlzLmpvaW5zUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5zZWFyY2hQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLmdyb3VwUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5kaXN0aW5jdFBheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMuc29ydFBheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMud2hlcmVQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLnBhZ2luYXRpb25QYXlsb2FkKCksXG4gICAgICBwbHVjazogdmFsaWRhdGVkUGx1Y2tcbiAgICB9KVxuXG4gICAgaWYgKCFyZXNwb25zZSB8fCB0eXBlb2YgcmVzcG9uc2UgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb2JqZWN0IHJlc3BvbnNlIGJ1dCBnb3Q6ICR7cmVzcG9uc2V9YClcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzcG9uc2UudmFsdWVzKSkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlLnZhbHVlc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSBpZCAtIFJlY29yZCBpZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn0gLSBGb3VuZCBtb2RlbC5cbiAgICovXG4gIGFzeW5jIGZpbmQoaWQpIHtcbiAgICBjb25zdCBwayA9IHRoaXMubW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZmluZEJ5KHtbcGtdOiBpZH0pXG5cbiAgICBpZiAoIW1vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5tb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpfSBub3QgZm91bmQgd2l0aCAke3BrfT0ke2lkfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gQ29uZGl0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD59IC0gRm91bmQgbW9kZWwgb3IgbnVsbC5cbiAgICovXG4gIGFzeW5jIGZpbmRCeShjb25kaXRpb25zKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENvbmRpdGlvbnMgPSB0aGlzLnZhbGlkYXRlZFN0cnVjdHVyZWRDb25kaXRpb25zKGNvbmRpdGlvbnMpXG4gICAgY29uc3QgbWVyZ2VkV2hlcmUgPSB7XG4gICAgICAuLi50aGlzLl93aGVyZSxcbiAgICAgIC4uLm5vcm1hbGl6ZWRDb25kaXRpb25zXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJpbmRleFwiLCB7XG4gICAgICAuLi50aGlzLnByZWxvYWRQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLmpvaW5zUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5zZWFyY2hQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLnNlbGVjdFBheWxvYWQoT2JqZWN0LmtleXMobWVyZ2VkV2hlcmUpKSxcbiAgICAgIC4uLnRoaXMuc2VsZWN0c0V4dHJhUGF5bG9hZCgpLFxuICAgICAgLi4udGhpcy5ncm91cFBheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMuZGlzdGluY3RQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLnNvcnRQYXlsb2FkKCksXG4gICAgICAuLi50aGlzLmFiaWxpdGllc1BheWxvYWQoKSxcbiAgICAgIC4uLnRoaXMucGFnaW5hdGlvblBheWxvYWQoKSxcbiAgICAgIHdoZXJlOiBtZXJnZWRXaGVyZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3BvbnNlIHx8IHR5cGVvZiByZXNwb25zZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvYmplY3QgcmVzcG9uc2UgYnV0IGdvdDogJHtyZXNwb25zZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVscyA9IEFycmF5LmlzQXJyYXkocmVzcG9uc2UubW9kZWxzKSA/IHJlc3BvbnNlLm1vZGVscyA6IFtdXG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsRGF0YSBvZiBtb2RlbHMpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbENsYXNzLmluc3RhbnRpYXRlRnJvbVJlc3BvbnNlKG1vZGVsRGF0YSlcblxuICAgICAgaWYgKHRoaXMubW9kZWxDbGFzcy5tYXRjaGVzRmluZEJ5Q29uZGl0aW9ucyhtb2RlbCwgbWVyZ2VkV2hlcmUpKSB7XG4gICAgICAgIHJldHVybiBtb2RlbFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gQ29uZGl0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn0gLSBGb3VuZCBtb2RlbC5cbiAgICovXG4gIGFzeW5jIGZpbmRCeU9yRmFpbChjb25kaXRpb25zKSB7XG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLmZpbmRCeShjb25kaXRpb25zKVxuXG4gICAgaWYgKCFtb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubW9kZWxDbGFzcy5uYW1lfSBub3QgZm91bmQgZm9yIGNvbmRpdGlvbnM6ICR7c2VyaWFsaXplRmluZENvbmRpdGlvbnMoY29uZGl0aW9ucyl9YClcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kZWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmRpdGlvbnMgLSBDb25kaXRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4+fSAtIEV4aXN0aW5nIG9yIGluaXRpYWxpemVkIG1vZGVsLlxuICAgKi9cbiAgYXN5bmMgZmluZE9ySW5pdGlhbGl6ZUJ5KGNvbmRpdGlvbnMpIHtcbiAgICBjb25zdCBub3JtYWxpemVkQ29uZGl0aW9ucyA9IHRoaXMudmFsaWRhdGVkU3RydWN0dXJlZENvbmRpdGlvbnMoY29uZGl0aW9ucylcbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZmluZEJ5KGNvbmRpdGlvbnMpXG5cbiAgICBpZiAobW9kZWwpIHJldHVybiBtb2RlbFxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7SW5zdGFuY2VUeXBlPFQ+fSAqLyAobmV3IHRoaXMubW9kZWxDbGFzcyhub3JtYWxpemVkQ29uZGl0aW9ucykpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gQ29uZGl0aW9ucy5cbiAgICogQHBhcmFtIHsobW9kZWw6IEluc3RhbmNlVHlwZTxUPikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWR9IFtjYWxsYmFja10gLSBPcHRpb25hbCBjYWxsYmFjayBiZWZvcmUgc2F2ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn0gLSBFeGlzdGluZyBvciBuZXdseSBjcmVhdGVkIG1vZGVsLlxuICAgKi9cbiAgYXN5bmMgZmluZE9yQ3JlYXRlQnkoY29uZGl0aW9ucywgY2FsbGJhY2spIHtcbiAgICBjb25zdCBub3JtYWxpemVkQ29uZGl0aW9ucyA9IHRoaXMudmFsaWRhdGVkU3RydWN0dXJlZENvbmRpdGlvbnMoY29uZGl0aW9ucylcbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZmluZEJ5KGNvbmRpdGlvbnMpXG5cbiAgICBpZiAobW9kZWwpIHJldHVybiBtb2RlbFxuXG4gICAgY29uc3QgbmV3TW9kZWwgPSAvKiogQHR5cGUge0luc3RhbmNlVHlwZTxUPn0gKi8gKG5ldyB0aGlzLm1vZGVsQ2xhc3Mobm9ybWFsaXplZENvbmRpdGlvbnMpKVxuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBhd2FpdCBjYWxsYmFjayhuZXdNb2RlbClcbiAgICB9XG5cbiAgICBhd2FpdCBuZXdNb2RlbC5zYXZlKClcblxuICAgIHJldHVybiBuZXdNb2RlbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZGl0aW9ucyAtIENhbmRpZGF0ZSBzdHJ1Y3R1cmVkIGNvbmRpdGlvbnMuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIFZhbGlkYXRlZCBhbmQgbm9ybWFsaXplZCBjb25kaXRpb25zLlxuICAgKi9cbiAgdmFsaWRhdGVkU3RydWN0dXJlZENvbmRpdGlvbnMoY29uZGl0aW9ucykge1xuICAgIHRoaXMubW9kZWxDbGFzcy5hc3NlcnRGaW5kQnlDb25kaXRpb25zKGNvbmRpdGlvbnMpXG5cbiAgICByZXR1cm4gbm9ybWFsaXplRmluZENvbmRpdGlvbnMoY29uZGl0aW9ucylcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vYmFzZS5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gRnJvbnRlbmQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxQcm9qZWN0aW9uT3B0aW9uc30gW29wdGlvbnNdIC0gUHJvamVjdGlvbiBvcHRpb25zLlxuICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxQcm9qZWN0aW9uUGF5bG9hZH0gLSBOb3JtYWxpemVkIGZyb250ZW5kLW1vZGVsIHByb2plY3Rpb24gcGF5bG9hZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb250ZW5kTW9kZWxQcm9qZWN0aW9uUGF5bG9hZChtb2RlbENsYXNzLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgcXVlcnkgPSBuZXcgRnJvbnRlbmRNb2RlbFF1ZXJ5KHttb2RlbENsYXNzfSlcblxuICBpZiAob3B0aW9ucy5zZWxlY3QgIT09IHVuZGVmaW5lZCkgcXVlcnkuc2VsZWN0KG9wdGlvbnMuc2VsZWN0KVxuICBpZiAob3B0aW9ucy5zZWxlY3RzRXh0cmEgIT09IHVuZGVmaW5lZCkgcXVlcnkuc2VsZWN0c0V4dHJhKG9wdGlvbnMuc2VsZWN0c0V4dHJhKVxuICBpZiAob3B0aW9ucy5wcmVsb2FkICE9PSB1bmRlZmluZWQpIHF1ZXJ5LnByZWxvYWQob3B0aW9ucy5wcmVsb2FkKVxuICBpZiAob3B0aW9ucy53aXRoQ291bnQgIT09IHVuZGVmaW5lZCkgcXVlcnkud2l0aENvdW50KG9wdGlvbnMud2l0aENvdW50KVxuICBpZiAob3B0aW9ucy5hYmlsaXRpZXMgIT09IHVuZGVmaW5lZCkgcXVlcnkuYWJpbGl0aWVzKG9wdGlvbnMuYWJpbGl0aWVzKVxuICBpZiAob3B0aW9ucy5xdWVyeURhdGEgIT09IHVuZGVmaW5lZCkgcXVlcnkucXVlcnlEYXRhKG9wdGlvbnMucXVlcnlEYXRhKVxuXG4gIHJldHVybiB7XG4gICAgLi4ucXVlcnkucHJlbG9hZFBheWxvYWQoKSxcbiAgICAuLi5xdWVyeS5zZWxlY3RQYXlsb2FkKCksXG4gICAgLi4ucXVlcnkuc2VsZWN0c0V4dHJhUGF5bG9hZCgpLFxuICAgIC4uLnF1ZXJ5LndpdGhDb3VudFBheWxvYWQoKSxcbiAgICAuLi5xdWVyeS5hYmlsaXRpZXNQYXlsb2FkKCksXG4gICAgLi4ucXVlcnkucXVlcnlEYXRhUGF5bG9hZCgpXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3V0aWxzL3JhbnNhY2suanNcIikuUmFuc2Fja0NvbmRpdGlvbn0gYXJncy5jb25kaXRpb24gLSBOb3JtYWxpemVkIFJhbnNhY2sgY29uZGl0aW9uLlxuICogQHBhcmFtIHtGcm9udGVuZE1vZGVsUXVlcnk8YW55Pn0gYXJncy5xdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFwcGx5RnJvbnRlbmRSYW5zYWNrQ29uZGl0aW9uKHtjb25kaXRpb24sIHF1ZXJ5fSkge1xuICBpZiAoY29uZGl0aW9uLnByZWRpY2F0ZSA9PT0gXCJudWxsXCIpIHtcbiAgICBxdWVyeS5zZWFyY2goY29uZGl0aW9uLnBhdGgsIGNvbmRpdGlvbi5hdHRyaWJ1dGVOYW1lLCBjb25kaXRpb24udmFsdWUgPyBcImVxXCIgOiBcIm5vdEVxXCIsIG51bGwpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoY29uZGl0aW9uLnByZWRpY2F0ZSA9PT0gXCJlcVwiIHx8IGNvbmRpdGlvbi5wcmVkaWNhdGUgPT09IFwiaW5cIikge1xuICAgIHF1ZXJ5LnNlYXJjaChjb25kaXRpb24ucGF0aCwgY29uZGl0aW9uLmF0dHJpYnV0ZU5hbWUsIFwiZXFcIiwgY29uZGl0aW9uLnZhbHVlKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGNvbmRpdGlvbi5wcmVkaWNhdGUgPT09IFwibm90X2VxXCIgfHwgY29uZGl0aW9uLnByZWRpY2F0ZSA9PT0gXCJub3RfaW5cIikge1xuICAgIHF1ZXJ5LnNlYXJjaChjb25kaXRpb24ucGF0aCwgY29uZGl0aW9uLmF0dHJpYnV0ZU5hbWUsIFwibm90RXFcIiwgY29uZGl0aW9uLnZhbHVlKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGNvbmRpdGlvbi5wcmVkaWNhdGUgPT09IFwiZ3RcIiB8fCBjb25kaXRpb24ucHJlZGljYXRlID09PSBcImd0ZXFcIiB8fCBjb25kaXRpb24ucHJlZGljYXRlID09PSBcImx0XCIgfHwgY29uZGl0aW9uLnByZWRpY2F0ZSA9PT0gXCJsdGVxXCIpIHtcbiAgICBxdWVyeS5zZWFyY2goY29uZGl0aW9uLnBhdGgsIGNvbmRpdGlvbi5hdHRyaWJ1dGVOYW1lLCBjb25kaXRpb24ucHJlZGljYXRlLCBjb25kaXRpb24udmFsdWUpXG4gICAgcmV0dXJuXG4gIH1cblxuICBxdWVyeS5zZWFyY2goY29uZGl0aW9uLnBhdGgsIGNvbmRpdGlvbi5hdHRyaWJ1dGVOYW1lLCBcImxpa2VcIiwgZnJvbnRlbmRSYW5zYWNrTGlrZVZhbHVlKGNvbmRpdGlvbikpXG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi91dGlscy9yYW5zYWNrLmpzXCIpLlJhbnNhY2tDb25kaXRpb259IGNvbmRpdGlvbiAtIFJhbnNhY2sgY29uZGl0aW9uLlxuICogQHJldHVybnMge3N0cmluZ30gLSBTUUwtbGlrZSBwYXR0ZXJuLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZFJhbnNhY2tMaWtlVmFsdWUoY29uZGl0aW9uKSB7XG4gIGlmIChjb25kaXRpb24ucHJlZGljYXRlID09PSBcImNvbnRcIikgcmV0dXJuIGAlJHtjb25kaXRpb24udmFsdWV9JWBcbiAgaWYgKGNvbmRpdGlvbi5wcmVkaWNhdGUgPT09IFwic3RhcnRcIikgcmV0dXJuIGAke2NvbmRpdGlvbi52YWx1ZX0lYFxuICBpZiAoY29uZGl0aW9uLnByZWRpY2F0ZSA9PT0gXCJlbmRcIikgcmV0dXJuIGAlJHtjb25kaXRpb24udmFsdWV9YFxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZnJvbnRlbmQgcmFuc2FjayBwcmVkaWNhdGU6ICR7Y29uZGl0aW9uLnByZWRpY2F0ZX1gKVxufVxuIl19
|