UNPKG

cdk-monitoring-constructs

Version:

[![NPM version](https://badge.fury.io/js/cdk-monitoring-constructs.svg)](https://badge.fury.io/js/cdk-monitoring-constructs) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.cdklabs/cdkmonitoringconstructs/badge.svg)](https://m

151 lines 23.6 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.EC2Monitoring = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const EC2MetricFactory_1 = require("./EC2MetricFactory"); const common_1 = require("../../common"); const EC2AlarmFactory_1 = require("../../common/monitoring/alarms/EC2AlarmFactory"); const dashboard_1 = require("../../dashboard"); class EC2Monitoring extends common_1.Monitoring { constructor(scope, props) { super(scope, props); const fallbackConstructName = props.autoScalingGroup ? props.autoScalingGroup.autoScalingGroupName : "All Instances"; const namingStrategy = new dashboard_1.MonitoringNamingStrategy({ ...props, fallbackConstructName, }); this.family = props.autoScalingGroup ? "EC2 Auto Scaling Group" : "EC2"; this.title = namingStrategy.resolveHumanReadableName(); this.networkOutSumLimitAnnotations = []; this.networkInSumLimitAnnotations = []; const metricFactory = new EC2MetricFactory_1.EC2MetricFactory(scope.createMetricFactory(), props); // using different fallback alarm construct name // as alarms don't allow whitespace const fallbackAlarmConstructName = props.autoScalingGroup ? props.autoScalingGroup.autoScalingGroupName : "All-Instances"; const namingAlarmStrategy = new dashboard_1.MonitoringNamingStrategy({ ...props, fallbackConstructName: fallbackAlarmConstructName, }); const alarmFactory = this.createAlarmFactory(namingAlarmStrategy.resolveAlarmFriendlyName()); this.ec2AlarmFactory = new EC2AlarmFactory_1.EC2AlarmFactory(alarmFactory); this.cpuUtilisationMetrics = metricFactory.metricAverageCpuUtilisationPercent(); this.diskReadBytesMetrics = metricFactory.metricAverageDiskReadBytes(); this.diskWriteBytesMetrics = metricFactory.metricAverageDiskWriteBytes(); this.diskReadOpsMetrics = metricFactory.metricAverageDiskReadOps(); this.diskWriteOpsMetrics = metricFactory.metricAverageDiskWriteOps(); this.networkInMetrics = metricFactory.metricAverageNetworkInRateBytes(); this.networkOutMetrics = metricFactory.metricAverageNetworkOutRateBytes(); this.networkInSumMetrics = metricFactory.metricSumNetworkInRateBytes(); this.networkOutSumMetrics = metricFactory.metricSumNetworkOutRateBytes(); for (const disambiguator in props.addNetworkInTotalBytesExceedThresholdAlarm) { const alarmProps = props.addNetworkInTotalBytesExceedThresholdAlarm[disambiguator]; const createdAlarms = this.networkInSumMetrics.map((metric, idx) => { const indexedDisambiguator = idx > 0 ? `${disambiguator}-${idx}` : disambiguator; const createdAlarm = this.ec2AlarmFactory.addNetworkInAlarm(metric, alarmProps, indexedDisambiguator); this.addAlarm(createdAlarm); return createdAlarm; }); if (createdAlarms.length > 0) { this.networkInSumLimitAnnotations.push(createdAlarms[0].annotation); } } for (const disambiguator in props.addNetworkOutTotalBytesExceedThresholdAlarm) { const alarmProps = props.addNetworkOutTotalBytesExceedThresholdAlarm[disambiguator]; const createdAlarms = this.networkOutSumMetrics.map((metric, idx) => { const indexedDisambiguator = idx > 0 ? `${disambiguator}-${idx}` : disambiguator; const createdAlarm = this.ec2AlarmFactory.addNetworkOutAlarm(metric, alarmProps, indexedDisambiguator); this.addAlarm(createdAlarm); return createdAlarm; }); if (createdAlarms.length > 0) { this.networkOutSumLimitAnnotations.push(createdAlarms[0].annotation); } } props.useCreatedAlarms?.consume(this.createdAlarms()); } summaryWidgets() { return [ // Title this.createTitleWidget(), // CPU Usage this.createCpuWidget(common_1.ThirdWidth, common_1.DefaultSummaryWidgetHeight), // Disk OPS this.createDiskOpsWidget(common_1.ThirdWidth, common_1.DefaultSummaryWidgetHeight), // Network this.createNetworkWidget(common_1.ThirdWidth, common_1.DefaultSummaryWidgetHeight), ]; } widgets() { return [ // Title this.createTitleWidget(), // CPU Usage this.createCpuWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), // Disk OPS this.createDiskOpsWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), // Disk Bytes this.createDiskWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), // Network this.createNetworkWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), ]; } createTitleWidget() { return new dashboard_1.MonitoringHeaderWidget({ family: this.family, title: this.title, }); } createCpuWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "CPU Utilization", left: [...this.cpuUtilisationMetrics], leftYAxis: common_1.PercentageAxisFromZeroToHundred, }); } createDiskWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Disk - Bytes", left: [...this.diskReadBytesMetrics, ...this.diskWriteBytesMetrics], leftYAxis: common_1.SizeAxisBytesFromZero, }); } createDiskOpsWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Disk - OPS", left: [...this.diskReadOpsMetrics, ...this.diskWriteOpsMetrics], leftYAxis: common_1.CountAxisFromZero, }); } createNetworkWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Network", left: [...this.networkInMetrics, ...this.networkOutMetrics], leftYAxis: common_1.SizeAxisBytesFromZero, right: [...this.networkInSumMetrics, ...this.networkOutSumMetrics], rightYAxis: common_1.SizeAxisBytesFromZero, rightAnnotations: [ ...this.networkInSumLimitAnnotations, ...this.networkOutSumLimitAnnotations, ], }); } } exports.EC2Monitoring = EC2Monitoring; _a = JSII_RTTI_SYMBOL_1; EC2Monitoring[_a] = { fqn: "cdk-monitoring-constructs.EC2Monitoring", version: "9.19.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRUMyTW9uaXRvcmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkVDMk1vbml0b3JpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrREFLb0M7QUFFcEMseURBQTZFO0FBQzdFLHlDQVlzQjtBQUN0QixvRkFJd0Q7QUFDeEQsK0NBR3lCO0FBa0J6QixNQUFhLGFBQWMsU0FBUSxtQkFBVTtJQW9CM0MsWUFBWSxLQUFzQixFQUFFLEtBQXlCO1FBQzNELEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFcEIsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLENBQUMsZ0JBQWdCO1lBQ2xELENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CO1lBQzdDLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFDcEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxvQ0FBd0IsQ0FBQztZQUNsRCxHQUFHLEtBQUs7WUFDUixxQkFBcUI7U0FDdEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDeEUsSUFBSSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsNkJBQTZCLEdBQUcsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxFQUFFLENBQUM7UUFFdkMsTUFBTSxhQUFhLEdBQUcsSUFBSSxtQ0FBZ0IsQ0FDeEMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLEVBQzNCLEtBQUssQ0FDTixDQUFDO1FBRUYsZ0RBQWdEO1FBQ2hELG1DQUFtQztRQUNuQyxNQUFNLDBCQUEwQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0I7WUFDdkQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0I7WUFDN0MsQ0FBQyxDQUFDLGVBQWUs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QixFQUFFLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQ2xFLFVBQVUsRUFBRSw4QkFBcUI7WUFDakMsZ0JBQWdCLEVBQUU7Z0JBQ2hCLEdBQUcsSUFBSSxDQUFDLDRCQUE0QjtnQkFDcEMsR0FBRyxJQUFJLENBQUMsNkJBQTZCO2FBQ3RDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE1TEgsc0NBNkxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgR3JhcGhXaWRnZXQsXG4gIEhvcml6b250YWxBbm5vdGF0aW9uLFxuICBJTWV0cmljLFxuICBJV2lkZ2V0LFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcblxuaW1wb3J0IHsgRUMyTWV0cmljRmFjdG9yeSwgRUMyTWV0cmljRmFjdG9yeVByb3BzIH0gZnJvbSBcIi4vRUMyTWV0cmljRmFjdG9yeVwiO1xuaW1wb3J0IHtcbiAgQmFzZU1vbml0b3JpbmdQcm9wcyxcbiAgQ291bnRBeGlzRnJvbVplcm8sXG4gIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCxcbiAgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQsXG4gIE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG4gIE1vbml0b3JpbmcsXG4gIE1vbml0b3JpbmdTY29wZSxcbiAgUGVyY2VudGFnZUF4aXNGcm9tWmVyb1RvSHVuZHJlZCxcbiAgUXVhcnRlcldpZHRoLFxuICBTaXplQXhpc0J5dGVzRnJvbVplcm8sXG4gIFRoaXJkV2lkdGgsXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7XG4gIEVDMkFsYXJtRmFjdG9yeSxcbiAgTmV0d29ya0luVGhyZXNob2xkLFxuICBOZXR3b3JrT3V0VGhyZXNob2xkLFxufSBmcm9tIFwiLi4vLi4vY29tbW9uL21vbml0b3JpbmcvYWxhcm1zL0VDMkFsYXJtRmFjdG9yeVwiO1xuaW1wb3J0IHtcbiAgTW9uaXRvcmluZ0hlYWRlcldpZGdldCxcbiAgTW9uaXRvcmluZ05hbWluZ1N0cmF0ZWd5LFxufSBmcm9tIFwiLi4vLi4vZGFzaGJvYXJkXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRUMyTW9uaXRvcmluZ09wdGlvbnNcbiAgZXh0ZW5kcyBFQzJNZXRyaWNGYWN0b3J5UHJvcHMsXG4gICAgQmFzZU1vbml0b3JpbmdQcm9wcyB7XG4gIHJlYWRvbmx5IGFkZE5ldHdvcmtPdXRUb3RhbEJ5dGVzRXhjZWVkVGhyZXNob2xkQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIE5ldHdvcmtPdXRUaHJlc2hvbGRcbiAgPjtcblxuICByZWFkb25seSBhZGROZXR3b3JrSW5Ub3RhbEJ5dGVzRXhjZWVkVGhyZXNob2xkQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIE5ldHdvcmtJblRocmVzaG9sZFxuICA+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVDMk1vbml0b3JpbmdQcm9wcyBleHRlbmRzIEVDMk1vbml0b3JpbmdPcHRpb25zIHt9XG5cbmV4cG9ydCBjbGFzcyBFQzJNb25pdG9yaW5nIGV4dGVuZHMgTW9uaXRvcmluZyB7XG4gIHJlYWRvbmx5IGZhbWlseTogc3RyaW5nO1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IGVjMkFsYXJtRmFjdG9yeTogRUMyQWxhcm1GYWN0b3J5O1xuXG4gIHJlYWRvbmx5IGNwdVV0aWxpc2F0aW9uTWV0cmljczogSU1ldHJpY1tdO1xuICByZWFkb25seSBkaXNrUmVhZEJ5dGVzTWV0cmljczogSU1ldHJpY1tdO1xuICByZWFkb25seSBkaXNrV3JpdGVCeXRlc01ldHJpY3M6IElNZXRyaWNbXTtcbiAgcmVhZG9ubHkgZGlza1JlYWRPcHNNZXRyaWNzOiBJTWV0cmljW107XG4gIHJlYWRvbmx5IGRpc2tXcml0ZU9wc01ldHJpY3M6IElNZXRyaWNbXTtcbiAgcmVhZG9ubHkgbmV0d29ya0luTWV0cmljczogTWV0cmljV2l0aEFsYXJtU3VwcG9ydFtdO1xuICByZWFkb25seSBuZXR3b3JrT3V0TWV0cmljczogTWV0cmljV2l0aEFsYXJtU3VwcG9ydFtdO1xuXG4gIHJlYWRvbmx5IG5ldHdvcmtJblN1bU1ldHJpY3M6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnRbXTtcbiAgcmVhZG9ubHkgbmV0d29ya091dFN1bU1ldHJpY3M6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnRbXTtcblxuICByZWFkb25seSBuZXR3b3JrSW5TdW1MaW1pdEFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuICByZWFkb25seSBuZXR3b3JrT3V0U3VtTGltaXRBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogTW9uaXRvcmluZ1Njb3BlLCBwcm9wczogRUMyTW9uaXRvcmluZ1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIHByb3BzKTtcblxuICAgIGNvbnN0IGZhbGxiYWNrQ29uc3RydWN0TmFtZSA9IHByb3BzLmF1dG9TY2FsaW5nR3JvdXBcbiAgICAgID8gcHJvcHMuYXV0b1NjYWxpbmdHcm91cC5hdXRvU2NhbGluZ0dyb3VwTmFtZVxuICAgICAgOiBcIkFsbCBJbnN0YW5jZXNcIjtcbiAgICBjb25zdCBuYW1pbmdTdHJhdGVneSA9IG5ldyBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3koe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBmYWxsYmFja0NvbnN0cnVjdE5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5mYW1pbHkgPSBwcm9wcy5hdXRvU2NhbGluZ0dyb3VwID8gXCJFQzIgQXV0byBTY2FsaW5nIEdyb3VwXCIgOiBcIkVDMlwiO1xuICAgIHRoaXMudGl0bGUgPSBuYW1pbmdTdHJhdGVneS5yZXNvbHZlSHVtYW5SZWFkYWJsZU5hbWUoKTtcbiAgICB0aGlzLm5ldHdvcmtPdXRTdW1MaW1pdEFubm90YXRpb25zID0gW107XG4gICAgdGhpcy5uZXR3b3JrSW5TdW1MaW1pdEFubm90YXRpb25zID0gW107XG5cbiAgICBjb25zdCBtZXRyaWNGYWN0b3J5ID0gbmV3IEVDMk1ldHJpY0ZhY3RvcnkoXG4gICAgICBzY29wZS5jcmVhdGVNZXRyaWNGYWN0b3J5KCksXG4gICAgICBwcm9wcyxcbiAgICApO1xuXG4gICAgLy8gdXNpbmcgZGlmZmVyZW50IGZhbGxiYWNrIGFsYXJtIGNvbnN0cnVjdCBuYW1lXG4gICAgLy8gYXMgYWxhcm1zIGRvbid0IGFsbG93IHdoaXRlc3BhY2VcbiAgICBjb25zdCBmYWxsYmFja0FsYXJtQ29uc3RydWN0TmFtZSA9IHByb3BzLmF1dG9TY2FsaW5nR3JvdXBcbiAgICAgID8gcHJvcHMuYXV0b1NjYWxpbmdHcm91cC5hdXRvU2NhbGluZ0dyb3VwTmFtZVxuICAgICAgOiBcIkFsbC1JbnN0YW5jZXNcIjtcbiAgICBjb25zdCBuYW1pbmdBbGFybVN0cmF0ZWd5ID0gbmV3IE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGZhbGxiYWNrQ29uc3RydWN0TmFtZTogZmFsbGJhY2tBbGFybUNvbnN0cnVjdE5hbWUsXG4gICAgfSk7XG4gICAgY29uc3QgYWxhcm1GYWN0b3J5ID0gdGhpcy5jcmVhdGVBbGFybUZhY3RvcnkoXG4gICAgICBuYW1pbmdBbGFybVN0cmF0ZWd5LnJlc29sdmVBbGFybUZyaWVuZGx5TmFtZSgpLFxuICAgICk7XG4gICAgdGhpcy5lYzJBbGFybUZhY3RvcnkgPSBuZXcgRUMyQWxhcm1GYWN0b3J5KGFsYXJtRmFjdG9yeSk7XG5cbiAgICB0aGlzLmNwdVV0aWxpc2F0aW9uTWV0cmljcyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY0F2ZXJhZ2VDcHVVdGlsaXNhdGlvblBlcmNlbnQoKTtcbiAgICB0aGlzLmRpc2tSZWFkQnl0ZXNNZXRyaWNzID0gbWV0cmljRmFjdG9yeS5tZXRyaWNBdmVyYWdlRGlza1JlYWRCeXRlcygpO1xuICAgIHRoaXMuZGlza1dyaXRlQnl0ZXNNZXRyaWNzID0gbWV0cmljRmFjdG9yeS5tZXRyaWNBdmVyYWdlRGlza1dyaXRlQnl0ZXMoKTtcbiAgICB0aGlzLmRpc2tSZWFkT3BzTWV0cmljcyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljQXZlcmFnZURpc2tSZWFkT3BzKCk7XG4gICAgdGhpcy5kaXNrV3JpdGVPcHNNZXRyaWNzID0gbWV0cmljRmFjdG9yeS5tZXRyaWNBdmVyYWdlRGlza1dyaXRlT3BzKCk7XG4gICAgdGhpcy5uZXR3b3JrSW5NZXRyaWNzID0gbWV0cmljRmFjdG9yeS5tZXRyaWNBdmVyYWdlTmV0d29ya0luUmF0ZUJ5dGVzKCk7XG4gICAgdGhpcy5uZXR3b3JrT3V0TWV0cmljcyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljQXZlcmFnZU5ldHdvcmtPdXRSYXRlQnl0ZXMoKTtcblxuICAgIHRoaXMubmV0d29ya0luU3VtTWV0cmljcyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljU3VtTmV0d29ya0luUmF0ZUJ5dGVzKCk7XG4gICAgdGhpcy5uZXR3b3JrT3V0U3VtTWV0cmljcyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljU3VtTmV0d29ya091dFJhdGVCeXRlcygpO1xuXG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZE5ldHdvcmtJblRvdGFsQnl0ZXNFeGNlZWRUaHJlc2hvbGRBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9XG4gICAgICAgIHByb3BzLmFkZE5ldHdvcmtJblRvdGFsQnl0ZXNFeGNlZWRUaHJlc2hvbGRBbGFybVtkaXNhbWJpZ3VhdG9yXTtcblxuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtcyA9IHRoaXMubmV0d29ya0luU3VtTWV0cmljcy5tYXAoKG1ldHJpYywgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ZWREaXNhbWJpZ3VhdG9yID1cbiAgICAgICAgICBpZHggPiAwID8gYCR7ZGlzYW1iaWd1YXRvcn0tJHtpZHh9YCA6IGRpc2FtYmlndWF0b3I7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMuZWMyQWxhcm1GYWN0b3J5LmFkZE5ldHdvcmtJbkFsYXJtKFxuICAgICAgICAgIG1ldHJpYyxcbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIGluZGV4ZWREaXNhbWJpZ3VhdG9yLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVkQWxhcm07XG4gICAgICB9KTtcblxuICAgICAgaWYgKGNyZWF0ZWRBbGFybXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLm5ldHdvcmtJblN1bUxpbWl0QW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm1zWzBdLmFubm90YXRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGROZXR3b3JrT3V0VG90YWxCeXRlc0V4Y2VlZFRocmVzaG9sZEFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID1cbiAgICAgICAgcHJvcHMuYWRkTmV0d29ya091dFRvdGFsQnl0ZXNFeGNlZWRUaHJlc2hvbGRBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybXMgPSB0aGlzLm5ldHdvcmtPdXRTdW1NZXRyaWNzLm1hcCgobWV0cmljLCBpZHgpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXhlZERpc2FtYmlndWF0b3IgPVxuICAgICAgICAgIGlkeCA+IDAgPyBgJHtkaXNhbWJpZ3VhdG9yfS0ke2lkeH1gIDogZGlzYW1iaWd1YXRvcjtcbiAgICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy5lYzJBbGFybUZhY3RvcnkuYWRkTmV0d29ya091dEFsYXJtKFxuICAgICAgICAgIG1ldHJpYyxcbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIGluZGV4ZWREaXNhbWJpZ3VhdG9yLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVkQWxhcm07XG4gICAgICB9KTtcblxuICAgICAgaWYgKGNyZWF0ZWRBbGFybXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLm5ldHdvcmtPdXRTdW1MaW1pdEFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtc1swXS5hbm5vdGF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvcHMudXNlQ3JlYXRlZEFsYXJtcz8uY29uc3VtZSh0aGlzLmNyZWF0ZWRBbGFybXMoKSk7XG4gIH1cblxuICBzdW1tYXJ5V2lkZ2V0cygpOiBJV2lkZ2V0W10ge1xuICAgIHJldHVybiBbXG4gICAgICAvLyBUaXRsZVxuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgLy8gQ1BVIFVzYWdlXG4gICAgICB0aGlzLmNyZWF0ZUNwdVdpZGdldChUaGlyZFdpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgICAvLyBEaXNrIE9QU1xuICAgICAgdGhpcy5jcmVhdGVEaXNrT3BzV2lkZ2V0KFRoaXJkV2lkdGgsIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0KSxcbiAgICAgIC8vIE5ldHdvcmtcbiAgICAgIHRoaXMuY3JlYXRlTmV0d29ya1dpZGdldChUaGlyZFdpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgXTtcbiAgfVxuXG4gIHdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gVGl0bGVcbiAgICAgIHRoaXMuY3JlYXRlVGl0bGVXaWRnZXQoKSxcbiAgICAgIC8vIENQVSBVc2FnZVxuICAgICAgdGhpcy5jcmVhdGVDcHVXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgLy8gRGlzayBPUFNcbiAgICAgIHRoaXMuY3JlYXRlRGlza09wc1dpZGdldChRdWFydGVyV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICAvLyBEaXNrIEJ5dGVzXG4gICAgICB0aGlzLmNyZWF0ZURpc2tXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgLy8gTmV0d29ya1xuICAgICAgdGhpcy5jcmVhdGVOZXR3b3JrV2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICBdO1xuICB9XG5cbiAgY3JlYXRlVGl0bGVXaWRnZXQoKSB7XG4gICAgcmV0dXJuIG5ldyBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0KHtcbiAgICAgIGZhbWlseTogdGhpcy5mYW1pbHksXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUNwdVdpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJDUFUgVXRpbGl6YXRpb25cIixcbiAgICAgIGxlZnQ6IFsuLi50aGlzLmNwdVV0aWxpc2F0aW9uTWV0cmljc10sXG4gICAgICBsZWZ0WUF4aXM6IFBlcmNlbnRhZ2VBeGlzRnJvbVplcm9Ub0h1bmRyZWQsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVEaXNrV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIkRpc2sgLSBCeXRlc1wiLFxuICAgICAgbGVmdDogWy4uLnRoaXMuZGlza1JlYWRCeXRlc01ldHJpY3MsIC4uLnRoaXMuZGlza1dyaXRlQnl0ZXNNZXRyaWNzXSxcbiAgICAgIGxlZnRZQXhpczogU2l6ZUF4aXNCeXRlc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlRGlza09wc1dpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJEaXNrIC0gT1BTXCIsXG4gICAgICBsZWZ0OiBbLi4udGhpcy5kaXNrUmVhZE9wc01ldHJpY3MsIC4uLnRoaXMuZGlza1dyaXRlT3BzTWV0cmljc10sXG4gICAgICBsZWZ0WUF4aXM6IENvdW50QXhpc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlTmV0d29ya1dpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJOZXR3b3JrXCIsXG4gICAgICBsZWZ0OiBbLi4udGhpcy5uZXR3b3JrSW5NZXRyaWNzLCAuLi50aGlzLm5ldHdvcmtPdXRNZXRyaWNzXSxcbiAgICAgIGxlZnRZQXhpczogU2l6ZUF4aXNCeXRlc0Zyb21aZXJvLFxuICAgICAgcmlnaHQ6IFsuLi50aGlzLm5ldHdvcmtJblN1bU1ldHJpY3MsIC4uLnRoaXMubmV0d29ya091dFN1bU1ldHJpY3NdLFxuICAgICAgcmlnaHRZQXhpczogU2l6ZUF4aXNCeXRlc0Zyb21aZXJvLFxuICAgICAgcmlnaHRBbm5vdGF0aW9uczogW1xuICAgICAgICAuLi50aGlzLm5ldHdvcmtJblN1bUxpbWl0QW5ub3RhdGlvbnMsXG4gICAgICAgIC4uLnRoaXMubmV0d29ya091dFN1bUxpbWl0QW5ub3RhdGlvbnMsXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=