@cdktn/provider-schema 0.25.0-pre.4 → 0.25.0-pre.41
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/build/__tests__/cache.test.js +18 -8
- package/build/__tests__/provider-schema.test.js +59 -8
- package/build/__tests__/provider-schema.unit.test.js +325 -1
- package/build/__tests__/read-emission-gap-warning.unit.test.js +18 -8
- package/build/cache.js +19 -10
- package/build/emission-check.js +22 -12
- package/build/provider-schema.d.ts +20 -1
- package/build/provider-schema.d.ts.map +1 -1
- package/build/provider-schema.js +218 -16
- package/build/read.js +3 -3
- package/build/util.d.ts +0 -3
- package/build/util.d.ts.map +1 -1
- package/build/util.js +20 -10
- package/package.json +5 -4
- package/src/__tests__/__snapshots__/provider-schema.test.ts.snap +69 -0
- package/src/__tests__/fixtures/local-json-module-provider-aliases/module.tf.json +21 -0
- package/src/__tests__/fixtures/local-mixed-module-provider-aliases/aliases.tf.json +10 -0
- package/src/__tests__/fixtures/local-mixed-module-provider-aliases/module.tf +22 -0
- package/src/__tests__/fixtures/local-module-provider-aliases/module.tf +24 -0
package/build/emission-check.js
CHANGED
|
@@ -15,15 +15,28 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.
|
|
36
|
+
exports.SCHEMA_EMISSION_FAMILY_LABELS = exports.SCHEMA_EMISSION_BOUNDARIES = void 0;
|
|
37
|
+
exports.checkSchemaEmissionGaps = checkSchemaEmissionGaps;
|
|
38
|
+
exports.checkSchemaEmissionGapFamilies = checkSchemaEmissionGapFamilies;
|
|
39
|
+
exports.suggestedEmittingCliVersions = suggestedEmittingCliVersions;
|
|
27
40
|
// Copyright (c) HashiCorp, Inc
|
|
28
41
|
// SPDX-License-Identifier: MPL-2.0
|
|
29
42
|
const semver = __importStar(require("semver"));
|
|
@@ -70,7 +83,6 @@ exports.SCHEMA_EMISSION_FAMILY_LABELS = {
|
|
|
70
83
|
function checkSchemaEmissionGaps(cli, targets) {
|
|
71
84
|
return checkSchemaEmissionGapFamilies(cli, targets).map((family) => exports.SCHEMA_EMISSION_FAMILY_LABELS[family]);
|
|
72
85
|
}
|
|
73
|
-
exports.checkSchemaEmissionGaps = checkSchemaEmissionGaps;
|
|
74
86
|
/**
|
|
75
87
|
* Same as checkSchemaEmissionGaps, but returns the raw family keys so
|
|
76
88
|
* callers can also compute a remedy (see suggestedEmittingCliVersions).
|
|
@@ -109,7 +121,6 @@ function checkSchemaEmissionGapFamilies(cli, targets) {
|
|
|
109
121
|
}
|
|
110
122
|
return gaps;
|
|
111
123
|
}
|
|
112
|
-
exports.checkSchemaEmissionGapFamilies = checkSchemaEmissionGapFamilies;
|
|
113
124
|
/**
|
|
114
125
|
* The lowest CLI version per product whose `providers schema -json` emits
|
|
115
126
|
* every one of the given families — the remedy to suggest alongside the
|
|
@@ -128,5 +139,4 @@ function suggestedEmittingCliVersions(families) {
|
|
|
128
139
|
.filter((part) => part !== undefined)
|
|
129
140
|
.join(" / ");
|
|
130
141
|
}
|
|
131
|
-
exports.suggestedEmittingCliVersions = suggestedEmittingCliVersions;
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1pc3Npb24tY2hlY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW1pc3Npb24tY2hlY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLCtDQUFpQztBQXFCakMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFVLENBQUM7QUFHM0Q7Ozs7Ozs7Ozs7OztHQVlHO0FBQ1UsUUFBQSwwQkFBMEIsR0FHbkM7SUFDRixTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDcEQsMEJBQTBCLEVBQUUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7SUFDdkUsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0lBQ3ZELHlCQUF5QixFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0NBQ3ZFLENBQUM7QUFFVyxRQUFBLDZCQUE2QixHQUd0QztJQUNGLFNBQVMsRUFBRSxvQkFBb0I7SUFDL0IsMEJBQTBCLEVBQUUscUJBQXFCO0lBQ2pELFVBQVUsRUFBRSx1QkFBdUI7SUFDbkMseUJBQXlCLEVBQUUsbUJBQW1CO0NBQy9DLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQ3JDLEdBQXdCLEVBQ3hCLE9BQWdDO0lBRWhDLE9BQU8sOEJBQThCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FDckQsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLHFDQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUNsRCxDQUFDO0FBQ0osQ0FBQztBQVBELDBEQU9DO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQiw4QkFBOEIsQ0FDNUMsR0FBd0IsRUFDeEIsT0FBZ0M7SUFFaEMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdEQsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLElBQXFCLENBQUM7SUFFN0MsTUFBTSxJQUFJLEdBQTJCLEVBQUUsQ0FBQztJQUV4QyxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQzlCLGtDQUEwQixDQUNELEVBQUUsQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxrQ0FBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFdBQVc7WUFBRSxTQUFTO1FBRTNCLCtEQUErRDtRQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQztZQUFFLFNBQVM7UUFFbkQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzlDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMvQixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxRCxNQUFNLGNBQWMsR0FBRyxLQUFLLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ3hELENBQUM7WUFBQyxXQUFNLENBQUM7Z0JBQ1AsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLE1BQU07WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFuQ0Qsd0VBbUNDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsNEJBQTRCLENBQzFDLFFBQWdDO0lBRWhDLE9BQU8sZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLFFBQVE7YUFDcEIsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxrQ0FBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQzthQUNwQixHQUFHLEVBQUUsQ0FBQztRQUNULE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sTUFBTSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZELENBQUMsQ0FBQztTQUNDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztTQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakIsQ0FBQztBQVpELG9FQVlDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCAqIGFzIHNlbXZlciBmcm9tIFwic2VtdmVyXCI7XG5cbmltcG9ydCB0eXBlIHtcbiAgVGVycmFmb3JtQ2xpVmVyc2lvbixcbiAgVGVycmFmb3JtVGFyZ2V0VmVyc2lvbnMsXG59IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuXG4vKipcbiAqIFRoZSBuZXdlci1wcm90b2NvbCBzY2hlbWEgc2VjdGlvbnMgdGhhdCBhIGZldGNoaW5nIENMSSBvbmx5IHN0YXJ0cyB0b1xuICogKmVtaXQqIGluIGB0ZXJyYWZvcm0gcHJvdmlkZXJzIHNjaGVtYSAtanNvbmAgYXMgb2YgYSBjZXJ0YWluIHZlcnNpb24uXG4gKlxuICogTk9URTogdGhlc2UgYXJlIGVtaXNzaW9uIGJvdW5kYXJpZXMsIG5vdCBsYW5ndWFnZS1zdXBwb3J0IGJvdW5kYXJpZXMgLVxuICogZS5nLiBwcm92aWRlciBmdW5jdGlvbnMgYXJlIHVzYWJsZSBpbiBIQ0wgc2luY2UgVGVycmFmb3JtIDEuNy4wLCBidXQgb25seVxuICogc2hvdyB1cCBpbiB0aGUgc2NoZW1hIGR1bXAgYXMgb2YgMS44LjAuXG4gKi9cbmV4cG9ydCB0eXBlIFNjaGVtYUVtaXNzaW9uRmFtaWx5ID1cbiAgfCBcImZ1bmN0aW9uc1wiXG4gIHwgXCJlcGhlbWVyYWxfcmVzb3VyY2Vfc2NoZW1hc1wiXG4gIHwgXCJ3cml0ZV9vbmx5XCJcbiAgfCBcInJlc291cmNlX2lkZW50aXR5X3NjaGVtYXNcIjtcblxuY29uc3QgVEFSR0VUX1BST0RVQ1RTID0gW1widGVycmFmb3JtXCIsIFwib3BlbnRvZnVcIl0gYXMgY29uc3Q7XG50eXBlIFRhcmdldFByb2R1Y3QgPSAodHlwZW9mIFRBUkdFVF9QUk9EVUNUUylbbnVtYmVyXTtcblxuLyoqXG4gKiBIYW5kLW1haW50YWluZWQgZnJvbSBgdG9vbHMvcHJvdmlkZXItZmVhdHVyZS1hdmFpbGFiaWxpdHkvZmVhdHVyZXMtbWF0cml4Lmpzb25gXG4gKiDigJQgc3BlY2lmaWNhbGx5IGVhY2ggZmVhdHVyZSdzIGBkb2N1bWVudGVkX2VtaXR0ZWRfZnJvbWAgL1xuICogYG9ic2VydmVkX2ludHJvZHVjZWRgIGZpZWxkcyBwZXIgcHJvZHVjdCAoc2VlIHRoYXQgZGlyZWN0b3J5J3MgUkVBRE1FIGZvclxuICogaG93IHRoZSBkYXRhc2V0IGl0c2VsZiBpcyBwcm9kdWNlZC9yZWdlbmVyYXRlZCwgYW5kIGl0cyBcIkluLXJlcG9cbiAqIGNvbnN1bWVyc1wiIHNlY3Rpb24gZm9yIGhvdyB0aGlzIG1hcCBhbmQgYHByb3ZpZGVyRmVhdHVyZUNvbnN0cmFpbnRzYCBpblxuICogYHBhY2thZ2VzL2Nka3RuL3NyYy9wcm92aWRlci1mZWF0dXJlLWNvbnN0cmFpbnRzLnRzYCByZWxhdGUgdG8gdGhlXG4gKiBtYXRyaXggYW5kIHRvIGVhY2ggb3RoZXIpLlxuICpcbiAqIFRoZXJlIGlzIG5vIGF1dG9tYXRlZCBjaGVjayB0aGF0IHRoaXMgbWFwIHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgbWF0cml4O1xuICogdXBkYXRlcyBtdXN0IGJlIGFwcGxpZWQgYnkgaGFuZCB3aGVuIHRoZSBtYXRyaXggY2hhbmdlcy4gQW4gYXV0b21hdGVkXG4gKiBkcmlmdCBjaGVjayBpcyB0cmFja2VkIGluICMzMDkuXG4gKi9cbmV4cG9ydCBjb25zdCBTQ0hFTUFfRU1JU1NJT05fQk9VTkRBUklFUzogUmVjb3JkPFxuICBTY2hlbWFFbWlzc2lvbkZhbWlseSxcbiAgUmVjb3JkPFRhcmdldFByb2R1Y3QsIHN0cmluZz5cbj4gPSB7XG4gIGZ1bmN0aW9uczogeyB0ZXJyYWZvcm06IFwiMS44LjBcIiwgb3BlbnRvZnU6IFwiMS44LjBcIiB9LFxuICBlcGhlbWVyYWxfcmVzb3VyY2Vfc2NoZW1hczogeyB0ZXJyYWZvcm06IFwiMS4xMC4wXCIsIG9wZW50b2Z1OiBcIjEuMTEuMFwiIH0sXG4gIHdyaXRlX29ubHk6IHsgdGVycmFmb3JtOiBcIjEuMTEuMFwiLCBvcGVudG9mdTogXCIxLjExLjBcIiB9LFxuICByZXNvdXJjZV9pZGVudGl0eV9zY2hlbWFzOiB7IHRlcnJhZm9ybTogXCIxLjEyLjBcIiwgb3BlbnRvZnU6IFwiMS4xMi4wXCIgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBTQ0hFTUFfRU1JU1NJT05fRkFNSUxZX0xBQkVMUzogUmVjb3JkPFxuICBTY2hlbWFFbWlzc2lvbkZhbWlseSxcbiAgc3RyaW5nXG4+ID0ge1xuICBmdW5jdGlvbnM6IFwicHJvdmlkZXIgZnVuY3Rpb25zXCIsXG4gIGVwaGVtZXJhbF9yZXNvdXJjZV9zY2hlbWFzOiBcImVwaGVtZXJhbCByZXNvdXJjZXNcIixcbiAgd3JpdGVfb25seTogXCJ3cml0ZS1vbmx5IGF0dHJpYnV0ZXNcIixcbiAgcmVzb3VyY2VfaWRlbnRpdHlfc2NoZW1hczogXCJyZXNvdXJjZSBpZGVudGl0eVwiLFxufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoaWNoIHNjaGVtYS1lbWlzc2lvbiBnYXBzIHRoZSBnaXZlbiBmZXRjaGluZyBDTEkgaGFzLCBpblxuICogbGlnaHQgb2YgdGhlIHByb2plY3QncyBkZWNsYXJlZCBgdGFyZ2V0VmVyc2lvbnNgLlxuICpcbiAqIEEgZmFtaWx5IGlzIHJlcG9ydGVkIHdoZW4gYm90aCBhcmUgdHJ1ZTpcbiAqIC0gdGhlIGZldGNoaW5nIENMSSdzIG93biB2ZXJzaW9uIHByZWRhdGVzIHRoYXQgZmFtaWx5J3MgZW1pc3Npb25cbiAqICAgYm91bmRhcnkgZm9yIGl0cyBwcm9kdWN0IChzbyB0aGlzIHBhcnRpY3VsYXIgZmV0Y2ggY291bGQgbm90IGhhdmVcbiAqICAgaW5jbHVkZWQgdGhlIHNlY3Rpb24sIGV2ZW4gaWYgdGhlIHByb3ZpZGVyIGltcGxlbWVudHMgaXQpXG4gKiAtIGF0IGxlYXN0IG9uZSBvZiB0aGUgcHJvamVjdCdzIHRhcmdldGVkIHByb2R1Y3RzIGRlY2xhcmVzIGEgcmFuZ2UgdGhhdFxuICogICBpbnRlcnNlY3RzIHRoZSB2ZXJzaW9ucyB3aGVyZSB0aGF0IGZhbWlseSBpcyBlbWl0dGVkIChpLmUuIHRoZSBwcm9qZWN0XG4gKiAgIGFjdHVhbGx5IGludGVuZHMgdG8gcnVuIG9uIHZlcnNpb25zIHdoZXJlIHRoZSBmZWF0dXJlIHdvdWxkIHNob3cgdXApXG4gKlxuICogQGludGVybmFsIGV4cG9zZWQgZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrU2NoZW1hRW1pc3Npb25HYXBzKFxuICBjbGk6IFRlcnJhZm9ybUNsaVZlcnNpb24sXG4gIHRhcmdldHM6IFRlcnJhZm9ybVRhcmdldFZlcnNpb25zLFxuKTogc3RyaW5nW10ge1xuICByZXR1cm4gY2hlY2tTY2hlbWFFbWlzc2lvbkdhcEZhbWlsaWVzKGNsaSwgdGFyZ2V0cykubWFwKFxuICAgIChmYW1pbHkpID0+IFNDSEVNQV9FTUlTU0lPTl9GQU1JTFlfTEFCRUxTW2ZhbWlseV0sXG4gICk7XG59XG5cbi8qKlxuICogU2FtZSBhcyBjaGVja1NjaGVtYUVtaXNzaW9uR2FwcywgYnV0IHJldHVybnMgdGhlIHJhdyBmYW1pbHkga2V5cyBzb1xuICogY2FsbGVycyBjYW4gYWxzbyBjb21wdXRlIGEgcmVtZWR5IChzZWUgc3VnZ2VzdGVkRW1pdHRpbmdDbGlWZXJzaW9ucykuXG4gKlxuICogQGludGVybmFsIGV4cG9zZWQgZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrU2NoZW1hRW1pc3Npb25HYXBGYW1pbGllcyhcbiAgY2xpOiBUZXJyYWZvcm1DbGlWZXJzaW9uLFxuICB0YXJnZXRzOiBUZXJyYWZvcm1UYXJnZXRWZXJzaW9ucyxcbik6IFNjaGVtYUVtaXNzaW9uRmFtaWx5W10ge1xuICBpZiAoY2xpLm5hbWUgPT09IFwidW5rbm93blwiIHx8ICFjbGkudmVyc2lvbikgcmV0dXJuIFtdO1xuICBjb25zdCBjbGlQcm9kdWN0ID0gY2xpLm5hbWUgYXMgVGFyZ2V0UHJvZHVjdDtcblxuICBjb25zdCBnYXBzOiBTY2hlbWFFbWlzc2lvbkZhbWlseVtdID0gW107XG5cbiAgZm9yIChjb25zdCBmYW1pbHkgb2YgT2JqZWN0LmtleXMoXG4gICAgU0NIRU1BX0VNSVNTSU9OX0JPVU5EQVJJRVMsXG4gICkgYXMgU2NoZW1hRW1pc3Npb25GYW1pbHlbXSkge1xuICAgIGNvbnN0IGJvdW5kYXJpZXMgPSBTQ0hFTUFfRU1JU1NJT05fQk9VTkRBUklFU1tmYW1pbHldO1xuICAgIGNvbnN0IGNsaUJvdW5kYXJ5ID0gYm91bmRhcmllc1tjbGlQcm9kdWN0XTtcbiAgICBpZiAoIWNsaUJvdW5kYXJ5KSBjb250aW51ZTtcblxuICAgIC8vIFRoZSBmZXRjaGluZyBDTEkgaXMgbmV3IGVub3VnaCB0byBlbWl0IHRoaXMgZmFtaWx5IC0gbm8gZ2FwLlxuICAgIGlmICghc2VtdmVyLmx0KGNsaS52ZXJzaW9uLCBjbGlCb3VuZGFyeSkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qgd2FudGVkID0gVEFSR0VUX1BST0RVQ1RTLnNvbWUoKHByb2R1Y3QpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldFJhbmdlID0gdGFyZ2V0c1twcm9kdWN0XTtcbiAgICAgIGlmICghdGFyZ2V0UmFuZ2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChzZW12ZXIudmFsaWRSYW5nZSh0YXJnZXRSYW5nZSkgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHN1cHBvcnRlZFJhbmdlID0gYD49JHtib3VuZGFyaWVzW3Byb2R1Y3RdfWA7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gc2VtdmVyLmludGVyc2VjdHModGFyZ2V0UmFuZ2UsIHN1cHBvcnRlZFJhbmdlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAod2FudGVkKSBnYXBzLnB1c2goZmFtaWx5KTtcbiAgfVxuXG4gIHJldHVybiBnYXBzO1xufVxuXG4vKipcbiAqIFRoZSBsb3dlc3QgQ0xJIHZlcnNpb24gcGVyIHByb2R1Y3Qgd2hvc2UgYHByb3ZpZGVycyBzY2hlbWEgLWpzb25gIGVtaXRzXG4gKiBldmVyeSBvbmUgb2YgdGhlIGdpdmVuIGZhbWlsaWVzIOKAlCB0aGUgcmVtZWR5IHRvIHN1Z2dlc3QgYWxvbmdzaWRlIHRoZVxuICogZmV0Y2gtdGltZSB3YXJuaW5nLlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWdnZXN0ZWRFbWl0dGluZ0NsaVZlcnNpb25zKFxuICBmYW1pbGllczogU2NoZW1hRW1pc3Npb25GYW1pbHlbXSxcbik6IHN0cmluZyB7XG4gIHJldHVybiBUQVJHRVRfUFJPRFVDVFMubWFwKChwcm9kdWN0KSA9PiB7XG4gICAgY29uc3QgbmVlZGVkID0gZmFtaWxpZXNcbiAgICAgIC5tYXAoKGZhbWlseSkgPT4gU0NIRU1BX0VNSVNTSU9OX0JPVU5EQVJJRVNbZmFtaWx5XVtwcm9kdWN0XSlcbiAgICAgIC5zb3J0KHNlbXZlci5jb21wYXJlKVxuICAgICAgLnBvcCgpO1xuICAgIHJldHVybiBuZWVkZWQgPyBgJHtwcm9kdWN0fSA+PSR7bmVlZGVkfWAgOiB1bmRlZmluZWQ7XG4gIH0pXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gdW5kZWZpbmVkKVxuICAgIC5qb2luKFwiIC8gXCIpO1xufVxuIl19
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1pc3Npb24tY2hlY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW1pc3Npb24tY2hlY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUVBLDBEQU9DO0FBUUQsd0VBbUNDO0FBU0Qsb0VBWUM7QUFoSkQsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQywrQ0FBaUM7QUFxQmpDLE1BQU0sZUFBZSxHQUFHLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBVSxDQUFDO0FBRzNEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNVLFFBQUEsMEJBQTBCLEdBR25DO0lBQ0YsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO0lBQ3BELDBCQUEwQixFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0lBQ3ZFLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtJQUN2RCx5QkFBeUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtDQUN2RSxDQUFDO0FBRVcsUUFBQSw2QkFBNkIsR0FHdEM7SUFDRixTQUFTLEVBQUUsb0JBQW9CO0lBQy9CLDBCQUEwQixFQUFFLHFCQUFxQjtJQUNqRCxVQUFVLEVBQUUsdUJBQXVCO0lBQ25DLHlCQUF5QixFQUFFLG1CQUFtQjtDQUMvQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQWdCLHVCQUF1QixDQUNyQyxHQUF3QixFQUN4QixPQUFnQztJQUVoQyxPQUFPLDhCQUE4QixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQ3JELENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxxQ0FBNkIsQ0FBQyxNQUFNLENBQUMsQ0FDbEQsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLDhCQUE4QixDQUM1QyxHQUF3QixFQUN4QixPQUFnQztJQUVoQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU87UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN0RCxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsSUFBcUIsQ0FBQztJQUU3QyxNQUFNLElBQUksR0FBMkIsRUFBRSxDQUFDO0lBRXhDLEtBQUssTUFBTSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FDOUIsa0NBQTBCLENBQ0QsRUFBRSxDQUFDO1FBQzVCLE1BQU0sVUFBVSxHQUFHLGtDQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsV0FBVztZQUFFLFNBQVM7UUFFM0IsK0RBQStEO1FBQy9ELElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDO1lBQUUsU0FBUztRQUVuRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDOUMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxXQUFXO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQy9CLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzFELE1BQU0sY0FBYyxHQUFHLEtBQUssVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDO2dCQUNILE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDeEQsQ0FBQztZQUFDLFdBQU0sQ0FBQztnQkFDUCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLDRCQUE0QixDQUMxQyxRQUFnQztJQUVoQyxPQUFPLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNyQyxNQUFNLE1BQU0sR0FBRyxRQUFRO2FBQ3BCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsa0NBQTBCLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7YUFDcEIsR0FBRyxFQUFFLENBQUM7UUFDVCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLE1BQU0sTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN2RCxDQUFDLENBQUM7U0FDQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUM7U0FDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gXCJzZW12ZXJcIjtcblxuaW1wb3J0IHR5cGUge1xuICBUZXJyYWZvcm1DbGlWZXJzaW9uLFxuICBUZXJyYWZvcm1UYXJnZXRWZXJzaW9ucyxcbn0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5cbi8qKlxuICogVGhlIG5ld2VyLXByb3RvY29sIHNjaGVtYSBzZWN0aW9ucyB0aGF0IGEgZmV0Y2hpbmcgQ0xJIG9ubHkgc3RhcnRzIHRvXG4gKiAqZW1pdCogaW4gYHRlcnJhZm9ybSBwcm92aWRlcnMgc2NoZW1hIC1qc29uYCBhcyBvZiBhIGNlcnRhaW4gdmVyc2lvbi5cbiAqXG4gKiBOT1RFOiB0aGVzZSBhcmUgZW1pc3Npb24gYm91bmRhcmllcywgbm90IGxhbmd1YWdlLXN1cHBvcnQgYm91bmRhcmllcyAtXG4gKiBlLmcuIHByb3ZpZGVyIGZ1bmN0aW9ucyBhcmUgdXNhYmxlIGluIEhDTCBzaW5jZSBUZXJyYWZvcm0gMS43LjAsIGJ1dCBvbmx5XG4gKiBzaG93IHVwIGluIHRoZSBzY2hlbWEgZHVtcCBhcyBvZiAxLjguMC5cbiAqL1xuZXhwb3J0IHR5cGUgU2NoZW1hRW1pc3Npb25GYW1pbHkgPVxuICB8IFwiZnVuY3Rpb25zXCJcbiAgfCBcImVwaGVtZXJhbF9yZXNvdXJjZV9zY2hlbWFzXCJcbiAgfCBcIndyaXRlX29ubHlcIlxuICB8IFwicmVzb3VyY2VfaWRlbnRpdHlfc2NoZW1hc1wiO1xuXG5jb25zdCBUQVJHRVRfUFJPRFVDVFMgPSBbXCJ0ZXJyYWZvcm1cIiwgXCJvcGVudG9mdVwiXSBhcyBjb25zdDtcbnR5cGUgVGFyZ2V0UHJvZHVjdCA9ICh0eXBlb2YgVEFSR0VUX1BST0RVQ1RTKVtudW1iZXJdO1xuXG4vKipcbiAqIEhhbmQtbWFpbnRhaW5lZCBmcm9tIGB0b29scy9wcm92aWRlci1mZWF0dXJlLWF2YWlsYWJpbGl0eS9mZWF0dXJlcy1tYXRyaXguanNvbmBcbiAqIOKAlCBzcGVjaWZpY2FsbHkgZWFjaCBmZWF0dXJlJ3MgYGRvY3VtZW50ZWRfZW1pdHRlZF9mcm9tYCAvXG4gKiBgb2JzZXJ2ZWRfaW50cm9kdWNlZGAgZmllbGRzIHBlciBwcm9kdWN0IChzZWUgdGhhdCBkaXJlY3RvcnkncyBSRUFETUUgZm9yXG4gKiBob3cgdGhlIGRhdGFzZXQgaXRzZWxmIGlzIHByb2R1Y2VkL3JlZ2VuZXJhdGVkLCBhbmQgaXRzIFwiSW4tcmVwb1xuICogY29uc3VtZXJzXCIgc2VjdGlvbiBmb3IgaG93IHRoaXMgbWFwIGFuZCBgcHJvdmlkZXJGZWF0dXJlQ29uc3RyYWludHNgIGluXG4gKiBgcGFja2FnZXMvY2RrdG4vc3JjL3Byb3ZpZGVyLWZlYXR1cmUtY29uc3RyYWludHMudHNgIHJlbGF0ZSB0byB0aGVcbiAqIG1hdHJpeCBhbmQgdG8gZWFjaCBvdGhlcikuXG4gKlxuICogVGhlcmUgaXMgbm8gYXV0b21hdGVkIGNoZWNrIHRoYXQgdGhpcyBtYXAgc3RheXMgaW4gc3luYyB3aXRoIHRoZSBtYXRyaXg7XG4gKiB1cGRhdGVzIG11c3QgYmUgYXBwbGllZCBieSBoYW5kIHdoZW4gdGhlIG1hdHJpeCBjaGFuZ2VzLiBBbiBhdXRvbWF0ZWRcbiAqIGRyaWZ0IGNoZWNrIGlzIHRyYWNrZWQgaW4gIzMwOS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNDSEVNQV9FTUlTU0lPTl9CT1VOREFSSUVTOiBSZWNvcmQ8XG4gIFNjaGVtYUVtaXNzaW9uRmFtaWx5LFxuICBSZWNvcmQ8VGFyZ2V0UHJvZHVjdCwgc3RyaW5nPlxuPiA9IHtcbiAgZnVuY3Rpb25zOiB7IHRlcnJhZm9ybTogXCIxLjguMFwiLCBvcGVudG9mdTogXCIxLjguMFwiIH0sXG4gIGVwaGVtZXJhbF9yZXNvdXJjZV9zY2hlbWFzOiB7IHRlcnJhZm9ybTogXCIxLjEwLjBcIiwgb3BlbnRvZnU6IFwiMS4xMS4wXCIgfSxcbiAgd3JpdGVfb25seTogeyB0ZXJyYWZvcm06IFwiMS4xMS4wXCIsIG9wZW50b2Z1OiBcIjEuMTEuMFwiIH0sXG4gIHJlc291cmNlX2lkZW50aXR5X3NjaGVtYXM6IHsgdGVycmFmb3JtOiBcIjEuMTIuMFwiLCBvcGVudG9mdTogXCIxLjEyLjBcIiB9LFxufTtcblxuZXhwb3J0IGNvbnN0IFNDSEVNQV9FTUlTU0lPTl9GQU1JTFlfTEFCRUxTOiBSZWNvcmQ8XG4gIFNjaGVtYUVtaXNzaW9uRmFtaWx5LFxuICBzdHJpbmdcbj4gPSB7XG4gIGZ1bmN0aW9uczogXCJwcm92aWRlciBmdW5jdGlvbnNcIixcbiAgZXBoZW1lcmFsX3Jlc291cmNlX3NjaGVtYXM6IFwiZXBoZW1lcmFsIHJlc291cmNlc1wiLFxuICB3cml0ZV9vbmx5OiBcIndyaXRlLW9ubHkgYXR0cmlidXRlc1wiLFxuICByZXNvdXJjZV9pZGVudGl0eV9zY2hlbWFzOiBcInJlc291cmNlIGlkZW50aXR5XCIsXG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hpY2ggc2NoZW1hLWVtaXNzaW9uIGdhcHMgdGhlIGdpdmVuIGZldGNoaW5nIENMSSBoYXMsIGluXG4gKiBsaWdodCBvZiB0aGUgcHJvamVjdCdzIGRlY2xhcmVkIGB0YXJnZXRWZXJzaW9uc2AuXG4gKlxuICogQSBmYW1pbHkgaXMgcmVwb3J0ZWQgd2hlbiBib3RoIGFyZSB0cnVlOlxuICogLSB0aGUgZmV0Y2hpbmcgQ0xJJ3Mgb3duIHZlcnNpb24gcHJlZGF0ZXMgdGhhdCBmYW1pbHkncyBlbWlzc2lvblxuICogICBib3VuZGFyeSBmb3IgaXRzIHByb2R1Y3QgKHNvIHRoaXMgcGFydGljdWxhciBmZXRjaCBjb3VsZCBub3QgaGF2ZVxuICogICBpbmNsdWRlZCB0aGUgc2VjdGlvbiwgZXZlbiBpZiB0aGUgcHJvdmlkZXIgaW1wbGVtZW50cyBpdClcbiAqIC0gYXQgbGVhc3Qgb25lIG9mIHRoZSBwcm9qZWN0J3MgdGFyZ2V0ZWQgcHJvZHVjdHMgZGVjbGFyZXMgYSByYW5nZSB0aGF0XG4gKiAgIGludGVyc2VjdHMgdGhlIHZlcnNpb25zIHdoZXJlIHRoYXQgZmFtaWx5IGlzIGVtaXR0ZWQgKGkuZS4gdGhlIHByb2plY3RcbiAqICAgYWN0dWFsbHkgaW50ZW5kcyB0byBydW4gb24gdmVyc2lvbnMgd2hlcmUgdGhlIGZlYXR1cmUgd291bGQgc2hvdyB1cClcbiAqXG4gKiBAaW50ZXJuYWwgZXhwb3NlZCBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tTY2hlbWFFbWlzc2lvbkdhcHMoXG4gIGNsaTogVGVycmFmb3JtQ2xpVmVyc2lvbixcbiAgdGFyZ2V0czogVGVycmFmb3JtVGFyZ2V0VmVyc2lvbnMsXG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBjaGVja1NjaGVtYUVtaXNzaW9uR2FwRmFtaWxpZXMoY2xpLCB0YXJnZXRzKS5tYXAoXG4gICAgKGZhbWlseSkgPT4gU0NIRU1BX0VNSVNTSU9OX0ZBTUlMWV9MQUJFTFNbZmFtaWx5XSxcbiAgKTtcbn1cblxuLyoqXG4gKiBTYW1lIGFzIGNoZWNrU2NoZW1hRW1pc3Npb25HYXBzLCBidXQgcmV0dXJucyB0aGUgcmF3IGZhbWlseSBrZXlzIHNvXG4gKiBjYWxsZXJzIGNhbiBhbHNvIGNvbXB1dGUgYSByZW1lZHkgKHNlZSBzdWdnZXN0ZWRFbWl0dGluZ0NsaVZlcnNpb25zKS5cbiAqXG4gKiBAaW50ZXJuYWwgZXhwb3NlZCBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tTY2hlbWFFbWlzc2lvbkdhcEZhbWlsaWVzKFxuICBjbGk6IFRlcnJhZm9ybUNsaVZlcnNpb24sXG4gIHRhcmdldHM6IFRlcnJhZm9ybVRhcmdldFZlcnNpb25zLFxuKTogU2NoZW1hRW1pc3Npb25GYW1pbHlbXSB7XG4gIGlmIChjbGkubmFtZSA9PT0gXCJ1bmtub3duXCIgfHwgIWNsaS52ZXJzaW9uKSByZXR1cm4gW107XG4gIGNvbnN0IGNsaVByb2R1Y3QgPSBjbGkubmFtZSBhcyBUYXJnZXRQcm9kdWN0O1xuXG4gIGNvbnN0IGdhcHM6IFNjaGVtYUVtaXNzaW9uRmFtaWx5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGZhbWlseSBvZiBPYmplY3Qua2V5cyhcbiAgICBTQ0hFTUFfRU1JU1NJT05fQk9VTkRBUklFUyxcbiAgKSBhcyBTY2hlbWFFbWlzc2lvbkZhbWlseVtdKSB7XG4gICAgY29uc3QgYm91bmRhcmllcyA9IFNDSEVNQV9FTUlTU0lPTl9CT1VOREFSSUVTW2ZhbWlseV07XG4gICAgY29uc3QgY2xpQm91bmRhcnkgPSBib3VuZGFyaWVzW2NsaVByb2R1Y3RdO1xuICAgIGlmICghY2xpQm91bmRhcnkpIGNvbnRpbnVlO1xuXG4gICAgLy8gVGhlIGZldGNoaW5nIENMSSBpcyBuZXcgZW5vdWdoIHRvIGVtaXQgdGhpcyBmYW1pbHkgLSBubyBnYXAuXG4gICAgaWYgKCFzZW12ZXIubHQoY2xpLnZlcnNpb24sIGNsaUJvdW5kYXJ5KSkgY29udGludWU7XG5cbiAgICBjb25zdCB3YW50ZWQgPSBUQVJHRVRfUFJPRFVDVFMuc29tZSgocHJvZHVjdCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0UmFuZ2UgPSB0YXJnZXRzW3Byb2R1Y3RdO1xuICAgICAgaWYgKCF0YXJnZXRSYW5nZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHNlbXZlci52YWxpZFJhbmdlKHRhcmdldFJhbmdlKSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgc3VwcG9ydGVkUmFuZ2UgPSBgPj0ke2JvdW5kYXJpZXNbcHJvZHVjdF19YDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBzZW12ZXIuaW50ZXJzZWN0cyh0YXJnZXRSYW5nZSwgc3VwcG9ydGVkUmFuZ2UpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh3YW50ZWQpIGdhcHMucHVzaChmYW1pbHkpO1xuICB9XG5cbiAgcmV0dXJuIGdhcHM7XG59XG5cbi8qKlxuICogVGhlIGxvd2VzdCBDTEkgdmVyc2lvbiBwZXIgcHJvZHVjdCB3aG9zZSBgcHJvdmlkZXJzIHNjaGVtYSAtanNvbmAgZW1pdHNcbiAqIGV2ZXJ5IG9uZSBvZiB0aGUgZ2l2ZW4gZmFtaWxpZXMg4oCUIHRoZSByZW1lZHkgdG8gc3VnZ2VzdCBhbG9uZ3NpZGUgdGhlXG4gKiBmZXRjaC10aW1lIHdhcm5pbmcuXG4gKlxuICogQGludGVybmFsIGV4cG9zZWQgZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1Z2dlc3RlZEVtaXR0aW5nQ2xpVmVyc2lvbnMoXG4gIGZhbWlsaWVzOiBTY2hlbWFFbWlzc2lvbkZhbWlseVtdLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIFRBUkdFVF9QUk9EVUNUUy5tYXAoKHByb2R1Y3QpID0+IHtcbiAgICBjb25zdCBuZWVkZWQgPSBmYW1pbGllc1xuICAgICAgLm1hcCgoZmFtaWx5KSA9PiBTQ0hFTUFfRU1JU1NJT05fQk9VTkRBUklFU1tmYW1pbHldW3Byb2R1Y3RdKVxuICAgICAgLnNvcnQoc2VtdmVyLmNvbXBhcmUpXG4gICAgICAucG9wKCk7XG4gICAgcmV0dXJuIG5lZWRlZCA/IGAke3Byb2R1Y3R9ID49JHtuZWVkZWR9YCA6IHVuZGVmaW5lZDtcbiAgfSlcbiAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSB1bmRlZmluZWQpXG4gICAgLmpvaW4oXCIgLyBcIik7XG59XG4iXX0=
|
|
@@ -22,7 +22,7 @@ export declare const parseFQPN: (f: FQPN) => {
|
|
|
22
22
|
};
|
|
23
23
|
export interface TerraformConfig {
|
|
24
24
|
provider?: {
|
|
25
|
-
[name: string]: Record<string, any
|
|
25
|
+
[name: string]: Record<string, any> | Record<string, any>[];
|
|
26
26
|
};
|
|
27
27
|
terraform: {
|
|
28
28
|
required_providers?: {
|
|
@@ -36,10 +36,29 @@ export interface TerraformConfig {
|
|
|
36
36
|
[name: string]: {
|
|
37
37
|
source: string;
|
|
38
38
|
version?: string;
|
|
39
|
+
providers?: {
|
|
40
|
+
[localName: string]: string;
|
|
41
|
+
};
|
|
39
42
|
};
|
|
40
43
|
};
|
|
41
44
|
}
|
|
42
45
|
export declare function readProviderSchema(target: ConstructsMakerProviderTarget): Promise<ProviderSchema>;
|
|
43
46
|
export declare function sanitizeProviderSchema(schema: ProviderSchema): ProviderSchema;
|
|
47
|
+
/**
|
|
48
|
+
* A provider configuration that a module expects to be handed by its caller,
|
|
49
|
+
* declared as `configuration_aliases` in the module's `required_providers`.
|
|
50
|
+
*/
|
|
51
|
+
export interface ModuleProviderAlias {
|
|
52
|
+
/** local name the module knows the provider by, e.g. `aws` */
|
|
53
|
+
localName: string;
|
|
54
|
+
/**
|
|
55
|
+
* alias part of the reference, e.g. `global_region`; absent when the module
|
|
56
|
+
* lists the bare local name (`configuration_aliases = [aws]`), which
|
|
57
|
+
* requires the caller to pass its default configuration explicitly
|
|
58
|
+
*/
|
|
59
|
+
alias?: string;
|
|
60
|
+
/** provider source the module declared for `localName`, if it declared one */
|
|
61
|
+
source?: string;
|
|
62
|
+
}
|
|
44
63
|
export declare function readModuleSchema(target: ConstructsMakerModuleTarget): Promise<Record<string, ModuleSchema>>;
|
|
45
64
|
//# sourceMappingURL=provider-schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-schema.d.ts","sourceRoot":"","sources":["../src/provider-schema.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,2BAA2B,EAC3B,6BAA6B,EAG7B,YAAY,EACZ,cAAc,EAUf,MAAM,gBAAgB,CAAC;AA2FxB;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,4BAA4B,CAAA;CAAE,CAAC;AACrE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC;AACvE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,CAAC;AAE/D,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"provider-schema.d.ts","sourceRoot":"","sources":["../src/provider-schema.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,2BAA2B,EAC3B,6BAA6B,EAG7B,YAAY,EACZ,cAAc,EAUf,MAAM,gBAAgB,CAAC;AA2FxB;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,4BAA4B,CAAA;CAAE,CAAC;AACrE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC;AACvE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,CAAC;AAE/D,eAAO,MAAM,SAAS,GAAI,GAAG,IAAI,KAKS;IACtC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,IAAI,EAAE,YAAY,CAAC;CAEtB,CAAC;AAuIF,MAAM,WAAW,eAAe;IAG9B,QAAQ,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAA;KAAE,CAAC;IAC3E,SAAS,EAAE;QACT,kBAAkB,CAAC,EAAE;YACnB,CAAC,IAAI,EAAE,MAAM,GAAG;gBAAE,MAAM,CAAC,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SACvD,CAAC;KACH,CAAC;IACF,MAAM,CAAC,EAAE;QACP,CAAC,IAAI,EAAE,MAAM,GAAG;YACd,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,SAAS,CAAC,EAAE;gBAAE,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAA;aAAE,CAAC;SAC7C,CAAC;KACH,CAAC;CACH;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,6BAA6B,2BAoDtC;AA2DD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAuC7E;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAkOD,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,2BAA2B,yCAoEzE"}
|
package/build/provider-schema.js
CHANGED
|
@@ -15,15 +15,35 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.
|
|
36
|
+
exports.parseFQPN = void 0;
|
|
37
|
+
exports.getFetchingCliVersion = getFetchingCliVersion;
|
|
38
|
+
exports.terraformInitWithRetry = terraformInitWithRetry;
|
|
39
|
+
exports.readProviderSchema = readProviderSchema;
|
|
40
|
+
exports.warnIfSchemaEmissionGaps = warnIfSchemaEmissionGaps;
|
|
41
|
+
exports.sanitizeProviderSchema = sanitizeProviderSchema;
|
|
42
|
+
exports.collectModuleProviderAliases = collectModuleProviderAliases;
|
|
43
|
+
exports.applyModuleProviderAliases = applyModuleProviderAliases;
|
|
44
|
+
exports.packageSubdir = packageSubdir;
|
|
45
|
+
exports.fetchedModuleDir = fetchedModuleDir;
|
|
46
|
+
exports.readModuleSchema = readModuleSchema;
|
|
27
47
|
// Copyright (c) HashiCorp, Inc
|
|
28
48
|
// SPDX-License-Identifier: MPL-2.0
|
|
29
49
|
const fs = __importStar(require("fs-extra"));
|
|
@@ -51,7 +71,6 @@ function getFetchingCliVersion() {
|
|
|
51
71
|
}
|
|
52
72
|
return fetchingCliVersionPromise;
|
|
53
73
|
}
|
|
54
|
-
exports.getFetchingCliVersion = getFetchingCliVersion;
|
|
55
74
|
// Provider binaries are downloaded from GitHub release CDNs during
|
|
56
75
|
// `terraform init`, which intermittently returns 5xx. Retry on those
|
|
57
76
|
// signatures only — real config/schema errors should still fail fast.
|
|
@@ -104,7 +123,6 @@ async function terraformInitWithRetry(options, maxAttempts = 5, baseDelayMs = 50
|
|
|
104
123
|
}
|
|
105
124
|
throw new Error("unreachable");
|
|
106
125
|
}
|
|
107
|
-
exports.terraformInitWithRetry = terraformInitWithRetry;
|
|
108
126
|
const parseFQPN = (f) => {
|
|
109
127
|
const [hostname, namespace, name] = f.split("/");
|
|
110
128
|
if (!name) {
|
|
@@ -246,7 +264,6 @@ async function readProviderSchema(target) {
|
|
|
246
264
|
}
|
|
247
265
|
return sanitizeProviderSchema(providerSchema);
|
|
248
266
|
}
|
|
249
|
-
exports.readProviderSchema = readProviderSchema;
|
|
250
267
|
/**
|
|
251
268
|
* Warns when the CLI that produced a given provider schema predates one or
|
|
252
269
|
* more schema-emission boundaries the project's declared `targetVersions`
|
|
@@ -291,7 +308,6 @@ async function warnIfSchemaEmissionGaps(schema, targetVersions) {
|
|
|
291
308
|
commons_1.logger.warn(`provider schema fetched with ${cli.name} ${cli.version} — ${joinWithAnd(gapFamilies.map((family) => emission_check_1.SCHEMA_EMISSION_FAMILY_LABELS[family]))} will not be generated; run cdktn get with ${(0, emission_check_1.suggestedEmittingCliVersions)(gapFamilies)}`);
|
|
292
309
|
}
|
|
293
310
|
}
|
|
294
|
-
exports.warnIfSchemaEmissionGaps = warnIfSchemaEmissionGaps;
|
|
295
311
|
// The providers have some potential bugs that we want to pro-actively
|
|
296
312
|
// fix here so that the rest of the code can assume a consistent schema.
|
|
297
313
|
function sanitizeProviderSchema(schema) {
|
|
@@ -327,7 +343,170 @@ function sanitizeProviderSchema(schema) {
|
|
|
327
343
|
});
|
|
328
344
|
return schema;
|
|
329
345
|
}
|
|
330
|
-
|
|
346
|
+
const CONFIGURATION_ALIAS = /^([\w-]+)(?:\.([\w-]+))?$/;
|
|
347
|
+
const providerReference = ({ localName, alias }) => alias ? `${localName}.${alias}` : localName;
|
|
348
|
+
// hcl2json hands HCL expressions back as interpolations, so a
|
|
349
|
+
// `configuration_aliases = [aws.global_region]` entry arrives as the string
|
|
350
|
+
// "${aws.global_region}". A .tf.json module writes the same reference as a
|
|
351
|
+
// plain string, which hcl2json passes through untouched.
|
|
352
|
+
const unwrapInterpolation = (value) => value.startsWith("${") && value.endsWith("}") ? value.slice(2, -1) : value;
|
|
353
|
+
const toArray = (item) => {
|
|
354
|
+
if (item === undefined || item === null)
|
|
355
|
+
return [];
|
|
356
|
+
return Array.isArray(item) ? item : [item];
|
|
357
|
+
};
|
|
358
|
+
/**
|
|
359
|
+
* Every occurrence of a block that hcl2json produced under one key.
|
|
360
|
+
*
|
|
361
|
+
* HCL blocks come back as an array with an entry per occurrence, a .tf.json
|
|
362
|
+
* block as a plain object. A module mixing both syntaxes gets a third shape:
|
|
363
|
+
* hcl2json merges the JSON file into the parsed HCL, and its deepMerge
|
|
364
|
+
* recurses into the HCL array instead of appending to it, leaving the JSON
|
|
365
|
+
* contribution hanging off the array as named properties. Those properties
|
|
366
|
+
* are an occurrence of their own - and one that neither iterating the array
|
|
367
|
+
* nor JSON.stringify would ever show.
|
|
368
|
+
*/
|
|
369
|
+
const blockOccurrences = (block) => {
|
|
370
|
+
if (block === undefined || block === null)
|
|
371
|
+
return [];
|
|
372
|
+
if (!Array.isArray(block))
|
|
373
|
+
return [block];
|
|
374
|
+
const merged = Object.fromEntries(Object.entries(block).filter(([key]) => !/^\d+$/.test(key)));
|
|
375
|
+
return Object.keys(merged).length > 0 ? [...block, merged] : [...block];
|
|
376
|
+
};
|
|
377
|
+
/**
|
|
378
|
+
* Collects the provider configurations a module requires its caller to pass
|
|
379
|
+
* in, from the hcl2json representation of the module's directory.
|
|
380
|
+
*
|
|
381
|
+
* A module may declare `required_providers` in more than one `terraform`
|
|
382
|
+
* block, and may spread them across .tf and .tf.json files; every occurrence
|
|
383
|
+
* hcl2json reports is considered (see {@link blockOccurrences}).
|
|
384
|
+
*
|
|
385
|
+
* @internal exposed for testing
|
|
386
|
+
*/
|
|
387
|
+
function collectModuleProviderAliases(parsedModule) {
|
|
388
|
+
const aliases = [];
|
|
389
|
+
const seen = new Set();
|
|
390
|
+
for (const terraformBlock of blockOccurrences(parsedModule === null || parsedModule === void 0 ? void 0 : parsedModule.terraform)) {
|
|
391
|
+
for (const requiredProviders of blockOccurrences(terraformBlock === null || terraformBlock === void 0 ? void 0 : terraformBlock.required_providers)) {
|
|
392
|
+
for (const declaration of Object.values(requiredProviders || {})) {
|
|
393
|
+
const provider = unwrapIfArray(declaration);
|
|
394
|
+
for (const entry of toArray(provider === null || provider === void 0 ? void 0 : provider.configuration_aliases)) {
|
|
395
|
+
const match = CONFIGURATION_ALIAS.exec(unwrapInterpolation(String(entry)));
|
|
396
|
+
if (!match)
|
|
397
|
+
continue;
|
|
398
|
+
const [, localName, alias] = match;
|
|
399
|
+
const entryAlias = {
|
|
400
|
+
localName,
|
|
401
|
+
alias,
|
|
402
|
+
source: provider === null || provider === void 0 ? void 0 : provider.source,
|
|
403
|
+
};
|
|
404
|
+
const key = providerReference(entryAlias);
|
|
405
|
+
if (seen.has(key))
|
|
406
|
+
continue;
|
|
407
|
+
seen.add(key);
|
|
408
|
+
aliases.push(entryAlias);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
return aliases;
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Declares the provider configurations that `aliases` names on the synthetic
|
|
417
|
+
* root config and passes them into the module call, which is what Terraform
|
|
418
|
+
* demands of anyone calling a module with `configuration_aliases`.
|
|
419
|
+
*
|
|
420
|
+
* The provider blocks stay empty: `terraform get` only builds the configuration
|
|
421
|
+
* tree, it never configures or installs a provider. Sources are mirrored from
|
|
422
|
+
* the module's own `required_providers` so a module referring to, say,
|
|
423
|
+
* hashicorp/aws under a non-default local name still resolves to the same
|
|
424
|
+
* provider in the root.
|
|
425
|
+
*
|
|
426
|
+
* @internal exposed for testing
|
|
427
|
+
*/
|
|
428
|
+
function applyModuleProviderAliases(config, moduleKey, aliases) {
|
|
429
|
+
var _a;
|
|
430
|
+
const moduleCall = (_a = config.module) === null || _a === void 0 ? void 0 : _a[moduleKey];
|
|
431
|
+
if (!moduleCall || aliases.length === 0)
|
|
432
|
+
return config;
|
|
433
|
+
for (const entry of aliases) {
|
|
434
|
+
const { localName, alias, source } = entry;
|
|
435
|
+
if (source) {
|
|
436
|
+
config.terraform.required_providers = {
|
|
437
|
+
...config.terraform.required_providers,
|
|
438
|
+
[localName]: { source },
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
config.provider = config.provider || {};
|
|
442
|
+
const blocks = toArray(config.provider[localName]);
|
|
443
|
+
if (!blocks.some((block) => block.alias === alias)) {
|
|
444
|
+
blocks.push(alias ? { alias } : {});
|
|
445
|
+
}
|
|
446
|
+
config.provider[localName] = blocks;
|
|
447
|
+
const reference = providerReference(entry);
|
|
448
|
+
moduleCall.providers = {
|
|
449
|
+
...moduleCall.providers,
|
|
450
|
+
[reference]: reference,
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
return config;
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* The `//subdir` portion of a module source, if it has one, mirroring how
|
|
457
|
+
* Terraform unpacks a package into `.terraform/modules/<key>/<subdir>`.
|
|
458
|
+
*
|
|
459
|
+
* @internal exposed for testing
|
|
460
|
+
*/
|
|
461
|
+
function packageSubdir(source) {
|
|
462
|
+
const [withoutQuery] = source.split("?");
|
|
463
|
+
const withoutGetterPrefix = withoutQuery.replace(/^[A-Za-z0-9]+::/, "");
|
|
464
|
+
const withoutScheme = withoutGetterPrefix.replace(/^[A-Za-z][A-Za-z0-9+.-]*:\/\/+/, "");
|
|
465
|
+
const [, ...rest] = withoutScheme.split("//");
|
|
466
|
+
const subdir = rest.join("//").replace(/^\/+|\/+$/g, "");
|
|
467
|
+
return subdir || undefined;
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Where the module Terraform just fetched ended up on disk.
|
|
471
|
+
*
|
|
472
|
+
* The manifest is the authority, but a `terraform get` that installed the
|
|
473
|
+
* module and then failed to validate the configuration around it leaves no
|
|
474
|
+
* manifest behind - so fall back to the locations Terraform installs into:
|
|
475
|
+
* local modules are read where they are, remote packages are unpacked into
|
|
476
|
+
* `.terraform/modules/<key>`.
|
|
477
|
+
*
|
|
478
|
+
* @internal exposed for testing
|
|
479
|
+
*/
|
|
480
|
+
function fetchedModuleDir(workingDirectory, moduleKey, source, localSourceAbsolutePath) {
|
|
481
|
+
const manifestPath = path.join(workingDirectory, ".terraform", "modules", "modules.json");
|
|
482
|
+
if (fs.existsSync(manifestPath)) {
|
|
483
|
+
const moduleIndex = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
|
|
484
|
+
const record = moduleIndex.Modules.find((mod) => mod.Key === moduleKey);
|
|
485
|
+
if (record) {
|
|
486
|
+
return path.resolve(workingDirectory, record.Dir);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
if (localSourceAbsolutePath) {
|
|
490
|
+
return localSourceAbsolutePath;
|
|
491
|
+
}
|
|
492
|
+
return path.join(workingDirectory, ".terraform", "modules", moduleKey, packageSubdir(source) || "");
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Runs `terraform get` and hands the failure back instead of throwing it.
|
|
496
|
+
*
|
|
497
|
+
* Its diagnostics are not final (see {@link readModuleSchema}), so they go to
|
|
498
|
+
* the debug log rather than the terminal; the returned error still carries
|
|
499
|
+
* them on its `stderr` for callers that end up rethrowing it.
|
|
500
|
+
*/
|
|
501
|
+
async function tryTerraformGet(outdir) {
|
|
502
|
+
try {
|
|
503
|
+
await (0, commons_1.exec)(terraformBinaryName, ["get"], { cwd: outdir, logStderrAsDebug: true }, undefined, undefined, false);
|
|
504
|
+
return undefined;
|
|
505
|
+
}
|
|
506
|
+
catch (error) {
|
|
507
|
+
return error;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
331
510
|
async function readModuleSchema(target) {
|
|
332
511
|
let moduleSchema = {};
|
|
333
512
|
await (0, commons_1.withTempDir)("fetchSchema", async () => {
|
|
@@ -350,12 +529,35 @@ async function readModuleSchema(target) {
|
|
|
350
529
|
const outdir = process.cwd();
|
|
351
530
|
const filePath = path.join(outdir, "main.tf.json");
|
|
352
531
|
await fs.writeFile(filePath, JSON.stringify(config));
|
|
353
|
-
|
|
532
|
+
// `terraform get` is both our downloader and a full validation of the
|
|
533
|
+
// synthetic root config wrapped around the module. A module declaring
|
|
534
|
+
// `configuration_aliases` cannot validate until the root passes those
|
|
535
|
+
// configurations in, and their names are only knowable once the module is
|
|
536
|
+
// on disk - so this first run is a fetch we defer judgement on. Terraform
|
|
537
|
+
// installs the module either way; since 1.15 it just stops short of
|
|
538
|
+
// writing the module manifest when validation fails (terraform#38217
|
|
539
|
+
// dropped the error-to-warning downgrade that `terraform get` used to
|
|
540
|
+
// apply), which is what the second run below restores.
|
|
541
|
+
const fetchError = await tryTerraformGet(outdir);
|
|
542
|
+
const moduleDir = fetchedModuleDir(outdir, target.moduleKey, source, localSource);
|
|
543
|
+
const aliases = fs.existsSync(moduleDir)
|
|
544
|
+
? collectModuleProviderAliases(await (0, hcl2json_1.convertFiles)(moduleDir))
|
|
545
|
+
: [];
|
|
546
|
+
if (aliases.length > 0) {
|
|
547
|
+
applyModuleProviderAliases(config, target.moduleKey, aliases);
|
|
548
|
+
await fs.writeFile(filePath, JSON.stringify(config));
|
|
549
|
+
await (0, commons_1.exec)(terraformBinaryName, ["get"], { cwd: outdir });
|
|
550
|
+
}
|
|
551
|
+
else if (fetchError) {
|
|
552
|
+
// nothing here was salvageable after all, so report the diagnostics that
|
|
553
|
+
// were held back while the fetch still had a second chance
|
|
554
|
+
commons_1.logger.error(fetchError.stderr || String(fetchError));
|
|
555
|
+
throw fetchError;
|
|
556
|
+
}
|
|
354
557
|
if (config.module) {
|
|
355
558
|
moduleSchema = await harvestModuleSchema(outdir, Object.keys(config.module));
|
|
356
559
|
}
|
|
357
560
|
});
|
|
358
561
|
return moduleSchema;
|
|
359
562
|
}
|
|
360
|
-
exports.readModuleSchema = readModuleSchema;
|
|
361
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3ZpZGVyLXNjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsNkNBQStCO0FBQy9CLDJDQUE2QjtBQUU3Qiw4Q0FBK0M7QUFDL0MsNENBbUJ3QjtBQUN4QixxREFJMEI7QUFFMUIsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLFdBQVcsQ0FBQztBQUU3RSxJQUFJLHlCQUFtRSxDQUFDO0FBRXhFOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLHFCQUFxQjtJQUNuQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUMvQix5QkFBeUIsR0FBRyxJQUFBLGNBQUksRUFBQyxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2pFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFO1NBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsa0NBQXdCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyx5QkFBeUIsQ0FBQztBQUNuQyxDQUFDO0FBUEQsc0RBT0M7QUFFRCxtRUFBbUU7QUFDbkUscUVBQXFFO0FBQ3JFLHNFQUFzRTtBQUN0RSxNQUFNLDZCQUE2QixHQUFHO0lBQ3BDLGFBQWE7SUFDYixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IsWUFBWTtJQUNaLFlBQVk7SUFDWixpQkFBaUI7Q0FDbEIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0ksS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxPQUF3QixFQUN4QixXQUFXLEdBQUcsQ0FBQyxFQUNmLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLGlCQUFpQixHQUFHLENBQUM7O0lBRXJCLEtBQUssSUFBSSxP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LENBQUM7SUFFSCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBckNELDRDQXFDQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgY29udmVydEZpbGVzIH0gZnJvbSBcIkBjZGt0bi9oY2wyanNvblwiO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlLFxuICBBdHRyaWJ1dGVUeXBlLFxuICBCbG9jayxcbiAgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0LFxuICBDb25zdHJ1Y3RzTWFrZXJQcm92aWRlclRhcmdldCxcbiAgSW5wdXQsXG4gIE1vZHVsZUluZGV4LFxuICBNb2R1bGVTY2hlbWEsXG4gIFByb3ZpZGVyU2NoZW1hLFxuICBUZXJyYWZvcm1DbGlWZXJzaW9uLFxuICBUZXJyYWZvcm1Nb2R1bGVDb25zdHJhaW50LFxuICBUZXJyYWZvcm1UYXJnZXRWZXJzaW9ucyxcbiAgVmVyc2lvblNjaGVtYSxcbiAgZXhlYyxcbiAgaXNOZXN0ZWRUeXBlQXR0cmlidXRlLFxuICBsb2dnZXIsXG4gIHBhcnNlVGVycmFmb3JtQ2xpVmVyc2lvbixcbiAgd2l0aFRlbXBEaXIsXG59IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IHtcbiAgU0NIRU1BX0VNSVNTSU9OX0ZBTUlMWV9MQUJFTFMsXG4gIGNoZWNrU2NoZW1hRW1pc3Npb25HYXBGYW1pbGllcyxcbiAgc3VnZ2VzdGVkRW1pdHRpbmdDbGlWZXJzaW9ucyxcbn0gZnJvbSBcIi4vZW1pc3Npb24tY2hlY2tcIjtcblxuY29uc3QgdGVycmFmb3JtQmluYXJ5TmFtZSA9IHByb2Nlc3MuZW52LlRFUlJBRk9STV9CSU5BUllfTkFNRSB8fCBcInRlcnJhZm9ybVwiO1xuXG5sZXQgZmV0Y2hpbmdDbGlWZXJzaW9uUHJvbWlzZTogUHJvbWlzZTxUZXJyYWZvcm1DbGlWZXJzaW9uPiB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBmZXRjaGluZyBDTEkgKGB0ZXJyYWZvcm1gL2B0b2Z1YCBiaW5hcnlcbiAqIHJlc29sdmVkIHZpYSBgVEVSUkFGT1JNX0JJTkFSWV9OQU1FYCkgb25jZSBwZXIgcHJvY2VzcywgbWVtb2l6ZWQuXG4gKlxuICogVXNlZCBib3RoIHRvIHN0YW1wIGZldGNoZWQgcHJvdmlkZXIgc2NoZW1hcyAoYGNsaV9uYW1lYC9gY2xpX3ZlcnNpb25gKVxuICogYW5kIGFzIHRoZSBjYWNoZSBrZXkgc3VmZml4IGluIHJlYWQudHMsIHNpbmNlIHNjaGVtYSBlbWlzc2lvbiBpcyBmaXhlZFxuICogcGVyIENMSSBtaW5vciB2ZXJzaW9uLlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nIGxpa2UgdGVycmFmb3JtSW5pdFdpdGhSZXRyeVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmV0Y2hpbmdDbGlWZXJzaW9uKCk6IFByb21pc2U8VGVycmFmb3JtQ2xpVmVyc2lvbj4ge1xuICBpZiAoIWZldGNoaW5nQ2xpVmVyc2lvblByb21pc2UpIHtcbiAgICBmZXRjaGluZ0NsaVZlcnNpb25Qcm9taXNlID0gZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJ2ZXJzaW9uXCJdLCB7XG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgfSkudGhlbihwYXJzZVRlcnJhZm9ybUNsaVZlcnNpb24pO1xuICB9XG4gIHJldHVybiBmZXRjaGluZ0NsaVZlcnNpb25Qcm9taXNlO1xufVxuXG4vLyBQcm92aWRlciBiaW5hcmllcyBhcmUgZG93bmxvYWRlZCBmcm9tIEdpdEh1YiByZWxlYXNlIENETnMgZHVyaW5nXG4vLyBgdGVycmFmb3JtIGluaXRgLCB3aGljaCBpbnRlcm1pdHRlbnRseSByZXR1cm5zIDV4eC4gUmV0cnkgb24gdGhvc2Vcbi8vIHNpZ25hdHVyZXMgb25seSDigJQgcmVhbCBjb25maWcvc2NoZW1hIGVycm9ycyBzaG91bGQgc3RpbGwgZmFpbCBmYXN0LlxuY29uc3QgVFJBTlNJRU5UX0lOSVRfRVJST1JfUEFUVEVSTlMgPSBbXG4gIC9cXGI1MFsyMzRdXFxiLyxcbiAgL0JhZCBHYXRld2F5L2ksXG4gIC9TZXJ2aWNlIFVuYXZhaWxhYmxlL2ksXG4gIC9HYXRld2F5IFRpbWVvdXQvaSxcbiAgL0VDT05OUkVTRVQvaSxcbiAgL0VUSU1FRE9VVC9pLFxuICAvRUFJX0FHQUlOL2ksXG4gIC91bmV4cGVjdGVkIEVPRi9pLFxuXTtcblxuLyoqXG4gKiBSdW5zIGB0ZXJyYWZvcm0gaW5pdGAgYW5kIHJldHJpZXMgb24gdHJhbnNpZW50IEhUVFAvbmV0d29yayBmYWlsdXJlcy5cbiAqXG4gKiBQcm92aWRlciBiaW5hcmllcyBhcmUgcHVsbGVkIGZyb20gR2l0SHViJ3MgcmVsZWFzZSBDRE4sIHdoaWNoXG4gKiBpbnRlcm1pdHRlbnRseSByZXR1cm5zIDV4eC4gVGhlIHJldHJ5IG9ubHkgZmlyZXMgd2hlbiBzdGRlcnIgbWF0Y2hlcyBhXG4gKiBrbm93biB0cmFuc2llbnQgcGF0dGVybiDigJQgcmVhbCBlcnJvcnMgKGJhZCB2ZXJzaW9uLCBzY2hlbWEgcGFyc2UsIGV0Yy4pXG4gKiBzdGlsbCBmYWlsIG9uIHRoZSBmaXJzdCBhdHRlbXB0LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gc3Bhd24gb3B0aW9ucyBmb3J3YXJkZWQgdG8gYGV4ZWNgIChgY3dkYCBpcyByZXF1aXJlZCBzb1xuICogICBgdGVycmFmb3JtIGluaXRgIHJ1bnMgaW5zaWRlIHRoZSB0ZW1wIGRpciBob2xkaW5nIGBtYWluLnRmLmpzb25gKVxuICogQHBhcmFtIG1heEF0dGVtcHRzIC0gdG90YWwgYXR0ZW1wdHMgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGNhbGw7IHRoZSBudW1iZXJcbiAqICAgb2YgcmV0cmllcyBpcyBgbWF4QXR0ZW1wdHMgLSAxYC4gRGVmYXVsdHMgdG8gNSAoMSBpbml0aWFsICsgNCByZXRyaWVzKVxuICogQHBhcmFtIGJhc2VEZWxheU1zIC0gZGVsYXkgYmVmb3JlIHRoZSBmaXJzdCByZXRyeS4gVGVzdHMgcGFzcyBgMGAgdG8gc2tpcFxuICogICB3YWl0cy4gRGVmYXVsdHMgdG8gNTAwMG1zXG4gKiBAcGFyYW0gYmFja29mZk11bHRpcGxpZXIgLSBmYWN0b3IgYXBwbGllZCB0byB0aGUgZGVsYXkgb24gZWFjaCBzdWJzZXF1ZW50XG4gKiAgIHJldHJ5IChzbyByZXRyaWVzIHdhaXQgYGJhc2VEZWxheU1zICogbXVsdGlwbGllcl4oYXR0ZW1wdC0xKWApLiBEZWZhdWx0c1xuICogICB0byAyICgxcyDihpIgMnMg4oaSIDRzIOKApilcbiAqIEByZXR1cm5zIHN0ZG91dCBmcm9tIHRoZSBzdWNjZXNzZnVsIGB0ZXJyYWZvcm0gaW5pdGAgaW52b2NhdGlvblxuICogQGludGVybmFsIGV4cG9zZWQgZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlcnJhZm9ybUluaXRXaXRoUmV0cnkoXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmcgfSxcbiAgbWF4QXR0ZW1wdHMgPSA1LFxuICBiYXNlRGVsYXlNcyA9IDUwMDAsXG4gIGJhY2tvZmZNdWx0aXBsaWVyID0gMixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1wiaW5pdFwiXSwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc3Qgc3RkZXJyOiBzdHJpbmcgPSBlcnJvcj8uc3RkZXJyID8/IFwiXCI7XG4gICAgICBjb25zdCB0cmFuc2llbnQgPSBUUkFOU0lFTlRfSU5JVF9FUlJPUl9QQVRURVJOUy5zb21lKChwKSA9PlxuICAgICAgICBwLnRlc3Qoc3RkZXJyKSxcbiAgICAgICk7XG4gICAgICBpZiAoIXRyYW5zaWVudCB8fCBhdHRlbXB0ID09PSBtYXhBdHRlbXB0cykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlbGF5TXMgPSBiYXNlRGVsYXlNcyAqIGJhY2tvZmZNdWx0aXBsaWVyICoqIChhdHRlbXB0IC0gMSk7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYHRlcnJhZm9ybSBpbml0IGZhaWxlZCB3aXRoIGEgdHJhbnNpZW50IGVycm9yLCByZXRyeWluZyBpbiAke2RlbGF5TXN9bXMgKGF0dGVtcHQgJHthdHRlbXB0fS8ke21heEF0dGVtcHRzIC0gMX0pYCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheU1zKSk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcInVucmVhY2hhYmxlXCIpO1xufVxuXG4vKipcbiAqIEZ1bGx5IFF1YWxpZmllZCBwcm92aWRlciBuYW1lIGluIHRoZSBmb3JtYXQ6XG4gKiBsaWtlIGUuZy4gcmVnaXN0cnkudGVycmFmb3JtLmlvL2hhc2hpY29ycC9hd3NcbiAqL1xuZXhwb3J0IHR5cGUgRlFQTiA9IHN0cmluZyAmIHsgX190eXBlOiBcIkZ1bGx5UXVhbGlmaWVkUHJvdmlkZXJOYW1lXCIgfTtcbmV4cG9ydCB0eXBlIFByb3ZpZGVySG9zdG5hbWUgPSBzdHJpbmcgJiB7IF9fdHlwZTogXCJQcm92aWRlckhvc3RuYW1lXCIgfTtcbmV4cG9ydCB0eXBlIFByb3ZpZGVyTmFtZXNwYWNlID0gc3RyaW5nICYgeyBfX3R5cGU6IFwiUHJvdmlkZXJOYW1lc3BhY2VcIiB9O1xuZXhwb3J0IHR5cGUgUHJvdmlkZXJOYW1lID0gc3RyaW5nICYgeyBfX3R5cGU6IFwiUHJvdmlkZXJOYW1lXCIgfTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlRlFQTiA9IChmOiBGUVBOKSA9PiB7XG4gIGNvbnN0IFtob3N0bmFtZSwgbmFtZXNwYWNlLCBuYW1lXSA9IGYuc3BsaXQoXCIvXCIpO1xuICBpZiAoIW5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbid0IGhhbmRsZSAke2Z9YCk7XG4gIH1cbiAgcmV0dXJuIHsgaG9zdG5hbWUsIG5hbWVzcGFjZSwgbmFtZSB9IGFzIHtcbiAgICBob3N0bmFtZTogUHJvdmlkZXJIb3N0bmFtZTtcbiAgICBuYW1lc3BhY2U6IFByb3ZpZGVyTmFtZXNwYWNlO1xuICAgIG5hbWU6IFByb3ZpZGVyTmFtZTtcbiAgfTtcbn07XG5cbmNvbnN0IHVud3JhcElmQXJyYXkgPSA8VD4oaXRlbTogVCB8IFRbXSk6IFQgPT5cbiAgQXJyYXkuaXNBcnJheShpdGVtKSA/IGl0ZW1bMF0gOiBpdGVtO1xuXG5jb25zdCB0cmFuc2Zvcm1WYXJpYWJsZXMgPSAodmFyaWFibGVzOiBhbnkpID0+IHtcbiAgY29uc3QgcmVzdWx0OiBJbnB1dFtdID0gW107XG5cbiAgaWYgKCF2YXJpYWJsZXMpIHJldHVybiByZXN1bHQ7XG5cbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHZhcmlhYmxlcykpIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHVud3JhcElmQXJyYXkodmFyaWFibGVzW25hbWVdKTtcbiAgICBsZXQgdmFyaWFibGVUeXBlOiBzdHJpbmc7XG5cbiAgICBpZiAoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICB2YXJpYWJsZS5oYXNPd25Qcm9wZXJ0eShcInR5cGVcIikgPT0gZmFsc2UgJiZcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIHZhcmlhYmxlLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFwiKSA9PSB0cnVlXG4gICAgKSB7XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YXJpYWJsZVtcImRlZmF1bHRcIl0pIHtcbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICB2YXJpYWJsZVR5cGUgPSBcImJvb2xcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgIHZhcmlhYmxlVHlwZSA9IFwibnVtYmVyXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdmFyaWFibGVUeXBlID0gXCJhbnlcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmF3VmFyaWFibGVUeXBlID0gdmFyaWFibGVbXCJ0eXBlXCJdO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgcmF3VmFyaWFibGVUeXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgIHJhd1ZhcmlhYmxlVHlwZS5zdGFydHNXaXRoKFwiJHtcIikgJiZcbiAgICAgICAgcmF3VmFyaWFibGVUeXBlLmVuZHNXaXRoKFwifVwiKSAmJlxuICAgICAgICAhcmF3VmFyaWFibGVUeXBlLmluY2x1ZGVzKFwiXFxuXCIpXG4gICAgICApIHtcbiAgICAgICAgdmFyaWFibGVUeXBlID0gcmF3VmFyaWFibGVUeXBlLnNsaWNlKDIsIC0xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcmlhYmxlVHlwZSA9IFwiYW55XCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbTogSW5wdXQgPSB7XG4gICAgICBuYW1lLFxuICAgICAgdHlwZTogdmFyaWFibGVUeXBlLFxuICAgICAgZGVzY3JpcHRpb246IHZhcmlhYmxlW1wiZGVzY3JpcHRpb25cIl0sXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICByZXF1aXJlZDogdmFyaWFibGUuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0XCIpID09IGZhbHNlLFxuICAgIH07XG5cbiAgICBpZiAoIWl0ZW0ucmVxdWlyZWQpIHtcbiAgICAgIGl0ZW1bXCJkZWZhdWx0XCJdID0gdmFyaWFibGVbXCJkZWZhdWx0XCJdO1xuICAgIH1cblxuICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybU91dHB1dHMgPSAob3V0cHV0czogYW55KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gIGlmIChvdXRwdXRzKSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKG91dHB1dHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSB1bndyYXBJZkFycmF5KG91dHB1dHNbbmFtZV0pO1xuXG4gICAgICBjb25zdCBpdGVtOiBhbnkgPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBvdXRwdXRbXCJkZXNjcmlwdGlvblwiXSxcbiAgICAgIH07XG5cbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBoYXJ2ZXN0TW9kdWxlU2NoZW1hID0gYXN5bmMgKFxuICB3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcsXG4gIG1vZHVsZXM6IHN0cmluZ1tdLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9PiB7XG4gIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5qb2luKFxuICAgIHdvcmtpbmdEaXJlY3RvcnksXG4gICAgXCIudGVycmFmb3JtXCIsXG4gICAgXCJtb2R1bGVzXCIsXG4gICAgXCJtb2R1bGVzLmpzb25cIixcbiAgKTtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVOYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNb2R1bGVzIHdlcmUgbm90IGdlbmVyYXRlZCBwcm9wZXJseSAtIGNvdWxkbid0IGZpbmQgJHtmaWxlTmFtZX1gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBtb2R1bGVJbmRleCA9IEpTT04ucGFyc2UoXG4gICAgZnMucmVhZEZpbGVTeW5jKGZpbGVOYW1lLCBcInV0Zi04XCIpLFxuICApIGFzIE1vZHVsZUluZGV4O1xuXG4gIGZvciAoY29uc3QgbW9kIG9mIG1vZHVsZXMpIHtcbiAgICBjb25zdCBtID0gbW9kdWxlSW5kZXguTW9kdWxlcy5maW5kKChvdGhlcikgPT4gbW9kID09PSBvdGhlci5LZXkpO1xuXG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgJHttfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IGF3YWl0IGNvbnZlcnRGaWxlcyhwYXRoLmpvaW4od29ya2luZ0RpcmVjdG9yeSwgbS5EaXIpKTtcblxuICAgIGlmICghcGFyc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNb2R1bGVzIHdlcmUgbm90IGdlbmVyYXRlZCBwcm9wZXJseSAtIGNvdWxkbid0IHBhcnNlICR7bS5EaXJ9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hOiBNb2R1bGVTY2hlbWEgPSB7XG4gICAgICBpbnB1dHM6IHRyYW5zZm9ybVZhcmlhYmxlcyhwYXJzZWQudmFyaWFibGUpLFxuICAgICAgb3V0cHV0czogdHJhbnNmb3JtT3V0cHV0cyhwYXJzZWQub3V0cHV0KSxcbiAgICAgIG5hbWU6IG1vZCxcbiAgICB9O1xuXG4gICAgcmVzdWx0W21vZF0gPSBzY2hlbWE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZnVuY3Rpb24gam9pbldpdGhBbmQoaXRlbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA8PSAxKSByZXR1cm4gaXRlbXMuam9pbihcIlwiKTtcbiAgcmV0dXJuIGAke2l0ZW1zLnNsaWNlKDAsIC0xKS5qb2luKFwiLCBcIil9IGFuZCAke2l0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdfWA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVycmFmb3JtQ29uZmlnIHtcbiAgcHJvdmlkZXI/OiB7IFtuYW1lOiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gIHRlcnJhZm9ybToge1xuICAgIHJlcXVpcmVkX3Byb3ZpZGVycz86IHtcbiAgICAgIFtuYW1lOiBzdHJpbmddOiB7IHNvdXJjZT86IHN0cmluZzsgdmVyc2lvbj86IHN0cmluZyB9O1xuICAgIH07XG4gIH07XG4gIG1vZHVsZT86IHsgW25hbWU6IHN0cmluZ106IHsgc291cmNlOiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFByb3ZpZGVyU2NoZW1hKFxuICB0YXJnZXQ6IENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LFxuKSB7XG4gIGNvbnN0IGNvbmZpZzogVGVycmFmb3JtQ29uZmlnID0ge1xuICAgIHByb3ZpZGVyOiB7fSxcbiAgICB0ZXJyYWZvcm06IHtcbiAgICAgIHJlcXVpcmVkX3Byb3ZpZGVyczoge30sXG4gICAgfSxcbiAgfTtcblxuICBjb25maWcucHJvdmlkZXIhW3RhcmdldC5uYW1lXSA9IHt9O1xuICBjb25maWcudGVycmFmb3JtLnJlcXVpcmVkX3Byb3ZpZGVycyFbdGFyZ2V0Lm5hbWVdID0ge1xuICAgIHZlcnNpb246IHRhcmdldC52ZXJzaW9uLFxuICAgIHNvdXJjZTogdGFyZ2V0LnNvdXJjZSxcbiAgfTtcblxuICBsZXQgcHJvdmlkZXJTY2hlbWE6IFByb3ZpZGVyU2NoZW1hID0geyBmb3JtYXRfdmVyc2lvbjogXCIwLjFcIiB9O1xuXG4gIGF3YWl0IHdpdGhUZW1wRGlyKFwiZmV0Y2hQcm92aWRlclNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3V0ZGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvdXRkaXIsIFwibWFpbi50Zi5qc29uXCIpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG5cbiAgICBhd2FpdCB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5KHsgY3dkOiBvdXRkaXIgfSk7XG4gICAgcHJvdmlkZXJTY2hlbWEgPSBKU09OLnBhcnNlKFxuICAgICAgYXdhaXQgZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJwcm92aWRlcnNcIiwgXCJzY2hlbWFcIiwgXCItanNvblwiXSwge1xuICAgICAgICBjd2Q6IG91dGRpcixcbiAgICAgIH0pLFxuICAgICkgYXMgUHJvdmlkZXJTY2hlbWE7XG5cbiAgICBjb25zdCB2ZXJzaW9uU2NoZW1hID0gSlNPTi5wYXJzZShcbiAgICAgIGF3YWl0IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1widmVyc2lvblwiLCBcIi1qc29uXCJdLCB7XG4gICAgICAgIGN3ZDogb3V0ZGlyLFxuICAgICAgfSksXG4gICAgKSBhcyBWZXJzaW9uU2NoZW1hO1xuXG4gICAgcHJvdmlkZXJTY2hlbWEucHJvdmlkZXJfdmVyc2lvbnMgPSB2ZXJzaW9uU2NoZW1hLnByb3ZpZGVyX3NlbGVjdGlvbnM7XG4gIH0pO1xuXG4gIC8vIFN0YW1wIHRoZSBmZXRjaGluZyBDTEkncyBpZGVudGl0eSBzbyBkb3duc3RyZWFtIGNvbnN1bWVycyBjYW4gcmVhc29uXG4gIC8vIGFib3V0IHdoaWNoIG5ld2VyLXByb3RvY29sIHNlY3Rpb25zIHRoaXMgZmV0Y2ggY291bGQgcG9zc2libHkgaGF2ZVxuICAvLyBlbWl0dGVkLiBOZXZlciBmYWlsIHRoZSBmZXRjaCBvdmVyIHRoaXMgLSBpdCdzIGJlc3QtZWZmb3J0IG1ldGFkYXRhLlxuICB0cnkge1xuICAgIGNvbnN0IGNsaSA9IGF3YWl0IGdldEZldGNoaW5nQ2xpVmVyc2lvbigpO1xuICAgIHByb3ZpZGVyU2NoZW1hLmNsaV9uYW1lID0gY2xpLm5hbWU7XG4gICAgcHJvdmlkZXJTY2hlbWEuY2xpX3ZlcnNpb24gPSBjbGkudmVyc2lvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgQ291bGQgbm90IGRldGVybWluZSBmZXRjaGluZyBDTEkgdmVyc2lvbiB0byBzdGFtcCBwcm92aWRlciBzY2hlbWE6ICR7ZXJyb3J9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHNhbml0aXplUHJvdmlkZXJTY2hlbWEocHJvdmlkZXJTY2hlbWEpO1xufVxuXG4vKipcbiAqIFdhcm5zIHdoZW4gdGhlIENMSSB0aGF0IHByb2R1Y2VkIGEgZ2l2ZW4gcHJvdmlkZXIgc2NoZW1hIHByZWRhdGVzIG9uZSBvclxuICogbW9yZSBzY2hlbWEtZW1pc3Npb24gYm91bmRhcmllcyB0aGUgcHJvamVjdCdzIGRlY2xhcmVkIGB0YXJnZXRWZXJzaW9uc2BcbiAqIGNhcmUgYWJvdXQgKHNlZSBlbWlzc2lvbi1jaGVjay50cykgLSBpLmUuIHNvbWUgbmV3ZXItcHJvdG9jb2wgc2VjdGlvbnNcbiAqIChmdW5jdGlvbnMsIGVwaGVtZXJhbCByZXNvdXJjZXMsIC4uLikgbWF5IGJlIG1pc3NpbmcgZnJvbSB0aGUgZ2VuZXJhdGVkXG4gKiBiaW5kaW5ncyBldmVuIHRob3VnaCB0aGUgc2NoZW1hIGZldGNoIGl0c2VsZiBzdWNjZWVkZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGRlY291cGxlZCBmcm9tIHRoZSBmZXRjaCBwYXRoIChyZWFkUHJvdmlkZXJTY2hlbWEpIHNvIGl0XG4gKiBhbHNvIHJ1bnMgZm9yIHNjaGVtYXMgc2VydmVkIGZyb20gdGhlIG9uLWRpc2sgY2FjaGU6IGNhY2hlZCBKU09OIGNhcnJpZXNcbiAqIHRoZSBzYW1lIGBjbGlfbmFtZWAvYGNsaV92ZXJzaW9uYCBzdGFtcHMgYSBmcmVzaCBmZXRjaCB3b3VsZCBoYXZlXG4gKiB3cml0dGVuICh0aGUgY2FjaGUga2V5IGFscmVhZHkgc2VnbWVudHMgYnkgQ0xJIHByb2R1Y3QrbWlub3IpLCBzbyB0aGUgZ2FwXG4gKiBjaGVjayBpcyBqdXN0IGFzIG1lYW5pbmdmdWwgb24gYSBjYWNoZSBoaXQgYXMgb24gYSBtaXNzLlxuICpcbiAqIE5vLW9wIHdpdGhvdXQgYHRhcmdldFZlcnNpb25zYCAtIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGFyZSB0aGUgQ0xJXG4gKiBhZ2FpbnN0LiBGYWxscyBiYWNrIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MncyBmZXRjaGluZyBDTEkgdmVyc2lvbiB3aGVuXG4gKiB0aGUgc2NoZW1hIGl0c2VsZiBpc24ndCBzdGFtcGVkIChlLmcuIG9sZGVyIGNhY2hlIGVudHJpZXMgd3JpdHRlbiBiZWZvcmVcbiAqIHN0YW1waW5nIGV4aXN0ZWQpLlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YXJuSWZTY2hlbWFFbWlzc2lvbkdhcHMoXG4gIHNjaGVtYTogUHJvdmlkZXJTY2hlbWEsXG4gIHRhcmdldFZlcnNpb25zPzogVGVycmFmb3JtVGFyZ2V0VmVyc2lvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCF0YXJnZXRWZXJzaW9ucykgcmV0dXJuO1xuXG4gIGxldCBjbGk6IFRlcnJhZm9ybUNsaVZlcnNpb247XG4gIGlmIChzY2hlbWEuY2xpX25hbWUgJiYgc2NoZW1hLmNsaV92ZXJzaW9uKSB7XG4gICAgaWYgKHNjaGVtYS5jbGlfbmFtZSAhPT0gXCJ0ZXJyYWZvcm1cIiAmJiBzY2hlbWEuY2xpX25hbWUgIT09IFwib3BlbnRvZnVcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjbGkgPSB7IG5hbWU6IHNjaGVtYS5jbGlfbmFtZSwgdmVyc2lvbjogc2NoZW1hLmNsaV92ZXJzaW9uIH07XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGNsaSA9IGF3YWl0IGdldEZldGNoaW5nQ2xpVmVyc2lvbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGZldGNoaW5nIENMSSB2ZXJzaW9uIHRvIGNoZWNrIGZvciBzY2hlbWEgZW1pc3Npb24gZ2FwczogJHtlcnJvcn1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBnYXBGYW1pbGllcyA9IGNoZWNrU2NoZW1hRW1pc3Npb25HYXBGYW1pbGllcyhjbGksIHRhcmdldFZlcnNpb25zKTtcbiAgaWYgKGdhcEZhbWlsaWVzLmxlbmd0aCA+IDAgJiYgY2xpLnZlcnNpb24pIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgIGBwcm92aWRlciBzY2hlbWEgZmV0Y2hlZCB3aXRoICR7Y2xpLm5hbWV9ICR7Y2xpLnZlcnNpb259IOKAlCAke2pvaW5XaXRoQW5kKFxuICAgICAgICBnYXBGYW1pbGllcy5tYXAoKGZhbWlseSkgPT4gU0NIRU1BX0VNSVNTSU9OX0ZBTUlMWV9MQUJFTFNbZmFtaWx5XSksXG4gICAgICApfSB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQ7IHJ1biBjZGt0biBnZXQgd2l0aCAke3N1Z2dlc3RlZEVtaXR0aW5nQ2xpVmVyc2lvbnMoXG4gICAgICAgIGdhcEZhbWlsaWVzLFxuICAgICAgKX1gLFxuICAgICk7XG4gIH1cbn1cblxuLy8gVGhlIHByb3ZpZGVycyBoYXZlIHNvbWUgcG90ZW50aWFsIGJ1Z3MgdGhhdCB3ZSB3YW50IHRvIHByby1hY3RpdmVseVxuLy8gZml4IGhlcmUgc28gdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29kZSBjYW4gYXNzdW1lIGEgY29uc2lzdGVudCBzY2hlbWEuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVQcm92aWRlclNjaGVtYShzY2hlbWE6IFByb3ZpZGVyU2NoZW1hKTogUHJvdmlkZXJTY2hlbWEge1xuICAvLyBNYWlubHkgc29tZSBhdHRyaWJ1dGVzIGFyZSBcImRvdWJsZWRcIiwgZS5nLiBbXCJsaXN0XCIsIFwic3RyaW5nXCIsIFwibGlzdFwiLCBcInN0cmluZ1wiXVxuICAvLyBpbnN0ZWFkIG9mIFtcImxpc3RcIiwgXCJzdHJpbmdcIl1cbiAgZnVuY3Rpb24gYXR0cmlidXRlRG91YmxpbmdGaXgoYXR0cmlidXRlOiBBdHRyaWJ1dGUpOiBBdHRyaWJ1dGUge1xuICAgIGlmIChpc05lc3RlZFR5cGVBdHRyaWJ1dGUoYXR0cmlidXRlKSB8fCAhQXJyYXkuaXNBcnJheShhdHRyaWJ1dGUudHlwZSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9XG4gICAgICBhdHRyaWJ1dGUudHlwZS5sZW5ndGggPT09IDJcbiAgICAgICAgPyBhdHRyaWJ1dGUudHlwZVxuICAgICAgICA6IChhdHRyaWJ1dGUudHlwZSBhcyBzdHJpbmdbXSkuc2xpY2UoMCwgMik7IC8vIFRoZSB0eXBlcyB0ZWxsIHVzIHRoaXMgY2FuJ3QgaGFwcGVuLCByZWFsaXR5IGJlZ3MgdG8gZGlmZmVyXG5cbiAgICBhdHRyaWJ1dGUudHlwZSA9IHR5cGUgYXMgQXR0cmlidXRlVHlwZTtcbiAgICByZXR1cm4gYXR0cmlidXRlO1xuICB9XG5cbiAgLy8gTXV0YXRlcyBibG9jayB3aXRoIHRoZSBmaXhcbiAgZnVuY3Rpb24gc2FuaXRpemVCbG9jayhibG9jazogQmxvY2spIHtcbiAgICBPYmplY3QudmFsdWVzKGJsb2NrLmF0dHJpYnV0ZXMgfHwge30pLmZvckVhY2goYXR0cmlidXRlRG91YmxpbmdGaXgpO1xuICAgIE9iamVjdC52YWx1ZXMoYmxvY2suYmxvY2tfdHlwZXMgfHwge30pLmZvckVhY2goKGJsb2NrVHlwZSkgPT4ge1xuICAgICAgc2FuaXRpemVCbG9jayhibG9ja1R5cGUuYmxvY2spO1xuICAgIH0pO1xuICB9XG5cbiAgT2JqZWN0LnZhbHVlcyhzY2hlbWEucHJvdmlkZXJfc2NoZW1hcyB8fCB7fSkuZm9yRWFjaCgocHJvdmlkZXIpID0+IHtcbiAgICBjb25zdCBlbnRpdGllcyA9IFtcbiAgICAgIHByb3ZpZGVyLnByb3ZpZGVyLFxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyhwcm92aWRlci5yZXNvdXJjZV9zY2hlbWFzIHx8IHt9KSxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXMocHJvdmlkZXIuZGF0YV9zb3VyY2Vfc2NoZW1hcyB8fCB7fSksXG4gICAgICAuLi5PYmplY3QudmFsdWVzKHByb3ZpZGVyLmVwaGVtZXJhbF9yZXNvdXJjZV9zY2hlbWFzIHx8IHt9KSxcbiAgICBdO1xuXG4gICAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5KSA9PiB7XG4gICAgICBzYW5pdGl6ZUJsb2NrKGVudGl0eS5ibG9jayk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBzY2hlbWE7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTW9kdWxlU2NoZW1hKHRhcmdldDogQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0KSB7XG4gIGxldCBtb2R1bGVTY2hlbWE6IFJlY29yZDxzdHJpbmcsIE1vZHVsZVNjaGVtYT4gPSB7fTtcblxuICBhd2FpdCB3aXRoVGVtcERpcihcImZldGNoU2NoZW1hXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb25maWc6IFRlcnJhZm9ybUNvbmZpZyA9IHtcbiAgICAgIHRlcnJhZm9ybToge30sXG4gICAgfTtcblxuICAgIGlmICghY29uZmlnLm1vZHVsZSkgY29uZmlnLm1vZHVsZSA9IHt9O1xuICAgIGxldCBzb3VyY2U6IHN0cmluZyA9IHRhcmdldC5zb3VyY2U7XG5cbiAgICBjb25zdCBsb2NhbFNvdXJjZSA9ICh0YXJnZXQuY29uc3RyYWludCBhcyBUZXJyYWZvcm1Nb2R1bGVDb25zdHJhaW50KVxuICAgICAgLmxvY2FsU291cmNlQWJzb2x1dGVQYXRoO1xuICAgIGlmIChsb2NhbFNvdXJjZSkge1xuICAgICAgLy8gY3JlYXRlIHJlbGF0aXZlIHBhdGggdG8gbW9kdWxlIGluIHRoZSB1c2VyIHByb2plY3RcbiAgICAgIHNvdXJjZSA9IHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgbG9jYWxTb3VyY2UpO1xuICAgIH1cblxuICAgIGNvbmZpZy5tb2R1bGVbdGFyZ2V0Lm1vZHVsZUtleV0gPSB7IHNvdXJjZTogc291cmNlIH07XG4gICAgaWYgKHRhcmdldC52ZXJzaW9uKSB7XG4gICAgICBjb25maWcubW9kdWxlW3RhcmdldC5tb2R1bGVLZXldW1widmVyc2lvblwiXSA9IHRhcmdldC52ZXJzaW9uO1xuICAgIH1cblxuICAgIGNvbnN0IG91dGRpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4ob3V0ZGlyLCBcIm1haW4udGYuanNvblwiKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xuXG4gICAgYXdhaXQgZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJnZXRcIl0sIHsgY3dkOiBvdXRkaXIgfSk7XG4gICAgaWYgKGNvbmZpZy5tb2R1bGUpIHtcbiAgICAgIG1vZHVsZVNjaGVtYSA9IGF3YWl0IGhhcnZlc3RNb2R1bGVTY2hlbWEoXG4gICAgICAgIG91dGRpcixcbiAgICAgICAgT2JqZWN0LmtleXMoY29uZmlnLm1vZHVsZSksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG1vZHVsZVNjaGVtYTtcbn1cbiJdfQ==
|
|
563
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3ZpZGVyLXNjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4Q0Esc0RBT0M7QUFvQ0Qsd0RBeUJDO0FBOEtELGdEQXFEQztBQXNCRCw0REFpQ0M7QUFJRCx3REF1Q0M7QUFvRUQsb0VBb0NDO0FBZUQsZ0VBZ0NDO0FBUUQsc0NBV0M7QUFhRCw0Q0FtQ0M7QUF5QkQsNENBb0VDO0FBOXVCRCwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLDZDQUErQjtBQUMvQiwyQ0FBNkI7QUFFN0IsOENBQStDO0FBQy9DLDRDQW1Cd0I7QUFDeEIscURBSTBCO0FBRTFCLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxXQUFXLENBQUM7QUFFN0UsSUFBSSx5QkFBbUUsQ0FBQztBQUV4RTs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixxQkFBcUI7SUFDbkMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDL0IseUJBQXlCLEdBQUcsSUFBQSxjQUFJLEVBQUMsbUJBQW1CLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNqRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTtTQUNuQixDQUFDLENBQUMsSUFBSSxDQUFDLGtDQUF3QixDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELE9BQU8seUJBQXlCLENBQUM7QUFDbkMsQ0FBQztBQUVELG1FQUFtRTtBQUNuRSxxRUFBcUU7QUFDckUsc0VBQXNFO0FBQ3RFLE1BQU0sNkJBQTZCLEdBQUc7SUFDcEMsYUFBYTtJQUNiLGNBQWM7SUFDZCxzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYixZQUFZO0lBQ1osWUFBWTtJQUNaLGlCQUFpQjtDQUNsQixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7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QUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxVQUFVLENBQUM7UUFDbkIsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLFlBQVksR0FBRyxNQUFNLG1CQUFtQixDQUN0QyxNQUFNLEVBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQzNCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBjb252ZXJ0RmlsZXMgfSBmcm9tIFwiQGNka3RuL2hjbDJqc29uXCI7XG5pbXBvcnQge1xuICBBdHRyaWJ1dGUsXG4gIEF0dHJpYnV0ZVR5cGUsXG4gIEJsb2NrLFxuICBDb25zdHJ1Y3RzTWFrZXJNb2R1bGVUYXJnZXQsXG4gIENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LFxuICBJbnB1dCxcbiAgTW9kdWxlSW5kZXgsXG4gIE1vZHVsZVNjaGVtYSxcbiAgUHJvdmlkZXJTY2hlbWEsXG4gIFRlcnJhZm9ybUNsaVZlcnNpb24sXG4gIFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQsXG4gIFRlcnJhZm9ybVRhcmdldFZlcnNpb25zLFxuICBWZXJzaW9uU2NoZW1hLFxuICBleGVjLFxuICBpc05lc3RlZFR5cGVBdHRyaWJ1dGUsXG4gIGxvZ2dlcixcbiAgcGFyc2VUZXJyYWZvcm1DbGlWZXJzaW9uLFxuICB3aXRoVGVtcERpcixcbn0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQge1xuICBTQ0hFTUFfRU1JU1NJT05fRkFNSUxZX0xBQkVMUyxcbiAgY2hlY2tTY2hlbWFFbWlzc2lvbkdhcEZhbWlsaWVzLFxuICBzdWdnZXN0ZWRFbWl0dGluZ0NsaVZlcnNpb25zLFxufSBmcm9tIFwiLi9lbWlzc2lvbi1jaGVja1wiO1xuXG5jb25zdCB0ZXJyYWZvcm1CaW5hcnlOYW1lID0gcHJvY2Vzcy5lbnYuVEVSUkFGT1JNX0JJTkFSWV9OQU1FIHx8IFwidGVycmFmb3JtXCI7XG5cbmxldCBmZXRjaGluZ0NsaVZlcnNpb25Qcm9taXNlOiBQcm9taXNlPFRlcnJhZm9ybUNsaVZlcnNpb24+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHZlcnNpb24gb2YgdGhlIGZldGNoaW5nIENMSSAoYHRlcnJhZm9ybWAvYHRvZnVgIGJpbmFyeVxuICogcmVzb2x2ZWQgdmlhIGBURVJSQUZPUk1fQklOQVJZX05BTUVgKSBvbmNlIHBlciBwcm9jZXNzLCBtZW1vaXplZC5cbiAqXG4gKiBVc2VkIGJvdGggdG8gc3RhbXAgZmV0Y2hlZCBwcm92aWRlciBzY2hlbWFzIChgY2xpX25hbWVgL2BjbGlfdmVyc2lvbmApXG4gKiBhbmQgYXMgdGhlIGNhY2hlIGtleSBzdWZmaXggaW4gcmVhZC50cywgc2luY2Ugc2NoZW1hIGVtaXNzaW9uIGlzIGZpeGVkXG4gKiBwZXIgQ0xJIG1pbm9yIHZlcnNpb24uXG4gKlxuICogQGludGVybmFsIGV4cG9zZWQgZm9yIHRlc3RpbmcgbGlrZSB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGZXRjaGluZ0NsaVZlcnNpb24oKTogUHJvbWlzZTxUZXJyYWZvcm1DbGlWZXJzaW9uPiB7XG4gIGlmICghZmV0Y2hpbmdDbGlWZXJzaW9uUHJvbWlzZSkge1xuICAgIGZldGNoaW5nQ2xpVmVyc2lvblByb21pc2UgPSBleGVjKHRlcnJhZm9ybUJpbmFyeU5hbWUsIFtcInZlcnNpb25cIl0sIHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICB9KS50aGVuKHBhcnNlVGVycmFmb3JtQ2xpVmVyc2lvbik7XG4gIH1cbiAgcmV0dXJuIGZldGNoaW5nQ2xpVmVyc2lvblByb21pc2U7XG59XG5cbi8vIFByb3ZpZGVyIGJpbmFyaWVzIGFyZSBkb3dubG9hZGVkIGZyb20gR2l0SHViIHJlbGVhc2UgQ0ROcyBkdXJpbmdcbi8vIGB0ZXJyYWZvcm0gaW5pdGAsIHdoaWNoIGludGVybWl0dGVudGx5IHJldHVybnMgNXh4LiBSZXRyeSBvbiB0aG9zZVxuLy8gc2lnbmF0dXJlcyBvbmx5IOKAlCByZWFsIGNvbmZpZy9zY2hlbWEgZXJyb3JzIHNob3VsZCBzdGlsbCBmYWlsIGZhc3QuXG5jb25zdCBUUkFOU0lFTlRfSU5JVF9FUlJPUl9QQVRURVJOUyA9IFtcbiAgL1xcYjUwWzIzNF1cXGIvLFxuICAvQmFkIEdhdGV3YXkvaSxcbiAgL1NlcnZpY2UgVW5hdmFpbGFibGUvaSxcbiAgL0dhdGV3YXkgVGltZW91dC9pLFxuICAvRUNPTk5SRVNFVC9pLFxuICAvRVRJTUVET1VUL2ksXG4gIC9FQUlfQUdBSU4vaSxcbiAgL3VuZXhwZWN0ZWQgRU9GL2ksXG5dO1xuXG4vKipcbiAqIFJ1bnMgYHRlcnJhZm9ybSBpbml0YCBhbmQgcmV0cmllcyBvbiB0cmFuc2llbnQgSFRUUC9uZXR3b3JrIGZhaWx1cmVzLlxuICpcbiAqIFByb3ZpZGVyIGJpbmFyaWVzIGFyZSBwdWxsZWQgZnJvbSBHaXRIdWIncyByZWxlYXNlIENETiwgd2hpY2hcbiAqIGludGVybWl0dGVudGx5IHJldHVybnMgNXh4LiBUaGUgcmV0cnkgb25seSBmaXJlcyB3aGVuIHN0ZGVyciBtYXRjaGVzIGFcbiAqIGtub3duIHRyYW5zaWVudCBwYXR0ZXJuIOKAlCByZWFsIGVycm9ycyAoYmFkIHZlcnNpb24sIHNjaGVtYSBwYXJzZSwgZXRjLilcbiAqIHN0aWxsIGZhaWwgb24gdGhlIGZpcnN0IGF0dGVtcHQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBzcGF3biBvcHRpb25zIGZvcndhcmRlZCB0byBgZXhlY2AgKGBjd2RgIGlzIHJlcXVpcmVkIHNvXG4gKiAgIGB0ZXJyYWZvcm0gaW5pdGAgcnVucyBpbnNpZGUgdGhlIHRlbXAgZGlyIGhvbGRpbmcgYG1haW4udGYuanNvbmApXG4gKiBAcGFyYW0gbWF4QXR0ZW1wdHMgLSB0b3RhbCBhdHRlbXB0cyBpbmNsdWRpbmcgdGhlIGluaXRpYWwgY2FsbDsgdGhlIG51bWJlclxuICogICBvZiByZXRyaWVzIGlzIGBtYXhBdHRlbXB0cyAtIDFgLiBEZWZhdWx0cyB0byA1ICgxIGluaXRpYWwgKyA0IHJldHJpZXMpXG4gKiBAcGFyYW0gYmFzZURlbGF5TXMgLSBkZWxheSBiZWZvcmUgdGhlIGZpcnN0IHJldHJ5LiBUZXN0cyBwYXNzIGAwYCB0byBza2lwXG4gKiAgIHdhaXRzLiBEZWZhdWx0cyB0byA1MDAwbXNcbiAqIEBwYXJhbSBiYWNrb2ZmTXVsdGlwbGllciAtIGZhY3RvciBhcHBsaWVkIHRvIHRoZSBkZWxheSBvbiBlYWNoIHN1YnNlcXVlbnRcbiAqICAgcmV0cnkgKHNvIHJldHJpZXMgd2FpdCBgYmFzZURlbGF5TXMgKiBtdWx0aXBsaWVyXihhdHRlbXB0LTEpYCkuIERlZmF1bHRzXG4gKiAgIHRvIDIgKDFzIOKGkiAycyDihpIgNHMg4oCmKVxuICogQHJldHVybnMgc3Rkb3V0IGZyb20gdGhlIHN1Y2Nlc3NmdWwgYHRlcnJhZm9ybSBpbml0YCBpbnZvY2F0aW9uXG4gKiBAaW50ZXJuYWwgZXhwb3NlZCBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVycmFmb3JtSW5pdFdpdGhSZXRyeShcbiAgb3B0aW9uczogeyBjd2Q6IHN0cmluZyB9LFxuICBtYXhBdHRlbXB0cyA9IDUsXG4gIGJhc2VEZWxheU1zID0gNTAwMCxcbiAgYmFja29mZk11bHRpcGxpZXIgPSAyLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJpbml0XCJdLCBvcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCBzdGRlcnI6IHN0cmluZyA9IGVycm9yPy5zdGRlcnIgPz8gXCJcIjtcbiAgICAgIGNvbnN0IHRyYW5zaWVudCA9IFRSQU5TSUVOVF9JTklUX0VSUk9SX1BBVFRFUk5TLnNvbWUoKHApID0+XG4gICAgICAgIHAudGVzdChzdGRlcnIpLFxuICAgICAgKTtcbiAgICAgIGlmICghdHJhbnNpZW50IHx8IGF0dGVtcHQgPT09IG1heEF0dGVtcHRzKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVsYXlNcyA9IGJhc2VEZWxheU1zICogYmFja29mZk11bHRpcGxpZXIgKiogKGF0dGVtcHQgLSAxKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgdGVycmFmb3JtIGluaXQgZmFpbGVkIHdpdGggYSB0cmFuc2llbnQgZXJyb3IsIHJldHJ5aW5nIGluICR7ZGVsYXlNc31tcyAoYXR0ZW1wdCAke2F0dGVtcHR9LyR7bWF4QXR0ZW1wdHMgLSAxfSlgLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5TXMpKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwidW5yZWFjaGFibGVcIik7XG59XG5cbi8qKlxuICogRnVsbHkgUXVhbGlmaWVkIHByb3ZpZGVyIG5hbWUgaW4gdGhlIGZvcm1hdDpcbiAqIGxpa2UgZS5nLiByZWdpc3RyeS50ZXJyYWZvcm0uaW8vaGFzaGljb3JwL2F3c1xuICovXG5leHBvcnQgdHlwZSBGUVBOID0gc3RyaW5nICYgeyBfX3R5cGU6IFwiRnVsbHlRdWFsaWZpZWRQcm92aWRlck5hbWVcIiB9O1xuZXhwb3J0IHR5cGUgUHJvdmlkZXJIb3N0bmFtZSA9IHN0cmluZyAmIHsgX190eXBlOiBcIlByb3ZpZGVySG9zdG5hbWVcIiB9O1xuZXhwb3J0IHR5cGUgUHJvdmlkZXJOYW1lc3BhY2UgPSBzdHJpbmcgJiB7IF9fdHlwZTogXCJQcm92aWRlck5hbWVzcGFjZVwiIH07XG5leHBvcnQgdHlwZSBQcm92aWRlck5hbWUgPSBzdHJpbmcgJiB7IF9fdHlwZTogXCJQcm92aWRlck5hbWVcIiB9O1xuXG5leHBvcnQgY29uc3QgcGFyc2VGUVBOID0gKGY6IEZRUE4pID0+IHtcbiAgY29uc3QgW2hvc3RuYW1lLCBuYW1lc3BhY2UsIG5hbWVdID0gZi5zcGxpdChcIi9cIik7XG4gIGlmICghbmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgY2FuJ3QgaGFuZGxlICR7Zn1gKTtcbiAgfVxuICByZXR1cm4geyBob3N0bmFtZSwgbmFtZXNwYWNlLCBuYW1lIH0gYXMge1xuICAgIGhvc3RuYW1lOiBQcm92aWRlckhvc3RuYW1lO1xuICAgIG5hbWVzcGFjZTogUHJvdmlkZXJOYW1lc3BhY2U7XG4gICAgbmFtZTogUHJvdmlkZXJOYW1lO1xuICB9O1xufTtcblxuY29uc3QgdW53cmFwSWZBcnJheSA9IDxUPihpdGVtOiBUIHwgVFtdKTogVCA9PlxuICBBcnJheS5pc0FycmF5KGl0ZW0pID8gaXRlbVswXSA6IGl0ZW07XG5cbmNvbnN0IHRyYW5zZm9ybVZhcmlhYmxlcyA9ICh2YXJpYWJsZXM6IGFueSkgPT4ge1xuICBjb25zdCByZXN1bHQ6IElucHV0W10gPSBbXTtcblxuICBpZiAoIXZhcmlhYmxlcykgcmV0dXJuIHJlc3VsdDtcblxuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXModmFyaWFibGVzKSkge1xuICAgIGNvbnN0IHZhcmlhYmxlID0gdW53cmFwSWZBcnJheSh2YXJpYWJsZXNbbmFtZV0pO1xuICAgIGxldCB2YXJpYWJsZVR5cGU6IHN0cmluZztcblxuICAgIGlmIChcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIHZhcmlhYmxlLmhhc093blByb3BlcnR5KFwidHlwZVwiKSA9PSBmYWxzZSAmJlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgdmFyaWFibGUuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0XCIpID09IHRydWVcbiAgICApIHtcbiAgICAgIHN3aXRjaCAodHlwZW9mIHZhcmlhYmxlW1wiZGVmYXVsdFwiXSkge1xuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgIHZhcmlhYmxlVHlwZSA9IFwiYm9vbFwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgdmFyaWFibGVUeXBlID0gXCJudW1iZXJcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB2YXJpYWJsZVR5cGUgPSBcImFueVwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByYXdWYXJpYWJsZVR5cGUgPSB2YXJpYWJsZVtcInR5cGVcIl07XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiByYXdWYXJpYWJsZVR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmF3VmFyaWFibGVUeXBlLnN0YXJ0c1dpdGgoXCIke1wiKSAmJlxuICAgICAgICByYXdWYXJpYWJsZVR5cGUuZW5kc1dpdGgoXCJ9XCIpICYmXG4gICAgICAgICFyYXdWYXJpYWJsZVR5cGUuaW5jbHVkZXMoXCJcXG5cIilcbiAgICAgICkge1xuICAgICAgICB2YXJpYWJsZVR5cGUgPSByYXdWYXJpYWJsZVR5cGUuc2xpY2UoMiwgLTEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyaWFibGVUeXBlID0gXCJhbnlcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpdGVtOiBJbnB1dCA9IHtcbiAgICAgIG5hbWUsXG4gICAgICB0eXBlOiB2YXJpYWJsZVR5cGUsXG4gICAgICBkZXNjcmlwdGlvbjogdmFyaWFibGVbXCJkZXNjcmlwdGlvblwiXSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIHJlcXVpcmVkOiB2YXJpYWJsZS5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRcIikgPT0gZmFsc2UsXG4gICAgfTtcblxuICAgIGlmICghaXRlbS5yZXF1aXJlZCkge1xuICAgICAgaXRlbVtcImRlZmF1bHRcIl0gPSB2YXJpYWJsZVtcImRlZmF1bHRcIl07XG4gICAgfVxuXG4gICAgcmVzdWx0LnB1c2goaXRlbSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgdHJhbnNmb3JtT3V0cHV0cyA9IChvdXRwdXRzOiBhbnkpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgaWYgKG91dHB1dHMpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMob3V0cHV0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IHVud3JhcElmQXJyYXkob3V0cHV0c1tuYW1lXSk7XG5cbiAgICAgIGNvbnN0IGl0ZW06IGFueSA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IG91dHB1dFtcImRlc2NyaXB0aW9uXCJdLFxuICAgICAgfTtcblxuICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IGhhcnZlc3RNb2R1bGVTY2hlbWEgPSBhc3luYyAoXG4gIHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZyxcbiAgbW9kdWxlczogc3RyaW5nW10sXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+ID0+IHtcbiAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmpvaW4oXG4gICAgd29ya2luZ0RpcmVjdG9yeSxcbiAgICBcIi50ZXJyYWZvcm1cIixcbiAgICBcIm1vZHVsZXNcIixcbiAgICBcIm1vZHVsZXMuanNvblwiLFxuICApO1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZU5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1vZHVsZXMgd2VyZSBub3QgZ2VuZXJhdGVkIHByb3Blcmx5IC0gY291bGRuJ3QgZmluZCAke2ZpbGVOYW1lfWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZUluZGV4ID0gSlNPTi5wYXJzZShcbiAgICBmcy5yZWFkRmlsZVN5bmMoZmlsZU5hbWUsIFwidXRmLThcIiksXG4gICkgYXMgTW9kdWxlSW5kZXg7XG5cbiAgZm9yIChjb25zdCBtb2Qgb2YgbW9kdWxlcykge1xuICAgIGNvbnN0IG0gPSBtb2R1bGVJbmRleC5Nb2R1bGVzLmZpbmQoKG90aGVyKSA9PiBtb2QgPT09IG90aGVyLktleSk7XG5cbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCAke219YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gYXdhaXQgY29udmVydEZpbGVzKHBhdGguam9pbih3b3JraW5nRGlyZWN0b3J5LCBtLkRpcikpO1xuXG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1vZHVsZXMgd2VyZSBub3QgZ2VuZXJhdGVkIHByb3Blcmx5IC0gY291bGRuJ3QgcGFyc2UgJHttLkRpcn1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWE6IE1vZHVsZVNjaGVtYSA9IHtcbiAgICAgIGlucHV0czogdHJhbnNmb3JtVmFyaWFibGVzKHBhcnNlZC52YXJpYWJsZSksXG4gICAgICBvdXRwdXRzOiB0cmFuc2Zvcm1PdXRwdXRzKHBhcnNlZC5vdXRwdXQpLFxuICAgICAgbmFtZTogbW9kLFxuICAgIH07XG5cbiAgICByZXN1bHRbbW9kXSA9IHNjaGVtYTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5mdW5jdGlvbiBqb2luV2l0aEFuZChpdGVtczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBpZiAoaXRlbXMubGVuZ3RoIDw9IDEpIHJldHVybiBpdGVtcy5qb2luKFwiXCIpO1xuICByZXR1cm4gYCR7aXRlbXMuc2xpY2UoMCwgLTEpLmpvaW4oXCIsIFwiKX0gYW5kICR7aXRlbXNbaXRlbXMubGVuZ3RoIC0gMV19YDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1Db25maWcge1xuICAvLyBhIGxpc3QgaG9sZHMgc2V2ZXJhbCBjb25maWd1cmF0aW9ucyBvZiB0aGUgc2FtZSBwcm92aWRlciwgd2hpY2ggaXMgaG93XG4gIC8vIGFsaWFzZWQgcHJvdmlkZXIgYmxvY2tzIGFyZSBleHByZXNzZWQgaW4gSlNPTiBzeW50YXhcbiAgcHJvdmlkZXI/OiB7IFtuYW1lOiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PltdIH07XG4gIHRlcnJhZm9ybToge1xuICAgIHJlcXVpcmVkX3Byb3ZpZGVycz86IHtcbiAgICAgIFtuYW1lOiBzdHJpbmddOiB7IHNvdXJjZT86IHN0cmluZzsgdmVyc2lvbj86IHN0cmluZyB9O1xuICAgIH07XG4gIH07XG4gIG1vZHVsZT86IHtcbiAgICBbbmFtZTogc3RyaW5nXToge1xuICAgICAgc291cmNlOiBzdHJpbmc7XG4gICAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgICAgcHJvdmlkZXJzPzogeyBbbG9jYWxOYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFByb3ZpZGVyU2NoZW1hKFxuICB0YXJnZXQ6IENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LFxuKSB7XG4gIGNvbnN0IGNvbmZpZzogVGVycmFmb3JtQ29uZmlnID0ge1xuICAgIHByb3ZpZGVyOiB7fSxcbiAgICB0ZXJyYWZvcm06IHtcbiAgICAgIHJlcXVpcmVkX3Byb3ZpZGVyczoge30sXG4gICAgfSxcbiAgfTtcblxuICBjb25maWcucHJvdmlkZXIhW3RhcmdldC5uYW1lXSA9IHt9O1xuICBjb25maWcudGVycmFmb3JtLnJlcXVpcmVkX3Byb3ZpZGVycyFbdGFyZ2V0Lm5hbWVdID0ge1xuICAgIHZlcnNpb246IHRhcmdldC52ZXJzaW9uLFxuICAgIHNvdXJjZTogdGFyZ2V0LnNvdXJjZSxcbiAgfTtcblxuICBsZXQgcHJvdmlkZXJTY2hlbWE6IFByb3ZpZGVyU2NoZW1hID0geyBmb3JtYXRfdmVyc2lvbjogXCIwLjFcIiB9O1xuXG4gIGF3YWl0IHdpdGhUZW1wRGlyKFwiZmV0Y2hQcm92aWRlclNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3V0ZGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvdXRkaXIsIFwibWFpbi50Zi5qc29uXCIpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG5cbiAgICBhd2FpdCB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5KHsgY3dkOiBvdXRkaXIgfSk7XG4gICAgcHJvdmlkZXJTY2hlbWEgPSBKU09OLnBhcnNlKFxuICAgICAgYXdhaXQgZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJwcm92aWRlcnNcIiwgXCJzY2hlbWFcIiwgXCItanNvblwiXSwge1xuICAgICAgICBjd2Q6IG91dGRpcixcbiAgICAgIH0pLFxuICAgICkgYXMgUHJvdmlkZXJTY2hlbWE7XG5cbiAgICBjb25zdCB2ZXJzaW9uU2NoZW1hID0gSlNPTi5wYXJzZShcbiAgICAgIGF3YWl0IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1widmVyc2lvblwiLCBcIi1qc29uXCJdLCB7XG4gICAgICAgIGN3ZDogb3V0ZGlyLFxuICAgICAgfSksXG4gICAgKSBhcyBWZXJzaW9uU2NoZW1hO1xuXG4gICAgcHJvdmlkZXJTY2hlbWEucHJvdmlkZXJfdmVyc2lvbnMgPSB2ZXJzaW9uU2NoZW1hLnByb3ZpZGVyX3NlbGVjdGlvbnM7XG4gIH0pO1xuXG4gIC8vIFN0YW1wIHRoZSBmZXRjaGluZyBDTEkncyBpZGVudGl0eSBzbyBkb3duc3RyZWFtIGNvbnN1bWVycyBjYW4gcmVhc29uXG4gIC8vIGFib3V0IHdoaWNoIG5ld2VyLXByb3RvY29sIHNlY3Rpb25zIHRoaXMgZmV0Y2ggY291bGQgcG9zc2libHkgaGF2ZVxuICAvLyBlbWl0dGVkLiBOZXZlciBmYWlsIHRoZSBmZXRjaCBvdmVyIHRoaXMgLSBpdCdzIGJlc3QtZWZmb3J0IG1ldGFkYXRhLlxuICB0cnkge1xuICAgIGNvbnN0IGNsaSA9IGF3YWl0IGdldEZldGNoaW5nQ2xpVmVyc2lvbigpO1xuICAgIHByb3ZpZGVyU2NoZW1hLmNsaV9uYW1lID0gY2xpLm5hbWU7XG4gICAgcHJvdmlkZXJTY2hlbWEuY2xpX3ZlcnNpb24gPSBjbGkudmVyc2lvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgQ291bGQgbm90IGRldGVybWluZSBmZXRjaGluZyBDTEkgdmVyc2lvbiB0byBzdGFtcCBwcm92aWRlciBzY2hlbWE6ICR7ZXJyb3J9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHNhbml0aXplUHJvdmlkZXJTY2hlbWEocHJvdmlkZXJTY2hlbWEpO1xufVxuXG4vKipcbiAqIFdhcm5zIHdoZW4gdGhlIENMSSB0aGF0IHByb2R1Y2VkIGEgZ2l2ZW4gcHJvdmlkZXIgc2NoZW1hIHByZWRhdGVzIG9uZSBvclxuICogbW9yZSBzY2hlbWEtZW1pc3Npb24gYm91bmRhcmllcyB0aGUgcHJvamVjdCdzIGRlY2xhcmVkIGB0YXJnZXRWZXJzaW9uc2BcbiAqIGNhcmUgYWJvdXQgKHNlZSBlbWlzc2lvbi1jaGVjay50cykgLSBpLmUuIHNvbWUgbmV3ZXItcHJvdG9jb2wgc2VjdGlvbnNcbiAqIChmdW5jdGlvbnMsIGVwaGVtZXJhbCByZXNvdXJjZXMsIC4uLikgbWF5IGJlIG1pc3NpbmcgZnJvbSB0aGUgZ2VuZXJhdGVkXG4gKiBiaW5kaW5ncyBldmVuIHRob3VnaCB0aGUgc2NoZW1hIGZldGNoIGl0c2VsZiBzdWNjZWVkZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGRlY291cGxlZCBmcm9tIHRoZSBmZXRjaCBwYXRoIChyZWFkUHJvdmlkZXJTY2hlbWEpIHNvIGl0XG4gKiBhbHNvIHJ1bnMgZm9yIHNjaGVtYXMgc2VydmVkIGZyb20gdGhlIG9uLWRpc2sgY2FjaGU6IGNhY2hlZCBKU09OIGNhcnJpZXNcbiAqIHRoZSBzYW1lIGBjbGlfbmFtZWAvYGNsaV92ZXJzaW9uYCBzdGFtcHMgYSBmcmVzaCBmZXRjaCB3b3VsZCBoYXZlXG4gKiB3cml0dGVuICh0aGUgY2FjaGUga2V5IGFscmVhZHkgc2VnbWVudHMgYnkgQ0xJIHByb2R1Y3QrbWlub3IpLCBzbyB0aGUgZ2FwXG4gKiBjaGVjayBpcyBqdXN0IGFzIG1lYW5pbmdmdWwgb24gYSBjYWNoZSBoaXQgYXMgb24gYSBtaXNzLlxuICpcbiAqIE5vLW9wIHdpdGhvdXQgYHRhcmdldFZlcnNpb25zYCAtIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGFyZSB0aGUgQ0xJXG4gKiBhZ2FpbnN0LiBGYWxscyBiYWNrIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MncyBmZXRjaGluZyBDTEkgdmVyc2lvbiB3aGVuXG4gKiB0aGUgc2NoZW1hIGl0c2VsZiBpc24ndCBzdGFtcGVkIChlLmcuIG9sZGVyIGNhY2hlIGVudHJpZXMgd3JpdHRlbiBiZWZvcmVcbiAqIHN0YW1waW5nIGV4aXN0ZWQpLlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YXJuSWZTY2hlbWFFbWlzc2lvbkdhcHMoXG4gIHNjaGVtYTogUHJvdmlkZXJTY2hlbWEsXG4gIHRhcmdldFZlcnNpb25zPzogVGVycmFmb3JtVGFyZ2V0VmVyc2lvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCF0YXJnZXRWZXJzaW9ucykgcmV0dXJuO1xuXG4gIGxldCBjbGk6IFRlcnJhZm9ybUNsaVZlcnNpb247XG4gIGlmIChzY2hlbWEuY2xpX25hbWUgJiYgc2NoZW1hLmNsaV92ZXJzaW9uKSB7XG4gICAgaWYgKHNjaGVtYS5jbGlfbmFtZSAhPT0gXCJ0ZXJyYWZvcm1cIiAmJiBzY2hlbWEuY2xpX25hbWUgIT09IFwib3BlbnRvZnVcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjbGkgPSB7IG5hbWU6IHNjaGVtYS5jbGlfbmFtZSwgdmVyc2lvbjogc2NoZW1hLmNsaV92ZXJzaW9uIH07XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGNsaSA9IGF3YWl0IGdldEZldGNoaW5nQ2xpVmVyc2lvbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGZldGNoaW5nIENMSSB2ZXJzaW9uIHRvIGNoZWNrIGZvciBzY2hlbWEgZW1pc3Npb24gZ2FwczogJHtlcnJvcn1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBnYXBGYW1pbGllcyA9IGNoZWNrU2NoZW1hRW1pc3Npb25HYXBGYW1pbGllcyhjbGksIHRhcmdldFZlcnNpb25zKTtcbiAgaWYgKGdhcEZhbWlsaWVzLmxlbmd0aCA+IDAgJiYgY2xpLnZlcnNpb24pIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgIGBwcm92aWRlciBzY2hlbWEgZmV0Y2hlZCB3aXRoICR7Y2xpLm5hbWV9ICR7Y2xpLnZlcnNpb259IOKAlCAke2pvaW5XaXRoQW5kKFxuICAgICAgICBnYXBGYW1pbGllcy5tYXAoKGZhbWlseSkgPT4gU0NIRU1BX0VNSVNTSU9OX0ZBTUlMWV9MQUJFTFNbZmFtaWx5XSksXG4gICAgICApfSB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQ7IHJ1biBjZGt0biBnZXQgd2l0aCAke3N1Z2dlc3RlZEVtaXR0aW5nQ2xpVmVyc2lvbnMoXG4gICAgICAgIGdhcEZhbWlsaWVzLFxuICAgICAgKX1gLFxuICAgICk7XG4gIH1cbn1cblxuLy8gVGhlIHByb3ZpZGVycyBoYXZlIHNvbWUgcG90ZW50aWFsIGJ1Z3MgdGhhdCB3ZSB3YW50IHRvIHByby1hY3RpdmVseVxuLy8gZml4IGhlcmUgc28gdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29kZSBjYW4gYXNzdW1lIGEgY29uc2lzdGVudCBzY2hlbWEuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVQcm92aWRlclNjaGVtYShzY2hlbWE6IFByb3ZpZGVyU2NoZW1hKTogUHJvdmlkZXJTY2hlbWEge1xuICAvLyBNYWlubHkgc29tZSBhdHRyaWJ1dGVzIGFyZSBcImRvdWJsZWRcIiwgZS5nLiBbXCJsaXN0XCIsIFwic3RyaW5nXCIsIFwibGlzdFwiLCBcInN0cmluZ1wiXVxuICAvLyBpbnN0ZWFkIG9mIFtcImxpc3RcIiwgXCJzdHJpbmdcIl1cbiAgZnVuY3Rpb24gYXR0cmlidXRlRG91YmxpbmdGaXgoYXR0cmlidXRlOiBBdHRyaWJ1dGUpOiBBdHRyaWJ1dGUge1xuICAgIGlmIChpc05lc3RlZFR5cGVBdHRyaWJ1dGUoYXR0cmlidXRlKSB8fCAhQXJyYXkuaXNBcnJheShhdHRyaWJ1dGUudHlwZSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9XG4gICAgICBhdHRyaWJ1dGUudHlwZS5sZW5ndGggPT09IDJcbiAgICAgICAgPyBhdHRyaWJ1dGUudHlwZVxuICAgICAgICA6IChhdHRyaWJ1dGUudHlwZSBhcyBzdHJpbmdbXSkuc2xpY2UoMCwgMik7IC8vIFRoZSB0eXBlcyB0ZWxsIHVzIHRoaXMgY2FuJ3QgaGFwcGVuLCByZWFsaXR5IGJlZ3MgdG8gZGlmZmVyXG5cbiAgICBhdHRyaWJ1dGUudHlwZSA9IHR5cGUgYXMgQXR0cmlidXRlVHlwZTtcbiAgICByZXR1cm4gYXR0cmlidXRlO1xuICB9XG5cbiAgLy8gTXV0YXRlcyBibG9jayB3aXRoIHRoZSBmaXhcbiAgZnVuY3Rpb24gc2FuaXRpemVCbG9jayhibG9jazogQmxvY2spIHtcbiAgICBPYmplY3QudmFsdWVzKGJsb2NrLmF0dHJpYnV0ZXMgfHwge30pLmZvckVhY2goYXR0cmlidXRlRG91YmxpbmdGaXgpO1xuICAgIE9iamVjdC52YWx1ZXMoYmxvY2suYmxvY2tfdHlwZXMgfHwge30pLmZvckVhY2goKGJsb2NrVHlwZSkgPT4ge1xuICAgICAgc2FuaXRpemVCbG9jayhibG9ja1R5cGUuYmxvY2spO1xuICAgIH0pO1xuICB9XG5cbiAgT2JqZWN0LnZhbHVlcyhzY2hlbWEucHJvdmlkZXJfc2NoZW1hcyB8fCB7fSkuZm9yRWFjaCgocHJvdmlkZXIpID0+IHtcbiAgICBjb25zdCBlbnRpdGllcyA9IFtcbiAgICAgIHByb3ZpZGVyLnByb3ZpZGVyLFxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyhwcm92aWRlci5yZXNvdXJjZV9zY2hlbWFzIHx8IHt9KSxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXMocHJvdmlkZXIuZGF0YV9zb3VyY2Vfc2NoZW1hcyB8fCB7fSksXG4gICAgICAuLi5PYmplY3QudmFsdWVzKHByb3ZpZGVyLmVwaGVtZXJhbF9yZXNvdXJjZV9zY2hlbWFzIHx8IHt9KSxcbiAgICBdO1xuXG4gICAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5KSA9PiB7XG4gICAgICBzYW5pdGl6ZUJsb2NrKGVudGl0eS5ibG9jayk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBzY2hlbWE7XG59XG5cbi8qKlxuICogQSBwcm92aWRlciBjb25maWd1cmF0aW9uIHRoYXQgYSBtb2R1bGUgZXhwZWN0cyB0byBiZSBoYW5kZWQgYnkgaXRzIGNhbGxlcixcbiAqIGRlY2xhcmVkIGFzIGBjb25maWd1cmF0aW9uX2FsaWFzZXNgIGluIHRoZSBtb2R1bGUncyBgcmVxdWlyZWRfcHJvdmlkZXJzYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVQcm92aWRlckFsaWFzIHtcbiAgLyoqIGxvY2FsIG5hbWUgdGhlIG1vZHVsZSBrbm93cyB0aGUgcHJvdmlkZXIgYnksIGUuZy4gYGF3c2AgKi9cbiAgbG9jYWxOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBhbGlhcyBwYXJ0IG9mIHRoZSByZWZlcmVuY2UsIGUuZy4gYGdsb2JhbF9yZWdpb25gOyBhYnNlbnQgd2hlbiB0aGUgbW9kdWxlXG4gICAqIGxpc3RzIHRoZSBiYXJlIGxvY2FsIG5hbWUgKGBjb25maWd1cmF0aW9uX2FsaWFzZXMgPSBbYXdzXWApLCB3aGljaFxuICAgKiByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIHBhc3MgaXRzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBleHBsaWNpdGx5XG4gICAqL1xuICBhbGlhcz86IHN0cmluZztcbiAgLyoqIHByb3ZpZGVyIHNvdXJjZSB0aGUgbW9kdWxlIGRlY2xhcmVkIGZvciBgbG9jYWxOYW1lYCwgaWYgaXQgZGVjbGFyZWQgb25lICovXG4gIHNvdXJjZT86IHN0cmluZztcbn1cblxuY29uc3QgQ09ORklHVVJBVElPTl9BTElBUyA9IC9eKFtcXHctXSspKD86XFwuKFtcXHctXSspKT8kLztcblxuY29uc3QgcHJvdmlkZXJSZWZlcmVuY2UgPSAoeyBsb2NhbE5hbWUsIGFsaWFzIH06IE1vZHVsZVByb3ZpZGVyQWxpYXMpID0+XG4gIGFsaWFzID8gYCR7bG9jYWxOYW1lfS4ke2FsaWFzfWAgOiBsb2NhbE5hbWU7XG5cbi8vIGhjbDJqc29uIGhhbmRzIEhDTCBleHByZXNzaW9ucyBiYWNrIGFzIGludGVycG9sYXRpb25zLCBzbyBhXG4vLyBgY29uZmlndXJhdGlvbl9hbGlhc2VzID0gW2F3cy5nbG9iYWxfcmVnaW9uXWAgZW50cnkgYXJyaXZlcyBhcyB0aGUgc3RyaW5nXG4vLyBcIiR7YXdzLmdsb2JhbF9yZWdpb259XCIuIEEgLnRmLmpzb24gbW9kdWxlIHdyaXRlcyB0aGUgc2FtZSByZWZlcmVuY2UgYXMgYVxuLy8gcGxhaW4gc3RyaW5nLCB3aGljaCBoY2wyanNvbiBwYXNzZXMgdGhyb3VnaCB1bnRvdWNoZWQuXG5jb25zdCB1bndyYXBJbnRlcnBvbGF0aW9uID0gKHZhbHVlOiBzdHJpbmcpID0+XG4gIHZhbHVlLnN0YXJ0c1dpdGgoXCIke1wiKSAmJiB2YWx1ZS5lbmRzV2l0aChcIn1cIikgPyB2YWx1ZS5zbGljZSgyLCAtMSkgOiB2YWx1ZTtcblxuY29uc3QgdG9BcnJheSA9IDxUPihpdGVtOiBUIHwgVFtdIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFRbXSA9PiB7XG4gIGlmIChpdGVtID09PSB1bmRlZmluZWQgfHwgaXRlbSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpdGVtKSA/IGl0ZW0gOiBbaXRlbV07XG59O1xuXG4vKipcbiAqIEV2ZXJ5IG9jY3VycmVuY2Ugb2YgYSBibG9jayB0aGF0IGhjbDJqc29uIHByb2R1Y2VkIHVuZGVyIG9uZSBrZXkuXG4gKlxuICogSENMIGJsb2NrcyBjb21lIGJhY2sgYXMgYW4gYXJyYXkgd2l0aCBhbiBlbnRyeSBwZXIgb2NjdXJyZW5jZSwgYSAudGYuanNvblxuICogYmxvY2sgYXMgYSBwbGFpbiBvYmplY3QuIEEgbW9kdWxlIG1peGluZyBib3RoIHN5bnRheGVzIGdldHMgYSB0aGlyZCBzaGFwZTpcbiAqIGhjbDJqc29uIG1lcmdlcyB0aGUgSlNPTiBmaWxlIGludG8gdGhlIHBhcnNlZCBIQ0wsIGFuZCBpdHMgZGVlcE1lcmdlXG4gKiByZWN1cnNlcyBpbnRvIHRoZSBIQ0wgYXJyYXkgaW5zdGVhZCBvZiBhcHBlbmRpbmcgdG8gaXQsIGxlYXZpbmcgdGhlIEpTT05cbiAqIGNvbnRyaWJ1dGlvbiBoYW5naW5nIG9mZiB0aGUgYXJyYXkgYXMgbmFtZWQgcHJvcGVydGllcy4gVGhvc2UgcHJvcGVydGllc1xuICogYXJlIGFuIG9jY3VycmVuY2Ugb2YgdGhlaXIgb3duIC0gYW5kIG9uZSB0aGF0IG5laXRoZXIgaXRlcmF0aW5nIHRoZSBhcnJheVxuICogbm9yIEpTT04uc3RyaW5naWZ5IHdvdWxkIGV2ZXIgc2hvdy5cbiAqL1xuY29uc3QgYmxvY2tPY2N1cnJlbmNlcyA9IChibG9jazogYW55KTogYW55W10gPT4ge1xuICBpZiAoYmxvY2sgPT09IHVuZGVmaW5lZCB8fCBibG9jayA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYmxvY2spKSByZXR1cm4gW2Jsb2NrXTtcblxuICBjb25zdCBtZXJnZWQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoYmxvY2spLmZpbHRlcigoW2tleV0pID0+ICEvXlxcZCskLy50ZXN0KGtleSkpLFxuICApO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXJnZWQpLmxlbmd0aCA+IDAgPyBbLi4uYmxvY2ssIG1lcmdlZF0gOiBbLi4uYmxvY2tdO1xufTtcblxuLyoqXG4gKiBDb2xsZWN0cyB0aGUgcHJvdmlkZXIgY29uZmlndXJhdGlvbnMgYSBtb2R1bGUgcmVxdWlyZXMgaXRzIGNhbGxlciB0byBwYXNzXG4gKiBpbiwgZnJvbSB0aGUgaGNsMmpzb24gcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZHVsZSdzIGRpcmVjdG9yeS5cbiAqXG4gKiBBIG1vZHVsZSBtYXkgZGVjbGFyZSBgcmVxdWlyZWRfcHJvdmlkZXJzYCBpbiBtb3JlIHRoYW4gb25lIGB0ZXJyYWZvcm1gXG4gKiBibG9jaywgYW5kIG1heSBzcHJlYWQgdGhlbSBhY3Jvc3MgLnRmIGFuZCAudGYuanNvbiBmaWxlczsgZXZlcnkgb2NjdXJyZW5jZVxuICogaGNsMmpzb24gcmVwb3J0cyBpcyBjb25zaWRlcmVkIChzZWUge0BsaW5rIGJsb2NrT2NjdXJyZW5jZXN9KS5cbiAqXG4gKiBAaW50ZXJuYWwgZXhwb3NlZCBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdE1vZHVsZVByb3ZpZGVyQWxpYXNlcyhcbiAgcGFyc2VkTW9kdWxlOiBhbnksXG4pOiBNb2R1bGVQcm92aWRlckFsaWFzW10ge1xuICBjb25zdCBhbGlhc2VzOiBNb2R1bGVQcm92aWRlckFsaWFzW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgdGVycmFmb3JtQmxvY2sgb2YgYmxvY2tPY2N1cnJlbmNlcyhwYXJzZWRNb2R1bGU/LnRlcnJhZm9ybSkpIHtcbiAgICBmb3IgKGNvbnN0IHJlcXVpcmVkUHJvdmlkZXJzIG9mIGJsb2NrT2NjdXJyZW5jZXMoXG4gICAgICB0ZXJyYWZvcm1CbG9jaz8ucmVxdWlyZWRfcHJvdmlkZXJzLFxuICAgICkpIHtcbiAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgT2JqZWN0LnZhbHVlcyhyZXF1aXJlZFByb3ZpZGVycyB8fCB7fSkpIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB1bndyYXBJZkFycmF5KGRlY2xhcmF0aW9uIGFzIGFueSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0b0FycmF5KHByb3ZpZGVyPy5jb25maWd1cmF0aW9uX2FsaWFzZXMpKSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2ggPSBDT05GSUdVUkFUSU9OX0FMSUFTLmV4ZWMoXG4gICAgICAgICAgICB1bndyYXBJbnRlcnBvbGF0aW9uKFN0cmluZyhlbnRyeSkpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBbLCBsb2NhbE5hbWUsIGFsaWFzXSA9IG1hdGNoO1xuICAgICAgICAgIGNvbnN0IGVudHJ5QWxpYXM6IE1vZHVsZVByb3ZpZGVyQWxpYXMgPSB7XG4gICAgICAgICAgICBsb2NhbE5hbWUsXG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIHNvdXJjZTogcHJvdmlkZXI/LnNvdXJjZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGtleSA9IHByb3ZpZGVyUmVmZXJlbmNlKGVudHJ5QWxpYXMpO1xuICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICBzZWVuLmFkZChrZXkpO1xuXG4gICAgICAgICAgYWxpYXNlcy5wdXNoKGVudHJ5QWxpYXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFsaWFzZXM7XG59XG5cbi8qKlxuICogRGVjbGFyZXMgdGhlIHByb3ZpZGVyIGNvbmZpZ3VyYXRpb25zIHRoYXQgYGFsaWFzZXNgIG5hbWVzIG9uIHRoZSBzeW50aGV0aWNcbiAqIHJvb3QgY29uZmlnIGFuZCBwYXNzZXMgdGhlbSBpbnRvIHRoZSBtb2R1bGUgY2FsbCwgd2hpY2ggaXMgd2hhdCBUZXJyYWZvcm1cbiAqIGRlbWFuZHMgb2YgYW55b25lIGNhbGxpbmcgYSBtb2R1bGUgd2l0aCBgY29uZmlndXJhdGlvbl9hbGlhc2VzYC5cbiAqXG4gKiBUaGUgcHJvdmlkZXIgYmxvY2tzIHN0YXkgZW1wdHk6IGB0ZXJyYWZvcm0gZ2V0YCBvbmx5IGJ1aWxkcyB0aGUgY29uZmlndXJhdGlvblxuICogdHJlZSwgaXQgbmV2ZXIgY29uZmlndXJlcyBvciBpbnN0YWxscyBhIHByb3ZpZGVyLiBTb3VyY2VzIGFyZSBtaXJyb3JlZCBmcm9tXG4gKiB0aGUgbW9kdWxlJ3Mgb3duIGByZXF1aXJlZF9wcm92aWRlcnNgIHNvIGEgbW9kdWxlIHJlZmVycmluZyB0bywgc2F5LFxuICogaGFzaGljb3JwL2F3cyB1bmRlciBhIG5vbi1kZWZhdWx0IGxvY2FsIG5hbWUgc3RpbGwgcmVzb2x2ZXMgdG8gdGhlIHNhbWVcbiAqIHByb3ZpZGVyIGluIHRoZSByb290LlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1vZHVsZVByb3ZpZGVyQWxpYXNlcyhcbiAgY29uZmlnOiBUZXJyYWZvcm1Db25maWcsXG4gIG1vZHVsZUtleTogc3RyaW5nLFxuICBhbGlhc2VzOiBNb2R1bGVQcm92aWRlckFsaWFzW10sXG4pOiBUZXJyYWZvcm1Db25maWcge1xuICBjb25zdCBtb2R1bGVDYWxsID0gY29uZmlnLm1vZHVsZT8uW21vZHVsZUtleV07XG4gIGlmICghbW9kdWxlQ2FsbCB8fCBhbGlhc2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvbmZpZztcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFsaWFzZXMpIHtcbiAgICBjb25zdCB7IGxvY2FsTmFtZSwgYWxpYXMsIHNvdXJjZSB9ID0gZW50cnk7XG4gICAgaWYgKHNvdXJjZSkge1xuICAgICAgY29uZmlnLnRlcnJhZm9ybS5yZXF1aXJlZF9wcm92aWRlcnMgPSB7XG4gICAgICAgIC4uLmNvbmZpZy50ZXJyYWZvcm0ucmVxdWlyZWRfcHJvdmlkZXJzLFxuICAgICAgICBbbG9jYWxOYW1lXTogeyBzb3VyY2UgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uZmlnLnByb3ZpZGVyID0gY29uZmlnLnByb3ZpZGVyIHx8IHt9O1xuICAgIGNvbnN0IGJsb2NrcyA9IHRvQXJyYXkoY29uZmlnLnByb3ZpZGVyW2xvY2FsTmFtZV0pO1xuICAgIGlmICghYmxvY2tzLnNvbWUoKGJsb2NrKSA9PiBibG9jay5hbGlhcyA9PT0gYWxpYXMpKSB7XG4gICAgICBibG9ja3MucHVzaChhbGlhcyA/IHsgYWxpYXMgfSA6IHt9KTtcbiAgICB9XG4gICAgY29uZmlnLnByb3ZpZGVyW2xvY2FsTmFtZV0gPSBibG9ja3M7XG5cbiAgICBjb25zdCByZWZlcmVuY2UgPSBwcm92aWRlclJlZmVyZW5jZShlbnRyeSk7XG4gICAgbW9kdWxlQ2FsbC5wcm92aWRlcnMgPSB7XG4gICAgICAuLi5tb2R1bGVDYWxsLnByb3ZpZGVycyxcbiAgICAgIFtyZWZlcmVuY2VdOiByZWZlcmVuY2UsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjb25maWc7XG59XG5cbi8qKlxuICogVGhlIGAvL3N1YmRpcmAgcG9ydGlvbiBvZiBhIG1vZHVsZSBzb3VyY2UsIGlmIGl0IGhhcyBvbmUsIG1pcnJvcmluZyBob3dcbiAqIFRlcnJhZm9ybSB1bnBhY2tzIGEgcGFja2FnZSBpbnRvIGAudGVycmFmb3JtL21vZHVsZXMvPGtleT4vPHN1YmRpcj5gLlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWNrYWdlU3ViZGlyKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgW3dpdGhvdXRRdWVyeV0gPSBzb3VyY2Uuc3BsaXQoXCI/XCIpO1xuICBjb25zdCB3aXRob3V0R2V0dGVyUHJlZml4ID0gd2l0aG91dFF1ZXJ5LnJlcGxhY2UoL15bQS1aYS16MC05XSs6Oi8sIFwiXCIpO1xuICBjb25zdCB3aXRob3V0U2NoZW1lID0gd2l0aG91dEdldHRlclByZWZpeC5yZXBsYWNlKFxuICAgIC9eW0EtWmEtel1bQS1aYS16MC05Ky4tXSo6XFwvXFwvKy8sXG4gICAgXCJcIixcbiAgKTtcblxuICBjb25zdCBbLCAuLi5yZXN0XSA9IHdpdGhvdXRTY2hlbWUuc3BsaXQoXCIvL1wiKTtcbiAgY29uc3Qgc3ViZGlyID0gcmVzdC5qb2luKFwiLy9cIikucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG4gIHJldHVybiBzdWJkaXIgfHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdoZXJlIHRoZSBtb2R1bGUgVGVycmFmb3JtIGp1c3QgZmV0Y2hlZCBlbmRlZCB1cCBvbiBkaXNrLlxuICpcbiAqIFRoZSBtYW5pZmVzdCBpcyB0aGUgYXV0aG9yaXR5LCBidXQgYSBgdGVycmFmb3JtIGdldGAgdGhhdCBpbnN0YWxsZWQgdGhlXG4gKiBtb2R1bGUgYW5kIHRoZW4gZmFpbGVkIHRvIHZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uIGFyb3VuZCBpdCBsZWF2ZXMgbm9cbiAqIG1hbmlmZXN0IGJlaGluZCAtIHNvIGZhbGwgYmFjayB0byB0aGUgbG9jYXRpb25zIFRlcnJhZm9ybSBpbnN0YWxscyBpbnRvOlxuICogbG9jYWwgbW9kdWxlcyBhcmUgcmVhZCB3aGVyZSB0aGV5IGFyZSwgcmVtb3RlIHBhY2thZ2VzIGFyZSB1bnBhY2tlZCBpbnRvXG4gKiBgLnRlcnJhZm9ybS9tb2R1bGVzLzxrZXk+YC5cbiAqXG4gKiBAaW50ZXJuYWwgZXhwb3NlZCBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hlZE1vZHVsZURpcihcbiAgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nLFxuICBtb2R1bGVLZXk6IHN0cmluZyxcbiAgc291cmNlOiBzdHJpbmcsXG4gIGxvY2FsU291cmNlQWJzb2x1dGVQYXRoPzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aC5qb2luKFxuICAgIHdvcmtpbmdEaXJlY3RvcnksXG4gICAgXCIudGVycmFmb3JtXCIsXG4gICAgXCJtb2R1bGVzXCIsXG4gICAgXCJtb2R1bGVzLmpzb25cIixcbiAgKTtcblxuICBpZiAoZnMuZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgY29uc3QgbW9kdWxlSW5kZXggPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgXCJ1dGYtOFwiKSxcbiAgICApIGFzIE1vZHVsZUluZGV4O1xuICAgIGNvbnN0IHJlY29yZCA9IG1vZHVsZUluZGV4Lk1vZHVsZXMuZmluZCgobW9kKSA9PiBtb2QuS2V5ID09PSBtb2R1bGVLZXkpO1xuXG4gICAgaWYgKHJlY29yZCkge1xuICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyZWN0b3J5LCByZWNvcmQuRGlyKTtcbiAgICB9XG4gIH1cblxuICBpZiAobG9jYWxTb3VyY2VBYnNvbHV0ZVBhdGgpIHtcbiAgICByZXR1cm4gbG9jYWxTb3VyY2VBYnNvbHV0ZVBhdGg7XG4gIH1cblxuICByZXR1cm4gcGF0aC5qb2luKFxuICAgIHdvcmtpbmdEaXJlY3RvcnksXG4gICAgXCIudGVycmFmb3JtXCIsXG4gICAgXCJtb2R1bGVzXCIsXG4gICAgbW9kdWxlS2V5LFxuICAgIHBhY2thZ2VTdWJkaXIoc291cmNlKSB8fCBcIlwiLFxuICApO1xufVxuXG4vKipcbiAqIFJ1bnMgYHRlcnJhZm9ybSBnZXRgIGFuZCBoYW5kcyB0aGUgZmFpbHVyZSBiYWNrIGluc3RlYWQgb2YgdGhyb3dpbmcgaXQuXG4gKlxuICogSXRzIGRpYWdub3N0aWNzIGFyZSBub3QgZmluYWwgKHNlZSB7QGxpbmsgcmVhZE1vZHVsZVNjaGVtYX0pLCBzbyB0aGV5IGdvIHRvXG4gKiB0aGUgZGVidWcgbG9nIHJhdGhlciB0aGFuIHRoZSB0ZXJtaW5hbDsgdGhlIHJldHVybmVkIGVycm9yIHN0aWxsIGNhcnJpZXNcbiAqIHRoZW0gb24gaXRzIGBzdGRlcnJgIGZvciBjYWxsZXJzIHRoYXQgZW5kIHVwIHJldGhyb3dpbmcgaXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRyeVRlcnJhZm9ybUdldChvdXRkaXI6IHN0cmluZyk6IFByb21pc2U8RXJyb3IgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjKFxuICAgICAgdGVycmFmb3JtQmluYXJ5TmFtZSxcbiAgICAgIFtcImdldFwiXSxcbiAgICAgIHsgY3dkOiBvdXRkaXIsIGxvZ1N0ZGVyckFzRGVidWc6IHRydWUgfSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1vZHVsZVNjaGVtYSh0YXJnZXQ6IENvbnN0cnVjdHNNYWtlck1vZHVsZVRhcmdldCkge1xuICBsZXQgbW9kdWxlU2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBNb2R1bGVTY2hlbWE+ID0ge307XG5cbiAgYXdhaXQgd2l0aFRlbXBEaXIoXCJmZXRjaFNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnOiBUZXJyYWZvcm1Db25maWcgPSB7XG4gICAgICB0ZXJyYWZvcm06IHt9LFxuICAgIH07XG5cbiAgICBpZiAoIWNvbmZpZy5tb2R1bGUpIGNvbmZpZy5tb2R1bGUgPSB7fTtcbiAgICBsZXQgc291cmNlOiBzdHJpbmcgPSB0YXJnZXQuc291cmNlO1xuXG4gICAgY29uc3QgbG9jYWxTb3VyY2UgPSAodGFyZ2V0LmNvbnN0cmFpbnQgYXMgVGVycmFmb3JtTW9kdWxlQ29uc3RyYWludClcbiAgICAgIC5sb2NhbFNvdXJjZUFic29sdXRlUGF0aDtcbiAgICBpZiAobG9jYWxTb3VyY2UpIHtcbiAgICAgIC8vIGNyZWF0ZSByZWxhdGl2ZSBwYXRoIHRvIG1vZHVsZSBpbiB0aGUgdXNlciBwcm9qZWN0XG4gICAgICBzb3VyY2UgPSBwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGxvY2FsU291cmNlKTtcbiAgICB9XG5cbiAgICBjb25maWcubW9kdWxlW3RhcmdldC5tb2R1bGVLZXldID0geyBzb3VyY2U6IHNvdXJjZSB9O1xuICAgIGlmICh0YXJnZXQudmVyc2lvbikge1xuICAgICAgY29uZmlnLm1vZHVsZVt0YXJnZXQubW9kdWxlS2V5XVtcInZlcnNpb25cIl0gPSB0YXJnZXQudmVyc2lvbjtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKG91dGRpciwgXCJtYWluLnRmLmpzb25cIik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcblxuICAgIC8vIGB0ZXJyYWZvcm0gZ2V0YCBpcyBib3RoIG91ciBkb3dubG9hZGVyIGFuZCBhIGZ1bGwgdmFsaWRhdGlvbiBvZiB0aGVcbiAgICAvLyBzeW50aGV0aWMgcm9vdCBjb25maWcgd3JhcHBlZCBhcm91bmQgdGhlIG1vZHVsZS4gQSBtb2R1bGUgZGVjbGFyaW5nXG4gICAgLy8gYGNvbmZpZ3VyYXRpb25fYWxpYXNlc2AgY2Fubm90IHZhbGlkYXRlIHVudGlsIHRoZSByb290IHBhc3NlcyB0aG9zZVxuICAgIC8vIGNvbmZpZ3VyYXRpb25zIGluLCBhbmQgdGhlaXIgbmFtZXMgYXJlIG9ubHkga25vd2FibGUgb25jZSB0aGUgbW9kdWxlIGlzXG4gICAgLy8gb24gZGlzayAtIHNvIHRoaXMgZmlyc3QgcnVuIGlzIGEgZmV0Y2ggd2UgZGVmZXIganVkZ2VtZW50IG9uLiBUZXJyYWZvcm1cbiAgICAvLyBpbnN0YWxscyB0aGUgbW9kdWxlIGVpdGhlciB3YXk7IHNpbmNlIDEuMTUgaXQganVzdCBzdG9wcyBzaG9ydCBvZlxuICAgIC8vIHdyaXRpbmcgdGhlIG1vZHVsZSBtYW5pZmVzdCB3aGVuIHZhbGlkYXRpb24gZmFpbHMgKHRlcnJhZm9ybSMzODIxN1xuICAgIC8vIGRyb3BwZWQgdGhlIGVycm9yLXRvLXdhcm5pbmcgZG93bmdyYWRlIHRoYXQgYHRlcnJhZm9ybSBnZXRgIHVzZWQgdG9cbiAgICAvLyBhcHBseSksIHdoaWNoIGlzIHdoYXQgdGhlIHNlY29uZCBydW4gYmVsb3cgcmVzdG9yZXMuXG4gICAgY29uc3QgZmV0Y2hFcnJvciA9IGF3YWl0IHRyeVRlcnJhZm9ybUdldChvdXRkaXIpO1xuXG4gICAgY29uc3QgbW9kdWxlRGlyID0gZmV0Y2hlZE1vZHVsZURpcihcbiAgICAgIG91dGRpcixcbiAgICAgIHRhcmdldC5tb2R1bGVLZXksXG4gICAgICBzb3VyY2UsXG4gICAgICBsb2NhbFNvdXJjZSxcbiAgICApO1xuICAgIGNvbnN0IGFsaWFzZXMgPSBmcy5leGlzdHNTeW5jKG1vZHVsZURpcilcbiAgICAgID8gY29sbGVjdE1vZHVsZVByb3ZpZGVyQWxpYXNlcyhhd2FpdCBjb252ZXJ0RmlsZXMobW9kdWxlRGlyKSlcbiAgICAgIDogW107XG5cbiAgICBpZiAoYWxpYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBhcHBseU1vZHVsZVByb3ZpZGVyQWxpYXNlcyhjb25maWcsIHRhcmdldC5tb2R1bGVLZXksIGFsaWFzZXMpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcbiAgICAgIGF3YWl0IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1wiZ2V0XCJdLCB7IGN3ZDogb3V0ZGlyIH0pO1xuICAgIH0gZWxzZSBpZiAoZmV0Y2hFcnJvcikge1xuICAgICAgLy8gbm90aGluZyBoZXJlIHdhcyBzYWx2YWdlYWJsZSBhZnRlciBhbGwsIHNvIHJlcG9ydCB0aGUgZGlhZ25vc3RpY3MgdGhhdFxuICAgICAgLy8gd2VyZSBoZWxkIGJhY2sgd2hpbGUgdGhlIGZldGNoIHN0aWxsIGhhZCBhIHNlY29uZCBjaGFuY2VcbiAgICAgIGxvZ2dlci5lcnJvcigoZmV0Y2hFcnJvciBhcyBhbnkpLnN0ZGVyciB8fCBTdHJpbmcoZmV0Y2hFcnJvcikpO1xuICAgICAgdGhyb3cgZmV0Y2hFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLm1vZHVsZSkge1xuICAgICAgbW9kdWxlU2NoZW1hID0gYXdhaXQgaGFydmVzdE1vZHVsZVNjaGVtYShcbiAgICAgICAgb3V0ZGlyLFxuICAgICAgICBPYmplY3Qua2V5cyhjb25maWcubW9kdWxlKSxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gbW9kdWxlU2NoZW1hO1xufVxuIl19
|