UNPKG

@cdklabs/cdk-amazonmq

Version:
175 lines 32 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.ActiveMqBrokerRedundantPair = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); /* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ const aws_cdk_lib_1 = require("aws-cdk-lib"); const activemq_broker_deployment_1 = require("./activemq-broker-deployment"); const broker_deployment_mode_1 = require("../broker-deployment-mode"); /** * A representation of an active/standby broker that is comprised of two brokers in two different Availability Zones. * * Additional optimizations: * - When subnet selection returns more then 2 subnets. Construct picks first two that do belong to different AZ. Warning is annotated. If subnet selection does not meet AZ criteria an error is thrown. * * * see: https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/active-standby-broker-deployment.html */ class ActiveMqBrokerRedundantPair extends activemq_broker_deployment_1.ActiveMqBrokerDeploymentBase { /** * Reference an existing ActiveMQ Broker Redundant Pair, defined outside of the CDK code, by ARN. * * @param scope * @param logicalId the construct's logical ID * @param arn the ARN of the existing ActiveMQ Broker Redundant Pair that is imported * @param securityGroups optionally pass security groups for working with network connections * @returns a representation of the ActiveMQ Broker Redundant Pair */ static fromActiveMqBrokerRedundantPairArn(scope, logicalId, arn, securityGroups) { return ActiveMqBrokerRedundantPair._assignEndpoints(ActiveMqBrokerRedundantPair._fromActiveMqBrokerDeploymentAttributes(scope, logicalId, arn, undefined, undefined, securityGroups)); } /** * Reference an existing ActiveMQ Broker Redundant Pair, defined outside of the CDK code, by its name and id. * * @param scope * @param logicalId * @param name the name of the existing ActiveMQ Broker Redundant Pair to be imported * @param id the ID of the existing ActiveMQ Broker Redundant Pair to be imported * @param securityGroups (optional) pass security groups for working with network connections * @returns a representation of the ActiveMQ Broker Redundant Pair */ static fromActiveMqBrokerRedundantPairNameAndId(scope, logicalId, name, id, securityGroups) { return ActiveMqBrokerRedundantPair._assignEndpoints(ActiveMqBrokerRedundantPair._fromActiveMqBrokerDeploymentAttributes(scope, logicalId, undefined, name, id, securityGroups)); } /** * * @internal */ static _assignEndpoints(imported) { return Object.assign(imported, { first: ActiveMqBrokerRedundantPair._buildActiveMqBroker(imported, "-1"), second: ActiveMqBrokerRedundantPair._buildActiveMqBroker(imported, "-2"), }); } constructor(scope, id, props) { let subnetSelection = props.vpcSubnets; /* START - Validate subnets and select two with different AZ if more then 2 where found */ // This flag is used to determine if a annotation needs to be done const annotations = { warnings: new Array(), errors: new Array(), }; // check if subnet selection has been specified if (props.vpcSubnets && props.vpc) { let subnets = props.vpc?.selectSubnets(props.vpcSubnets); if (subnets) { if (subnets?.subnets.length < 2) { annotations.errors.push(`Need exactly 2 subnets. '${JSON.stringify(props.vpcSubnets)}', please use a different selection.`); } if (subnets?.subnets.length >= 2) { const azSubnet = []; // find first two entries that has different az from subnets.availabilityZones subnets.subnets.find((subnet, index) => { const candidates = subnets.subnets.filter((p) => p.availabilityZone != subnet.availabilityZone); if (candidates.length > 0) { azSubnet.push(subnets.subnets[index]); azSubnet.push(candidates[0]); return true; } return false; }); if (azSubnet.length >= 2) { // take only first two subnetSelection = { subnets: [azSubnet[0], azSubnet[1]] }; // display warning if other were rejected if (azSubnet.length > 2) { annotations.warnings.push(`Need exactly 2 subnets from different AZ found more. Selecting only two from different AZs: ${azSubnet[0].subnetId}, ${azSubnet[1].subnetId}`); } } else { annotations.warnings.push(`Requirement for exactly 2 subnets from different AZ is not be meet with '${JSON.stringify(props.vpcSubnets)}'`); } } } } /* END - Validate subnets and select two with different AZ if more then 2 where found */ super(scope, id, { ...props, vpcSubnets: subnetSelection, deploymentMode: broker_deployment_mode_1.BrokerDeploymentMode.ACTIVE_STANDBY_MULTI_AZ, }); // Provide Annotation to the resource. if (annotations.warnings.length > 0) { annotations.warnings.forEach((msg) => aws_cdk_lib_1.Annotations.of(this).addWarning(msg)); } if (annotations.errors.length > 0) { annotations.errors.forEach((msg) => aws_cdk_lib_1.Annotations.of(this).addWarning(msg)); } this.first = { endpoints: { amqp: { url: aws_cdk_lib_1.Fn.select(0, this._resource.attrAmqpEndpoints), port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(0, this._resource.attrAmqpEndpoints)))), }, stomp: { url: aws_cdk_lib_1.Fn.select(0, this._resource.attrStompEndpoints), port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(0, this._resource.attrStompEndpoints)))), }, openWire: { url: aws_cdk_lib_1.Fn.select(0, this._resource.attrOpenWireEndpoints), port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(0, this._resource.attrOpenWireEndpoints)))), }, mqtt: { url: aws_cdk_lib_1.Fn.select(0, this._resource.attrMqttEndpoints), port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(0, this._resource.attrMqttEndpoints)))), }, wss: { url: aws_cdk_lib_1.Fn.select(0, this._resource.attrWssEndpoints), port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(0, this._resource.attrWssEndpoints)))), }, console: { url: `https://${this.id}-1.mq.${aws_cdk_lib_1.Aws.REGION}.${aws_cdk_lib_1.Aws.URL_SUFFIX}:8162`, port: 8162, }, }, ipAddress: aws_cdk_lib_1.Fn.select(0, this._resource.attrIpAddresses), }; this.second = { endpoints: { amqp: { url: aws_cdk_lib_1.Fn.select(1, this._resource.attrAmqpEndpoints), port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(1, this._resource.attrAmqpEndpoints)))), }, stomp: { url: aws_cdk_lib_1.Fn.select(1, this._resource.attrStompEndpoints), port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(1, this._resource.attrStompEndpoints)))), }, openWire: { url: aws_cdk_lib_1.Fn.select(1, this._resource.attrOpenWireEndpoints), port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(1, this._resource.attrOpenWireEndpoints)))), }, mqtt: { url: aws_cdk_lib_1.Fn.select(1, this._resource.attrMqttEndpoints), port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(1, this._resource.attrMqttEndpoints)))), }, wss: { url: aws_cdk_lib_1.Fn.select(1, this._resource.attrWssEndpoints), port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(1, this._resource.attrWssEndpoints)))), }, console: { url: `https://${this.id}-2.mq.${aws_cdk_lib_1.Aws.REGION}.${aws_cdk_lib_1.Aws.URL_SUFFIX}:8162`, port: 8162, }, }, ipAddress: aws_cdk_lib_1.Fn.select(1, this._resource.attrIpAddresses), }; } } exports.ActiveMqBrokerRedundantPair = ActiveMqBrokerRedundantPair; _a = JSII_RTTI_SYMBOL_1; ActiveMqBrokerRedundantPair[_a] = { fqn: "@cdklabs/cdk-amazonmq.ActiveMqBrokerRedundantPair", version: "0.1.8" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlbXEtYnJva2VyLXJlZHVuZGFudC1wYWlyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGl2ZW1xL2FjdGl2ZW1xLWJyb2tlci1yZWR1bmRhbnQtcGFpci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBOzs7RUFHRTtBQUNGLDZDQUEwRDtBQUkxRCw2RUFJc0M7QUFDdEMsc0VBQWlFO0FBV2pFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBYSwyQkFDWCxTQUFRLHlEQUE0QjtJQUdwQzs7Ozs7Ozs7T0FRRztJQUNJLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FDOUMsS0FBZ0IsRUFDaEIsU0FBaUIsRUFDakIsR0FBVyxFQUNYLGNBQWlDO1FBRWpDLE9BQU8sMkJBQTJCLENBQUMsZ0JBQWdCLENBQ2pELDJCQUEyQixDQUFDLHVDQUF1QyxDQUNqRSxLQUFLLEVBQ0wsU0FBUyxFQUNULEdBQUcsRUFDSCxTQUFTLEVBQ1QsU0FBUyxFQUNULGNBQWMsQ0FDZixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksTUFBTSxDQUFDLHdDQUF3QyxDQUNwRCxLQUFnQixFQUNoQixTQUFpQixFQUNqQixJQUFZLEVBQ1osRUFBVSxFQUNWLGNBQWlDO1FBRWpDLE9BQU8sMkJBQTJCLENBQUMsZ0JBQWdCLENBQ2pELDJCQUEyQixDQUFDLHVDQUF1QyxDQUNqRSxLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEVBQ0osRUFBRSxFQUNGLGNBQWMsQ0FDZixDQUM4QixDQUFDO0lBQ3BDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxNQUFNLENBQUMsZ0JBQWdCLENBQzdCLFFBQW1DO1FBRW5DLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDN0IsS0FBSyxFQUFFLDJCQUEyQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7WUFDdkUsTUFBTSxFQUFFLDJCQUEyQixD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T0FBTztvQkFDbkUsSUFBSSxFQUFFLElBQUk7aUJBQ1g7YUFDRjtZQUNELFNBQVMsRUFBRSxnQkFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7U0FDeEQsQ0FBQztJQUNKLENBQUM7O0FBalJILGtFQWtSQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4qL1xuaW1wb3J0IHsgQXdzLCBGbiwgVG9rZW4sIEFubm90YXRpb25zIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBJU3VibmV0LCBJU2VjdXJpdHlHcm91cCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgSUFjdGl2ZU1xQnJva2VyIH0gZnJvbSBcIi4vYWN0aXZlbXEtYnJva2VyXCI7XG5pbXBvcnQge1xuICBBY3RpdmVNcUJyb2tlckRlcGxveW1lbnRCYXNlLFxuICBBY3RpdmVNcUJyb2tlckRlcGxveW1lbnRQcm9wcyxcbiAgSUFjdGl2ZU1xQnJva2VyRGVwbG95bWVudCxcbn0gZnJvbSBcIi4vYWN0aXZlbXEtYnJva2VyLWRlcGxveW1lbnRcIjtcbmltcG9ydCB7IEJyb2tlckRlcGxveW1lbnRNb2RlIH0gZnJvbSBcIi4uL2Jyb2tlci1kZXBsb3ltZW50LW1vZGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyXG4gIGV4dGVuZHMgSUFjdGl2ZU1xQnJva2VyRGVwbG95bWVudCB7XG4gIHJlYWRvbmx5IGZpcnN0OiBJQWN0aXZlTXFCcm9rZXI7XG4gIHJlYWRvbmx5IHNlY29uZDogSUFjdGl2ZU1xQnJva2VyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2ZU1xQnJva2VyUmVkdW5kYW50UGFpclByb3BzXG4gIGV4dGVuZHMgQWN0aXZlTXFCcm9rZXJEZXBsb3ltZW50UHJvcHMge31cblxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGFuIGFjdGl2ZS9zdGFuZGJ5IGJyb2tlciB0aGF0IGlzIGNvbXByaXNlZCBvZiB0d28gYnJva2VycyBpbiB0d28gZGlmZmVyZW50IEF2YWlsYWJpbGl0eSBab25lcy5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGltaXphdGlvbnM6XG4gKiAtIFdoZW4gc3VibmV0IHNlbGVjdGlvbiByZXR1cm5zIG1vcmUgdGhlbiAyIHN1Ym5ldHMuIENvbnN0cnVjdCBwaWNrcyBmaXJzdCB0d28gdGhhdCBkbyBiZWxvbmcgdG8gZGlmZmVyZW50IEFaLiBXYXJuaW5nIGlzIGFubm90YXRlZC4gSWYgc3VibmV0IHNlbGVjdGlvbiBkb2VzIG5vdCBtZWV0IEFaIGNyaXRlcmlhIGFuIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKlxuICogc2VlOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9uLW1xL2xhdGVzdC9kZXZlbG9wZXItZ3VpZGUvYWN0aXZlLXN0YW5kYnktYnJva2VyLWRlcGxveW1lbnQuaHRtbFxuICovXG5leHBvcnQgY2xhc3MgQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyXG4gIGV4dGVuZHMgQWN0aXZlTXFCcm9rZXJEZXBsb3ltZW50QmFzZVxuICBpbXBsZW1lbnRzIElBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXJcbntcbiAgLyoqXG4gICAqIFJlZmVyZW5jZSBhbiBleGlzdGluZyBBY3RpdmVNUSBCcm9rZXIgUmVkdW5kYW50IFBhaXIsIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgQ0RLIGNvZGUsIGJ5IEFSTi5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlXG4gICAqIEBwYXJhbSBsb2dpY2FsSWQgdGhlIGNvbnN0cnVjdCdzIGxvZ2ljYWwgSURcbiAgICogQHBhcmFtIGFybiB0aGUgQVJOIG9mIHRoZSBleGlzdGluZyBBY3RpdmVNUSBCcm9rZXIgUmVkdW5kYW50IFBhaXIgdGhhdCBpcyBpbXBvcnRlZFxuICAgKiBAcGFyYW0gc2VjdXJpdHlHcm91cHMgb3B0aW9uYWxseSBwYXNzIHNlY3VyaXR5IGdyb3VwcyBmb3Igd29ya2luZyB3aXRoIG5ldHdvcmsgY29ubmVjdGlvbnNcbiAgICogQHJldHVybnMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgQWN0aXZlTVEgQnJva2VyIFJlZHVuZGFudCBQYWlyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21BY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXJBcm4oXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgICBhcm46IHN0cmluZyxcbiAgICBzZWN1cml0eUdyb3Vwcz86IElTZWN1cml0eUdyb3VwW10sXG4gICk6IElBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXIge1xuICAgIHJldHVybiBBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXIuX2Fzc2lnbkVuZHBvaW50cyhcbiAgICAgIEFjdGl2ZU1xQnJva2VyUmVkdW5kYW50UGFpci5fZnJvbUFjdGl2ZU1xQnJva2VyRGVwbG95bWVudEF0dHJpYnV0ZXMoXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBsb2dpY2FsSWQsXG4gICAgICAgIGFybixcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHNlY3VyaXR5R3JvdXBzLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSBhbiBleGlzdGluZyBBY3RpdmVNUSBCcm9rZXIgUmVkdW5kYW50IFBhaXIsIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgQ0RLIGNvZGUsIGJ5IGl0cyBuYW1lIGFuZCBpZC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlXG4gICAqIEBwYXJhbSBsb2dpY2FsSWRcbiAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV4aXN0aW5nIEFjdGl2ZU1RIEJyb2tlciBSZWR1bmRhbnQgUGFpciB0byBiZSBpbXBvcnRlZFxuICAgKiBAcGFyYW0gaWQgdGhlIElEIG9mIHRoZSBleGlzdGluZyBBY3RpdmVNUSBCcm9rZXIgUmVkdW5kYW50IFBhaXIgdG8gYmUgaW1wb3J0ZWRcbiAgICogQHBhcmFtIHNlY3VyaXR5R3JvdXBzIChvcHRpb25hbCkgcGFzcyBzZWN1cml0eSBncm91cHMgZm9yIHdvcmtpbmcgd2l0aCBuZXR3b3JrIGNvbm5lY3Rpb25zXG4gICAqIEByZXR1cm5zIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIEFjdGl2ZU1RIEJyb2tlciBSZWR1bmRhbnQgUGFpclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyTmFtZUFuZElkKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgbG9naWNhbElkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc2VjdXJpdHlHcm91cHM/OiBJU2VjdXJpdHlHcm91cFtdLFxuICApIHtcbiAgICByZXR1cm4gQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyLl9hc3NpZ25FbmRwb2ludHMoXG4gICAgICBBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXIuX2Zyb21BY3RpdmVNcUJyb2tlckRlcGxveW1lbnRBdHRyaWJ1dGVzKFxuICAgICAgICBzY29wZSxcbiAgICAgICAgbG9naWNhbElkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGlkLFxuICAgICAgICBzZWN1cml0eUdyb3VwcyxcbiAgICAgICksXG4gICAgKSBhcyBJQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2Fzc2lnbkVuZHBvaW50cyhcbiAgICBpbXBvcnRlZDogSUFjdGl2ZU1xQnJva2VyRGVwbG95bWVudCxcbiAgKTogSUFjdGl2ZU1xQnJva2VyUmVkdW5kYW50UGFpciB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oaW1wb3J0ZWQsIHtcbiAgICAgIGZpcnN0OiBBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXIuX2J1aWxkQWN0aXZlTXFCcm9rZXIoaW1wb3J0ZWQsIFwiLTFcIiksXG4gICAgICBzZWNvbmQ6IEFjdGl2ZU1xQnJva2VyUmVkdW5kYW50UGFpci5fYnVpbGRBY3RpdmVNcUJyb2tlcihpbXBvcnRlZCwgXCItMlwiKSxcbiAgICB9IGFzIElBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmaXJzdCBicm9rZXIgb2YgdGhlIHJlZHVuZGFudCBwYWlyIGZvciB0aGUgZGVwbG95bWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmaXJzdDogSUFjdGl2ZU1xQnJva2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Vjb25kIGJyb2tlciBvZiB0aGUgcmVkdW5kYW50IHBhaXIgZm9yIHRoZSBkZXBsb3ltZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlY29uZDogSUFjdGl2ZU1xQnJva2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyUHJvcHMsXG4gICkge1xuICAgIGxldCBzdWJuZXRTZWxlY3Rpb24gPSBwcm9wcy52cGNTdWJuZXRzO1xuXG4gICAgLyogU1RBUlQgLSBWYWxpZGF0ZSBzdWJuZXRzIGFuZCBzZWxlY3QgdHdvIHdpdGggZGlmZmVyZW50IEFaIGlmIG1vcmUgdGhlbiAyIHdoZXJlIGZvdW5kICovXG4gICAgLy8gVGhpcyBmbGFnIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgYW5ub3RhdGlvbiBuZWVkcyB0byBiZSBkb25lXG4gICAgY29uc3QgYW5ub3RhdGlvbnMgPSB7XG4gICAgICB3YXJuaW5nczogbmV3IEFycmF5PHN0cmluZz4oKSxcbiAgICAgIGVycm9yczogbmV3IEFycmF5PHN0cmluZz4oKSxcbiAgICB9O1xuXG4gICAgLy8gY2hlY2sgaWYgc3VibmV0IHNlbGVjdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICBpZiAocHJvcHMudnBjU3VibmV0cyAmJiBwcm9wcy52cGMpIHtcbiAgICAgIGxldCBzdWJuZXRzID0gcHJvcHMudnBjPy5zZWxlY3RTdWJuZXRzKHByb3BzLnZwY1N1Ym5ldHMpO1xuXG4gICAgICBpZiAoc3VibmV0cykge1xuICAgICAgICBpZiAoc3VibmV0cz8uc3VibmV0cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgYW5ub3RhdGlvbnMuZXJyb3JzLnB1c2goXG4gICAgICAgICAgICBgTmVlZCBleGFjdGx5IDIgc3VibmV0cy4gJyR7SlNPTi5zdHJpbmdpZnkocHJvcHMudnBjU3VibmV0cyl9JywgcGxlYXNlIHVzZSBhIGRpZmZlcmVudCBzZWxlY3Rpb24uYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1Ym5ldHM/LnN1Ym5ldHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICBjb25zdCBhelN1Ym5ldDogSVN1Ym5ldFtdID0gW107XG5cbiAgICAgICAgICAvLyBmaW5kIGZpcnN0IHR3byBlbnRyaWVzIHRoYXQgaGFzIGRpZmZlcmVudCBheiBmcm9tIHN1Ym5ldHMuYXZhaWxhYmlsaXR5Wm9uZXNcbiAgICAgICAgICBzdWJuZXRzLnN1Ym5ldHMuZmluZCgoc3VibmV0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IHN1Ym5ldHMuc3VibmV0cy5maWx0ZXIoXG4gICAgICAgICAgICAgIChwKSA9PiBwLmF2YWlsYWJpbGl0eVpvbmUgIT0gc3VibmV0LmF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGF6U3VibmV0LnB1c2goc3VibmV0cy5zdWJuZXRzW2luZGV4XSk7XG4gICAgICAgICAgICAgIGF6U3VibmV0LnB1c2goY2FuZGlkYXRlc1swXSk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoYXpTdWJuZXQubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIC8vIHRha2Ugb25seSBmaXJzdCB0d29cbiAgICAgICAgICAgIHN1Ym5ldFNlbGVjdGlvbiA9IHsgc3VibmV0czogW2F6U3VibmV0WzBdLCBhelN1Ym5ldFsxXV0gfTtcblxuICAgICAgICAgICAgLy8gZGlzcGxheSB3YXJuaW5nIGlmIG90aGVyIHdlcmUgcmVqZWN0ZWRcbiAgICAgICAgICAgIGlmIChhelN1Ym5ldC5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgIGFubm90YXRpb25zLndhcm5pbmdzLnB1c2goXG4gICAgICAgICAgICAgICAgYE5lZWQgZXhhY3RseSAyIHN1Ym5ldHMgZnJvbSBkaWZmZXJlbnQgQVogZm91bmQgbW9yZS4gU2VsZWN0aW5nIG9ubHkgdHdvIGZyb20gZGlmZmVyZW50IEFaczogJHthelN1Ym5ldFswXS5zdWJuZXRJZH0sICR7YXpTdWJuZXRbMV0uc3VibmV0SWR9YCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnMud2FybmluZ3MucHVzaChcbiAgICAgICAgICAgICAgYFJlcXVpcmVtZW50IGZvciBleGFjdGx5IDIgc3VibmV0cyBmcm9tIGRpZmZlcmVudCBBWiBpcyBub3QgYmUgbWVldCB3aXRoICcke0pTT04uc3RyaW5naWZ5KHByb3BzLnZwY1N1Ym5ldHMpfSdgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBFTkQgLSBWYWxpZGF0ZSBzdWJuZXRzIGFuZCBzZWxlY3QgdHdvIHdpdGggZGlmZmVyZW50IEFaIGlmIG1vcmUgdGhlbiAyIHdoZXJlIGZvdW5kICovXG5cbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgdnBjU3VibmV0czogc3VibmV0U2VsZWN0aW9uLFxuICAgICAgZGVwbG95bWVudE1vZGU6IEJyb2tlckRlcGxveW1lbnRNb2RlLkFDVElWRV9TVEFOREJZX01VTFRJX0FaLFxuICAgIH0pO1xuXG4gICAgLy8gUHJvdmlkZSBBbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZS5cbiAgICBpZiAoYW5ub3RhdGlvbnMud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgYW5ub3RhdGlvbnMud2FybmluZ3MuZm9yRWFjaCgobXNnKSA9PlxuICAgICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nKG1zZyksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhbm5vdGF0aW9ucy5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgYW5ub3RhdGlvbnMuZXJyb3JzLmZvckVhY2goKG1zZykgPT4gQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhtc2cpKTtcbiAgICB9XG5cbiAgICB0aGlzLmZpcnN0ID0ge1xuICAgICAgZW5kcG9pbnRzOiB7XG4gICAgICAgIGFtcXA6IHtcbiAgICAgICAgICB1cmw6IEZuLnNlbGVjdCgwLCB0aGlzLl9yZXNvdXJjZS5hdHRyQW1xcEVuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMCwgdGhpcy5fcmVzb3VyY2UuYXR0ckFtcXBFbmRwb2ludHMpKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RvbXA6IHtcbiAgICAgICAgICB1cmw6IEZuLnNlbGVjdCgwLCB0aGlzLl9yZXNvdXJjZS5hdHRyU3RvbXBFbmRwb2ludHMpLFxuICAgICAgICAgIHBvcnQ6IFRva2VuLmFzTnVtYmVyKFxuICAgICAgICAgICAgRm4uc2VsZWN0KFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICBGbi5zcGxpdChcIjpcIiwgRm4uc2VsZWN0KDAsIHRoaXMuX3Jlc291cmNlLmF0dHJTdG9tcEVuZHBvaW50cykpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBvcGVuV2lyZToge1xuICAgICAgICAgIHVybDogRm4uc2VsZWN0KDAsIHRoaXMuX3Jlc291cmNlLmF0dHJPcGVuV2lyZUVuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMCwgdGhpcy5fcmVzb3VyY2UuYXR0ck9wZW5XaXJlRW5kcG9pbnRzKSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1xdHQ6IHtcbiAgICAgICAgICB1cmw6IEZuLnNlbGVjdCgwLCB0aGlzLl9yZXNvdXJjZS5hdHRyTXF0dEVuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMCwgdGhpcy5fcmVzb3VyY2UuYXR0ck1xdHRFbmRwb2ludHMpKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgd3NzOiB7XG4gICAgICAgICAgdXJsOiBGbi5zZWxlY3QoMCwgdGhpcy5fcmVzb3VyY2UuYXR0cldzc0VuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMCwgdGhpcy5fcmVzb3VyY2UuYXR0cldzc0VuZHBvaW50cykpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBjb25zb2xlOiB7XG4gICAgICAgICAgdXJsOiBgaHR0cHM6Ly8ke3RoaXMuaWR9LTEubXEuJHtBd3MuUkVHSU9OfS4ke0F3cy5VUkxfU1VGRklYfTo4MTYyYCxcbiAgICAgICAgICBwb3J0OiA4MTYyLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGlwQWRkcmVzczogRm4uc2VsZWN0KDAsIHRoaXMuX3Jlc291cmNlLmF0dHJJcEFkZHJlc3NlcyksXG4gICAgfTtcblxuICAgIHRoaXMuc2Vjb25kID0ge1xuICAgICAgZW5kcG9pbnRzOiB7XG4gICAgICAgIGFtcXA6IHtcbiAgICAgICAgICB1cmw6IEZuLnNlbGVjdCgxLCB0aGlzLl9yZXNvdXJjZS5hdHRyQW1xcEVuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMSwgdGhpcy5fcmVzb3VyY2UuYXR0ckFtcXBFbmRwb2ludHMpKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RvbXA6IHtcbiAgICAgICAgICB1cmw6IEZuLnNlbGVjdCgxLCB0aGlzLl9yZXNvdXJjZS5hdHRyU3RvbXBFbmRwb2ludHMpLFxuICAgICAgICAgIHBvcnQ6IFRva2VuLmFzTnVtYmVyKFxuICAgICAgICAgICAgRm4uc2VsZWN0KFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICBGbi5zcGxpdChcIjpcIiwgRm4uc2VsZWN0KDEsIHRoaXMuX3Jlc291cmNlLmF0dHJTdG9tcEVuZHBvaW50cykpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBvcGVuV2lyZToge1xuICAgICAgICAgIHVybDogRm4uc2VsZWN0KDEsIHRoaXMuX3Jlc291cmNlLmF0dHJPcGVuV2lyZUVuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMSwgdGhpcy5fcmVzb3VyY2UuYXR0ck9wZW5XaXJlRW5kcG9pbnRzKSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1xdHQ6IHtcbiAgICAgICAgICB1cmw6IEZuLnNlbGVjdCgxLCB0aGlzLl9yZXNvdXJjZS5hdHRyTXF0dEVuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMSwgdGhpcy5fcmVzb3VyY2UuYXR0ck1xdHRFbmRwb2ludHMpKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgd3NzOiB7XG4gICAgICAgICAgdXJsOiBGbi5zZWxlY3QoMSwgdGhpcy5fcmVzb3VyY2UuYXR0cldzc0VuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMSwgdGhpcy5fcmVzb3VyY2UuYXR0cldzc0VuZHBvaW50cykpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBjb25zb2xlOiB7XG4gICAgICAgICAgdXJsOiBgaHR0cHM6Ly8ke3RoaXMuaWR9LTIubXEuJHtBd3MuUkVHSU9OfS4ke0F3cy5VUkxfU1VGRklYfTo4MTYyYCxcbiAgICAgICAgICBwb3J0OiA4MTYyLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGlwQWRkcmVzczogRm4uc2VsZWN0KDEsIHRoaXMuX3Jlc291cmNlLmF0dHJJcEFkZHJlc3NlcyksXG4gICAgfTtcbiAgfVxufVxuIl19