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

122 lines 18.3 kB
"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 @message 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: "9.15.2" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nTW9uaXRvcmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkxvZ01vbml0b3JpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrREFLb0M7QUFFcEMsK0VBR3VDO0FBQ3ZDLHlDQWdCc0I7QUFDdEIsK0NBR3lCO0FBRXpCLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQXNDeEI7O0dBRUc7QUFDSCxNQUFhLGFBQWMsU0FBUSxtQkFBVTtJQWdCM0MsWUFBWSxLQUFzQixFQUFFLEtBQXlCO1FBQzNELEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUs7YUFDckIsMEJBQTBCLEVBQUU7YUFDNUIsd0JBQXdCLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWhELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUV6QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztRQUNqRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDO1FBRXpDLE1BQU0sY0FBYyxHQUFHLElBQUksb0NBQXdCLENBQUM7WUFDbEQsR0FBRyxLQUFLO1lBQ1IscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFlBQVk7U0FDekMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQ3pDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUMxQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksMEJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWxFLElBQUksQ0FBQyxn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LENBQUMscUJBQVksRUFBRSxNQUFNLENBQUM7YUFDcEQsQ0FBQztTQUNIO2FBQU07WUFDTCxPQUFPO2dCQUNMLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGtCQUFTLEVBQUUsaUNBQXdCLENBQUM7YUFDbkUsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxrQ0FBc0IsQ0FBQztZQUNoQyxNQUFNLEVBQUUsV0FBVztZQUNuQixLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDeEIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUNwRCxPQUFPLElBQUksNEJBQVcsQ0FBQztZQUNyQixLQUFLO1lBQ0wsTUFBTTtZQUNOLEtBQUssRUFBRSxlQUFlO1lBQ3RCLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztZQUNwQyxTQUFTLEVBQUUsMEJBQWlCO1lBQzVCLGVBQWUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1NBQ3ZDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyx3QkFBd0IsQ0FBQyxPQUFlO1FBQ2hELE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN4QixNQUFNLGlCQUFpQixHQUFHLGFBQWEsR0FBRyxPQUFPLENBQUM7UUFDbEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLCtCQUFzQixDQUFDLENBQUM7SUFDN0QsQ0FBQzs7QUF0Skgsc0NBdUpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgR3JhcGhXaWRnZXQsXG4gIEhvcml6b250YWxBbm5vdGF0aW9uLFxuICBJV2lkZ2V0LFxuICBMb2dRdWVyeVdpZGdldCxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5cbmltcG9ydCB7XG4gIENsb3VkV2F0Y2hMb2dzTWV0cmljRmFjdG9yeSxcbiAgQ2xvdWRXYXRjaExvZ3NNZXRyaWNGYWN0b3J5UHJvcHMsXG59IGZyb20gXCIuL0Nsb3VkV2F0Y2hMb2dzTWV0cmljRmFjdG9yeVwiO1xuaW1wb3J0IHtcbiAgQWxhcm1GYWN0b3J5LFxuICBCYXNlTW9uaXRvcmluZ1Byb3BzLFxuICBDb3VudEF4aXNGcm9tWmVybyxcbiAgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0LFxuICBEZWZhdWx0TG9nV2lkZ2V0SGVpZ2h0LFxuICBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCxcbiAgRnVsbFdpZHRoLFxuICBNYXhVc2FnZUNvdW50VGhyZXNob2xkLFxuICBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0LFxuICBNaW5Vc2FnZUNvdW50VGhyZXNob2xkLFxuICBNb25pdG9yaW5nLFxuICBNb25pdG9yaW5nU2NvcGUsXG4gIFF1YXJ0ZXJXaWR0aCxcbiAgVGhyZWVRdWFydGVyc1dpZHRoLFxuICBVc2FnZUFsYXJtRmFjdG9yeSxcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgTW9uaXRvcmluZ0hlYWRlcldpZGdldCxcbiAgTW9uaXRvcmluZ05hbWluZ1N0cmF0ZWd5LFxufSBmcm9tIFwiLi4vLi4vZGFzaGJvYXJkXCI7XG5cbmNvbnN0IERlZmF1bHRMaW1pdCA9IDEwO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ01vbml0b3JpbmdQcm9wc1xuICBleHRlbmRzIEJhc2VNb25pdG9yaW5nUHJvcHMsXG4gICAgQ2xvdWRXYXRjaExvZ3NNZXRyaWNGYWN0b3J5UHJvcHMge1xuICAvKipcbiAgICogV2lkZ2V0IHRpdGxlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0by1nZW5lcmF0ZWQgdGl0bGUgYmFzZWQgb24gdGhlIHBhdHRlcm4gYW5kIGxpbWl0XG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0dGVybiB0byBmaWx0ZXIgYEBtZXNzYWdlYCBmaWVsZCwgZS5nLiBcIkVSUk9SXCJcbiAgICovXG4gIHJlYWRvbmx5IHBhdHRlcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBleHByZXNzaW9ucyB0byBhZGQuXG4gICAqIEBleGFtcGxlXG4gICAqIGZpbHRlckV4cHJlc3Npb25zID0gW2BsZXZlbCA9IFwiRVJST1JcImBdXG4gICAqIC8vIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHF1ZXJ5IGFzXG4gICAqIHwgZmlsdGVyIGxldmVsID0gXCJFUlJPUlwiXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2xvZ3MvQ1dMX1F1ZXJ5U3ludGF4LUZpbHRlci5odG1sXG4gICAqL1xuICByZWFkb25seSBmaWx0ZXJFeHByZXNzaW9ucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBsb2cgbWVzc2FnZXMgdG8gc2VhcmNoIGZvci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSAxMFxuICAgKi9cbiAgcmVhZG9ubHkgbGltaXQ/OiBudW1iZXI7XG5cbiAgcmVhZG9ubHkgYWRkTWluSW5jb21pbmdMb2dzQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBNaW5Vc2FnZUNvdW50VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkTWF4SW5jb21pbmdMb2dzQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBNYXhVc2FnZUNvdW50VGhyZXNob2xkPjtcbn1cblxuLyoqXG4gKiBNb25pdG9ycyBhIENsb3VkV2F0Y2ggbG9nIGdyb3VwIGZvciB2YXJpb3VzIHBhdHRlcm5zLlxuICovXG5leHBvcnQgY2xhc3MgTG9nTW9uaXRvcmluZyBleHRlbmRzIE1vbml0b3Jpbmcge1xuICByZWFkb25seSBsb2dHcm91cE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9nR3JvdXBVcmw/OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgcGF0dGVybj86IHN0cmluZztcbiAgcmVhZG9ubHkgZmlsdGVyRXhwcmVzc2lvbnM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgbGltaXQ6IG51bWJlcjtcblxuICByZWFkb25seSBhbGFybUZhY3Rvcnk6IEFsYXJtRmFjdG9yeTtcbiAgcmVhZG9ubHkgdXNhZ2VBbGFybUZhY3Rvcnk6IFVzYWdlQWxhcm1GYWN0b3J5O1xuICByZWFkb25seSBpbmNvbWluZ0xvZ0V2ZW50c01ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcblxuICByZWFkb25seSB1c2FnZUFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBNb25pdG9yaW5nU2NvcGUsIHByb3BzOiBMb2dNb25pdG9yaW5nUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSk7XG5cbiAgICB0aGlzLmxvZ0dyb3VwTmFtZSA9IHByb3BzLmxvZ0dyb3VwTmFtZTtcbiAgICB0aGlzLmxvZ0dyb3VwVXJsID0gc2NvcGVcbiAgICAgIC5jcmVhdGVBd3NDb25zb2xlVXJsRmFjdG9yeSgpXG4gICAgICAuZ2V0Q2xvdWRXYXRjaExvZ0dyb3VwVXJsKHByb3BzLmxvZ0dyb3VwTmFtZSk7XG5cbiAgICB0aGlzLnRpdGxlID0gcHJvcHMudGl0bGU7XG5cbiAgICB0aGlzLnBhdHRlcm4gPSBwcm9wcy5wYXR0ZXJuO1xuICAgIHRoaXMuZmlsdGVyRXhwcmVzc2lvbnMgPSBwcm9wcy5maWx0ZXJFeHByZXNzaW9ucztcbiAgICB0aGlzLmxpbWl0ID0gcHJvcHMubGltaXQgPz8gRGVmYXVsdExpbWl0O1xuXG4gICAgY29uc3QgbmFtaW5nU3RyYXRlZ3kgPSBuZXcgTW9uaXRvcmluZ05hbWluZ1N0cmF0ZWd5KHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZmFsbGJhY2tDb25zdHJ1Y3ROYW1lOiB0aGlzLmxvZ0dyb3VwTmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmFsYXJtRmFjdG9yeSA9IHRoaXMuY3JlYXRlQWxhcm1GYWN0b3J5KFxuICAgICAgbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUFsYXJtRnJpZW5kbHlOYW1lKCksXG4gICAgKTtcbiAgICB0aGlzLnVzYWdlQWxhcm1GYWN0b3J5ID0gbmV3IFVzYWdlQWxhcm1GYWN0b3J5KHRoaXMuYWxhcm1GYWN0b3J5KTtcblxuICAgIHRoaXMudXNhZ2VBbm5vdGF0aW9ucyA9IFtdO1xuXG4gICAgY29uc3QgbWV0cmljRmFjdG9yeSA9IG5ldyBDbG91ZFdhdGNoTG9nc01ldHJpY0ZhY3RvcnkoXG4gICAgICBzY29wZS5jcmVhdGVNZXRyaWNGYWN0b3J5KCksXG4gICAgICBwcm9wcyxcbiAgICApO1xuICAgIHRoaXMuaW5jb21pbmdMb2dFdmVudHNNZXRyaWMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY0luY29taW5nTG9nRXZlbnRzKCk7XG5cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkTWluSW5jb21pbmdMb2dzQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRNaW5JbmNvbWluZ0xvZ3NBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMudXNhZ2VBbGFybUZhY3RvcnkuYWRkTWluVXNhZ2VDb3VudEFsYXJtKFxuICAgICAgICB0aGlzLmluY29taW5nTG9nRXZlbnRzTWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMudXNhZ2VBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkTWF4SW5jb21pbmdMb2dzQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRNYXhJbmNvbWluZ0xvZ3NBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMudXNhZ2VBbGFybUZhY3RvcnkuYWRkTWF4Q291bnRBbGFybShcbiAgICAgICAgdGhpcy5pbmNvbWluZ0xvZ0V2ZW50c01ldHJpYyxcbiAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICk7XG4gICAgICB0aGlzLnVzYWdlQW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuXG4gICAgcHJvcHMudXNlQ3JlYXRlZEFsYXJtcz8uY29uc3VtZSh0aGlzLmNyZWF0ZWRBbGFybXMoKSk7XG4gIH1cblxuICBzdW1tYXJ5V2lkZ2V0cygpOiBJV2lkZ2V0W10ge1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLmNyZWF0ZVRpdGxlV2lkZ2V0KCksXG4gICAgICB0aGlzLmNyZWF0ZUluY29taW5nTG9nc1dpZGdldChGdWxsV2lkdGgsIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0KSxcbiAgICBdO1xuICB9XG5cbiAgd2lkZ2V0cygpOiBJV2lkZ2V0W10ge1xuICAgIGNvbnN0IGZpbHRlclN0YXRlbWVudHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAodGhpcy5wYXR0ZXJuKSB7XG4gICAgICBmaWx0ZXJTdGF0ZW1lbnRzLnB1c2goYGZpbHRlciBAbWVzc2FnZSBsaWtlIC8ke3RoaXMucGF0dGVybn0vYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyRXhwcmVzc2lvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbiBvZiB0aGlzLmZpbHRlckV4cHJlc3Npb25zKSB7XG4gICAgICAgIGlmIChleHByZXNzaW9uKSB7XG4gICAgICAgICAgZmlsdGVyU3RhdGVtZW50cy5wdXNoKGBmaWx0ZXIgJHtleHByZXNzaW9ufWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlclN0YXRlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5yZXNvbHZlUmVjb21tZW5kZWRIZWlnaHQodGhpcy5saW1pdCk7XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIHRoaXMuY3JlYXRlVGl0bGVXaWRnZXQoKSxcblxuICAgICAgICAvLyBMb2cgUXVlcnkgUmVzdWx0c1xuICAgICAgICBuZXcgTG9nUXVlcnlXaWRnZXQoe1xuICAgICAgICAgIGxvZ0dyb3VwTmFtZXM6IFt0aGlzLmxvZ0dyb3VwTmFtZV0sXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIHdpZHRoOiBUaHJlZVF1YXJ0ZXJzV2lkdGgsXG4gICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUgPz8gYEZpbmQgJHt0aGlzLnBhdHRlcm59IChsaW1pdCA9ICR7dGhpcy5saW1pdH0pYCxcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbG9ncy9DV0xfUXVlcnlTeW50YXguaHRtbFxuICAgICAgICAgICAqL1xuICAgICAgICAgIHF1ZXJ5TGluZXM6IFtcbiAgICAgICAgICAgIFwiZmllbGRzIEB0aW1lc3RhbXAsIEBsb2dTdHJlYW0sIEBtZXNzYWdlXCIsXG4gICAgICAgICAgICAuLi5maWx0ZXJTdGF0ZW1lbnRzLFxuICAgICAgICAgICAgXCJzb3J0IEB0aW1lc3RhbXAgZGVzY1wiLFxuICAgICAgICAgICAgYGxpbWl0ICR7dGhpcy5saW1pdH1gLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuXG4gICAgICAgIHRoaXMuY3JlYXRlSW5jb21pbmdMb2dzV2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgaGVpZ2h0KSxcbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHRoaXMuY3JlYXRlVGl0bGVXaWRnZXQoKSxcbiAgICAgICAgdGhpcy5jcmVhdGVJbmNvbWluZ0xvZ3NXaWRnZXQoRnVsbFdpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVUaXRsZVdpZGdldCgpIHtcbiAgICByZXR1cm4gbmV3IE1vbml0b3JpbmdIZWFkZXJXaWRnZXQoe1xuICAgICAgZmFtaWx5OiBcIkxvZyBHcm91cFwiLFxuICAgICAgdGl0bGU6IHRoaXMubG9nR3JvdXBOYW1lLFxuICAgICAgZ29Ub0xpbmtVcmw6IHRoaXMubG9nR3JvdXBVcmwsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVJbmNvbWluZ0xvZ3NXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiSW5jb21pbmcgbG9nc1wiLFxuICAgICAgbGVmdDogW3RoaXMuaW5jb21pbmdMb2dFdmVudHNNZXRyaWNdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy51c2FnZUFubm90YXRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVSZWNvbW1lbmRlZEhlaWdodChudW1Sb3dzOiBudW1iZXIpIHtcbiAgICBjb25zdCBoZWlnaHRQZXJMaW5lID0gMTtcbiAgICBjb25zdCByZWNvbW1lbmRlZEhlaWdodCA9IGhlaWdodFBlckxpbmUgKiBudW1Sb3dzO1xuICAgIHJldHVybiBNYXRoLm1heChyZWNvbW1lbmRlZEhlaWdodCwgRGVmYXVsdExvZ1dpZGdldEhlaWdodCk7XG4gIH1cbn1cbiJdfQ==