cdk-internal-gateway
Version:
CDK construct to create to create internal serverless applications.
112 lines • 22.7 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.InternalService = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const constructs_1 = require("constructs");
class InternalService extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
const domainName = `${props.subDomain}.${props.hostedZone.zoneName}`;
const certificate = new aws_cdk_lib_1.aws_certificatemanager.Certificate(this, `SSLCertificate-${id}`, {
domainName: domainName,
subjectAlternativeNames: props.subjectAlternativeNames,
validation: aws_cdk_lib_1.aws_certificatemanager.CertificateValidation.fromDnsMultiZone({
domainName: props.hostedZone,
}),
});
const domain = new aws_cdk_lib_1.aws_apigateway.DomainName(this, `ApiGatewayCustomDomain-${id}`, {
domainName: `${props.subDomain}.${props.hostedZone.zoneName}`,
certificate: certificate,
endpointType: aws_cdk_lib_1.aws_apigateway.EndpointType.REGIONAL,
securityPolicy: props?.customDomainSSLPolicy ?? aws_cdk_lib_1.aws_apigateway.SecurityPolicy.TLS_1_2,
});
this.domains = [domain];
for (const domainItem of props.subjectAlternativeNames) {
const sanDomain = new aws_cdk_lib_1.aws_apigateway.DomainName(this, `Domain-${domainItem}-${id}`, {
domainName: domainItem,
certificate: certificate,
endpointType: aws_cdk_lib_1.aws_apigateway.EndpointType.REGIONAL,
securityPolicy: aws_cdk_lib_1.aws_apigateway.SecurityPolicy.TLS_1_2,
});
this.domains.push(sanDomain);
}
let sgImmutable;
if (props.loadBalancerSecurityGroup) {
sgImmutable = aws_cdk_lib_1.aws_ec2.SecurityGroup.fromSecurityGroupId(this, "LoadBalancerSecurityGroupImmutable", props.loadBalancerSecurityGroup?.securityGroupId, { mutable: false });
}
else {
const loadBalancerSecurityGroup = new aws_cdk_lib_1.aws_ec2.SecurityGroup(this, `LoadBalancerSecurityGroup-${id}`, {
vpc: props.vpc,
allowAllOutbound: true,
description: "security group for a load balancer",
});
loadBalancerSecurityGroup.addIngressRule(aws_cdk_lib_1.aws_ec2.Peer.ipv4("10.0.0.0/8"), aws_cdk_lib_1.aws_ec2.Port.tcp(443), "allow HTTPS traffic from private CIDR range");
loadBalancerSecurityGroup.addIngressRule(aws_cdk_lib_1.aws_ec2.Peer.ipv4("172.16.0.0/12"), aws_cdk_lib_1.aws_ec2.Port.tcp(443), "allow HTTPS traffic from private CIDR range");
loadBalancerSecurityGroup.addIngressRule(aws_cdk_lib_1.aws_ec2.Peer.ipv4("192.168.0.0/16"), aws_cdk_lib_1.aws_ec2.Port.tcp(443), "allow HTTPS traffic from private CIDR range");
sgImmutable = aws_cdk_lib_1.aws_ec2.SecurityGroup.fromSecurityGroupId(this, "LoadBalancerSecurityGroupImmutable", loadBalancerSecurityGroup.securityGroupId, { mutable: false });
}
this.applicationLoadBalancer = new aws_cdk_lib_1.aws_elasticloadbalancingv2.ApplicationLoadBalancer(this, `ApplicationLoadBalancer-${id}`, {
vpc: props.vpc,
vpcSubnets: {
subnets: props.subnetSelection.subnets,
},
internetFacing: false,
securityGroup: sgImmutable,
});
const enableLoadBalancerAccessLogs = props.enableLoadBalancerAccessLogs ?? true;
if (enableLoadBalancerAccessLogs) {
//create a private s3 bucket
const bucket = new aws_cdk_lib_1.aws_s3.Bucket(this, "ApplicationLoadBalancerLogs-${id}", {
versioned: true,
removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
blockPublicAccess: aws_cdk_lib_1.aws_s3.BlockPublicAccess.BLOCK_ALL,
enforceSSL: true,
encryption: aws_cdk_lib_1.aws_s3.BucketEncryption.S3_MANAGED,
autoDeleteObjects: true,
});
//create access logs for the load balancer
this.applicationLoadBalancer.logAccessLogs(bucket);
}
// Add http-to-https redirect
const addLoadBalancerRedirect = props.addLoadBalancerRedirect ?? true;
if (addLoadBalancerRedirect) {
this.applicationLoadBalancer.addRedirect();
}
new aws_cdk_lib_1.aws_route53.ARecord(this, `Route53Record-${id}`, {
zone: props.hostedZone,
target: aws_cdk_lib_1.aws_route53.RecordTarget.fromAlias(new aws_cdk_lib_1.aws_route53_targets.LoadBalancerTarget(this.applicationLoadBalancer)),
recordName: domainName,
});
const targetGroupTargets = [];
for (const ip of props.vpcEndpointIPAddresses) {
targetGroupTargets.push(new aws_cdk_lib_1.aws_elasticloadbalancingv2_targets.IpTarget(ip));
}
const targetGroup = new aws_cdk_lib_1.aws_elasticloadbalancingv2.ApplicationTargetGroup(this, `TargetGroup-${id}`, {
port: 443,
vpc: props.vpc,
protocol: aws_cdk_lib_1.aws_elasticloadbalancingv2.ApplicationProtocol.HTTPS,
targetType: aws_cdk_lib_1.aws_elasticloadbalancingv2.TargetType.IP,
targets: targetGroupTargets,
});
const listener = this.applicationLoadBalancer.addListener(`Listener-${id}`, {
port: 443,
certificates: [certificate],
sslPolicy: props?.loadBalancerListenerSSLPolicy ??
aws_cdk_lib_1.aws_elasticloadbalancingv2.SslPolicy.FORWARD_SECRECY_TLS12_RES_GCM,
open: false,
});
listener.addTargetGroups(`TargetGroupAttachment-${id}`, {
targetGroups: [targetGroup],
});
new aws_cdk_lib_1.CfnOutput(this, `DomainUrl-${id}`, {
value: `https://${domainName}`,
description: "service url",
});
}
}
exports.InternalService = InternalService;
_a = JSII_RTTI_SYMBOL_1;
InternalService[_a] = { fqn: "cdk-internal-gateway.InternalService", version: "1.5.1" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnRlcm5hbC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBV3FCO0FBRXJCLDJDQUF1QztBQXlFdkMsTUFBYSxlQUFnQixTQUFRLHNCQUFTO0lBVzVDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkI7UUFDbkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLFVBQVUsR0FBRyxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVyRSxNQUFNLFdBQVcsR0FBRyxJQUFJLG9DQUFrQixDQUFDLFdBQVcsQ0FDcEQsSUFBSSxFQUNKLGtCQUFrQixFQUFFLEVBQUUsRUFDdEI7WUFDRSxVQUFVLEVBQUUsVUFBVTtZQUN0Qix1QkFBdUIsRUFBRSxLQUFLLENBQUMsdUJBQXVCO1lBQ3RELFVBQVUsRUFBRSxvQ0FBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDcEUsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO2FBQzdCLENBQUM7U0FDSCxDQUNGLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxJQUFJLDRCQUFVLENBQUMsVUFBVSxDQUN0QyxJQUFJLEVBQ0osMEJBQTBCLEVBQUUsRUFBRSxFQUM5QjtZQUNFLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7WUFDN0QsV0FBVyxFQUFFLFdBQVc7WUFDeEIsWUFBWSxFQUFFLDRCQUFVLENBQUMsWUFBWSxDQUFDLFFBQVE7WUFDOUMsY0FBYyxFQUNaLEtBQUssRUFBRSxxQkFBcUIsSUFBSSw0QkFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPO1NBQ3BFLENBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFP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LEdBQUc7WUFDZCxRQUFRLEVBQUUsd0NBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLO1lBQ3ZDLFVBQVUsRUFBRSx3Q0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzdCLE9BQU8sRUFBRSxrQkFBa0I7U0FDNUIsQ0FDRixDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FDdkQsWUFBWSxFQUFFLEVBQUUsRUFDaEI7WUFDRSxJQUFJLEVBQUUsR0FBRztZQUNULFlBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUMzQixTQUFTLEVBQ1AsS0FBSyxFQUFFLDZCQUE2QjtnQkFDcEMsd0NBQUcsQ0FBQyxTQUFTLENBQUMsNkJBQTZCO1lBQzdDLElBQUksRUFBRSxLQUFLO1NBQ1osQ0FDRixDQUFDO1FBRUYsUUFBUSxDQUFDLGVBQWUsQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLEVBQUU7WUFDdEQsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDO1NBQzVCLENBQUMsQ0FBQztRQUVILElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRTtZQUNyQyxLQUFLLEVBQUUsV0FBVyxVQUFVLEVBQUU7WUFDOUIsV0FBVyxFQUFFLGFBQWE7U0FDM0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFwTEgsMENBcUxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYXdzX2FwaWdhdGV3YXkgYXMgYXBpZ2F0ZXdheSxcbiAgYXdzX2NlcnRpZmljYXRlbWFuYWdlciBhcyBjZXJ0aWZpY2F0ZW1hbmFnZXIsXG4gIGF3c19lYzIgYXMgZWMyLFxuICBhd3NfZWxhc3RpY2xvYWRiYWxhbmNpbmd2MiBhcyBlbGIsXG4gIGF3c19lbGFzdGljbG9hZGJhbGFuY2luZ3YyX3RhcmdldHMgYXMgZWxhc3RpY2xvYWRiYWxhbmNpbmd2MnRhcmdldHMsXG4gIGF3c19yb3V0ZTUzIGFzIHJvdXRlNTMsXG4gIGF3c19yb3V0ZTUzX3RhcmdldHMgYXMgdGFyZ2V0cyxcbiAgYXdzX3MzIGFzIHMzLFxuICBDZm5PdXRwdXQsXG4gIFJlbW92YWxQb2xpY3ksXG59IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgSVZwYywgU3VibmV0U2VsZWN0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgSW50ZXJuYWxTZXJ2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuYWxTZXJ2aWNlUHJvcHMge1xuICAvKipcbiAgICogVlBDIGF0dGFjaGVkIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2FkIGJhbGFuY2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgdnBjOiBJVnBjO1xuXG4gIC8qKlxuICAgKiBTdWJuZXRzIGF0dGFjaGVkIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2FkIGJhbGFuY2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0U2VsZWN0aW9uOiBTdWJuZXRTZWxlY3Rpb247XG5cbiAgLyoqXG4gICAqIFZQQyBlbmRwb2ludCBpcCBhZGRyZXNzZXMgYXR0YWNoZWQgdG8gdGhlIGxvYWQgYmFsYW5jZXJgcyB0YXJnZXQgZ3JvdXBcbiAgICovXG4gIHJlYWRvbmx5IHZwY0VuZHBvaW50SVBBZGRyZXNzZXM6IEFycmF5PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYWx0ZXJuYXRpdmUgZG9tYWlucyBhdHRhY2hlZCB0byB0aGUgc29sdXRpb24uXG4gICAqL1xuICByZWFkb25seSBzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFN1YmRvbWFpbiBhdHRhY2hlZCB0byBob3N0ZWQgem9uZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViRG9tYWluOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvc3RlZCB6b25lIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgY3VzdG9tIGRvbWFpbi5cbiAgICovXG4gIHJlYWRvbmx5IGhvc3RlZFpvbmU6IHJvdXRlNTMuSUhvc3RlZFpvbmU7XG5cbiAgLyoqXG4gICAqIFNTTFBvbGljeSBhdHRhY2hlZCB0byB0aGUgbG9hZCBiYWxhbmNlciBsaXN0ZW5lci5cbiAgICpcbiAgICogQGRlZmF1bHQgZWxiLlNzbFBvbGljeS5GT1JXQVJEX1NFQ1JFQ1lfVExTMTJfUkVTX0dDTVxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEJhbGFuY2VyTGlzdGVuZXJTU0xQb2xpY3k/OiBlbGIuU3NsUG9saWN5O1xuXG4gIC8qKlxuICAgKiBTU0xQb2xpY3kgYXR0YWNoZWQgdG8gdGhlIGFwaWdhdGV3YXkgY3VzdG9tIGRvbWFpbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYXBpZ2F0ZXdheS5Tc2xQb2xpY3kuVExTXzFfMlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tRG9tYWluU1NMUG9saWN5PzogYXBpZ2F0ZXdheS5TZWN1cml0eVBvbGljeTtcblxuICAvKipcbiAgICogVXNlIGEgY3VzdG9tIHNlY3VyaXR5IGdyb3VwIHVzZWQgZm9yIHRoZSBsb2FkIGJhbGFuY2VyLlxuICAgKiBCeSBkZWZhdWx0LCBhIHNlY3VyaXR5IGdyb3VwIHdpbGwgYmUgY3JlYXRlZCB3aXRoIGluYm91bmQgYWNjZXNzIHRvIHRoZSB0eXBpY2FsIHByaXZhdGUgbmV0d29yayBDSURSIHJhbmdlcyAxMC4wLjAuMC84LCAxNzIuMTYuMC4wLzEyLCAxOTIuMTY4LjAuMC8xNiBhbmQgcG9ydCA0NDMuXG4gICAqIEFueSBpbmJvdW5kIGFjY2VzcyAoMC4wLjAuMC8wKSBpcyBibG9ja2VkIGJ5IGRlZmF1bHQgdG8gZm9sbG93IEFXUyBiZXN0IHByYWN0aWNlcyBmb3Igc2VjdXJpdHkuXG4gICAqIE91dGJvdW5kIHRyYWZmaWMgaXMgYWxsb3dlZCB0byBhbGwgZGVzdGluYXRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cD86IGVjMi5JU2VjdXJpdHlHcm91cDtcblxuICAvKipcbiAgICogRW5hYmxlIG9yIGRpc2FibGUgYWNjZXNzIGxvZ3MgZm9yIHRoZSBsb2FkIGJhbGFuY2VyIHRvIGZvbGxvdyBBV1MgYmVzdCBwcmFjdGljZXMgZm9yIHNlY3VyaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVMb2FkQmFsYW5jZXJBY2Nlc3NMb2dzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWRkIGxvYWQgYmFsYW5jZXIgcmVkaXJlY3QgZnJvbSBwb3J0IDgwIHRvIDQ0My5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkTG9hZEJhbGFuY2VyUmVkaXJlY3Q/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxTZXJ2aWNlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgZG9tYWlucyBjcmVhdGVkIGJ5IHRoZSBpbnRlcm5hbCBzZXJ2aWNlIHN0YWNrIGFuZCBzaGFyZWQgd2l0aCB0aGUgYXBpIGdhdGV3YXkgc3RhY2suXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluczogYXBpZ2F0ZXdheS5JRG9tYWluTmFtZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gbG9hZCBiYWxhbmNlciBjcmVhdGVkIGJ5IHRoZSBpbnRlcm5hbCBzZXJ2aWNlIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyOiBlbGIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEludGVybmFsU2VydmljZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGRvbWFpbk5hbWUgPSBgJHtwcm9wcy5zdWJEb21haW59LiR7cHJvcHMuaG9zdGVkWm9uZS56b25lTmFtZX1gO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBuZXcgY2VydGlmaWNhdGVtYW5hZ2VyLkNlcnRpZmljYXRlKFxuICAgICAgdGhpcyxcbiAgICAgIGBTU0xDZXJ0aWZpY2F0ZS0ke2lkfWAsXG4gICAgICB7XG4gICAgICAgIGRvbWFpbk5hbWU6IGRvbWFpbk5hbWUsXG4gICAgICAgIHN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzOiBwcm9wcy5zdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyxcbiAgICAgICAgdmFsaWRhdGlvbjogY2VydGlmaWNhdGVtYW5hZ2VyLkNlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zTXVsdGlab25lKHtcbiAgICAgICAgICBkb21haW5OYW1lOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgICB9KSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgZG9tYWluID0gbmV3IGFwaWdhdGV3YXkuRG9tYWluTmFtZShcbiAgICAgIHRoaXMsXG4gICAgICBgQXBpR2F0ZXdheUN1c3RvbURvbWFpbi0ke2lkfWAsXG4gICAgICB7XG4gICAgICAgIGRvbWFpbk5hbWU6IGAke3Byb3BzLnN1YkRvbWFpbn0uJHtwcm9wcy5ob3N0ZWRab25lLnpvbmVOYW1lfWAsXG4gICAgICAgIGNlcnRpZmljYXRlOiBjZXJ0aWZpY2F0ZSxcbiAgICAgICAgZW5kcG9pbnRUeXBlOiBhcGlnYXRld2F5LkVuZHBvaW50VHlwZS5SRUdJT05BTCxcbiAgICAgICAgc2VjdXJpdHlQb2xpY3k6XG4gICAgICAgICAgcHJvcHM/LmN1c3RvbURvbWFpblNTTFBvbGljeSA/PyBhcGlnYXRld2F5LlNlY3VyaXR5UG9saWN5LlRMU18xXzIsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuZG9tYWlucyA9IFtkb21haW5dO1xuXG4gICAgZm9yIChjb25zdCBkb21haW5JdGVtIG9mIHByb3BzLnN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKSB7XG4gICAgICBjb25zdCBzYW5Eb21haW4gPSBuZXcgYXBpZ2F0ZXdheS5Eb21haW5OYW1lKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgRG9tYWluLSR7ZG9tYWluSXRlbX0tJHtpZH1gLFxuICAgICAgICB7XG4gICAgICAgICAgZG9tYWluTmFtZTogZG9tYWluSXRlbSxcbiAgICAgICAgICBjZXJ0aWZpY2F0ZTogY2VydGlmaWNhdGUsXG4gICAgICAgICAgZW5kcG9pbnRUeXBlOiBhcGlnYXRld2F5LkVuZHBvaW50VHlwZS5SRUdJT05BTCxcbiAgICAgICAgICBzZWN1cml0eVBvbGljeTogYXBpZ2F0ZXdheS5TZWN1cml0eVBvbGljeS5UTFNfMV8yLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhpcy5kb21haW5zLnB1c2goc2FuRG9tYWluKTtcbiAgICB9XG5cbiAgICBsZXQgc2dJbW11dGFibGU6IGVjMi5JU2VjdXJpdHlHcm91cDtcblxuICAgIGlmIChwcm9wcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwKSB7XG4gICAgICBzZ0ltbXV0YWJsZSA9IGVjMi5TZWN1cml0eUdyb3VwLmZyb21TZWN1cml0eUdyb3VwSWQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiTG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cEltbXV0YWJsZVwiLFxuICAgICAgICBwcm9wcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwPy5zZWN1cml0eUdyb3VwSWQsXG4gICAgICAgIHsgbXV0YWJsZTogZmFsc2UgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cCA9IG5ldyBlYzIuU2VjdXJpdHlHcm91cChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYExvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAtJHtpZH1gLFxuICAgICAgICB7XG4gICAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgICAgYWxsb3dBbGxPdXRib3VuZDogdHJ1ZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJzZWN1cml0eSBncm91cCBmb3IgYSBsb2FkIGJhbGFuY2VyXCIsXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAuYWRkSW5ncmVzc1J1bGUoXG4gICAgICAgIGVjMi5QZWVyLmlwdjQoXCIxMC4wLjAuMC84XCIpLFxuICAgICAgICBlYzIuUG9ydC50Y3AoNDQzKSxcbiAgICAgICAgXCJhbGxvdyBIVFRQUyB0cmFmZmljIGZyb20gcHJpdmF0ZSBDSURSIHJhbmdlXCJcbiAgICAgICk7XG4gICAgICBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgICBlYzIuUGVlci5pcHY0KFwiMTcyLjE2LjAuMC8xMlwiKSxcbiAgICAgICAgZWMyLlBvcnQudGNwKDQ0MyksXG4gICAgICAgIFwiYWxsb3cgSFRUUFMgdHJhZmZpYyBmcm9tIHByaXZhdGUgQ0lEUiByYW5nZVwiXG4gICAgICApO1xuICAgICAgbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgICAgZWMyLlBlZXIuaXB2NChcIjE5Mi4xNjguMC4wLzE2XCIpLFxuICAgICAgICBlYzIuUG9ydC50Y3AoNDQzKSxcbiAgICAgICAgXCJhbGxvdyBIVFRQUyB0cmFmZmljIGZyb20gcHJpdmF0ZSBDSURSIHJhbmdlXCJcbiAgICAgICk7XG5cbiAgICAgIHNnSW1tdXRhYmxlID0gZWMyLlNlY3VyaXR5R3JvdXAuZnJvbVNlY3VyaXR5R3JvdXBJZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJMb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwSW1tdXRhYmxlXCIsXG4gICAgICAgIGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAuc2VjdXJpdHlHcm91cElkLFxuICAgICAgICB7IG11dGFibGU6IGZhbHNlIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hcHBsaWNhdGlvbkxvYWRCYWxhbmNlciA9IG5ldyBlbGIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIoXG4gICAgICB0aGlzLFxuICAgICAgYEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLSR7aWR9YCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgICBzdWJuZXRzOiBwcm9wcy5zdWJuZXRTZWxlY3Rpb24uc3VibmV0cyxcbiAgICAgICAgfSxcbiAgICAgICAgaW50ZXJuZXRGYWNpbmc6IGZhbHNlLFxuICAgICAgICBzZWN1cml0eUdyb3VwOiBzZ0ltbXV0YWJsZSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgZW5hYmxlTG9hZEJhbGFuY2VyQWNjZXNzTG9ncyA9XG4gICAgICBwcm9wcy5lbmFibGVMb2FkQmFsYW5jZXJBY2Nlc3NMb2dzID8/IHRydWU7XG4gICAgaWYgKGVuYWJsZUxvYWRCYWxhbmNlckFjY2Vzc0xvZ3MpIHtcbiAgICAgIC8vY3JlYXRlIGEgcHJpdmF0ZSBzMyBidWNrZXRcbiAgICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgXCJBcHBsaWNhdGlvbkxvYWRCYWxhbmNlckxvZ3MtJHtpZH1cIiwge1xuICAgICAgICB2ZXJzaW9uZWQ6IHRydWUsXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IHMzLkJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgICAgZW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgLy9jcmVhdGUgYWNjZXNzIGxvZ3MgZm9yIHRoZSBsb2FkIGJhbGFuY2VyXG4gICAgICB0aGlzLmFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLmxvZ0FjY2Vzc0xvZ3MoYnVja2V0KTtcbiAgICB9XG4gICAgLy8gQWRkIGh0dHAtdG8taHR0cHMgcmVkaXJlY3RcbiAgICBjb25zdCBhZGRMb2FkQmFsYW5jZXJSZWRpcmVjdCA9IHByb3BzLmFkZExvYWRCYWxhbmNlclJlZGlyZWN0ID8/IHRydWU7XG4gICAgaWYgKGFkZExvYWRCYWxhbmNlclJlZGlyZWN0KSB7XG4gICAgICB0aGlzLmFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLmFkZFJlZGlyZWN0KCk7XG4gICAgfVxuXG4gICAgbmV3IHJvdXRlNTMuQVJlY29yZCh0aGlzLCBgUm91dGU1M1JlY29yZC0ke2lkfWAsIHtcbiAgICAgIHpvbmU6IHByb3BzLmhvc3RlZFpvbmUsXG4gICAgICB0YXJnZXQ6IHJvdXRlNTMuUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgbmV3IHRhcmdldHMuTG9hZEJhbGFuY2VyVGFyZ2V0KHRoaXMuYXBwbGljYXRpb25Mb2FkQmFsYW5jZXIpXG4gICAgICApLFxuICAgICAgcmVjb3JkTmFtZTogZG9tYWluTmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRhcmdldEdyb3VwVGFyZ2V0czogZWxhc3RpY2xvYWRiYWxhbmNpbmd2MnRhcmdldHMuSXBUYXJnZXRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBpcCBvZiBwcm9wcy52cGNFbmRwb2ludElQQWRkcmVzc2VzISkge1xuICAgICAgdGFyZ2V0R3JvdXBUYXJnZXRzLnB1c2gobmV3IGVsYXN0aWNsb2FkYmFsYW5jaW5ndjJ0YXJnZXRzLklwVGFyZ2V0KGlwKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0R3JvdXAgPSBuZXcgZWxiLkFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgYFRhcmdldEdyb3VwLSR7aWR9YCxcbiAgICAgIHtcbiAgICAgICAgcG9ydDogNDQzLFxuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgcHJvdG9jb2w6IGVsYi5BcHBsaWNhdGlvblByb3RvY29sLkhUVFBTLFxuICAgICAgICB0YXJnZXRUeXBlOiBlbGIuVGFyZ2V0VHlwZS5JUCxcbiAgICAgICAgdGFyZ2V0czogdGFyZ2V0R3JvdXBUYXJnZXRzLFxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMuYXBwbGljYXRpb25Mb2FkQmFsYW5jZXIuYWRkTGlzdGVuZXIoXG4gICAgICBgTGlzdGVuZXItJHtpZH1gLFxuICAgICAge1xuICAgICAgICBwb3J0OiA0NDMsXG4gICAgICAgIGNlcnRpZmljYXRlczogW2NlcnRpZmljYXRlXSxcbiAgICAgICAgc3NsUG9saWN5OlxuICAgICAgICAgIHByb3BzPy5sb2FkQmFsYW5jZXJMaXN0ZW5lclNTTFBvbGljeSA/P1xuICAgICAgICAgIGVsYi5Tc2xQb2xpY3kuRk9SV0FSRF9TRUNSRUNZX1RMUzEyX1JFU19HQ00sXG4gICAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgfVxuICAgICk7XG5cbiAgICBsaXN0ZW5lci5hZGRUYXJnZXRHcm91cHMoYFRhcmdldEdyb3VwQXR0YWNobWVudC0ke2lkfWAsIHtcbiAgICAgIHRhcmdldEdyb3VwczogW3RhcmdldEdyb3VwXSxcbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYERvbWFpblVybC0ke2lkfWAsIHtcbiAgICAgIHZhbHVlOiBgaHR0cHM6Ly8ke2RvbWFpbk5hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcInNlcnZpY2UgdXJsXCIsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==