cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
122 lines • 18.4 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.LogMonitoring = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
const CloudWatchLogsMetricFactory_1 = require("./CloudWatchLogsMetricFactory");
const common_1 = require("../../common");
const dashboard_1 = require("../../dashboard");
const DefaultLimit = 10;
/**
* Monitors a CloudWatch log group for various patterns.
*/
class LogMonitoring extends common_1.Monitoring {
constructor(scope, props) {
super(scope);
this.logGroupName = props.logGroupName;
this.logGroupUrl = scope
.createAwsConsoleUrlFactory()
.getCloudWatchLogGroupUrl(props.logGroupName);
this.title = props.title;
this.pattern = props.pattern;
this.filterExpressions = props.filterExpressions;
this.limit = props.limit ?? DefaultLimit;
const namingStrategy = new dashboard_1.MonitoringNamingStrategy({
...props,
fallbackConstructName: this.logGroupName,
});
this.alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName());
this.usageAlarmFactory = new common_1.UsageAlarmFactory(this.alarmFactory);
this.usageAnnotations = [];
const metricFactory = new CloudWatchLogsMetricFactory_1.CloudWatchLogsMetricFactory(scope.createMetricFactory(), props);
this.incomingLogEventsMetric = metricFactory.metricIncomingLogEvents();
for (const disambiguator in props.addMinIncomingLogsAlarm) {
const alarmProps = props.addMinIncomingLogsAlarm[disambiguator];
const createdAlarm = this.usageAlarmFactory.addMinUsageCountAlarm(this.incomingLogEventsMetric, alarmProps, disambiguator);
this.usageAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addMaxIncomingLogsAlarm) {
const alarmProps = props.addMaxIncomingLogsAlarm[disambiguator];
const createdAlarm = this.usageAlarmFactory.addMaxCountAlarm(this.incomingLogEventsMetric, alarmProps, disambiguator);
this.usageAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
props.useCreatedAlarms?.consume(this.createdAlarms());
}
summaryWidgets() {
return [
this.createTitleWidget(),
this.createIncomingLogsWidget(common_1.FullWidth, common_1.DefaultSummaryWidgetHeight),
];
}
widgets() {
const filterStatements = [];
if (this.pattern) {
filterStatements.push(`filter like /${this.pattern}/`);
}
if (this.filterExpressions) {
for (const expression of this.filterExpressions) {
if (expression) {
filterStatements.push(`filter ${expression}`);
}
}
}
if (filterStatements.length > 0) {
const height = this.resolveRecommendedHeight(this.limit);
return [
this.createTitleWidget(),
// Log Query Results
new aws_cloudwatch_1.LogQueryWidget({
logGroupNames: [this.logGroupName],
height,
width: common_1.ThreeQuartersWidth,
title: this.title ?? `Find ${this.pattern} (limit = ${this.limit})`,
/**
* https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html
*/
queryLines: [
"fields @timestamp, @logStream, @message",
...filterStatements,
"sort @timestamp desc",
`limit ${this.limit}`,
],
}),
this.createIncomingLogsWidget(common_1.QuarterWidth, height),
];
}
else {
return [
this.createTitleWidget(),
this.createIncomingLogsWidget(common_1.FullWidth, common_1.DefaultGraphWidgetHeight),
];
}
}
createTitleWidget() {
return new dashboard_1.MonitoringHeaderWidget({
family: "Log Group",
title: this.logGroupName,
goToLinkUrl: this.logGroupUrl,
});
}
createIncomingLogsWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Incoming logs",
left: [this.incomingLogEventsMetric],
leftYAxis: common_1.CountAxisFromZero,
leftAnnotations: this.usageAnnotations,
});
}
resolveRecommendedHeight(numRows) {
const heightPerLine = 1;
const recommendedHeight = heightPerLine * numRows;
return Math.max(recommendedHeight, common_1.DefaultLogWidgetHeight);
}
}
exports.LogMonitoring = LogMonitoring;
_a = JSII_RTTI_SYMBOL_1;
LogMonitoring[_a] = { fqn: "cdk-monitoring-constructs.LogMonitoring", version: "10.0.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nTW9uaXRvcmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkxvZ01vbml0b3JpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrREFLb0M7QUFFcEMsK0VBR3VDO0FBQ3ZDLHlDQWdCc0I7QUFDdEIsK0NBR3lCO0FBRXpCLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQXNDeEI7O0dBRUc7QUFDSCxNQUFhLGFBQWMsU0FBUSxtQkFBVTtJQWdCM0MsWUFBWSxLQUFzQixFQUFFLEtBQXlCO1FBQzNELEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUs7YUFDckIsMEJBQTBCLEVBQUU7YUFDNUIsd0JBQXdCLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWhELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUV6QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztRQUNqRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDO1FBRXpDLE1BQU0sY0FBYyxHQUFHLElBQUksb0NBQXdCLENBQUM7WUFDbEQsR0FBRyxLQUFLO1lBQ1IscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFlBQVk7U0FDekMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQ3pDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUMxQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksMEJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWxFLElBQUksQ0FBQyxn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U0FBUyxJQUFJLENBQUMsS0FBSyxFQUFFO3FCQUN0QjtpQkFDRixDQUFDO2dCQUVGLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBWSxFQUFFLE1BQU0sQ0FBQzthQUNwRCxDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPO2dCQUNMLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGtCQUFTLEVBQUUsaUNBQXdCLENBQUM7YUFDbkUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLGtDQUFzQixDQUFDO1lBQ2hDLE1BQU0sRUFBRSxXQUFXO1lBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtZQUN4QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDOUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHdCQUF3QixDQUFDLEtBQWEsRUFBRSxNQUFjO1FBQ3BELE9BQU8sSUFBSSw0QkFBVyxDQUFDO1lBQ3JCLEtBQUs7WUFDTCxNQUFNO1lBQ04sS0FBSyxFQUFFLGVBQWU7WUFDdEIsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBQ3BDLFNBQVMsRUFBRSwwQkFBaUI7WUFDNUIsZUFBZSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7U0FDdkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLHdCQUF3QixDQUFDLE9BQWU7UUFDaEQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxHQUFHLE9BQU8sQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsK0JBQXNCLENBQUMsQ0FBQztJQUM3RCxDQUFDOztBQXRKSCxzQ0F1SkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBHcmFwaFdpZGdldCxcbiAgSG9yaXpvbnRhbEFubm90YXRpb24sXG4gIElXaWRnZXQsXG4gIExvZ1F1ZXJ5V2lkZ2V0LFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcblxuaW1wb3J0IHtcbiAgQ2xvdWRXYXRjaExvZ3NNZXRyaWNGYWN0b3J5LFxuICBDbG91ZFdhdGNoTG9nc01ldHJpY0ZhY3RvcnlQcm9wcyxcbn0gZnJvbSBcIi4vQ2xvdWRXYXRjaExvZ3NNZXRyaWNGYWN0b3J5XCI7XG5pbXBvcnQge1xuICBBbGFybUZhY3RvcnksXG4gIEJhc2VNb25pdG9yaW5nUHJvcHMsXG4gIENvdW50QXhpc0Zyb21aZXJvLFxuICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gIERlZmF1bHRMb2dXaWRnZXRIZWlnaHQsXG4gIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0LFxuICBGdWxsV2lkdGgsXG4gIE1heFVzYWdlQ291bnRUaHJlc2hvbGQsXG4gIE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG4gIE1pblVzYWdlQ291bnRUaHJlc2hvbGQsXG4gIE1vbml0b3JpbmcsXG4gIE1vbml0b3JpbmdTY29wZSxcbiAgUXVhcnRlcldpZHRoLFxuICBUaHJlZVF1YXJ0ZXJzV2lkdGgsXG4gIFVzYWdlQWxhcm1GYWN0b3J5LFxufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1xuICBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0LFxuICBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3ksXG59IGZyb20gXCIuLi8uLi9kYXNoYm9hcmRcIjtcblxuY29uc3QgRGVmYXVsdExpbWl0ID0gMTA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nTW9uaXRvcmluZ1Byb3BzXG4gIGV4dGVuZHMgQmFzZU1vbml0b3JpbmdQcm9wcyxcbiAgICBDbG91ZFdhdGNoTG9nc01ldHJpY0ZhY3RvcnlQcm9wcyB7XG4gIC8qKlxuICAgKiBXaWRnZXQgdGl0bGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdXRvLWdlbmVyYXRlZCB0aXRsZSBiYXNlZCBvbiB0aGUgcGF0dGVybiBhbmQgbGltaXRcbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXR0ZXJuIHRvIGZpbHRlciBgQG1lc3NhZ2VgIGZpZWxkLCBlLmcuIFwiRVJST1JcIlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0dGVybj86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsdGVyIGV4cHJlc3Npb25zIHRvIGFkZC5cbiAgICogQGV4YW1wbGVcbiAgICogZmlsdGVyRXhwcmVzc2lvbnMgPSBbYGxldmVsID0gXCJFUlJPUlwiYF1cbiAgICogLy8gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcXVlcnkgYXNcbiAgICogfCBmaWx0ZXIgbGV2ZWwgPSBcIkVSUk9SXCJcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbG9ncy9DV0xfUXVlcnlTeW50YXgtRmlsdGVyLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlckV4cHJlc3Npb25zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIGxvZyBtZXNzYWdlcyB0byBzZWFyY2ggZm9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIDEwXG4gICAqL1xuICByZWFkb25seSBsaW1pdD86IG51bWJlcjtcblxuICByZWFkb25seSBhZGRNaW5JbmNvbWluZ0xvZ3NBbGFybT86IFJlY29yZDxzdHJpbmcsIE1pblVzYWdlQ291bnRUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRNYXhJbmNvbWluZ0xvZ3NBbGFybT86IFJlY29yZDxzdHJpbmcsIE1heFVzYWdlQ291bnRUaHJlc2hvbGQ+O1xufVxuXG4vKipcbiAqIE1vbml0b3JzIGEgQ2xvdWRXYXRjaCBsb2cgZ3JvdXAgZm9yIHZhcmlvdXMgcGF0dGVybnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dNb25pdG9yaW5nIGV4dGVuZHMgTW9uaXRvcmluZyB7XG4gIHJlYWRvbmx5IGxvZ0dyb3VwTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsb2dHcm91cFVybD86IHN0cmluZztcblxuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcblxuICByZWFkb25seSBwYXR0ZXJuPzogc3RyaW5nO1xuICByZWFkb25seSBmaWx0ZXJFeHByZXNzaW9ucz86IHN0cmluZ1tdO1xuICByZWFkb25seSBsaW1pdDogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGFsYXJtRmFjdG9yeTogQWxhcm1GYWN0b3J5O1xuICByZWFkb25seSB1c2FnZUFsYXJtRmFjdG9yeTogVXNhZ2VBbGFybUZhY3Rvcnk7XG4gIHJlYWRvbmx5IGluY29taW5nTG9nRXZlbnRzTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuXG4gIHJlYWRvbmx5IHVzYWdlQW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IE1vbml0b3JpbmdTY29wZSwgcHJvcHM6IExvZ01vbml0b3JpbmdQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlKTtcblxuICAgIHRoaXMubG9nR3JvdXBOYW1lID0gcHJvcHMubG9nR3JvdXBOYW1lO1xuICAgIHRoaXMubG9nR3JvdXBVcmwgPSBzY29wZVxuICAgICAgLmNyZWF0ZUF3c0NvbnNvbGVVcmxGYWN0b3J5KClcbiAgICAgIC5nZXRDbG91ZFdhdGNoTG9nR3JvdXBVcmwocHJvcHMubG9nR3JvdXBOYW1lKTtcblxuICAgIHRoaXMudGl0bGUgPSBwcm9wcy50aXRsZTtcblxuICAgIHRoaXMucGF0dGVybiA9IHByb3BzLnBhdHRlcm47XG4gICAgdGhpcy5maWx0ZXJFeHByZXNzaW9ucyA9IHByb3BzLmZpbHRlckV4cHJlc3Npb25zO1xuICAgIHRoaXMubGltaXQgPSBwcm9wcy5saW1pdCA/PyBEZWZhdWx0TGltaXQ7XG5cbiAgICBjb25zdCBuYW1pbmdTdHJhdGVneSA9IG5ldyBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3koe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBmYWxsYmFja0NvbnN0cnVjdE5hbWU6IHRoaXMubG9nR3JvdXBOYW1lLFxuICAgIH0pO1xuICAgIHRoaXMuYWxhcm1GYWN0b3J5ID0gdGhpcy5jcmVhdGVBbGFybUZhY3RvcnkoXG4gICAgICBuYW1pbmdTdHJhdGVneS5yZXNvbHZlQWxhcm1GcmllbmRseU5hbWUoKSxcbiAgICApO1xuICAgIHRoaXMudXNhZ2VBbGFybUZhY3RvcnkgPSBuZXcgVXNhZ2VBbGFybUZhY3RvcnkodGhpcy5hbGFybUZhY3RvcnkpO1xuXG4gICAgdGhpcy51c2FnZUFubm90YXRpb25zID0gW107XG5cbiAgICBjb25zdCBtZXRyaWNGYWN0b3J5ID0gbmV3IENsb3VkV2F0Y2hMb2dzTWV0cmljRmFjdG9yeShcbiAgICAgIHNjb3BlLmNyZWF0ZU1ldHJpY0ZhY3RvcnkoKSxcbiAgICAgIHByb3BzLFxuICAgICk7XG4gICAgdGhpcy5pbmNvbWluZ0xvZ0V2ZW50c01ldHJpYyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljSW5jb21pbmdMb2dFdmVudHMoKTtcblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRNaW5JbmNvbWluZ0xvZ3NBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZE1pbkluY29taW5nTG9nc0FsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy51c2FnZUFsYXJtRmFjdG9yeS5hZGRNaW5Vc2FnZUNvdW50QWxhcm0oXG4gICAgICAgIHRoaXMuaW5jb21pbmdMb2dFdmVudHNNZXRyaWMsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy51c2FnZUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRNYXhJbmNvbWluZ0xvZ3NBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZE1heEluY29taW5nTG9nc0FsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy51c2FnZUFsYXJtRmFjdG9yeS5hZGRNYXhDb3VudEFsYXJtKFxuICAgICAgICB0aGlzLmluY29taW5nTG9nRXZlbnRzTWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMudXNhZ2VBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG5cbiAgICBwcm9wcy51c2VDcmVhdGVkQWxhcm1zPy5jb25zdW1lKHRoaXMuY3JlYXRlZEFsYXJtcygpKTtcbiAgfVxuXG4gIHN1bW1hcnlXaWRnZXRzKCk6IElXaWRnZXRbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuY3JlYXRlVGl0bGVXaWRnZXQoKSxcbiAgICAgIHRoaXMuY3JlYXRlSW5jb21pbmdMb2dzV2lkZ2V0KEZ1bGxXaWR0aCwgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQpLFxuICAgIF07XG4gIH1cblxuICB3aWRnZXRzKCk6IElXaWRnZXRbXSB7XG4gICAgY29uc3QgZmlsdGVyU3RhdGVtZW50czogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aGlzLnBhdHRlcm4pIHtcbiAgICAgIGZpbHRlclN0YXRlbWVudHMucHVzaChgZmlsdGVyIEBtZXNzYWdlIGxpa2UgLyR7dGhpcy5wYXR0ZXJufS9gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJFeHByZXNzaW9ucykge1xuICAgICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMuZmlsdGVyRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24pIHtcbiAgICAgICAgICBmaWx0ZXJTdGF0ZW1lbnRzLnB1c2goYGZpbHRlciAke2V4cHJlc3Npb259YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmlsdGVyU3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnJlc29sdmVSZWNvbW1lbmRlZEhlaWdodCh0aGlzLmxpbWl0KTtcblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuXG4gICAgICAgIC8vIExvZyBRdWVyeSBSZXN1bHRzXG4gICAgICAgIG5ldyBMb2dRdWVyeVdpZGdldCh7XG4gICAgICAgICAgbG9nR3JvdXBOYW1lczogW3RoaXMubG9nR3JvdXBOYW1lXSxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgd2lkdGg6IFRocmVlUXVhcnRlcnNXaWR0aCxcbiAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSA/PyBgRmluZCAke3RoaXMucGF0dGVybn0gKGxpbWl0ID0gJHt0aGlzLmxpbWl0fSlgLFxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9sb2dzL0NXTF9RdWVyeVN5bnRheC5odG1sXG4gICAgICAgICAgICovXG4gICAgICAgICAgcXVlcnlMaW5lczogW1xuICAgICAgICAgICAgXCJmaWVsZHMgQHRpbWVzdGFtcCwgQGxvZ1N0cmVhbSwgQG1lc3NhZ2VcIixcbiAgICAgICAgICAgIC4uLmZpbHRlclN0YXRlbWVudHMsXG4gICAgICAgICAgICBcInNvcnQgQHRpbWVzdGFtcCBkZXNjXCIsXG4gICAgICAgICAgICBgbGltaXQgJHt0aGlzLmxpbWl0fWAsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgdGhpcy5jcmVhdGVJbmNvbWluZ0xvZ3NXaWRnZXQoUXVhcnRlcldpZHRoLCBoZWlnaHQpLFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgICB0aGlzLmNyZWF0ZUluY29taW5nTG9nc1dpZGdldChGdWxsV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZVRpdGxlV2lkZ2V0KCkge1xuICAgIHJldHVybiBuZXcgTW9uaXRvcmluZ0hlYWRlcldpZGdldCh7XG4gICAgICBmYW1pbHk6IFwiTG9nIEdyb3VwXCIsXG4gICAgICB0aXRsZTogdGhpcy5sb2dHcm91cE5hbWUsXG4gICAgICBnb1RvTGlua1VybDogdGhpcy5sb2dHcm91cFVybCxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUluY29taW5nTG9nc1dpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJJbmNvbWluZyBsb2dzXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5pbmNvbWluZ0xvZ0V2ZW50c01ldHJpY10sXG4gICAgICBsZWZ0WUF4aXM6IENvdW50QXhpc0Zyb21aZXJvLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLnVzYWdlQW5ub3RhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZVJlY29tbWVuZGVkSGVpZ2h0KG51bVJvd3M6IG51bWJlcikge1xuICAgIGNvbnN0IGhlaWdodFBlckxpbmUgPSAxO1xuICAgIGNvbnN0IHJlY29tbWVuZGVkSGVpZ2h0ID0gaGVpZ2h0UGVyTGluZSAqIG51bVJvd3M7XG4gICAgcmV0dXJuIE1hdGgubWF4KHJlY29tbWVuZGVkSGVpZ2h0LCBEZWZhdWx0TG9nV2lkZ2V0SGVpZ2h0KTtcbiAgfVxufVxuIl19