@servicevic-oss/cdk-cleanup-certificate-validation-records 0.0.3 → 0.0.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/.jsii +3 -3
- package/README.md +6 -6
- package/lib/index.js +1 -1
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -3512,7 +3512,7 @@
|
|
|
3512
3512
|
},
|
|
3513
3513
|
"name": "@servicevic-oss/cdk-cleanup-certificate-validation-records",
|
|
3514
3514
|
"readme": {
|
|
3515
|
-
"markdown": "# cdk-cleanup-certificate-validation-records\n\nThis CDK construct takes care of cleaning up the orphaned Route53 CNAME validation records\nleft behind when deleting a certificate that had DNS validation enabled.\n\nThe issue is better explained here: https://github.com/aws/aws-cdk/issues/11201\n\n## Usage\n\n### Explicit instantiation\n\nThe construct can be instantiated explicitely to cleanup after a specific certificate\n\n```typescript\nimport * as cdk from 'aws-cdk-lib';\nimport { Construct } from 'constructs';\nimport { CertificateValidationRecordCleanup } from '@servicevic-oss/cdk-cleanup-certificate-validation-records'\n\nexport class TestStack extends cdk.Stack {\n constructor(scope: Construct, id: string, props: TestStackProps) {\n super(scope, id, props);\n\n zone = new cdk.aws_route53.PublicHostedZone(this, 'Zone', {\n zoneName: 'my.zone.net',\n });\n\n const cert1 = new cdk.aws_certificatemanager.Certificate(this, 'Cert', {\n domainName: `mydomain.${
|
|
3515
|
+
"markdown": "# cdk-cleanup-certificate-validation-records\n\nThis CDK construct takes care of cleaning up the orphaned Route53 CNAME validation records\nleft behind when deleting a certificate that had DNS validation enabled.\n\nThe issue is better explained here: https://github.com/aws/aws-cdk/issues/11201\n\n## Usage\n\n### Explicit instantiation\n\nThe construct can be instantiated explicitely to cleanup after a specific certificate\n\n```typescript\nimport * as cdk from 'aws-cdk-lib';\nimport { Construct } from 'constructs';\nimport { CertificateValidationRecordCleanup } from '@servicevic-oss/cdk-cleanup-certificate-validation-records'\n\nexport class TestStack extends cdk.Stack {\n constructor(scope: Construct, id: string, props: TestStackProps) {\n super(scope, id, props);\n\n zone = new cdk.aws_route53.PublicHostedZone(this, 'Zone', {\n zoneName: 'my.zone.net',\n });\n\n const cert1 = new cdk.aws_certificatemanager.Certificate(this, 'Cert', {\n domainName: `mydomain.${zone.zoneName}`,\n validation: cdk.aws_certificatemanager.CertificateValidation.fromDns(zone),\n subjectAlternativeNames: [\n `mydomain2.${zone.zoneName}`,\n `mydomain3.${zone.zoneName}`,\n ],\n });\n const cert2 = new cdk.aws_certificatemanager.Certificate(this, 'Cert', {\n domainName: `another.${zone.zoneName}`,\n validation: cdk.aws_certificatemanager.CertificateValidation.fromDns(zone),\n });\n\n new CertificateValidationRecordCleanup(this, `cleanup-${cert1.node.id}`, {\n certificate: cert1,\n hostedZone: zone,\n });\n\n new CertificateValidationRecordCleanup(this, `cleanup-${cert2.node.id}`, {\n certificate: cert2,\n hostedZone: zone,\n });\n };\n}\n```\n\n### Implicit instantiation using Aspects with knowledge of the hosted zone\n\nThe construct can be instantiated automatically against any Certificate resource created within a stack\nthrough the use of Aspects\n\nIn this example, we have knowledge of the hosted zone\n\n```typescript\nimport * as cdk from 'aws-cdk-lib';\nimport { Construct } from 'constructs';\nimport { CertificateValidationRecordCleanup } from '@servicevic-oss/cdk-cleanup-certificate-validation-records'\n\nexport class TestStack extends cdk.Stack {\n constructor(scope: Construct, id: string, props: TestStackProps) {\n super(scope, id, props);\n\n zone = new cdk.aws_route53.PublicHostedZone(this, 'Zone', {\n zoneName: 'my.zone.net',\n });\n\n new cdk.aws_certificatemanager.Certificate(this, 'Cert', {\n domainName: `mydomain.${zone.zoneName}`,\n validation: cdk.aws_certificatemanager.CertificateValidation.fromDns(zone),\n subjectAlternativeNames: [\n `mydomain2.${zone.zoneName}`,\n `mydomain3.${zone.zoneName}`,\n ],\n });\n new cdk.aws_certificatemanager.Certificate(this, 'Cert', {\n domainName: `another.${zone.zoneName}`,\n validation: cdk.aws_certificatemanager.CertificateValidation.fromDns(zone),\n });\n\n cdk.Aspects.of(this).add({\n visit: (c) => {\n if (c instanceof cdk.aws_certificatemanager.Certificate) {\n new CertificateValidationRecordCleanup(this, `cleanup-${c.node.id}`, {\n certificate: c,\n hostedZone: zone,\n });\n }\n },\n });\n };\n}\n```\n\n### Implicit instantiation using Aspects without knowledge of the hosted zone\n\nThe construct can be instantiated automatically against any Certificate resource created within a stack\nthrough the use of Aspects\n\nIn this example, we have no knowledge of the hosted zone used to validate the certificate so we use a bit of brute force to derive it from the Certificate L1 resource\n\n```typescript\nimport * as cdk from 'aws-cdk-lib';\nimport { CertificateValidationRecordCleanup } from '@servicevic-oss/cdk-cleanup-certificate-validation-records'\n\nconst app = new cdk.App();\n\nconst blackBoxStack = new BlackBoxStack(app, 'my-blackbox-stack');\n\ncdk.Aspects.of(blackBoxStack).add({\n visit: (c) => {\n if (c instanceof cdk.aws_certificatemanager.Certificate) {\n const cfnRes = c.node.defaultChild as cdk.aws_certificatemanager.CfnCertificate;\n const valOpts = (cfnRes.domainValidationOptions as cdk.aws_certificatemanager.CfnCertificate.DomainValidationOptionProperty[])[0];\n\n new CertificateValidationRecordCleanup(c, `cleanup-${c.node.id}`, {\n certificate: c,\n hostedZone: cdk.aws_route53.HostedZone.fromHostedZoneId(c, `lookup-${c.node.id}`, valOpts.hostedZoneId!),\n });\n }\n },\n});\n```"
|
|
3516
3516
|
},
|
|
3517
3517
|
"repository": {
|
|
3518
3518
|
"type": "git",
|
|
@@ -3682,6 +3682,6 @@
|
|
|
3682
3682
|
"symbolId": "src/index:CertificateValidationRecordCleanupProps"
|
|
3683
3683
|
}
|
|
3684
3684
|
},
|
|
3685
|
-
"version": "0.0.
|
|
3686
|
-
"fingerprint": "
|
|
3685
|
+
"version": "0.0.4",
|
|
3686
|
+
"fingerprint": "YiU9qXtaSKZs464RgPVo+XkFxh3vAKX3c6H0TxzbFtE="
|
|
3687
3687
|
}
|
package/README.md
CHANGED
|
@@ -25,7 +25,7 @@ export class TestStack extends cdk.Stack {
|
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
const cert1 = new cdk.aws_certificatemanager.Certificate(this, 'Cert', {
|
|
28
|
-
domainName: `mydomain.${
|
|
28
|
+
domainName: `mydomain.${zone.zoneName}`,
|
|
29
29
|
validation: cdk.aws_certificatemanager.CertificateValidation.fromDns(zone),
|
|
30
30
|
subjectAlternativeNames: [
|
|
31
31
|
`mydomain2.${zone.zoneName}`,
|
|
@@ -33,18 +33,18 @@ export class TestStack extends cdk.Stack {
|
|
|
33
33
|
],
|
|
34
34
|
});
|
|
35
35
|
const cert2 = new cdk.aws_certificatemanager.Certificate(this, 'Cert', {
|
|
36
|
-
domainName: `another.${
|
|
36
|
+
domainName: `another.${zone.zoneName}`,
|
|
37
37
|
validation: cdk.aws_certificatemanager.CertificateValidation.fromDns(zone),
|
|
38
38
|
});
|
|
39
39
|
|
|
40
40
|
new CertificateValidationRecordCleanup(this, `cleanup-${cert1.node.id}`, {
|
|
41
41
|
certificate: cert1,
|
|
42
|
-
hostedZone:
|
|
42
|
+
hostedZone: zone,
|
|
43
43
|
});
|
|
44
44
|
|
|
45
45
|
new CertificateValidationRecordCleanup(this, `cleanup-${cert2.node.id}`, {
|
|
46
46
|
certificate: cert2,
|
|
47
|
-
hostedZone:
|
|
47
|
+
hostedZone: zone,
|
|
48
48
|
});
|
|
49
49
|
};
|
|
50
50
|
}
|
|
@@ -71,7 +71,7 @@ export class TestStack extends cdk.Stack {
|
|
|
71
71
|
});
|
|
72
72
|
|
|
73
73
|
new cdk.aws_certificatemanager.Certificate(this, 'Cert', {
|
|
74
|
-
domainName: `mydomain.${
|
|
74
|
+
domainName: `mydomain.${zone.zoneName}`,
|
|
75
75
|
validation: cdk.aws_certificatemanager.CertificateValidation.fromDns(zone),
|
|
76
76
|
subjectAlternativeNames: [
|
|
77
77
|
`mydomain2.${zone.zoneName}`,
|
|
@@ -79,7 +79,7 @@ export class TestStack extends cdk.Stack {
|
|
|
79
79
|
],
|
|
80
80
|
});
|
|
81
81
|
new cdk.aws_certificatemanager.Certificate(this, 'Cert', {
|
|
82
|
-
domainName: `another.${
|
|
82
|
+
domainName: `another.${zone.zoneName}`,
|
|
83
83
|
validation: cdk.aws_certificatemanager.CertificateValidation.fromDns(zone),
|
|
84
84
|
});
|
|
85
85
|
|
package/lib/index.js
CHANGED
|
@@ -57,7 +57,7 @@ class CertificateValidationRecordCleanup extends constructs_1.Construct {
|
|
|
57
57
|
}
|
|
58
58
|
exports.CertificateValidationRecordCleanup = CertificateValidationRecordCleanup;
|
|
59
59
|
_a = JSII_RTTI_SYMBOL_1;
|
|
60
|
-
CertificateValidationRecordCleanup[_a] = { fqn: "@servicevic-oss/cdk-cleanup-certificate-validation-records.CertificateValidationRecordCleanup", version: "0.0.
|
|
60
|
+
CertificateValidationRecordCleanup[_a] = { fqn: "@servicevic-oss/cdk-cleanup-certificate-validation-records.CertificateValidationRecordCleanup", version: "0.0.4" };
|
|
61
61
|
CertificateValidationRecordCleanup.HANDLER_UID = 'CertRecordsCleanupHandler-2B663BAB-7981';
|
|
62
62
|
CertificateValidationRecordCleanup.PROVIDER_UID = 'CertRecordsCleanupProvider-57EBF059-2E26';
|
|
63
63
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrQkFBNEI7QUFDNUIsbUNBQW1DO0FBQ25DLDJDQUF1QztBQWV2Qzs7O0dBR0c7QUFDSCxNQUFhLGtDQUFtQyxTQUFRLHNCQUFTO0lBTy9ELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBOEM7UUFDdEYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFM0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUM5RSxPQUFPLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztZQUNwQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQztTQUM5QyxDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7WUFDOUUsT0FBTyxFQUFFO2dCQUNQLGtDQUFrQztnQkFDbEMsZ0NBQWdDO2FBQ2pDO1lBQ0QsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7U0FDNUMsQ0FBQyxDQUFDLENBQUM7UUFFSixJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUN2QyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3hDLFlBQVksRUFBRSw0Q0FBNEM7WUFDMUQsVUFBVSxFQUFFO2dCQUNWLFlBQVksRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLFlBQVk7Z0JBQzNDLGNBQWMsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWM7YUFDakQ7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLE1BQU0sRUFBRSxHQUFHLGtDQUFrQyxDQUFDLFdBQVcsQ0FBQztRQUMxRCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBeUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNoSSxXQUFXLEVBQUUsdUVBQXVFO1lBQ3BGLEtBQUssRUFBRSxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsbURBQW1ELENBQUM7WUFDM0UsWUFBWSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVE7WUFDakQsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLE1BQU0sRUFBRSxHQUFHLGtDQUFrQyxDQUFDLFlBQVksQ0FBQztRQUMzRCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBa0MsSUFBSSxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNsSCxjQUFjLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDcEMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVE7U0FDbEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF2REgsZ0ZBd0RDOzs7QUF2RGlCLDhDQUFXLEdBQUcseUNBQXlDLENBQUM7QUFDeEQsK0NBQVksR0FBRywwQ0FBMEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuZXhwb3J0IGludGVyZmFjZSBDZXJ0aWZpY2F0ZVZhbGlkYXRpb25SZWNvcmRDbGVhbnVwUHJvcHMge1xuICAvKipcbiAgICogVGhlIFJvdXRlNTMgaG9zdGVkIHpvbmUgd2hlcmUgdGhlIGNlcnRpZmljYXRlIHZhbGlkYXRpb24gcmVjb3JkcyBoYXZlIGJlZW4gY3JlYXRlZCBmb3IgYSBjZXJ0aWZpY2F0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdGVkWm9uZTogY2RrLmF3c19yb3V0ZTUzLklIb3N0ZWRab25lO1xuXG4gIC8qKlxuICAgKiBUaGUgQUNNIGNlcnRpZmljYXRlIHRoYXQgY3JlYXRlZCB0aGUgdmFsaWRhdGlvbiByZWNvcmRzXG4gICAqL1xuICByZWFkb25seSBjZXJ0aWZpY2F0ZTogY2RrLmF3c19jZXJ0aWZpY2F0ZW1hbmFnZXIuSUNlcnRpZmljYXRlO1xufVxuXG5cbi8qKlxuICogVGhpcyBjb25zdHJ1Y3RzIHdpbGwgdGFrZSBjYXJlIG9mIGRlbGV0aW5nIHRoZSBvcnBoYW5lZCByb3V0ZTUzIHJlY29yZHMgdGhhdCBBQ00gd2lsbFxuICogbGVhdmUgYmVoaW5kIHdoZW4gZGVsZXRpbmcgYSBETlMgdmFsaWRhdGVkIGNlcnRpZmljYXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBDZXJ0aWZpY2F0ZVZhbGlkYXRpb25SZWNvcmRDbGVhbnVwIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgc3RhdGljIHJlYWRvbmx5IEhBTkRMRVJfVUlEID0gJ0NlcnRSZWNvcmRzQ2xlYW51cEhhbmRsZXItMkI2NjNCQUItNzk4MSc7XG4gIHN0YXRpYyByZWFkb25seSBQUk9WSURFUl9VSUQgPSAnQ2VydFJlY29yZHNDbGVhbnVwUHJvdmlkZXItNTdFQkYwNTktMkUyNic7XG5cbiAgcHVibGljIHJlYWRvbmx5IGhhbmRsZXJGdW5jdGlvbjogY2RrLmF3c19sYW1iZGFfbm9kZWpzLk5vZGVqc0Z1bmN0aW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvdmlkZXI6IGNkay5jdXN0b21fcmVzb3VyY2VzLlByb3ZpZGVyO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDZXJ0aWZpY2F0ZVZhbGlkYXRpb25SZWNvcmRDbGVhbnVwUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5oYW5kbGVyRnVuY3Rpb24gPSB0aGlzLmdldE9yQ3JlYXRlRnVuY3Rpb24oKTtcbiAgICB0aGlzLnByb3ZpZGVyID0gdGhpcy5nZXRPckNyZWF0ZVByb3ZpZGVyKCk7XG5cbiAgICB0aGlzLmhhbmRsZXJGdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgY2RrLmF3c19pYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFsnYWNtOkRlc2NyaWJlQ2VydGlmaWNhdGUnXSxcbiAgICAgIHJlc291cmNlczogW3Byb3BzLmNlcnRpZmljYXRlLmNlcnRpZmljYXRlQXJuXSxcbiAgICB9KSk7XG4gICAgdGhpcy5oYW5kbGVyRnVuY3Rpb24ucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IGNkay5hd3NfaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdyb3V0ZTUzOkNoYW5nZVJlc291cmNlUmVjb3JkU2V0cycsXG4gICAgICAgICdyb3V0ZTUzOkxpc3RSZXNvdXJjZVJlY29yZFNldHMnLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogW3Byb3BzLmhvc3RlZFpvbmUuaG9zdGVkWm9uZUFybl0sXG4gICAgfSkpO1xuXG4gICAgbmV3IGNkay5DdXN0b21SZXNvdXJjZSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHRoaXMucHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgcmVzb3VyY2VUeXBlOiAnQ3VzdG9tOjpDZXJ0aWZpY2F0ZVZhbGlkYXRpb25SZWNvcmRDbGVhbnVwJyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgSG9zdGVkWm9uZUlkOiBwcm9wcy5ob3N0ZWRab25lLmhvc3RlZFpvbmVJZCxcbiAgICAgICAgQ2VydGlmaWNhdGVBcm46IHByb3BzLmNlcnRpZmljYXRlLmNlcnRpZmljYXRlQXJuLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KHByb3BzLmNlcnRpZmljYXRlLCBwcm9wcy5ob3N0ZWRab25lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVGdW5jdGlvbigpOiBjZGsuYXdzX2xhbWJkYV9ub2RlanMuTm9kZWpzRnVuY3Rpb24ge1xuICAgIGNvbnN0IGlkID0gQ2VydGlmaWNhdGVWYWxpZGF0aW9uUmVjb3JkQ2xlYW51cC5IQU5ETEVSX1VJRDtcbiAgICBjb25zdCBzdGFjayA9IGNkay5TdGFjay5vZih0aGlzKTtcbiAgICByZXR1cm4gc3RhY2subm9kZS50cnlGaW5kQ2hpbGQoaWQpIGFzIGNkay5hd3NfbGFtYmRhX25vZGVqcy5Ob2RlanNGdW5jdGlvbiA/PyBuZXcgY2RrLmF3c19sYW1iZGFfbm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHN0YWNrLCBpZCwge1xuICAgICAgZGVzY3JpcHRpb246ICdIYW5kbGVyIGZ1bmN0aW9uIGZvciB0aGUgQ2VydGlmaWNhdGVWYWxpZGF0aW9uUmVjb3JkQ2xlYW51cCBjb25zdHJ1Y3QnLFxuICAgICAgZW50cnk6IGpvaW4oX19kaXJuYW1lLCAnY2xlYW51cC1jZXJ0aWZpY2F0ZS12YWxpZGF0aW9uLXJlY29yZHMuaGFuZGxlci5qcycpLFxuICAgICAgbG9nUmV0ZW50aW9uOiBjZGsuYXdzX2xvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfV0VFSyxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDIpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckNyZWF0ZVByb3ZpZGVyKCk6IGNkay5jdXN0b21fcmVzb3VyY2VzLlByb3ZpZGVyIHtcbiAgICBjb25zdCBpZCA9IENlcnRpZmljYXRlVmFsaWRhdGlvblJlY29yZENsZWFudXAuUFJPVklERVJfVUlEO1xuICAgIGNvbnN0IHN0YWNrID0gY2RrLlN0YWNrLm9mKHRoaXMpO1xuICAgIHJldHVybiBzdGFjay5ub2RlLnRyeUZpbmRDaGlsZChpZCkgYXMgY2RrLmN1c3RvbV9yZXNvdXJjZXMuUHJvdmlkZXIgPz8gbmV3IGNkay5jdXN0b21fcmVzb3VyY2VzLlByb3ZpZGVyKHN0YWNrLCBpZCwge1xuICAgICAgb25FdmVudEhhbmRsZXI6IHRoaXMuaGFuZGxlckZ1bmN0aW9uLFxuICAgICAgbG9nUmV0ZW50aW9uOiBjZGsuYXdzX2xvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfV0VFSyxcbiAgICB9KTtcbiAgfVxufVxuIl19
|