@aligent/cdk-aspects 0.6.2 → 0.6.4
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/CHANGELOG.md +22 -0
- package/README.md +2 -0
- package/lib/cdk-managed-singletons.d.ts +16 -0
- package/lib/cdk-managed-singletons.js +32 -0
- package/lib/microservice-checks.d.ts +0 -1
- package/lib/microservice-checks.js +3 -22
- package/lib/resource-prefix.d.ts +9 -8
- package/lib/resource-prefix.js +45 -29
- package/package.json +5 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# @aligent/cdk-aspects
|
|
2
2
|
|
|
3
|
+
## 0.6.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#1698](https://github.com/aligent/cdk-constructs/pull/1698) [`c9f490f`](https://github.com/aligent/cdk-constructs/commit/c9f490f17f42aed92646543f7978ac8e4fc9ebb6) Thanks [@toddhainsworth](https://github.com/toddhainsworth)! - Move `aws-cdk-lib` and `constructs` from `dependencies` to `peerDependencies`, matching the convention used by every `@aligent/cdk-*` construct package.
|
|
8
|
+
|
|
9
|
+
As regular dependencies, a consumer whose own `aws-cdk-lib` resolved to a different version ended up with two copies in the tree. The aspects' `instanceof CfnResource` checks compared against the nested copy's class, so `visit()` returned early for every node — aspects silently became a no-op (no prefixes, no defaults, no checks) with a valid-but-untouched synth. Declaring them as peers guarantees a single shared instance with the consumer.
|
|
10
|
+
|
|
11
|
+
- [#1702](https://github.com/aligent/cdk-constructs/pull/1702) [`49f7a78`](https://github.com/aligent/cdk-constructs/commit/49f7a78418a566b4c868293c293ccab9528fc647) Thanks [@toddhainsworth](https://github.com/toddhainsworth)! - Fix `ResourcePrefixAspect` to skip CDK-managed singleton/framework resources (`BucketDeployment` handler, `LogRetention`, `S3AutoDeleteObjects`, and `cr.Provider` framework lambdas) and their nested children (IAM service roles, log groups) instead of pinning deterministic physical names onto them.
|
|
12
|
+
|
|
13
|
+
These singletons share a fixed logical id across every stack, so a deterministic prefixed name collapses to one value per prefix scope. That removed CloudFormation's per-stack and per-creation uniqueness and caused two deploy failures:
|
|
14
|
+
- **Cross-stack IAM role collision** — two `BucketDeployment`-using stacks in the same stage received the same account-global `RoleName`, so the second stack failed with `... already exists`.
|
|
15
|
+
- **Orphaned `/aws/lambda` log group collision on retry** — a failed deploy orphaned the service-created log group, and the deterministic function name regenerated the identical name, wedging every subsequent deploy on `AWS::Logs::LogGroup ... already exists`.
|
|
16
|
+
|
|
17
|
+
The aspect now leaves these resources CloudFormation-named, matching the singleton-skip behaviour `MicroserviceChecks` already applies.
|
|
18
|
+
|
|
19
|
+
## 0.6.3
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- [#1696](https://github.com/aligent/cdk-constructs/pull/1696) [`d05f4f8`](https://github.com/aligent/cdk-constructs/commit/d05f4f895fb10ec388a981c36c532f428869c98c) Thanks [@kai-nguyen-aligent](https://github.com/kai-nguyen-aligent)! - Fix ResourcePrefixAspect to gracefully handle CDK tokens (e.g. `Fn.ref`, `Lazy.string`) in resource name properties by falling back to the sanitised logical ID.
|
|
24
|
+
|
|
3
25
|
## 0.6.2
|
|
4
26
|
|
|
5
27
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -115,6 +115,8 @@ Automatically prefixes physical resource names across supported AWS resource typ
|
|
|
115
115
|
- Handles resource-specific naming rules: S3 names are lowercased, FIFO queues/topics preserve the `.fifo` suffix, SSM parameters use path-style prefixes (`/prefix/name`)
|
|
116
116
|
- **Automatic truncation**: if a prefixed name would exceed AWS's maximum length for that resource type, the aspect truncates the name and appends an 8-character SHA-256 hash to maintain uniqueness. A CDK warning is emitted for each truncated resource. This prevents L3 constructs (e.g. `BucketDeployment`) from generating child resources that cause synthesis failures.
|
|
117
117
|
- Idempotent: already-prefixed resources are skipped
|
|
118
|
+
- Skips AWS-reserved log group names (e.g. `/aws/lambda/...`)
|
|
119
|
+
- Skips CDK-managed singleton/framework resources (`BucketDeployment` handler, `LogRetention`, `S3AutoDeleteObjects`, and `cr.Provider` framework lambdas) and their nested children (IAM service roles, log groups). These singletons share a fixed logical id across every stack, so a deterministic prefixed name collapses to one value per prefix scope. Leaving them CloudFormation-generated preserves the per-stack and per-creation uniqueness that prevents account-global IAM role collisions across stacks and orphaned `/aws/lambda` log group collisions on retry.
|
|
118
120
|
- Supports an exclusion list to skip specific resource types
|
|
119
121
|
|
|
120
122
|
### Usage
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IConstruct } from "constructs";
|
|
2
|
+
/**
|
|
3
|
+
* Path fragments identifying CDK-managed singleton/framework resources that
|
|
4
|
+
* consumers cannot configure or own.
|
|
5
|
+
*
|
|
6
|
+
* Aspects should leave these resources untouched: their runtime config is
|
|
7
|
+
* framework-owned (so cdk-nag rules are noise), and their physical names must
|
|
8
|
+
* stay CloudFormation-generated (so a failed deploy's orphaned `/aws/lambda`
|
|
9
|
+
* LogGroup never collides with a deterministic name on the next attempt).
|
|
10
|
+
*/
|
|
11
|
+
export declare const CDK_MANAGED_PATH_FRAGMENTS: string[];
|
|
12
|
+
/**
|
|
13
|
+
* Returns true when the construct lives under a CDK-managed singleton/framework
|
|
14
|
+
* path and should therefore be skipped by aspects.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isCdkManagedSingleton(node: IConstruct): boolean;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CDK_MANAGED_PATH_FRAGMENTS = void 0;
|
|
4
|
+
exports.isCdkManagedSingleton = isCdkManagedSingleton;
|
|
5
|
+
/**
|
|
6
|
+
* Path fragments identifying CDK-managed singleton/framework resources that
|
|
7
|
+
* consumers cannot configure or own.
|
|
8
|
+
*
|
|
9
|
+
* Aspects should leave these resources untouched: their runtime config is
|
|
10
|
+
* framework-owned (so cdk-nag rules are noise), and their physical names must
|
|
11
|
+
* stay CloudFormation-generated (so a failed deploy's orphaned `/aws/lambda`
|
|
12
|
+
* LogGroup never collides with a deterministic name on the next attempt).
|
|
13
|
+
*/
|
|
14
|
+
exports.CDK_MANAGED_PATH_FRAGMENTS = [
|
|
15
|
+
// aws-s3-deployment.BucketDeployment custom resource handler
|
|
16
|
+
"Custom::CDKBucketDeployment",
|
|
17
|
+
// Deprecated CDK log retention custom resource
|
|
18
|
+
"LogRetention",
|
|
19
|
+
// Bucket(autoDeleteObjects: true)
|
|
20
|
+
"Custom::S3AutoDeleteObjects",
|
|
21
|
+
// cr.Provider framework on-event / is-complete handler
|
|
22
|
+
"AWS679f53fac002430cb0da5b7982bd2287",
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Returns true when the construct lives under a CDK-managed singleton/framework
|
|
26
|
+
* path and should therefore be skipped by aspects.
|
|
27
|
+
*/
|
|
28
|
+
function isCdkManagedSingleton(node) {
|
|
29
|
+
const path = node.node.path;
|
|
30
|
+
return exports.CDK_MANAGED_PATH_FRAGMENTS.some(fragment => path.includes(fragment));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLW1hbmFnZWQtc2luZ2xldG9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1tYW5hZ2VkLXNpbmdsZXRvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMEJBLHNEQUdDO0FBM0JEOzs7Ozs7OztHQVFHO0FBQ1UsUUFBQSwwQkFBMEIsR0FBRztJQUN4Qyw2REFBNkQ7SUFDN0QsNkJBQTZCO0lBQzdCLCtDQUErQztJQUMvQyxjQUFjO0lBQ2Qsa0NBQWtDO0lBQ2xDLDZCQUE2QjtJQUM3Qix1REFBdUQ7SUFDdkQscUNBQXFDO0NBQ3RDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxJQUFnQjtJQUNwRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUM1QixPQUFPLGtDQUEwQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLyoqXG4gKiBQYXRoIGZyYWdtZW50cyBpZGVudGlmeWluZyBDREstbWFuYWdlZCBzaW5nbGV0b24vZnJhbWV3b3JrIHJlc291cmNlcyB0aGF0XG4gKiBjb25zdW1lcnMgY2Fubm90IGNvbmZpZ3VyZSBvciBvd24uXG4gKlxuICogQXNwZWN0cyBzaG91bGQgbGVhdmUgdGhlc2UgcmVzb3VyY2VzIHVudG91Y2hlZDogdGhlaXIgcnVudGltZSBjb25maWcgaXNcbiAqIGZyYW1ld29yay1vd25lZCAoc28gY2RrLW5hZyBydWxlcyBhcmUgbm9pc2UpLCBhbmQgdGhlaXIgcGh5c2ljYWwgbmFtZXMgbXVzdFxuICogc3RheSBDbG91ZEZvcm1hdGlvbi1nZW5lcmF0ZWQgKHNvIGEgZmFpbGVkIGRlcGxveSdzIG9ycGhhbmVkIGAvYXdzL2xhbWJkYWBcbiAqIExvZ0dyb3VwIG5ldmVyIGNvbGxpZGVzIHdpdGggYSBkZXRlcm1pbmlzdGljIG5hbWUgb24gdGhlIG5leHQgYXR0ZW1wdCkuXG4gKi9cbmV4cG9ydCBjb25zdCBDREtfTUFOQUdFRF9QQVRIX0ZSQUdNRU5UUyA9IFtcbiAgLy8gYXdzLXMzLWRlcGxveW1lbnQuQnVja2V0RGVwbG95bWVudCBjdXN0b20gcmVzb3VyY2UgaGFuZGxlclxuICBcIkN1c3RvbTo6Q0RLQnVja2V0RGVwbG95bWVudFwiLFxuICAvLyBEZXByZWNhdGVkIENESyBsb2cgcmV0ZW50aW9uIGN1c3RvbSByZXNvdXJjZVxuICBcIkxvZ1JldGVudGlvblwiLFxuICAvLyBCdWNrZXQoYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUpXG4gIFwiQ3VzdG9tOjpTM0F1dG9EZWxldGVPYmplY3RzXCIsXG4gIC8vIGNyLlByb3ZpZGVyIGZyYW1ld29yayBvbi1ldmVudCAvIGlzLWNvbXBsZXRlIGhhbmRsZXJcbiAgXCJBV1M2NzlmNTNmYWMwMDI0MzBjYjBkYTViNzk4MmJkMjI4N1wiLFxuXTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgY29uc3RydWN0IGxpdmVzIHVuZGVyIGEgQ0RLLW1hbmFnZWQgc2luZ2xldG9uL2ZyYW1ld29ya1xuICogcGF0aCBhbmQgc2hvdWxkIHRoZXJlZm9yZSBiZSBza2lwcGVkIGJ5IGFzcGVjdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Nka01hbmFnZWRTaW5nbGV0b24obm9kZTogSUNvbnN0cnVjdCk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXRoID0gbm9kZS5ub2RlLnBhdGg7XG4gIHJldHVybiBDREtfTUFOQUdFRF9QQVRIX0ZSQUdNRU5UUy5zb21lKGZyYWdtZW50ID0+IHBhdGguaW5jbHVkZXMoZnJhZ21lbnQpKTtcbn1cbiJdfQ==
|
|
@@ -3,22 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.MicroserviceChecks = void 0;
|
|
4
4
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
5
|
const cdk_nag_1 = require("cdk-nag");
|
|
6
|
-
|
|
7
|
-
* Path fragments identifying CDK-managed singleton resources that consumers
|
|
8
|
-
* cannot configure. These nodes are skipped during rule evaluation because
|
|
9
|
-
* surfacing nags on memory size, timeout, tracing, or log retention for
|
|
10
|
-
* resources owned by the CDK framework is noise.
|
|
11
|
-
*/
|
|
12
|
-
const CDK_MANAGED_PATH_FRAGMENTS = [
|
|
13
|
-
// aws-s3-deployment.BucketDeployment custom resource handler
|
|
14
|
-
"Custom::CDKBucketDeployment",
|
|
15
|
-
// Deprecated CDK log retention custom resource
|
|
16
|
-
"LogRetention",
|
|
17
|
-
// Bucket(autoDeleteObjects: true)
|
|
18
|
-
"Custom::S3AutoDeleteObjects",
|
|
19
|
-
// cr.Provider framework on-event / is-complete handler
|
|
20
|
-
"AWS679f53fac002430cb0da5b7982bd2287",
|
|
21
|
-
];
|
|
6
|
+
const cdk_managed_singletons_1 = require("./cdk-managed-singletons");
|
|
22
7
|
/**
|
|
23
8
|
* Microservice Checks are a compilation of rules to validate infrastructure-as-code template
|
|
24
9
|
* against recommended practices using the cdk-nag library.
|
|
@@ -36,7 +21,7 @@ class MicroserviceChecks extends cdk_nag_1.NagPack {
|
|
|
36
21
|
this.packName = "Microservices";
|
|
37
22
|
}
|
|
38
23
|
visit(node) {
|
|
39
|
-
if (
|
|
24
|
+
if ((0, cdk_managed_singletons_1.isCdkManagedSingleton)(node))
|
|
40
25
|
return;
|
|
41
26
|
if (node instanceof aws_cdk_lib_1.CfnResource) {
|
|
42
27
|
this.applyRule({
|
|
@@ -69,10 +54,6 @@ class MicroserviceChecks extends cdk_nag_1.NagPack {
|
|
|
69
54
|
});
|
|
70
55
|
}
|
|
71
56
|
}
|
|
72
|
-
isCdkManagedSingleton(node) {
|
|
73
|
-
const path = node.node.path;
|
|
74
|
-
return CDK_MANAGED_PATH_FRAGMENTS.some(fragment => path.includes(fragment));
|
|
75
|
-
}
|
|
76
57
|
}
|
|
77
58
|
exports.MicroserviceChecks = MicroserviceChecks;
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9zZXJ2aWNlLWNoZWNrcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1pY3Jvc2VydmljZS1jaGVja3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQTBDO0FBQzFDLHFDQUE2RTtBQUU3RSxxRUFBaUU7QUFFakU7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsaUJBQU87SUFDN0MsWUFBWSxLQUFvQjtRQUM5QixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQztJQUNsQyxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQWdCO1FBQzNCLElBQUksSUFBQSw4Q0FBcUIsRUFBQyxJQUFJLENBQUM7WUFBRSxPQUFPO1FBRXhDLElBQUksSUFBSSxZQUFZLHlCQUFXLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNiLElBQUksRUFBRSx3RUFBd0U7Z0JBQzlFLFdBQVcsRUFDVCxnYkFBZ2I7Z0JBQ2xiLEtBQUssRUFBRSx5QkFBZSxDQUFDLEtBQUs7Z0JBQzVCLElBQUksRUFBRSxlQUFLLENBQUMsTUFBTSxDQUFDLHVCQUF1QjtnQkFDMUMsSUFBSSxFQUFFLElBQUk7YUFDWCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNiLElBQUksRUFBRSx3RUFBd0U7Z0JBQzlFLFdBQVcsRUFDVCxxakJBQXFqQjtnQkFDdmpCLEtBQUssRUFBRSx5QkFBZSxDQUFDLEtBQUs7Z0JBQzVCLElBQUksRUFBRSxlQUFLLENBQUMsTUFBTSxDQUFDLG9CQUFvQjtnQkFDdkMsSUFBSSxFQUFFLElBQUk7YUFDWCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNiLElBQUksRUFBRSxrRUFBa0U7Z0JBQ3hFLFdBQVcsRUFDVCxrSkFBa0o7Z0JBQ3BKLEtBQUssRUFBRSx5QkFBZSxDQUFDLEtBQUs7Z0JBQzVCLElBQUksRUFBRSxlQUFLLENBQUMsTUFBTSxDQUFDLGFBQWE7Z0JBQ2hDLElBQUksRUFBRSxJQUFJO2FBQ1gsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDYixJQUFJLEVBQUUsOEVBQThFO2dCQUNwRixXQUFXLEVBQ1QsMFNBQTBTO2dCQUM1UyxLQUFLLEVBQUUseUJBQWUsQ0FBQyxLQUFLO2dCQUM1QixJQUFJLEVBQUUsZUFBSyxDQUFDLFVBQVUsQ0FBQyxpQ0FBaUM7Z0JBQ3hELElBQUksRUFBRSxJQUFJO2FBQ1gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTVDRCxnREE0Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5SZXNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgTmFnTWVzc2FnZUxldmVsLCBOYWdQYWNrLCBydWxlcywgdHlwZSBOYWdQYWNrUHJvcHMgfSBmcm9tIFwiY2RrLW5hZ1wiO1xuaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IGlzQ2RrTWFuYWdlZFNpbmdsZXRvbiB9IGZyb20gXCIuL2Nkay1tYW5hZ2VkLXNpbmdsZXRvbnNcIjtcblxuLyoqXG4gKiBNaWNyb3NlcnZpY2UgQ2hlY2tzIGFyZSBhIGNvbXBpbGF0aW9uIG9mIHJ1bGVzIHRvIHZhbGlkYXRlIGluZnJhc3RydWN0dXJlLWFzLWNvZGUgdGVtcGxhdGVcbiAqIGFnYWluc3QgcmVjb21tZW5kZWQgcHJhY3RpY2VzIHVzaW5nIHRoZSBjZGstbmFnIGxpYnJhcnkuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2RrLXBhdHRlcm5zL2Nkay1uYWcvXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAqIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ015U3RhY2snKTtcbiAqIEFzcGVjdHMub2Yoc3RhY2spLmFkZChuZXcgTWljcm9zZXJ2aWNlc0NoZWNrcygpKTtcbiAqL1xuZXhwb3J0IGNsYXNzIE1pY3Jvc2VydmljZUNoZWNrcyBleHRlbmRzIE5hZ1BhY2sge1xuICBjb25zdHJ1Y3Rvcihwcm9wcz86IE5hZ1BhY2tQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnBhY2tOYW1lID0gXCJNaWNyb3NlcnZpY2VzXCI7XG4gIH1cblxuICBwdWJsaWMgdmlzaXQobm9kZTogSUNvbnN0cnVjdCkge1xuICAgIGlmIChpc0Nka01hbmFnZWRTaW5nbGV0b24obm9kZSkpIHJldHVybjtcblxuICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ2ZuUmVzb3VyY2UpIHtcbiAgICAgIHRoaXMuYXBwbHlSdWxlKHtcbiAgICAgICAgaW5mbzogXCJUaGUgTGFtYmRhIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYW4gZXhwbGljaXQgbWVtb3J5IHZhbHVlIGNvbmZpZ3VyZWQuXCIsXG4gICAgICAgIGV4cGxhbmF0aW9uOlxuICAgICAgICAgIFwiTGFtYmRhIGFsbG9jYXRlcyBDUFUgcG93ZXIgaW4gcHJvcG9ydGlvbiB0byB0aGUgYW1vdW50IG9mIG1lbW9yeSBjb25maWd1cmVkLiBCeSBkZWZhdWx0LCB5b3VyIGZ1bmN0aW9ucyBoYXZlIDEyOCBNQiBvZiBtZW1vcnkgYWxsb2NhdGVkLiBZb3UgY2FuIGluY3JlYXNlIHRoYXQgdmFsdWUgdXAgdG8gMTAgR0IuIFdpdGggbW9yZSBDUFUgcmVzb3VyY2VzLCB5b3VyIExhbWJkYSBmdW5jdGlvbidzIGR1cmF0aW9uIG1pZ2h0IGRlY3JlYXNlLiAgWW91IGNhbiB1c2UgdG9vbHMgc3VjaCBhcyBBV1MgTGFtYmRhIFBvd2VyIFR1bmluZyB0byB0ZXN0IHlvdXIgZnVuY3Rpb24gYXQgZGlmZmVyZW50IG1lbW9yeSBzZXR0aW5ncyB0byBmaW5kIHRoZSBvbmUgdGhhdCBtYXRjaGVzIHlvdXIgY29zdCBhbmQgcGVyZm9ybWFuY2UgcmVxdWlyZW1lbnRzIHRoZSBiZXN0LlwiLFxuICAgICAgICBsZXZlbDogTmFnTWVzc2FnZUxldmVsLkVSUk9SLFxuICAgICAgICBydWxlOiBydWxlcy5sYW1iZGEuTGFtYmRhRGVmYXVsdE1lbW9yeVNpemUsXG4gICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXBwbHlSdWxlKHtcbiAgICAgICAgaW5mbzogXCJUaGUgTGFtYmRhIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYW4gZXhwbGljaXRseSBkZWZpbmVkIHRpbWVvdXQgdmFsdWUuXCIsXG4gICAgICAgIGV4cGxhbmF0aW9uOlxuICAgICAgICAgIFwiTGFtYmRhIGZ1bmN0aW9ucyBoYXZlIGEgZGVmYXVsdCB0aW1lb3V0IG9mIDMgc2Vjb25kcy4gSWYgeW91ciB0aW1lb3V0IHZhbHVlIGlzIHRvbyBzaG9ydCwgTGFtYmRhIG1pZ2h0IHRlcm1pbmF0ZSBpbnZvY2F0aW9ucyBwcmVtYXR1cmVseS4gT24gdGhlIG90aGVyIHNpZGUsIHNldHRpbmcgdGhlIHRpbWVvdXQgbXVjaCBoaWdoZXIgdGhhbiB0aGUgYXZlcmFnZSBleGVjdXRpb24gbWF5IGNhdXNlIGZ1bmN0aW9ucyB0byBleGVjdXRlIGZvciBsb25nZXIgdXBvbiBjb2RlIG1hbGZ1bmN0aW9uLCByZXN1bHRpbmcgaW4gaGlnaGVyIGNvc3RzIGFuZCBwb3NzaWJseSByZWFjaGluZyBjb25jdXJyZW5jeSBsaW1pdHMgZGVwZW5kaW5nIG9uIGhvdyBzdWNoIGZ1bmN0aW9ucyBhcmUgaW52b2tlZC4gWW91IGNhbiBhbHNvIHVzZSBBV1MgTGFtYmRhIFBvd2VyIFR1bmluZyB0byB0ZXN0IHlvdXIgZnVuY3Rpb24gYXQgZGlmZmVyZW50IHRpbWVvdXQgc2V0dGluZ3MgdG8gZmluZCB0aGUgb25lIHRoYXQgbWF0Y2hlcyB5b3VyIGNvc3QgYW5kIHBlcmZvcm1hbmNlIHJlcXVpcmVtZW50cyB0aGUgYmVzdC5cIixcbiAgICAgICAgbGV2ZWw6IE5hZ01lc3NhZ2VMZXZlbC5FUlJPUixcbiAgICAgICAgcnVsZTogcnVsZXMubGFtYmRhLkxhbWJkYURlZmF1bHRUaW1lb3V0LFxuICAgICAgICBub2RlOiBub2RlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmFwcGx5UnVsZSh7XG4gICAgICAgIGluZm86IFwiVGhlIExhbWJkYSBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRyYWNpbmcgc2V0IHRvIFRyYWNpbmcuQUNUSVZFLlwiLFxuICAgICAgICBleHBsYW5hdGlvbjpcbiAgICAgICAgICBcIldoZW4gYSBMYW1iZGEgZnVuY3Rpb24gaGFzIEFDVElWRSB0cmFjaW5nLCBMYW1iZGEgYXV0b21hdGljYWxseSBzYW1wbGVzIGludm9jYXRpb24gcmVxdWVzdHMsIGJhc2VkIG9uIHRoZSBzYW1wbGluZyBhbGdvcml0aG0gc3BlY2lmaWVkIGJ5IFgtUmF5LlwiLFxuICAgICAgICBsZXZlbDogTmFnTWVzc2FnZUxldmVsLkVSUk9SLFxuICAgICAgICBydWxlOiBydWxlcy5sYW1iZGEuTGFtYmRhVHJhY2luZyxcbiAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hcHBseVJ1bGUoe1xuICAgICAgICBpbmZvOiBcIlRoZSBDbG91ZFdhdGNoIExvZyBHcm91cCBkb2VzIG5vdCBoYXZlIGFuIGV4cGxpY2l0IHJldGVudGlvbiBwb2xpY3kgZGVmaW5lZC5cIixcbiAgICAgICAgZXhwbGFuYXRpb246XG4gICAgICAgICAgXCJCeSBkZWZhdWx0LCBsb2dzIGFyZSBrZXB0IGluZGVmaW5pdGVseSBhbmQgbmV2ZXIgZXhwaXJlLiBZb3UgY2FuIGFkanVzdCB0aGUgcmV0ZW50aW9uIHBvbGljeSBmb3IgZWFjaCBsb2cgZ3JvdXAsIGtlZXBpbmcgdGhlIGluZGVmaW5pdGUgcmV0ZW50aW9uLCBvciBjaG9vc2luZyBhIHJldGVudGlvbiBwZXJpb2QgYmV0d2VlbiBvbmUgZGF5IGFuZCAxMCB5ZWFycy4gRm9yIExhbWJkYSBmdW5jdGlvbnMsIHRoaXMgYXBwbGllcyB0byB0aGVpciBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgQ2xvdWRXYXRjaCBMb2cgR3JvdXBzLlwiLFxuICAgICAgICBsZXZlbDogTmFnTWVzc2FnZUxldmVsLkVSUk9SLFxuICAgICAgICBydWxlOiBydWxlcy5jbG91ZHdhdGNoLkNsb3VkV2F0Y2hMb2dHcm91cFJldGVudGlvblBlcmlvZCxcbiAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
|
package/lib/resource-prefix.d.ts
CHANGED
|
@@ -56,18 +56,19 @@ export declare class ResourcePrefixAspect implements IAspect {
|
|
|
56
56
|
private shouldSkipResource;
|
|
57
57
|
private isAlreadyPrefixed;
|
|
58
58
|
/**
|
|
59
|
-
* Resolves the
|
|
60
|
-
*
|
|
61
|
-
*
|
|
59
|
+
* Resolves the name components for a resource: the explicitly set raw name (if any)
|
|
60
|
+
* and a sanitised logical ID derived from the construct tree.
|
|
61
|
+
*
|
|
62
|
+
* The raw name is looked up from the CFN properties in both PascalCase and camelCase
|
|
63
|
+
* (CDK stores L1 properties in camelCase internally). When no explicit name is set,
|
|
64
|
+
* `rawName` is `undefined`.
|
|
62
65
|
*/
|
|
63
|
-
private
|
|
66
|
+
private resolveResourceNames;
|
|
64
67
|
/**
|
|
65
68
|
* Builds the prefixed name, handling special cases for specific resource types.
|
|
66
69
|
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* @param cfnProperties - The CloudFormation resource properties
|
|
70
|
-
* @returns The final prefixed name with any special case handling applied
|
|
70
|
+
* Uses the raw name when it is a concrete string, falling back to the logical
|
|
71
|
+
* name when the raw name is an unresolved CDK token.
|
|
71
72
|
*/
|
|
72
73
|
private buildPrefixedName;
|
|
73
74
|
/**
|
package/lib/resource-prefix.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ResourcePrefixAspect = void 0;
|
|
4
4
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
5
|
const crypto_1 = require("crypto");
|
|
6
|
+
const cdk_managed_singletons_1 = require("./cdk-managed-singletons");
|
|
6
7
|
/**
|
|
7
8
|
* Maps CloudFormation resource types to their name property and AWS length limits.
|
|
8
9
|
* Sources: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html
|
|
@@ -94,6 +95,13 @@ class ResourcePrefixAspect {
|
|
|
94
95
|
var _a, _b;
|
|
95
96
|
if (!(node instanceof aws_cdk_lib_1.CfnResource))
|
|
96
97
|
return;
|
|
98
|
+
// CDK-managed singleton/framework resources must keep their
|
|
99
|
+
// CloudFormation-generated physical names. Pinning a deterministic name onto
|
|
100
|
+
// them (e.g. the BucketDeployment handler) removes the random-suffix
|
|
101
|
+
// orphan-avoidance and wedges deploys on `/aws/lambda/<fn>` LogGroup
|
|
102
|
+
// "already exists" after any failed attempt.
|
|
103
|
+
if ((0, cdk_managed_singletons_1.isCdkManagedSingleton)(node))
|
|
104
|
+
return;
|
|
97
105
|
const resourceType = node.cfnResourceType;
|
|
98
106
|
const config = RESOURCE_CONFIG[resourceType];
|
|
99
107
|
if (!config || this.exclude.has(resourceType)) {
|
|
@@ -101,14 +109,14 @@ class ResourcePrefixAspect {
|
|
|
101
109
|
}
|
|
102
110
|
const { cfnName, maxLength } = config;
|
|
103
111
|
const cfnProperties = (_b = (_a = node._cfnProperties) !== null && _a !== void 0 ? _a : node.cfnProperties) !== null && _b !== void 0 ? _b : {};
|
|
104
|
-
const
|
|
105
|
-
if (this.shouldSkipResource(resourceType,
|
|
112
|
+
const names = this.resolveResourceNames(node, cfnName, cfnProperties);
|
|
113
|
+
if (this.shouldSkipResource(resourceType, names)) {
|
|
106
114
|
return;
|
|
107
115
|
}
|
|
108
|
-
if (this.isAlreadyPrefixed(
|
|
116
|
+
if (this.isAlreadyPrefixed(names)) {
|
|
109
117
|
return;
|
|
110
118
|
}
|
|
111
|
-
const prefixedName = this.buildPrefixedName(
|
|
119
|
+
const prefixedName = this.buildPrefixedName(names, resourceType, cfnProperties);
|
|
112
120
|
// Truncation applies to all overflows — including user-set names — because L3
|
|
113
121
|
// constructs can generate names the user has no direct control over.
|
|
114
122
|
const finalName = this.truncateToFit(prefixedName, maxLength, node);
|
|
@@ -121,60 +129,68 @@ class ResourcePrefixAspect {
|
|
|
121
129
|
* Determines whether a resource should be skipped from prefixing based on
|
|
122
130
|
* resource-type-specific rules (e.g., AWS-reserved naming conventions).
|
|
123
131
|
*/
|
|
124
|
-
shouldSkipResource(cfnResourceType,
|
|
125
|
-
|
|
132
|
+
shouldSkipResource(cfnResourceType, names) {
|
|
133
|
+
var _a;
|
|
134
|
+
const name = (_a = names.rawName) !== null && _a !== void 0 ? _a : names.logicalName;
|
|
135
|
+
return (cfnResourceType === "AWS::Logs::LogGroup" && name.startsWith("/aws/"));
|
|
126
136
|
}
|
|
127
|
-
isAlreadyPrefixed(
|
|
137
|
+
isAlreadyPrefixed(names) {
|
|
138
|
+
var _a;
|
|
139
|
+
const name = (_a = names.rawName) !== null && _a !== void 0 ? _a : names.logicalName;
|
|
128
140
|
return (name.startsWith(`${this.prefix}-`) || name.startsWith(`/${this.prefix}/`));
|
|
129
141
|
}
|
|
130
142
|
/**
|
|
131
|
-
* Resolves the
|
|
132
|
-
*
|
|
133
|
-
*
|
|
143
|
+
* Resolves the name components for a resource: the explicitly set raw name (if any)
|
|
144
|
+
* and a sanitised logical ID derived from the construct tree.
|
|
145
|
+
*
|
|
146
|
+
* The raw name is looked up from the CFN properties in both PascalCase and camelCase
|
|
147
|
+
* (CDK stores L1 properties in camelCase internally). When no explicit name is set,
|
|
148
|
+
* `rawName` is `undefined`.
|
|
134
149
|
*/
|
|
135
|
-
|
|
150
|
+
resolveResourceNames(node, cfnName, cfnProperties) {
|
|
136
151
|
var _a;
|
|
137
152
|
const camelCfnName = cfnName.charAt(0).toLowerCase() + cfnName.slice(1);
|
|
138
153
|
const rawName = (_a = cfnProperties[cfnName]) !== null && _a !== void 0 ? _a : cfnProperties[camelCfnName];
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
const logicalId = aws_cdk_lib_1.Stack.of(node).getLogicalId(node);
|
|
143
|
-
return logicalId
|
|
154
|
+
const logicalName = aws_cdk_lib_1.Stack.of(node)
|
|
155
|
+
.getLogicalId(node)
|
|
144
156
|
.replace(/[^a-zA-Z0-9]+/g, "-") // non-alphanumeric → dash
|
|
145
157
|
.replace(/^-+|-+$/g, ""); // trim leading/trailing dashes
|
|
158
|
+
return typeof rawName === "string"
|
|
159
|
+
? { logicalName, rawName }
|
|
160
|
+
: { logicalName, rawName: undefined };
|
|
146
161
|
}
|
|
147
162
|
/**
|
|
148
163
|
* Builds the prefixed name, handling special cases for specific resource types.
|
|
149
164
|
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
* @param cfnProperties - The CloudFormation resource properties
|
|
153
|
-
* @returns The final prefixed name with any special case handling applied
|
|
165
|
+
* Uses the raw name when it is a concrete string, falling back to the logical
|
|
166
|
+
* name when the raw name is an unresolved CDK token.
|
|
154
167
|
*/
|
|
155
|
-
buildPrefixedName(
|
|
168
|
+
buildPrefixedName(names, cfnResourceType, cfnProperties) {
|
|
169
|
+
const name = !names.rawName || aws_cdk_lib_1.Token.isUnresolved(names.rawName)
|
|
170
|
+
? names.logicalName
|
|
171
|
+
: names.rawName;
|
|
156
172
|
// Special case: FIFO queues must end with .fifo suffix
|
|
157
173
|
if (cfnResourceType === "AWS::SQS::Queue" &&
|
|
158
174
|
cfnProperties.fifoQueue === true &&
|
|
159
|
-
!
|
|
160
|
-
return `${this.prefix}-${
|
|
175
|
+
!name.endsWith(".fifo")) {
|
|
176
|
+
return `${this.prefix}-${name}.fifo`;
|
|
161
177
|
}
|
|
162
178
|
// Special case: FIFO topics must end with .fifo suffix
|
|
163
179
|
if (cfnResourceType === "AWS::SNS::Topic" &&
|
|
164
180
|
cfnProperties.fifoTopic === true &&
|
|
165
|
-
!
|
|
166
|
-
return `${this.prefix}-${
|
|
181
|
+
!name.endsWith(".fifo")) {
|
|
182
|
+
return `${this.prefix}-${name}.fifo`;
|
|
167
183
|
}
|
|
168
184
|
// Special case: SSM parameter names use path-style prefix
|
|
169
185
|
if (cfnResourceType === "AWS::SSM::Parameter") {
|
|
170
|
-
return `/${this.prefix}/${
|
|
186
|
+
return `/${this.prefix}/${name}`;
|
|
171
187
|
}
|
|
172
188
|
// Special case: S3 bucket name be lowercase only
|
|
173
189
|
if (cfnResourceType === "AWS::S3::Bucket") {
|
|
174
|
-
return `${this.prefix}-${
|
|
190
|
+
return `${this.prefix}-${name}`.toLowerCase();
|
|
175
191
|
}
|
|
176
192
|
// Default: simple prefix
|
|
177
|
-
return `${this.prefix}-${
|
|
193
|
+
return `${this.prefix}-${name}`;
|
|
178
194
|
}
|
|
179
195
|
/**
|
|
180
196
|
* Truncates a prefixed name to fit within maxLength by hashing the original
|
|
@@ -216,4 +232,4 @@ class ResourcePrefixAspect {
|
|
|
216
232
|
}
|
|
217
233
|
}
|
|
218
234
|
exports.ResourcePrefixAspect = ResourcePrefixAspect;
|
|
219
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtcHJlZml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVzb3VyY2UtcHJlZml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF1RTtBQUV2RSxtQ0FBb0M7QUErQnBDOzs7R0FHRztBQUNILE1BQU0sZUFBZSxHQUF1QztJQUMxRCxVQUFVO0lBQ1YsdUJBQXVCLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFFbkUsVUFBVTtJQUNWLGlCQUFpQixFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQzNELHNCQUFzQixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQ2hFLDRCQUE0QixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBRXRFLFlBQVk7SUFDWixpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUMxRCxpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRTtJQUUzRCwyQkFBMkI7SUFDM0IsdUJBQXVCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUU7SUFDNUQsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDdkQseUJBQXlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDN0Qsa0JBQWtCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDdEQsa0NBQWtDLEVBQUU7UUFDbEMsT0FBTyxFQUFFLGtCQUFrQjtRQUMzQixTQUFT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QUNGO0FBeE1ELG9EQXdNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBDZm5SZXNvdXJjZSwgSUFzcGVjdCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIjtcblxuaW50ZXJmYWNlIFJlc291cmNlTmFtZUNvbmZpZyB7XG4gIC8qKiBUaGUgQ2xvdWRGb3JtYXRpb24gcHJvcGVydHkgdGhhdCBob2xkcyB0aGUgcmVzb3VyY2UncyBwaHlzaWNhbCBuYW1lICovXG4gIGNmbk5hbWU6IHN0cmluZztcbiAgLyoqIE1heGltdW0gYWxsb3dlZCBjaGFyYWN0ZXIgbGVuZ3RoIGZvciB0aGlzIHJlc291cmNlIHR5cGUgKi9cbiAgbWF4TGVuZ3RoOiBudW1iZXI7XG59XG5cbi8qKlxuICogRXh0ZW5zaW9uIHR5cGUgdG8gYWNjZXNzIGludGVybmFsIENsb3VkRm9ybWF0aW9uIHByb3BlcnRpZXMgb24gQ2ZuUmVzb3VyY2UuXG4gKlxuICogQ0RLIGRvZXMgbm90IHByb3ZpZGUgYSBwdWJsaWMgQVBJIHRvIHJlYWQgcmF3IENsb3VkRm9ybWF0aW9uIHByb3BlcnRpZXMgdGhhdCBoYXZlXG4gKiBiZWVuIHNldCBvbiBhIENmblJlc291cmNlLiBUaGUgcHJvcGVydGllcyBgX2NmblByb3BlcnRpZXNgIGFuZCBgY2ZuUHJvcGVydGllc2AgYXJlXG4gKiBwcm90ZWN0ZWQgYW5kIG9ubHkgYWNjZXNzaWJsZSB3aXRoaW4gdGhlIENmblJlc291cmNlIGNsYXNzIGhpZXJhcmNoeS5cbiAqXG4gKiBXZSBpbnZlc3RpZ2F0ZWQgdXNpbmcgQ0RLJ3MgcHVibGljIEFQSXMsIGJ1dCB0aGVyZSBpcyBubyBwdWJsaWMgbWV0aG9kIHRvIHJldHJpZXZlXG4gKiB0aGUgcmF3IHByb3BlcnR5IHZhbHVlcyB0aGF0IGhhdmUgYmVlbiBzZXQgKGUuZy4sIHZpYSBjb25zdHJ1Y3RvciBwcm9wcyBvciBhZGRQcm9wZXJ0eU92ZXJyaWRlKS5cbiAqIFRoZSBvbmx5IHB1YmxpYyBBUElzIGFyZSBmb3Igd3JpdGluZyAoYWRkUHJvcGVydHlPdmVycmlkZSwgYWRkUHJvcGVydHlEZWxldGlvbk92ZXJyaWRlKSBvclxuICogZ2V0dGluZyBhdHRyaWJ1dGUgcmVmZXJlbmNlcyAoZ2V0QXR0KSwgbm90IGZvciByZWFkaW5nIGxpdGVyYWwgcHJvcGVydHkgdmFsdWVzLlxuICpcbiAqIFRoaXMgdHlwZSBhc3NlcnRpb24gaXMgc2FmZSBiZWNhdXNlOlxuICogLSBXZSBvbmx5IHJlYWQgdGhlc2UgcHJvcGVydGllcywgbmV2ZXIgbW9kaWZ5IHRoZW1cbiAqIC0gV2UgbmVlZCB0byBjaGVjayBpZiBhIHVzZXIgZXhwbGljaXRseSBzZXQgYSBuYW1lIHByb3BlcnR5IGJlZm9yZSBhcHBseWluZyBvdXIgcHJlZml4XG4gKiAtIFRoZSBwcm9wZXJ0aWVzIGV4aXN0IGF0IHJ1bnRpbWUgYW5kIGFyZSBwYXJ0IG9mIENESydzIGludGVybmFsIGltcGxlbWVudGF0aW9uXG4gKi9cbnR5cGUgQ2ZuUmVzb3VyY2VXaXRoUHJvcHMgPSBDZm5SZXNvdXJjZSAmIHtcbiAgcmVhZG9ubHkgX2NmblByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgY2ZuUHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcblxuLyoqXG4gKiBNYXBzIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHR5cGVzIHRvIHRoZWlyIG5hbWUgcHJvcGVydHkgYW5kIEFXUyBsZW5ndGggbGltaXRzLlxuICogU291cmNlczogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXRlbXBsYXRlLXJlc291cmNlLXR5cGUtcmVmLmh0bWxcbiAqL1xuY29uc3QgUkVTT1VSQ0VfQ09ORklHOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU5hbWVDb25maWc+ID0ge1xuICAvLyBDb21wdXRlXG4gIFwiQVdTOjpMYW1iZGE6OkZ1bmN0aW9uXCI6IHsgY2ZuTmFtZTogXCJGdW5jdGlvbk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuXG4gIC8vIFN0b3JhZ2VcbiAgXCJBV1M6OlMzOjpCdWNrZXRcIjogeyBjZm5OYW1lOiBcIkJ1Y2tldE5hbWVcIiwgbWF4TGVuZ3RoOiA2MyB9LFxuICBcIkFXUzo6RHluYW1vREI6OlRhYmxlXCI6IHsgY2ZuTmFtZTogXCJUYWJsZU5hbWVcIiwgbWF4TGVuZ3RoOiAyNTUgfSxcbiAgXCJBV1M6OkR5bmFtb0RCOjpHbG9iYWxUYWJsZVwiOiB7IGNmbk5hbWU6IFwiVGFibGVOYW1lXCIsIG1heExlbmd0aDogMjU1IH0sXG5cbiAgLy8gTWVzc2FnaW5nXG4gIFwiQVdTOjpTUVM6OlF1ZXVlXCI6IHsgY2ZuTmFtZTogXCJRdWV1ZU5hbWVcIiwgbWF4TGVuZ3RoOiA4MCB9LFxuICBcIkFXUzo6U05TOjpUb3BpY1wiOiB7IGNmbk5hbWU6IFwiVG9waWNOYW1lXCIsIG1heExlbmd0aDogMjU2IH0sXG5cbiAgLy8gRXZlbnRpbmcgJiBPcmNoZXN0cmF0aW9uXG4gIFwiQVdTOjpFdmVudHM6OkV2ZW50QnVzXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogMjU2IH0sXG4gIFwiQVdTOjpFdmVudHM6OlJ1bGVcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6RXZlbnRzOjpDb25uZWN0aW9uXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcbiAgXCJBV1M6OlBpcGVzOjpQaXBlXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcbiAgXCJBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZVwiOiB7XG4gICAgY2ZuTmFtZTogXCJTdGF0ZU1hY2hpbmVOYW1lXCIsXG4gICAgbWF4TGVuZ3RoOiA4MCxcbiAgfSxcbiAgXCJBV1M6OlN0ZXBGdW5jdGlvbnM6OkFjdGl2aXR5XCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogODAgfSxcbiAgXCJBV1M6OlNjaGVkdWxlcjo6U2NoZWR1bGVcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6U2NoZWR1bGVyOjpTY2hlZHVsZUdyb3VwXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcblxuICAvLyBBUElcbiAgXCJBV1M6OkFwaUdhdGV3YXk6OlJlc3RBcGlcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAxMjggfSxcbiAgXCJBV1M6OkFwaUdhdGV3YXk6OlVzYWdlUGxhblwiOiB7IGNmbk5hbWU6IFwiVXNhZ2VQbGFuTmFtZVwiLCBtYXhMZW5ndGg6IDEyOCB9LFxuICBcIkFXUzo6QXBpR2F0ZXdheTo6QXBpS2V5XCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogMTI4IH0sXG4gIFwiQVdTOjpBcGlHYXRld2F5VjI6OkFwaVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDEyOCB9LFxuICBcIkFXUzo6QXBpR2F0ZXdheVYyOjpBdXRob3JpemVyXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogMTI4IH0sXG5cbiAgLy8gU2VjcmV0cyAmIENvbmZpZ1xuICBcIkFXUzo6U2VjcmV0c01hbmFnZXI6OlNlY3JldFwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDUxMiB9LFxuICBcIkFXUzo6U1NNOjpQYXJhbWV0ZXJcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAyMDQ4IH0sXG4gIFwiQVdTOjpBcHBDb25maWc6OkFwcGxpY2F0aW9uXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcbiAgXCJBV1M6OkFwcENvbmZpZzo6RW52aXJvbm1lbnRcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuXG4gIC8vIE5vdGlmaWNhdGlvbnNcbiAgXCJBV1M6Ok5vdGlmaWNhdGlvbnM6Ok5vdGlmaWNhdGlvbkNvbmZpZ3VyYXRpb25cIjoge1xuICAgIGNmbk5hbWU6IFwiTmFtZVwiLFxuICAgIG1heExlbmd0aDogNjQsXG4gIH0sXG5cbiAgLy8gT2JzZXJ2YWJpbGl0eVxuICBcIkFXUzo6TG9nczo6TG9nR3JvdXBcIjogeyBjZm5OYW1lOiBcIkxvZ0dyb3VwTmFtZVwiLCBtYXhMZW5ndGg6IDUxMiB9LFxuICBcIkFXUzo6Q2xvdWRXYXRjaDo6QWxhcm1cIjogeyBjZm5OYW1lOiBcIkFsYXJtTmFtZVwiLCBtYXhMZW5ndGg6IDI1NSB9LFxuXG4gIC8vIElBTVxuICBcIkFXUzo6SUFNOjpSb2xlXCI6IHsgY2ZuTmFtZTogXCJSb2xlTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlUHJlZml4QXNwZWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIHByZWZpeCB0byBhcHBseSB0byBhbGwgcmVzb3VyY2UgbmFtZXMuXG4gICAqIGUuZy4gJ215YXBwLXByb2QnIOKGkiAnbXlhcHAtcHJvZC1vcmRlcnMnXG4gICAqL1xuICBwcmVmaXg6IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2UgdHlwZXMgdG8gc2tpcCBlbnRpcmVseS5cbiAgICogZS5nLiBbJ0FXUzo6SUFNOjpSb2xlJ10gdG8gbGVhdmUgSUFNIHJvbGUgbmFtZXMgdW50b3VjaGVkLlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKi9cbiAgZXhjbHVkZT86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENESyBBc3BlY3QgdGhhdCBhdXRvbWF0aWNhbGx5IHByZWZpeGVzIHBoeXNpY2FsIHJlc291cmNlIG5hbWVzIGFjcm9zcyBBV1MgcmVzb3VyY2VzLlxuICpcbiAqIEByZW1hcmtzXG4gKiAqKkNyaXRpY2FsIEltcGxlbWVudGF0aW9uIE5vdGVzOioqXG4gKlxuICogMS4gKipTdGFnZSBTeW50aGVzaXMgQm91bmRhcmllcyoqOlxuICogICAgLSBDREsgYFN0YWdlYCBjb25zdHJ1Y3RzIGNyZWF0ZSBzeW50aGVzaXMgYm91bmRhcmllcyB0aGF0IHByZXZlbnQgQXBwLWxldmVsIGFzcGVjdHNcbiAqICAgICAgZnJvbSB0cmF2ZXJzaW5nIGludG8gdGhlbVxuICogICAgLSBUaGlzIGFzcGVjdCBNVVNUIGJlIGFwcGxpZWQgdG8gZWFjaCBTdGFnZSBpbmRpdmlkdWFsbHksIG5vdCB0byB0aGUgQXBwXG4gKiAgICAtIEV4YW1wbGU6IGBBc3BlY3RzLm9mKHN0YWdlKS5hZGQobmV3IFJlc291cmNlUHJlZml4QXNwZWN0KHsuLi59KSlgXG4gKlxuICogMi4gKipQcm9wZXJ0eSBOYW1lIENhc2luZyoqOlxuICogICAgLSBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0aWVzIHVzZSBQYXNjYWxDYXNlIChlLmcuLCBgRnVuY3Rpb25OYW1lYCwgYEJ1Y2tldE5hbWVgKVxuICogICAgLSBVc2luZyBjYW1lbENhc2UgKGUuZy4sIGBmdW5jdGlvbk5hbWVgKSB3aWxsIGNhdXNlIGVycm9ycyB3aXRoIHZlcnNpb25pbmcgYXNwZWN0c1xuICogICAgLSBXaGVuIHVzaW5nIGBhZGRQcm9wZXJ0eU92ZXJyaWRlKClgLCBhbHdheXMgdXNlIHRoZSBleGFjdCBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0eSBuYW1lXG4gKlxuICogMy4gKipBc3BlY3QgUHJpb3JpdHkgd2l0aCBWZXJzaW9uaW5nKio6XG4gKiAgICAtIFdoZW4gY29tYmluaW5nIHdpdGggTGFtYmRhQW5kU3RlcEZ1bmN0aW9uVmVyc2lvbmluZ0FzcGVjdCwgYXBwbHkgdGhpcyBhc3BlY3QgQkVGT1JFIHZlcnNpb25pbmdcbiAqICAgIC0gVXNlIENESydzIHByaW9yaXR5IHN5c3RlbTogYEFzcGVjdHMub2Yoc3RhZ2UpLmFkZChwcmVmaXhBc3BlY3QsIHsgcHJpb3JpdHk6IDEwMCB9KWBcbiAqICAgIC0gVGhlbjogYEFzcGVjdHMub2Yoc3RhZ2UpLmFkZCh2ZXJzaW9uaW5nQXNwZWN0LCB7IHByaW9yaXR5OiAyMDAgfSlgXG4gKiAgICAtIExvd2VyIHByaW9yaXR5IG51bWJlcnMgcnVuIGZpcnN0XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENvcnJlY3QgdXNhZ2Ugd2l0aCBzdGFnaW5nXG4gKiBjb25zdCBzdGFnZSA9IG5ldyBBcHBsaWNhdGlvblN0YWdlKGFwcCwgJ3Byb2QnKTtcbiAqIEFzcGVjdHMub2Yoc3RhZ2UpLmFkZChuZXcgUmVzb3VyY2VQcmVmaXhBc3BlY3QoeyBwcmVmaXg6ICdteWFwcCcgfSksIHsgcHJpb3JpdHk6IDEwMCB9KTtcbiAqIEFzcGVjdHMub2Yoc3RhZ2UpLmFkZChuZXcgTGFtYmRhQW5kU3RlcEZ1bmN0aW9uVmVyc2lvbmluZ0FzcGVjdCgpLCB7IHByaW9yaXR5OiAyMDAgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc291cmNlUHJlZml4QXNwZWN0IGltcGxlbWVudHMgSUFzcGVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhjbHVkZTogU2V0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFJlc291cmNlUHJlZml4QXNwZWN0UHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLnByZWZpeCB8fCAhL15bYS16MC05LV0rJC8udGVzdChwcm9wcy5wcmVmaXgpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUmVzb3VyY2VQcmVmaXhBc3BlY3Q6IHByZWZpeCBtdXN0IGNvbnRhaW4gb25seSBsb3dlcmNhc2UgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIGh5cGhlbnMsIGdvdCBcIiR7cHJvcHMucHJlZml4fVwiYFxuICAgICAgKTtcblxuICAgIHRoaXMucHJlZml4ID0gcHJvcHMucHJlZml4O1xuICAgIHRoaXMuZXhjbHVkZSA9IG5ldyBTZXQocHJvcHMuZXhjbHVkZSA/PyBbXSk7XG4gIH1cblxuICB2aXNpdChub2RlOiBJQ29uc3RydWN0KSB7XG4gICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIENmblJlc291cmNlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gbm9kZS5jZm5SZXNvdXJjZVR5cGU7XG4gICAgY29uc3QgY29uZmlnID0gUkVTT1VSQ0VfQ09ORklHW3Jlc291cmNlVHlwZV07XG5cbiAgICBpZiAoIWNvbmZpZyB8fCB0aGlzLmV4Y2x1ZGUuaGFzKHJlc291cmNlVHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNmbk5hbWUsIG1heExlbmd0aCB9ID0gY29uZmlnO1xuICAgIGNvbnN0IGNmblByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID1cbiAgICAgIChub2RlIGFzIENmblJlc291cmNlV2l0aFByb3BzKS5fY2ZuUHJvcGVydGllcyA/P1xuICAgICAgKG5vZGUgYXMgQ2ZuUmVzb3VyY2VXaXRoUHJvcHMpLmNmblByb3BlcnRpZXMgPz9cbiAgICAgIHt9O1xuXG4gICAgY29uc3QgYmFzZU5hbWUgPSB0aGlzLnJlc29sdmVCYXNlTmFtZShub2RlLCBjZm5OYW1lLCBjZm5Qcm9wZXJ0aWVzKTtcblxuICAgIGlmICh0aGlzLnNob3VsZFNraXBSZXNvdXJjZShyZXNvdXJjZVR5cGUsIGJhc2VOYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQWxyZWFkeVByZWZpeGVkKGJhc2VOYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeGVkTmFtZSA9IHRoaXMuYnVpbGRQcmVmaXhlZE5hbWUoXG4gICAgICBiYXNlTmFtZSxcbiAgICAgIHJlc291cmNlVHlwZSxcbiAgICAgIGNmblByb3BlcnRpZXNcbiAgICApO1xuXG4gICAgLy8gVHJ1bmNhdGlvbiBhcHBsaWVzIHRvIGFsbCBvdmVyZmxvd3Mg4oCUIGluY2x1ZGluZyB1c2VyLXNldCBuYW1lcyDigJQgYmVjYXVzZSBMM1xuICAgIC8vIGNvbnN0cnVjdHMgY2FuIGdlbmVyYXRlIG5hbWVzIHRoZSB1c2VyIGhhcyBubyBkaXJlY3QgY29udHJvbCBvdmVyLlxuICAgIGNvbnN0IGZpbmFsTmFtZSA9IHRoaXMudHJ1bmNhdGVUb0ZpdChwcmVmaXhlZE5hbWUsIG1heExlbmd0aCwgbm9kZSk7XG5cbiAgICBjb25zdCBoYXNFcnJvciA9IHRoaXMudmFsaWRhdGVSZXNvdXJjZU5hbWUoZmluYWxOYW1lLCByZXNvdXJjZVR5cGUsIG5vZGUpO1xuXG4gICAgaWYgKGhhc0Vycm9yKSByZXR1cm47XG5cbiAgICBub2RlLmFkZFByb3BlcnR5T3ZlcnJpZGUoY2ZuTmFtZSwgZmluYWxOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSByZXNvdXJjZSBzaG91bGQgYmUgc2tpcHBlZCBmcm9tIHByZWZpeGluZyBiYXNlZCBvblxuICAgKiByZXNvdXJjZS10eXBlLXNwZWNpZmljIHJ1bGVzIChlLmcuLCBBV1MtcmVzZXJ2ZWQgbmFtaW5nIGNvbnZlbnRpb25zKS5cbiAgICovXG4gIHByaXZhdGUgc2hvdWxkU2tpcFJlc291cmNlKGNmblJlc291cmNlVHlwZTogc3RyaW5nLCBiYXNlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OkxvZ3M6OkxvZ0dyb3VwXCIgJiYgYmFzZU5hbWUuc3RhcnRzV2l0aChcIi9hd3MvXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNBbHJlYWR5UHJlZml4ZWQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5hbWUuc3RhcnRzV2l0aChgJHt0aGlzLnByZWZpeH0tYCkgfHwgbmFtZS5zdGFydHNXaXRoKGAvJHt0aGlzLnByZWZpeH0vYClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBiYXNlIG5hbWUgZm9yIGEgcmVzb3VyY2UgYnkgY2hlY2tpbmcgZXhwbGljaXRseSBzZXQgQ0ZOIHByb3BlcnRpZXNcbiAgICogZmlyc3QsIHRoZW4gZmFsbGluZyBiYWNrIHRvIGRlcml2aW5nIGEgbmFtZSBmcm9tIHRoZSBsb2dpY2FsIElELlxuICAgKiBDREsgc3RvcmVzIEwxIHByb3BlcnRpZXMgaW4gY2FtZWxDYXNlIGludGVybmFsbHksIHNvIGJvdGggY2FzaW5ncyBhcmUgY2hlY2tlZC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUJhc2VOYW1lKFxuICAgIG5vZGU6IENmblJlc291cmNlLFxuICAgIGNmbk5hbWU6IHN0cmluZyxcbiAgICBjZm5Qcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApIHtcbiAgICBjb25zdCBjYW1lbENmbk5hbWUgPSBjZm5OYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgY2ZuTmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCByYXdOYW1lID0gY2ZuUHJvcGVydGllc1tjZm5OYW1lXSA/PyBjZm5Qcm9wZXJ0aWVzW2NhbWVsQ2ZuTmFtZV07XG4gICAgaWYgKHR5cGVvZiByYXdOYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gcmF3TmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2dpY2FsSWQgPSBTdGFjay5vZihub2RlKS5nZXRMb2dpY2FsSWQobm9kZSk7XG4gICAgcmV0dXJuIGxvZ2ljYWxJZFxuICAgICAgLnJlcGxhY2UoL1teYS16QS1aMC05XSsvZywgXCItXCIpIC8vIG5vbi1hbHBoYW51bWVyaWMg4oaSIGRhc2hcbiAgICAgIC5yZXBsYWNlKC9eLSt8LSskL2csIFwiXCIpOyAvLyB0cmltIGxlYWRpbmcvdHJhaWxpbmcgZGFzaGVzXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBwcmVmaXhlZCBuYW1lLCBoYW5kbGluZyBzcGVjaWFsIGNhc2VzIGZvciBzcGVjaWZpYyByZXNvdXJjZSB0eXBlcy5cbiAgICpcbiAgICogQHBhcmFtIGJhc2VOYW1lIC0gVGhlIGJhc2UgcmVzb3VyY2UgbmFtZSAod2l0aG91dCBwcmVmaXgpXG4gICAqIEBwYXJhbSBjZm5SZXNvdXJjZVR5cGUgLSBUaGUgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgdHlwZVxuICAgKiBAcGFyYW0gY2ZuUHJvcGVydGllcyAtIFRoZSBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSBwcm9wZXJ0aWVzXG4gICAqIEByZXR1cm5zIFRoZSBmaW5hbCBwcmVmaXhlZCBuYW1lIHdpdGggYW55IHNwZWNpYWwgY2FzZSBoYW5kbGluZyBhcHBsaWVkXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUHJlZml4ZWROYW1lKFxuICAgIGJhc2VOYW1lOiBzdHJpbmcsXG4gICAgY2ZuUmVzb3VyY2VUeXBlOiBzdHJpbmcsXG4gICAgY2ZuUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBGSUZPIHF1ZXVlcyBtdXN0IGVuZCB3aXRoIC5maWZvIHN1ZmZpeFxuICAgIGlmIChcbiAgICAgIGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlNRUzo6UXVldWVcIiAmJlxuICAgICAgY2ZuUHJvcGVydGllcy5maWZvUXVldWUgPT09IHRydWUgJiZcbiAgICAgICFiYXNlTmFtZS5lbmRzV2l0aChcIi5maWZvXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9LSR7YmFzZU5hbWV9LmZpZm9gO1xuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgY2FzZTogRklGTyB0b3BpY3MgbXVzdCBlbmQgd2l0aCAuZmlmbyBzdWZmaXhcbiAgICBpZiAoXG4gICAgICBjZm5SZXNvdXJjZVR5cGUgPT09IFwiQVdTOjpTTlM6OlRvcGljXCIgJiZcbiAgICAgIGNmblByb3BlcnRpZXMuZmlmb1RvcGljID09PSB0cnVlICYmXG4gICAgICAhYmFzZU5hbWUuZW5kc1dpdGgoXCIuZmlmb1wiKVxuICAgICkge1xuICAgICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke2Jhc2VOYW1lfS5maWZvYDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IFNTTSBwYXJhbWV0ZXIgbmFtZXMgdXNlIHBhdGgtc3R5bGUgcHJlZml4XG4gICAgaWYgKGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlNTTTo6UGFyYW1ldGVyXCIpIHtcbiAgICAgIHJldHVybiBgLyR7dGhpcy5wcmVmaXh9LyR7YmFzZU5hbWV9YDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IFMzIGJ1Y2tldCBuYW1lIGJlIGxvd2VyY2FzZSBvbmx5XG4gICAgaWYgKGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlMzOjpCdWNrZXRcIikge1xuICAgICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke2Jhc2VOYW1lfWAudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiBzaW1wbGUgcHJlZml4XG4gICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke2Jhc2VOYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogVHJ1bmNhdGVzIGEgcHJlZml4ZWQgbmFtZSB0byBmaXQgd2l0aGluIG1heExlbmd0aCBieSBoYXNoaW5nIHRoZSBvcmlnaW5hbFxuICAgKiBmb3IgdW5pcXVlbmVzcy4gRW1pdHMgYSBDREsgd2FybmluZyB3aGVuIHRydW5jYXRpb24gb2NjdXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB0cnVuY2F0ZVRvRml0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBtYXhMZW5ndGg6IG51bWJlcixcbiAgICBub2RlOiBJQ29uc3RydWN0XG4gICk6IHN0cmluZyB7XG4gICAgaWYgKG5hbWUubGVuZ3RoIDw9IG1heExlbmd0aCkgcmV0dXJuIG5hbWU7XG5cbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUobmFtZSkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDgpO1xuXG4gICAgLy8gUHJlc2VydmUgLmZpZm8gc3VmZml4IOKAlCBBV1MgcmVxdWlyZXMgaXQgYXQgdGhlIGVuZCBvZiBGSUZPIHJlc291cmNlIG5hbWVzXG4gICAgY29uc3Qgc3VmZml4ID0gbmFtZS5lbmRzV2l0aChcIi5maWZvXCIpID8gXCIuZmlmb1wiIDogXCJcIjtcbiAgICBjb25zdCBuYW1lV2l0aG91dFN1ZmZpeCA9IHN1ZmZpeCA/IG5hbWUuc2xpY2UoMCwgLXN1ZmZpeC5sZW5ndGgpIDogbmFtZTtcblxuICAgIC8vIDEgYWNjb3VudHMgZm9yIHRoZSBkYXNoIHNlcGFyYXRvciBiZWZvcmUgdGhlIGhhc2hcbiAgICBjb25zdCBidWRnZXQgPSBtYXhMZW5ndGggLSBoYXNoLmxlbmd0aCAtIDEgLSBzdWZmaXgubGVuZ3RoO1xuICAgIGNvbnN0IHRydW5jYXRlZCA9IG5hbWVXaXRob3V0U3VmZml4LnNsaWNlKDAsIGJ1ZGdldCkgKyBcIi1cIiArIGhhc2ggKyBzdWZmaXg7XG5cbiAgICBBbm5vdGF0aW9ucy5vZihub2RlKS5hZGRXYXJuaW5nKFxuICAgICAgYFtSZXNvdXJjZVByZWZpeEFzcGVjdF0gXCIke25hbWV9XCIgKCR7bmFtZS5sZW5ndGh9IGNoYXJzKSBleGNlZWRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIG9mICR7bWF4TGVuZ3RofS4gYCArXG4gICAgICAgIGBOYW1lIGhhcyBiZWVuIHRydW5jYXRlZCB0byBcIiR7dHJ1bmNhdGVkfVwiLiBTaG9ydGVuIHRoZSByZXNvdXJjZSBiYXNlIG5hbWUgb3IgeW91ciBwcmVmaXggKFwiJHt0aGlzLnByZWZpeH1cIikgdG8gYXZvaWQgdHJ1bmNhdGlvbi5gXG4gICAgKTtcblxuICAgIHJldHVybiB0cnVuY2F0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHJlc291cmNlLXNwZWNpZmljIHN0cnVjdHVyYWwgbmFtaW5nIHJlcXVpcmVtZW50cyB0aGF0IEFXUyBlbmZvcmNlcy5cbiAgICogTGVuZ3RoIHZpb2xhdGlvbnMgYXJlIGhhbmRsZWQgdXBzdHJlYW0gYnkgdHJ1bmNhdGVUb0ZpdC5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSZXNvdXJjZU5hbWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNmblJlc291cmNlVHlwZTogc3RyaW5nLFxuICAgIG5vZGU6IElDb25zdHJ1Y3RcbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG5cbiAgICBpZiAoY2ZuUmVzb3VyY2VUeXBlID09PSBcIkFXUzo6UzM6OkJ1Y2tldFwiKSB7XG4gICAgICBpZiAobmFtZSAhPT0gbmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIEFubm90YXRpb25zLm9mKG5vZGUpLmFkZEVycm9yKFxuICAgICAgICAgIGBbUmVzb3VyY2VQcmVmaXhBc3BlY3RdIFMzIGJ1Y2tldCBuYW1lIFwiJHtuYW1lfVwiIGNvbnRhaW5zIHVwcGVyY2FzZSBsZXR0ZXJzLiBgICtcbiAgICAgICAgICAgIGBCdWNrZXQgbmFtZXMgbXVzdCBiZSBsb3dlcmNhc2Ugb25seS5gXG4gICAgICAgICk7XG4gICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoXCJfXCIpKSB7XG4gICAgICAgIEFubm90YXRpb25zLm9mKG5vZGUpLmFkZEVycm9yKFxuICAgICAgICAgIGBbUmVzb3VyY2VQcmVmaXhBc3BlY3RdIFMzIGJ1Y2tldCBuYW1lIFwiJHtuYW1lfVwiIGNvbnRhaW5zIHVuZGVyc2NvcmVzLiBgICtcbiAgICAgICAgICAgIGBCdWNrZXQgbmFtZXMgY2Fubm90IGNvbnRhaW4gdW5kZXJzY29yZXMuIFVzZSBoeXBoZW5zIGluc3RlYWQuYFxuICAgICAgICApO1xuICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhc0Vycm9yO1xuICB9XG59XG4iXX0=
|
|
235
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtcHJlZml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVzb3VyY2UtcHJlZml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE4RTtBQUU5RSxtQ0FBb0M7QUFDcEMscUVBQWlFO0FBb0NqRTs7O0dBR0c7QUFDSCxNQUFNLGVBQWUsR0FBdUM7SUFDMUQsVUFBVTtJQUNWLHVCQUF1QixFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBRW5FLFVBQVU7SUFDVixpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUMzRCxzQkFBc0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRTtJQUNoRSw0QkFBNEIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRTtJQUV0RSxZQUFZO0lBQ1osaUJBQWlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDMUQsaUJBQWlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUU7SUFFM0QsMkJBQTJCO0lBQzNCLHVCQUF1QixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQzVELG1CQUFtQixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3ZELHlCQUF5QixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQzdELGtCQUFrQixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3RELGtDQUFrQyxFQUFFO1FBQ2xDLE9BQU8sRUFBRSxrQkFB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QUssQ0FBQztRQUVyQixJQUFJLGVBQWUsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1lBQzFDLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUNoQyx5QkFBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQzNCLDBDQUEwQyxJQUFJLGdDQUFnQztvQkFDNUUsc0NBQXNDLENBQ3pDLENBQUM7Z0JBQ0YsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNsQixDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLHlCQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FDM0IsMENBQTBDLElBQUksMEJBQTBCO29CQUN0RSwrREFBK0QsQ0FDbEUsQ0FBQztnQkFDRixRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGO0FBdk5ELG9EQXVOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBDZm5SZXNvdXJjZSwgSUFzcGVjdCwgU3RhY2ssIFRva2VuIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBpc0Nka01hbmFnZWRTaW5nbGV0b24gfSBmcm9tIFwiLi9jZGstbWFuYWdlZC1zaW5nbGV0b25zXCI7XG5cbmludGVyZmFjZSBSZXNvdXJjZU5hbWVDb25maWcge1xuICAvKiogVGhlIENsb3VkRm9ybWF0aW9uIHByb3BlcnR5IHRoYXQgaG9sZHMgdGhlIHJlc291cmNlJ3MgcGh5c2ljYWwgbmFtZSAqL1xuICBjZm5OYW1lOiBzdHJpbmc7XG4gIC8qKiBNYXhpbXVtIGFsbG93ZWQgY2hhcmFjdGVyIGxlbmd0aCBmb3IgdGhpcyByZXNvdXJjZSB0eXBlICovXG4gIG1heExlbmd0aDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4dGVuc2lvbiB0eXBlIHRvIGFjY2VzcyBpbnRlcm5hbCBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0aWVzIG9uIENmblJlc291cmNlLlxuICpcbiAqIENESyBkb2VzIG5vdCBwcm92aWRlIGEgcHVibGljIEFQSSB0byByZWFkIHJhdyBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0aWVzIHRoYXQgaGF2ZVxuICogYmVlbiBzZXQgb24gYSBDZm5SZXNvdXJjZS4gVGhlIHByb3BlcnRpZXMgYF9jZm5Qcm9wZXJ0aWVzYCBhbmQgYGNmblByb3BlcnRpZXNgIGFyZVxuICogcHJvdGVjdGVkIGFuZCBvbmx5IGFjY2Vzc2libGUgd2l0aGluIHRoZSBDZm5SZXNvdXJjZSBjbGFzcyBoaWVyYXJjaHkuXG4gKlxuICogV2UgaW52ZXN0aWdhdGVkIHVzaW5nIENESydzIHB1YmxpYyBBUElzLCBidXQgdGhlcmUgaXMgbm8gcHVibGljIG1ldGhvZCB0byByZXRyaWV2ZVxuICogdGhlIHJhdyBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gc2V0IChlLmcuLCB2aWEgY29uc3RydWN0b3IgcHJvcHMgb3IgYWRkUHJvcGVydHlPdmVycmlkZSkuXG4gKiBUaGUgb25seSBwdWJsaWMgQVBJcyBhcmUgZm9yIHdyaXRpbmcgKGFkZFByb3BlcnR5T3ZlcnJpZGUsIGFkZFByb3BlcnR5RGVsZXRpb25PdmVycmlkZSkgb3JcbiAqIGdldHRpbmcgYXR0cmlidXRlIHJlZmVyZW5jZXMgKGdldEF0dCksIG5vdCBmb3IgcmVhZGluZyBsaXRlcmFsIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBUaGlzIHR5cGUgYXNzZXJ0aW9uIGlzIHNhZmUgYmVjYXVzZTpcbiAqIC0gV2Ugb25seSByZWFkIHRoZXNlIHByb3BlcnRpZXMsIG5ldmVyIG1vZGlmeSB0aGVtXG4gKiAtIFdlIG5lZWQgdG8gY2hlY2sgaWYgYSB1c2VyIGV4cGxpY2l0bHkgc2V0IGEgbmFtZSBwcm9wZXJ0eSBiZWZvcmUgYXBwbHlpbmcgb3VyIHByZWZpeFxuICogLSBUaGUgcHJvcGVydGllcyBleGlzdCBhdCBydW50aW1lIGFuZCBhcmUgcGFydCBvZiBDREsncyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvblxuICovXG50eXBlIENmblJlc291cmNlV2l0aFByb3BzID0gQ2ZuUmVzb3VyY2UgJiB7XG4gIHJlYWRvbmx5IF9jZm5Qcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IGNmblByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn07XG5cbmludGVyZmFjZSBSZXNvdXJjZU5hbWVzIHtcbiAgbG9naWNhbE5hbWU6IHN0cmluZztcbiAgcmF3TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE1hcHMgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgdHlwZXMgdG8gdGhlaXIgbmFtZSBwcm9wZXJ0eSBhbmQgQVdTIGxlbmd0aCBsaW1pdHMuXG4gKiBTb3VyY2VzOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtdGVtcGxhdGUtcmVzb3VyY2UtdHlwZS1yZWYuaHRtbFxuICovXG5jb25zdCBSRVNPVVJDRV9DT05GSUc6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTmFtZUNvbmZpZz4gPSB7XG4gIC8vIENvbXB1dGVcbiAgXCJBV1M6OkxhbWJkYTo6RnVuY3Rpb25cIjogeyBjZm5OYW1lOiBcIkZ1bmN0aW9uTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG5cbiAgLy8gU3RvcmFnZVxuICBcIkFXUzo6UzM6OkJ1Y2tldFwiOiB7IGNmbk5hbWU6IFwiQnVja2V0TmFtZVwiLCBtYXhMZW5ndGg6IDYzIH0sXG4gIFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcIjogeyBjZm5OYW1lOiBcIlRhYmxlTmFtZVwiLCBtYXhMZW5ndGg6IDI1NSB9LFxuICBcIkFXUzo6RHluYW1vREI6Okdsb2JhbFRhYmxlXCI6IHsgY2ZuTmFtZTogXCJUYWJsZU5hbWVcIiwgbWF4TGVuZ3RoOiAyNTUgfSxcblxuICAvLyBNZXNzYWdpbmdcbiAgXCJBV1M6OlNRUzo6UXVldWVcIjogeyBjZm5OYW1lOiBcIlF1ZXVlTmFtZVwiLCBtYXhMZW5ndGg6IDgwIH0sXG4gIFwiQVdTOjpTTlM6OlRvcGljXCI6IHsgY2ZuTmFtZTogXCJUb3BpY05hbWVcIiwgbWF4TGVuZ3RoOiAyNTYgfSxcblxuICAvLyBFdmVudGluZyAmIE9yY2hlc3RyYXRpb25cbiAgXCJBV1M6OkV2ZW50czo6RXZlbnRCdXNcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAyNTYgfSxcbiAgXCJBV1M6OkV2ZW50czo6UnVsZVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG4gIFwiQVdTOjpFdmVudHM6OkNvbm5lY3Rpb25cIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6UGlwZXM6OlBpcGVcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lXCI6IHtcbiAgICBjZm5OYW1lOiBcIlN0YXRlTWFjaGluZU5hbWVcIixcbiAgICBtYXhMZW5ndGg6IDgwLFxuICB9LFxuICBcIkFXUzo6U3RlcEZ1bmN0aW9uczo6QWN0aXZpdHlcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA4MCB9LFxuICBcIkFXUzo6U2NoZWR1bGVyOjpTY2hlZHVsZVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG4gIFwiQVdTOjpTY2hlZHVsZXI6OlNjaGVkdWxlR3JvdXBcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuXG4gIC8vIEFQSVxuICBcIkFXUzo6QXBpR2F0ZXdheTo6UmVzdEFwaVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDEyOCB9LFxuICBcIkFXUzo6QXBpR2F0ZXdheTo6VXNhZ2VQbGFuXCI6IHsgY2ZuTmFtZTogXCJVc2FnZVBsYW5OYW1lXCIsIG1heExlbmd0aDogMTI4IH0sXG4gIFwiQVdTOjpBcGlHYXRld2F5OjpBcGlLZXlcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAxMjggfSxcbiAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6QXBpXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogMTI4IH0sXG4gIFwiQVdTOjpBcGlHYXRld2F5VjI6OkF1dGhvcml6ZXJcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAxMjggfSxcblxuICAvLyBTZWNyZXRzICYgQ29uZmlnXG4gIFwiQVdTOjpTZWNyZXRzTWFuYWdlcjo6U2VjcmV0XCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNTEyIH0sXG4gIFwiQVdTOjpTU006OlBhcmFtZXRlclwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDIwNDggfSxcbiAgXCJBV1M6OkFwcENvbmZpZzo6QXBwbGljYXRpb25cIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6QXBwQ29uZmlnOjpFbnZpcm9ubWVudFwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG5cbiAgLy8gTm90aWZpY2F0aW9uc1xuICBcIkFXUzo6Tm90aWZpY2F0aW9uczo6Tm90aWZpY2F0aW9uQ29uZmlndXJhdGlvblwiOiB7XG4gICAgY2ZuTmFtZTogXCJOYW1lXCIsXG4gICAgbWF4TGVuZ3RoOiA2NCxcbiAgfSxcblxuICAvLyBPYnNlcnZhYmlsaXR5XG4gIFwiQVdTOjpMb2dzOjpMb2dHcm91cFwiOiB7IGNmbk5hbWU6IFwiTG9nR3JvdXBOYW1lXCIsIG1heExlbmd0aDogNTEyIH0sXG4gIFwiQVdTOjpDbG91ZFdhdGNoOjpBbGFybVwiOiB7IGNmbk5hbWU6IFwiQWxhcm1OYW1lXCIsIG1heExlbmd0aDogMjU1IH0sXG5cbiAgLy8gSUFNXG4gIFwiQVdTOjpJQU06OlJvbGVcIjogeyBjZm5OYW1lOiBcIlJvbGVOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VQcmVmaXhBc3BlY3RQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IHRvIGFwcGx5IHRvIGFsbCByZXNvdXJjZSBuYW1lcy5cbiAgICogZS5nLiAnbXlhcHAtcHJvZCcg4oaSICdteWFwcC1wcm9kLW9yZGVycydcbiAgICovXG4gIHByZWZpeDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSB0eXBlcyB0byBza2lwIGVudGlyZWx5LlxuICAgKiBlLmcuIFsnQVdTOjpJQU06OlJvbGUnXSB0byBsZWF2ZSBJQU0gcm9sZSBuYW1lcyB1bnRvdWNoZWQuXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICBleGNsdWRlPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ0RLIEFzcGVjdCB0aGF0IGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgcGh5c2ljYWwgcmVzb3VyY2UgbmFtZXMgYWNyb3NzIEFXUyByZXNvdXJjZXMuXG4gKlxuICogQHJlbWFya3NcbiAqICoqQ3JpdGljYWwgSW1wbGVtZW50YXRpb24gTm90ZXM6KipcbiAqXG4gKiAxLiAqKlN0YWdlIFN5bnRoZXNpcyBCb3VuZGFyaWVzKio6XG4gKiAgICAtIENESyBgU3RhZ2VgIGNvbnN0cnVjdHMgY3JlYXRlIHN5bnRoZXNpcyBib3VuZGFyaWVzIHRoYXQgcHJldmVudCBBcHAtbGV2ZWwgYXNwZWN0c1xuICogICAgICBmcm9tIHRyYXZlcnNpbmcgaW50byB0aGVtXG4gKiAgICAtIFRoaXMgYXNwZWN0IE1VU1QgYmUgYXBwbGllZCB0byBlYWNoIFN0YWdlIGluZGl2aWR1YWxseSwgbm90IHRvIHRoZSBBcHBcbiAqICAgIC0gRXhhbXBsZTogYEFzcGVjdHMub2Yoc3RhZ2UpLmFkZChuZXcgUmVzb3VyY2VQcmVmaXhBc3BlY3Qoey4uLn0pKWBcbiAqXG4gKiAyLiAqKlByb3BlcnR5IE5hbWUgQ2FzaW5nKio6XG4gKiAgICAtIENsb3VkRm9ybWF0aW9uIHByb3BlcnRpZXMgdXNlIFBhc2NhbENhc2UgKGUuZy4sIGBGdW5jdGlvbk5hbWVgLCBgQnVja2V0TmFtZWApXG4gKiAgICAtIFVzaW5nIGNhbWVsQ2FzZSAoZS5nLiwgYGZ1bmN0aW9uTmFtZWApIHdpbGwgY2F1c2UgZXJyb3JzIHdpdGggdmVyc2lvbmluZyBhc3BlY3RzXG4gKiAgICAtIFdoZW4gdXNpbmcgYGFkZFByb3BlcnR5T3ZlcnJpZGUoKWAsIGFsd2F5cyB1c2UgdGhlIGV4YWN0IENsb3VkRm9ybWF0aW9uIHByb3BlcnR5IG5hbWVcbiAqXG4gKiAzLiAqKkFzcGVjdCBQcmlvcml0eSB3aXRoIFZlcnNpb25pbmcqKjpcbiAqICAgIC0gV2hlbiBjb21iaW5pbmcgd2l0aCBMYW1iZGFBbmRTdGVwRnVuY3Rpb25WZXJzaW9uaW5nQXNwZWN0LCBhcHBseSB0aGlzIGFzcGVjdCBCRUZPUkUgdmVyc2lvbmluZ1xuICogICAgLSBVc2UgQ0RLJ3MgcHJpb3JpdHkgc3lzdGVtOiBgQXNwZWN0cy5vZihzdGFnZSkuYWRkKHByZWZpeEFzcGVjdCwgeyBwcmlvcml0eTogMTAwIH0pYFxuICogICAgLSBUaGVuOiBgQXNwZWN0cy5vZihzdGFnZSkuYWRkKHZlcnNpb25pbmdBc3BlY3QsIHsgcHJpb3JpdHk6IDIwMCB9KWBcbiAqICAgIC0gTG93ZXIgcHJpb3JpdHkgbnVtYmVycyBydW4gZmlyc3RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ29ycmVjdCB1c2FnZSB3aXRoIHN0YWdpbmdcbiAqIGNvbnN0IHN0YWdlID0gbmV3IEFwcGxpY2F0aW9uU3RhZ2UoYXBwLCAncHJvZCcpO1xuICogQXNwZWN0cy5vZihzdGFnZSkuYWRkKG5ldyBSZXNvdXJjZVByZWZpeEFzcGVjdCh7IHByZWZpeDogJ215YXBwJyB9KSwgeyBwcmlvcml0eTogMTAwIH0pO1xuICogQXNwZWN0cy5vZihzdGFnZSkuYWRkKG5ldyBMYW1iZGFBbmRTdGVwRnVuY3Rpb25WZXJzaW9uaW5nQXNwZWN0KCksIHsgcHJpb3JpdHk6IDIwMCB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VQcmVmaXhBc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmaXg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBleGNsdWRlOiBTZXQ8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogUmVzb3VyY2VQcmVmaXhBc3BlY3RQcm9wcykge1xuICAgIGlmICghcHJvcHMucHJlZml4IHx8ICEvXlthLXowLTktXSskLy50ZXN0KHByb3BzLnByZWZpeCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBSZXNvdXJjZVByZWZpeEFzcGVjdDogcHJlZml4IG11c3QgY29udGFpbiBvbmx5IGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgaHlwaGVucywgZ290IFwiJHtwcm9wcy5wcmVmaXh9XCJgXG4gICAgICApO1xuXG4gICAgdGhpcy5wcmVmaXggPSBwcm9wcy5wcmVmaXg7XG4gICAgdGhpcy5leGNsdWRlID0gbmV3IFNldChwcm9wcy5leGNsdWRlID8/IFtdKTtcbiAgfVxuXG4gIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpIHtcbiAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgQ2ZuUmVzb3VyY2UpKSByZXR1cm47XG5cbiAgICAvLyBDREstbWFuYWdlZCBzaW5nbGV0b24vZnJhbWV3b3JrIHJlc291cmNlcyBtdXN0IGtlZXAgdGhlaXJcbiAgICAvLyBDbG91ZEZvcm1hdGlvbi1nZW5lcmF0ZWQgcGh5c2ljYWwgbmFtZXMuIFBpbm5pbmcgYSBkZXRlcm1pbmlzdGljIG5hbWUgb250b1xuICAgIC8vIHRoZW0gKGUuZy4gdGhlIEJ1Y2tldERlcGxveW1lbnQgaGFuZGxlcikgcmVtb3ZlcyB0aGUgcmFuZG9tLXN1ZmZpeFxuICAgIC8vIG9ycGhhbi1hdm9pZGFuY2UgYW5kIHdlZGdlcyBkZXBsb3lzIG9uIGAvYXdzL2xhbWJkYS88Zm4+YCBMb2dHcm91cFxuICAgIC8vIFwiYWxyZWFkeSBleGlzdHNcIiBhZnRlciBhbnkgZmFpbGVkIGF0dGVtcHQuXG4gICAgaWYgKGlzQ2RrTWFuYWdlZFNpbmdsZXRvbihub2RlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gbm9kZS5jZm5SZXNvdXJjZVR5cGU7XG4gICAgY29uc3QgY29uZmlnID0gUkVTT1VSQ0VfQ09ORklHW3Jlc291cmNlVHlwZV07XG5cbiAgICBpZiAoIWNvbmZpZyB8fCB0aGlzLmV4Y2x1ZGUuaGFzKHJlc291cmNlVHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNmbk5hbWUsIG1heExlbmd0aCB9ID0gY29uZmlnO1xuICAgIGNvbnN0IGNmblByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID1cbiAgICAgIChub2RlIGFzIENmblJlc291cmNlV2l0aFByb3BzKS5fY2ZuUHJvcGVydGllcyA/P1xuICAgICAgKG5vZGUgYXMgQ2ZuUmVzb3VyY2VXaXRoUHJvcHMpLmNmblByb3BlcnRpZXMgPz9cbiAgICAgIHt9O1xuXG4gICAgY29uc3QgbmFtZXMgPSB0aGlzLnJlc29sdmVSZXNvdXJjZU5hbWVzKG5vZGUsIGNmbk5hbWUsIGNmblByb3BlcnRpZXMpO1xuXG4gICAgaWYgKHRoaXMuc2hvdWxkU2tpcFJlc291cmNlKHJlc291cmNlVHlwZSwgbmFtZXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNBbHJlYWR5UHJlZml4ZWQobmFtZXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJlZml4ZWROYW1lID0gdGhpcy5idWlsZFByZWZpeGVkTmFtZShcbiAgICAgIG5hbWVzLFxuICAgICAgcmVzb3VyY2VUeXBlLFxuICAgICAgY2ZuUHJvcGVydGllc1xuICAgICk7XG5cbiAgICAvLyBUcnVuY2F0aW9uIGFwcGxpZXMgdG8gYWxsIG92ZXJmbG93cyDigJQgaW5jbHVkaW5nIHVzZXItc2V0IG5hbWVzIOKAlCBiZWNhdXNlIEwzXG4gICAgLy8gY29uc3RydWN0cyBjYW4gZ2VuZXJhdGUgbmFtZXMgdGhlIHVzZXIgaGFzIG5vIGRpcmVjdCBjb250cm9sIG92ZXIuXG4gICAgY29uc3QgZmluYWxOYW1lID0gdGhpcy50cnVuY2F0ZVRvRml0KHByZWZpeGVkTmFtZSwgbWF4TGVuZ3RoLCBub2RlKTtcblxuICAgIGNvbnN0IGhhc0Vycm9yID0gdGhpcy52YWxpZGF0ZVJlc291cmNlTmFtZShmaW5hbE5hbWUsIHJlc291cmNlVHlwZSwgbm9kZSk7XG5cbiAgICBpZiAoaGFzRXJyb3IpIHJldHVybjtcblxuICAgIG5vZGUuYWRkUHJvcGVydHlPdmVycmlkZShjZm5OYW1lLCBmaW5hbE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBhIHJlc291cmNlIHNob3VsZCBiZSBza2lwcGVkIGZyb20gcHJlZml4aW5nIGJhc2VkIG9uXG4gICAqIHJlc291cmNlLXR5cGUtc3BlY2lmaWMgcnVsZXMgKGUuZy4sIEFXUy1yZXNlcnZlZCBuYW1pbmcgY29udmVudGlvbnMpLlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRTa2lwUmVzb3VyY2UoY2ZuUmVzb3VyY2VUeXBlOiBzdHJpbmcsIG5hbWVzOiBSZXNvdXJjZU5hbWVzKSB7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzLnJhd05hbWUgPz8gbmFtZXMubG9naWNhbE5hbWU7XG4gICAgcmV0dXJuIChcbiAgICAgIGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OkxvZ3M6OkxvZ0dyb3VwXCIgJiYgbmFtZS5zdGFydHNXaXRoKFwiL2F3cy9cIilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0FscmVhZHlQcmVmaXhlZChuYW1lczogUmVzb3VyY2VOYW1lcykge1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcy5yYXdOYW1lID8/IG5hbWVzLmxvZ2ljYWxOYW1lO1xuICAgIHJldHVybiAoXG4gICAgICBuYW1lLnN0YXJ0c1dpdGgoYCR7dGhpcy5wcmVmaXh9LWApIHx8IG5hbWUuc3RhcnRzV2l0aChgLyR7dGhpcy5wcmVmaXh9L2ApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbmFtZSBjb21wb25lbnRzIGZvciBhIHJlc291cmNlOiB0aGUgZXhwbGljaXRseSBzZXQgcmF3IG5hbWUgKGlmIGFueSlcbiAgICogYW5kIGEgc2FuaXRpc2VkIGxvZ2ljYWwgSUQgZGVyaXZlZCBmcm9tIHRoZSBjb25zdHJ1Y3QgdHJlZS5cbiAgICpcbiAgICogVGhlIHJhdyBuYW1lIGlzIGxvb2tlZCB1cCBmcm9tIHRoZSBDRk4gcHJvcGVydGllcyBpbiBib3RoIFBhc2NhbENhc2UgYW5kIGNhbWVsQ2FzZVxuICAgKiAoQ0RLIHN0b3JlcyBMMSBwcm9wZXJ0aWVzIGluIGNhbWVsQ2FzZSBpbnRlcm5hbGx5KS4gV2hlbiBubyBleHBsaWNpdCBuYW1lIGlzIHNldCxcbiAgICogYHJhd05hbWVgIGlzIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlUmVzb3VyY2VOYW1lcyhcbiAgICBub2RlOiBDZm5SZXNvdXJjZSxcbiAgICBjZm5OYW1lOiBzdHJpbmcsXG4gICAgY2ZuUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUmVzb3VyY2VOYW1lcyB7XG4gICAgY29uc3QgY2FtZWxDZm5OYW1lID0gY2ZuTmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIGNmbk5hbWUuc2xpY2UoMSk7XG4gICAgY29uc3QgcmF3TmFtZSA9IGNmblByb3BlcnRpZXNbY2ZuTmFtZV0gPz8gY2ZuUHJvcGVydGllc1tjYW1lbENmbk5hbWVdO1xuICAgIGNvbnN0IGxvZ2ljYWxOYW1lID0gU3RhY2sub2Yobm9kZSlcbiAgICAgIC5nZXRMb2dpY2FsSWQobm9kZSlcbiAgICAgIC5yZXBsYWNlKC9bXmEtekEtWjAtOV0rL2csIFwiLVwiKSAvLyBub24tYWxwaGFudW1lcmljIOKGkiBkYXNoXG4gICAgICAucmVwbGFjZSgvXi0rfC0rJC9nLCBcIlwiKTsgLy8gdHJpbSBsZWFkaW5nL3RyYWlsaW5nIGRhc2hlc1xuXG4gICAgcmV0dXJuIHR5cGVvZiByYXdOYW1lID09PSBcInN0cmluZ1wiXG4gICAgICA/IHsgbG9naWNhbE5hbWUsIHJhd05hbWUgfVxuICAgICAgOiB7IGxvZ2ljYWxOYW1lLCByYXdOYW1lOiB1bmRlZmluZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHByZWZpeGVkIG5hbWUsIGhhbmRsaW5nIHNwZWNpYWwgY2FzZXMgZm9yIHNwZWNpZmljIHJlc291cmNlIHR5cGVzLlxuICAgKlxuICAgKiBVc2VzIHRoZSByYXcgbmFtZSB3aGVuIGl0IGlzIGEgY29uY3JldGUgc3RyaW5nLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGxvZ2ljYWxcbiAgICogbmFtZSB3aGVuIHRoZSByYXcgbmFtZSBpcyBhbiB1bnJlc29sdmVkIENESyB0b2tlbi5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRQcmVmaXhlZE5hbWUoXG4gICAgbmFtZXM6IFJlc291cmNlTmFtZXMsXG4gICAgY2ZuUmVzb3VyY2VUeXBlOiBzdHJpbmcsXG4gICAgY2ZuUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKSB7XG4gICAgY29uc3QgbmFtZSA9XG4gICAgICAhbmFtZXMucmF3TmFtZSB8fCBUb2tlbi5pc1VucmVzb2x2ZWQobmFtZXMucmF3TmFtZSlcbiAgICAgICAgPyBuYW1lcy5sb2dpY2FsTmFtZVxuICAgICAgICA6IG5hbWVzLnJhd05hbWU7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IEZJRk8gcXVldWVzIG11c3QgZW5kIHdpdGggLmZpZm8gc3VmZml4XG4gICAgaWYgKFxuICAgICAgY2ZuUmVzb3VyY2VUeXBlID09PSBcIkFXUzo6U1FTOjpRdWV1ZVwiICYmXG4gICAgICBjZm5Qcm9wZXJ0aWVzLmZpZm9RdWV1ZSA9PT0gdHJ1ZSAmJlxuICAgICAgIW5hbWUuZW5kc1dpdGgoXCIuZmlmb1wiKVxuICAgICkge1xuICAgICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke25hbWV9LmZpZm9gO1xuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgY2FzZTogRklGTyB0b3BpY3MgbXVzdCBlbmQgd2l0aCAuZmlmbyBzdWZmaXhcbiAgICBpZiAoXG4gICAgICBjZm5SZXNvdXJjZVR5cGUgPT09IFwiQVdTOjpTTlM6OlRvcGljXCIgJiZcbiAgICAgIGNmblByb3BlcnRpZXMuZmlmb1RvcGljID09PSB0cnVlICYmXG4gICAgICAhbmFtZS5lbmRzV2l0aChcIi5maWZvXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9LSR7bmFtZX0uZmlmb2A7XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBjYXNlOiBTU00gcGFyYW1ldGVyIG5hbWVzIHVzZSBwYXRoLXN0eWxlIHByZWZpeFxuICAgIGlmIChjZm5SZXNvdXJjZVR5cGUgPT09IFwiQVdTOjpTU006OlBhcmFtZXRlclwiKSB7XG4gICAgICByZXR1cm4gYC8ke3RoaXMucHJlZml4fS8ke25hbWV9YDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IFMzIGJ1Y2tldCBuYW1lIGJlIGxvd2VyY2FzZSBvbmx5XG4gICAgaWYgKGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlMzOjpCdWNrZXRcIikge1xuICAgICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke25hbWV9YC50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQ6IHNpbXBsZSBwcmVmaXhcbiAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9LSR7bmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydW5jYXRlcyBhIHByZWZpeGVkIG5hbWUgdG8gZml0IHdpdGhpbiBtYXhMZW5ndGggYnkgaGFzaGluZyB0aGUgb3JpZ2luYWxcbiAgICogZm9yIHVuaXF1ZW5lc3MuIEVtaXRzIGEgQ0RLIHdhcm5pbmcgd2hlbiB0cnVuY2F0aW9uIG9jY3Vycy5cbiAgICovXG4gIHByaXZhdGUgdHJ1bmNhdGVUb0ZpdChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbWF4TGVuZ3RoOiBudW1iZXIsXG4gICAgbm9kZTogSUNvbnN0cnVjdFxuICApOiBzdHJpbmcge1xuICAgIGlmIChuYW1lLmxlbmd0aCA8PSBtYXhMZW5ndGgpIHJldHVybiBuYW1lO1xuXG4gICAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKG5hbWUpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCA4KTtcblxuICAgIC8vIFByZXNlcnZlIC5maWZvIHN1ZmZpeCDigJQgQVdTIHJlcXVpcmVzIGl0IGF0IHRoZSBlbmQgb2YgRklGTyByZXNvdXJjZSBuYW1lc1xuICAgIGNvbnN0IHN1ZmZpeCA9IG5hbWUuZW5kc1dpdGgoXCIuZmlmb1wiKSA/IFwiLmZpZm9cIiA6IFwiXCI7XG4gICAgY29uc3QgbmFtZVdpdGhvdXRTdWZmaXggPSBzdWZmaXggPyBuYW1lLnNsaWNlKDAsIC1zdWZmaXgubGVuZ3RoKSA6IG5hbWU7XG5cbiAgICAvLyAxIGFjY291bnRzIGZvciB0aGUgZGFzaCBzZXBhcmF0b3IgYmVmb3JlIHRoZSBoYXNoXG4gICAgY29uc3QgYnVkZ2V0ID0gbWF4TGVuZ3RoIC0gaGFzaC5sZW5ndGggLSAxIC0gc3VmZml4Lmxlbmd0aDtcbiAgICBjb25zdCB0cnVuY2F0ZWQgPSBuYW1lV2l0aG91dFN1ZmZpeC5zbGljZSgwLCBidWRnZXQpICsgXCItXCIgKyBoYXNoICsgc3VmZml4O1xuXG4gICAgQW5ub3RhdGlvbnMub2Yobm9kZSkuYWRkV2FybmluZyhcbiAgICAgIGBbUmVzb3VyY2VQcmVmaXhBc3BlY3RdIFwiJHtuYW1lfVwiICgke25hbWUubGVuZ3RofSBjaGFycykgZXhjZWVkcyB0aGUgbWF4aW11bSBhbGxvd2VkIGxlbmd0aCBvZiAke21heExlbmd0aH0uIGAgK1xuICAgICAgICBgTmFtZSBoYXMgYmVlbiB0cnVuY2F0ZWQgdG8gXCIke3RydW5jYXRlZH1cIi4gU2hvcnRlbiB0aGUgcmVzb3VyY2UgYmFzZSBuYW1lIG9yIHlvdXIgcHJlZml4IChcIiR7dGhpcy5wcmVmaXh9XCIpIHRvIGF2b2lkIHRydW5jYXRpb24uYFxuICAgICk7XG5cbiAgICByZXR1cm4gdHJ1bmNhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyByZXNvdXJjZS1zcGVjaWZpYyBzdHJ1Y3R1cmFsIG5hbWluZyByZXF1aXJlbWVudHMgdGhhdCBBV1MgZW5mb3JjZXMuXG4gICAqIExlbmd0aCB2aW9sYXRpb25zIGFyZSBoYW5kbGVkIHVwc3RyZWFtIGJ5IHRydW5jYXRlVG9GaXQuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUmVzb3VyY2VOYW1lKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjZm5SZXNvdXJjZVR5cGU6IHN0cmluZyxcbiAgICBub2RlOiBJQ29uc3RydWN0XG4gICk6IGJvb2xlYW4ge1xuICAgIGxldCBoYXNFcnJvciA9IGZhbHNlO1xuXG4gICAgaWYgKGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlMzOjpCdWNrZXRcIikge1xuICAgICAgaWYgKG5hbWUgIT09IG5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBBbm5vdGF0aW9ucy5vZihub2RlKS5hZGRFcnJvcihcbiAgICAgICAgICBgW1Jlc291cmNlUHJlZml4QXNwZWN0XSBTMyBidWNrZXQgbmFtZSBcIiR7bmFtZX1cIiBjb250YWlucyB1cHBlcmNhc2UgbGV0dGVycy4gYCArXG4gICAgICAgICAgICBgQnVja2V0IG5hbWVzIG11c3QgYmUgbG93ZXJjYXNlIG9ubHkuYFxuICAgICAgICApO1xuICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lLmluY2x1ZGVzKFwiX1wiKSkge1xuICAgICAgICBBbm5vdGF0aW9ucy5vZihub2RlKS5hZGRFcnJvcihcbiAgICAgICAgICBgW1Jlc291cmNlUHJlZml4QXNwZWN0XSBTMyBidWNrZXQgbmFtZSBcIiR7bmFtZX1cIiBjb250YWlucyB1bmRlcnNjb3Jlcy4gYCArXG4gICAgICAgICAgICBgQnVja2V0IG5hbWVzIGNhbm5vdCBjb250YWluIHVuZGVyc2NvcmVzLiBVc2UgaHlwaGVucyBpbnN0ZWFkLmBcbiAgICAgICAgKTtcbiAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoYXNFcnJvcjtcbiAgfVxufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aligent/cdk-aspects",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"description": "Collection of CDK Asppects",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -28,9 +28,11 @@
|
|
|
28
28
|
"typescript": "^5.3.2"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"aws-cdk-lib": "^2.257.0",
|
|
32
|
-
"constructs": "^10.5.0",
|
|
33
31
|
"esbuild": "^0.28.0",
|
|
34
32
|
"source-map-support": "^0.5.21"
|
|
33
|
+
},
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"aws-cdk-lib": "^2.113.0",
|
|
36
|
+
"constructs": "^10.5.0"
|
|
35
37
|
}
|
|
36
38
|
}
|