cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
151 lines • 23.7 kB
JavaScript
"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: "10.0.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRUMyTW9uaXRvcmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkVDMk1vbml0b3JpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrREFLb0M7QUFFcEMseURBQTZFO0FBQzdFLHlDQVlzQjtBQUN0QixvRkFJd0Q7QUFDeEQsK0NBR3lCO0FBa0J6QixNQUFhLGFBQWMsU0FBUSxtQkFBVTtJQW9CM0MsWUFBWSxLQUFzQixFQUFFLEtBQXlCO1FBQzNELEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFcEIsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLENBQUMsZ0JBQWdCO1lBQ2xELENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CO1lBQzdDLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFDcEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxvQ0FBd0IsQ0FBQztZQUNsRCxHQUFHLEtBQUs7WUFDUixxQkFBcUI7U0FDdEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDeEUsSUFBSSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsNkJBQTZCLEdBQUcsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxFQUFFLENBQUM7UUFFdkMsTUFBTSxhQUFhLEdBQUcsSUFBSSxtQ0FBZ0IsQ0FDeEMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLEVBQzNCLEtBQUssQ0FDTixDQUFDO1FBRUYsZ0RBQWdEO1FBQ2hELG1DQUFtQztRQUNuQyxNQUFNLDBCQUEwQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0I7WUFDdkQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0I7WUFDN0MsQ0FBQyxDQUFDLGVBQWUs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QUNoQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztZQUNsRSxVQUFVLEVBQUUsOEJBQXFCO1lBQ2pDLGdCQUFnQixFQUFFO2dCQUNoQixHQUFHLElBQUksQ0FBQyw0QkFBNEI7Z0JBQ3BDLEdBQUcsSUFBSSxDQUFDLDZCQUE2QjthQUN0QztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBNUxILHNDQTZMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEdyYXBoV2lkZ2V0LFxuICBIb3Jpem9udGFsQW5ub3RhdGlvbixcbiAgSU1ldHJpYyxcbiAgSVdpZGdldCxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5cbmltcG9ydCB7IEVDMk1ldHJpY0ZhY3RvcnksIEVDMk1ldHJpY0ZhY3RvcnlQcm9wcyB9IGZyb20gXCIuL0VDMk1ldHJpY0ZhY3RvcnlcIjtcbmltcG9ydCB7XG4gIEJhc2VNb25pdG9yaW5nUHJvcHMsXG4gIENvdW50QXhpc0Zyb21aZXJvLFxuICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0LFxuICBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0LFxuICBNb25pdG9yaW5nLFxuICBNb25pdG9yaW5nU2NvcGUsXG4gIFBlcmNlbnRhZ2VBeGlzRnJvbVplcm9Ub0h1bmRyZWQsXG4gIFF1YXJ0ZXJXaWR0aCxcbiAgU2l6ZUF4aXNCeXRlc0Zyb21aZXJvLFxuICBUaGlyZFdpZHRoLFxufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1xuICBFQzJBbGFybUZhY3RvcnksXG4gIE5ldHdvcmtJblRocmVzaG9sZCxcbiAgTmV0d29ya091dFRocmVzaG9sZCxcbn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tb25pdG9yaW5nL2FsYXJtcy9FQzJBbGFybUZhY3RvcnlcIjtcbmltcG9ydCB7XG4gIE1vbml0b3JpbmdIZWFkZXJXaWRnZXQsXG4gIE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSxcbn0gZnJvbSBcIi4uLy4uL2Rhc2hib2FyZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVDMk1vbml0b3JpbmdPcHRpb25zXG4gIGV4dGVuZHMgRUMyTWV0cmljRmFjdG9yeVByb3BzLFxuICAgIEJhc2VNb25pdG9yaW5nUHJvcHMge1xuICByZWFkb25seSBhZGROZXR3b3JrT3V0VG90YWxCeXRlc0V4Y2VlZFRocmVzaG9sZEFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBOZXR3b3JrT3V0VGhyZXNob2xkXG4gID47XG5cbiAgcmVhZG9ubHkgYWRkTmV0d29ya0luVG90YWxCeXRlc0V4Y2VlZFRocmVzaG9sZEFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBOZXR3b3JrSW5UaHJlc2hvbGRcbiAgPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFQzJNb25pdG9yaW5nUHJvcHMgZXh0ZW5kcyBFQzJNb25pdG9yaW5nT3B0aW9ucyB7fVxuXG5leHBvcnQgY2xhc3MgRUMyTW9uaXRvcmluZyBleHRlbmRzIE1vbml0b3Jpbmcge1xuICByZWFkb25seSBmYW1pbHk6IHN0cmluZztcbiAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcblxuICByZWFkb25seSBlYzJBbGFybUZhY3Rvcnk6IEVDMkFsYXJtRmFjdG9yeTtcblxuICByZWFkb25seSBjcHVVdGlsaXNhdGlvbk1ldHJpY3M6IElNZXRyaWNbXTtcbiAgcmVhZG9ubHkgZGlza1JlYWRCeXRlc01ldHJpY3M6IElNZXRyaWNbXTtcbiAgcmVhZG9ubHkgZGlza1dyaXRlQnl0ZXNNZXRyaWNzOiBJTWV0cmljW107XG4gIHJlYWRvbmx5IGRpc2tSZWFkT3BzTWV0cmljczogSU1ldHJpY1tdO1xuICByZWFkb25seSBkaXNrV3JpdGVPcHNNZXRyaWNzOiBJTWV0cmljW107XG4gIHJlYWRvbmx5IG5ldHdvcmtJbk1ldHJpY3M6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnRbXTtcbiAgcmVhZG9ubHkgbmV0d29ya091dE1ldHJpY3M6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnRbXTtcblxuICByZWFkb25seSBuZXR3b3JrSW5TdW1NZXRyaWNzOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0W107XG4gIHJlYWRvbmx5IG5ldHdvcmtPdXRTdW1NZXRyaWNzOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0W107XG5cbiAgcmVhZG9ubHkgbmV0d29ya0luU3VtTGltaXRBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcbiAgcmVhZG9ubHkgbmV0d29ya091dFN1bUxpbWl0QW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IE1vbml0b3JpbmdTY29wZSwgcHJvcHM6IEVDMk1vbml0b3JpbmdQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBwcm9wcyk7XG5cbiAgICBjb25zdCBmYWxsYmFja0NvbnN0cnVjdE5hbWUgPSBwcm9wcy5hdXRvU2NhbGluZ0dyb3VwXG4gICAgICA/IHByb3BzLmF1dG9TY2FsaW5nR3JvdXAuYXV0b1NjYWxpbmdHcm91cE5hbWVcbiAgICAgIDogXCJBbGwgSW5zdGFuY2VzXCI7XG4gICAgY29uc3QgbmFtaW5nU3RyYXRlZ3kgPSBuZXcgTW9uaXRvcmluZ05hbWluZ1N0cmF0ZWd5KHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZmFsbGJhY2tDb25zdHJ1Y3ROYW1lLFxuICAgIH0pO1xuICAgIHRoaXMuZmFtaWx5ID0gcHJvcHMuYXV0b1NjYWxpbmdHcm91cCA/IFwiRUMyIEF1dG8gU2NhbGluZyBHcm91cFwiIDogXCJFQzJcIjtcbiAgICB0aGlzLnRpdGxlID0gbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUh1bWFuUmVhZGFibGVOYW1lKCk7XG4gICAgdGhpcy5uZXR3b3JrT3V0U3VtTGltaXRBbm5vdGF0aW9ucyA9IFtdO1xuICAgIHRoaXMubmV0d29ya0luU3VtTGltaXRBbm5vdGF0aW9ucyA9IFtdO1xuXG4gICAgY29uc3QgbWV0cmljRmFjdG9yeSA9IG5ldyBFQzJNZXRyaWNGYWN0b3J5KFxuICAgICAgc2NvcGUuY3JlYXRlTWV0cmljRmFjdG9yeSgpLFxuICAgICAgcHJvcHMsXG4gICAgKTtcblxuICAgIC8vIHVzaW5nIGRpZmZlcmVudCBmYWxsYmFjayBhbGFybSBjb25zdHJ1Y3QgbmFtZVxuICAgIC8vIGFzIGFsYXJtcyBkb24ndCBhbGxvdyB3aGl0ZXNwYWNlXG4gICAgY29uc3QgZmFsbGJhY2tBbGFybUNvbnN0cnVjdE5hbWUgPSBwcm9wcy5hdXRvU2NhbGluZ0dyb3VwXG4gICAgICA/IHByb3BzLmF1dG9TY2FsaW5nR3JvdXAuYXV0b1NjYWxpbmdHcm91cE5hbWVcbiAgICAgIDogXCJBbGwtSW5zdGFuY2VzXCI7XG4gICAgY29uc3QgbmFtaW5nQWxhcm1TdHJhdGVneSA9IG5ldyBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3koe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBmYWxsYmFja0NvbnN0cnVjdE5hbWU6IGZhbGxiYWNrQWxhcm1Db25zdHJ1Y3ROYW1lLFxuICAgIH0pO1xuICAgIGNvbnN0IGFsYXJtRmFjdG9yeSA9IHRoaXMuY3JlYXRlQWxhcm1GYWN0b3J5KFxuICAgICAgbmFtaW5nQWxhcm1TdHJhdGVneS5yZXNvbHZlQWxhcm1GcmllbmRseU5hbWUoKSxcbiAgICApO1xuICAgIHRoaXMuZWMyQWxhcm1GYWN0b3J5ID0gbmV3IEVDMkFsYXJtRmFjdG9yeShhbGFybUZhY3RvcnkpO1xuXG4gICAgdGhpcy5jcHVVdGlsaXNhdGlvbk1ldHJpY3MgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNBdmVyYWdlQ3B1VXRpbGlzYXRpb25QZXJjZW50KCk7XG4gICAgdGhpcy5kaXNrUmVhZEJ5dGVzTWV0cmljcyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljQXZlcmFnZURpc2tSZWFkQnl0ZXMoKTtcbiAgICB0aGlzLmRpc2tXcml0ZUJ5dGVzTWV0cmljcyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljQXZlcmFnZURpc2tXcml0ZUJ5dGVzKCk7XG4gICAgdGhpcy5kaXNrUmVhZE9wc01ldHJpY3MgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY0F2ZXJhZ2VEaXNrUmVhZE9wcygpO1xuICAgIHRoaXMuZGlza1dyaXRlT3BzTWV0cmljcyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljQXZlcmFnZURpc2tXcml0ZU9wcygpO1xuICAgIHRoaXMubmV0d29ya0luTWV0cmljcyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljQXZlcmFnZU5ldHdvcmtJblJhdGVCeXRlcygpO1xuICAgIHRoaXMubmV0d29ya091dE1ldHJpY3MgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY0F2ZXJhZ2VOZXR3b3JrT3V0UmF0ZUJ5dGVzKCk7XG5cbiAgICB0aGlzLm5ldHdvcmtJblN1bU1ldHJpY3MgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY1N1bU5ldHdvcmtJblJhdGVCeXRlcygpO1xuICAgIHRoaXMubmV0d29ya091dFN1bU1ldHJpY3MgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY1N1bU5ldHdvcmtPdXRSYXRlQnl0ZXMoKTtcblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGROZXR3b3JrSW5Ub3RhbEJ5dGVzRXhjZWVkVGhyZXNob2xkQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPVxuICAgICAgICBwcm9wcy5hZGROZXR3b3JrSW5Ub3RhbEJ5dGVzRXhjZWVkVGhyZXNob2xkQWxhcm1bZGlzYW1iaWd1YXRvcl07XG5cbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybXMgPSB0aGlzLm5ldHdvcmtJblN1bU1ldHJpY3MubWFwKChtZXRyaWMsIGlkeCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleGVkRGlzYW1iaWd1YXRvciA9XG4gICAgICAgICAgaWR4ID4gMCA/IGAke2Rpc2FtYmlndWF0b3J9LSR7aWR4fWAgOiBkaXNhbWJpZ3VhdG9yO1xuICAgICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmVjMkFsYXJtRmFjdG9yeS5hZGROZXR3b3JrSW5BbGFybShcbiAgICAgICAgICBtZXRyaWMsXG4gICAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgICBpbmRleGVkRGlzYW1iaWd1YXRvcixcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEFsYXJtO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChjcmVhdGVkQWxhcm1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5uZXR3b3JrSW5TdW1MaW1pdEFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtc1swXS5hbm5vdGF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkTmV0d29ya091dFRvdGFsQnl0ZXNFeGNlZWRUaHJlc2hvbGRBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9XG4gICAgICAgIHByb3BzLmFkZE5ldHdvcmtPdXRUb3RhbEJ5dGVzRXhjZWVkVGhyZXNob2xkQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm1zID0gdGhpcy5uZXR3b3JrT3V0U3VtTWV0cmljcy5tYXAoKG1ldHJpYywgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ZWREaXNhbWJpZ3VhdG9yID1cbiAgICAgICAgICBpZHggPiAwID8gYCR7ZGlzYW1iaWd1YXRvcn0tJHtpZHh9YCA6IGRpc2FtYmlndWF0b3I7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMuZWMyQWxhcm1GYWN0b3J5LmFkZE5ldHdvcmtPdXRBbGFybShcbiAgICAgICAgICBtZXRyaWMsXG4gICAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgICBpbmRleGVkRGlzYW1iaWd1YXRvcixcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEFsYXJtO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChjcmVhdGVkQWxhcm1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5uZXR3b3JrT3V0U3VtTGltaXRBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybXNbMF0uYW5ub3RhdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHByb3BzLnVzZUNyZWF0ZWRBbGFybXM/LmNvbnN1bWUodGhpcy5jcmVhdGVkQWxhcm1zKCkpO1xuICB9XG5cbiAgc3VtbWFyeVdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gVGl0bGVcbiAgICAgIHRoaXMuY3JlYXRlVGl0bGVXaWRnZXQoKSxcbiAgICAgIC8vIENQVSBVc2FnZVxuICAgICAgdGhpcy5jcmVhdGVDcHVXaWRnZXQoVGhpcmRXaWR0aCwgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQpLFxuICAgICAgLy8gRGlzayBPUFNcbiAgICAgIHRoaXMuY3JlYXRlRGlza09wc1dpZGdldChUaGlyZFdpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgICAvLyBOZXR3b3JrXG4gICAgICB0aGlzLmNyZWF0ZU5ldHdvcmtXaWRnZXQoVGhpcmRXaWR0aCwgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQpLFxuICAgIF07XG4gIH1cblxuICB3aWRnZXRzKCk6IElXaWRnZXRbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIFRpdGxlXG4gICAgICB0aGlzLmNyZWF0ZVRpdGxlV2lkZ2V0KCksXG4gICAgICAvLyBDUFUgVXNhZ2VcbiAgICAgIHRoaXMuY3JlYXRlQ3B1V2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgIC8vIERpc2sgT1BTXG4gICAgICB0aGlzLmNyZWF0ZURpc2tPcHNXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgLy8gRGlzayBCeXRlc1xuICAgICAgdGhpcy5jcmVhdGVEaXNrV2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgIC8vIE5ldHdvcmtcbiAgICAgIHRoaXMuY3JlYXRlTmV0d29ya1dpZGdldChRdWFydGVyV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgXTtcbiAgfVxuXG4gIGNyZWF0ZVRpdGxlV2lkZ2V0KCkge1xuICAgIHJldHVybiBuZXcgTW9uaXRvcmluZ0hlYWRlcldpZGdldCh7XG4gICAgICBmYW1pbHk6IHRoaXMuZmFtaWx5LFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVDcHVXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiQ1BVIFV0aWxpemF0aW9uXCIsXG4gICAgICBsZWZ0OiBbLi4udGhpcy5jcHVVdGlsaXNhdGlvbk1ldHJpY3NdLFxuICAgICAgbGVmdFlBeGlzOiBQZXJjZW50YWdlQXhpc0Zyb21aZXJvVG9IdW5kcmVkLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlRGlza1dpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJEaXNrIC0gQnl0ZXNcIixcbiAgICAgIGxlZnQ6IFsuLi50aGlzLmRpc2tSZWFkQnl0ZXNNZXRyaWNzLCAuLi50aGlzLmRpc2tXcml0ZUJ5dGVzTWV0cmljc10sXG4gICAgICBsZWZ0WUF4aXM6IFNpemVBeGlzQnl0ZXNGcm9tWmVybyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZURpc2tPcHNXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiRGlzayAtIE9QU1wiLFxuICAgICAgbGVmdDogWy4uLnRoaXMuZGlza1JlYWRPcHNNZXRyaWNzLCAuLi50aGlzLmRpc2tXcml0ZU9wc01ldHJpY3NdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZU5ldHdvcmtXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiTmV0d29ya1wiLFxuICAgICAgbGVmdDogWy4uLnRoaXMubmV0d29ya0luTWV0cmljcywgLi4udGhpcy5uZXR3b3JrT3V0TWV0cmljc10sXG4gICAgICBsZWZ0WUF4aXM6IFNpemVBeGlzQnl0ZXNGcm9tWmVybyxcbiAgICAgIHJpZ2h0OiBbLi4udGhpcy5uZXR3b3JrSW5TdW1NZXRyaWNzLCAuLi50aGlzLm5ldHdvcmtPdXRTdW1NZXRyaWNzXSxcbiAgICAgIHJpZ2h0WUF4aXM6IFNpemVBeGlzQnl0ZXNGcm9tWmVybyxcbiAgICAgIHJpZ2h0QW5ub3RhdGlvbnM6IFtcbiAgICAgICAgLi4udGhpcy5uZXR3b3JrSW5TdW1MaW1pdEFubm90YXRpb25zLFxuICAgICAgICAuLi50aGlzLm5ldHdvcmtPdXRTdW1MaW1pdEFubm90YXRpb25zLFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuIl19