cdktn 0.26.0-pre.2 → 0.26.0-pre.21
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/.jsii +1200 -1116
- package/eslint.config.mjs +18 -7
- package/jest.config.js +0 -1
- package/lib/_tokens.d.ts +7 -0
- package/lib/_tokens.js +8 -2
- package/lib/annotations.js +1 -1
- package/lib/app.js +8 -4
- package/lib/aspect.js +1 -1
- package/lib/asset-hash.js +1 -1
- package/lib/asset-staging.js +1 -1
- package/lib/assets.js +4 -4
- package/lib/backends/azurerm-backend.d.ts +6 -0
- package/lib/backends/azurerm-backend.js +9 -5
- package/lib/backends/cloud-backend.js +4 -4
- package/lib/backends/consul-backend.d.ts +6 -0
- package/lib/backends/consul-backend.js +9 -5
- package/lib/backends/cos-backend.d.ts +6 -0
- package/lib/backends/cos-backend.js +9 -5
- package/lib/backends/gcs-backend.d.ts +6 -0
- package/lib/backends/gcs-backend.js +9 -5
- package/lib/backends/http-backend.d.ts +6 -0
- package/lib/backends/http-backend.js +9 -5
- package/lib/backends/local-backend.d.ts +6 -0
- package/lib/backends/local-backend.js +9 -5
- package/lib/backends/oss-backend.d.ts +6 -0
- package/lib/backends/oss-backend.js +9 -5
- package/lib/backends/pg-backend.d.ts +6 -0
- package/lib/backends/pg-backend.js +9 -5
- package/lib/backends/remote-backend.d.ts +12 -0
- package/lib/backends/remote-backend.js +17 -9
- package/lib/backends/s3-backend.d.ts +6 -0
- package/lib/backends/s3-backend.js +9 -5
- package/lib/backends/swift-backend.js +2 -2
- package/lib/complex-computed-list.d.ts +85 -0
- package/lib/complex-computed-list.js +112 -54
- package/lib/functions/helpers.d.ts +72 -0
- package/lib/functions/helpers.js +73 -14
- package/lib/functions/provider-function.js +1 -1
- package/lib/functions/terraform-functions.generated.d.ts +3 -0
- package/lib/functions/terraform-functions.generated.js +5 -3
- package/lib/hcl/quoted-string-key.d.ts +25 -0
- package/lib/hcl/quoted-string-key.js +42 -0
- package/lib/hcl/render.js +41 -7
- package/lib/ignore-strategy.js +1 -1
- package/lib/importable-resource.js +1 -1
- package/lib/manifest.d.ts +4 -0
- package/lib/manifest.js +6 -3
- package/lib/private/unique.js +11 -3
- package/lib/resource.js +1 -1
- package/lib/runtime.d.ts +6 -0
- package/lib/runtime.js +12 -3
- package/lib/synthesize/required-version.d.ts +32 -0
- package/lib/synthesize/required-version.js +205 -0
- package/lib/synthesize/synthesizer.d.ts +13 -0
- package/lib/synthesize/synthesizer.js +42 -8
- package/lib/terraform-asset.d.ts +4 -0
- package/lib/terraform-asset.js +6 -3
- package/lib/terraform-backend.d.ts +3 -0
- package/lib/terraform-backend.js +5 -3
- package/lib/terraform-conditions.js +1 -2
- package/lib/terraform-count.js +1 -1
- package/lib/terraform-data-resource.js +1 -1
- package/lib/terraform-data-source.d.ts +4 -0
- package/lib/terraform-data-source.js +8 -6
- package/lib/terraform-dependable.js +1 -1
- package/lib/terraform-dynamic-block.d.ts +4 -0
- package/lib/terraform-dynamic-block.js +5 -2
- package/lib/terraform-element.d.ts +4 -0
- package/lib/terraform-element.js +6 -3
- package/lib/terraform-ephemeral-resource.d.ts +4 -0
- package/lib/terraform-ephemeral-resource.js +8 -6
- package/lib/terraform-functions.d.ts +4 -0
- package/lib/terraform-functions.js +10 -5
- package/lib/terraform-hcl-module.d.ts +4 -0
- package/lib/terraform-hcl-module.js +6 -3
- package/lib/terraform-iterator.d.ts +19 -0
- package/lib/terraform-iterator.js +25 -11
- package/lib/terraform-local.d.ts +4 -0
- package/lib/terraform-local.js +6 -3
- package/lib/terraform-module.js +1 -1
- package/lib/terraform-operators.js +1 -1
- package/lib/terraform-output.d.ts +5 -0
- package/lib/terraform-output.js +23 -3
- package/lib/terraform-provider.d.ts +4 -0
- package/lib/terraform-provider.js +6 -3
- package/lib/terraform-provisioner.js +1 -1
- package/lib/terraform-remote-state.d.ts +3 -0
- package/lib/terraform-remote-state.js +5 -3
- package/lib/terraform-resource-targets.js +1 -1
- package/lib/terraform-resource.d.ts +5 -1
- package/lib/terraform-resource.js +16 -9
- package/lib/terraform-stack.d.ts +4 -0
- package/lib/terraform-stack.js +28 -9
- package/lib/terraform-variable.d.ts +7 -0
- package/lib/terraform-variable.js +16 -7
- package/lib/testing/adapters/jest.d.ts +3 -0
- package/lib/testing/adapters/jest.js +10 -1
- package/lib/testing/index.js +14 -4
- package/lib/testing/matchers.js +61 -19
- package/lib/tfExpression.d.ts +50 -0
- package/lib/tfExpression.js +114 -33
- package/lib/tokens/lazy.d.ts +4 -0
- package/lib/tokens/lazy.js +21 -8
- package/lib/tokens/private/dependency.js +2 -6
- package/lib/tokens/private/resolve.js +3 -3
- package/lib/tokens/private/stack-trace.d.ts +1 -1
- package/lib/tokens/private/stack-trace.js +1 -2
- package/lib/tokens/resolvable.js +2 -2
- package/lib/tokens/string-fragments.js +4 -4
- package/lib/tokens/token.js +2 -2
- package/lib/upgrade-id-aspect.js +1 -1
- package/lib/util.d.ts +0 -1
- package/lib/util.js +4 -4
- package/lib/validations/target-versions.d.ts +12 -0
- package/lib/validations/target-versions.js +40 -1
- package/package.json +112 -109
package/lib/testing/index.js
CHANGED
|
@@ -60,7 +60,7 @@ const DefaultTestingAppConfig = {
|
|
|
60
60
|
* Testing utilities for cdktf applications.
|
|
61
61
|
*/
|
|
62
62
|
class Testing {
|
|
63
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.Testing", version: "0.26.0-pre.
|
|
63
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.Testing", version: "0.26.0-pre.21" };
|
|
64
64
|
/**
|
|
65
65
|
* Returns an app for testing with the following properties:
|
|
66
66
|
* - Output directory is a temp dir.
|
|
@@ -125,7 +125,11 @@ class Testing {
|
|
|
125
125
|
stack.runAllValidations();
|
|
126
126
|
}
|
|
127
127
|
const tfConfig = stack.toTerraform();
|
|
128
|
-
|
|
128
|
+
/**
|
|
129
|
+
* Recursively sorts object keys alphabetically and removes the `//` metadata entries
|
|
130
|
+
* @param item Value to clean
|
|
131
|
+
* @returns A copy of the value with sorted keys and no metadata entries
|
|
132
|
+
*/
|
|
129
133
|
function removeMetadata(item) {
|
|
130
134
|
if (item !== null && typeof item === "object") {
|
|
131
135
|
if (Array.isArray(item)) {
|
|
@@ -172,7 +176,13 @@ class Testing {
|
|
|
172
176
|
}
|
|
173
177
|
static renderConstructTree(construct) {
|
|
174
178
|
return render(construct, 0, false);
|
|
175
|
-
|
|
179
|
+
/**
|
|
180
|
+
* Renders a construct and its descendants as an indented tree, one construct per line
|
|
181
|
+
* @param construct Construct to render
|
|
182
|
+
* @param level Depth of the construct in the tree
|
|
183
|
+
* @param isLast Whether the construct is the last child of its parent
|
|
184
|
+
* @returns The rendered tree
|
|
185
|
+
*/
|
|
176
186
|
function render(construct, level, isLast) {
|
|
177
187
|
let prefix = "";
|
|
178
188
|
if (level > 0) {
|
|
@@ -217,4 +227,4 @@ class Testing {
|
|
|
217
227
|
}
|
|
218
228
|
}
|
|
219
229
|
exports.Testing = Testing;
|
|
220
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUVuQyw0Q0FBOEI7QUFDOUIsZ0RBQWtDO0FBQ2xDLDRDQUE4QjtBQUU5QixrRkFBOEM7QUFDOUMsMEJBQXlDO0FBQ3pDLDBDQUF1QztBQUN2QywwQ0FBMkM7QUFFM0MsMENBQTRDO0FBQzVDLDJEQUEwRDtBQUMxRCx5Q0FLb0I7QUFlcEIsTUFBTSx1QkFBdUIsR0FBcUI7SUFDaEQsV0FBVyxFQUFFLEtBQUs7SUFDbEIsV0FBVyxFQUFFLElBQUk7SUFDakIsaUJBQWlCLEVBQUUsSUFBSTtJQUN2QixpQkFBaUIsRUFBRSxLQUFLO0NBQ3pCLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQWEsT0FBTzs7SUFDbEI7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUE0QixFQUFFO1FBQzlDLE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyx1QkFBdUIsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEIsU0FBUyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsV0FBVyxDQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FDeEMsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLE9BQUcsQ0FBQztZQUNsQixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07WUFDeEIsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXO1lBQ2xDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztTQUN6QixDQUFDLENBQUM7UUFFSCxJQUFJLFNBQVMsQ0FBQyxXQUFX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QUFFLFlBQVksRUFBRSxFQUNoQyxFQUFFLENBQ0gsQ0FBQyxJQUFJLENBQUM7SUFDVCxDQUFDO0lBRU0sTUFBTSxDQUFDLDRCQUE0QixDQUN4QyxRQUFnQixFQUNoQixZQUFvQixFQUNwQixhQUFrQyxFQUFFO1FBRXBDLE9BQU8sSUFBQSwwQ0FBK0IsR0FBRSxDQUN0QyxRQUFRLEVBQ1IsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLEVBQ2hDLFVBQVUsQ0FDWCxDQUFDLElBQUksQ0FBQztJQUNULENBQUM7SUFFTSxNQUFNLENBQUMsY0FBYyxDQUMxQixRQUFnQixFQUNoQixZQUFvQjtRQUVwQixPQUFPLElBQUEsMENBQStCLEdBQUUsQ0FDdEMsUUFBUSxFQUNSLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxFQUNoQyxFQUFFLENBQ0gsQ0FBQyxJQUFJLENBQUM7SUFDVCxDQUFDO0lBRU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQWdCO1FBQy9DLE9BQU8sSUFBQSw2QkFBa0IsRUFBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0MsQ0FBQztJQUVNLE1BQU0sQ0FBQyxTQUFTO1FBQ3JCLElBQUEsZ0JBQVMsR0FBRSxDQUFDO0lBQ2QsQ0FBQzs7QUF0UEgsMEJBdVBDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcblxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm5vZGU6b3NcIjtcblxuaW1wb3J0IHN0cmluZ2lmeSBmcm9tIFwic2FmZS1zdGFibGUtc3RyaW5naWZ5XCI7XG5pbXBvcnQgeyBBcHAsIFRlcnJhZm9ybVN0YWNrIH0gZnJvbSBcIi4uXCI7XG5pbXBvcnQgeyBNYW5pZmVzdCB9IGZyb20gXCIuLi9tYW5pZmVzdFwiO1xuaW1wb3J0IHsgRlVUVVJFX0ZMQUdTIH0gZnJvbSBcIi4uL2ZlYXR1cmVzXCI7XG5pbXBvcnQgeyBJQ29uc3RydWN0LCBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgc2V0dXBKZXN0IH0gZnJvbSBcIi4vYWRhcHRlcnMvamVzdFwiO1xuaW1wb3J0IHsgaW52b2tlQXNwZWN0cyB9IGZyb20gXCIuLi9zeW50aGVzaXplL3N5bnRoZXNpemVyXCI7XG5pbXBvcnQge1xuICBnZXRUb0hhdmVSZXNvdXJjZVdpdGhQcm9wZXJ0aWVzLFxuICBnZXRUb0hhdmVEYXRhU291cmNlV2l0aFByb3BlcnRpZXMsXG4gIGdldFRvSGF2ZVByb3ZpZGVyV2l0aFByb3BlcnRpZXMsXG4gIHRvQmVWYWxpZFRlcnJhZm9ybSxcbn0gZnJvbSBcIi4vbWF0Y2hlcnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJU2NvcGVDYWxsYmFjayB7XG4gIChzY29wZTogQ29uc3RydWN0KTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXN0aW5nQXBwQ29uZmlnIHtcbiAgcmVhZG9ubHkgb3V0ZGlyPzogc3RyaW5nO1xuICByZWFkb25seSBzdGFja1RyYWNlcz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHN0dWJWZXJzaW9uPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZW5hYmxlRnV0dXJlRmxhZ3M/OiBib29sZWFuO1xuICByZWFkb25seSBmYWtlQ2RrdGZKc29uUGF0aD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNvbnRleHQ/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xufVxuXG5jb25zdCBEZWZhdWx0VGVzdGluZ0FwcENvbmZpZzogVGVzdGluZ0FwcENvbmZpZyA9IHtcbiAgc3RhY2tUcmFjZXM6IGZhbHNlLFxuICBzdHViVmVyc2lvbjogdHJ1ZSxcbiAgZW5hYmxlRnV0dXJlRmxhZ3M6IHRydWUsXG4gIGZha2VDZGt0Zkpzb25QYXRoOiBmYWxzZSxcbn07XG5cbi8qKlxuICogVGVzdGluZyB1dGlsaXRpZXMgZm9yIGNka3RmIGFwcGxpY2F0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlc3Rpbmcge1xuICAvKipcbiAgICogUmV0dXJucyBhbiBhcHAgZm9yIHRlc3Rpbmcgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqIC0gT3V0cHV0IGRpcmVjdG9yeSBpcyBhIHRlbXAgZGlyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhcHAob3B0aW9uczogVGVzdGluZ0FwcENvbmZpZyA9IHt9KTogQXBwIHtcbiAgICBjb25zdCBhcHBDb25maWcgPSB7IC4uLkRlZmF1bHRUZXN0aW5nQXBwQ29uZmlnLCAuLi5vcHRpb25zIH07XG4gICAgaWYgKCFhcHBDb25maWcub3V0ZGlyKSB7XG4gICAgICBhcHBDb25maWcub3V0ZGlyID0gZnMubWtkdGVtcFN5bmMoXG4gICAgICAgIHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJjZGt0Zi5vdXRkaXIuXCIpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwKHtcbiAgICAgIG91dGRpcjogYXBwQ29uZmlnLm91dGRpcixcbiAgICAgIHN0YWNrVHJhY2VzOiBhcHBDb25maWcuc3RhY2tUcmFjZXMsXG4gICAgICBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsXG4gICAgfSk7XG5cbiAgICBpZiAoYXBwQ29uZmlnLnN0dWJWZXJzaW9uKSB7XG4gICAgICB0aGlzLnN0dWJWZXJzaW9uKGFwcCk7XG4gICAgfVxuICAgIGlmIChhcHBDb25maWcuZW5hYmxlRnV0dXJlRmxhZ3MpIHtcbiAgICAgIHRoaXMuZW5hYmxlRnV0dXJlRmxhZ3MoYXBwKTtcbiAgICB9XG4gICAgaWYgKGFwcENvbmZpZy5mYWtlQ2RrdGZKc29uUGF0aCkge1xuICAgICAgdGhpcy5mYWtlQ2RrdGZKc29uUGF0aChhcHApO1xuICAgIH1cblxuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHN0dWJWZXJzaW9uKGFwcDogQXBwKTogQXBwIHtcbiAgICBhcHAubm9kZS5zZXRDb250ZXh0KFwiY2RrdGZWZXJzaW9uXCIsIFwic3R1YmJlZFwiKTtcbiAgICAoYXBwLm1hbmlmZXN0LnZlcnNpb24gYXMgc3RyaW5nKSA9IFwic3R1YmJlZFwiO1xuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZha2VDZGt0Zkpzb25QYXRoKGFwcDogQXBwKTogQXBwIHtcbiAgICBhcHAubm9kZS5zZXRDb250ZXh0KFwiY2RrdGZKc29uUGF0aFwiLCBgJHtwcm9jZXNzLmN3ZCgpfS9jZGt0Zi5qc29uYCk7XG4gICAgYXBwLm5vZGUuc2V0Q29udGV4dChcImNka3RmUmVsYXRpdmVNb2R1bGVzXCIsIFtcIi4vdGVzdC9maXh0dXJlcy9cIl0pO1xuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGVuYWJsZUZ1dHVyZUZsYWdzKGFwcDogQXBwKTogQXBwIHtcbiAgICBjb25zdCBub2RlID0gYXBwLm5vZGU7XG4gICAgT2JqZWN0LmVudHJpZXMoRlVUVVJFX0ZMQUdTKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+XG4gICAgICBub2RlLnNldENvbnRleHQoa2V5LCB2YWx1ZSksXG4gICAgKTtcbiAgICByZXR1cm4gYXBwO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzeW50aFNjb3BlKGZuOiBJU2NvcGVDYWxsYmFjaykge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFRlcnJhZm9ybVN0YWNrKFRlc3RpbmcuYXBwKCksIFwic3RhY2tcIik7XG4gICAgZm4oc3RhY2spO1xuICAgIHJldHVybiBUZXN0aW5nLnN5bnRoKHN0YWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBUZXJyYWZvcm0gc3ludGhlc2l6ZWQgSlNPTi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc3ludGgoc3RhY2s6IFRlcnJhZm9ybVN0YWNrLCBydW5WYWxpZGF0aW9ucyA9IGZhbHNlKSB7XG4gICAgaW52b2tlQXNwZWN0cyhzdGFjayk7XG4gICAgaWYgKHJ1blZhbGlkYXRpb25zKSB7XG4gICAgICAvLyBEZWxpYmVyYXRlbHkgbm90IHRoZSBmdWxsIGBwcmVwYXJlU3RhY2soKWAgLSB0aGF0IGFsc28gaW5qZWN0cyBhXG4gICAgICAvLyBsb2NhbCBiYWNrZW5kIHZpYSBgZW5zdXJlQmFja2VuZEV4aXN0cygpYCwgd2hpY2ggd291bGQgYWRkIGFcbiAgICAgIC8vIGJhY2tlbmQgYmxvY2sgdG8gZXZlcnkgZXhpc3Rpbmcgc25hcHNob3QgdGhhdCBuZXZlciBhc2tlZCBmb3Igb25lLlxuICAgICAgLy8gT25seSBydW4gdGhlIHJlc29sdmUvcmVzZXQgaGFsZiB0aGF0IChyZS0pZGlzY292ZXJzIGN1cnJlbnQtcGFzc1xuICAgICAgLy8gcHJvdmlkZXItZmVhdHVyZSBhbmQgVGVycmFmb3JtLWZ1bmN0aW9uIHVzYWdlLCBzbyB0aGUgdmFsaWRhdGlvbnNcbiAgICAgIC8vIGJlbG93IHNlZSB3aGF0IHRoaXMgcGFzcyBhY3R1YWxseSByZW5kZXJzIGluc3RlYWQgb2Ygc3RhbGUgdXNhZ2VcbiAgICAgIC8vIChvciBub25lIGF0IGFsbCkgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91cyBjYWxsIGFnYWluc3QgdGhlIHNhbWVcbiAgICAgIC8vIHN0YWNrLiBgX3J1blByZXBhcmluZ1Jlc29sdmVgIGNsZWFycyB0aGUgc3RhY2sncyBvd24gZnVuY3Rpb24tdXNhZ2VcbiAgICAgIC8vIHNldHMgaXRzZWxmIGJlZm9yZSByZWRpc2NvdmVyaW5nIC0gc2VlIGBUZXJyYWZvcm1TdGFjay5fdXNlZEZ1bmN0aW9uc2AuXG4gICAgICBzdGFjay5fcnVuUHJlcGFyaW5nUmVzb2x2ZSgpO1xuICAgICAgc3RhY2sucnVuQWxsVmFsaWRhdGlvbnMoKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZkNvbmZpZyA9IHN0YWNrLnRvVGVycmFmb3JtKCk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuICAgIGZ1bmN0aW9uIHJlbW92ZU1ldGFkYXRhKGl0ZW06IGFueSk6IGFueSB7XG4gICAgICBpZiAoaXRlbSAhPT0gbnVsbCAmJiB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICAgIHJldHVybiBpdGVtLm1hcChyZW1vdmVNZXRhZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGVhbmVkSXRlbSA9IE9iamVjdC5lbnRyaWVzKGl0ZW0pXG4gICAgICAgICAgLy8gb3JkZXIgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICAuc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgKGFjYywgW2tleSwgdmFsdWVdKSA9PiAoeyAuLi5hY2MsIFtrZXldOiByZW1vdmVNZXRhZGF0YSh2YWx1ZSkgfSksXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlbW92ZSBtZXRhZGF0YVxuICAgICAgICBkZWxldGUgKGNsZWFuZWRJdGVtIGFzIGFueSlbXCIvL1wiXTtcbiAgICAgICAgcmV0dXJuIGNsZWFuZWRJdGVtO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gICAgY29uc3QgY2xlYW5lZCA9IHJlbW92ZU1ldGFkYXRhKHRmQ29uZmlnKTtcblxuICAgIHJldHVybiBzdHJpbmdpZnkoY2xlYW5lZCwgbnVsbCwgMikgYXMgc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFRlcnJhZm9ybSBzeW50aGVzaXplZCBKU09OLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzeW50aEhjbChcbiAgICBzdGFjazogVGVycmFmb3JtU3RhY2ssXG4gICAgcnVuVmFsaWRhdGlvbnMgPSBmYWxzZSxcbiAgICByZXR1cm5NZXRhZGF0YSA9IGZhbHNlLFxuICApIHtcbiAgICBpbnZva2VBc3BlY3RzKHN0YWNrKTtcbiAgICBpZiAocnVuVmFsaWRhdGlvbnMpIHtcbiAgICAgIC8vIFNlZSB0aGUgbWF0Y2hpbmcgY29tbWVudCBpbiBUZXN0aW5nLnN5bnRoKCk6IG9ubHkgdGhlIHJlc29sdmUvcmVzZXRcbiAgICAgIC8vIGRpc2NvdmVyeSBoYWxmIG9mIHByZXBhcmVTdGFjaygpLCBuZXZlciB0aGUgYmFja2VuZC1pbmplY3RpbmcgaGFsZi5cbiAgICAgIHN0YWNrLl9ydW5QcmVwYXJpbmdSZXNvbHZlKCk7XG4gICAgICBzdGFjay5ydW5BbGxWYWxpZGF0aW9ucygpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZyA9IHN0YWNrLnRvSGNsVGVycmFmb3JtKCk7XG5cbiAgICBpZiAocmV0dXJuTWV0YWRhdGEpIHJldHVybiBjb25maWcubWV0YWRhdGE7XG5cbiAgICByZXR1cm4gY29uZmlnLmhjbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZnVsbFN5bnRoKHN0YWNrOiBUZXJyYWZvcm1TdGFjayk6IHN0cmluZyB7XG4gICAgY29uc3Qgb3V0ZGlyID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCBcImNka3RmLm91dGRpci5cIikpO1xuXG4gICAgY29uc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoXCJzdHViYmVkXCIsIG91dGRpciwgZmFsc2UpO1xuXG4gICAgc3RhY2suc3ludGhlc2l6ZXIuc3ludGhlc2l6ZSh7XG4gICAgICBvdXRkaXIsXG4gICAgICBtYW5pZmVzdCxcbiAgICB9KTtcblxuICAgIG1hbmlmZXN0LndyaXRlVG9GaWxlKCk7XG5cbiAgICByZXR1cm4gb3V0ZGlyO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyByZW5kZXJDb25zdHJ1Y3RUcmVlKGNvbnN0cnVjdDogSUNvbnN0cnVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlbmRlcihjb25zdHJ1Y3QsIDAsIGZhbHNlKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgZnVuY3Rpb24gcmVuZGVyKFxuICAgICAgY29uc3RydWN0OiBJQ29uc3RydWN0LFxuICAgICAgbGV2ZWw6IG51bWJlcixcbiAgICAgIGlzTGFzdDogYm9vbGVhbixcbiAgICApOiBzdHJpbmcge1xuICAgICAgbGV0IHByZWZpeCA9IFwiXCI7XG4gICAgICBpZiAobGV2ZWwgPiAwKSB7XG4gICAgICAgIGNvbnN0IHNwYWNlcyA9IFwiIFwiLnJlcGVhdCgobGV2ZWwgLSAxKSAqIDQpO1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBpc0xhc3QgPyBcIuKUlFwiIDogXCLilJxcIjtcbiAgICAgICAgcHJlZml4ID0gYCR7c3BhY2VzfSR7c3ltYm9sfeKUgOKUgCBgO1xuICAgICAgfVxuICAgICAgY29uc3QgbmFtZSA9IEFwcC5pc0FwcChjb25zdHJ1Y3QpXG4gICAgICAgID8gXCJBcHBcIlxuICAgICAgICA6IGAke2NvbnN0cnVjdC5ub2RlLmlkfSAoJHtjb25zdHJ1Y3QuY29uc3RydWN0b3IubmFtZX0pYDtcbiAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtuYW1lfVxcbiR7Y29uc3RydWN0Lm5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGQsIGlkeCwgYXJyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNMYXN0ID0gaWR4ID09PSBhcnIubGVuZ3RoIC0gMTtcbiAgICAgICAgICByZXR1cm4gcmVuZGVyKGNoaWxkLCBsZXZlbCArIDEsIGlzTGFzdCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiXCIpfWA7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b0hhdmVEYXRhU291cmNlV2l0aFByb3BlcnRpZXMoXG4gICAgcmVjZWl2ZWQ6IHN0cmluZyxcbiAgICByZXNvdXJjZVR5cGU6IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRUb0hhdmVEYXRhU291cmNlV2l0aFByb3BlcnRpZXMoKShcbiAgICAgIHJlY2VpdmVkLFxuICAgICAgeyB0ZlJlc291cmNlVHlwZTogcmVzb3VyY2VUeXBlIH0sXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICkucGFzcztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9IYXZlRGF0YVNvdXJjZShcbiAgICByZWNlaXZlZDogc3RyaW5nLFxuICAgIHJlc291cmNlVHlwZTogc3RyaW5nLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0VG9IYXZlRGF0YVNvdXJjZVdpdGhQcm9wZXJ0aWVzKCkoXG4gICAgICByZWNlaXZlZCxcbiAgICAgIHsgdGZSZXNvdXJjZVR5cGU6IHJlc291cmNlVHlwZSB9LFxuICAgICAge30sXG4gICAgKS5wYXNzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b0hhdmVSZXNvdXJjZVdpdGhQcm9wZXJ0aWVzKFxuICAgIHJlY2VpdmVkOiBzdHJpbmcsXG4gICAgcmVzb3VyY2VUeXBlOiBzdHJpbmcsXG4gICAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0VG9IYXZlUmVzb3VyY2VXaXRoUHJvcGVydGllcygpKFxuICAgICAgcmVjZWl2ZWQsXG4gICAgICB7IHRmUmVzb3VyY2VUeXBlOiByZXNvdXJjZVR5cGUgfSxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgKS5wYXNzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b0hhdmVSZXNvdXJjZShcbiAgICByZWNlaXZlZDogc3RyaW5nLFxuICAgIHJlc291cmNlVHlwZTogc3RyaW5nLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0VG9IYXZlUmVzb3VyY2VXaXRoUHJvcGVydGllcygpKFxuICAgICAgcmVjZWl2ZWQsXG4gICAgICB7IHRmUmVzb3VyY2VUeXBlOiByZXNvdXJjZVR5cGUgfSxcbiAgICAgIHt9LFxuICAgICkucGFzcztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9IYXZlUHJvdmlkZXJXaXRoUHJvcGVydGllcyhcbiAgICByZWNlaXZlZDogc3RyaW5nLFxuICAgIHJlc291cmNlVHlwZTogc3RyaW5nLFxuICAgIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldFRvSGF2ZVByb3ZpZGVyV2l0aFByb3BlcnRpZXMoKShcbiAgICAgIHJlY2VpdmVkLFxuICAgICAgeyB0ZlJlc291cmNlVHlwZTogcmVzb3VyY2VUeXBlIH0sXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICkucGFzcztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9IYXZlUHJvdmlkZXIoXG4gICAgcmVjZWl2ZWQ6IHN0cmluZyxcbiAgICByZXNvdXJjZVR5cGU6IHN0cmluZyxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldFRvSGF2ZVByb3ZpZGVyV2l0aFByb3BlcnRpZXMoKShcbiAgICAgIHJlY2VpdmVkLFxuICAgICAgeyB0ZlJlc291cmNlVHlwZTogcmVzb3VyY2VUeXBlIH0sXG4gICAgICB7fSxcbiAgICApLnBhc3M7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvQmVWYWxpZFRlcnJhZm9ybShyZWNlaXZlZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRvQmVWYWxpZFRlcnJhZm9ybShyZWNlaXZlZCkucGFzcztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgc2V0dXBKZXN0KCkge1xuICAgIHNldHVwSmVzdCgpO1xuICB9XG59XG4iXX0=
|
|
230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUVuQyw0Q0FBOEI7QUFDOUIsZ0RBQWtDO0FBQ2xDLDRDQUE4QjtBQUU5QixrRkFBOEM7QUFDOUMsMEJBQXlDO0FBQ3pDLDBDQUF1QztBQUN2QywwQ0FBMkM7QUFFM0MsMENBQTRDO0FBQzVDLDJEQUEwRDtBQUMxRCx5Q0FLb0I7QUFlcEIsTUFBTSx1QkFBdUIsR0FBcUI7SUFDaEQsV0FBVyxFQUFFLEtBQUs7SUFDbEIsV0FBVyxFQUFFLElBQUk7SUFDakIsaUJBQWlCLEVBQUUsSUFBSTtJQUN2QixpQkFBaUIsRUFBRSxLQUFLO0NBQ3pCLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQWEsT0FBTzs7SUFDbEI7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUE0QixFQUFFO1FBQzlDLE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyx1QkFBdUIsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEIsU0FBUyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsV0FBVyxDQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FDeEMsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLE9BQUcsQ0FBQztZQUNsQixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07WUFDeEIsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXO1lBQ2xDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztTQUN6QixDQUFDLENBQUM7UUFFSCxJQUFJLFNBQVMsQ0FBQyxXQUFX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LEVBQUUsWUFBWSxFQUFFLEVBQ2hDLEVBQUUsQ0FDSCxDQUFDLElBQUksQ0FBQztJQUNULENBQUM7SUFFTSxNQUFNLENBQUMsNEJBQTRCLENBQ3hDLFFBQWdCLEVBQ2hCLFlBQW9CLEVBQ3BCLGFBQWtDLEVBQUU7UUFFcEMsT0FBTyxJQUFBLDBDQUErQixHQUFFLENBQ3RDLFFBQVEsRUFDUixFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsRUFDaEMsVUFBVSxDQUNYLENBQUMsSUFBSSxDQUFDO0lBQ1QsQ0FBQztJQUVNLE1BQU0sQ0FBQyxjQUFjLENBQzFCLFFBQWdCLEVBQ2hCLFlBQW9CO1FBRXBCLE9BQU8sSUFBQSwwQ0FBK0IsR0FBRSxDQUN0QyxRQUFRLEVBQ1IsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLEVBQ2hDLEVBQUUsQ0FDSCxDQUFDLElBQUksQ0FBQztJQUNULENBQUM7SUFFTSxNQUFNLENBQUMsa0JBQWtCLENBQUMsUUFBZ0I7UUFDL0MsT0FBTyxJQUFBLDZCQUFrQixFQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzQyxDQUFDO0lBRU0sTUFBTSxDQUFDLFNBQVM7UUFDckIsSUFBQSxnQkFBUyxHQUFFLENBQUM7SUFDZCxDQUFDOztBQWhRSCwwQkFpUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwibm9kZTpvc1wiO1xuXG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gXCJzYWZlLXN0YWJsZS1zdHJpbmdpZnlcIjtcbmltcG9ydCB7IEFwcCwgVGVycmFmb3JtU3RhY2sgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IE1hbmlmZXN0IH0gZnJvbSBcIi4uL21hbmlmZXN0XCI7XG5pbXBvcnQgeyBGVVRVUkVfRkxBR1MgfSBmcm9tIFwiLi4vZmVhdHVyZXNcIjtcbmltcG9ydCB7IElDb25zdHJ1Y3QsIENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBzZXR1cEplc3QgfSBmcm9tIFwiLi9hZGFwdGVycy9qZXN0XCI7XG5pbXBvcnQgeyBpbnZva2VBc3BlY3RzIH0gZnJvbSBcIi4uL3N5bnRoZXNpemUvc3ludGhlc2l6ZXJcIjtcbmltcG9ydCB7XG4gIGdldFRvSGF2ZVJlc291cmNlV2l0aFByb3BlcnRpZXMsXG4gIGdldFRvSGF2ZURhdGFTb3VyY2VXaXRoUHJvcGVydGllcyxcbiAgZ2V0VG9IYXZlUHJvdmlkZXJXaXRoUHJvcGVydGllcyxcbiAgdG9CZVZhbGlkVGVycmFmb3JtLFxufSBmcm9tIFwiLi9tYXRjaGVyc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElTY29wZUNhbGxiYWNrIHtcbiAgKHNjb3BlOiBDb25zdHJ1Y3QpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RpbmdBcHBDb25maWcge1xuICByZWFkb25seSBvdXRkaXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YWNrVHJhY2VzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3R1YlZlcnNpb24/OiBib29sZWFuO1xuICByZWFkb25seSBlbmFibGVGdXR1cmVGbGFncz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGZha2VDZGt0Zkpzb25QYXRoPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY29udGV4dD86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG59XG5cbmNvbnN0IERlZmF1bHRUZXN0aW5nQXBwQ29uZmlnOiBUZXN0aW5nQXBwQ29uZmlnID0ge1xuICBzdGFja1RyYWNlczogZmFsc2UsXG4gIHN0dWJWZXJzaW9uOiB0cnVlLFxuICBlbmFibGVGdXR1cmVGbGFnczogdHJ1ZSxcbiAgZmFrZUNka3RmSnNvblBhdGg6IGZhbHNlLFxufTtcblxuLyoqXG4gKiBUZXN0aW5nIHV0aWxpdGllcyBmb3IgY2RrdGYgYXBwbGljYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgVGVzdGluZyB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFwcCBmb3IgdGVzdGluZyB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICogLSBPdXRwdXQgZGlyZWN0b3J5IGlzIGEgdGVtcCBkaXIuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFwcChvcHRpb25zOiBUZXN0aW5nQXBwQ29uZmlnID0ge30pOiBBcHAge1xuICAgIGNvbnN0IGFwcENvbmZpZyA9IHsgLi4uRGVmYXVsdFRlc3RpbmdBcHBDb25maWcsIC4uLm9wdGlvbnMgfTtcbiAgICBpZiAoIWFwcENvbmZpZy5vdXRkaXIpIHtcbiAgICAgIGFwcENvbmZpZy5vdXRkaXIgPSBmcy5ta2R0ZW1wU3luYyhcbiAgICAgICAgcGF0aC5qb2luKG9zLnRtcGRpcigpLCBcImNka3RmLm91dGRpci5cIiksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGFwcCA9IG5ldyBBcHAoe1xuICAgICAgb3V0ZGlyOiBhcHBDb25maWcub3V0ZGlyLFxuICAgICAgc3RhY2tUcmFjZXM6IGFwcENvbmZpZy5zdGFja1RyYWNlcyxcbiAgICAgIGNvbnRleHQ6IG9wdGlvbnMuY29udGV4dCxcbiAgICB9KTtcblxuICAgIGlmIChhcHBDb25maWcuc3R1YlZlcnNpb24pIHtcbiAgICAgIHRoaXMuc3R1YlZlcnNpb24oYXBwKTtcbiAgICB9XG4gICAgaWYgKGFwcENvbmZpZy5lbmFibGVGdXR1cmVGbGFncykge1xuICAgICAgdGhpcy5lbmFibGVGdXR1cmVGbGFncyhhcHApO1xuICAgIH1cbiAgICBpZiAoYXBwQ29uZmlnLmZha2VDZGt0Zkpzb25QYXRoKSB7XG4gICAgICB0aGlzLmZha2VDZGt0Zkpzb25QYXRoKGFwcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFwcDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgc3R1YlZlcnNpb24oYXBwOiBBcHApOiBBcHAge1xuICAgIGFwcC5ub2RlLnNldENvbnRleHQoXCJjZGt0ZlZlcnNpb25cIiwgXCJzdHViYmVkXCIpO1xuICAgIChhcHAubWFuaWZlc3QudmVyc2lvbiBhcyBzdHJpbmcpID0gXCJzdHViYmVkXCI7XG4gICAgcmV0dXJuIGFwcDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZmFrZUNka3RmSnNvblBhdGgoYXBwOiBBcHApOiBBcHAge1xuICAgIGFwcC5ub2RlLnNldENvbnRleHQoXCJjZGt0Zkpzb25QYXRoXCIsIGAke3Byb2Nlc3MuY3dkKCl9L2Nka3RmLmpzb25gKTtcbiAgICBhcHAubm9kZS5zZXRDb250ZXh0KFwiY2RrdGZSZWxhdGl2ZU1vZHVsZXNcIiwgW1wiLi90ZXN0L2ZpeHR1cmVzL1wiXSk7XG4gICAgcmV0dXJuIGFwcDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZW5hYmxlRnV0dXJlRmxhZ3MoYXBwOiBBcHApOiBBcHAge1xuICAgIGNvbnN0IG5vZGUgPSBhcHAubm9kZTtcbiAgICBPYmplY3QuZW50cmllcyhGVVRVUkVfRkxBR1MpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgIG5vZGUuc2V0Q29udGV4dChrZXksIHZhbHVlKSxcbiAgICApO1xuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHN5bnRoU2NvcGUoZm46IElTY29wZUNhbGxiYWNrKSB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgVGVycmFmb3JtU3RhY2soVGVzdGluZy5hcHAoKSwgXCJzdGFja1wiKTtcbiAgICBmbihzdGFjayk7XG4gICAgcmV0dXJuIFRlc3Rpbmcuc3ludGgoc3RhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFRlcnJhZm9ybSBzeW50aGVzaXplZCBKU09OLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzeW50aChzdGFjazogVGVycmFmb3JtU3RhY2ssIHJ1blZhbGlkYXRpb25zID0gZmFsc2UpIHtcbiAgICBpbnZva2VBc3BlY3RzKHN0YWNrKTtcbiAgICBpZiAocnVuVmFsaWRhdGlvbnMpIHtcbiAgICAgIC8vIERlbGliZXJhdGVseSBub3QgdGhlIGZ1bGwgYHByZXBhcmVTdGFjaygpYCAtIHRoYXQgYWxzbyBpbmplY3RzIGFcbiAgICAgIC8vIGxvY2FsIGJhY2tlbmQgdmlhIGBlbnN1cmVCYWNrZW5kRXhpc3RzKClgLCB3aGljaCB3b3VsZCBhZGQgYVxuICAgICAgLy8gYmFja2VuZCBibG9jayB0byBldmVyeSBleGlzdGluZyBzbmFwc2hvdCB0aGF0IG5ldmVyIGFza2VkIGZvciBvbmUuXG4gICAgICAvLyBPbmx5IHJ1biB0aGUgcmVzb2x2ZS9yZXNldCBoYWxmIHRoYXQgKHJlLSlkaXNjb3ZlcnMgY3VycmVudC1wYXNzXG4gICAgICAvLyBwcm92aWRlci1mZWF0dXJlIGFuZCBUZXJyYWZvcm0tZnVuY3Rpb24gdXNhZ2UsIHNvIHRoZSB2YWxpZGF0aW9uc1xuICAgICAgLy8gYmVsb3cgc2VlIHdoYXQgdGhpcyBwYXNzIGFjdHVhbGx5IHJlbmRlcnMgaW5zdGVhZCBvZiBzdGFsZSB1c2FnZVxuICAgICAgLy8gKG9yIG5vbmUgYXQgYWxsKSBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzIGNhbGwgYWdhaW5zdCB0aGUgc2FtZVxuICAgICAgLy8gc3RhY2suIGBfcnVuUHJlcGFyaW5nUmVzb2x2ZWAgY2xlYXJzIHRoZSBzdGFjaydzIG93biBmdW5jdGlvbi11c2FnZVxuICAgICAgLy8gc2V0cyBpdHNlbGYgYmVmb3JlIHJlZGlzY292ZXJpbmcgLSBzZWUgYFRlcnJhZm9ybVN0YWNrLl91c2VkRnVuY3Rpb25zYC5cbiAgICAgIHN0YWNrLl9ydW5QcmVwYXJpbmdSZXNvbHZlKCk7XG4gICAgICBzdGFjay5ydW5BbGxWYWxpZGF0aW9ucygpO1xuICAgIH1cblxuICAgIGNvbnN0IHRmQ29uZmlnID0gc3RhY2sudG9UZXJyYWZvcm0oKTtcblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IHNvcnRzIG9iamVjdCBrZXlzIGFscGhhYmV0aWNhbGx5IGFuZCByZW1vdmVzIHRoZSBgLy9gIG1ldGFkYXRhIGVudHJpZXNcbiAgICAgKiBAcGFyYW0gaXRlbSBWYWx1ZSB0byBjbGVhblxuICAgICAqIEByZXR1cm5zIEEgY29weSBvZiB0aGUgdmFsdWUgd2l0aCBzb3J0ZWQga2V5cyBhbmQgbm8gbWV0YWRhdGEgZW50cmllc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlbW92ZU1ldGFkYXRhKGl0ZW06IGFueSk6IGFueSB7XG4gICAgICBpZiAoaXRlbSAhPT0gbnVsbCAmJiB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICAgIHJldHVybiBpdGVtLm1hcChyZW1vdmVNZXRhZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGVhbmVkSXRlbSA9IE9iamVjdC5lbnRyaWVzKGl0ZW0pXG4gICAgICAgICAgLy8gb3JkZXIgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICAuc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgKGFjYywgW2tleSwgdmFsdWVdKSA9PiAoeyAuLi5hY2MsIFtrZXldOiByZW1vdmVNZXRhZGF0YSh2YWx1ZSkgfSksXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlbW92ZSBtZXRhZGF0YVxuICAgICAgICBkZWxldGUgKGNsZWFuZWRJdGVtIGFzIGFueSlbXCIvL1wiXTtcbiAgICAgICAgcmV0dXJuIGNsZWFuZWRJdGVtO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gICAgY29uc3QgY2xlYW5lZCA9IHJlbW92ZU1ldGFkYXRhKHRmQ29uZmlnKTtcblxuICAgIHJldHVybiBzdHJpbmdpZnkoY2xlYW5lZCwgbnVsbCwgMikgYXMgc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFRlcnJhZm9ybSBzeW50aGVzaXplZCBKU09OLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzeW50aEhjbChcbiAgICBzdGFjazogVGVycmFmb3JtU3RhY2ssXG4gICAgcnVuVmFsaWRhdGlvbnMgPSBmYWxzZSxcbiAgICByZXR1cm5NZXRhZGF0YSA9IGZhbHNlLFxuICApIHtcbiAgICBpbnZva2VBc3BlY3RzKHN0YWNrKTtcbiAgICBpZiAocnVuVmFsaWRhdGlvbnMpIHtcbiAgICAgIC8vIFNlZSB0aGUgbWF0Y2hpbmcgY29tbWVudCBpbiBUZXN0aW5nLnN5bnRoKCk6IG9ubHkgdGhlIHJlc29sdmUvcmVzZXRcbiAgICAgIC8vIGRpc2NvdmVyeSBoYWxmIG9mIHByZXBhcmVTdGFjaygpLCBuZXZlciB0aGUgYmFja2VuZC1pbmplY3RpbmcgaGFsZi5cbiAgICAgIHN0YWNrLl9ydW5QcmVwYXJpbmdSZXNvbHZlKCk7XG4gICAgICBzdGFjay5ydW5BbGxWYWxpZGF0aW9ucygpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZyA9IHN0YWNrLnRvSGNsVGVycmFmb3JtKCk7XG5cbiAgICBpZiAocmV0dXJuTWV0YWRhdGEpIHJldHVybiBjb25maWcubWV0YWRhdGE7XG5cbiAgICByZXR1cm4gY29uZmlnLmhjbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZnVsbFN5bnRoKHN0YWNrOiBUZXJyYWZvcm1TdGFjayk6IHN0cmluZyB7XG4gICAgY29uc3Qgb3V0ZGlyID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCBcImNka3RmLm91dGRpci5cIikpO1xuXG4gICAgY29uc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoXCJzdHViYmVkXCIsIG91dGRpciwgZmFsc2UpO1xuXG4gICAgc3RhY2suc3ludGhlc2l6ZXIuc3ludGhlc2l6ZSh7XG4gICAgICBvdXRkaXIsXG4gICAgICBtYW5pZmVzdCxcbiAgICB9KTtcblxuICAgIG1hbmlmZXN0LndyaXRlVG9GaWxlKCk7XG5cbiAgICByZXR1cm4gb3V0ZGlyO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyByZW5kZXJDb25zdHJ1Y3RUcmVlKGNvbnN0cnVjdDogSUNvbnN0cnVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlbmRlcihjb25zdHJ1Y3QsIDAsIGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSBjb25zdHJ1Y3QgYW5kIGl0cyBkZXNjZW5kYW50cyBhcyBhbiBpbmRlbnRlZCB0cmVlLCBvbmUgY29uc3RydWN0IHBlciBsaW5lXG4gICAgICogQHBhcmFtIGNvbnN0cnVjdCBDb25zdHJ1Y3QgdG8gcmVuZGVyXG4gICAgICogQHBhcmFtIGxldmVsIERlcHRoIG9mIHRoZSBjb25zdHJ1Y3QgaW4gdGhlIHRyZWVcbiAgICAgKiBAcGFyYW0gaXNMYXN0IFdoZXRoZXIgdGhlIGNvbnN0cnVjdCBpcyB0aGUgbGFzdCBjaGlsZCBvZiBpdHMgcGFyZW50XG4gICAgICogQHJldHVybnMgVGhlIHJlbmRlcmVkIHRyZWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZW5kZXIoXG4gICAgICBjb25zdHJ1Y3Q6IElDb25zdHJ1Y3QsXG4gICAgICBsZXZlbDogbnVtYmVyLFxuICAgICAgaXNMYXN0OiBib29sZWFuLFxuICAgICk6IHN0cmluZyB7XG4gICAgICBsZXQgcHJlZml4ID0gXCJcIjtcbiAgICAgIGlmIChsZXZlbCA+IDApIHtcbiAgICAgICAgY29uc3Qgc3BhY2VzID0gXCIgXCIucmVwZWF0KChsZXZlbCAtIDEpICogNCk7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IGlzTGFzdCA/IFwi4pSUXCIgOiBcIuKUnFwiO1xuICAgICAgICBwcmVmaXggPSBgJHtzcGFjZXN9JHtzeW1ib2x94pSA4pSAIGA7XG4gICAgICB9XG4gICAgICBjb25zdCBuYW1lID0gQXBwLmlzQXBwKGNvbnN0cnVjdClcbiAgICAgICAgPyBcIkFwcFwiXG4gICAgICAgIDogYCR7Y29uc3RydWN0Lm5vZGUuaWR9ICgke2NvbnN0cnVjdC5jb25zdHJ1Y3Rvci5uYW1lfSlgO1xuICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke25hbWV9XFxuJHtjb25zdHJ1Y3Qubm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZCwgaWR4LCBhcnIpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0xhc3QgPSBpZHggPT09IGFyci5sZW5ndGggLSAxO1xuICAgICAgICAgIHJldHVybiByZW5kZXIoY2hpbGQsIGxldmVsICsgMSwgaXNMYXN0KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCJcIil9YDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvSGF2ZURhdGFTb3VyY2VXaXRoUHJvcGVydGllcyhcbiAgICByZWNlaXZlZDogc3RyaW5nLFxuICAgIHJlc291cmNlVHlwZTogc3RyaW5nLFxuICAgIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldFRvSGF2ZURhdGFTb3VyY2VXaXRoUHJvcGVydGllcygpKFxuICAgICAgcmVjZWl2ZWQsXG4gICAgICB7IHRmUmVzb3VyY2VUeXBlOiByZXNvdXJjZVR5cGUgfSxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgKS5wYXNzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b0hhdmVEYXRhU291cmNlKFxuICAgIHJlY2VpdmVkOiBzdHJpbmcsXG4gICAgcmVzb3VyY2VUeXBlOiBzdHJpbmcsXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRUb0hhdmVEYXRhU291cmNlV2l0aFByb3BlcnRpZXMoKShcbiAgICAgIHJlY2VpdmVkLFxuICAgICAgeyB0ZlJlc291cmNlVHlwZTogcmVzb3VyY2VUeXBlIH0sXG4gICAgICB7fSxcbiAgICApLnBhc3M7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvSGF2ZVJlc291cmNlV2l0aFByb3BlcnRpZXMoXG4gICAgcmVjZWl2ZWQ6IHN0cmluZyxcbiAgICByZXNvdXJjZVR5cGU6IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRUb0hhdmVSZXNvdXJjZVdpdGhQcm9wZXJ0aWVzKCkoXG4gICAgICByZWNlaXZlZCxcbiAgICAgIHsgdGZSZXNvdXJjZVR5cGU6IHJlc291cmNlVHlwZSB9LFxuICAgICAgcHJvcGVydGllcyxcbiAgICApLnBhc3M7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvSGF2ZVJlc291cmNlKFxuICAgIHJlY2VpdmVkOiBzdHJpbmcsXG4gICAgcmVzb3VyY2VUeXBlOiBzdHJpbmcsXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRUb0hhdmVSZXNvdXJjZVdpdGhQcm9wZXJ0aWVzKCkoXG4gICAgICByZWNlaXZlZCxcbiAgICAgIHsgdGZSZXNvdXJjZVR5cGU6IHJlc291cmNlVHlwZSB9LFxuICAgICAge30sXG4gICAgKS5wYXNzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b0hhdmVQcm92aWRlcldpdGhQcm9wZXJ0aWVzKFxuICAgIHJlY2VpdmVkOiBzdHJpbmcsXG4gICAgcmVzb3VyY2VUeXBlOiBzdHJpbmcsXG4gICAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0VG9IYXZlUHJvdmlkZXJXaXRoUHJvcGVydGllcygpKFxuICAgICAgcmVjZWl2ZWQsXG4gICAgICB7IHRmUmVzb3VyY2VUeXBlOiByZXNvdXJjZVR5cGUgfSxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgKS5wYXNzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b0hhdmVQcm92aWRlcihcbiAgICByZWNlaXZlZDogc3RyaW5nLFxuICAgIHJlc291cmNlVHlwZTogc3RyaW5nLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0VG9IYXZlUHJvdmlkZXJXaXRoUHJvcGVydGllcygpKFxuICAgICAgcmVjZWl2ZWQsXG4gICAgICB7IHRmUmVzb3VyY2VUeXBlOiByZXNvdXJjZVR5cGUgfSxcbiAgICAgIHt9LFxuICAgICkucGFzcztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9CZVZhbGlkVGVycmFmb3JtKHJlY2VpdmVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdG9CZVZhbGlkVGVycmFmb3JtKHJlY2VpdmVkKS5wYXNzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXR1cEplc3QoKSB7XG4gICAgc2V0dXBKZXN0KCk7XG4gIH1cbn1cbiJdfQ==
|
package/lib/testing/matchers.js
CHANGED
|
@@ -51,6 +51,7 @@ const path = __importStar(require("path"));
|
|
|
51
51
|
const crypto = __importStar(require("crypto"));
|
|
52
52
|
const child_process_1 = require("child_process");
|
|
53
53
|
const util_1 = require("../util");
|
|
54
|
+
const target_versions_1 = require("../validations/target-versions");
|
|
54
55
|
const errors_1 = require("../errors");
|
|
55
56
|
/**
|
|
56
57
|
* The result of a testing matcher assertion.
|
|
@@ -58,7 +59,7 @@ const errors_1 = require("../errors");
|
|
|
58
59
|
class AssertionReturn {
|
|
59
60
|
message;
|
|
60
61
|
pass;
|
|
61
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.testingMatchers.AssertionReturn", version: "0.26.0-pre.
|
|
62
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.testingMatchers.AssertionReturn", version: "0.26.0-pre.21" };
|
|
62
63
|
constructor(message, pass) {
|
|
63
64
|
this.message = message;
|
|
64
65
|
this.pass = pass;
|
|
@@ -111,17 +112,32 @@ function asymetricDeepEqualIgnoringObjectCasing(expected, received) {
|
|
|
111
112
|
const defaultPassEvaluation = (items, assertedProperties) => {
|
|
112
113
|
return Object.values(items).some((item) => asymetricDeepEqualIgnoringObjectCasing(assertedProperties, item));
|
|
113
114
|
};
|
|
114
|
-
|
|
115
|
+
/**
|
|
116
|
+
* Determines if given value is an asymmetric matcher (has an `asymmetricMatch` property)
|
|
117
|
+
* @param obj Value to test
|
|
118
|
+
* @returns Boolean
|
|
119
|
+
*/
|
|
115
120
|
function isAsymmetric(obj) {
|
|
116
121
|
return !!obj && typeof obj === "object" && "asymmetricMatch" in obj;
|
|
117
122
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
123
|
+
/**
|
|
124
|
+
* JSON.stringify replacer that renders jest asymmetric matchers (expect.anything(), etc.) as "expect.Anything()" in
|
|
125
|
+
* messages, instead of their internal object representation
|
|
126
|
+
* @param _key Key of the value being stringified
|
|
127
|
+
* @param value Value being stringified
|
|
128
|
+
* @returns The matcher's string form, or the value unchanged
|
|
129
|
+
*/
|
|
121
130
|
function jestAsymetricMatcherStringifyReplacer(_key, value) {
|
|
122
131
|
return isAsymmetric(value) ? `expect.${value.toString()}` : value;
|
|
123
132
|
}
|
|
124
|
-
|
|
133
|
+
/**
|
|
134
|
+
* Creates an assertion that checks whether a synthesized stack contains an element of a given type with the given
|
|
135
|
+
* properties
|
|
136
|
+
* @param functionName Name of the calling matcher, used in error messages
|
|
137
|
+
* @param customPassEvaluation Decides whether any of the found elements matches the asserted properties; defaults to
|
|
138
|
+
* a partial deep equality that matches keys in either camelCase or snake_case
|
|
139
|
+
* @returns The assertion function
|
|
140
|
+
*/
|
|
125
141
|
function getAssertElementWithProperties(functionName,
|
|
126
142
|
// Configurable so each adapter (Jest, Vitest, ...) can use its own matcher semantics.
|
|
127
143
|
customPassEvaluation) {
|
|
@@ -257,7 +273,12 @@ function getProviderLockFileCacheRoot() {
|
|
|
257
273
|
// machine first resolved forever, so the cache expires.
|
|
258
274
|
const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
259
275
|
const binaryVersionCache = new Map();
|
|
260
|
-
|
|
276
|
+
/**
|
|
277
|
+
* Returns the first line of `<binary> version` output, memoised per binary
|
|
278
|
+
* @param binaryName Terraform-compatible binary to query
|
|
279
|
+
* @param env Environment to run the binary with
|
|
280
|
+
* @returns The version line, or "unknown" if the command fails
|
|
281
|
+
*/
|
|
261
282
|
function getBinaryVersion(binaryName, env) {
|
|
262
283
|
const cached = binaryVersionCache.get(binaryName);
|
|
263
284
|
if (cached) {
|
|
@@ -275,7 +296,14 @@ function getBinaryVersion(binaryName, env) {
|
|
|
275
296
|
binaryVersionCache.set(binaryName, version);
|
|
276
297
|
return version;
|
|
277
298
|
}
|
|
278
|
-
|
|
299
|
+
/**
|
|
300
|
+
* Returns the lock-file cache directory for a stack, keyed by binary name, binary version and the stack's
|
|
301
|
+
* `required_providers`
|
|
302
|
+
* @param workingDir Stack working directory containing cdk.tf.json
|
|
303
|
+
* @param binaryName Terraform-compatible binary in use
|
|
304
|
+
* @param env Environment to run the binary with
|
|
305
|
+
* @returns The cache directory, or undefined if cdk.tf.json can't be read
|
|
306
|
+
*/
|
|
279
307
|
function getProviderLockCacheDir(workingDir, binaryName, env) {
|
|
280
308
|
try {
|
|
281
309
|
const config = JSON.parse(fs.readFileSync(path.join(workingDir, "cdk.tf.json"), "utf8"));
|
|
@@ -291,7 +319,11 @@ function getProviderLockCacheDir(workingDir, binaryName, env) {
|
|
|
291
319
|
return undefined;
|
|
292
320
|
}
|
|
293
321
|
}
|
|
294
|
-
|
|
322
|
+
/**
|
|
323
|
+
* Determines if a cached lock file exists and was written within the cache TTL
|
|
324
|
+
* @param cachedLockFile Path to the cached lock file
|
|
325
|
+
* @returns Boolean
|
|
326
|
+
*/
|
|
295
327
|
function isCachedLockFileFresh(cachedLockFile) {
|
|
296
328
|
try {
|
|
297
329
|
return Date.now() - fs.statSync(cachedLockFile).mtimeMs < CACHE_TTL_MS;
|
|
@@ -389,7 +421,11 @@ function resolveAndCacheProviderLockFile(workingDir, binaryName, env) {
|
|
|
389
421
|
// the cache write-back is an optimization only; a failure here must not fail the warm-up
|
|
390
422
|
}
|
|
391
423
|
}
|
|
392
|
-
|
|
424
|
+
/**
|
|
425
|
+
* Reads the stacks from manifest.json in a synth output directory
|
|
426
|
+
* @param received Synth output directory
|
|
427
|
+
* @returns Stack name and manifest entry pairs
|
|
428
|
+
*/
|
|
393
429
|
function getManifestStacks(received) {
|
|
394
430
|
const manifest = JSON.parse(fs.readFileSync(path.resolve(received, "manifest.json"), "utf8"));
|
|
395
431
|
return Object.entries(manifest.stacks);
|
|
@@ -406,9 +442,10 @@ function getManifestStacks(received) {
|
|
|
406
442
|
* @param received one or more `fullSynth` output directories to warm up
|
|
407
443
|
*/
|
|
408
444
|
function warmUpProviderLockFileCache(received) {
|
|
445
|
+
const terraformBinaryName = (0, target_versions_1.inferTerraformBinaryName)();
|
|
409
446
|
received
|
|
410
447
|
.flatMap((dir) => getManifestStacks(dir).map(([, stack]) => path.resolve(dir, stack.workingDirectory)))
|
|
411
|
-
.forEach((workingDir) => resolveAndCacheProviderLockFile(workingDir,
|
|
448
|
+
.forEach((workingDir) => resolveAndCacheProviderLockFile(workingDir, terraformBinaryName, process.env));
|
|
412
449
|
}
|
|
413
450
|
// execSync's default 1 MiB maxBuffer is easily exceeded by `-json` output for a plan/validate
|
|
414
451
|
// of more than a few dozen resources.
|
|
@@ -426,6 +463,7 @@ function toBeValidTerraform(received) {
|
|
|
426
463
|
return new AssertionReturn(`Expected subject to be a terraform directory: ${e}`, false);
|
|
427
464
|
}
|
|
428
465
|
try {
|
|
466
|
+
const terraformBinaryName = (0, target_versions_1.inferTerraformBinaryName)();
|
|
429
467
|
const stacks = getManifestStacks(received);
|
|
430
468
|
stacks.forEach(([name, stack]) => {
|
|
431
469
|
const opts = {
|
|
@@ -434,12 +472,12 @@ function toBeValidTerraform(received) {
|
|
|
434
472
|
stdio: "pipe",
|
|
435
473
|
maxBuffer: EXEC_MAX_BUFFER,
|
|
436
474
|
};
|
|
437
|
-
const seeded = seedFromWarmCache(opts.cwd,
|
|
438
|
-
(0, child_process_1.execSync)(`${
|
|
475
|
+
const seeded = seedFromWarmCache(opts.cwd, terraformBinaryName, opts.env);
|
|
476
|
+
(0, child_process_1.execSync)(`${terraformBinaryName} init -backend=false -input=false`, {
|
|
439
477
|
...opts,
|
|
440
478
|
env: seeded ? opts.env : withoutPluginCache(opts.env),
|
|
441
479
|
});
|
|
442
|
-
const out = (0, child_process_1.execSync)(`${
|
|
480
|
+
const out = (0, child_process_1.execSync)(`${terraformBinaryName} validate -json`, opts);
|
|
443
481
|
const result = JSON.parse(out.toString());
|
|
444
482
|
if (!result.valid) {
|
|
445
483
|
throw (0, errors_1.matchersFoundErrorsInStack)(result.error_count, name, result.diagnostics.join("\n"));
|
|
@@ -461,7 +499,10 @@ const noRealBackendOverrideFileName = "cdktn-testing-no-backend_override.tf.json
|
|
|
461
499
|
function overrideWithLocalBackend(workingDir) {
|
|
462
500
|
fs.writeFileSync(path.join(workingDir, noRealBackendOverrideFileName), JSON.stringify({ terraform: { backend: { local: {} } } }));
|
|
463
501
|
}
|
|
464
|
-
|
|
502
|
+
/**
|
|
503
|
+
* Removes the local backend override written by overrideWithLocalBackend, if present
|
|
504
|
+
* @param workingDir Stack working directory
|
|
505
|
+
*/
|
|
465
506
|
function removeLocalBackendOverride(workingDir) {
|
|
466
507
|
fs.rmSync(path.join(workingDir, noRealBackendOverrideFileName), {
|
|
467
508
|
force: true,
|
|
@@ -481,6 +522,7 @@ function toPlanSuccessfully(received, options = {}) {
|
|
|
481
522
|
return new AssertionReturn(`Expected subject to be a terraform directory: ${e}`, false);
|
|
482
523
|
}
|
|
483
524
|
try {
|
|
525
|
+
const terraformBinaryName = (0, target_versions_1.inferTerraformBinaryName)();
|
|
484
526
|
const stacks = getManifestStacks(received);
|
|
485
527
|
stacks.forEach(([, stack]) => {
|
|
486
528
|
const opts = {
|
|
@@ -493,13 +535,13 @@ function toPlanSuccessfully(received, options = {}) {
|
|
|
493
535
|
overrideWithLocalBackend(opts.cwd);
|
|
494
536
|
}
|
|
495
537
|
try {
|
|
496
|
-
const seeded = seedFromWarmCache(opts.cwd,
|
|
497
|
-
(0, child_process_1.execSync)(`${
|
|
538
|
+
const seeded = seedFromWarmCache(opts.cwd, terraformBinaryName, opts.env);
|
|
539
|
+
(0, child_process_1.execSync)(`${terraformBinaryName} init -input=false`, {
|
|
498
540
|
...opts,
|
|
499
541
|
env: seeded ? opts.env : withoutPluginCache(opts.env),
|
|
500
542
|
});
|
|
501
543
|
// throws on a non-zero exit code
|
|
502
|
-
(0, child_process_1.execSync)(`${
|
|
544
|
+
(0, child_process_1.execSync)(`${terraformBinaryName} plan -input=false -lock=false -json`, opts);
|
|
503
545
|
}
|
|
504
546
|
finally {
|
|
505
547
|
if (!backend) {
|
|
@@ -513,4 +555,4 @@ function toPlanSuccessfully(received, options = {}) {
|
|
|
513
555
|
return new AssertionReturn(withProcessOutput(`Expected subject to plan successfully`, e), false);
|
|
514
556
|
}
|
|
515
557
|
}
|
|
516
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2hlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9tYXRjaGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1Q0Esa0RBT0M7QUFNRCx3RkE2Q0M7QUE2RkQsOEVBZ0JDO0FBTUQsMEVBZ0JDO0FBb0ZELDBFQWdCQztBQXNNRCxrRUFjQztBQVNELGdEQWdEQztBQXNDRCxnREFpRUM7O0FBNXJCRCwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLHVDQUF5QjtBQUN6Qix1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLCtDQUFpQztBQUNqQyxpREFBMkQ7QUFDM0Qsa0NBQXlEO0FBQ3pELHNDQUltQjtBQVluQjs7R0FFRztBQUNILE1BQWEsZUFBZTtJQUVSO0lBQ0E7O0lBRmxCLFlBQ2tCLE9BQWUsRUFDZixJQUFhO1FBRGIsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLFNBQUksR0FBSixJQUFJLENBQVM7SUFDNUIsQ0FBQzs7QUFKTiwwQ0FLQztBQUlEOztHQUVHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQ2pDLFFBQXlCO0lBRXpCLE9BQU87UUFDTCxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU87UUFDL0IsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO0tBQ3BCLENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0Isc0NBQXNDLENBQ3BELFFBQWlCLEVBQ2pCLFFBQWlCO0lBRWpCLFFBQVEsT0FBTyxRQUFRLEVBQUUsQ0FBQztRQUN4QixLQUFLLFFBQVE7WUFDWCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxDQUNMLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO29CQUN2QixRQUFRLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNO29C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NUQsSUFBSSxDQUNMLENBQUM7WUFDSixDQUFDO29CQUFTLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNiLDBCQUEwQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdkMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxlQUFlLENBQ3hCLDJDQUEyQyxFQUMzQyxJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsT0FBTyxJQUFJLGVBQWUsQ0FDeEIsaUJBQWlCLENBQUMsdUNBQXVDLEVBQUUsQ0FBQyxDQUFDLEVBQzdELEtBQUssQ0FDTixDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBleGVjU3luYywgU3Bhd25TeW5jUmV0dXJucyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBzbmFrZUNhc2UsIHRlcnJhZm9ybUJpbmFyeU5hbWUgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IHtcbiAgaW52YWxpZFN0YWNrLFxuICBtYXRjaGVyc0ZvdW5kRXJyb3JzSW5TdGFjayxcbiAgbWF0Y2hlcnNQYXRoSXNOb3REaXJlY3RvcnksXG59IGZyb20gXCIuLi9lcnJvcnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1Db25zdHJ1Y3RvciB7XG4gIHJlYWRvbmx5IHRmUmVzb3VyY2VUeXBlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFN5bnRoZXNpemVkU3RhY2sgPSB7XG4gIHJlc291cmNlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwcm92aWRlcjogUmVjb3JkPHN0cmluZywgYW55Pjtcbn07XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiBhIHRlc3RpbmcgbWF0Y2hlciBhc3NlcnRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3NlcnRpb25SZXR1cm4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBwYXNzOiBib29sZWFuLFxuICApIHt9XG59XG5cbmV4cG9ydCB0eXBlIE1hdGNoZXJSZXR1cm5KZXN0ID0geyBtZXNzYWdlOiAoKSA9PiBzdHJpbmc7IHBhc3M6IGJvb2xlYW4gfTtcblxuLyoqXG4gKiBBZGFwdHMgYW4ge0BsaW5rIEFzc2VydGlvblJldHVybn0gdG8gSmVzdCdzIGB7IG1lc3NhZ2UsIHBhc3MgfWAgbWF0Y2hlciBzaGFwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJldHVybk1hdGNoZXJUb0plc3QoXG4gIHRvUmV0dXJuOiBBc3NlcnRpb25SZXR1cm4sXG4pOiBNYXRjaGVyUmV0dXJuSmVzdCB7XG4gIHJldHVybiB7XG4gICAgbWVzc2FnZTogKCkgPT4gdG9SZXR1cm4ubWVzc2FnZSxcbiAgICBwYXNzOiB0b1JldHVybi5wYXNzLFxuICB9O1xufVxuXG4vKipcbiAqIERlZXAtZXF1YWxzIGBleHBlY3RlZGAgYWdhaW5zdCBgcmVjZWl2ZWRgLCBpZ25vcmluZyBleHRyYSBwcm9wZXJ0aWVzIG9uIGByZWNlaXZlZGAgYW5kXG4gKiBtYXRjaGluZyBlYWNoIGtleSBpbiBlaXRoZXIgY2FtZWxDYXNlIG9yIHNuYWtlX2Nhc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3ltZXRyaWNEZWVwRXF1YWxJZ25vcmluZ09iamVjdENhc2luZyhcbiAgZXhwZWN0ZWQ6IHVua25vd24sXG4gIHJlY2VpdmVkOiB1bmtub3duLFxuKTogYm9vbGVhbiB7XG4gIHN3aXRjaCAodHlwZW9mIGV4cGVjdGVkKSB7XG4gICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShyZWNlaXZlZCkgJiZcbiAgICAgICAgICBleHBlY3RlZC5sZW5ndGggPT09IHJlY2VpdmVkLmxlbmd0aCAmJlxuICAgICAgICAgIGV4cGVjdGVkLmV2ZXJ5KChpdGVtLCBpbmRleCkgPT5cbiAgICAgICAgICAgIGFzeW1ldHJpY0RlZXBFcXVhbElnbm9yaW5nT2JqZWN0Q2FzaW5nKGl0ZW0sIHJlY2VpdmVkW2luZGV4XSksXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGV4cGVjdGVkID09PSBudWxsICYmIHJlY2VpdmVkID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGV4cGVjdGVkID09PSB1bmRlZmluZWQgJiYgcmVjZWl2ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChleHBlY3RlZCA9PT0gbnVsbCB8fCByZWNlaXZlZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhleHBlY3RlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuZXZlcnkoKGtleSkgPT4ge1xuICAgICAgICBpZiAoKHJlY2VpdmVkIGFzIGFueSlba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGFzeW1ldHJpY0RlZXBFcXVhbElnbm9yaW5nT2JqZWN0Q2FzaW5nKFxuICAgICAgICAgICAgKGV4cGVjdGVkIGFzIGFueSlba2V5XSxcbiAgICAgICAgICAgIChyZWNlaXZlZCBhcyBhbnkpW2tleV0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgocmVjZWl2ZWQgYXMgYW55KVtzbmFrZUNhc2Uoa2V5KV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBhc3ltZXRyaWNEZWVwRXF1YWxJZ25vcmluZ09iamVjdENhc2luZyhcbiAgICAgICAgICAgIChleHBlY3RlZCBhcyBhbnkpW2tleV0sXG4gICAgICAgICAgICAocmVjZWl2ZWQgYXMgYW55KVtzbmFrZUNhc2Uoa2V5KV0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZXhwZWN0ZWQgPT09IHJlY2VpdmVkO1xuICB9XG59XG5jb25zdCBkZWZhdWx0UGFzc0V2YWx1YXRpb24gPSAoXG4gIGl0ZW1zOiBhbnksXG4gIGFzc2VydGVkUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PixcbikgPT4ge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhpdGVtcykuc29tZSgoaXRlbTogYW55KSA9PlxuICAgIGFzeW1ldHJpY0RlZXBFcXVhbElnbm9yaW5nT2JqZWN0Q2FzaW5nKGFzc2VydGVkUHJvcGVydGllcywgaXRlbSksXG4gICk7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gaXNBc3ltbWV0cmljKG9iajogYW55KSB7XG4gIHJldHVybiAhIW9iaiAmJiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIFwiYXN5bW1ldHJpY01hdGNoXCIgaW4gb2JqO1xufVxuLy8gUmVuZGVycyBqZXN0IGFzeW1tZXRyaWMgbWF0Y2hlcnMgKGV4cGVjdC5hbnl0aGluZygpLCBldGMuKSBhcyBcImV4cGVjdC5Bbnl0aGluZygpXCIgaW4gbWVzc2FnZXMsXG4vLyBpbnN0ZWFkIG9mIHRoZWlyIGludGVybmFsIG9iamVjdCByZXByZXNlbnRhdGlvbi5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5mdW5jdGlvbiBqZXN0QXN5bWV0cmljTWF0Y2hlclN0cmluZ2lmeVJlcGxhY2VyKF9rZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICByZXR1cm4gaXNBc3ltbWV0cmljKHZhbHVlKSA/IGBleHBlY3QuJHt2YWx1ZS50b1N0cmluZygpfWAgOiB2YWx1ZTtcbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5mdW5jdGlvbiBnZXRBc3NlcnRFbGVtZW50V2l0aFByb3BlcnRpZXMoXG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICAvLyBDb25maWd1cmFibGUgc28gZWFjaCBhZGFwdGVyIChKZXN0LCBWaXRlc3QsIC4uLikgY2FuIHVzZSBpdHMgb3duIG1hdGNoZXIgc2VtYW50aWNzLlxuICBjdXN0b21QYXNzRXZhbHVhdGlvbj86IChcbiAgICBpdGVtczogYW55W10sXG4gICAgYXNzZXJ0ZWRQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICApID0+IGJvb2xlYW4sXG4pIHtcbiAgY29uc3QgcGFzc0V2YWx1YXRpb24gPSBjdXN0b21QYXNzRXZhbHVhdGlvbiB8fCBkZWZhdWx0UGFzc0V2YWx1YXRpb247XG4gIHJldHVybiBmdW5jdGlvbiBnZXRBc3NlcnRFbGVtZW50V2l0aFByb3BlcnRpZXMoXG4gICAgdHlwZToga2V5b2YgU3ludGhlc2l6ZWRTdGFjayxcbiAgICByZWNlaXZlZDogc3RyaW5nLFxuICAgIGl0ZW1UeXBlOiBUZXJyYWZvcm1Db25zdHJ1Y3RvcixcbiAgICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICk6IEFzc2VydGlvblJldHVybiB7XG4gICAgbGV0IHN0YWNrOiBTeW50aGVzaXplZFN0YWNrO1xuXG4gICAgLy8gcmVjZWl2ZWQgbWF5IGJlIGEgSlNPTiBzdHJpbmcgb3IgYSBwYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIG9uZVxuICAgIGNvbnN0IHN0YWNrQ29udGVudCA9IGZzLmV4aXN0c1N5bmMocmVjZWl2ZWQpXG4gICAgICA/IGZzLnJlYWRGaWxlU3luYyhyZWNlaXZlZCwgXCJ1dGY4XCIpXG4gICAgICA6IHJlY2VpdmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIHN0YWNrID0gSlNPTi5wYXJzZShzdGFja0NvbnRlbnQpIGFzIFN5bnRoZXNpemVkU3RhY2s7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgaW52YWxpZFN0YWNrKGZ1bmN0aW9uTmFtZSwgc3RhY2tDb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyBmaW5kIGV2ZXJ5IGl0ZW0gb2YgaXRlbVR5cGUudGZSZXNvdXJjZVR5cGUgdW5kZXIgc3RhY2tbdHlwZV0sIGtleWVkIGJ5IG5hbWVcbiAgICBjb25zdCBpdGVtcyA9XG4gICAgICBPYmplY3QudmFsdWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhzdGFja1t0eXBlXSB8fCB7fSkuZmluZChcbiAgICAgICAgICAoW3R5cGUsIF92YWx1ZXNdKSA9PiB0eXBlID09PSBpdGVtVHlwZS50ZlJlc291cmNlVHlwZSxcbiAgICAgICAgKT8uWzFdIHx8IHt9LFxuICAgICAgKSB8fCBbXTtcbiAgICBjb25zdCBwYXNzID0gcGFzc0V2YWx1YXRpb24oaXRlbXMsIHByb3BlcnRpZXMpO1xuICAgIGlmIChwYXNzKSB7XG4gICAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihcbiAgICAgICAgYEV4cGVjdGVkIG5vICR7XG4gICAgICAgICAgaXRlbVR5cGUudGZSZXNvdXJjZVR5cGVcbiAgICAgICAgfSB3aXRoIHByb3BlcnRpZXMgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgIGplc3RBc3ltZXRyaWNNYXRjaGVyU3RyaW5naWZ5UmVwbGFjZXIsXG4gICAgICAgICl9IHRvIGJlIHByZXNlbnQgaW4gc3ludGhlc2l6ZWQgc3RhY2suXG5Gb3VuZCAke2l0ZW1zLmxlbmd0aCA9PT0gMCA/IFwibm9cIiA6IGl0ZW1zLmxlbmd0aH0gJHtcbiAgICAgICAgICBpdGVtVHlwZS50ZlJlc291cmNlVHlwZVxuICAgICAgICB9IHJlc291cmNlcyBpbnN0ZWFkJHtcbiAgICAgICAgICBpdGVtcy5sZW5ndGggPiAwID8gXCI6XFxuXCIgKyBKU09OLnN0cmluZ2lmeShpdGVtcywgbnVsbCwgMikgOiBcIlwiXG4gICAgICAgIH1gLFxuICAgICAgICBwYXNzLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb25SZXR1cm4oXG4gICAgICAgIGBFeHBlY3RlZCAke2l0ZW1UeXBlLnRmUmVzb3VyY2VUeXBlfSB3aXRoIHByb3BlcnRpZXMgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgIGplc3RBc3ltZXRyaWNNYXRjaGVyU3RyaW5naWZ5UmVwbGFjZXIsXG4gICAgICAgICl9IHRvIGJlIHByZXNlbnQgaW4gc3ludGhlc2l6ZWQgc3RhY2suXG5Gb3VuZCAke2l0ZW1zLmxlbmd0aCA9PT0gMCA/IFwibm9cIiA6IGl0ZW1zLmxlbmd0aH0gJHtcbiAgICAgICAgICBpdGVtVHlwZS50ZlJlc291cmNlVHlwZVxuICAgICAgICB9IHJlc291cmNlcyBpbnN0ZWFkJHtcbiAgICAgICAgICBpdGVtcy5sZW5ndGggPiAwID8gXCI6XFxuXCIgKyBKU09OLnN0cmluZ2lmeShpdGVtcywgbnVsbCwgMikgOiBcIlwiXG4gICAgICAgIH1gLFxuICAgICAgICBwYXNzLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGB0b0hhdmVEYXRhU291cmNlV2l0aFByb3BlcnRpZXNgIG1hdGNoZXIgdXNpbmcgYGN1c3RvbVBhc3NFdmFsdWF0aW9uYCB0byBkZWNpZGUgYVxuICogbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb0hhdmVEYXRhU291cmNlV2l0aFByb3BlcnRpZXMoXG4gIGN1c3RvbVBhc3NFdmFsdWF0aW9uPzogKFxuICAgIGl0ZW1zOiBhbnksXG4gICAgYXNzZXJ0ZWRQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICApID0+IGJvb2xlYW4sXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSGF2ZURhdGFTb3VyY2VXaXRoUHJvcGVydGllcyhcbiAgICByZWNlaXZlZDogc3RyaW5nLFxuICAgIHJlc291cmNlVHlwZTogVGVycmFmb3JtQ29uc3RydWN0b3IsXG4gICAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICApOiBBc3NlcnRpb25SZXR1cm4ge1xuICAgIHJldHVybiBnZXRBc3NlcnRFbGVtZW50V2l0aFByb3BlcnRpZXMoXG4gICAgICBcInRvSGF2ZURhdGFTb3VyY2VXaXRoUHJvcGVydGllc1wiLFxuICAgICAgY3VzdG9tUGFzc0V2YWx1YXRpb24sXG4gICAgKShcImRhdGFcIiwgcmVjZWl2ZWQsIHJlc291cmNlVHlwZSwgcHJvcGVydGllcyk7XG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGB0b0hhdmVSZXNvdXJjZVdpdGhQcm9wZXJ0aWVzYCBtYXRjaGVyIHVzaW5nIGBjdXN0b21QYXNzRXZhbHVhdGlvbmAgdG8gZGVjaWRlIGFcbiAqIG1hdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9IYXZlUmVzb3VyY2VXaXRoUHJvcGVydGllcyhcbiAgY3VzdG9tUGFzc0V2YWx1YXRpb24/OiAoXG4gICAgaXRlbXM6IGFueSxcbiAgICBhc3NlcnRlZFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICkgPT4gYm9vbGVhbixcbikge1xuICByZXR1cm4gZnVuY3Rpb24gdG9IYXZlUmVzb3VyY2VXaXRoUHJvcGVydGllcyhcbiAgICByZWNlaXZlZDogc3RyaW5nLFxuICAgIHJlc291cmNlVHlwZTogVGVycmFmb3JtQ29uc3RydWN0b3IsXG4gICAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICApOiBBc3NlcnRpb25SZXR1cm4ge1xuICAgIHJldHVybiBnZXRBc3NlcnRFbGVtZW50V2l0aFByb3BlcnRpZXMoXG4gICAgICBcInRvSGF2ZVJlc291cmNlV2l0aFByb3BlcnRpZXNcIixcbiAgICAgIGN1c3RvbVBhc3NFdmFsdWF0aW9uLFxuICAgICkoXCJyZXNvdXJjZVwiLCByZWNlaXZlZCwgcmVzb3VyY2VUeXBlLCBwcm9wZXJ0aWVzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgYGVycmAgY2FycmllcyBgY2hpbGRfcHJvY2Vzcy5leGVjU3luY2AvYHNwYXduU3luY2Agb3V0cHV0IGJ1ZmZlcnMuXG4gKi9cbmNvbnN0IGlzRXhlY1NwYXduRXJyb3IgPSAoZXJyOiBhbnkpOiBlcnIgaXMgRXJyb3IgJiBTcGF3blN5bmNSZXR1cm5zPGFueT4gPT5cbiAgXCJvdXRwdXRcIiBpbiBlcnIgJiZcbiAgQXJyYXkuaXNBcnJheShlcnIub3V0cHV0KSAmJlxuICBlcnIub3V0cHV0LnNvbWUoKGJ1ZjogYW55KSA9PiBCdWZmZXIuaXNCdWZmZXIoYnVmKSk7XG5cbi8qKlxuICogUmVuZGVycyB0ZXJyYWZvcm0gZGlhZ25vc3RpYyBlbnRyaWVzIGFzIGh1bWFuLXJlYWRhYmxlIHRleHQuXG4gKi9cbmNvbnN0IGZvcm1hdERpYWdub3N0aWNzID0gKGRpYWdub3N0aWNzOiBhbnlbXSk6IHN0cmluZyA9PlxuICBkaWFnbm9zdGljc1xuICAgIC5maWx0ZXIoKGQpID0+IGQ/LnNldmVyaXR5ICYmIGQ/LnN1bW1hcnkpXG4gICAgLm1hcChcbiAgICAgICh7IHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwgfSkgPT5cbiAgICAgICAgYCR7c2V2ZXJpdHl9OiAke3N1bW1hcnl9JHtkZXRhaWwgPyBgXFxuJHtkZXRhaWx9YCA6IFwiXCJ9YCxcbiAgICApXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbi8qKlxuICogUmVuZGVycyB0aGUgZGlhZ25vc3RpY3MgZm91bmQgaW4gdGhlIG91dHB1dCBvZiBhIGB0ZXJyYWZvcm0gPGNtZD4gLWpzb25gIGludm9jYXRpb24gYXNcbiAqIGh1bWFuLXJlYWRhYmxlIHRleHQuIEhhbmRsZXMgYm90aCBgcGxhbmAncyBuZXdsaW5lLWRlbGltaXRlZCBKU09OIHN0cmVhbSAob25lIGBkaWFnbm9zdGljYFxuICogZW50cnkgcGVyIGxpbmUpIGFuZCBgdmFsaWRhdGVgJ3Mgc2luZ2xlIHByZXR0eS1wcmludGVkIG9iamVjdCAoYSB0b3AtbGV2ZWwgYGRpYWdub3N0aWNzYFxuICogYXJyYXkpLlxuICovXG5jb25zdCByZW5kZXJKc29uRGlhZ25vc3RpY3MgPSAob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uob3V0cHV0KTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJzZWQ/LmRpYWdub3N0aWNzKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdERpYWdub3N0aWNzKHBhcnNlZC5kaWFnbm9zdGljcyk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBub3QgYSBzaW5nbGUgSlNPTiBvYmplY3Q7IGZhbGwgdGhyb3VnaCB0byB0aGUgbmV3bGluZS1kZWxpbWl0ZWQgZm9ybWF0XG4gIH1cblxuICBjb25zdCBkaWFnbm9zdGljcyA9IG91dHB1dFxuICAgIC5zcGxpdChcIlxcblwiKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxpbmUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSlcbiAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnk/LnR5cGUgPT09IFwiZGlhZ25vc3RpY1wiICYmIGVudHJ5LmRpYWdub3N0aWMpXG4gICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LmRpYWdub3N0aWMpO1xuXG4gIHJldHVybiBmb3JtYXREaWFnbm9zdGljcyhkaWFnbm9zdGljcyk7XG59O1xuXG4vKipcbiAqIEFwcGVuZHMgYSBmYWlsZWQgcHJvY2VzcydzIG91dHB1dCB0byBhbiBhc3NlcnRpb24gbWVzc2FnZSwgcHJlZmVycmluZyByZW5kZXJlZCBgLWpzb25gXG4gKiBkaWFnbm9zdGljcyBvdmVyIHRoZSByYXcgb3V0cHV0IHdoZW4gYXZhaWxhYmxlLlxuICovXG5jb25zdCB3aXRoUHJvY2Vzc091dHB1dCA9IChtZXNzYWdlOiBzdHJpbmcsIGVycjogdW5rbm93bikgPT4ge1xuICBpZiAoIWlzRXhlY1NwYXduRXJyb3IoZXJyKSkge1xuICAgIHJldHVybiBgJHttZXNzYWdlfTogJHtlcnJ9LmA7XG4gIH1cblxuICBjb25zdCBvdXRwdXQgPVxuICAgIGVyci5vdXRwdXRcbiAgICAgID8ubWFwKChidWZmZXI6IEJ1ZmZlcikgPT4gYnVmZmVyPy50b1N0cmluZyhcInV0ZjhcIikpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbihcIlxcblwiKSA/PyBcIlwiO1xuXG4gIC8vIERpYWdub3N0aWNzIGFyZSBwYXJzZWQgZnJvbSBzdGRvdXQgYWxvbmU6IGNvbmNhdGVuYXRpbmcgc3RkZXJyIChlLmcuIGEgQ0xJLWNvbmZpZyBlcnJvcilcbiAgLy8gaW50byB0aGUgbWl4IHdvdWxkIGJyZWFrIHRoZSBzaW5nbGUtb2JqZWN0IHBhcnNlIGAtanNvbmAgb3V0cHV0IHJlbGllcyBvbi5cbiAgY29uc3QgZGlhZ25vc3RpY3MgPSByZW5kZXJKc29uRGlhZ25vc3RpY3MoZXJyLnN0ZG91dD8udG9TdHJpbmcoXCJ1dGY4XCIpID8/IFwiXCIpO1xuICBjb25zdCBhcHBlbmRpeCA9IGRpYWdub3N0aWNzLmxlbmd0aFxuICAgID8gYC4gRGlhZ25vc3RpY3M6ICR7ZGlhZ25vc3RpY3N9YFxuICAgIDogb3V0cHV0Lmxlbmd0aFxuICAgICAgPyBgLiBPdXRwdXQ6ICR7b3V0cHV0fWBcbiAgICAgIDogXCJcIjtcblxuICByZXR1cm4gYCR7bWVzc2FnZX06ICR7ZXJyfSR7YXBwZW5kaXh9LmA7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBgdG9IYXZlUHJvdmlkZXJXaXRoUHJvcGVydGllc2AgbWF0Y2hlciB1c2luZyBgY3VzdG9tUGFzc0V2YWx1YXRpb25gIHRvIGRlY2lkZSBhXG4gKiBtYXRjaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRvSGF2ZVByb3ZpZGVyV2l0aFByb3BlcnRpZXMoXG4gIGN1c3RvbVBhc3NFdmFsdWF0aW9uPzogKFxuICAgIGl0ZW1zOiBhbnksXG4gICAgYXNzZXJ0ZWRQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICApID0+IGJvb2xlYW4sXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSGF2ZVByb3ZpZGVyV2l0aFByb3BlcnRpZXMoXG4gICAgcmVjZWl2ZWQ6IHN0cmluZyxcbiAgICByZXNvdXJjZVR5cGU6IFRlcnJhZm9ybUNvbnN0cnVjdG9yLFxuICAgIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgKTogQXNzZXJ0aW9uUmV0dXJuIHtcbiAgICByZXR1cm4gZ2V0QXNzZXJ0RWxlbWVudFdpdGhQcm9wZXJ0aWVzKFxuICAgICAgXCJ0b0hhdmVQcm92aWRlcldpdGhQcm9wZXJ0aWVzXCIsXG4gICAgICBjdXN0b21QYXNzRXZhbHVhdGlvbixcbiAgICApKFwicHJvdmlkZXJcIiwgcmVjZWl2ZWQsIHJlc291cmNlVHlwZSwgcHJvcGVydGllcyk7XG4gIH07XG59XG5cbi8qKlxuICogVGhlIHJvb3QgZGlyZWN0b3J5IHRoZSBwcm92aWRlciBsb2NrLWZpbGUgY2FjaGUgaXMgd3JpdHRlbiB1bmRlci4gT3ZlcnJpZGFibGUgdmlhXG4gKiBgQ0RLVE5fVEVTVElOR19MT0NLRklMRV9DQUNIRV9ESVJgIHNvIHRlc3RzIGNhbiBhc3NlcnQgb24gd2hhdCBnZXRzIHdyaXR0ZW4gdG8gaXQgaW5zdGVhZCBvZlxuICogc2hhcmluZyB0aGUgcmVhbCBtYWNoaW5lLWdsb2JhbCBjYWNoZSwgYW5kIHNvIENJIGNhbiBwb2ludCBpdCBhdCBhIGRpcmVjdG9yeSBwZXJzaXN0ZWRcbiAqIGJldHdlZW4gam9icy5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvdmlkZXJMb2NrRmlsZUNhY2hlUm9vdCgpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIHByb2Nlc3MuZW52LkNES1ROX1RFU1RJTkdfTE9DS0ZJTEVfQ0FDSEVfRElSID8/XG4gICAgcGF0aC5qb2luKG9zLnRtcGRpcigpLCBcImNka3RuLXRlc3RpbmctcHJvdmlkZXItbG9ja2ZpbGVzXCIpXG4gICk7XG59XG5cbi8vIEEgbG9vc2VseSBwaW5uZWQgcmVxdWlyZW1lbnQgKGUuZy4gXCJ+PiA1LjBcIikgc2hvdWxkbid0IHN0YXkgcGlubmVkIHRvIHdoaWNoZXZlciB2ZXJzaW9uIGFcbi8vIG1hY2hpbmUgZmlyc3QgcmVzb2x2ZWQgZm9yZXZlciwgc28gdGhlIGNhY2hlIGV4cGlyZXMuXG5jb25zdCBDQUNIRV9UVExfTVMgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG5jb25zdCBiaW5hcnlWZXJzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gZ2V0QmluYXJ5VmVyc2lvbihiaW5hcnlOYW1lOiBzdHJpbmcsIGVudjogTm9kZUpTLlByb2Nlc3NFbnYpOiBzdHJpbmcge1xuICBjb25zdCBjYWNoZWQgPSBiaW5hcnlWZXJzaW9uQ2FjaGUuZ2V0KGJpbmFyeU5hbWUpO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuXG4gIGxldCB2ZXJzaW9uID0gXCJ1bmtub3duXCI7XG4gIHRyeSB7XG4gICAgdmVyc2lvbiA9IGV4ZWNTeW5jKGAke2JpbmFyeU5hbWV9IHZlcnNpb25gLCB7IGVudiwgc3RkaW86IFwicGlwZVwiIH0pXG4gICAgICAudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgICAuc3BsaXQoXCJcXG5cIilbMF07XG4gIH0gY2F0Y2gge1xuICAgIC8vIG9ubHkgYWZmZWN0cyBjYWNoZSBwYXJ0aXRpb25pbmcsIHNvIFwidW5rbm93blwiIGlzIGFuIGFjY2VwdGFibGUgZmFsbGJhY2tcbiAgfVxuXG4gIGJpbmFyeVZlcnNpb25DYWNoZS5zZXQoYmluYXJ5TmFtZSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gZ2V0UHJvdmlkZXJMb2NrQ2FjaGVEaXIoXG4gIHdvcmtpbmdEaXI6IHN0cmluZyxcbiAgYmluYXJ5TmFtZTogc3RyaW5nLFxuICBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JraW5nRGlyLCBcImNkay50Zi5qc29uXCIpLCBcInV0ZjhcIiksXG4gICAgKTtcbiAgICBjb25zdCBjYWNoZUtleSA9IGNyeXB0b1xuICAgICAgLmNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAgIC51cGRhdGUoYmluYXJ5TmFtZSlcbiAgICAgIC51cGRhdGUoZ2V0QmluYXJ5VmVyc2lvbihiaW5hcnlOYW1lLCBlbnYpKVxuICAgICAgLnVwZGF0ZShKU09OLnN0cmluZ2lmeShjb25maWc/LnRlcnJhZm9ybT8ucmVxdWlyZWRfcHJvdmlkZXJzID8/IHt9KSlcbiAgICAgIC5kaWdlc3QoXCJoZXhcIik7XG4gICAgcmV0dXJuIHBhdGguam9pbihnZXRQcm92aWRlckxvY2tGaWxlQ2FjaGVSb290KCksIGNhY2hlS2V5KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gaXNDYWNoZWRMb2NrRmlsZUZyZXNoKGNhY2hlZExvY2tGaWxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRGF0ZS5ub3coKSAtIGZzLnN0YXRTeW5jKGNhY2hlZExvY2tGaWxlKS5tdGltZU1zIDwgQ0FDSEVfVFRMX01TO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDb3BpZXMgYSBjYWNoZWQgYC50ZXJyYWZvcm0ubG9jay5oY2xgIGludG8gYHdvcmtpbmdEaXJgIGlmIGB3YXJtVXBQcm92aWRlckxvY2tGaWxlQ2FjaGVgIGhhc1xuICogYWxyZWFkeSByZXNvbHZlZCBvbmUgZm9yIGl0cyBleGFjdCBzZXQgb2YgcmVxdWlyZWQgcHJvdmlkZXJzLCBhbmQgaXQgaGFzbid0IGV4cGlyZWQuIE5ldmVyXG4gKiBydW5zIGBpbml0YCBpdHNlbGYuIEEgYHdvcmtpbmdEaXJgIHRoYXQgYWxyZWFkeSBoYXMgaXRzIG93biBsb2NrIGZpbGUgaXMgbGVmdCB1bnRvdWNoZWQg4oCUXG4gKiByZWFsIHN0YWNrIGRpcmVjdG9yaWVzIGtlZXAgYSBwaW5uZWQgb25lIChgY2xpLWNvcmVgIHJlYWRzIGl0IGZyb20gdGhlcmUpLCBhbmQgb3ZlcndyaXRpbmcgaXRcbiAqIHdpdGggdGhlIGNhY2hlZCBvbmUgd291bGQgc2lsZW50bHkgc3dhcCBpdHMgdmVyc2lvbnMuXG4gKlxuICogQHJldHVybnMgd2hldGhlciBhIGxvY2sgZmlsZSB3YXMgc2VlZGVkLlxuICovXG5mdW5jdGlvbiBzZWVkRnJvbVdhcm1DYWNoZShcbiAgd29ya2luZ0Rpcjogc3RyaW5nLFxuICBiaW5hcnlOYW1lOiBzdHJpbmcsXG4gIGVudjogTm9kZUpTLlByb2Nlc3NFbnYsXG4pOiBib29sZWFuIHtcbiAgY29uc3QgdGFyZ2V0TG9ja0ZpbGUgPSBwYXRoLmpvaW4od29ya2luZ0RpciwgXCIudGVycmFmb3JtLmxvY2suaGNsXCIpO1xuICBpZiAoZnMuZXhpc3RzU3luYyh0YXJnZXRMb2NrRmlsZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjYWNoZURpciA9IGdldFByb3ZpZGVyTG9ja0NhY2hlRGlyKHdvcmtpbmdEaXIsIGJpbmFyeU5hbWUsIGVudik7XG4gIGlmICghY2FjaGVEaXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjYWNoZWRMb2NrRmlsZSA9IHBhdGguam9pbihjYWNoZURpciwgXCIudGVycmFmb3JtLmxvY2suaGNsXCIpO1xuICBpZiAoIWlzQ2FjaGVkTG9ja0ZpbGVGcmVzaChjYWNoZWRMb2NrRmlsZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmcy5jb3B5RmlsZVN5bmMoY2FjaGVkTG9ja0ZpbGUsIHRhcmdldExvY2tGaWxlKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBgVEZfUExVR0lOX0NBQ0hFX0RJUmAgZnJvbSBgZW52YC4gV2l0aG91dCBhIHNlZWRlZCBsb2NrIGZpbGUsIGBpbml0YCByZXNvbHZlc1xuICogcHJvdmlkZXJzIGl0c2VsZjsgYWdhaW5zdCB0ZXJyYWZvcm0gPj0gMS40IHRoYXQgcmUtZG93bmxvYWRzIGludG8gdGhlIHNoYXJlZCBwbHVnaW4gY2FjaGVcbiAqIGV2ZW4gd2hlbiBpdCdzIHdhcm0sIHJhY2luZyBvdGhlciBjb25jdXJyZW50IGBpbml0YHNcbiAqIChodHRwczovL2dpdGh1Yi5jb20vb3Blbi1jb25zdHJ1Y3RzL2Nkay10ZXJyYWluL2lzc3Vlcy80NTIpLiBEcm9wcGluZyB0aGUgY2FjaGUgZGlyIGZyb20gdGhlXG4gKiBlbnZpcm9ubWVudCBtYWtlcyBgaW5pdGAgcmVzb2x2ZSBpbnRvIHRoZSBzdGFjaydzIG93biBgLnRlcnJhZm9ybWAgZGlyZWN0b3J5IGluc3RlYWQsIHNvIGl0XG4gKiBjYW4ndCByYWNlIGFub3RoZXIgd29ya2VyJ3Mgd3JpdGVzIHRvIHRoZSBzaGFyZWQgY2FjaGUuIFRoaXMgZG9lc24ndCBjb3ZlciBhIGBwbHVnaW5fY2FjaGVfZGlyYFxuICogc2V0IGluIHRoZSB1c2VyJ3MgQ0xJIGNvbmZpZyBmaWxlIHJhdGhlciB0aGFuIHRoZSBlbnZpcm9ubWVudCwgYW5kXG4gKiBgd2FybVVwUHJvdmlkZXJMb2NrRmlsZUNhY2hlYCBpcyBzdGlsbCBleHBlY3RlZCB0byBydW4gb25jZSBwZXIgbWFjaGluZSBhdCBhIHRpbWUg4oCUIHR3byB3YXJtLXVwc1xuICogcmFjaW5nIGEgY29sZCBwbHVnaW4gY2FjaGUgd291bGQgaGl0IHRoZSBzYW1lIHJhY2UgdGhpcyB3b3JrcyBhcm91bmQuXG4gKi9cbmZ1bmN0aW9uIHdpdGhvdXRQbHVnaW5DYWNoZShlbnY6IE5vZGVKUy5Qcm9jZXNzRW52KTogTm9kZUpTLlByb2Nlc3NFbnYge1xuICBjb25zdCB7IFRGX1BMVUdJTl9DQUNIRV9ESVI6IF91bnVzZWQsIC4uLnJlc3QgfSA9IGVudjtcbiAgcmV0dXJuIHJlc3Q7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYW5kIGNhY2hlcyBhIGAudGVycmFmb3JtLmxvY2suaGNsYCBmb3IgdGhlIGV4YWN0IHNldCBvZiByZXF1aXJlZCBwcm92aWRlcnMgaW5cbiAqIGB3b3JraW5nRGlyYCwgcnVubmluZyBhIHJlYWwgYGluaXRgIGFnYWluc3QgdGhlIHNoYXJlZCBwbHVnaW4gY2FjaGUuIE9ubHkgZXZlciBjYWxsZWQgZnJvbVxuICogYHdhcm1VcFByb3ZpZGVyTG9ja0ZpbGVDYWNoZWAsIHdoaWNoIHJ1bnMgc2VyaWFsbHkgd2l0aGluIGEgc2luZ2xlIHByb2Nlc3MsIHNvIG5vIGNyb3NzLVxuICogcHJvY2VzcyBsb2NrIGlzIG5lZWRlZDogaXQncyB0aGUgb25seSB3cml0ZXIgdG8gdGhlIGNhY2hlLlxuICpcbiAqIGBpbml0YCBhbHdheXMgcnVucywgZXZlbiB3aGVuIGEgZnJlc2ggY2FjaGVkIGxvY2sgZmlsZSBleGlzdHM6IHRoZSBsb2NrLWZpbGUgY2FjaGUgYW5kXG4gKiBgVEZfUExVR0lOX0NBQ0hFX0RJUmAgaGF2ZSBpbmRlcGVuZGVudCBsaWZldGltZXMsIHNvIGEgZnJlc2ggbG9jayBkb2Vzbid0IGd1YXJhbnRlZSB0aGVcbiAqIHByb3ZpZGVycyBpdCBwaW5zIGFyZSBzdGlsbCBzaXR0aW5nIGluIHRoZSBwbHVnaW4gY2FjaGUuIFNlZWRpbmcgdGhlIGNhY2hlZCBsb2NrIGZpcnN0ICh3aGVuXG4gKiBgd29ya2luZ0RpcmAgZG9lc24ndCBhbHJlYWR5IGhhdmUgb25lIG9mIGl0cyBvd24sIGFuZCB0aGUgY2FjaGUgaGFzbid0IGV4cGlyZWQpIGp1c3QgbGV0c1xuICogdGhhdCBgaW5pdGAgdGFrZSB0aGUgdmVyaWZpZWQtY2hlY2tzdW0gcGF0aCBpbnN0ZWFkIG9mIHJlc29sdmluZyBmcm9tIHNjcmF0Y2guIEEgc3RhbGUgY2FjaGVcbiAqIGlzIGxlZnQgYWxvbmUgc28gYGluaXRgIHJlLXJlc29sdmVzIGl0LCBvdGhlcndpc2UgYSBsb29zZWx5IHBpbm5lZCByZXF1aXJlbWVudCAoZS5nLiBgfj4gNS4wYClcbiAqIHdvdWxkIHN0YXkgcGlubmVkIHRvIHdoYXRldmVyIHZlcnNpb24gdGhpcyBjYWNoZSBlbnRyeSBmaXJzdCByZXNvbHZlZCwgZm9yZXZlci5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUFuZENhY2hlUHJvdmlkZXJMb2NrRmlsZShcbiAgd29ya2luZ0Rpcjogc3RyaW5nLFxuICBiaW5hcnlOYW1lOiBzdHJpbmcsXG4gIGVudjogTm9kZUpTLlByb2Nlc3NFbnYsXG4pOiB2b2lkIHtcbiAgY29uc3QgY2FjaGVEaXIgPSBnZXRQcm92aWRlckxvY2tDYWNoZURpcih3b3JraW5nRGlyLCBiaW5hcnlOYW1lLCBlbnYpO1xuICBpZiAoIWNhY2hlRGlyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0TG9ja0ZpbGUgPSBwYXRoLmpvaW4od29ya2luZ0RpciwgXCIudGVycmFmb3JtLmxvY2suaGNsXCIpO1xuICBjb25zdCBjYWNoZWRMb2NrRmlsZSA9IHBhdGguam9pbihjYWNoZURpciwgXCIudGVycmFmb3JtLmxvY2suaGNsXCIpO1xuICBjb25zdCBoYWRPd25Mb2NrRmlsZSA9IGZzLmV4aXN0c1N5bmModGFyZ2V0TG9ja0ZpbGUpO1xuICBpZiAoIWhhZE93bkxvY2tGaWxlICYmIGlzQ2FjaGVkTG9ja0ZpbGVGcmVzaChjYWNoZWRMb2NrRmlsZSkpIHtcbiAgICB0cnkge1xuICAgICAgZnMuY29weUZpbGVTeW5jKGNhY2hlZExvY2tGaWxlLCB0YXJnZXRMb2NrRmlsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBsb3N0IGEgcmFjZSB0byBhbm90aGVyIHdyaXRlcjsgaW5pdCByZXNvbHZlcyBhIGxvY2sgZmlsZSBmcm9tIHNjcmF0Y2ggYmVsb3dcbiAgICB9XG4gIH1cblxuICBleGVjU3luYyhgJHtiaW5hcnlOYW1lfSBpbml0IC1iYWNrZW5kPWZhbHNlIC1pbnB1dD1mYWxzZWAsIHtcbiAgICBjd2Q6IHdvcmtpbmdEaXIsXG4gICAgZW52LFxuICAgIHN0ZGlvOiBcInBpcGVcIixcbiAgfSk7XG5cbiAgaWYgKGhhZE93bkxvY2tGaWxlKSB7XG4gICAgLy8gb25seSBjYWNoZSBsb2NrIGZpbGVzIHRoaXMgd2FybS11cCBhY3R1YWxseSByZXNvbHZlZCwgbm90IGEgc3RhY2sncyBvd24gcGlubmVkIG9uZVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgZnMubWtkaXJTeW5jKGNhY2hlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBjb25zdCB0bXBMb2NrRmlsZSA9IGAke2NhY2hlZExvY2tGaWxlfS4ke3Byb2Nlc3MucGlkfS50bXBgO1xuICAgIGZzLmNvcHlGaWxlU3luYyh0YXJnZXRMb2NrRmlsZSwgdG1wTG9ja0ZpbGUpO1xuICAgIGZzLnJlbmFtZVN5bmModG1wTG9ja0ZpbGUsIGNhY2hlZExvY2tGaWxlKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gdGhlIGNhY2hlIHdyaXRlLWJhY2sgaXMgYW4gb3B0aW1pemF0aW9uIG9ubHk7IGEgZmFpbHVyZSBoZXJlIG11c3Qgbm90IGZhaWwgdGhlIHdhcm0tdXBcbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gZ2V0TWFuaWZlc3RTdGFja3MoXG4gIHJlY2VpdmVkOiBzdHJpbmcsXG4pOiBbc3RyaW5nLCB7IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZyB9XVtdIHtcbiAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUocmVjZWl2ZWQsIFwibWFuaWZlc3QuanNvblwiKSwgXCJ1dGY4XCIpLFxuICApO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMobWFuaWZlc3Quc3RhY2tzKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhbmQgY2FjaGVzIGEgYC50ZXJyYWZvcm0ubG9jay5oY2xgIGZvciBldmVyeSB1bmlxdWUgcmVxdWlyZWQtcHJvdmlkZXJzIHNldCBhY3Jvc3NcbiAqIHRoZSBnaXZlbiBgZnVsbFN5bnRoYCBvdXRwdXQgZGlyZWN0b3JpZXMsIHVwIGZyb250IGFuZCBzZXJpYWxseS5cbiAqXG4gKiBJbnRlbmRlZCBmb3IgY2FsbGVycyB0aGF0IGtub3cgdGhlIGZ1bGwgc2V0IG9mIHN0YWNrcyB1bmRlciB0ZXN0IGFoZWFkIG9mIHRpbWUg4oCUIGUuZy4gYVxuICogSmVzdC9WaXRlc3QgYGdsb2JhbFNldHVwYCBob29rLCBiZWZvcmUgcGFyYWxsZWwgd29ya2VycyBzdGFydCDigJQgc28gdGhlcmUncyBub3RoaW5nIGxlZnQgZm9yXG4gKiBgdG9CZVZhbGlkVGVycmFmb3JtYC9gdG9QbGFuU3VjY2Vzc2Z1bGx5YCB0byByYWNlIG92ZXJcbiAqIChodHRwczovL2dpdGh1Yi5jb20vb3Blbi1jb25zdHJ1Y3RzL2Nkay10ZXJyYWluL2lzc3Vlcy80NTIpLlxuICpcbiAqIEBwYXJhbSByZWNlaXZlZCBvbmUgb3IgbW9yZSBgZnVsbFN5bnRoYCBvdXRwdXQgZGlyZWN0b3JpZXMgdG8gd2FybSB1cFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FybVVwUHJvdmlkZXJMb2NrRmlsZUNhY2hlKHJlY2VpdmVkOiBzdHJpbmdbXSk6IHZvaWQge1xuICByZWNlaXZlZFxuICAgIC5mbGF0TWFwKChkaXIpID0+XG4gICAgICBnZXRNYW5pZmVzdFN0YWNrcyhkaXIpLm1hcCgoWywgc3RhY2tdKSA9PlxuICAgICAgICBwYXRoLnJlc29sdmUoZGlyLCBzdGFjay53b3JraW5nRGlyZWN0b3J5KSxcbiAgICAgICksXG4gICAgKVxuICAgIC5mb3JFYWNoKCh3b3JraW5nRGlyKSA9PlxuICAgICAgcmVzb2x2ZUFuZENhY2hlUHJvdmlkZXJMb2NrRmlsZShcbiAgICAgICAgd29ya2luZ0RpcixcbiAgICAgICAgdGVycmFmb3JtQmluYXJ5TmFtZSxcbiAgICAgICAgcHJvY2Vzcy5lbnYsXG4gICAgICApLFxuICAgICk7XG59XG5cbi8vIGV4ZWNTeW5jJ3MgZGVmYXVsdCAxIE1pQiBtYXhCdWZmZXIgaXMgZWFzaWx5IGV4Y2VlZGVkIGJ5IGAtanNvbmAgb3V0cHV0IGZvciBhIHBsYW4vdmFsaWRhdGVcbi8vIG9mIG1vcmUgdGhhbiBhIGZldyBkb3plbiByZXNvdXJjZXMuXG5jb25zdCBFWEVDX01BWF9CVUZGRVIgPSAxMDAgKiAxMDI0ICogMTAyNDtcblxuLyoqXG4gKiBDaGVja3MgdGhhdCB0aGUgcmVjZWl2ZWQgc3RhY2sgaXMgdmFsaWQgVGVycmFmb3JtIChgdGVycmFmb3JtIHZhbGlkYXRlYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0JlVmFsaWRUZXJyYWZvcm0ocmVjZWl2ZWQ6IHN0cmluZyk6IEFzc2VydGlvblJldHVybiB7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5zdGF0U3luYyhyZWNlaXZlZCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbWF0Y2hlcnNQYXRoSXNOb3REaXJlY3RvcnkoXCJ0b0JlVmFsaWRUZXJyYWZvcm1cIik7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb25SZXR1cm4oXG4gICAgICBgRXhwZWN0ZWQgc3ViamVjdCB0byBiZSBhIHRlcnJhZm9ybSBkaXJlY3Rvcnk6ICR7ZX1gLFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhY2tzID0gZ2V0TWFuaWZlc3RTdGFja3MocmVjZWl2ZWQpO1xuXG4gICAgc3RhY2tzLmZvckVhY2goKFtuYW1lLCBzdGFja10pID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgIGN3ZDogcGF0aC5yZXNvbHZlKHJlY2VpdmVkLCBzdGFjay53b3JraW5nRGlyZWN0b3J5KSxcbiAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgc3RkaW86IFwicGlwZVwiLFxuICAgICAgICBtYXhCdWZmZXI6IEVYRUNfTUFYX0JVRkZFUixcbiAgICAgIH0gYXMgYW55O1xuICAgICAgY29uc3Qgc2VlZGVkID0gc2VlZEZyb21XYXJtQ2FjaGUob3B0cy5jd2QsIHRlcnJhZm9ybUJpbmFyeU5hbWUsIG9wdHMuZW52KTtcbiAgICAgIGV4ZWNTeW5jKGAke3RlcnJhZm9ybUJpbmFyeU5hbWV9IGluaXQgLWJhY2tlbmQ9ZmFsc2UgLWlucHV0PWZhbHNlYCwge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBlbnY6IHNlZWRlZCA/IG9wdHMuZW52IDogd2l0aG91dFBsdWdpbkNhY2hlKG9wdHMuZW52KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgb3V0ID0gZXhlY1N5bmMoYCR7dGVycmFmb3JtQmluYXJ5TmFtZX0gdmFsaWRhdGUgLWpzb25gLCBvcHRzKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZShvdXQudG9TdHJpbmcoKSk7XG4gICAgICBpZiAoIXJlc3VsdC52YWxpZCkge1xuICAgICAgICB0aHJvdyBtYXRjaGVyc0ZvdW5kRXJyb3JzSW5TdGFjayhcbiAgICAgICAgICByZXN1bHQuZXJyb3JfY291bnQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICByZXN1bHQuZGlhZ25vc3RpY3Muam9pbihcIlxcblwiKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihcbiAgICAgIGBFeHBlY3RlZCBzdWJqZWN0IG5vdCB0byBiZSBhIHZhbGlkIHRlcnJhZm9ybSBzdGFja2AsXG4gICAgICB0cnVlLFxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihcbiAgICAgIHdpdGhQcm9jZXNzT3V0cHV0KGBFeHBlY3RlZCBzdWJqZWN0IHRvIGJlIGEgdmFsaWQgdGVycmFmb3JtIHN0YWNrYCwgZSksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9QbGFuU3VjY2Vzc2Z1bGx5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGBpbml0YC9gcGxhbmAgc2hvdWxkIHVzZSB0aGUgc3RhY2sncyByZWFsIGJhY2tlbmQuIERpc2FibGUgdGhpcyBmb3Igc3RhY2tzIHdob3NlXG4gICAqIGJhY2tlbmQgKGUuZy4gczMsIHJlbW90ZSkgaXMgbm90IHJlYWNoYWJsZSBpbiB0aGUgdGVzdCBlbnZpcm9ubWVudCBhbmQgd2hvc2UgcGxhbiBkb2VzIG5vdFxuICAgKiBkZXBlbmQgb24gZXhpc3Rpbmcgc3RhdGUuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGJhY2tlbmQ/OiBib29sZWFuO1xufVxuXG5jb25zdCBub1JlYWxCYWNrZW5kT3ZlcnJpZGVGaWxlTmFtZSA9XG4gIFwiY2RrdG4tdGVzdGluZy1uby1iYWNrZW5kX292ZXJyaWRlLnRmLmpzb25cIjtcblxuLyoqXG4gKiBgaW5pdCAtYmFja2VuZD1mYWxzZWAgbGVhdmVzIHRoZSBiYWNrZW5kIHVuaW5pdGlhbGl6ZWQsIHdoaWNoIGBwbGFuYCByZWZ1c2VzIHRvIHJ1biBhZ2FpbnN0XG4gKiAoYGZ1bGxTeW50aGAgb3V0cHV0IGFsd2F5cyBoYXMgYSBiYWNrZW5kIGJsb2NrKS4gV3JpdGUgYSBUZXJyYWZvcm0gSlNPTiBvdmVycmlkZSB0aGF0IHN3YXBzXG4gKiBpbiBhIGBsb2NhbGAgYmFja2VuZCBpbnN0ZWFkLCBzbyBgaW5pdGAgY2FuIGluaXRpYWxpemUgZm9yIHJlYWwgd2l0aG91dCBjcmVkZW50aWFscyBvclxuICogbmV0d29yayBhY2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIG92ZXJyaWRlV2l0aExvY2FsQmFja2VuZCh3b3JraW5nRGlyOiBzdHJpbmcpIHtcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICBwYXRoLmpvaW4od29ya2luZ0Rpciwgbm9SZWFsQmFja2VuZE92ZXJyaWRlRmlsZU5hbWUpLFxuICAgIEpTT04uc3RyaW5naWZ5KHsgdGVycmFmb3JtOiB7IGJhY2tlbmQ6IHsgbG9jYWw6IHt9IH0gfSB9KSxcbiAgKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmZ1bmN0aW9uIHJlbW92ZUxvY2FsQmFja2VuZE92ZXJyaWRlKHdvcmtpbmdEaXI6IHN0cmluZykge1xuICBmcy5ybVN5bmMocGF0aC5qb2luKHdvcmtpbmdEaXIsIG5vUmVhbEJhY2tlbmRPdmVycmlkZUZpbGVOYW1lKSwge1xuICAgIGZvcmNlOiB0cnVlLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCB0aGUgcmVjZWl2ZWQgc3RhY2sgcGxhbnMgc3VjY2Vzc2Z1bGx5IChgdGVycmFmb3JtIHBsYW5gKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUGxhblN1Y2Nlc3NmdWxseShcbiAgcmVjZWl2ZWQ6IHN0cmluZyxcbiAgb3B0aW9uczogVG9QbGFuU3VjY2Vzc2Z1bGx5T3B0aW9ucyA9IHt9LFxuKTogQXNzZXJ0aW9uUmV0dXJuIHtcbiAgY29uc3QgeyBiYWNrZW5kID0gdHJ1ZSB9ID0gb3B0aW9ucztcblxuICB0cnkge1xuICAgIGlmICghZnMuc3RhdFN5bmMocmVjZWl2ZWQpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG1hdGNoZXJzUGF0aElzTm90RGlyZWN0b3J5KFwidG9QbGFuU3VjY2Vzc2Z1bGx5XCIpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uUmV0dXJuKFxuICAgICAgYEV4cGVjdGVkIHN1YmplY3QgdG8gYmUgYSB0ZXJyYWZvcm0gZGlyZWN0b3J5OiAke2V9YCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHN0YWNrcyA9IGdldE1hbmlmZXN0U3RhY2tzKHJlY2VpdmVkKTtcblxuICAgIHN0YWNrcy5mb3JFYWNoKChbLCBzdGFja10pID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgIGN3ZDogcGF0aC5yZXNvbHZlKHJlY2VpdmVkLCBzdGFjay53b3JraW5nRGlyZWN0b3J5KSxcbiAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgc3RkaW86IFwicGlwZVwiLFxuICAgICAgICBtYXhCdWZmZXI6IEVYRUNfTUFYX0JVRkZFUixcbiAgICAgIH0gYXMgYW55O1xuXG4gICAgICBpZiAoIWJhY2tlbmQpIHtcbiAgICAgICAgb3ZlcnJpZGVXaXRoTG9jYWxCYWNrZW5kKG9wdHMuY3dkKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VlZGVkID0gc2VlZEZyb21XYXJtQ2FjaGUoXG4gICAgICAgICAgb3B0cy5jd2QsXG4gICAgICAgICAgdGVycmFmb3JtQmluYXJ5TmFtZSxcbiAgICAgICAgICBvcHRzLmVudixcbiAgICAgICAgKTtcbiAgICAgICAgZXhlY1N5bmMoYCR7dGVycmFmb3JtQmluYXJ5TmFtZX0gaW5pdCAtaW5wdXQ9ZmFsc2VgLCB7XG4gICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICBlbnY6IHNlZWRlZCA/IG9wdHMuZW52IDogd2l0aG91dFBsdWdpbkNhY2hlKG9wdHMuZW52KSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gdGhyb3dzIG9uIGEgbm9uLXplcm8gZXhpdCBjb2RlXG4gICAgICAgIGV4ZWNTeW5jKFxuICAgICAgICAgIGAke3RlcnJhZm9ybUJpbmFyeU5hbWV9IHBsYW4gLWlucHV0PWZhbHNlIC1sb2NrPWZhbHNlIC1qc29uYCxcbiAgICAgICAgICBvcHRzLFxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKCFiYWNrZW5kKSB7XG4gICAgICAgICAgcmVtb3ZlTG9jYWxCYWNrZW5kT3ZlcnJpZGUob3B0cy5jd2QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihcbiAgICAgIGBFeHBlY3RlZCBzdWJqZWN0IG5vdCB0byBwbGFuIHN1Y2Nlc3NmdWxseWAsXG4gICAgICB0cnVlLFxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihcbiAgICAgIHdpdGhQcm9jZXNzT3V0cHV0KGBFeHBlY3RlZCBzdWJqZWN0IHRvIHBsYW4gc3VjY2Vzc2Z1bGx5YCwgZSksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
558
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2hlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9tYXRjaGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3Q0Esa0RBT0M7QUFNRCx3RkE2Q0M7QUE0R0QsOEVBZ0JDO0FBTUQsMEVBZ0JDO0FBb0ZELDBFQWdCQztBQTBORCxrRUFlQztBQVNELGdEQWlEQztBQXlDRCxnREFrRUM7O0FBdHVCRCwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLHVDQUF5QjtBQUN6Qix1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLCtDQUFpQztBQUNqQyxpREFBMkQ7QUFDM0Qsa0NBQW9DO0FBQ3BDLG9FQUEwRTtBQUMxRSxzQ0FJbUI7QUFZbkI7O0dBRUc7QUFDSCxNQUFhLGVBQWU7SUFFUjtJQUNBOztJQUZsQixZQUNrQixPQUFlLEVBQ2YsSUFBYTtRQURiLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixTQUFJLEdBQUosSUFBSSxDQUFTO0lBQzVCLENBQUM7O0FBSk4sMENBS0M7QUFJRDs7R0FFRztBQUNILFNBQWdCLG1CQUFtQixDQUNqQyxRQUF5QjtJQUV6QixPQUFPO1FBQ0wsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPO1FBQy9CLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtLQUNwQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLHNDQUFzQyxDQUNwRCxRQUFpQixFQUNqQixRQUFpQjtJQUVqQixRQUFRLE9BQU8sUUFBUSxFQUFFLENBQUM7UUFDeEIsS0FBSyxRQUFRO1lBQ1gsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sQ0FDTCxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztvQkFDdkIsUUFBUSxDQUFDLE1BQU0sS0FBSyxRQUFR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QUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2lCQUN0RCxDQUFDLENBQUM7Z0JBRUgsaUNBQWlDO2dCQUNqQyxJQUFBLHdCQUFRLEVBQ04sR0FBRyxtQkFBbUIsc0NBQXNDLEVBQzVELElBQUksQ0FDTCxDQUFDO1lBQ0osQ0FBQztvQkFBUyxDQUFDO2dCQUNULElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDYiwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksZUFBZSxDQUN4QiwyQ0FBMkMsRUFDM0MsSUFBSSxDQUNMLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sSUFBSSxlQUFlLENBQ3hCLGlCQUFpQixDQUFDLHVDQUF1QyxFQUFFLENBQUMsQ0FBQyxFQUM3RCxLQUFLLENBQ04sQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHsgZXhlY1N5bmMsIFNwYXduU3luY1JldHVybnMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgc25ha2VDYXNlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbmltcG9ydCB7IGluZmVyVGVycmFmb3JtQmluYXJ5TmFtZSB9IGZyb20gXCIuLi92YWxpZGF0aW9ucy90YXJnZXQtdmVyc2lvbnNcIjtcbmltcG9ydCB7XG4gIGludmFsaWRTdGFjayxcbiAgbWF0Y2hlcnNGb3VuZEVycm9yc0luU3RhY2ssXG4gIG1hdGNoZXJzUGF0aElzTm90RGlyZWN0b3J5LFxufSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVycmFmb3JtQ29uc3RydWN0b3Ige1xuICByZWFkb25seSB0ZlJlc291cmNlVHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBTeW50aGVzaXplZFN0YWNrID0ge1xuICByZXNvdXJjZTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgcHJvdmlkZXI6IFJlY29yZDxzdHJpbmcsIGFueT47XG59O1xuXG4vKipcbiAqIFRoZSByZXN1bHQgb2YgYSB0ZXN0aW5nIG1hdGNoZXIgYXNzZXJ0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQXNzZXJ0aW9uUmV0dXJuIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGFzczogYm9vbGVhbixcbiAgKSB7fVxufVxuXG5leHBvcnQgdHlwZSBNYXRjaGVyUmV0dXJuSmVzdCA9IHsgbWVzc2FnZTogKCkgPT4gc3RyaW5nOyBwYXNzOiBib29sZWFuIH07XG5cbi8qKlxuICogQWRhcHRzIGFuIHtAbGluayBBc3NlcnRpb25SZXR1cm59IHRvIEplc3QncyBgeyBtZXNzYWdlLCBwYXNzIH1gIG1hdGNoZXIgc2hhcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXR1cm5NYXRjaGVyVG9KZXN0KFxuICB0b1JldHVybjogQXNzZXJ0aW9uUmV0dXJuLFxuKTogTWF0Y2hlclJldHVybkplc3Qge1xuICByZXR1cm4ge1xuICAgIG1lc3NhZ2U6ICgpID0+IHRvUmV0dXJuLm1lc3NhZ2UsXG4gICAgcGFzczogdG9SZXR1cm4ucGFzcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWVwLWVxdWFscyBgZXhwZWN0ZWRgIGFnYWluc3QgYHJlY2VpdmVkYCwgaWdub3JpbmcgZXh0cmEgcHJvcGVydGllcyBvbiBgcmVjZWl2ZWRgIGFuZFxuICogbWF0Y2hpbmcgZWFjaCBrZXkgaW4gZWl0aGVyIGNhbWVsQ2FzZSBvciBzbmFrZV9jYXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXN5bWV0cmljRGVlcEVxdWFsSWdub3JpbmdPYmplY3RDYXNpbmcoXG4gIGV4cGVjdGVkOiB1bmtub3duLFxuICByZWNlaXZlZDogdW5rbm93bixcbik6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKHR5cGVvZiBleHBlY3RlZCkge1xuICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdGVkKSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIEFycmF5LmlzQXJyYXkocmVjZWl2ZWQpICYmXG4gICAgICAgICAgZXhwZWN0ZWQubGVuZ3RoID09PSByZWNlaXZlZC5sZW5ndGggJiZcbiAgICAgICAgICBleHBlY3RlZC5ldmVyeSgoaXRlbSwgaW5kZXgpID0+XG4gICAgICAgICAgICBhc3ltZXRyaWNEZWVwRXF1YWxJZ25vcmluZ09iamVjdENhc2luZyhpdGVtLCByZWNlaXZlZFtpbmRleF0pLFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChleHBlY3RlZCA9PT0gbnVsbCAmJiByZWNlaXZlZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChleHBlY3RlZCA9PT0gdW5kZWZpbmVkICYmIHJlY2VpdmVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZXhwZWN0ZWQgPT09IG51bGwgfHwgcmVjZWl2ZWQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoZXhwZWN0ZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmV2ZXJ5KChrZXkpID0+IHtcbiAgICAgICAgaWYgKChyZWNlaXZlZCBhcyBhbnkpW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBhc3ltZXRyaWNEZWVwRXF1YWxJZ25vcmluZ09iamVjdENhc2luZyhcbiAgICAgICAgICAgIChleHBlY3RlZCBhcyBhbnkpW2tleV0sXG4gICAgICAgICAgICAocmVjZWl2ZWQgYXMgYW55KVtrZXldLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHJlY2VpdmVkIGFzIGFueSlbc25ha2VDYXNlKGtleSldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gYXN5bWV0cmljRGVlcEVxdWFsSWdub3JpbmdPYmplY3RDYXNpbmcoXG4gICAgICAgICAgICAoZXhwZWN0ZWQgYXMgYW55KVtrZXldLFxuICAgICAgICAgICAgKHJlY2VpdmVkIGFzIGFueSlbc25ha2VDYXNlKGtleSldLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGV4cGVjdGVkID09PSByZWNlaXZlZDtcbiAgfVxufVxuY29uc3QgZGVmYXVsdFBhc3NFdmFsdWF0aW9uID0gKFxuICBpdGVtczogYW55LFxuICBhc3NlcnRlZFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4pID0+IHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoaXRlbXMpLnNvbWUoKGl0ZW06IGFueSkgPT5cbiAgICBhc3ltZXRyaWNEZWVwRXF1YWxJZ25vcmluZ09iamVjdENhc2luZyhhc3NlcnRlZFByb3BlcnRpZXMsIGl0ZW0pLFxuICApO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGdpdmVuIHZhbHVlIGlzIGFuIGFzeW1tZXRyaWMgbWF0Y2hlciAoaGFzIGFuIGBhc3ltbWV0cmljTWF0Y2hgIHByb3BlcnR5KVxuICogQHBhcmFtIG9iaiBWYWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyBCb29sZWFuXG4gKi9cbmZ1bmN0aW9uIGlzQXN5bW1ldHJpYyhvYmo6IGFueSkge1xuICByZXR1cm4gISFvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiBcImFzeW1tZXRyaWNNYXRjaFwiIGluIG9iajtcbn1cbi8qKlxuICogSlNPTi5zdHJpbmdpZnkgcmVwbGFjZXIgdGhhdCByZW5kZXJzIGplc3QgYXN5bW1ldHJpYyBtYXRjaGVycyAoZXhwZWN0LmFueXRoaW5nKCksIGV0Yy4pIGFzIFwiZXhwZWN0LkFueXRoaW5nKClcIiBpblxuICogbWVzc2FnZXMsIGluc3RlYWQgb2YgdGhlaXIgaW50ZXJuYWwgb2JqZWN0IHJlcHJlc2VudGF0aW9uXG4gKiBAcGFyYW0gX2tleSBLZXkgb2YgdGhlIHZhbHVlIGJlaW5nIHN0cmluZ2lmaWVkXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgYmVpbmcgc3RyaW5naWZpZWRcbiAqIEByZXR1cm5zIFRoZSBtYXRjaGVyJ3Mgc3RyaW5nIGZvcm0sIG9yIHRoZSB2YWx1ZSB1bmNoYW5nZWRcbiAqL1xuZnVuY3Rpb24gamVzdEFzeW1ldHJpY01hdGNoZXJTdHJpbmdpZnlSZXBsYWNlcihfa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIGlzQXN5bW1ldHJpYyh2YWx1ZSkgPyBgZXhwZWN0LiR7dmFsdWUudG9TdHJpbmcoKX1gIDogdmFsdWU7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gYXNzZXJ0aW9uIHRoYXQgY2hlY2tzIHdoZXRoZXIgYSBzeW50aGVzaXplZCBzdGFjayBjb250YWlucyBhbiBlbGVtZW50IG9mIGEgZ2l2ZW4gdHlwZSB3aXRoIHRoZSBnaXZlblxuICogcHJvcGVydGllc1xuICogQHBhcmFtIGZ1bmN0aW9uTmFtZSBOYW1lIG9mIHRoZSBjYWxsaW5nIG1hdGNoZXIsIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXNcbiAqIEBwYXJhbSBjdXN0b21QYXNzRXZhbHVhdGlvbiBEZWNpZGVzIHdoZXRoZXIgYW55IG9mIHRoZSBmb3VuZCBlbGVtZW50cyBtYXRjaGVzIHRoZSBhc3NlcnRlZCBwcm9wZXJ0aWVzOyBkZWZhdWx0cyB0b1xuICogYSBwYXJ0aWFsIGRlZXAgZXF1YWxpdHkgdGhhdCBtYXRjaGVzIGtleXMgaW4gZWl0aGVyIGNhbWVsQ2FzZSBvciBzbmFrZV9jYXNlXG4gKiBAcmV0dXJucyBUaGUgYXNzZXJ0aW9uIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldEFzc2VydEVsZW1lbnRXaXRoUHJvcGVydGllcyhcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmcsXG4gIC8vIENvbmZpZ3VyYWJsZSBzbyBlYWNoIGFkYXB0ZXIgKEplc3QsIFZpdGVzdCwgLi4uKSBjYW4gdXNlIGl0cyBvd24gbWF0Y2hlciBzZW1hbnRpY3MuXG4gIGN1c3RvbVBhc3NFdmFsdWF0aW9uPzogKFxuICAgIGl0ZW1zOiBhbnlbXSxcbiAgICBhc3NlcnRlZFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICkgPT4gYm9vbGVhbixcbikge1xuICBjb25zdCBwYXNzRXZhbHVhdGlvbiA9IGN1c3RvbVBhc3NFdmFsdWF0aW9uIHx8IGRlZmF1bHRQYXNzRXZhbHVhdGlvbjtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldEFzc2VydEVsZW1lbnRXaXRoUHJvcGVydGllcyhcbiAgICB0eXBlOiBrZXlvZiBTeW50aGVzaXplZFN0YWNrLFxuICAgIHJlY2VpdmVkOiBzdHJpbmcsXG4gICAgaXRlbVR5cGU6IFRlcnJhZm9ybUNvbnN0cnVjdG9yLFxuICAgIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgKTogQXNzZXJ0aW9uUmV0dXJuIHtcbiAgICBsZXQgc3RhY2s6IFN5bnRoZXNpemVkU3RhY2s7XG5cbiAgICAvLyByZWNlaXZlZCBtYXkgYmUgYSBKU09OIHN0cmluZyBvciBhIHBhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgb25lXG4gICAgY29uc3Qgc3RhY2tDb250ZW50ID0gZnMuZXhpc3RzU3luYyhyZWNlaXZlZClcbiAgICAgID8gZnMucmVhZEZpbGVTeW5jKHJlY2VpdmVkLCBcInV0ZjhcIilcbiAgICAgIDogcmVjZWl2ZWQ7XG5cbiAgICB0cnkge1xuICAgICAgc3RhY2sgPSBKU09OLnBhcnNlKHN0YWNrQ29udGVudCkgYXMgU3ludGhlc2l6ZWRTdGFjaztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBpbnZhbGlkU3RhY2soZnVuY3Rpb25OYW1lLCBzdGFja0NvbnRlbnQpO1xuICAgIH1cblxuICAgIC8vIGZpbmQgZXZlcnkgaXRlbSBvZiBpdGVtVHlwZS50ZlJlc291cmNlVHlwZSB1bmRlciBzdGFja1t0eXBlXSwga2V5ZWQgYnkgbmFtZVxuICAgIGNvbnN0IGl0ZW1zID1cbiAgICAgIE9iamVjdC52YWx1ZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHN0YWNrW3R5cGVdIHx8IHt9KS5maW5kKFxuICAgICAgICAgIChbdHlwZSwgX3ZhbHVlc10pID0+IHR5cGUgPT09IGl0ZW1UeXBlLnRmUmVzb3VyY2VUeXBlLFxuICAgICAgICApPy5bMV0gfHwge30sXG4gICAgICApIHx8IFtdO1xuICAgIGNvbnN0IHBhc3MgPSBwYXNzRXZhbHVhdGlvbihpdGVtcywgcHJvcGVydGllcyk7XG4gICAgaWYgKHBhc3MpIHtcbiAgICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uUmV0dXJuKFxuICAgICAgICBgRXhwZWN0ZWQgbm8gJHtcbiAgICAgICAgICBpdGVtVHlwZS50ZlJlc291cmNlVHlwZVxuICAgICAgICB9IHdpdGggcHJvcGVydGllcyAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgamVzdEFzeW1ldHJpY01hdGNoZXJTdHJpbmdpZnlSZXBsYWNlcixcbiAgICAgICAgKX0gdG8gYmUgcHJlc2VudCBpbiBzeW50aGVzaXplZCBzdGFjay5cbkZvdW5kICR7aXRlbXMubGVuZ3RoID09PSAwID8gXCJub1wiIDogaXRlbXMubGVuZ3RofSAke1xuICAgICAgICAgIGl0ZW1UeXBlLnRmUmVzb3VyY2VUeXBlXG4gICAgICAgIH0gcmVzb3VyY2VzIGluc3RlYWQke1xuICAgICAgICAgIGl0ZW1zLmxlbmd0aCA+IDAgPyBcIjpcXG5cIiArIEpTT04uc3RyaW5naWZ5KGl0ZW1zLCBudWxsLCAyKSA6IFwiXCJcbiAgICAgICAgfWAsXG4gICAgICAgIHBhc3MsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihcbiAgICAgICAgYEV4cGVjdGVkICR7aXRlbVR5cGUudGZSZXNvdXJjZVR5cGV9IHdpdGggcHJvcGVydGllcyAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgamVzdEFzeW1ldHJpY01hdGNoZXJTdHJpbmdpZnlSZXBsYWNlcixcbiAgICAgICAgKX0gdG8gYmUgcHJlc2VudCBpbiBzeW50aGVzaXplZCBzdGFjay5cbkZvdW5kICR7aXRlbXMubGVuZ3RoID09PSAwID8gXCJub1wiIDogaXRlbXMubGVuZ3RofSAke1xuICAgICAgICAgIGl0ZW1UeXBlLnRmUmVzb3VyY2VUeXBlXG4gICAgICAgIH0gcmVzb3VyY2VzIGluc3RlYWQke1xuICAgICAgICAgIGl0ZW1zLmxlbmd0aCA+IDAgPyBcIjpcXG5cIiArIEpTT04uc3RyaW5naWZ5KGl0ZW1zLCBudWxsLCAyKSA6IFwiXCJcbiAgICAgICAgfWAsXG4gICAgICAgIHBhc3MsXG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgYHRvSGF2ZURhdGFTb3VyY2VXaXRoUHJvcGVydGllc2AgbWF0Y2hlciB1c2luZyBgY3VzdG9tUGFzc0V2YWx1YXRpb25gIHRvIGRlY2lkZSBhXG4gKiBtYXRjaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRvSGF2ZURhdGFTb3VyY2VXaXRoUHJvcGVydGllcyhcbiAgY3VzdG9tUGFzc0V2YWx1YXRpb24/OiAoXG4gICAgaXRlbXM6IGFueSxcbiAgICBhc3NlcnRlZFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICkgPT4gYm9vbGVhbixcbikge1xuICByZXR1cm4gZnVuY3Rpb24gdG9IYXZlRGF0YVNvdXJjZVdpdGhQcm9wZXJ0aWVzKFxuICAgIHJlY2VpdmVkOiBzdHJpbmcsXG4gICAgcmVzb3VyY2VUeXBlOiBUZXJyYWZvcm1Db25zdHJ1Y3RvcixcbiAgICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICk6IEFzc2VydGlvblJldHVybiB7XG4gICAgcmV0dXJuIGdldEFzc2VydEVsZW1lbnRXaXRoUHJvcGVydGllcyhcbiAgICAgIFwidG9IYXZlRGF0YVNvdXJjZVdpdGhQcm9wZXJ0aWVzXCIsXG4gICAgICBjdXN0b21QYXNzRXZhbHVhdGlvbixcbiAgICApKFwiZGF0YVwiLCByZWNlaXZlZCwgcmVzb3VyY2VUeXBlLCBwcm9wZXJ0aWVzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgYHRvSGF2ZVJlc291cmNlV2l0aFByb3BlcnRpZXNgIG1hdGNoZXIgdXNpbmcgYGN1c3RvbVBhc3NFdmFsdWF0aW9uYCB0byBkZWNpZGUgYVxuICogbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb0hhdmVSZXNvdXJjZVdpdGhQcm9wZXJ0aWVzKFxuICBjdXN0b21QYXNzRXZhbHVhdGlvbj86IChcbiAgICBpdGVtczogYW55LFxuICAgIGFzc2VydGVkUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgKSA9PiBib29sZWFuLFxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0b0hhdmVSZXNvdXJjZVdpdGhQcm9wZXJ0aWVzKFxuICAgIHJlY2VpdmVkOiBzdHJpbmcsXG4gICAgcmVzb3VyY2VUeXBlOiBUZXJyYWZvcm1Db25zdHJ1Y3RvcixcbiAgICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICk6IEFzc2VydGlvblJldHVybiB7XG4gICAgcmV0dXJuIGdldEFzc2VydEVsZW1lbnRXaXRoUHJvcGVydGllcyhcbiAgICAgIFwidG9IYXZlUmVzb3VyY2VXaXRoUHJvcGVydGllc1wiLFxuICAgICAgY3VzdG9tUGFzc0V2YWx1YXRpb24sXG4gICAgKShcInJlc291cmNlXCIsIHJlY2VpdmVkLCByZXNvdXJjZVR5cGUsIHByb3BlcnRpZXMpO1xuICB9O1xufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciBgZXJyYCBjYXJyaWVzIGBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jYC9gc3Bhd25TeW5jYCBvdXRwdXQgYnVmZmVycy5cbiAqL1xuY29uc3QgaXNFeGVjU3Bhd25FcnJvciA9IChlcnI6IGFueSk6IGVyciBpcyBFcnJvciAmIFNwYXduU3luY1JldHVybnM8YW55PiA9PlxuICBcIm91dHB1dFwiIGluIGVyciAmJlxuICBBcnJheS5pc0FycmF5KGVyci5vdXRwdXQpICYmXG4gIGVyci5vdXRwdXQuc29tZSgoYnVmOiBhbnkpID0+IEJ1ZmZlci5pc0J1ZmZlcihidWYpKTtcblxuLyoqXG4gKiBSZW5kZXJzIHRlcnJhZm9ybSBkaWFnbm9zdGljIGVudHJpZXMgYXMgaHVtYW4tcmVhZGFibGUgdGV4dC5cbiAqL1xuY29uc3QgZm9ybWF0RGlhZ25vc3RpY3MgPSAoZGlhZ25vc3RpY3M6IGFueVtdKTogc3RyaW5nID0+XG4gIGRpYWdub3N0aWNzXG4gICAgLmZpbHRlcigoZCkgPT4gZD8uc2V2ZXJpdHkgJiYgZD8uc3VtbWFyeSlcbiAgICAubWFwKFxuICAgICAgKHsgc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCB9KSA9PlxuICAgICAgICBgJHtzZXZlcml0eX06ICR7c3VtbWFyeX0ke2RldGFpbCA/IGBcXG4ke2RldGFpbH1gIDogXCJcIn1gLFxuICAgIClcbiAgICAuam9pbihcIlxcblwiKTtcblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBkaWFnbm9zdGljcyBmb3VuZCBpbiB0aGUgb3V0cHV0IG9mIGEgYHRlcnJhZm9ybSA8Y21kPiAtanNvbmAgaW52b2NhdGlvbiBhc1xuICogaHVtYW4tcmVhZGFibGUgdGV4dC4gSGFuZGxlcyBib3RoIGBwbGFuYCdzIG5ld2xpbmUtZGVsaW1pdGVkIEpTT04gc3RyZWFtIChvbmUgYGRpYWdub3N0aWNgXG4gKiBlbnRyeSBwZXIgbGluZSkgYW5kIGB2YWxpZGF0ZWAncyBzaW5nbGUgcHJldHR5LXByaW50ZWQgb2JqZWN0IChhIHRvcC1sZXZlbCBgZGlhZ25vc3RpY3NgXG4gKiBhcnJheSkuXG4gKi9cbmNvbnN0IHJlbmRlckpzb25EaWFnbm9zdGljcyA9IChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShvdXRwdXQpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcnNlZD8uZGlhZ25vc3RpY3MpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RGlhZ25vc3RpY3MocGFyc2VkLmRpYWdub3N0aWNzKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIG5vdCBhIHNpbmdsZSBKU09OIG9iamVjdDsgZmFsbCB0aHJvdWdoIHRvIHRoZSBuZXdsaW5lLWRlbGltaXRlZCBmb3JtYXRcbiAgfVxuXG4gIGNvbnN0IGRpYWdub3N0aWNzID0gb3V0cHV0XG4gICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobGluZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KVxuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeT8udHlwZSA9PT0gXCJkaWFnbm9zdGljXCIgJiYgZW50cnkuZGlhZ25vc3RpYylcbiAgICAubWFwKChlbnRyeSkgPT4gZW50cnkuZGlhZ25vc3RpYyk7XG5cbiAgcmV0dXJuIGZvcm1hdERpYWdub3N0aWNzKGRpYWdub3N0aWNzKTtcbn07XG5cbi8qKlxuICogQXBwZW5kcyBhIGZhaWxlZCBwcm9jZXNzJ3Mgb3V0cHV0IHRvIGFuIGFzc2VydGlvbiBtZXNzYWdlLCBwcmVmZXJyaW5nIHJlbmRlcmVkIGAtanNvbmBcbiAqIGRpYWdub3N0aWNzIG92ZXIgdGhlIHJhdyBvdXRwdXQgd2hlbiBhdmFpbGFibGUuXG4gKi9cbmNvbnN0IHdpdGhQcm9jZXNzT3V0cHV0ID0gKG1lc3NhZ2U6IHN0cmluZywgZXJyOiB1bmtub3duKSA9PiB7XG4gIGlmICghaXNFeGVjU3Bhd25FcnJvcihlcnIpKSB7XG4gICAgcmV0dXJuIGAke21lc3NhZ2V9OiAke2Vycn0uYDtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dCA9XG4gICAgZXJyLm91dHB1dFxuICAgICAgPy5tYXAoKGJ1ZmZlcjogQnVmZmVyKSA9PiBidWZmZXI/LnRvU3RyaW5nKFwidXRmOFwiKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKFwiXFxuXCIpID8/IFwiXCI7XG5cbiAgLy8gRGlhZ25vc3RpY3MgYXJlIHBhcnNlZCBmcm9tIHN0ZG91dCBhbG9uZTogY29uY2F0ZW5hdGluZyBzdGRlcnIgKGUuZy4gYSBDTEktY29uZmlnIGVycm9yKVxuICAvLyBpbnRvIHRoZSBtaXggd291bGQgYnJlYWsgdGhlIHNpbmdsZS1vYmplY3QgcGFyc2UgYC1qc29uYCBvdXRwdXQgcmVsaWVzIG9uLlxuICBjb25zdCBkaWFnbm9zdGljcyA9IHJlbmRlckpzb25EaWFnbm9zdGljcyhlcnIuc3Rkb3V0Py50b1N0cmluZyhcInV0ZjhcIikgPz8gXCJcIik7XG4gIGNvbnN0IGFwcGVuZGl4ID0gZGlhZ25vc3RpY3MubGVuZ3RoXG4gICAgPyBgLiBEaWFnbm9zdGljczogJHtkaWFnbm9zdGljc31gXG4gICAgOiBvdXRwdXQubGVuZ3RoXG4gICAgICA/IGAuIE91dHB1dDogJHtvdXRwdXR9YFxuICAgICAgOiBcIlwiO1xuXG4gIHJldHVybiBgJHttZXNzYWdlfTogJHtlcnJ9JHthcHBlbmRpeH0uYDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGB0b0hhdmVQcm92aWRlcldpdGhQcm9wZXJ0aWVzYCBtYXRjaGVyIHVzaW5nIGBjdXN0b21QYXNzRXZhbHVhdGlvbmAgdG8gZGVjaWRlIGFcbiAqIG1hdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9IYXZlUHJvdmlkZXJXaXRoUHJvcGVydGllcyhcbiAgY3VzdG9tUGFzc0V2YWx1YXRpb24/OiAoXG4gICAgaXRlbXM6IGFueSxcbiAgICBhc3NlcnRlZFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICkgPT4gYm9vbGVhbixcbikge1xuICByZXR1cm4gZnVuY3Rpb24gdG9IYXZlUHJvdmlkZXJXaXRoUHJvcGVydGllcyhcbiAgICByZWNlaXZlZDogc3RyaW5nLFxuICAgIHJlc291cmNlVHlwZTogVGVycmFmb3JtQ29uc3RydWN0b3IsXG4gICAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICApOiBBc3NlcnRpb25SZXR1cm4ge1xuICAgIHJldHVybiBnZXRBc3NlcnRFbGVtZW50V2l0aFByb3BlcnRpZXMoXG4gICAgICBcInRvSGF2ZVByb3ZpZGVyV2l0aFByb3BlcnRpZXNcIixcbiAgICAgIGN1c3RvbVBhc3NFdmFsdWF0aW9uLFxuICAgICkoXCJwcm92aWRlclwiLCByZWNlaXZlZCwgcmVzb3VyY2VUeXBlLCBwcm9wZXJ0aWVzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcm9vdCBkaXJlY3RvcnkgdGhlIHByb3ZpZGVyIGxvY2stZmlsZSBjYWNoZSBpcyB3cml0dGVuIHVuZGVyLiBPdmVycmlkYWJsZSB2aWFcbiAqIGBDREtUTl9URVNUSU5HX0xPQ0tGSUxFX0NBQ0hFX0RJUmAgc28gdGVzdHMgY2FuIGFzc2VydCBvbiB3aGF0IGdldHMgd3JpdHRlbiB0byBpdCBpbnN0ZWFkIG9mXG4gKiBzaGFyaW5nIHRoZSByZWFsIG1hY2hpbmUtZ2xvYmFsIGNhY2hlLCBhbmQgc28gQ0kgY2FuIHBvaW50IGl0IGF0IGEgZGlyZWN0b3J5IHBlcnNpc3RlZFxuICogYmV0d2VlbiBqb2JzLlxuICovXG5mdW5jdGlvbiBnZXRQcm92aWRlckxvY2tGaWxlQ2FjaGVSb290KCk6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuQ0RLVE5fVEVTVElOR19MT0NLRklMRV9DQUNIRV9ESVIgPz9cbiAgICBwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwiY2RrdG4tdGVzdGluZy1wcm92aWRlci1sb2NrZmlsZXNcIilcbiAgKTtcbn1cblxuLy8gQSBsb29zZWx5IHBpbm5lZCByZXF1aXJlbWVudCAoZS5nLiBcIn4+IDUuMFwiKSBzaG91bGRuJ3Qgc3RheSBwaW5uZWQgdG8gd2hpY2hldmVyIHZlcnNpb24gYVxuLy8gbWFjaGluZSBmaXJzdCByZXNvbHZlZCBmb3JldmVyLCBzbyB0aGUgY2FjaGUgZXhwaXJlcy5cbmNvbnN0IENBQ0hFX1RUTF9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IGJpbmFyeVZlcnNpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgbGluZSBvZiBgPGJpbmFyeT4gdmVyc2lvbmAgb3V0cHV0LCBtZW1vaXNlZCBwZXIgYmluYXJ5XG4gKiBAcGFyYW0gYmluYXJ5TmFtZSBUZXJyYWZvcm0tY29tcGF0aWJsZSBiaW5hcnkgdG8gcXVlcnlcbiAqIEBwYXJhbSBlbnYgRW52aXJvbm1lbnQgdG8gcnVuIHRoZSBiaW5hcnkgd2l0aFxuICogQHJldHVybnMgVGhlIHZlcnNpb24gbGluZSwgb3IgXCJ1bmtub3duXCIgaWYgdGhlIGNvbW1hbmQgZmFpbHNcbiAqL1xuZnVuY3Rpb24gZ2V0QmluYXJ5VmVyc2lvbihiaW5hcnlOYW1lOiBzdHJpbmcsIGVudjogTm9kZUpTLlByb2Nlc3NFbnYpOiBzdHJpbmcge1xuICBjb25zdCBjYWNoZWQgPSBiaW5hcnlWZXJzaW9uQ2FjaGUuZ2V0KGJpbmFyeU5hbWUpO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuXG4gIGxldCB2ZXJzaW9uID0gXCJ1bmtub3duXCI7XG4gIHRyeSB7XG4gICAgdmVyc2lvbiA9IGV4ZWNTeW5jKGAke2JpbmFyeU5hbWV9IHZlcnNpb25gLCB7IGVudiwgc3RkaW86IFwicGlwZVwiIH0pXG4gICAgICAudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgICAuc3BsaXQoXCJcXG5cIilbMF07XG4gIH0gY2F0Y2gge1xuICAgIC8vIG9ubHkgYWZmZWN0cyBjYWNoZSBwYXJ0aXRpb25pbmcsIHNvIFwidW5rbm93blwiIGlzIGFuIGFjY2VwdGFibGUgZmFsbGJhY2tcbiAgfVxuXG4gIGJpbmFyeVZlcnNpb25DYWNoZS5zZXQoYmluYXJ5TmFtZSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxvY2stZmlsZSBjYWNoZSBkaXJlY3RvcnkgZm9yIGEgc3RhY2ssIGtleWVkIGJ5IGJpbmFyeSBuYW1lLCBiaW5hcnkgdmVyc2lvbiBhbmQgdGhlIHN0YWNrJ3NcbiAqIGByZXF1aXJlZF9wcm92aWRlcnNgXG4gKiBAcGFyYW0gd29ya2luZ0RpciBTdGFjayB3b3JraW5nIGRpcmVjdG9yeSBjb250YWluaW5nIGNkay50Zi5qc29uXG4gKiBAcGFyYW0gYmluYXJ5TmFtZSBUZXJyYWZvcm0tY29tcGF0aWJsZSBiaW5hcnkgaW4gdXNlXG4gKiBAcGFyYW0gZW52IEVudmlyb25tZW50IHRvIHJ1biB0aGUgYmluYXJ5IHdpdGhcbiAqIEByZXR1cm5zIFRoZSBjYWNoZSBkaXJlY3RvcnksIG9yIHVuZGVmaW5lZCBpZiBjZGsudGYuanNvbiBjYW4ndCBiZSByZWFkXG4gKi9cbmZ1bmN0aW9uIGdldFByb3ZpZGVyTG9ja0NhY2hlRGlyKFxuICB3b3JraW5nRGlyOiBzdHJpbmcsXG4gIGJpbmFyeU5hbWU6IHN0cmluZyxcbiAgZW52OiBOb2RlSlMuUHJvY2Vzc0Vudixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShcbiAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya2luZ0RpciwgXCJjZGsudGYuanNvblwiKSwgXCJ1dGY4XCIpLFxuICAgICk7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBjcnlwdG9cbiAgICAgIC5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAudXBkYXRlKGJpbmFyeU5hbWUpXG4gICAgICAudXBkYXRlKGdldEJpbmFyeVZlcnNpb24oYmluYXJ5TmFtZSwgZW52KSlcbiAgICAgIC51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY29uZmlnPy50ZXJyYWZvcm0/LnJlcXVpcmVkX3Byb3ZpZGVycyA/PyB7fSkpXG4gICAgICAuZGlnZXN0KFwiaGV4XCIpO1xuICAgIHJldHVybiBwYXRoLmpvaW4oZ2V0UHJvdmlkZXJMb2NrRmlsZUNhY2hlUm9vdCgpLCBjYWNoZUtleSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGEgY2FjaGVkIGxvY2sgZmlsZSBleGlzdHMgYW5kIHdhcyB3cml0dGVuIHdpdGhpbiB0aGUgY2FjaGUgVFRMXG4gKiBAcGFyYW0gY2FjaGVkTG9ja0ZpbGUgUGF0aCB0byB0aGUgY2FjaGVkIGxvY2sgZmlsZVxuICogQHJldHVybnMgQm9vbGVhblxuICovXG5mdW5jdGlvbiBpc0NhY2hlZExvY2tGaWxlRnJlc2goY2FjaGVkTG9ja0ZpbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBEYXRlLm5vdygpIC0gZnMuc3RhdFN5bmMoY2FjaGVkTG9ja0ZpbGUpLm10aW1lTXMgPCBDQUNIRV9UVExfTVM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENvcGllcyBhIGNhY2hlZCBgLnRlcnJhZm9ybS5sb2NrLmhjbGAgaW50byBgd29ya2luZ0RpcmAgaWYgYHdhcm1VcFByb3ZpZGVyTG9ja0ZpbGVDYWNoZWAgaGFzXG4gKiBhbHJlYWR5IHJlc29sdmVkIG9uZSBmb3IgaXRzIGV4YWN0IHNldCBvZiByZXF1aXJlZCBwcm92aWRlcnMsIGFuZCBpdCBoYXNuJ3QgZXhwaXJlZC4gTmV2ZXJcbiAqIHJ1bnMgYGluaXRgIGl0c2VsZi4gQSBgd29ya2luZ0RpcmAgdGhhdCBhbHJlYWR5IGhhcyBpdHMgb3duIGxvY2sgZmlsZSBpcyBsZWZ0IHVudG91Y2hlZCDigJRcbiAqIHJlYWwgc3RhY2sgZGlyZWN0b3JpZXMga2VlcCBhIHBpbm5lZCBvbmUgKGBjbGktY29yZWAgcmVhZHMgaXQgZnJvbSB0aGVyZSksIGFuZCBvdmVyd3JpdGluZyBpdFxuICogd2l0aCB0aGUgY2FjaGVkIG9uZSB3b3VsZCBzaWxlbnRseSBzd2FwIGl0cyB2ZXJzaW9ucy5cbiAqXG4gKiBAcmV0dXJucyB3aGV0aGVyIGEgbG9jayBmaWxlIHdhcyBzZWVkZWQuXG4gKi9cbmZ1bmN0aW9uIHNlZWRGcm9tV2FybUNhY2hlKFxuICB3b3JraW5nRGlyOiBzdHJpbmcsXG4gIGJpbmFyeU5hbWU6IHN0cmluZyxcbiAgZW52OiBOb2RlSlMuUHJvY2Vzc0Vudixcbik6IGJvb2xlYW4ge1xuICBjb25zdCB0YXJnZXRMb2NrRmlsZSA9IHBhdGguam9pbih3b3JraW5nRGlyLCBcIi50ZXJyYWZvcm0ubG9jay5oY2xcIik7XG4gIGlmIChmcy5leGlzdHNTeW5jKHRhcmdldExvY2tGaWxlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlRGlyID0gZ2V0UHJvdmlkZXJMb2NrQ2FjaGVEaXIod29ya2luZ0RpciwgYmluYXJ5TmFtZSwgZW52KTtcbiAgaWYgKCFjYWNoZURpcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlZExvY2tGaWxlID0gcGF0aC5qb2luKGNhY2hlRGlyLCBcIi50ZXJyYWZvcm0ubG9jay5oY2xcIik7XG4gIGlmICghaXNDYWNoZWRMb2NrRmlsZUZyZXNoKGNhY2hlZExvY2tGaWxlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZzLmNvcHlGaWxlU3luYyhjYWNoZWRMb2NrRmlsZSwgdGFyZ2V0TG9ja0ZpbGUpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGBURl9QTFVHSU5fQ0FDSEVfRElSYCBmcm9tIGBlbnZgLiBXaXRob3V0IGEgc2VlZGVkIGxvY2sgZmlsZSwgYGluaXRgIHJlc29sdmVzXG4gKiBwcm92aWRlcnMgaXRzZWxmOyBhZ2FpbnN0IHRlcnJhZm9ybSA+PSAxLjQgdGhhdCByZS1kb3dubG9hZHMgaW50byB0aGUgc2hhcmVkIHBsdWdpbiBjYWNoZVxuICogZXZlbiB3aGVuIGl0J3Mgd2FybSwgcmFjaW5nIG90aGVyIGNvbmN1cnJlbnQgYGluaXRgc1xuICogKGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLWNvbnN0cnVjdHMvY2RrLXRlcnJhaW4vaXNzdWVzLzQ1MikuIERyb3BwaW5nIHRoZSBjYWNoZSBkaXIgZnJvbSB0aGVcbiAqIGVudmlyb25tZW50IG1ha2VzIGBpbml0YCByZXNvbHZlIGludG8gdGhlIHN0YWNrJ3Mgb3duIGAudGVycmFmb3JtYCBkaXJlY3RvcnkgaW5zdGVhZCwgc28gaXRcbiAqIGNhbid0IHJhY2UgYW5vdGhlciB3b3JrZXIncyB3cml0ZXMgdG8gdGhlIHNoYXJlZCBjYWNoZS4gVGhpcyBkb2Vzbid0IGNvdmVyIGEgYHBsdWdpbl9jYWNoZV9kaXJgXG4gKiBzZXQgaW4gdGhlIHVzZXIncyBDTEkgY29uZmlnIGZpbGUgcmF0aGVyIHRoYW4gdGhlIGVudmlyb25tZW50LCBhbmRcbiAqIGB3YXJtVXBQcm92aWRlckxvY2tGaWxlQ2FjaGVgIGlzIHN0aWxsIGV4cGVjdGVkIHRvIHJ1biBvbmNlIHBlciBtYWNoaW5lIGF0IGEgdGltZSDigJQgdHdvIHdhcm0tdXBzXG4gKiByYWNpbmcgYSBjb2xkIHBsdWdpbiBjYWNoZSB3b3VsZCBoaXQgdGhlIHNhbWUgcmFjZSB0aGlzIHdvcmtzIGFyb3VuZC5cbiAqL1xuZnVuY3Rpb24gd2l0aG91dFBsdWdpbkNhY2hlKGVudjogTm9kZUpTLlByb2Nlc3NFbnYpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIGNvbnN0IHsgVEZfUExVR0lOX0NBQ0hFX0RJUjogX3VudXNlZCwgLi4ucmVzdCB9ID0gZW52O1xuICByZXR1cm4gcmVzdDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhbmQgY2FjaGVzIGEgYC50ZXJyYWZvcm0ubG9jay5oY2xgIGZvciB0aGUgZXhhY3Qgc2V0IG9mIHJlcXVpcmVkIHByb3ZpZGVycyBpblxuICogYHdvcmtpbmdEaXJgLCBydW5uaW5nIGEgcmVhbCBgaW5pdGAgYWdhaW5zdCB0aGUgc2hhcmVkIHBsdWdpbiBjYWNoZS4gT25seSBldmVyIGNhbGxlZCBmcm9tXG4gKiBgd2FybVVwUHJvdmlkZXJMb2NrRmlsZUNhY2hlYCwgd2hpY2ggcnVucyBzZXJpYWxseSB3aXRoaW4gYSBzaW5nbGUgcHJvY2Vzcywgc28gbm8gY3Jvc3MtXG4gKiBwcm9jZXNzIGxvY2sgaXMgbmVlZGVkOiBpdCdzIHRoZSBvbmx5IHdyaXRlciB0byB0aGUgY2FjaGUuXG4gKlxuICogYGluaXRgIGFsd2F5cyBydW5zLCBldmVuIHdoZW4gYSBmcmVzaCBjYWNoZWQgbG9jayBmaWxlIGV4aXN0czogdGhlIGxvY2stZmlsZSBjYWNoZSBhbmRcbiAqIGBURl9QTFVHSU5fQ0FDSEVfRElSYCBoYXZlIGluZGVwZW5kZW50IGxpZmV0aW1lcywgc28gYSBmcmVzaCBsb2NrIGRvZXNuJ3QgZ3VhcmFudGVlIHRoZVxuICogcHJvdmlkZXJzIGl0IHBpbnMgYXJlIHN0aWxsIHNpdHRpbmcgaW4gdGhlIHBsdWdpbiBjYWNoZS4gU2VlZGluZyB0aGUgY2FjaGVkIGxvY2sgZmlyc3QgKHdoZW5cbiAqIGB3b3JraW5nRGlyYCBkb2Vzbid0IGFscmVhZHkgaGF2ZSBvbmUgb2YgaXRzIG93biwgYW5kIHRoZSBjYWNoZSBoYXNuJ3QgZXhwaXJlZCkganVzdCBsZXRzXG4gKiB0aGF0IGBpbml0YCB0YWtlIHRoZSB2ZXJpZmllZC1jaGVja3N1bSBwYXRoIGluc3RlYWQgb2YgcmVzb2x2aW5nIGZyb20gc2NyYXRjaC4gQSBzdGFsZSBjYWNoZVxuICogaXMgbGVmdCBhbG9uZSBzbyBgaW5pdGAgcmUtcmVzb2x2ZXMgaXQsIG90aGVyd2lzZSBhIGxvb3NlbHkgcGlubmVkIHJlcXVpcmVtZW50IChlLmcuIGB+PiA1LjBgKVxuICogd291bGQgc3RheSBwaW5uZWQgdG8gd2hhdGV2ZXIgdmVyc2lvbiB0aGlzIGNhY2hlIGVudHJ5IGZpcnN0IHJlc29sdmVkLCBmb3JldmVyLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQW5kQ2FjaGVQcm92aWRlckxvY2tGaWxlKFxuICB3b3JraW5nRGlyOiBzdHJpbmcsXG4gIGJpbmFyeU5hbWU6IHN0cmluZyxcbiAgZW52OiBOb2RlSlMuUHJvY2Vzc0Vudixcbik6IHZvaWQge1xuICBjb25zdCBjYWNoZURpciA9IGdldFByb3ZpZGVyTG9ja0NhY2hlRGlyKHdvcmtpbmdEaXIsIGJpbmFyeU5hbWUsIGVudik7XG4gIGlmICghY2FjaGVEaXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0YXJnZXRMb2NrRmlsZSA9IHBhdGguam9pbih3b3JraW5nRGlyLCBcIi50ZXJyYWZvcm0ubG9jay5oY2xcIik7XG4gIGNvbnN0IGNhY2hlZExvY2tGaWxlID0gcGF0aC5qb2luKGNhY2hlRGlyLCBcIi50ZXJyYWZvcm0ubG9jay5oY2xcIik7XG4gIGNvbnN0IGhhZE93bkxvY2tGaWxlID0gZnMuZXhpc3RzU3luYyh0YXJnZXRMb2NrRmlsZSk7XG4gIGlmICghaGFkT3duTG9ja0ZpbGUgJiYgaXNDYWNoZWRMb2NrRmlsZUZyZXNoKGNhY2hlZExvY2tGaWxlKSkge1xuICAgIHRyeSB7XG4gICAgICBmcy5jb3B5RmlsZVN5bmMoY2FjaGVkTG9ja0ZpbGUsIHRhcmdldExvY2tGaWxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGxvc3QgYSByYWNlIHRvIGFub3RoZXIgd3JpdGVyOyBpbml0IHJlc29sdmVzIGEgbG9jayBmaWxlIGZyb20gc2NyYXRjaCBiZWxvd1xuICAgIH1cbiAgfVxuXG4gIGV4ZWNTeW5jKGAke2JpbmFyeU5hbWV9IGluaXQgLWJhY2tlbmQ9ZmFsc2UgLWlucHV0PWZhbHNlYCwge1xuICAgIGN3ZDogd29ya2luZ0RpcixcbiAgICBlbnYsXG4gICAgc3RkaW86IFwicGlwZVwiLFxuICB9KTtcblxuICBpZiAoaGFkT3duTG9ja0ZpbGUpIHtcbiAgICAvLyBvbmx5IGNhY2hlIGxvY2sgZmlsZXMgdGhpcyB3YXJtLXVwIGFjdHVhbGx5IHJlc29sdmVkLCBub3QgYSBzdGFjaydzIG93biBwaW5uZWQgb25lXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBmcy5ta2RpclN5bmMoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IHRtcExvY2tGaWxlID0gYCR7Y2FjaGVkTG9ja0ZpbGV9LiR7cHJvY2Vzcy5waWR9LnRtcGA7XG4gICAgZnMuY29weUZpbGVTeW5jKHRhcmdldExvY2tGaWxlLCB0bXBMb2NrRmlsZSk7XG4gICAgZnMucmVuYW1lU3luYyh0bXBMb2NrRmlsZSwgY2FjaGVkTG9ja0ZpbGUpO1xuICB9IGNhdGNoIHtcbiAgICAvLyB0aGUgY2FjaGUgd3JpdGUtYmFjayBpcyBhbiBvcHRpbWl6YXRpb24gb25seTsgYSBmYWlsdXJlIGhlcmUgbXVzdCBub3QgZmFpbCB0aGUgd2FybS11cFxuICB9XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIHN0YWNrcyBmcm9tIG1hbmlmZXN0Lmpzb24gaW4gYSBzeW50aCBvdXRwdXQgZGlyZWN0b3J5XG4gKiBAcGFyYW0gcmVjZWl2ZWQgU3ludGggb3V0cHV0IGRpcmVjdG9yeVxuICogQHJldHVybnMgU3RhY2sgbmFtZSBhbmQgbWFuaWZlc3QgZW50cnkgcGFpcnNcbiAqL1xuZnVuY3Rpb24gZ2V0TWFuaWZlc3RTdGFja3MoXG4gIHJlY2VpdmVkOiBzdHJpbmcsXG4pOiBbc3RyaW5nLCB7IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZyB9XVtdIHtcbiAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUocmVjZWl2ZWQsIFwibWFuaWZlc3QuanNvblwiKSwgXCJ1dGY4XCIpLFxuICApO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMobWFuaWZlc3Quc3RhY2tzKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhbmQgY2FjaGVzIGEgYC50ZXJyYWZvcm0ubG9jay5oY2xgIGZvciBldmVyeSB1bmlxdWUgcmVxdWlyZWQtcHJvdmlkZXJzIHNldCBhY3Jvc3NcbiAqIHRoZSBnaXZlbiBgZnVsbFN5bnRoYCBvdXRwdXQgZGlyZWN0b3JpZXMsIHVwIGZyb250IGFuZCBzZXJpYWxseS5cbiAqXG4gKiBJbnRlbmRlZCBmb3IgY2FsbGVycyB0aGF0IGtub3cgdGhlIGZ1bGwgc2V0IG9mIHN0YWNrcyB1bmRlciB0ZXN0IGFoZWFkIG9mIHRpbWUg4oCUIGUuZy4gYVxuICogSmVzdC9WaXRlc3QgYGdsb2JhbFNldHVwYCBob29rLCBiZWZvcmUgcGFyYWxsZWwgd29ya2VycyBzdGFydCDigJQgc28gdGhlcmUncyBub3RoaW5nIGxlZnQgZm9yXG4gKiBgdG9CZVZhbGlkVGVycmFmb3JtYC9gdG9QbGFuU3VjY2Vzc2Z1bGx5YCB0byByYWNlIG92ZXJcbiAqIChodHRwczovL2dpdGh1Yi5jb20vb3Blbi1jb25zdHJ1Y3RzL2Nkay10ZXJyYWluL2lzc3Vlcy80NTIpLlxuICpcbiAqIEBwYXJhbSByZWNlaXZlZCBvbmUgb3IgbW9yZSBgZnVsbFN5bnRoYCBvdXRwdXQgZGlyZWN0b3JpZXMgdG8gd2FybSB1cFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FybVVwUHJvdmlkZXJMb2NrRmlsZUNhY2hlKHJlY2VpdmVkOiBzdHJpbmdbXSk6IHZvaWQge1xuICBjb25zdCB0ZXJyYWZvcm1CaW5hcnlOYW1lID0gaW5mZXJUZXJyYWZvcm1CaW5hcnlOYW1lKCk7XG4gIHJlY2VpdmVkXG4gICAgLmZsYXRNYXAoKGRpcikgPT5cbiAgICAgIGdldE1hbmlmZXN0U3RhY2tzKGRpcikubWFwKChbLCBzdGFja10pID0+XG4gICAgICAgIHBhdGgucmVzb2x2ZShkaXIsIHN0YWNrLndvcmtpbmdEaXJlY3RvcnkpLFxuICAgICAgKSxcbiAgICApXG4gICAgLmZvckVhY2goKHdvcmtpbmdEaXIpID0+XG4gICAgICByZXNvbHZlQW5kQ2FjaGVQcm92aWRlckxvY2tGaWxlKFxuICAgICAgICB3b3JraW5nRGlyLFxuICAgICAgICB0ZXJyYWZvcm1CaW5hcnlOYW1lLFxuICAgICAgICBwcm9jZXNzLmVudixcbiAgICAgICksXG4gICAgKTtcbn1cblxuLy8gZXhlY1N5bmMncyBkZWZhdWx0IDEgTWlCIG1heEJ1ZmZlciBpcyBlYXNpbHkgZXhjZWVkZWQgYnkgYC1qc29uYCBvdXRwdXQgZm9yIGEgcGxhbi92YWxpZGF0ZVxuLy8gb2YgbW9yZSB0aGFuIGEgZmV3IGRvemVuIHJlc291cmNlcy5cbmNvbnN0IEVYRUNfTUFYX0JVRkZFUiA9IDEwMCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIENoZWNrcyB0aGF0IHRoZSByZWNlaXZlZCBzdGFjayBpcyB2YWxpZCBUZXJyYWZvcm0gKGB0ZXJyYWZvcm0gdmFsaWRhdGVgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQmVWYWxpZFRlcnJhZm9ybShyZWNlaXZlZDogc3RyaW5nKTogQXNzZXJ0aW9uUmV0dXJuIHtcbiAgdHJ5IHtcbiAgICBpZiAoIWZzLnN0YXRTeW5jKHJlY2VpdmVkKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBtYXRjaGVyc1BhdGhJc05vdERpcmVjdG9yeShcInRvQmVWYWxpZFRlcnJhZm9ybVwiKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihcbiAgICAgIGBFeHBlY3RlZCBzdWJqZWN0IHRvIGJlIGEgdGVycmFmb3JtIGRpcmVjdG9yeTogJHtlfWAsXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB0ZXJyYWZvcm1CaW5hcnlOYW1lID0gaW5mZXJUZXJyYWZvcm1CaW5hcnlOYW1lKCk7XG4gICAgY29uc3Qgc3RhY2tzID0gZ2V0TWFuaWZlc3RTdGFja3MocmVjZWl2ZWQpO1xuXG4gICAgc3RhY2tzLmZvckVhY2goKFtuYW1lLCBzdGFja10pID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgIGN3ZDogcGF0aC5yZXNvbHZlKHJlY2VpdmVkLCBzdGFjay53b3JraW5nRGlyZWN0b3J5KSxcbiAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgc3RkaW86IFwicGlwZVwiLFxuICAgICAgICBtYXhCdWZmZXI6IEVYRUNfTUFYX0JVRkZFUixcbiAgICAgIH0gYXMgYW55O1xuICAgICAgY29uc3Qgc2VlZGVkID0gc2VlZEZyb21XYXJtQ2FjaGUob3B0cy5jd2QsIHRlcnJhZm9ybUJpbmFyeU5hbWUsIG9wdHMuZW52KTtcbiAgICAgIGV4ZWNTeW5jKGAke3RlcnJhZm9ybUJpbmFyeU5hbWV9IGluaXQgLWJhY2tlbmQ9ZmFsc2UgLWlucHV0PWZhbHNlYCwge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBlbnY6IHNlZWRlZCA/IG9wdHMuZW52IDogd2l0aG91dFBsdWdpbkNhY2hlKG9wdHMuZW52KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgb3V0ID0gZXhlY1N5bmMoYCR7dGVycmFmb3JtQmluYXJ5TmFtZX0gdmFsaWRhdGUgLWpzb25gLCBvcHRzKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZShvdXQudG9TdHJpbmcoKSk7XG4gICAgICBpZiAoIXJlc3VsdC52YWxpZCkge1xuICAgICAgICB0aHJvdyBtYXRjaGVyc0ZvdW5kRXJyb3JzSW5TdGFjayhcbiAgICAgICAgICByZXN1bHQuZXJyb3JfY291bnQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICByZXN1bHQuZGlhZ25vc3RpY3Muam9pbihcIlxcblwiKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihcbiAgICAgIGBFeHBlY3RlZCBzdWJqZWN0IG5vdCB0byBiZSBhIHZhbGlkIHRlcnJhZm9ybSBzdGFja2AsXG4gICAgICB0cnVlLFxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihcbiAgICAgIHdpdGhQcm9jZXNzT3V0cHV0KGBFeHBlY3RlZCBzdWJqZWN0IHRvIGJlIGEgdmFsaWQgdGVycmFmb3JtIHN0YWNrYCwgZSksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9QbGFuU3VjY2Vzc2Z1bGx5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGBpbml0YC9gcGxhbmAgc2hvdWxkIHVzZSB0aGUgc3RhY2sncyByZWFsIGJhY2tlbmQuIERpc2FibGUgdGhpcyBmb3Igc3RhY2tzIHdob3NlXG4gICAqIGJhY2tlbmQgKGUuZy4gczMsIHJlbW90ZSkgaXMgbm90IHJlYWNoYWJsZSBpbiB0aGUgdGVzdCBlbnZpcm9ubWVudCBhbmQgd2hvc2UgcGxhbiBkb2VzIG5vdFxuICAgKiBkZXBlbmQgb24gZXhpc3Rpbmcgc3RhdGUuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGJhY2tlbmQ/OiBib29sZWFuO1xufVxuXG5jb25zdCBub1JlYWxCYWNrZW5kT3ZlcnJpZGVGaWxlTmFtZSA9XG4gIFwiY2RrdG4tdGVzdGluZy1uby1iYWNrZW5kX292ZXJyaWRlLnRmLmpzb25cIjtcblxuLyoqXG4gKiBgaW5pdCAtYmFja2VuZD1mYWxzZWAgbGVhdmVzIHRoZSBiYWNrZW5kIHVuaW5pdGlhbGl6ZWQsIHdoaWNoIGBwbGFuYCByZWZ1c2VzIHRvIHJ1biBhZ2FpbnN0XG4gKiAoYGZ1bGxTeW50aGAgb3V0cHV0IGFsd2F5cyBoYXMgYSBiYWNrZW5kIGJsb2NrKS4gV3JpdGUgYSBUZXJyYWZvcm0gSlNPTiBvdmVycmlkZSB0aGF0IHN3YXBzXG4gKiBpbiBhIGBsb2NhbGAgYmFja2VuZCBpbnN0ZWFkLCBzbyBgaW5pdGAgY2FuIGluaXRpYWxpemUgZm9yIHJlYWwgd2l0aG91dCBjcmVkZW50aWFscyBvclxuICogbmV0d29yayBhY2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIG92ZXJyaWRlV2l0aExvY2FsQmFja2VuZCh3b3JraW5nRGlyOiBzdHJpbmcpIHtcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICBwYXRoLmpvaW4od29ya2luZ0Rpciwgbm9SZWFsQmFja2VuZE92ZXJyaWRlRmlsZU5hbWUpLFxuICAgIEpTT04uc3RyaW5naWZ5KHsgdGVycmFmb3JtOiB7IGJhY2tlbmQ6IHsgbG9jYWw6IHt9IH0gfSB9KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBsb2NhbCBiYWNrZW5kIG92ZXJyaWRlIHdyaXR0ZW4gYnkgb3ZlcnJpZGVXaXRoTG9jYWxCYWNrZW5kLCBpZiBwcmVzZW50XG4gKiBAcGFyYW0gd29ya2luZ0RpciBTdGFjayB3b3JraW5nIGRpcmVjdG9yeVxuICovXG5mdW5jdGlvbiByZW1vdmVMb2NhbEJhY2tlbmRPdmVycmlkZSh3b3JraW5nRGlyOiBzdHJpbmcpIHtcbiAgZnMucm1TeW5jKHBhdGguam9pbih3b3JraW5nRGlyLCBub1JlYWxCYWNrZW5kT3ZlcnJpZGVGaWxlTmFtZSksIHtcbiAgICBmb3JjZTogdHJ1ZSxcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHRoYXQgdGhlIHJlY2VpdmVkIHN0YWNrIHBsYW5zIHN1Y2Nlc3NmdWxseSAoYHRlcnJhZm9ybSBwbGFuYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1BsYW5TdWNjZXNzZnVsbHkoXG4gIHJlY2VpdmVkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFRvUGxhblN1Y2Nlc3NmdWxseU9wdGlvbnMgPSB7fSxcbik6IEFzc2VydGlvblJldHVybiB7XG4gIGNvbnN0IHsgYmFja2VuZCA9IHRydWUgfSA9IG9wdGlvbnM7XG5cbiAgdHJ5IHtcbiAgICBpZiAoIWZzLnN0YXRTeW5jKHJlY2VpdmVkKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBtYXRjaGVyc1BhdGhJc05vdERpcmVjdG9yeShcInRvUGxhblN1Y2Nlc3NmdWxseVwiKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihcbiAgICAgIGBFeHBlY3RlZCBzdWJqZWN0IHRvIGJlIGEgdGVycmFmb3JtIGRpcmVjdG9yeTogJHtlfWAsXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB0ZXJyYWZvcm1CaW5hcnlOYW1lID0gaW5mZXJUZXJyYWZvcm1CaW5hcnlOYW1lKCk7XG4gICAgY29uc3Qgc3RhY2tzID0gZ2V0TWFuaWZlc3RTdGFja3MocmVjZWl2ZWQpO1xuXG4gICAgc3RhY2tzLmZvckVhY2goKFssIHN0YWNrXSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgICAgY3dkOiBwYXRoLnJlc29sdmUocmVjZWl2ZWQsIHN0YWNrLndvcmtpbmdEaXJlY3RvcnkpLFxuICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICBzdGRpbzogXCJwaXBlXCIsXG4gICAgICAgIG1heEJ1ZmZlcjogRVhFQ19NQVhfQlVGRkVSLFxuICAgICAgfSBhcyBhbnk7XG5cbiAgICAgIGlmICghYmFja2VuZCkge1xuICAgICAgICBvdmVycmlkZVdpdGhMb2NhbEJhY2tlbmQob3B0cy5jd2QpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzZWVkZWQgPSBzZWVkRnJvbVdhcm1DYWNoZShcbiAgICAgICAgICBvcHRzLmN3ZCxcbiAgICAgICAgICB0ZXJyYWZvcm1CaW5hcnlOYW1lLFxuICAgICAgICAgIG9wdHMuZW52LFxuICAgICAgICApO1xuICAgICAgICBleGVjU3luYyhgJHt0ZXJyYWZvcm1CaW5hcnlOYW1lfSBpbml0IC1pbnB1dD1mYWxzZWAsIHtcbiAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgIGVudjogc2VlZGVkID8gb3B0cy5lbnYgOiB3aXRob3V0UGx1Z2luQ2FjaGUob3B0cy5lbnYpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyB0aHJvd3Mgb24gYSBub24temVybyBleGl0IGNvZGVcbiAgICAgICAgZXhlY1N5bmMoXG4gICAgICAgICAgYCR7dGVycmFmb3JtQmluYXJ5TmFtZX0gcGxhbiAtaW5wdXQ9ZmFsc2UgLWxvY2s9ZmFsc2UgLWpzb25gLFxuICAgICAgICAgIG9wdHMsXG4gICAgICAgICk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoIWJhY2tlbmQpIHtcbiAgICAgICAgICByZW1vdmVMb2NhbEJhY2tlbmRPdmVycmlkZShvcHRzLmN3ZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uUmV0dXJuKFxuICAgICAgYEV4cGVjdGVkIHN1YmplY3Qgbm90IHRvIHBsYW4gc3VjY2Vzc2Z1bGx5YCxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uUmV0dXJuKFxuICAgICAgd2l0aFByb2Nlc3NPdXRwdXQoYEV4cGVjdGVkIHN1YmplY3QgdG8gcGxhbiBzdWNjZXNzZnVsbHlgLCBlKSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|