cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
493 lines • 98.3 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.LambdaFunctionMonitoring = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
const LambdaFunctionEnhancedMetricFactory_1 = require("./LambdaFunctionEnhancedMetricFactory");
const LambdaFunctionMetricFactory_1 = require("./LambdaFunctionMetricFactory");
const common_1 = require("../../common");
const dashboard_1 = require("../../dashboard");
class LambdaFunctionMonitoring extends common_1.Monitoring {
constructor(scope, props) {
super(scope, props);
this.namingStrategy = new dashboard_1.MonitoringNamingStrategy({
...props,
namedConstruct: props.lambdaFunction,
fallbackConstructName: this.resolveFunctionName(props.lambdaFunction),
});
this.title = this.namingStrategy.resolveHumanReadableName();
this.functionUrl = scope
.createAwsConsoleUrlFactory()
.getLambdaFunctionUrl(props.lambdaFunction.functionName);
this.alarmFactory = this.createAlarmFactory(this.namingStrategy.resolveAlarmFriendlyName());
this.errorAlarmFactory = new common_1.ErrorAlarmFactory(this.alarmFactory);
this.latencyAlarmFactory = new common_1.LatencyAlarmFactory(this.alarmFactory);
this.tpsAlarmFactory = new common_1.TpsAlarmFactory(this.alarmFactory);
this.taskHealthAlarmFactory = new common_1.TaskHealthAlarmFactory(this.alarmFactory);
this.ageAlarmFactory = new common_1.AgeAlarmFactory(this.alarmFactory);
this.usageAlarmFactory = new common_1.UsageAlarmFactory(this.alarmFactory);
this.latencyAnnotations = [];
this.errorCountAnnotations = [];
this.errorRateAnnotations = [];
this.invocationCountAnnotations = [];
this.invocationRateAnnotations = [];
this.tpsAnnotations = [];
this.cpuTotalTimeAnnotations = [];
this.memoryUsageAnnotations = [];
this.maxIteratorAgeAnnotations = [];
this.maxOffsetLagAnnotations = [];
this.initDurationAnnotations = [];
this.metricFactory = new LambdaFunctionMetricFactory_1.LambdaFunctionMetricFactory(scope.createMetricFactory(), props);
this.tpsMetric = this.metricFactory.metricInvocationRate(common_1.RateComputationMethod.PER_SECOND);
this.p50LatencyMetric = this.metricFactory.metricLatencyInMillis(common_1.LatencyType.P50);
this.p90LatencyMetric = this.metricFactory.metricLatencyInMillis(common_1.LatencyType.P90);
this.p99LatencyMetric = this.metricFactory.metricLatencyInMillis(common_1.LatencyType.P99);
this.maxLatencyMetric = this.metricFactory.metricLatencyInMillis(common_1.LatencyType.MAX);
this.faultCountMetric = this.metricFactory.metricFaultCount();
this.faultRateMetric = this.metricFactory.metricFaultRate();
this.invocationCountMetric = this.metricFactory.metricInvocationCount();
this.throttlesCountMetric = this.metricFactory.metricThrottlesCount();
this.throttlesRateMetric = this.metricFactory.metricThrottlesRate();
this.concurrentExecutionsCountMetric =
this.metricFactory.metricConcurrentExecutions();
this.provisionedConcurrencySpilloverInvocationsCountMetric =
this.metricFactory.metricProvisionedConcurrencySpilloverInvocations();
this.provisionedConcurrencySpilloverInvocationsRateMetric =
this.metricFactory.metricProvisionedConcurrencySpilloverRate();
this.isIterator = props.isIterator ?? true;
this.maxIteratorAgeMetric =
this.metricFactory.metricMaxIteratorAgeInMillis();
this.isOffsetLag = props.isOffsetLag ?? false;
this.maxOffsetLagMetric =
this.metricFactory.metricMaxOffsetLagInNumberOfRecords();
this.lambdaInsightsEnabled = props.lambdaInsightsEnabled ?? false;
if (props.lambdaInsightsEnabled) {
this.enhancedMetricFactory = new LambdaFunctionEnhancedMetricFactory_1.LambdaFunctionEnhancedMetricFactory(scope.createMetricFactory(), props);
this.enhancedMonitoringMaxCpuTotalTimeMetric =
this.enhancedMetricFactory.enhancedMetricMaxCpuTotalTime();
this.enhancedMonitoringP90CpuTotalTimeMetric =
this.enhancedMetricFactory.enhancedMetricP90CpuTotalTime();
this.enhancedMonitoringAvgCpuTotalTimeMetric =
this.enhancedMetricFactory.enhancedMetricAvgCpuTotalTime();
this.enhancedMonitoringMaxMemoryUtilizationMetric =
this.enhancedMetricFactory.enhancedMetricMaxMemoryUtilization();
this.enhancedMonitoringP90MemoryUtilizationMetric =
this.enhancedMetricFactory.enhancedMetricP90MemoryUtilization();
this.enhancedMonitoringAvgMemoryUtilizationMetric =
this.enhancedMetricFactory.enhancedMetricAvgMemoryUtilization();
this.enhancedMonitoringMaxInitDurationMetric =
this.enhancedMetricFactory.enhancedMetricMaxInitDuration();
this.enhancedMonitoringP90InitDurationMetric =
this.enhancedMetricFactory.enhancedMetricP90InitDuration();
this.enhancedMonitoringAvgInitDurationMetric =
this.enhancedMetricFactory.enhancedMetricAvgInitDuration();
this.enhancedMetricFunctionCostMetric =
this.enhancedMetricFactory.enhancedMetricFunctionCost();
for (const disambiguator in props.addEnhancedMonitoringMaxCpuTotalTimeAlarm) {
const alarmProps = props.addEnhancedMonitoringMaxCpuTotalTimeAlarm[disambiguator];
const createdAlarm = this.latencyAlarmFactory.addDurationAlarm(
/* eslint-disable @typescript-eslint/no-non-null-assertion */
this.enhancedMonitoringMaxCpuTotalTimeMetric,
/* eslint-enable @typescript-eslint/no-non-null-assertion */
common_1.LatencyType.P100, alarmProps, disambiguator);
this.cpuTotalTimeAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addEnhancedMonitoringP90CpuTotalTimeAlarm) {
const alarmProps = props.addEnhancedMonitoringP90CpuTotalTimeAlarm[disambiguator];
const createdAlarm = this.latencyAlarmFactory.addDurationAlarm(
/* eslint-disable @typescript-eslint/no-non-null-assertion */
this.enhancedMonitoringP90CpuTotalTimeMetric,
/* eslint-enable @typescript-eslint/no-non-null-assertion */
common_1.LatencyType.P90, alarmProps, disambiguator);
this.cpuTotalTimeAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addEnhancedMonitoringAvgCpuTotalTimeAlarm) {
const alarmProps = props.addEnhancedMonitoringAvgCpuTotalTimeAlarm[disambiguator];
const createdAlarm = this.latencyAlarmFactory.addDurationAlarm(
/* eslint-disable @typescript-eslint/no-non-null-assertion */
this.enhancedMonitoringAvgCpuTotalTimeMetric,
/* eslint-enable @typescript-eslint/no-non-null-assertion */
common_1.LatencyType.AVERAGE, alarmProps, disambiguator);
this.cpuTotalTimeAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addEnhancedMonitoringMaxMemoryUtilizationAlarm) {
const alarmProps = props.addEnhancedMonitoringMaxMemoryUtilizationAlarm[disambiguator];
const createdAlarm = this.usageAlarmFactory.addMaxMemoryUsagePercentAlarm(
/* eslint-disable @typescript-eslint/no-non-null-assertion */
this.enhancedMonitoringMaxMemoryUtilizationMetric,
/* eslint-enable @typescript-eslint/no-non-null-assertion */
alarmProps, disambiguator);
this.memoryUsageAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addEnhancedMonitoringP90MemoryUtilizationAlarm) {
const alarmProps = props.addEnhancedMonitoringP90MemoryUtilizationAlarm[disambiguator];
const createdAlarm = this.usageAlarmFactory.addMemoryUsagePercentAlarm(
/* eslint-disable @typescript-eslint/no-non-null-assertion */
this.enhancedMonitoringP90MemoryUtilizationMetric,
/* eslint-enable @typescript-eslint/no-non-null-assertion */
alarmProps, common_1.UsageType.P90, disambiguator);
this.memoryUsageAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addEnhancedMonitoringAvgMemoryUtilizationAlarm) {
const alarmProps = props.addEnhancedMonitoringAvgMemoryUtilizationAlarm[disambiguator];
const createdAlarm = this.usageAlarmFactory.addMemoryUsagePercentAlarm(
/* eslint-disable @typescript-eslint/no-non-null-assertion */
this.enhancedMonitoringAvgMemoryUtilizationMetric,
/* eslint-enable @typescript-eslint/no-non-null-assertion */
alarmProps, common_1.UsageType.AVERAGE, disambiguator);
this.memoryUsageAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addEnhancedMonitoringMaxInitDurationAlarm) {
const alarmProps = props.addEnhancedMonitoringMaxInitDurationAlarm[disambiguator];
const createdAlarm = this.latencyAlarmFactory.addCustomDurationAlarm(
/* eslint-disable @typescript-eslint/no-non-null-assertion */
this.enhancedMonitoringMaxInitDurationMetric,
/* eslint-enable @typescript-eslint/no-non-null-assertion */
common_1.LatencyType.MAX, alarmProps, "InitDuration", disambiguator);
this.initDurationAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addEnhancedMonitoringP90InitDurationAlarm) {
const alarmProps = props.addEnhancedMonitoringP90InitDurationAlarm[disambiguator];
const createdAlarm = this.latencyAlarmFactory.addCustomDurationAlarm(
/* eslint-disable @typescript-eslint/no-non-null-assertion */
this.enhancedMonitoringP90InitDurationMetric,
/* eslint-enable @typescript-eslint/no-non-null-assertion */
common_1.LatencyType.P90, alarmProps, "InitDuration", disambiguator);
this.initDurationAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addEnhancedMonitoringAvgInitDurationAlarm) {
const alarmProps = props.addEnhancedMonitoringAvgInitDurationAlarm[disambiguator];
const createdAlarm = this.latencyAlarmFactory.addCustomDurationAlarm(
/* eslint-disable @typescript-eslint/no-non-null-assertion */
this.enhancedMonitoringAvgInitDurationMetric,
/* eslint-enable @typescript-eslint/no-non-null-assertion */
common_1.LatencyType.AVERAGE, alarmProps, "InitDuration", disambiguator);
this.initDurationAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
}
for (const disambiguator in props.addLatencyP50Alarm) {
const alarmProps = props.addLatencyP50Alarm[disambiguator];
const createdAlarm = this.latencyAlarmFactory.addLatencyAlarm(this.p50LatencyMetric, common_1.LatencyType.P50, this.convertToLatencyThreshold(alarmProps, props.lambdaFunction), disambiguator);
this.latencyAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addLatencyP90Alarm) {
const alarmProps = props.addLatencyP90Alarm[disambiguator];
const createdAlarm = this.latencyAlarmFactory.addLatencyAlarm(this.p90LatencyMetric, common_1.LatencyType.P90, this.convertToLatencyThreshold(alarmProps, props.lambdaFunction), disambiguator);
this.latencyAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addLatencyP99Alarm) {
const alarmProps = props.addLatencyP99Alarm[disambiguator];
const createdAlarm = this.latencyAlarmFactory.addLatencyAlarm(this.p99LatencyMetric, common_1.LatencyType.P99, this.convertToLatencyThreshold(alarmProps, props.lambdaFunction), disambiguator);
this.latencyAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addMaxLatencyAlarm) {
const alarmProps = props.addMaxLatencyAlarm[disambiguator];
const createdAlarm = this.latencyAlarmFactory.addLatencyAlarm(this.maxLatencyMetric, common_1.LatencyType.MAX, this.convertToLatencyThreshold(alarmProps, props.lambdaFunction), disambiguator);
this.latencyAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addFaultCountAlarm) {
const alarmProps = props.addFaultCountAlarm[disambiguator];
const createdAlarm = this.errorAlarmFactory.addErrorCountAlarm(this.faultCountMetric, common_1.ErrorType.FAULT, alarmProps, disambiguator);
this.errorCountAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addFaultRateAlarm) {
const alarmProps = props.addFaultRateAlarm[disambiguator];
const createdAlarm = this.errorAlarmFactory.addErrorRateAlarm(this.faultRateMetric, common_1.ErrorType.FAULT, alarmProps, disambiguator);
this.errorRateAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addLowTpsAlarm) {
const alarmProps = props.addLowTpsAlarm[disambiguator];
const createdAlarm = this.tpsAlarmFactory.addMinTpsAlarm(this.tpsMetric, alarmProps, disambiguator);
this.tpsAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addHighTpsAlarm) {
const alarmProps = props.addHighTpsAlarm[disambiguator];
const createdAlarm = this.tpsAlarmFactory.addMaxTpsAlarm(this.tpsMetric, alarmProps, disambiguator);
this.tpsAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addThrottlesCountAlarm) {
const alarmProps = props.addThrottlesCountAlarm[disambiguator];
const createdAlarm = this.errorAlarmFactory.addErrorCountAlarm(this.throttlesCountMetric, common_1.ErrorType.THROTTLED, alarmProps, disambiguator);
this.invocationCountAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addThrottlesRateAlarm) {
const alarmProps = props.addThrottlesRateAlarm[disambiguator];
const createdAlarm = this.errorAlarmFactory.addErrorRateAlarm(this.throttlesRateMetric, common_1.ErrorType.THROTTLED, alarmProps, disambiguator);
this.invocationRateAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addMinInvocationsCountAlarm) {
const alarmProps = props.addMinInvocationsCountAlarm[disambiguator];
const createdAlarm = this.usageAlarmFactory.addMinUsageCountAlarm(this.invocationCountMetric, alarmProps, disambiguator);
this.invocationCountAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addConcurrentExecutionsCountAlarm) {
const alarmProps = props.addConcurrentExecutionsCountAlarm[disambiguator];
const createdAlarm = this.taskHealthAlarmFactory.addRunningTaskCountAlarm(this.concurrentExecutionsCountMetric, alarmProps, disambiguator);
this.invocationCountAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addProvisionedConcurrencySpilloverInvocationsCountAlarm) {
const alarmProps = props.addProvisionedConcurrencySpilloverInvocationsCountAlarm[disambiguator];
const createdAlarm = this.taskHealthAlarmFactory.addRunningTaskCountAlarm(this.provisionedConcurrencySpilloverInvocationsCountMetric, alarmProps, disambiguator);
this.invocationCountAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addProvisionedConcurrencySpilloverInvocationsRateAlarm) {
const alarmProps = props.addProvisionedConcurrencySpilloverInvocationsRateAlarm[disambiguator];
const createdAlarm = this.taskHealthAlarmFactory.addRunningTaskRateAlarm(this.provisionedConcurrencySpilloverInvocationsRateMetric, alarmProps, disambiguator);
this.invocationRateAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addMaxIteratorAgeAlarm) {
if (!this.isIterator) {
throw new Error("addMaxIteratorAgeAlarm is not applicable if isIterator is not true");
}
const alarmProps = props.addMaxIteratorAgeAlarm[disambiguator];
const createdAlarm = this.ageAlarmFactory.addIteratorMaxAgeAlarm(this.maxIteratorAgeMetric, alarmProps, disambiguator);
this.maxIteratorAgeAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addMaxOffsetLagAlarm) {
if (!this.isOffsetLag) {
throw new Error("addMaxOffsetLagAlarm is not applicable if isOffsetLag is not true");
}
const alarmProps = props.addMaxOffsetLagAlarm[disambiguator];
const createdAlarm = this.ageAlarmFactory.addMaxOffsetLagAlarm(this.maxOffsetLagMetric, alarmProps, disambiguator);
this.maxOffsetLagAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
props.useCreatedAlarms?.consume(this.createdAlarms());
}
convertToLatencyThreshold(latencyProps, lambdaFunction) {
if ("maxLatency" in latencyProps) {
return latencyProps;
}
const { maxLatencyPercentageOfTimeout, ...rest } = latencyProps;
const timeout = lambdaFunction.timeout ?? aws_cdk_lib_1.Duration.seconds(3);
return {
...rest,
maxLatency: aws_cdk_lib_1.Duration.millis(Math.floor((timeout.toMilliseconds() * maxLatencyPercentageOfTimeout) / 100)),
};
}
summaryWidgets() {
return [
this.createTitleWidget(),
this.createTpsWidget(common_1.ThirdWidth, common_1.DefaultSummaryWidgetHeight),
this.createLatencyWidget(common_1.ThirdWidth, common_1.DefaultSummaryWidgetHeight),
this.createErrorRateWidget(common_1.ThirdWidth, common_1.DefaultSummaryWidgetHeight),
];
}
widgets() {
const widgets = [
this.createTitleWidget(),
new aws_cloudwatch_1.Row(this.createTpsWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createLatencyWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createErrorRateWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createRateWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight)),
];
let secondRowWidgetWidth;
if (this.isIterator && this.isOffsetLag) {
secondRowWidgetWidth = common_1.QuarterWidth;
}
else if (this.isIterator || this.isOffsetLag) {
secondRowWidgetWidth = common_1.ThirdWidth;
}
else {
secondRowWidgetWidth = common_1.HalfWidth;
}
const secondRow = new aws_cloudwatch_1.Row(this.createInvocationWidget(secondRowWidgetWidth, common_1.DefaultGraphWidgetHeight), this.createErrorCountWidget(secondRowWidgetWidth, common_1.DefaultGraphWidgetHeight));
if (this.isIterator) {
secondRow.addWidget(this.createIteratorAgeWidget(secondRowWidgetWidth, common_1.DefaultGraphWidgetHeight));
}
if (this.isOffsetLag) {
secondRow.addWidget(this.createOffsetLagWidget(secondRowWidgetWidth, common_1.DefaultGraphWidgetHeight));
}
widgets.push(secondRow);
if (this.lambdaInsightsEnabled) {
widgets.push(new aws_cloudwatch_1.Row(this.createLambdaInsightsCpuWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createLambdaInsightsMemoryWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createLambdaInsightsInitDurationWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createLambdaInsightsFunctionCostWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight)));
}
return widgets;
}
createTitleWidget() {
return new dashboard_1.MonitoringHeaderWidget({
family: "Lambda Function",
title: this.title,
goToLinkUrl: this.functionUrl,
});
}
createTpsWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "TPS",
left: [this.tpsMetric],
leftYAxis: common_1.RateAxisFromZero,
leftAnnotations: this.tpsAnnotations,
});
}
createLatencyWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Latency",
left: [
this.p50LatencyMetric,
this.p90LatencyMetric,
this.p99LatencyMetric,
],
leftYAxis: common_1.TimeAxisMillisFromZero,
leftAnnotations: this.latencyAnnotations,
});
}
createErrorCountWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Errors",
left: [this.faultCountMetric],
leftYAxis: common_1.CountAxisFromZero,
leftAnnotations: this.errorCountAnnotations,
});
}
createErrorRateWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Errors (rate)",
left: [this.faultRateMetric],
leftYAxis: common_1.RateAxisFromZero,
leftAnnotations: this.errorRateAnnotations,
});
}
createRateWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Rates",
left: [
this.throttlesRateMetric,
this.provisionedConcurrencySpilloverInvocationsRateMetric,
],
leftYAxis: common_1.RateAxisFromZero,
leftAnnotations: this.invocationRateAnnotations,
});
}
createInvocationWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Invocations",
left: [
this.invocationCountMetric,
this.throttlesCountMetric,
this.concurrentExecutionsCountMetric,
this.provisionedConcurrencySpilloverInvocationsCountMetric,
],
leftYAxis: common_1.CountAxisFromZero,
leftAnnotations: this.invocationCountAnnotations,
});
}
createIteratorAgeWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Iterator",
left: [this.maxIteratorAgeMetric],
leftYAxis: common_1.TimeAxisMillisFromZero,
leftAnnotations: this.maxIteratorAgeAnnotations,
});
}
createOffsetLagWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "OffsetLag",
left: [this.maxOffsetLagMetric],
leftYAxis: common_1.CountAxisFromZero,
leftAnnotations: this.maxOffsetLagAnnotations,
});
}
createLambdaInsightsCpuWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "CPU Total Time",
left: [
/* eslint-disable @typescript-eslint/no-non-null-assertion */
this.enhancedMonitoringMaxCpuTotalTimeMetric,
this.enhancedMonitoringP90CpuTotalTimeMetric,
this.enhancedMonitoringAvgCpuTotalTimeMetric,
],
leftYAxis: common_1.TimeAxisMillisFromZero,
leftAnnotations: this.cpuTotalTimeAnnotations,
});
}
createLambdaInsightsMemoryWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Memory Utilization",
left: [
/* eslint-disable @typescript-eslint/no-non-null-assertion */
this.enhancedMonitoringMaxMemoryUtilizationMetric,
this.enhancedMonitoringP90MemoryUtilizationMetric,
this.enhancedMonitoringAvgMemoryUtilizationMetric,
],
leftYAxis: common_1.PercentageAxisFromZeroToHundred,
leftAnnotations: this.memoryUsageAnnotations,
});
}
createLambdaInsightsInitDurationWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Init Duration",
left: [
/* eslint-disable @typescript-eslint/no-non-null-assertion */
this.enhancedMonitoringMaxInitDurationMetric,
this.enhancedMonitoringP90InitDurationMetric,
this.enhancedMonitoringAvgInitDurationMetric,
],
leftYAxis: common_1.TimeAxisMillisFromZero,
leftAnnotations: this.initDurationAnnotations,
});
}
createLambdaInsightsFunctionCostWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Function Cost",
/* eslint-disable @typescript-eslint/no-non-null-assertion */
left: [this.enhancedMetricFunctionCostMetric],
/* eslint-enable @typescript-eslint/no-non-null-assertion */
leftYAxis: common_1.MegabyteMillisecondAxisFromZero,
});
}
resolveFunctionName(lambdaFunction) {
// try to take the name (if specified) instead of token
return lambdaFunction.node.defaultChild?.functionName;
}
}
exports.LambdaFunctionMonitoring = LambdaFunctionMonitoring;
_a = JSII_RTTI_SYMBOL_1;
LambdaFunctionMonitoring[_a] = { fqn: "cdk-monitoring-constructs.LambdaFunctionMonitoring", version: "9.13.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGFtYmRhRnVuY3Rpb25Nb25pdG9yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTGFtYmRhRnVuY3Rpb25Nb25pdG9yaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQXVDO0FBQ3ZDLCtEQUtvQztBQUdwQywrRkFBNEY7QUFDNUYsK0VBR3VDO0FBQ3ZDLHlDQXVDc0I7QUFDdEIsK0NBR3lCO0FBNkd6QixNQUFhLHdCQUF5QixTQUFRLG1CQUFVO0lBMER0RCxZQUFZLEtBQXNCLEVBQUUsS0FBb0M7UUFDdEUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVwQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksb0NBQXdCLENBQUM7WUFDakQsR0FBRyxLQUFLO1lBQ1IsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjO1lBQ3BDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1NBQ3RFLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSzthQUNyQiwwQkFBMEIsRUFBRTthQUM1QixvQkFBb0IsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLHdCQUF3QixFQUFFLENBQy9DLENBQUM7UUFDRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSwwQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksNEJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxlQUFlLEdBQUcs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bmltcG9ydCB7XG4gIEdyYXBoV2lkZ2V0LFxuICBIb3Jpem9udGFsQW5ub3RhdGlvbixcbiAgSVdpZGdldCxcbiAgUm93LFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7IENmbkZ1bmN0aW9uLCBGdW5jdGlvbiwgSUZ1bmN0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcblxuaW1wb3J0IHsgTGFtYmRhRnVuY3Rpb25FbmhhbmNlZE1ldHJpY0ZhY3RvcnkgfSBmcm9tIFwiLi9MYW1iZGFGdW5jdGlvbkVuaGFuY2VkTWV0cmljRmFjdG9yeVwiO1xuaW1wb3J0IHtcbiAgTGFtYmRhRnVuY3Rpb25NZXRyaWNGYWN0b3J5LFxuICBMYW1iZGFGdW5jdGlvbk1ldHJpY0ZhY3RvcnlQcm9wcyxcbn0gZnJvbSBcIi4vTGFtYmRhRnVuY3Rpb25NZXRyaWNGYWN0b3J5XCI7XG5pbXBvcnQge1xuICBBZ2VBbGFybUZhY3RvcnksXG4gIEFsYXJtRmFjdG9yeSxcbiAgQmFzZU1vbml0b3JpbmdQcm9wcyxcbiAgQ291bnRBeGlzRnJvbVplcm8sXG4gIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCxcbiAgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQsXG4gIER1cmF0aW9uVGhyZXNob2xkLFxuICBFcnJvckFsYXJtRmFjdG9yeSxcbiAgRXJyb3JDb3VudFRocmVzaG9sZCxcbiAgRXJyb3JSYXRlVGhyZXNob2xkLFxuICBFcnJvclR5cGUsXG4gIEhhbGZXaWR0aCxcbiAgSGlnaFRwc1RocmVzaG9sZCxcbiAgTGF0ZW5jeUFsYXJtRmFjdG9yeSxcbiAgTGF0ZW5jeVRocmVzaG9sZCxcbiAgTGF0ZW5jeVRpbWVvdXRQZXJjZW50YWdlVGhyZXNob2xkLFxuICBMYXRlbmN5VHlwZSxcbiAgTG93VHBzVGhyZXNob2xkLFxuICBNYXhBZ2VUaHJlc2hvbGQsXG4gIE1heE9mZnNldExhZ1RocmVzaG9sZCxcbiAgTWVnYWJ5dGVNaWxsaXNlY29uZEF4aXNGcm9tWmVybyxcbiAgTWV0cmljV2l0aEFsYXJtU3VwcG9ydCxcbiAgTWluVXNhZ2VDb3VudFRocmVzaG9sZCxcbiAgTW9uaXRvcmluZyxcbiAgTW9uaXRvcmluZ1Njb3BlLFxuICBQZXJjZW50YWdlQXhpc0Zyb21aZXJvVG9IdW5kcmVkLFxuICBRdWFydGVyV2lkdGgsXG4gIFJhdGVBeGlzRnJvbVplcm8sXG4gIFJhdGVDb21wdXRhdGlvbk1ldGhvZCxcbiAgUnVubmluZ1Rhc2tDb3VudFRocmVzaG9sZCxcbiAgUnVubmluZ1Rhc2tSYXRlVGhyZXNob2xkLFxuICBUYXNrSGVhbHRoQWxhcm1GYWN0b3J5LFxuICBUaGlyZFdpZHRoLFxuICBUaW1lQXhpc01pbGxpc0Zyb21aZXJvLFxuICBUcHNBbGFybUZhY3RvcnksXG4gIFVzYWdlQWxhcm1GYWN0b3J5LFxuICBVc2FnZVRocmVzaG9sZCxcbiAgVXNhZ2VUeXBlLFxufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1xuICBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0LFxuICBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3ksXG59IGZyb20gXCIuLi8uLi9kYXNoYm9hcmRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBMYW1iZGFGdW5jdGlvbk1vbml0b3JpbmdPcHRpb25zIGV4dGVuZHMgQmFzZU1vbml0b3JpbmdQcm9wcyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgTGFtYmRhIGZ1bmN0aW9uIGhhbmRsZXMgYW4gZXZlbnQgc291cmNlIChlLmcuIER5bmFtb0RCIGV2ZW50IHN0cmVhbSkuXG4gICAqIFRoaXMgaW1wYWN0cyB3aGF0IHdpZGdldHMgYXJlIHNob3duLCBhcyB3ZWxsIGFzIHZhbGlkYXRlcyB0aGUgYWJpbGl0eSB0byB1c2UgYWRkTWF4SXRlcmF0b3JBZ2VBbGFybS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0cnVlXG4gICAqL1xuICByZWFkb25seSBpc0l0ZXJhdG9yPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSBMYW1iZGEgZnVuY3Rpb24gaGFuZGxlcyBhbiBldmVudCBzb3VyY2Ugd2hpY2ggdXNlcyBvZmZzZXRzIGZvciByZWNvcmRzIChlLmcuIEthZmthIHN0cmVhbXMpLlxuICAgKiBUaGlzIGltcGFjdHMgd2hhdCB3aWRnZXRzIGFyZSBzaG93biwgYXMgd2VsbCBhcyB2YWxpZGF0ZXMgdGhlIGFiaWxpdHkgdG8gdXNlIGFkZE1heE9mZnNldExhZ0FsYXJtLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpc09mZnNldExhZz86IGJvb2xlYW47XG5cbiAgcmVhZG9ubHkgYWRkTGF0ZW5jeVA1MEFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBMYXRlbmN5VGhyZXNob2xkIHwgTGF0ZW5jeVRpbWVvdXRQZXJjZW50YWdlVGhyZXNob2xkXG4gID47XG4gIHJlYWRvbmx5IGFkZExhdGVuY3lQOTBBbGFybT86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgTGF0ZW5jeVRocmVzaG9sZCB8IExhdGVuY3lUaW1lb3V0UGVyY2VudGFnZVRocmVzaG9sZFxuICA+O1xuICByZWFkb25seSBhZGRMYXRlbmN5UDk5QWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIExhdGVuY3lUaHJlc2hvbGQgfCBMYXRlbmN5VGltZW91dFBlcmNlbnRhZ2VUaHJlc2hvbGRcbiAgPjtcbiAgcmVhZG9ubHkgYWRkTWF4TGF0ZW5jeUFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBMYXRlbmN5VGhyZXNob2xkIHwgTGF0ZW5jeVRpbWVvdXRQZXJjZW50YWdlVGhyZXNob2xkXG4gID47XG5cbiAgcmVhZG9ubHkgYWRkRmF1bHRDb3VudEFsYXJtPzogUmVjb3JkPHN0cmluZywgRXJyb3JDb3VudFRocmVzaG9sZD47XG4gIHJlYWRvbmx5IGFkZEZhdWx0UmF0ZUFsYXJtPzogUmVjb3JkPHN0cmluZywgRXJyb3JSYXRlVGhyZXNob2xkPjtcblxuICByZWFkb25seSBhZGRMb3dUcHNBbGFybT86IFJlY29yZDxzdHJpbmcsIExvd1Rwc1RocmVzaG9sZD47XG4gIHJlYWRvbmx5IGFkZEhpZ2hUcHNBbGFybT86IFJlY29yZDxzdHJpbmcsIEhpZ2hUcHNUaHJlc2hvbGQ+O1xuXG4gIHJlYWRvbmx5IGFkZFRocm90dGxlc0NvdW50QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBFcnJvckNvdW50VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkVGhyb3R0bGVzUmF0ZUFsYXJtPzogUmVjb3JkPHN0cmluZywgRXJyb3JSYXRlVGhyZXNob2xkPjtcblxuICByZWFkb25seSBhZGRNaW5JbnZvY2F0aW9uc0NvdW50QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBNaW5Vc2FnZUNvdW50VGhyZXNob2xkPjtcblxuICByZWFkb25seSBhZGRDb25jdXJyZW50RXhlY3V0aW9uc0NvdW50QWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJ1bm5pbmdUYXNrQ291bnRUaHJlc2hvbGRcbiAgPjtcbiAgcmVhZG9ubHkgYWRkUHJvdmlzaW9uZWRDb25jdXJyZW5jeVNwaWxsb3Zlckludm9jYXRpb25zQ291bnRBbGFybT86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUnVubmluZ1Rhc2tDb3VudFRocmVzaG9sZFxuICA+O1xuICByZWFkb25seSBhZGRQcm92aXNpb25lZENvbmN1cnJlbmN5U3BpbGxvdmVySW52b2NhdGlvbnNSYXRlQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJ1bm5pbmdUYXNrUmF0ZVRocmVzaG9sZFxuICA+O1xuICByZWFkb25seSBhZGRNYXhJdGVyYXRvckFnZUFsYXJtPzogUmVjb3JkPHN0cmluZywgTWF4QWdlVGhyZXNob2xkPjtcblxuICByZWFkb25seSBhZGRNYXhPZmZzZXRMYWdBbGFybT86IFJlY29yZDxzdHJpbmcsIE1heE9mZnNldExhZ1RocmVzaG9sZD47XG5cbiAgLy8gRW5oYW5jZWQgQ1BVIG1ldHJpY3MgdGhhdCBhcmUgYWxsIHRpbWUtYmFzZWQgYW5kIG5vdCBwZXJjZW50IGJhc2VkXG4gIHJlYWRvbmx5IGFkZEVuaGFuY2VkTW9uaXRvcmluZ01heENwdVRvdGFsVGltZUFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBEdXJhdGlvblRocmVzaG9sZFxuICA+O1xuICByZWFkb25seSBhZGRFbmhhbmNlZE1vbml0b3JpbmdQOTBDcHVUb3RhbFRpbWVBbGFybT86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgRHVyYXRpb25UaHJlc2hvbGRcbiAgPjtcbiAgcmVhZG9ubHkgYWRkRW5oYW5jZWRNb25pdG9yaW5nQXZnQ3B1VG90YWxUaW1lQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIER1cmF0aW9uVGhyZXNob2xkXG4gID47XG5cbiAgLy8gRW5oYW5jZWQgbWVtb3J5IG1ldHJpY3MgdGhhdCBhcmUgcGVyY2VudC1iYXNlZFxuICByZWFkb25seSBhZGRFbmhhbmNlZE1vbml0b3JpbmdNYXhNZW1vcnlVdGlsaXphdGlvbkFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBVc2FnZVRocmVzaG9sZFxuICA+O1xuICByZWFkb25seSBhZGRFbmhhbmNlZE1vbml0b3JpbmdQOTBNZW1vcnlVdGlsaXphdGlvbkFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBVc2FnZVRocmVzaG9sZFxuICA+O1xuICByZWFkb25seSBhZGRFbmhhbmNlZE1vbml0b3JpbmdBdmdNZW1vcnlVdGlsaXphdGlvbkFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBVc2FnZVRocmVzaG9sZFxuICA+O1xuXG4gIC8vIEVuaGFuY2VkIGluaXQgZHVyYXRpb24gbWV0cmljcyB0aGF0IGFyZSB0aW1lLWJhc2VkXG4gIHJlYWRvbmx5IGFkZEVuaGFuY2VkTW9uaXRvcmluZ01heEluaXREdXJhdGlvbkFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBEdXJhdGlvblRocmVzaG9sZFxuICA+O1xuICByZWFkb25seSBhZGRFbmhhbmNlZE1vbml0b3JpbmdQOTBJbml0RHVyYXRpb25BbGFybT86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgRHVyYXRpb25UaHJlc2hvbGRcbiAgPjtcbiAgcmVhZG9ubHkgYWRkRW5oYW5jZWRNb25pdG9yaW5nQXZnSW5pdER1cmF0aW9uQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIER1cmF0aW9uVGhyZXNob2xkXG4gID47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhRnVuY3Rpb25Nb25pdG9yaW5nUHJvcHNcbiAgZXh0ZW5kcyBMYW1iZGFGdW5jdGlvbk1ldHJpY0ZhY3RvcnlQcm9wcyxcbiAgICBMYW1iZGFGdW5jdGlvbk1vbml0b3JpbmdPcHRpb25zIHt9XG5cbmV4cG9ydCBjbGFzcyBMYW1iZGFGdW5jdGlvbk1vbml0b3JpbmcgZXh0ZW5kcyBNb25pdG9yaW5nIHtcbiAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcmVhZG9ubHkgZnVuY3Rpb25Vcmw/OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgbmFtaW5nU3RyYXRlZ3k6IE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneTtcbiAgcmVhZG9ubHkgbWV0cmljRmFjdG9yeTogTGFtYmRhRnVuY3Rpb25NZXRyaWNGYWN0b3J5O1xuICByZWFkb25seSBhbGFybUZhY3Rvcnk6IEFsYXJtRmFjdG9yeTtcbiAgcmVhZG9ubHkgZXJyb3JBbGFybUZhY3Rvcnk6IEVycm9yQWxhcm1GYWN0b3J5O1xuICByZWFkb25seSBsYXRlbmN5QWxhcm1GYWN0b3J5OiBMYXRlbmN5QWxhcm1GYWN0b3J5O1xuICByZWFkb25seSB0cHNBbGFybUZhY3Rvcnk6IFRwc0FsYXJtRmFjdG9yeTtcbiAgcmVhZG9ubHkgdGFza0hlYWx0aEFsYXJtRmFjdG9yeTogVGFza0hlYWx0aEFsYXJtRmFjdG9yeTtcbiAgcmVhZG9ubHkgYWdlQWxhcm1GYWN0b3J5OiBBZ2VBbGFybUZhY3Rvcnk7XG4gIHJlYWRvbmx5IHVzYWdlQWxhcm1GYWN0b3J5OiBVc2FnZUFsYXJtRmFjdG9yeTtcblxuICByZWFkb25seSBsYXRlbmN5QW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG4gIHJlYWRvbmx5IGVycm9yQ291bnRBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcbiAgcmVhZG9ubHkgZXJyb3JSYXRlQW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG4gIHJlYWRvbmx5IGludm9jYXRpb25Db3VudEFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuICByZWFkb25seSBpbnZvY2F0aW9uUmF0ZUFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuICByZWFkb25seSB0cHNBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcbiAgcmVhZG9ubHkgY3B1VG90YWxUaW1lQW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG4gIHJlYWRvbmx5IG1lbW9yeVVzYWdlQW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG4gIHJlYWRvbmx5IG1heEl0ZXJhdG9yQWdlQW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG4gIHJlYWRvbmx5IG1heE9mZnNldExhZ0Fubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuICByZWFkb25seSBpbml0RHVyYXRpb25Bbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcblxuICByZWFkb25seSB0cHNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHA1MExhdGVuY3lNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHA5MExhdGVuY3lNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHA5OUxhdGVuY3lNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IG1heExhdGVuY3lNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IGZhdWx0Q291bnRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IGZhdWx0UmF0ZU1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgaW52b2NhdGlvbkNvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSB0aHJvdHRsZXNDb3VudE1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgdGhyb3R0bGVzUmF0ZU1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgY29uY3VycmVudEV4ZWN1dGlvbnNDb3VudE1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgcHJvdmlzaW9uZWRDb25jdXJyZW5jeVNwaWxsb3Zlckludm9jYXRpb25zQ291bnRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHByb3Zpc2lvbmVkQ29uY3VycmVuY3lTcGlsbG92ZXJJbnZvY2F0aW9uc1JhdGVNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG5cbiAgcmVhZG9ubHkgaXNJdGVyYXRvcjogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbWF4SXRlcmF0b3JBZ2VNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IGlzT2Zmc2V0TGFnOiBib29sZWFuO1xuICByZWFkb25seSBtYXhPZmZzZXRMYWdNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG5cbiAgcmVhZG9ubHkgbGFtYmRhSW5zaWdodHNFbmFibGVkOiBib29sZWFuO1xuICByZWFkb25seSBlbmhhbmNlZE1ldHJpY0ZhY3Rvcnk/OiBMYW1iZGFGdW5jdGlvbkVuaGFuY2VkTWV0cmljRmFjdG9yeTtcbiAgcmVhZG9ubHkgZW5oYW5jZWRNb25pdG9yaW5nTWF4Q3B1VG90YWxUaW1lTWV0cmljPzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgZW5oYW5jZWRNb25pdG9yaW5nUDkwQ3B1VG90YWxUaW1lTWV0cmljPzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgZW5oYW5jZWRNb25pdG9yaW5nQXZnQ3B1VG90YWxUaW1lTWV0cmljPzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgZW5oYW5jZWRNb25pdG9yaW5nTWF4TWVtb3J5VXRpbGl6YXRpb25NZXRyaWM/OiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBlbmhhbmNlZE1vbml0b3JpbmdQOTBNZW1vcnlVdGlsaXphdGlvbk1ldHJpYz86IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IGVuaGFuY2VkTW9uaXRvcmluZ0F2Z01lbW9yeVV0aWxpemF0aW9uTWV0cmljPzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgZW5oYW5jZWRNb25pdG9yaW5nTWF4SW5pdER1cmF0aW9uTWV0cmljPzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgZW5oYW5jZWRNb25pdG9yaW5nUDkwSW5pdER1cmF0aW9uTWV0cmljPzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgZW5oYW5jZWRNb25pdG9yaW5nQXZnSW5pdER1cmF0aW9uTWV0cmljPzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgZW5oYW5jZWRNZXRyaWNGdW5jdGlvbkNvc3RNZXRyaWM/OiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBNb25pdG9yaW5nU2NvcGUsIHByb3BzOiBMYW1iZGFGdW5jdGlvbk1vbml0b3JpbmdQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBwcm9wcyk7XG5cbiAgICB0aGlzLm5hbWluZ1N0cmF0ZWd5ID0gbmV3IE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIG5hbWVkQ29uc3RydWN0OiBwcm9wcy5sYW1iZGFGdW5jdGlvbixcbiAgICAgIGZhbGxiYWNrQ29uc3RydWN0TmFtZTogdGhpcy5yZXNvbHZlRnVuY3Rpb25OYW1lKHByb3BzLmxhbWJkYUZ1bmN0aW9uKSxcbiAgICB9KTtcblxuICAgIHRoaXMudGl0bGUgPSB0aGlzLm5hbWluZ1N0cmF0ZWd5LnJlc29sdmVIdW1hblJlYWRhYmxlTmFtZSgpO1xuICAgIHRoaXMuZnVuY3Rpb25VcmwgPSBzY29wZVxuICAgICAgLmNyZWF0ZUF3c0NvbnNvbGVVcmxGYWN0b3J5KClcbiAgICAgIC5nZXRMYW1iZGFGdW5jdGlvblVybChwcm9wcy5sYW1iZGFGdW5jdGlvbi5mdW5jdGlvbk5hbWUpO1xuXG4gICAgdGhpcy5hbGFybUZhY3RvcnkgPSB0aGlzLmNyZWF0ZUFsYXJtRmFjdG9yeShcbiAgICAgIHRoaXMubmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUFsYXJtRnJpZW5kbHlOYW1lKCksXG4gICAgKTtcbiAgICB0aGlzLmVycm9yQWxhcm1GYWN0b3J5ID0gbmV3IEVycm9yQWxhcm1GYWN0b3J5KHRoaXMuYWxhcm1GYWN0b3J5KTtcbiAgICB0aGlzLmxhdGVuY3lBbGFybUZhY3RvcnkgPSBuZXcgTGF0ZW5jeUFsYXJtRmFjdG9yeSh0aGlzLmFsYXJtRmFjdG9yeSk7XG4gICAgdGhpcy50cHNBbGFybUZhY3RvcnkgPSBuZXcgVHBzQWxhcm1GYWN0b3J5KHRoaXMuYWxhcm1GYWN0b3J5KTtcbiAgICB0aGlzLnRhc2tIZWFsdGhBbGFybUZhY3RvcnkgPSBuZXcgVGFza0hlYWx0aEFsYXJtRmFjdG9yeSh0aGlzLmFsYXJtRmFjdG9yeSk7XG4gICAgdGhpcy5hZ2VBbGFybUZhY3RvcnkgPSBuZXcgQWdlQWxhcm1GYWN0b3J5KHRoaXMuYWxhcm1GYWN0b3J5KTtcbiAgICB0aGlzLnVzYWdlQWxhcm1GYWN0b3J5ID0gbmV3IFVzYWdlQWxhcm1GYWN0b3J5KHRoaXMuYWxhcm1GYWN0b3J5KTtcblxuICAgIHRoaXMubGF0ZW5jeUFubm90YXRpb25zID0gW107XG4gICAgdGhpcy5lcnJvckNvdW50QW5ub3RhdGlvbnMgPSBbXTtcbiAgICB0aGlzLmVycm9yUmF0ZUFubm90YXRpb25zID0gW107XG4gICAgdGhpcy5pbnZvY2F0aW9uQ291bnRBbm5vdGF0aW9ucyA9IFtdO1xuICAgIHRoaXMuaW52b2NhdGlvblJhdGVBbm5vdGF0aW9ucyA9IFtdO1xuICAgIHRoaXMudHBzQW5ub3RhdGlvbnMgPSBbXTtcbiAgICB0aGlzLmNwdVRvdGFsVGltZUFubm90YXRpb25zID0gW107XG4gICAgdGhpcy5tZW1vcnlVc2FnZUFubm90YXRpb25zID0gW107XG4gICAgdGhpcy5tYXhJdGVyYXRvckFnZUFubm90YXRpb25zID0gW107XG4gICAgdGhpcy5tYXhPZmZzZXRMYWdBbm5vdGF0aW9ucyA9IFtdO1xuICAgIHRoaXMuaW5pdER1cmF0aW9uQW5ub3RhdGlvbnMgPSBbXTtcblxuICAgIHRoaXMubWV0cmljRmFjdG9yeSA9IG5ldyBMYW1iZGFGdW5jdGlvbk1ldHJpY0ZhY3RvcnkoXG4gICAgICBzY29wZS5jcmVhdGVNZXRyaWNGYWN0b3J5KCksXG4gICAgICBwcm9wcyxcbiAgICApO1xuICAgIHRoaXMudHBzTWV0cmljID0gdGhpcy5tZXRyaWNGYWN0b3J5Lm1ldHJpY0ludm9jYXRpb25SYXRlKFxuICAgICAgUmF0ZUNvbXB1dGF0aW9uTWV0aG9kLlBFUl9TRUNPTkQsXG4gICAgKTtcbiAgICB0aGlzLnA1MExhdGVuY3lNZXRyaWMgPSB0aGlzLm1ldHJpY0ZhY3RvcnkubWV0cmljTGF0ZW5jeUluTWlsbGlzKFxuICAgICAgTGF0ZW5jeVR5cGUuUDUwLFxuICAgICk7XG4gICAgdGhpcy5wOTBMYXRlbmN5TWV0cmljID0gdGhpcy5tZXRyaWNGYWN0b3J5Lm1ldHJpY0xhdGVuY3lJbk1pbGxpcyhcbiAgICAgIExhdGVuY3lUeXBlLlA5MCxcbiAgICApO1xuICAgIHRoaXMucDk5TGF0ZW5jeU1ldHJpYyA9IHRoaXMubWV0cmljRmFjdG9yeS5tZXRyaWNMYXRlbmN5SW5NaWxsaXMoXG4gICAgICBMYXRlbmN5VHlwZS5QOTksXG4gICAgKTtcbiAgICB0aGlzLm1heExhdGVuY3lNZXRyaWMgPSB0aGlzLm1ldHJpY0ZhY3RvcnkubWV0cmljTGF0ZW5jeUluTWlsbGlzKFxuICAgICAgTGF0ZW5jeVR5cGUuTUFYLFxuICAgICk7XG4gICAgdGhpcy5mYXVsdENvdW50TWV0cmljID0gdGhpcy5tZXRyaWNGYWN0b3J5Lm1ldHJpY0ZhdWx0Q291bnQoKTtcbiAgICB0aGlzLmZhdWx0UmF0ZU1ldHJpYyA9IHRoaXMubWV0cmljRmFjdG9yeS5tZXRyaWNGYXVsdFJhdGUoKTtcbiAgICB0aGlzLmludm9jYXRpb25Db3VudE1ldHJpYyA9IHRoaXMubWV0cmljRmFjdG9yeS5tZXRyaWNJbnZvY2F0aW9uQ291bnQoKTtcbiAgICB0aGlzLnRocm90dGxlc0NvdW50TWV0cmljID0gdGhpcy5tZXRyaWNGYWN0b3J5Lm1ldHJpY1Rocm90dGxlc0NvdW50KCk7XG4gICAgdGhpcy50aHJvdHRsZXNSYXRlTWV0cmljID0gdGhpcy5tZXRyaWNGYWN0b3J5Lm1ldHJpY1Rocm90dGxlc1JhdGUoKTtcbiAgICB0aGlzLmNvbmN1cnJlbnRFeGVjdXRpb25zQ291bnRNZXRyaWMgPVxuICAgICAgdGhpcy5tZXRyaWNGYWN0b3J5Lm1ldHJpY0NvbmN1cnJlbnRFeGVjdXRpb25zKCk7XG4gICAgdGhpcy5wcm92aXNpb25lZENvbmN1cnJlbmN5U3BpbGxvdmVySW52b2NhdGlvbnNDb3VudE1ldHJpYyA9XG4gICAgICB0aGlzLm1ldHJpY0ZhY3RvcnkubWV0cmljUHJvdmlzaW9uZWRDb25jdXJyZW5jeVNwaWxsb3Zlckludm9jYXRpb25zKCk7XG4gICAgdGhpcy5wcm92aXNpb25lZENvbmN1cnJlbmN5U3BpbGxvdmVySW52b2NhdGlvbnNSYXRlTWV0cmljID1cbiAgICAgIHRoaXMubWV0cmljRmFjdG9yeS5tZXRyaWNQcm92aXNpb25lZENvbmN1cnJlbmN5U3BpbGxvdmVyUmF0ZSgpO1xuXG4gICAgdGhpcy5pc0l0ZXJhdG9yID0gcHJvcHMuaXNJdGVyYXRvciA/PyB0cnVlO1xuICAgIHRoaXMubWF4SXRlcmF0b3JBZ2VNZXRyaWMgPVxuICAgICAgdGhpcy5tZXRyaWNGYWN0b3J5Lm1ldHJpY01heEl0ZXJhdG9yQWdlSW5NaWxsaXMoKTtcbiAgICB0aGlzLmlzT2Zmc2V0TGFnID0gcHJvcHMuaXNPZmZzZXRMYWcgPz8gZmFsc2U7XG4gICAgdGhpcy5tYXhPZmZzZXRMYWdNZXRyaWMgPVxuICAgICAgdGhpcy5tZXRyaWNGYWN0b3J5Lm1ldHJpY01heE9mZnNldExhZ0luTnVtYmVyT2ZSZWNvcmRzKCk7XG5cbiAgICB0aGlzLmxhbWJkYUluc2lnaHRzRW5hYmxlZCA9IHByb3BzLmxhbWJkYUluc2lnaHRzRW5hYmxlZCA/PyBmYWxzZTtcbiAgICBpZiAocHJvcHMubGFtYmRhSW5zaWdodHNFbmFibGVkKSB7XG4gICAgICB0aGlzLmVuaGFuY2VkTWV0cmljRmFjdG9yeSA9IG5ldyBMYW1iZGFGdW5jdGlvbkVuaGFuY2VkTWV0cmljRmFjdG9yeShcbiAgICAgICAgc2NvcGUuY3JlYXRlTWV0cmljRmFjdG9yeSgpLFxuICAgICAgICBwcm9wcyxcbiAgICAgICk7XG4gICAgICB0aGlzLmVuaGFuY2VkTW9uaXRvcmluZ01heENwdVRvdGFsVGltZU1ldHJpYyA9XG4gICAgICAgIHRoaXMuZW5oYW5jZWRNZXRyaWNGYWN0b3J5LmVuaGFuY2VkTWV0cmljTWF4Q3B1VG90YWxUaW1lKCk7XG4gICAgICB0aGlzLmVuaGFuY2VkTW9uaXRvcmluZ1A5MENwdVRvdGFsVGltZU1ldHJpYyA9XG4gICAgICAgIHRoaXMuZW5oYW5jZWRNZXRyaWNGYWN0b3J5LmVuaGFuY2VkTWV0cmljUDkwQ3B1VG90YWxUaW1lKCk7XG4gICAgICB0aGlzLmVuaGFuY2VkTW9uaXRvcmluZ0F2Z0NwdVRvdGFsVGltZU1ldHJpYyA9XG4gICAgICAgIHRoaXMuZW5oYW5jZWRNZXRyaWNGYWN0b3J5LmVuaGFuY2VkTWV0cmljQXZnQ3B1VG90YWxUaW1lKCk7XG4gICAgICB0aGlzLmVuaGFuY2VkTW9uaXRvcmluZ01heE1lbW9yeVV0aWxpemF0aW9uTWV0cmljID1cbiAgICAgICAgdGhpcy5lbmhhbmNlZE1ldHJpY0ZhY3RvcnkuZW5oYW5jZWRNZXRyaWNNYXhNZW1vcnlVdGlsaXphdGlvbigpO1xuICAgICAgdGhpcy5lbmhhbmNlZE1vbml0b3JpbmdQOTBNZW1vcnlVdGlsaXphdGlvbk1ldHJpYyA9XG4gICAgICAgIHRoaXMuZW5oYW5jZWRNZXRyaWNGYWN0b3J5LmVuaGFuY2VkTWV0cmljUDkwTWVtb3J5VXRpbGl6YXRpb24oKTtcbiAgICAgIHRoaXMuZW5oYW5jZWRNb25pdG9yaW5nQXZnTWVtb3J5VXRpbGl6YXRpb25NZXRyaWMgPVxuICAgICAgICB0aGlzLmVuaGFuY2VkTWV0cmljRmFjdG9yeS5lbmhhbmNlZE1ldHJpY0F2Z01lbW9yeVV0aWxpemF0aW9uKCk7XG4gICAgICB0aGlzLmVuaGFuY2VkTW9uaXRvcmluZ01heEluaXREdXJhdGlvbk1ldHJpYyA9XG4gICAgICAgIHRoaXMuZW5oYW5jZWRNZXRyaWNGYWN0b3J5LmVuaGFuY2VkTWV0cmljTWF4SW5pdER1cmF0aW9uKCk7XG4gICAgICB0aGlzLmVuaGFuY2VkTW9uaXRvcmluZ1A5MEluaXREdXJhdGlvbk1ldHJpYyA9XG4gICAgICAgIHRoaXMuZW5oYW5jZWRNZXRyaWNGYWN0b3J5LmVuaGFuY2VkTWV0cmljUDkwSW5pdER1cmF0aW9uKCk7XG4gICAgICB0aGlzLmVuaGFuY2VkTW9uaXRvcmluZ0F2Z0luaXREdXJhdGlvbk1ldHJpYyA9XG4gICAgICAgIHRoaXMuZW5oYW5jZWRNZXRyaWNGYWN0b3J5LmVuaGFuY2VkTWV0cmljQXZnSW5pdER1cmF0aW9uKCk7XG4gICAgICB0aGlzLmVuaGFuY2VkTWV0cmljRnVuY3Rpb25Db3N0TWV0cmljID1cbiAgICAgICAgdGhpcy5lbmhhbmNlZE1ldHJpY0ZhY3RvcnkuZW5oYW5jZWRNZXRyaWNGdW5jdGlvbkNvc3QoKTtcblxuICAgICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZEVuaGFuY2VkTW9uaXRvcmluZ01heENwdVRvdGFsVGltZUFsYXJtKSB7XG4gICAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPVxuICAgICAgICAgIHByb3BzLmFkZEVuaGFuY2VkTW9uaXRvcmluZ01heENwdVRvdGFsVGltZUFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmxhdGVuY3lBbGFybUZhY3RvcnkuYWRkRHVyYXRpb25BbGFybShcbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uICovXG4gICAgICAgICAgdGhpcy5lbmhhbmNlZE1vbml0b3JpbmdNYXhDcHVUb3RhbFRpbWVNZXRyaWMhLFxuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvbiAqL1xuICAgICAgICAgIExhdGVuY3lUeXBlLlAxMDAsXG4gICAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNwdVRvdGFsVGltZUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkRW5oYW5jZWRNb25pdG9yaW5nUDkwQ3B1VG90YWxUaW1lQWxhcm0pIHtcbiAgICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9XG4gICAgICAgICAgcHJvcHMuYWRkRW5oYW5jZWRNb25pdG9yaW5nUDkwQ3B1VG90YWxUaW1lQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMubGF0ZW5jeUFsYXJtRmFjdG9yeS5hZGREdXJhdGlvbkFsYXJtKFxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb24gKi9cbiAgICAgICAgICB0aGlzLmVuaGFuY2VkTW9uaXRvcmluZ1A5MENwdVRvdGFsVGltZU1ldHJpYyEsXG4gICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uICovXG4gICAgICAgICAgTGF0ZW5jeVR5cGUuUDkwLFxuICAgICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jcHVUb3RhbFRpbWVBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZEVuaGFuY2VkTW9uaXRvcmluZ0F2Z0NwdVRvdGFsVGltZUFsYXJtKSB7XG4gICAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPVxuICAgICAgICAgIHByb3BzLmFkZEVuaGFuY2VkTW9uaXRvcmluZ0F2Z0NwdVRvdGFsVGltZUFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmxhdGVuY3lBbGFybUZhY3RvcnkuYWRkRHVyYXRpb25BbGFybShcbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uICovXG4gICAgICAgICAgdGhpcy5lbmhhbmNlZE1vbml0b3JpbmdBdmdDcHVUb3RhbFRpbWVNZXRyaWMhLFxuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvbiAqL1xuICAgICAgICAgIExhdGVuY3lUeXBlLkFWRVJBR0UsXG4gICAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNwdVRvdGFsVGltZUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkRW5oYW5jZWRNb25pdG9yaW5nTWF4TWVtb3J5VXRpbGl6YXRpb25BbGFybSkge1xuICAgICAgICBjb25zdCBhbGFybVByb3BzID1cbiAgICAgICAgICBwcm9wcy5hZGRFbmhhbmNlZE1vbml0b3JpbmdNYXhNZW1vcnlVdGlsaXphdGlvbkFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPVxuICAgICAgICAgIHRoaXMudXNhZ2VBbGFybUZhY3RvcnkuYWRkTWF4TWVtb3J5VXNhZ2VQZXJjZW50QWxhcm0oXG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uICovXG4gICAgICAgICAgICB0aGlzLmVuaGFuY2VkTW9uaXRvcmluZ01heE1lbW9yeVV0aWxpemF0aW9uTWV0cmljISxcbiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvbiAqL1xuICAgICAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgdGhpcy5tZW1vcnlVc2FnZUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkRW5oYW5jZWRNb25pdG9yaW5nUDkwTWVtb3J5VXRpbGl6YXRpb25BbGFybSkge1xuICAgICAgICBjb25zdCBhbGFybVByb3BzID1cbiAgICAgICAgICBwcm9wcy5hZGRFbmhhbmNlZE1vbml0b3JpbmdQOTBNZW1vcnlVdGlsaXphdGlvbkFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLnVzYWdlQWxhcm1GYWN0b3J5LmFkZE1lbW9yeVVzYWdlUGVyY2VudEFsYXJtKFxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb24gKi9cbiAgICAgICAgICB0aGlzLmVuaGFuY2VkTW9uaXRvcmluZ1A5ME1lbW9yeVV0aWxpemF0aW9uTWV0cmljISxcbiAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb24gKi9cbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIFVzYWdlVHlwZS5QOTAsXG4gICAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5tZW1vcnlVc2FnZUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkRW5oYW5jZWRNb25pdG9yaW5nQXZnTWVtb3J5VXRpbGl6YXRpb25BbGFybSkge1xuICAgICAgICBjb25zdCBhbGFybVByb3BzID1cbiAgICAgICAgICBwcm9wcy5hZGRFbmhhbmNlZE1vbml0b3JpbmdBdmdNZW1vcnlVdGlsaXphdGlvbkFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLnVzYWdlQWxhcm1GYWN0b3J5LmFkZE1lbW9yeVVzYWdlUGVyY2VudEFsYXJtKFxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb24gKi9cbiAgICAgICAgICB0aGlzLmVuaGFuY2VkTW9uaXRvcmluZ0F2Z01lbW9yeVV0aWxpemF0aW9uTWV0cmljISxcbiAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb24gKi9cbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIFVzYWdlVHlwZS5BVkVSQUdFLFxuICAgICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWVtb3J5VXNhZ2VBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZEVuaGFuY2VkTW9uaXRvcmluZ01heEluaXREdXJhdGlvbkFsYXJtKSB7XG4gICAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPVxuICAgICAgICAgIHByb3BzLmFkZEVuaGFuY2VkTW9uaXRvcmluZ01heEluaXREdXJhdGlvbkFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmxhdGVuY3lBbGFybUZhY3RvcnkuYWRkQ3VzdG9tRHVyYXRpb25BbGFybShcbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uICovXG4gICAgICAgICAgdGhpcy5lbmhhbmNlZE1vbml0b3JpbmdNYXhJbml0RHVyYXRpb25NZXRyaWMhLFxuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvbiAqL1xuICAgICAgICAgIExhdGVuY3lUeXBlLk1BWCxcbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIFwiSW5pdER1cmF0aW9uXCIsXG4gICAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pbml0RHVyYXRpb25Bbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZEVuaGFuY2VkTW9uaXRvcmluZ1A5MEluaXREdXJhdGlvbkFsYXJtKSB7XG4gICAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPVxuICAgICAgICAgIHByb3BzLmFkZEVuaGFuY2VkTW9uaXRvcmluZ1A5MEluaXREdXJhdGlvbkFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmxhdGVuY3lBbGFybUZhY3RvcnkuYWRkQ3VzdG9tRHVyYXRpb25BbGFybShcbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uICovXG4gICAgICAgICAgdGhpcy5lbmhhbmNlZE1vbml0b3JpbmdQOTBJbml0RHVyYXRpb25NZXRyaWMhLFxuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvbiAqL1xuICAgICAgICAgIExhdGVuY3lUeXBlLlA5MCxcbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIFwiSW5pdER1cmF0aW9uXCIsXG4gICAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pbml0RHVyYXRpb25Bbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZEVuaGFuY2VkTW9uaXRvcmluZ0F2Z0luaXREdXJhdGlvbkFsYXJtKSB7XG4gICAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPVxuICAgICAgICAgIHByb3BzLmFkZEVuaGFuY2VkTW9uaXRvcmluZ0F2Z0luaXREdXJhdGlvbkFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmxhdGVuY3lBbGFybUZhY3RvcnkuYWRkQ3VzdG9tRHVyYXRpb25BbGFybShcbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uICovXG4gICAgICAgICAgdGhpcy5lbmhhbmNlZE1vbml0b3JpbmdBdmdJbml0RHVyYXRpb25NZXRyaWMhLFxuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvbiAqL1xuICAgICAgICAgIExhdGVuY3lUeXBlLkFWRVJBR0UsXG4gICAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgICBcIkluaXREdXJhdGlvblwiLFxuICAgICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaW5pdER1cmF0aW9uQW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZExhdGVuY3lQNTBBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZExhdGVuY3lQNTBBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMubGF0ZW5jeUFsYXJtRmFjdG9yeS5hZGRMYXRlbmN5QWxhcm0oXG4gICAgICAgIHRoaXMucDUwTGF0ZW5jeU1ldHJpYyxcbiAgICAgICAgTGF0ZW5jeVR5cGUuUDUwLFxuICAgICAgICB0aGlzLmNvbnZlcnRUb0xhdGVuY3lUaHJlc2hvbGQoYWxhcm1Qcm9wcywgcHJvcHMubGFtYmRhRnVuY3Rpb24pLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMubGF0ZW5jeUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkTGF0ZW5jeVA5MEFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkTGF0ZW5jeVA5MEFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy5sYXRlbmN5QWxhcm1GYWN0b3J5LmFkZExhdGVuY3lBbGFybShcbiAgICAgICAgdGhpcy5wOTBMYXRlbmN5TWV0cmljLFxuICAgICAgICBMYXRlbmN5VHlwZS5QOTAsXG4gICAgICAgIHRoaXMuY29udmVydFRvTGF0ZW5jeVRocmVzaG9sZChhbGFybVByb3BzLCBwcm9wcy5sYW1iZGFGdW5jdGlvbiksXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy5sYXRlbmN5QW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRMYXRlbmN5UDk5QWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRMYXRlbmN5UDk5QWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmxhdGVuY3lBbGFybUZhY3RvcnkuYWRkTGF0ZW5jeUFsYXJtKFxuICAgICAgICB0aGlzLnA5OUxhdGVuY3lNZXRyaWMsXG4gICAgICAgIExhdGVuY3lUeXBlLlA5OSxcbiAgICAgICAgdGhpcy5jb252ZXJ0VG9MYXRlbmN5VGhyZXNob2xkKGFsYXJtUHJvcHMsIHByb3BzLmxhbWJkYUZ1bmN0aW9uKSxcbiAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICk7XG4gICAgICB0aGlzLmxhdGVuY3lBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZE1heExhdGVuY3lBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZE1heExhdGVuY3lBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMubGF0ZW5jeUFsYXJtRmFjdG9yeS5hZGRMYXRlbmN5QWxhcm0oXG4gICAgICAgIHRoaXMubWF4TGF0ZW5jeU1ldHJpYyxcbiAgICAgICAgTGF0ZW5jeVR5cGUuTUFYLFxuICAgICAgICB0aGlzLmNvbnZlcnRUb0xhdGVuY3lUaHJlc2hvbGQoYWxhcm1Qcm9wcywgcHJvcHMubGFtYmRhRnVuY3Rpb24pLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMubGF0ZW5jeUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRGYXVsdENvdW50QWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRGYXVsdENvdW50QWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmVycm9yQWxhcm1GYWN0b3J5LmFkZEVycm9yQ291bnRBbGFybShcbiAgICAgICAgdGhpcy5mYXVsdENvdW50TWV0cmljLFxuICAgICAgICBFcnJvclR5cGUuRkFVTFQsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy5lcnJvckNvdW50QW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRGYXVsdFJhdGVBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZEZhdWx0UmF0ZUFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy5lcnJvckFsYXJtRmFjdG9yeS5hZGRFcnJvclJhdGVBbGFybShcbiAgICAgICAgdGhpcy5mYXVsdFJhdGVNZXRyaWMsXG4gICAgICAgIEVycm9yVHlwZS5GQVVMVCxcbiAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICk7XG4gICAgICB0aGlzLmVycm9yUmF0ZUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkTG93VHBzQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRMb3dUcHNBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMudHBzQWxhcm1GYWN0b3J5LmFkZE1pblRwc0FsYXJtKFxuICAgICAgICB0aGlzLnRwc01ldHJpYyxcbiAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICk7XG4gICAgICB0aGlzLnRwc0Fubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkSGlnaFRwc0FsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkSGlnaFRwc0FsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy50cHNBbGFybUZhY3RvcnkuYWRkTWF4VHBzQWxhcm0oXG4gICAgICAgIHRoaXMudHBzTWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMudHBzQW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRUaHJvdHRsZXNDb3VudEFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkVGhyb3R0bGVzQ291bnRBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMuZXJyb3JBbGFybUZhY3RvcnkuYWRkRXJyb3JDb3VudEFsYXJtKFxuICAgICAgICB0aGlzLnRocm90dGxlc0NvdW50TWV0cmljLFxuICAgICAgICBFcnJvclR5cGUuVEhST1RUTEVELFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMuaW52b2NhdGlvbkNvdW50QW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRUaHJvdHRsZXNSYXRlQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRUaHJvdHRsZXNSYXRlQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmVycm9yQWxhcm1GYWN0b3J5LmFkZEVycm9yUmF0ZUFsYXJtKFxuICAgICAgICB0aGlzLnRocm90dGxlc1JhdGVNZXRyaWMsXG4gICAgICAgIEVycm9yVHlwZS5USFJPVFRMRUQsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy5pbnZvY2F0aW9uUmF0ZUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkTWluSW52b2NhdGlvbnNDb3VudEFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkTWluSW52b2NhdGlvbnNDb3VudEFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy51c2FnZUFsYXJtRmFjdG9yeS5hZGRNaW5Vc2FnZUNvdW50QWxhcm0oXG4gICAgICAgIHRoaXMuaW52b2NhdGlvbkNvdW50TWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMuaW52b2NhdGlvbkNvdW50QW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRDb25jdXJyZW50RXhlY3V0aW9uc0NvdW50QWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRDb25jdXJyZW50RXhlY3V0aW9uc0NvdW50QWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLnRhc2tIZWFsdGhBbGFybUZhY3RvcnkuYWRkUnVubmluZ1Rhc2tDb3VudEFsYXJtKFxuICAgICAgICB0aGlzLmNvbmN1cnJlbnRFeGVjdXRpb25zQ291bnRNZXRyaWMsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy5pbnZvY2F0aW9uQ291bnRBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZFByb3Zpc2lvbmVkQ29uY3VycmVuY3lTcGlsbG92ZXJJbnZvY2F0aW9uc0NvdW50QWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPVxuICAgICAgICBwcm9wcy5hZGRQcm92aXNpb25lZENvbmN1cnJlbmN5U3BpbGxvdmVySW52b2NhdGlvbnNDb3VudEFsYXJtW1xuICAgICAgICAgIGRpc2FtYmlndWF0b3JcbiAgICAgICAgXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMudGFza0hlYWx0aEFsYXJtRmFjdG9yeS5hZGRSdW5uaW5nVGFza0NvdW50QWxhcm0oXG4gICAgICAgIHRoaXMucHJvdmlzaW9uZWRDb25jdXJyZW5jeVNwaWxsb3Zlckludm9jYXRpb25zQ291bnRNZXRyaWMsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy5pbnZvY2F0aW9uQ291bnRBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZFByb3Zpc2lvbmVkQ29uY3VycmVuY3lTcGlsbG92ZXJJbnZvY2F0aW9uc1JhdGVBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9XG4gICAgICAgIHByb3BzLmFkZFByb3Zpc2lvbmVkQ29uY3VycmVuY3lTcGlsbG92ZXJJbnZvY2F0aW9uc1JhdGVBbGFybVtcbiAgICAgICAgICBkaXNhbWJpZ3VhdG9yXG4gICAgICAgIF07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLnRhc2tIZWFsdGhBbGFybUZhY3RvcnkuYWRkUnVubmluZ1Rhc2tSYXRlQWxhcm0oXG4gICAgICAgIHRoaXMucHJvdmlzaW9uZWRDb25jdXJyZW5jeVNwaWxsb3Zlckludm9jYXRpb25zUmF0ZU1ldHJpYyxcbiAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICk7XG4gICAgICB0aGlzLmludm9jYXRpb25SYXRlQW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRNYXhJdGVyYXRvckFnZUFsYXJtKSB7XG4gICAgICBpZiAoIXRoaXMuaXNJdGVyYXRvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJhZGRNYXhJdGVyYXRvckFnZUFsYXJtIGlzIG5vdCBhcHBsaWNhYmxlIGlmIGlzSXRlcmF0b3IgaXMgbm90IHRydWVcIixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZE1heEl0ZXJhdG9yQWdlQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmFnZUFsYXJtRmFjdG9yeS5hZGRJdGVyYXRvck1heEFnZUFsYXJtKFxuICAgICAgICB0aGlzLm1heEl0ZXJhdG9yQWdlTWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMubWF4SXRlcmF0b3JBZ2VBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZE1heE9mZnNldExhZ0FsYXJtKSB7XG4gICAgICBpZiAoIXRoaXMuaXNPZmZzZXRMYWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiYWRkTWF4T2Zmc2V0TGFnQWxhcm0gaXMgbm90IGFwcGxpY2FibGUgaWYgaXNPZmZzZXRMYWcgaXMgbm90IHRydWVcIixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZE1heE9mZnNldExhZ0FsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy5hZ2VBbGFybUZhY3RvcnkuYWRkTWF4T2Zmc2V0TGFnQWxhcm0oXG4gICAgICAgIHRoaXMubWF4T2Zmc2V0TGFnTWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMubWF4T2Zmc2V0TGFnQW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuXG4gICAgcHJvcHMudXNlQ3JlYXRlZEFsYXJtcz8uY29uc3VtZSh0aGlzLmNyZWF0ZWRBbGFybXMoKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRUb0xhdGVuY3lUaHJlc2hvbGQoXG4gICAgbGF0ZW5jeVByb3BzOiBMYXRlbmN5VGhyZXNob2xkIHwgTGF0ZW5jeVRpbWVvdXRQZXJjZW50YWdlVGhyZXNob2xkLFxuICAgIGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24sXG4gICk6IExhdGVuY3lUaHJlc2hvbGQge1xuICAgIGlmIChcIm1heExhdGVuY3lcIiBpbiBsYXRlbmN5UHJvcHMpIHtcbiAgICAgIHJldHVybiBsYXRlbmN5UHJvcHM7XG4gICAgfVxuICAgIGNvbnN0IHsgbWF4TGF0ZW5jeVBlcmNlbnRhZ2VPZlRpbWVvdXQsIC4uLnJlc3QgfSA9IGxhdGVuY3lQcm9wcztcbiAgICBjb25zdCB0aW1lb3V0ID0gKGxhbWJkYUZ1bmN0aW9uIGFzIEZ1bmN0aW9uKS50aW1lb3V0ID8/IER1cmF0aW9uLnNlY29uZHMoMyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc3QsXG4gICAgICBtYXhMYXRlbmN5OiBEdXJhdGlvbi5taWxsaXMoXG4gICAgICAgIE1hdGguZmxvb3IoXG4gICAgICAgICAgKHRpbWVvdXQudG9NaWxsaXNlY29uZHMoKSAqIG1heExhdGVuY3lQZXJjZW50YWdlT2ZUaW1lb3V0KSAvIDEwMCxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfTtcbiAgfVxuXG4gIHN1bW1hcnlXaWRnZXRzKCk6IElXaWRnZXRbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuY3JlYXRlVGl0bGVXaWRnZXQoKSxcbiAgICAgIHRoaXMuY3JlYXRlVHBzV2lkZ2V0KFRoaXJkV2lkdGgsIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0KSxcbiAgICAgIHRoaXMuY3JlYXRlTGF0ZW5jeVdpZGdldChUaGlyZFdpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgICB0aGlzLmNyZWF0ZUVycm9yUmF0ZVdpZGdldChUaGlyZFdpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgXTtcbiAgfVxuXG4gIHdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICBjb25zdCB3aWRnZXRzID0gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgbmV3IFJvdyhcbiAgICAgICAgdGhpcy5jcmVhdGVUcHNXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgICB0aGlzLmNyZWF0ZUxhdGVuY3lXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgICB0aGlzLmNyZWF0ZUVycm9yUmF0ZVdpZGdldChRdWFydGVyV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICAgIHRoaXMuY3JlYXRlUmF0ZVdpZGdldChRdWFydGVyV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICApLFxuICAgIF07XG5cbiAgICBsZXQgc2Vjb25kUm93V2lkZ2V0V2lkdGg6IG51bWJlcjtcbiAgICBpZiAodGhpcy5pc0l0ZXJhdG9yICYmIHRoaXMuaXNPZmZzZXRMYWcpIHtcbiAgICAgIHNlY29uZFJvd1dpZGdldFdpZHRoID0gUXVhcnRlcldpZHRoO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0l0ZXJhdG9yIHx8IHRoaXMuaXNPZmZzZXRMYWcpIHtcbiAgICAgIHNlY29uZFJvd1dpZGdldFdpZHRoID0gVGhpcmRXaWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgc2Vjb25kUm93V2lkZ2V0V2lkdGggPSBIYWxmV2lkdGg7XG4gICAgfVxuICAgIGNvbnN0IHNlY29uZFJvdzogUm93ID0gbmV3IFJvdyhcbiAgICAgIHRoaXMuY3JlYXRlSW52b2NhdGlvbldpZGdldChcbiAgICAgICAgc2Vjb25kUm93V2lkZ2V0V2lkdGgsXG4gICAgICAgIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCxcbiAgICAgICksXG4gICAgICB0aGlzLmNyZWF0ZUVycm9yQ291bnRXaWRnZXQoXG4gICAgICAgIHNlY29uZFJvd1dpZGdldFdpZHRoLFxuICAgICAgICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gICAgICApLFxuICAgICk7XG4gICAgaWYgKHRoaXMuaXNJdGVyYXRvcikge1xuICAgICAgc2Vjb25kUm93LmFkZFdpZGdldChcbiAgICAgICAgdGhpcy5jcmVhdGVJdGVyYXRvckFnZVdpZGdldChcbiAgICAgICAgICBzZWNvbmRSb3dXaWRnZXRXaWR0aCxcbiAgICAgICAgICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc09mZnNldExhZykge1xuICAgICAgc2Vjb25kUm93LmFkZFdpZGdldChcbiAgICAgICAgdGhpcy5jcmVhdGVPZmZzZXRMYWdXaWRnZXQoXG4gICAgICAgICAgc2Vjb25kUm93V2lkZ2V0V2lkdGgsXG4gICAgICAgICAgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gICAgd2lkZ2V0cy5wdXNoKHNlY29uZFJvdyk7XG5cbiAgICBpZiAodGhpcy5sYW1iZGFJbnNpZ2h0c0VuYWJsZWQpIHtcbiAgICAgIHdpZGdldHMucHVzaChcbiAgICAgICAgbmV3IFJvdyhcbiAgICAgICAgICB0aGlzLmNyZWF0ZUxhbWJkYUluc2lnaHRzQ3B1V2lkZ2V0KFxuICAgICAgICAgICAgUXVhcnRlcldpZHRoLFxuICAgICAgICAgICAgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0LFxuICAgICAgICAgICksXG4gICAgICAgICAgdGhpcy5jcmVhdGVMYW1iZGFJbnNpZ2h0c01lbW9yeVdpZGdldChcbiAgICAgICAgICAgIFF1YXJ0ZXJXaWR0aCxcbiAgICAgICAgICAgIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCxcbiAgICAgICAgICApLFxuICAgICAgICAgIHRoaXMuY3JlYXRlTGFtYmRhSW5zaWdodHNJbml0RHVyYXRpb25XaWRnZXQoXG4gICAgICAgICAgICBRdWFydGVyV2lkdGgsXG4gICAgICAgICAgICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0aGlzLmNyZWF0ZUxhbWJkYUluc2lnaHRzRnVuY3Rpb25Db3N0V2lkZ2V0KFxuICAgICAgICAgICAgUXVhcnRlcldpZHRoLFxuICAgICAgICAgICAgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0LFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB3aWRnZXRzO1xuICB9XG5cbiAgY3JlYXRlVGl0bGVXaWRnZXQoKSB7XG4gICAgcmV0dXJuIG5ldyBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0KHtcbiAgICAgIGZhbWlseTogXCJMYW1iZGEgRnVuY3Rpb25cIixcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZ29Ub0xpbmtVcmw6IHRoaXMuZnVuY3Rpb25VcmwsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVUcHNXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiVFBTXCIsXG4gICAgICBsZWZ0OiBbdGhpcy50cHNNZXRyaWNdLFxuICAgICAgbGVmdFlBeGlzOiBSYXRlQXhpc0Zyb21aZXJvLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLnRwc0Fubm90YXRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlTGF0ZW5jeVdpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJMYXRlbmN5XCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMucDUwTGF0ZW5jeU1ldHJpYyxcbiAgICAgICAgdGhpcy5wOTBMYXRlbmN5TWV0cmljLFxuICAgICAgICB0aGlzLnA5OUxhdGVuY3lNZXRyaWMsXG4gICAgICBdLFxuICAgICAgbGVmdFlBeGlzOiBUaW1lQXhpc01pbGxpc0Zyb21aZXJvLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLmxhdGVuY3lBbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUVycm9yQ291bnRXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiRXJyb3JzXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5mYXVsdENvdW50TWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgICBsZWZ0QW5ub3RhdGlvbnM6IHRoaXMuZXJyb3JDb3VudEFubm90YXRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlRXJyb3JSYXRlV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIkVycm9ycyAocmF0ZSlcIixcbiAgICAgIGxlZnQ6IFt0aGlzLmZhdWx0UmF0ZU1ldHJpY10sXG4gICAgICBsZWZ0WUF4aXM6IFJhdGVBeGlzRnJvbVplcm8sXG4gICAgICBsZWZ0QW5ub3RhdGlvbnM6IHRoaXMuZXJyb3JSYXRlQW5ub3RhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVSYXRlV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIlJhdGVzXCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMudGhyb3R0bGVzUmF0ZU1ldHJpYyxcbiAgICAgICAgdGhpcy5wcm92aXNpb25lZENvbmN1cnJlbmN5U3BpbGxvdmVySW52b2NhdGlvbnNSYXRlTWV0cmljLFxuICAgICAgXSxcbiAgICAgIGxlZnRZQXhpczogUmF0ZUF4aXNGcm9tWmVybyxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5pbnZvY2F0aW9uUmF0ZUFubm90YXRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlSW52b2NhdGlvbldpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJJbnZvY2F0aW9uc1wiLFxuICAgICAgbGVmdDogW1xuICAgICAgICB0aGlzLmludm9jYXRpb25Db3VudE1ldHJpYyxcbiAgICAgICAgdGhpcy50aHJvdHRsZXNDb3VudE1ldHJpYyxcbiAgICAgICAgdGhpcy5jb25jdXJyZW50RXhlY3V0aW9uc0NvdW50TWV0cmljLFxuICAgICAgICB0aGlzLnByb3Zpc2lvbmVkQ29uY3VycmVuY3lTcGlsbG92ZXJJbnZvY2F0aW9uc0NvdW50TWV0cmljLFxuICAgICAgXSxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgICBsZWZ0QW5ub3RhdGlvbnM6IHRoaXMuaW52b2NhdGlvbkNvdW50QW5ub3RhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVJdGVyYXRvckFnZVdpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJJdGVyYXRvclwiLFxuICAgICAgbGVmdDogW3RoaXMubWF4SXRlcmF0b3JBZ2VNZXRyaWNdLFxuICAgICAgbGVmdFlBeGlzOiBUaW1lQXhpc01pbGxpc0Zyb21aZXJvLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLm1heEl0ZXJhdG9yQWdlQW5ub3RhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVPZmZzZXRMYWdXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiT2Zmc2V0TGFnXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5tYXhPZmZzZXRMYWdNZXRyaWNdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5tYXhPZmZzZXRMYWdBbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUxhbWJkYUluc2lnaHRzQ3B1V2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIkNQVSBUb3RhbCBUaW1lXCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb24gKi9cbiAgICAgICAgdGhpcy5lbmhhbmNlZE1vbml0b3JpbmdNYXhDcHVUb3RhbFRpbWVNZXRyaWMhLFxuICAgICAgICB0aGlzLmVuaGFuY2VkTW9uaXRvcmluZ1A5MENwdVRvdGFsVGltZU1ldHJpYyEsXG4gICAgICAgIHRoaXMuZW5oYW5jZWRNb25pdG9yaW5nQXZnQ3B1VG90YWxUaW1lTWV0cmljISxcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uICovXG4gICAgICBdLFxuICAgICAgbGVmdFlBeGlzOiBUaW1lQXhpc01pbGxpc0Zyb21aZXJvLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLmNwdVRvdGFsVGltZUFubm90YXRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlTGFtYmRhSW5zaWdodHNNZW1vcnlXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiTWVtb3J5IFV0aWxpemF0aW9uXCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb24gKi9cbiAgICAgICAgdGhpcy5lbmhhbmNlZE1vbml0b3JpbmdNYXhNZW1vcnlVdGlsaXphdGlvbk1ldHJpYyEsXG4gICAgICAgIHRoaXMuZW5oYW5jZWRNb25pdG9yaW5nUDkwTWVtb3J5VXRpbGl6YXRpb25NZXRyaWMhLFxuICAgICAgICB0aGlzLmVuaGFuY2VkTW9uaXRvcmluZ0F2Z01lbW9yeVV0aWxpemF0aW9uTWV0cmljISxcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uICovXG4gICAgICBdLFxuICAgICAgbGVmdFlBeGlzOiBQZXJjZW50YWdlQXhpc0Zyb21aZXJvVG9IdW5kcmVkLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLm1lbW9yeVVzYWdlQW5ub3RhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVMYW1iZGFJbnNpZ2h0c0luaXREdXJhdGlvbldpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJJbml0IER1cmF0aW9uXCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb24gKi9cbiAgICAgICAgdGhpcy5lbmhhbmNlZE1vbml0b3JpbmdNYXhJbml0RHVyYXRpb25NZXRyaWMhLFxuICAgICAgICB0aGlzLmVuaGFuY2VkTW9uaXRvcmluZ1A5MEluaXREdXJhdGlvbk1ldHJpYyEsXG4gICAgICAgIHRoaXMuZW5oYW5jZWRNb25pdG9yaW5nQXZnSW5pdER1cmF0aW9uTWV0cmljISxcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uICovXG4gICAgICBdLFxuICAgICAgbGVmdFlBeGlzOiBUaW1lQXhpc01pbGxpc0Zyb21aZXJvLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLmluaXREdXJhdGlvbkFubm90YXRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlTGFtYmRhSW5zaWdodHNGdW5jdGlvbkNvc3RXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiRnVuY3Rpb24gQ29zdFwiLFxuICAgICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvbiAqL1xuICAgICAgbGVmdDogW3RoaXMuZW5oYW5jZWRNZXRyaWNGdW5jdGlvbkNvc3RNZXRyaWMhXSxcbiAgICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvbiAqL1xuICAgICAgbGVmdFlBeGlzOiBNZWdhYnl0ZU1pbGxpc2Vjb25kQXhpc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRnVuY3Rpb25OYW1lKGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIC8vIHRyeSB0byB0YWtlIHRoZSBuYW1lIChpZiBzcGVjaWZpZWQpIGluc3RlYWQgb2YgdG9rZW5cbiAgICByZXR1cm4gKGxhbWJkYUZ1bmN0aW9uLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmbkZ1bmN0aW9uKT8uZnVuY3Rpb25OYW1lO1xuICB9XG59XG4iXX0=