UNPKG

@renovosolutions/cdk-library-cloudwatch-alarms

Version:

AWS CDK Construct Library to automatically create CloudWatch Alarms for resources in a CDK app based on resource type.

228 lines 39.1 kB
"use strict"; var _a, _b, _c, _d, _e; Object.defineProperty(exports, "__esModule", { value: true }); exports.NetworkTargetGroupRecommendedAlarmsAspect = exports.NetworkTargetGroup = exports.NetworkTargetGroupRecommendedAlarms = exports.NetworkTargetGroupUnHealthyHostCountAlarm = exports.NetworkTargetGroupHealthyHostCountAlarm = exports.NetworkTargetGroupRecommendedAlarmsMetrics = 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"); const common_1 = require("./common"); /** * The recommended metrics for NetworkTargetGroup alarms. */ var NetworkTargetGroupRecommendedAlarmsMetrics; (function (NetworkTargetGroupRecommendedAlarmsMetrics) { /** * The number of healthy targets in the target group. */ NetworkTargetGroupRecommendedAlarmsMetrics["HEALTHY_HOST_COUNT"] = "HealthyHostCount"; /** * The number of unhealthy targets in the target group. */ NetworkTargetGroupRecommendedAlarmsMetrics["UNHEALTHY_HOST_COUNT"] = "UnHealthyHostCount"; })(NetworkTargetGroupRecommendedAlarmsMetrics || (exports.NetworkTargetGroupRecommendedAlarmsMetrics = NetworkTargetGroupRecommendedAlarmsMetrics = {})); /** * This alarm is used to detect when the number of healthy hosts in the target group falls below the threshold. * * A low number of healthy hosts can indicate service availability issues. */ class NetworkTargetGroupHealthyHostCountAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.targetGroup.targetGroupName} - ${NetworkTargetGroupRecommendedAlarmsMetrics.HEALTHY_HOST_COUNT}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 5; const datapointsToAlarm = props.datapointsToAlarm ?? 5; const threshold = props.threshold ?? 1; const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const alarmDescription = props.alarmDescription ?? 'This alarm is used to detect when the number of healthy hosts in the target group falls below the threshold.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/NetworkELB', metricName: NetworkTargetGroupRecommendedAlarmsMetrics.HEALTHY_HOST_COUNT, dimensionsMap: { TargetGroup: props.targetGroup.targetGroupFullName, LoadBalancer: props.targetGroup.firstLoadBalancerFullName, }, statistic: 'Average', period, }), threshold, evaluationPeriods, datapointsToAlarm, treatMissingData, comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD, alarmDescription, }); if (props.alarmAction) this.addAlarmAction(props.alarmAction); if (props.okAction) this.addOkAction(props.okAction); if (props.insufficientDataAction) this.addInsufficientDataAction(props.insufficientDataAction); } } exports.NetworkTargetGroupHealthyHostCountAlarm = NetworkTargetGroupHealthyHostCountAlarm; _a = JSII_RTTI_SYMBOL_1; NetworkTargetGroupHealthyHostCountAlarm[_a] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.NetworkTargetGroupHealthyHostCountAlarm", version: "0.0.13" }; ; /** * This alarm is used to detect when the number of unhealthy hosts in the target group exceeds the threshold. * * A high number of unhealthy hosts can indicate service health issues. */ class NetworkTargetGroupUnHealthyHostCountAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.targetGroup.targetGroupName} - ${NetworkTargetGroupRecommendedAlarmsMetrics.UNHEALTHY_HOST_COUNT}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 5; const datapointsToAlarm = props.datapointsToAlarm ?? 5; const threshold = props.threshold ?? 0; const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const alarmDescription = props.alarmDescription ?? 'This alarm is used to detect when the number of unhealthy hosts in the target group exceeds the threshold'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/NetworkELB', metricName: NetworkTargetGroupRecommendedAlarmsMetrics.UNHEALTHY_HOST_COUNT, dimensionsMap: { TargetGroup: props.targetGroup.targetGroupFullName, LoadBalancer: props.targetGroup.firstLoadBalancerFullName, }, statistic: 'Average', period, }), threshold, evaluationPeriods, datapointsToAlarm, treatMissingData, comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD, alarmDescription, }); if (props.alarmAction) this.addAlarmAction(props.alarmAction); if (props.okAction) this.addOkAction(props.okAction); if (props.insufficientDataAction) this.addInsufficientDataAction(props.insufficientDataAction); } } exports.NetworkTargetGroupUnHealthyHostCountAlarm = NetworkTargetGroupUnHealthyHostCountAlarm; _b = JSII_RTTI_SYMBOL_1; NetworkTargetGroupUnHealthyHostCountAlarm[_b] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.NetworkTargetGroupUnHealthyHostCountAlarm", version: "0.0.13" }; ; /** * A construct that creates the recommended alarms for a NetworkTargetGroup. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/elb-metricscollected.html */ class NetworkTargetGroupRecommendedAlarms extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); if (!props.excludeAlarms?.includes(NetworkTargetGroupRecommendedAlarmsMetrics.HEALTHY_HOST_COUNT)) { this.alarmHealthyHostCount = new NetworkTargetGroupHealthyHostCountAlarm(this, `${props.targetGroup.node.id}_HealthyHostCount`, { targetGroup: props.targetGroup, treatMissingData: props.treatMissingData, ...props.configHealthyHostCountAlarm, }); if (props.defaultAlarmAction && !props.configHealthyHostCountAlarm?.alarmAction) { this.alarmHealthyHostCount.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configHealthyHostCountAlarm?.okAction) { this.alarmHealthyHostCount.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configHealthyHostCountAlarm?.insufficientDataAction) { this.alarmHealthyHostCount.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(NetworkTargetGroupRecommendedAlarmsMetrics.UNHEALTHY_HOST_COUNT)) { this.alarmUnHealthyHostCount = new NetworkTargetGroupUnHealthyHostCountAlarm(this, `${props.targetGroup.node.id}_UnHealthyHostCount`, { targetGroup: props.targetGroup, treatMissingData: props.treatMissingData, ...props.configUnHealthyHostCountAlarm, }); if (props.defaultAlarmAction && !props.configUnHealthyHostCountAlarm?.alarmAction) { this.alarmUnHealthyHostCount.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configUnHealthyHostCountAlarm?.okAction) { this.alarmUnHealthyHostCount.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configUnHealthyHostCountAlarm?.insufficientDataAction) { this.alarmUnHealthyHostCount.addInsufficientDataAction(props.defaultInsufficientDataAction); } } } } exports.NetworkTargetGroupRecommendedAlarms = NetworkTargetGroupRecommendedAlarms; _c = JSII_RTTI_SYMBOL_1; NetworkTargetGroupRecommendedAlarms[_c] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.NetworkTargetGroupRecommendedAlarms", version: "0.0.13" }; /** * An extension for the NetworkTargetGroup construct that provides methods * to create recommended alarms. */ class NetworkTargetGroup extends aws_cdk_lib_1.aws_elasticloadbalancingv2.NetworkTargetGroup { constructor(scope, id, props) { super(scope, id, props); } /** * Creates an alarm that monitors the healthy host count for the NetworkTargetGroup. */ alarmHealthyHostCount(props) { return new NetworkTargetGroupHealthyHostCountAlarm(this, 'HealthyHostCountAlarm', { targetGroup: this, ...props, }); } /** * Creates an alarm that monitors the unhealthy host count for the NetworkTargetGroup. */ alarmUnHealthyHostCount(props) { return new NetworkTargetGroupUnHealthyHostCountAlarm(this, 'UnHealthyHostCountAlarm', { targetGroup: this, ...props, }); } /** * Creates the recommended alarms for the NetworkTargetGroup. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/elb-metricscollected.html */ applyRecommendedAlarms(props) { return new NetworkTargetGroupRecommendedAlarms(this, 'NetworkTargetGroupRecommendedAlarms', { targetGroup: this, ...props, }); } } exports.NetworkTargetGroup = NetworkTargetGroup; _d = JSII_RTTI_SYMBOL_1; NetworkTargetGroup[_d] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.NetworkTargetGroup", version: "0.0.13" }; /** * Configures the recommended alarms for a NetworkTargetGroup. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/elb-metricscollected.html */ class NetworkTargetGroupRecommendedAlarmsAspect { constructor(props) { this.props = props; } visit(node) { if (node instanceof aws_cdk_lib_1.aws_elasticloadbalancingv2.NetworkTargetGroup) { if (this.props.excludeResources && this.props.excludeResources.includes(node.node.id)) { return; } else { const targetGroup = node; new NetworkTargetGroupRecommendedAlarms(targetGroup, 'NetworkTargetGroupRecommendedAlarmsFromAspect', { targetGroup, ...this.props, }); } } } } exports.NetworkTargetGroupRecommendedAlarmsAspect = NetworkTargetGroupRecommendedAlarmsAspect; _e = JSII_RTTI_SYMBOL_1; NetworkTargetGroupRecommendedAlarmsAspect[_e] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.NetworkTargetGroupRecommendedAlarmsAspect", version: "0.0.13" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya3RhcmdldGdyb3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25ldHdvcmt0YXJnZXRncm91cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUtxQjtBQUNyQiwyQ0FBbUQ7QUFDbkQscUNBQW9FO0FBRXBFOztHQUVHO0FBQ0gsSUFBWSwwQ0FTWDtBQVRELFdBQVksMENBQTBDO0lBQ3BEOztPQUVHO0lBQ0gscUZBQXVDLENBQUE7SUFDdkM7O09BRUc7SUFDSCx5RkFBMkMsQ0FBQTtBQUM3QyxDQUFDLEVBVFcsMENBQTBDLDBEQUExQywwQ0FBMEMsUUFTckQ7QUFvRUQ7Ozs7R0FJRztBQUNILE1BQWEsdUNBQXdDLFNBQVEsNEJBQVUsQ0FBQyxLQUFLO0lBQzNFLFlBQVksS0FBaUIsRUFBRSxFQUFVLEVBQUUsS0FBbUQ7UUFDNUYsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsZUFBZSxNQUFNLDBDQUEwQyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0ksTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7UUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixJQUFJLDRCQUFVLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO1FBQ3ZGLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixJQUFJLDhHQUE4RyxDQUFDO1FBRWxLLElBQUEsaUNBQXdC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QUM3QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUN0RixPQUFPO1lBQ1QsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sV0FBVyxHQUFHLElBQWdDLENBQUM7Z0JBRXJELElBQUksbUNBQW1DLENBQUMsV0FBVyxFQUFFLCtDQUErQyxFQUFFO29CQUNwRyxXQUFXO29CQUNYLEdBQUcsSUFBSSxDQUFDLEtBQUs7aUJBQ2QsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDOztBQWhCSCw4RkFpQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJQXNwZWN0LFxuICBhd3NfZWxhc3RpY2xvYWRiYWxhbmNpbmd2MiBhcyBlbGJ2MixcbiAgYXdzX2Nsb3Vkd2F0Y2ggYXMgY2xvdWR3YXRjaCxcbiAgRHVyYXRpb24sXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQWxhcm1CYXNlUHJvcHMsIHZhbGlkYXRlVG90YWxBbGFybVBlcmlvZCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBUaGUgcmVjb21tZW5kZWQgbWV0cmljcyBmb3IgTmV0d29ya1RhcmdldEdyb3VwIGFsYXJtcy5cbiAqL1xuZXhwb3J0IGVudW0gTmV0d29ya1RhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXNNZXRyaWNzIHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgaGVhbHRoeSB0YXJnZXRzIGluIHRoZSB0YXJnZXQgZ3JvdXAuXG4gICAqL1xuICBIRUFMVEhZX0hPU1RfQ09VTlQgPSAnSGVhbHRoeUhvc3RDb3VudCcsXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHVuaGVhbHRoeSB0YXJnZXRzIGluIHRoZSB0YXJnZXQgZ3JvdXAuXG4gICAqL1xuICBVTkhFQUxUSFlfSE9TVF9DT1VOVCA9ICdVbkhlYWx0aHlIb3N0Q291bnQnLFxufVxuXG4vKipcbiAqIFRoZSBjb21tb24gb3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGFsYXJtcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrVGFyZ2V0R3JvdXBBbGFybUJhc2VDb25maWcgZXh0ZW5kcyBBbGFybUJhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgcGVyaW9kIG92ZXIgd2hpY2ggdGhlIHNwZWNpZmllZCBzdGF0aXN0aWMgaXMgYXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24ubWludXRlcygxKVxuICAgKi9cbiAgcmVhZG9ubHkgcGVyaW9kPzogRHVyYXRpb247XG59XG5cbi8qKlxuICogVGhlIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciB0aGUgTmV0d29ya1RhcmdldEdyb3VwIGFsYXJtcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrVGFyZ2V0R3JvdXBBbGFybVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBOZXR3b3JrVGFyZ2V0R3JvdXAgdG8gbW9uaXRvci5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEdyb3VwOiBlbGJ2Mi5OZXR3b3JrVGFyZ2V0R3JvdXA7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIEhlYWx0aHlIb3N0Q291bnQgYWxhcm0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya1RhcmdldEdyb3VwSGVhbHRoeUhvc3RDb3VudEFsYXJtQ29uZmlnIGV4dGVuZHMgTmV0d29ya1RhcmdldEdyb3VwQWxhcm1CYXNlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBhZ2FpbnN0IHdoaWNoIHRoZSBzcGVjaWZpZWQgc3RhdGlzdGljIGlzIGNvbXBhcmVkLlxuICAgKiBZb3Ugc2hvdWxkIHNldCB0aGlzIHRocmVzaG9sZCBiYXNlZCBvbiB0aGUgbWluaW11bSBudW1iZXIgb2YgaGVhbHRoeSBob3N0c1xuICAgKiByZXF1aXJlZCBmb3IgeW91ciBhcHBsaWNhdGlvbiB0byBmdW5jdGlvbiBwcm9wZXJseS5cbiAgICpcbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgcmVhZG9ubHkgdGhyZXNob2xkPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBwZXJpb2RzIG92ZXIgd2hpY2ggZGF0YSBpcyBjb21wYXJlZCB0byB0aGUgc3BlY2lmaWVkIHRocmVzaG9sZC5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgZXZhbHVhdGlvblBlcmlvZHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIHRoYXQgbXVzdCBiZSBicmVhY2hpbmcgdG8gdHJpZ2dlciB0aGUgYWxhcm0uXG4gICAqXG4gICAqIEBkZWZhdWx0IDVcbiAgICovXG4gIHJlYWRvbmx5IGRhdGFwb2ludHNUb0FsYXJtPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGFsYXJtIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGFyZ2V0R3JvdXBOYW1lICsgJyAtIEhlYWx0aHlIb3N0Q291bnQnXG4gICAqL1xuICByZWFkb25seSBhbGFybU5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFsYXJtLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoaXMgYWxhcm0gaXMgdXNlZCB0byBkZXRlY3Qgd2hlbiB0aGUgbnVtYmVyIG9mIGhlYWx0aHkgaG9zdHMgaW4gdGhlIHRhcmdldCBncm91cFxuICAgKiBmYWxscyBiZWxvdyB0aGUgdGhyZXNob2xkLiBBIGxvdyBudW1iZXIgb2YgaGVhbHRoeSBob3N0cyBjYW4gaW5kaWNhdGUgc2VydmljZSBhdmFpbGFiaWxpdHkgaXNzdWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1EZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcHJvcGVydGllcyBmb3IgdGhlIE5ldHdvcmtUYXJnZXRHcm91cEhlYWx0aHlIb3N0Q291bnRBbGFybSBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya1RhcmdldEdyb3VwSGVhbHRoeUhvc3RDb3VudEFsYXJtUHJvcHMgZXh0ZW5kcyBOZXR3b3JrVGFyZ2V0R3JvdXBBbGFybVByb3BzLCBOZXR3b3JrVGFyZ2V0R3JvdXBIZWFsdGh5SG9zdENvdW50QWxhcm1Db25maWcge31cblxuLyoqXG4gKiBUaGlzIGFsYXJtIGlzIHVzZWQgdG8gZGV0ZWN0IHdoZW4gdGhlIG51bWJlciBvZiBoZWFsdGh5IGhvc3RzIGluIHRoZSB0YXJnZXQgZ3JvdXAgZmFsbHMgYmVsb3cgdGhlIHRocmVzaG9sZC5cbiAqXG4gKiBBIGxvdyBudW1iZXIgb2YgaGVhbHRoeSBob3N0cyBjYW4gaW5kaWNhdGUgc2VydmljZSBhdmFpbGFiaWxpdHkgaXNzdWVzLlxuICovXG5leHBvcnQgY2xhc3MgTmV0d29ya1RhcmdldEdyb3VwSGVhbHRoeUhvc3RDb3VudEFsYXJtIGV4dGVuZHMgY2xvdWR3YXRjaC5BbGFybSB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBJQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV0d29ya1RhcmdldEdyb3VwSGVhbHRoeUhvc3RDb3VudEFsYXJtUHJvcHMpIHtcbiAgICBjb25zdCBhbGFybU5hbWUgPSBwcm9wcy5hbGFybU5hbWUgPz8gYCR7cHJvcHMudGFyZ2V0R3JvdXAudGFyZ2V0R3JvdXBOYW1lfSAtICR7TmV0d29ya1RhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXNNZXRyaWNzLkhFQUxUSFlfSE9TVF9DT1VOVH1gO1xuICAgIGNvbnN0IHBlcmlvZCA9IHByb3BzLnBlcmlvZCA/PyBEdXJhdGlvbi5taW51dGVzKDEpO1xuICAgIGNvbnN0IGV2YWx1YXRpb25QZXJpb2RzID0gcHJvcHMuZXZhbHVhdGlvblBlcmlvZHMgPz8gNTtcbiAgICBjb25zdCBkYXRhcG9pbnRzVG9BbGFybSA9IHByb3BzLmRhdGFwb2ludHNUb0FsYXJtID8/IDU7XG4gICAgY29uc3QgdGhyZXNob2xkID0gcHJvcHMudGhyZXNob2xkID8/IDE7XG4gICAgY29uc3QgdHJlYXRNaXNzaW5nRGF0YSA9IHByb3BzLnRyZWF0TWlzc2luZ0RhdGEgPz8gY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk1JU1NJTkc7XG4gICAgY29uc3QgYWxhcm1EZXNjcmlwdGlvbiA9IHByb3BzLmFsYXJtRGVzY3JpcHRpb24gPz8gJ1RoaXMgYWxhcm0gaXMgdXNlZCB0byBkZXRlY3Qgd2hlbiB0aGUgbnVtYmVyIG9mIGhlYWx0aHkgaG9zdHMgaW4gdGhlIHRhcmdldCBncm91cCBmYWxscyBiZWxvdyB0aGUgdGhyZXNob2xkLic7XG5cbiAgICB2YWxpZGF0ZVRvdGFsQWxhcm1QZXJpb2QocGVyaW9kLCBldmFsdWF0aW9uUGVyaW9kcywgYWxhcm1OYW1lKTtcblxuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgYWxhcm1OYW1lLFxuICAgICAgbWV0cmljOiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgICBuYW1lc3BhY2U6ICdBV1MvTmV0d29ya0VMQicsXG4gICAgICAgIG1ldHJpY05hbWU6IE5ldHdvcmtUYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zTWV0cmljcy5IRUFMVEhZX0hPU1RfQ09VTlQsXG4gICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICBUYXJnZXRHcm91cDogcHJvcHMudGFyZ2V0R3JvdXAudGFyZ2V0R3JvdXBGdWxsTmFtZSxcbiAgICAgICAgICBMb2FkQmFsYW5jZXI6IHByb3BzLnRhcmdldEdyb3VwLmZpcnN0TG9hZEJhbGFuY2VyRnVsbE5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXRpc3RpYzogJ0F2ZXJhZ2UnLFxuICAgICAgICBwZXJpb2QsXG4gICAgICB9KSxcbiAgICAgIHRocmVzaG9sZCxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICB0cmVhdE1pc3NpbmdEYXRhLFxuICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5MRVNTX1RIQU5fVEhSRVNIT0xELFxuICAgICAgYWxhcm1EZXNjcmlwdGlvbixcbiAgICB9KTtcblxuICAgIGlmIChwcm9wcy5hbGFybUFjdGlvbikgdGhpcy5hZGRBbGFybUFjdGlvbihwcm9wcy5hbGFybUFjdGlvbik7XG4gICAgaWYgKHByb3BzLm9rQWN0aW9uKSB0aGlzLmFkZE9rQWN0aW9uKHByb3BzLm9rQWN0aW9uKTtcbiAgICBpZiAocHJvcHMuaW5zdWZmaWNpZW50RGF0YUFjdGlvbikgdGhpcy5hZGRJbnN1ZmZpY2llbnREYXRhQWN0aW9uKHByb3BzLmluc3VmZmljaWVudERhdGFBY3Rpb24pO1xuICB9XG59O1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBVbkhlYWx0aHlIb3N0Q291bnQgYWxhcm0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya1RhcmdldEdyb3VwVW5IZWFsdGh5SG9zdENvdW50QWxhcm1Db25maWcgZXh0ZW5kcyBOZXR3b3JrVGFyZ2V0R3JvdXBBbGFybUJhc2VDb25maWcge1xuICAvKipcbiAgICogVGhlIHZhbHVlIGFnYWluc3Qgd2hpY2ggdGhlIHNwZWNpZmllZCBzdGF0aXN0aWMgaXMgY29tcGFyZWQuXG4gICAqIFlvdSBzaG91bGQgc2V0IHRoaXMgdGhyZXNob2xkIGJhc2VkIG9uIHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bmhlYWx0aHkgaG9zdHNcbiAgICogdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGNhbiB0b2xlcmF0ZSBiZWZvcmUgc2VydmljZSBpcyBpbXBhY3RlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgcmVhZG9ubHkgdGhyZXNob2xkPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBwZXJpb2RzIG92ZXIgd2hpY2ggZGF0YSBpcyBjb21wYXJlZCB0byB0aGUgc3BlY2lmaWVkIHRocmVzaG9sZC5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgZXZhbHVhdGlvblBlcmlvZHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIHRoYXQgbXVzdCBiZSBicmVhY2hpbmcgdG8gdHJpZ2dlciB0aGUgYWxhcm0uXG4gICAqXG4gICAqIEBkZWZhdWx0IDVcbiAgICovXG4gIHJlYWRvbmx5IGRhdGFwb2ludHNUb0FsYXJtPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGFsYXJtIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGFyZ2V0R3JvdXBOYW1lICsgJyAtIFVuSGVhbHRoeUhvc3RDb3VudCdcbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYWxhcm0uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhpcyBhbGFybSBpcyB1c2VkIHRvIGRldGVjdCB3aGVuIHRoZSBudW1iZXIgb2YgdW5oZWFsdGh5IGhvc3RzIGluIHRoZSB0YXJnZXQgZ3JvdXBcbiAgICogZXhjZWVkcyB0aGUgdGhyZXNob2xkLiBBIGhpZ2ggbnVtYmVyIG9mIHVuaGVhbHRoeSBob3N0cyBjYW4gaW5kaWNhdGUgc2VydmljZSBoZWFsdGggaXNzdWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1EZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcHJvcGVydGllcyBmb3IgdGhlIE5ldHdvcmtUYXJnZXRHcm91cFVuSGVhbHRoeUhvc3RDb3VudEFsYXJtIGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrVGFyZ2V0R3JvdXBVbkhlYWx0aHlIb3N0Q291bnRBbGFybVByb3BzIGV4dGVuZHMgTmV0d29ya1RhcmdldEdyb3VwQWxhcm1Qcm9wcyxcbiAgTmV0d29ya1RhcmdldEdyb3VwVW5IZWFsdGh5SG9zdENvdW50QWxhcm1Db25maWcge31cblxuLyoqXG4gKiBUaGlzIGFsYXJtIGlzIHVzZWQgdG8gZGV0ZWN0IHdoZW4gdGhlIG51bWJlciBvZiB1bmhlYWx0aHkgaG9zdHMgaW4gdGhlIHRhcmdldCBncm91cCBleGNlZWRzIHRoZSB0aHJlc2hvbGQuXG4gKlxuICogQSBoaWdoIG51bWJlciBvZiB1bmhlYWx0aHkgaG9zdHMgY2FuIGluZGljYXRlIHNlcnZpY2UgaGVhbHRoIGlzc3Vlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5ldHdvcmtUYXJnZXRHcm91cFVuSGVhbHRoeUhvc3RDb3VudEFsYXJtIGV4dGVuZHMgY2xvdWR3YXRjaC5BbGFybSB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBJQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV0d29ya1RhcmdldEdyb3VwVW5IZWFsdGh5SG9zdENvdW50QWxhcm1Qcm9wcykge1xuICAgIGNvbnN0IGFsYXJtTmFtZSA9IHByb3BzLmFsYXJtTmFtZSA/PyBgJHtwcm9wcy50YXJnZXRHcm91cC50YXJnZXRHcm91cE5hbWV9IC0gJHtOZXR3b3JrVGFyZ2V0R3JvdXBSZWNvbW1lbmRlZEFsYXJtc01ldHJpY3MuVU5IRUFMVEhZX0hPU1RfQ09VTlR9YDtcbiAgICBjb25zdCBwZXJpb2QgPSBwcm9wcy5wZXJpb2QgPz8gRHVyYXRpb24ubWludXRlcygxKTtcbiAgICBjb25zdCBldmFsdWF0aW9uUGVyaW9kcyA9IHByb3BzLmV2YWx1YXRpb25QZXJpb2RzID8/IDU7XG4gICAgY29uc3QgZGF0YXBvaW50c1RvQWxhcm0gPSBwcm9wcy5kYXRhcG9pbnRzVG9BbGFybSA/PyA1O1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHByb3BzLnRocmVzaG9sZCA/PyAwO1xuICAgIGNvbnN0IHRyZWF0TWlzc2luZ0RhdGEgPSBwcm9wcy50cmVhdE1pc3NpbmdEYXRhID8/IGNsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YS5NSVNTSU5HO1xuICAgIGNvbnN0IGFsYXJtRGVzY3JpcHRpb24gPSBwcm9wcy5hbGFybURlc2NyaXB0aW9uID8/ICdUaGlzIGFsYXJtIGlzIHVzZWQgdG8gZGV0ZWN0IHdoZW4gdGhlIG51bWJlciBvZiB1bmhlYWx0aHkgaG9zdHMgaW4gdGhlIHRhcmdldCBncm91cCBleGNlZWRzIHRoZSB0aHJlc2hvbGQnO1xuXG4gICAgdmFsaWRhdGVUb3RhbEFsYXJtUGVyaW9kKHBlcmlvZCwgZXZhbHVhdGlvblBlcmlvZHMsIGFsYXJtTmFtZSk7XG5cbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGFsYXJtTmFtZSxcbiAgICAgIG1ldHJpYzogbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgICAgbmFtZXNwYWNlOiAnQVdTL05ldHdvcmtFTEInLFxuICAgICAgICBtZXRyaWNOYW1lOiBOZXR3b3JrVGFyZ2V0R3JvdXBSZWNvbW1lbmRlZEFsYXJtc01ldHJpY3MuVU5IRUFMVEhZX0hPU1RfQ09VTlQsXG4gICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICBUYXJnZXRHcm91cDogcHJvcHMudGFyZ2V0R3JvdXAudGFyZ2V0R3JvdXBGdWxsTmFtZSxcbiAgICAgICAgICBMb2FkQmFsYW5jZXI6IHByb3BzLnRhcmdldEdyb3VwLmZpcnN0TG9hZEJhbGFuY2VyRnVsbE5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXRpc3RpYzogJ0F2ZXJhZ2UnLFxuICAgICAgICBwZXJpb2QsXG4gICAgICB9KSxcbiAgICAgIHRocmVzaG9sZCxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICB0cmVhdE1pc3NpbmdEYXRhLFxuICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgYWxhcm1EZXNjcmlwdGlvbixcbiAgICB9KTtcblxuICAgIGlmIChwcm9wcy5hbGFybUFjdGlvbikgdGhpcy5hZGRBbGFybUFjdGlvbihwcm9wcy5hbGFybUFjdGlvbik7XG4gICAgaWYgKHByb3BzLm9rQWN0aW9uKSB0aGlzLmFkZE9rQWN0aW9uKHByb3BzLm9rQWN0aW9uKTtcbiAgICBpZiAocHJvcHMuaW5zdWZmaWNpZW50RGF0YUFjdGlvbikgdGhpcy5hZGRJbnN1ZmZpY2llbnREYXRhQWN0aW9uKHByb3BzLmluc3VmZmljaWVudERhdGFBY3Rpb24pO1xuICB9XG59O1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb25zIGZvciB0aGUgcmVjb21tZW5kZWQgYWxhcm1zIGZvciBhIE5ldHdvcmtUYXJnZXRHcm91cC5cbiAqXG4gKiBEZWZhdWx0IGFjdGlvbnMgYXJlIG92ZXJyaWRkZW4gYnkgdGhlIGFjdGlvbnMgc3BlY2lmaWVkIGluIHRoZVxuICogaW5kaXZpZHVhbCBhbGFybSBjb25maWd1cmF0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrVGFyZ2V0R3JvdXBSZWNvbW1lbmRlZEFsYXJtc0NvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBhY3Rpb24gdG8gdGFrZSB3aGVuIGFuIGFsYXJtIGlzIHRyaWdnZXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0QWxhcm1BY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGFjdGlvbiB0byB0YWtlIHdoZW4gYW4gYWxhcm0gZW50ZXJzIHRoZSBvayBzdGF0ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0T2tBY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGFjdGlvbiB0byB0YWtlIHdoZW4gYW4gYWxhcm0gaGFzIGluc3VmZmljaWVudCBkYXRhLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRJbnN1ZmZpY2llbnREYXRhQWN0aW9uPzogY2xvdWR3YXRjaC5JQWxhcm1BY3Rpb247XG4gIC8qKlxuICAgKiBIb3cgdG8gaGFuZGxlIG1pc3NpbmcgZGF0YSBmb3IgdGhpcyBhbGFybS5cbiAgICpcbiAgICogQGRlZmF1bHQgVHJlYXRNaXNzaW5nRGF0YS5NSVNTSU5HXG4gICAqL1xuICByZWFkb25seSB0cmVhdE1pc3NpbmdEYXRhPzogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhO1xuICAvKipcbiAgICogQWxhcm0gbWV0cmljcyB0byBleGNsdWRlIGZyb20gdGhlIHJlY29tbWVuZGVkIGFsYXJtcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlQWxhcm1zPzogTmV0d29ya1RhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXNNZXRyaWNzW107XG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2VzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgcmVjb21tZW5kZWQgYWxhcm1zLlxuICAgKlxuICAgKiBVc2UgYSByZXNvdXJjZXMgaWQgdG8gZXhjbHVkZSBhIHNwZWNpZmljIHJlc291cmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZVJlc291cmNlcz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBIZWFsdGh5SG9zdENvdW50IGFsYXJtLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnSGVhbHRoeUhvc3RDb3VudEFsYXJtPzogTmV0d29ya1RhcmdldEdyb3VwSGVhbHRoeUhvc3RDb3VudEFsYXJtQ29uZmlnO1xuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBVbkhlYWx0aHlIb3N0Q291bnQgYWxhcm0uXG4gICAqL1xuICByZWFkb25seSBjb25maWdVbkhlYWx0aHlIb3N0Q291bnRBbGFybT86IE5ldHdvcmtUYXJnZXRHcm91cFVuSGVhbHRoeUhvc3RDb3VudEFsYXJtQ29uZmlnO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBOZXR3b3JrVGFyZ2V0R3JvdXBSZWNvbW1lbmRlZEFsYXJtcyBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya1RhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXNQcm9wcyBleHRlbmRzIE5ldHdvcmtUYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBOZXR3b3JrVGFyZ2V0R3JvdXAgdG8gbW9uaXRvci5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEdyb3VwOiBlbGJ2Mi5OZXR3b3JrVGFyZ2V0R3JvdXA7XG59XG5cbi8qKlxuICogQSBjb25zdHJ1Y3QgdGhhdCBjcmVhdGVzIHRoZSByZWNvbW1lbmRlZCBhbGFybXMgZm9yIGEgTmV0d29ya1RhcmdldEdyb3VwLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvZWxiLW1ldHJpY3Njb2xsZWN0ZWQuaHRtbFxuICovXG5leHBvcnQgY2xhc3MgTmV0d29ya1RhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXMgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIEhlYWx0aHlIb3N0Q291bnQgYWxhcm0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWxhcm1IZWFsdGh5SG9zdENvdW50PzogTmV0d29ya1RhcmdldEdyb3VwSGVhbHRoeUhvc3RDb3VudEFsYXJtO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5IZWFsdGh5SG9zdENvdW50IGFsYXJtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFsYXJtVW5IZWFsdGh5SG9zdENvdW50PzogTmV0d29ya1RhcmdldEdyb3VwVW5IZWFsdGh5SG9zdENvdW50QWxhcm07XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5ldHdvcmtUYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKCFwcm9wcy5leGNsdWRlQWxhcm1zPy5pbmNsdWRlcyhOZXR3b3JrVGFyZ2V0R3JvdXBSZWNvbW1lbmRlZEFsYXJtc01ldHJpY3MuSEVBTFRIWV9IT1NUX0NPVU5UKSkge1xuICAgICAgdGhpcy5hbGFybUhlYWx0aHlIb3N0Q291bnQgPSBuZXcgTmV0d29ya1RhcmdldEdyb3VwSGVhbHRoeUhvc3RDb3VudEFsYXJtKHRoaXMsIGAke3Byb3BzLnRhcmdldEdyb3VwLm5vZGUuaWR9X0hlYWx0aHlIb3N0Q291bnRgLCB7XG4gICAgICAgIHRhcmdldEdyb3VwOiBwcm9wcy50YXJnZXRHcm91cCxcbiAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogcHJvcHMudHJlYXRNaXNzaW5nRGF0YSxcbiAgICAgICAgLi4ucHJvcHMuY29uZmlnSGVhbHRoeUhvc3RDb3VudEFsYXJtLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChwcm9wcy5kZWZhdWx0QWxhcm1BY3Rpb24gJiYgIXByb3BzLmNvbmZpZ0hlYWx0aHlIb3N0Q291bnRBbGFybT8uYWxhcm1BY3Rpb24pIHtcbiAgICAgICAgdGhpcy5hbGFybUhlYWx0aHlIb3N0Q291bnQuYWRkQWxhcm1BY3Rpb24ocHJvcHMuZGVmYXVsdEFsYXJtQWN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmRlZmF1bHRPa0FjdGlvbiAmJiAhcHJvcHMuY29uZmlnSGVhbHRoeUhvc3RDb3VudEFsYXJtPy5va0FjdGlvbikge1xuICAgICAgICB0aGlzLmFsYXJtSGVhbHRoeUhvc3RDb3VudC5hZGRPa0FjdGlvbihwcm9wcy5kZWZhdWx0T2tBY3Rpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMuZGVmYXVsdEluc3VmZmljaWVudERhdGFBY3Rpb24gJiYgIXByb3BzLmNvbmZpZ0hlYWx0aHlIb3N0Q291bnRBbGFybT8uaW5zdWZmaWNpZW50RGF0YUFjdGlvbikge1xuICAgICAgICB0aGlzLmFsYXJtSGVhbHRoeUhvc3RDb3VudC5hZGRJbnN1ZmZpY2llbnREYXRhQWN0aW9uKHByb3BzLmRlZmF1bHRJbnN1ZmZpY2llbnREYXRhQWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXByb3BzLmV4Y2x1ZGVBbGFybXM/LmluY2x1ZGVzKE5ldHdvcmtUYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zTWV0cmljcy5VTkhFQUxUSFlfSE9TVF9DT1VOVCkpIHtcbiAgICAgIHRoaXMuYWxhcm1VbkhlYWx0aHlIb3N0Q291bnQgPSBuZXcgTmV0d29ya1RhcmdldEdyb3VwVW5IZWFsdGh5SG9zdENvdW50QWxhcm0odGhpcywgYCR7cHJvcHMudGFyZ2V0R3JvdXAubm9kZS5pZH1fVW5IZWFsdGh5SG9zdENvdW50YCwge1xuICAgICAgICB0YXJnZXRHcm91cDogcHJvcHMudGFyZ2V0R3JvdXAsXG4gICAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IHByb3BzLnRyZWF0TWlzc2luZ0RhdGEsXG4gICAgICAgIC4uLnByb3BzLmNvbmZpZ1VuSGVhbHRoeUhvc3RDb3VudEFsYXJtLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChwcm9wcy5kZWZhdWx0QWxhcm1BY3Rpb24gJiYgIXByb3BzLmNvbmZpZ1VuSGVhbHRoeUhvc3RDb3VudEFsYXJtPy5hbGFybUFjdGlvbikge1xuICAgICAgICB0aGlzLmFsYXJtVW5IZWFsdGh5SG9zdENvdW50LmFkZEFsYXJtQWN0aW9uKHByb3BzLmRlZmF1bHRBbGFybUFjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5kZWZhdWx0T2tBY3Rpb24gJiYgIXByb3BzLmNvbmZpZ1VuSGVhbHRoeUhvc3RDb3VudEFsYXJtPy5va0FjdGlvbikge1xuICAgICAgICB0aGlzLmFsYXJtVW5IZWFsdGh5SG9zdENvdW50LmFkZE9rQWN0aW9uKHByb3BzLmRlZmF1bHRPa0FjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5kZWZhdWx0SW5zdWZmaWNpZW50RGF0YUFjdGlvbiAmJiAhcHJvcHMuY29uZmlnVW5IZWFsdGh5SG9zdENvdW50QWxhcm0/Lmluc3VmZmljaWVudERhdGFBY3Rpb24pIHtcbiAgICAgICAgdGhpcy5hbGFybVVuSGVhbHRoeUhvc3RDb3VudC5hZGRJbnN1ZmZpY2llbnREYXRhQWN0aW9uKHByb3BzLmRlZmF1bHRJbnN1ZmZpY2llbnREYXRhQWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBleHRlbnNpb24gZm9yIHRoZSBOZXR3b3JrVGFyZ2V0R3JvdXAgY29uc3RydWN0IHRoYXQgcHJvdmlkZXMgbWV0aG9kc1xuICogdG8gY3JlYXRlIHJlY29tbWVuZGVkIGFsYXJtcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5ldHdvcmtUYXJnZXRHcm91cCBleHRlbmRzIGVsYnYyLk5ldHdvcmtUYXJnZXRHcm91cCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBlbGJ2Mi5OZXR3b3JrVGFyZ2V0R3JvdXBQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gYWxhcm0gdGhhdCBtb25pdG9ycyB0aGUgaGVhbHRoeSBob3N0IGNvdW50IGZvciB0aGUgTmV0d29ya1RhcmdldEdyb3VwLlxuICAgKi9cbiAgcHVibGljIGFsYXJtSGVhbHRoeUhvc3RDb3VudChwcm9wcz86IE5ldHdvcmtUYXJnZXRHcm91cEhlYWx0aHlIb3N0Q291bnRBbGFybUNvbmZpZyk6IE5ldHdvcmtUYXJnZXRHcm91cEhlYWx0aHlIb3N0Q291bnRBbGFybSB7XG4gICAgcmV0dXJuIG5ldyBOZXR3b3JrVGFyZ2V0R3JvdXBIZWFsdGh5SG9zdENvdW50QWxhcm0odGhpcywgJ0hlYWx0aHlIb3N0Q291bnRBbGFybScsIHtcbiAgICAgIHRhcmdldEdyb3VwOiB0aGlzLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBhbGFybSB0aGF0IG1vbml0b3JzIHRoZSB1bmhlYWx0aHkgaG9zdCBjb3VudCBmb3IgdGhlIE5ldHdvcmtUYXJnZXRHcm91cC5cbiAgICovXG4gIHB1YmxpYyBhbGFybVVuSGVhbHRoeUhvc3RDb3VudChwcm9wcz86IE5ldHdvcmtUYXJnZXRHcm91cFVuSGVhbHRoeUhvc3RDb3VudEFsYXJtQ29uZmlnKTogTmV0d29ya1RhcmdldEdyb3VwVW5IZWFsdGh5SG9zdENvdW50QWxhcm0ge1xuICAgIHJldHVybiBuZXcgTmV0d29ya1RhcmdldEdyb3VwVW5IZWFsdGh5SG9zdENvdW50QWxhcm0odGhpcywgJ1VuSGVhbHRoeUhvc3RDb3VudEFsYXJtJywge1xuICAgICAgdGFyZ2V0R3JvdXA6IHRoaXMsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSByZWNvbW1lbmRlZCBhbGFybXMgZm9yIHRoZSBOZXR3b3JrVGFyZ2V0R3JvdXAuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvZWxiLW1ldHJpY3Njb2xsZWN0ZWQuaHRtbFxuICAgKi9cbiAgcHVibGljIGFwcGx5UmVjb21tZW5kZWRBbGFybXMocHJvcHM6IE5ldHdvcmtUYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zQ29uZmlnKTogTmV0d29ya1RhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXMge1xuICAgIHJldHVybiBuZXcgTmV0d29ya1RhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXModGhpcywgJ05ldHdvcmtUYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zJywge1xuICAgICAgdGFyZ2V0R3JvdXA6IHRoaXMsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIHJlY29tbWVuZGVkIGFsYXJtcyBmb3IgYSBOZXR3b3JrVGFyZ2V0R3JvdXAuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9lbGItbWV0cmljc2NvbGxlY3RlZC5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXR3b3JrVGFyZ2V0R3JvdXBSZWNvbW1lbmRlZEFsYXJtc0FzcGVjdCBpbXBsZW1lbnRzIElBc3BlY3Qge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBOZXR3b3JrVGFyZ2V0R3JvdXBSZWNvbW1lbmRlZEFsYXJtc0NvbmZpZykge31cblxuICBwdWJsaWMgdmlzaXQobm9kZTogSUNvbnN0cnVjdCk6IHZvaWQge1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgZWxidjIuTmV0d29ya1RhcmdldEdyb3VwKSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5leGNsdWRlUmVzb3VyY2VzICYmIHRoaXMucHJvcHMuZXhjbHVkZVJlc291cmNlcy5pbmNsdWRlcyhub2RlLm5vZGUuaWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEdyb3VwID0gbm9kZSBhcyBlbGJ2Mi5OZXR3b3JrVGFyZ2V0R3JvdXA7XG5cbiAgICAgICAgbmV3IE5ldHdvcmtUYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zKHRhcmdldEdyb3VwLCAnTmV0d29ya1RhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXNGcm9tQXNwZWN0Jywge1xuICAgICAgICAgIHRhcmdldEdyb3VwLFxuICAgICAgICAgIC4uLnRoaXMucHJvcHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSJdfQ==