cdk-monitoring-constructs
Version:
[](https://gitpod.io/#https://github.com/cdklabs/cdk-monitoring-constructs) [](https://badge
227 lines • 52.2 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AlarmFactory = exports.CompositeAlarmOperator = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
const metric_1 = require("../metric");
const strings_1 = require("../strings");
const AlarmNamingStrategy_1 = require("./AlarmNamingStrategy");
const IAlarmAnnotationStrategy_1 = require("./IAlarmAnnotationStrategy");
const NoopAlarmActionStrategy_1 = require("./NoopAlarmActionStrategy");
const DefaultDatapointsToAlarm = 3;
var CompositeAlarmOperator;
(function (CompositeAlarmOperator) {
/**
* trigger only if all the alarms are triggered
*/
CompositeAlarmOperator[CompositeAlarmOperator["AND"] = 0] = "AND";
/**
* trigger if any of the alarms is triggered
*/
CompositeAlarmOperator[CompositeAlarmOperator["OR"] = 1] = "OR";
})(CompositeAlarmOperator = exports.CompositeAlarmOperator || (exports.CompositeAlarmOperator = {}));
class AlarmFactory {
constructor(alarmScope, props) {
this.alarmScope = alarmScope;
this.globalAlarmDefaults = props.globalAlarmDefaults;
this.globalMetricDefaults = props.globalMetricDefaults;
this.alarmNamingStrategy = new AlarmNamingStrategy_1.AlarmNamingStrategy(props.globalAlarmDefaults.alarmNamePrefix, props.localAlarmNamePrefix, props.globalAlarmDefaults.dedupeStringProcessor);
}
addAlarm(metric, props) {
// prepare the metric
let adjustedMetric = metric;
if (props.period) {
// Adjust metric period for the alarm
adjustedMetric = adjustedMetric.with({ period: props.period });
}
if (adjustedMetric.label) {
// Annotations do not support dynamic labels, so we have to remove them from metric name
adjustedMetric = adjustedMetric.with({
label: strings_1.removeBracketsWithDynamicLabels(adjustedMetric.label),
});
}
// prepare primary alarm properties
const actionsEnabled = this.determineActionsEnabled(props.actionsEnabled, props.disambiguator);
const action = props.actionOverride ?? this.globalAlarmDefaults.action ?? NoopAlarmActionStrategy_1.noopAction();
const alarmName = this.alarmNamingStrategy.getName(props);
const alarmNameSuffix = props.alarmNameSuffix;
const alarmLabel = this.alarmNamingStrategy.getWidgetLabel(props);
const alarmDescription = this.generateDescription(props.alarmDescription, props.alarmDescriptionOverride, props.runbookLink, props.documentationLink);
const dedupeString = this.alarmNamingStrategy.getDedupeString(props);
const evaluateLowSampleCountPercentile = props.evaluateLowSampleCountPercentile ?? true;
const datapointsToAlarm = props.datapointsToAlarm ??
this.globalAlarmDefaults.datapointsToAlarm ??
DefaultDatapointsToAlarm;
const evaluationPeriods = props.evaluationPeriods ??
this.globalAlarmDefaults.evaluationPeriods ??
datapointsToAlarm;
if (evaluationPeriods < datapointsToAlarm) {
throw new Error(`evaluationPeriods must be greater than or equal to datapointsToAlarm for ${alarmName}`);
}
// create primary alarm
const primaryAlarm = adjustedMetric.createAlarm(this.alarmScope, alarmName, {
alarmName,
alarmDescription,
threshold: props.threshold,
comparisonOperator: props.comparisonOperator,
treatMissingData: props.treatMissingData,
// default value (undefined) means "evaluate"
evaluateLowSampleCountPercentile: evaluateLowSampleCountPercentile
? undefined
: "ignore",
datapointsToAlarm,
evaluationPeriods,
actionsEnabled,
});
let alarm = primaryAlarm;
// create composite alarm for min metric samples (if defined)
if (props.minMetricSamplesToAlarm) {
const metricSampleCount = adjustedMetric.with({
statistic: metric_1.MetricStatistic.N,
});
const noSamplesAlarm = metricSampleCount.createAlarm(this.alarmScope, `${alarmName}-NoSamples`, {
alarmName: `${alarmName}-NoSamples`,
alarmDescription: `The metric (${adjustedMetric}) does not have enough samples to alarm. Must have at least ${props.minMetricSamplesToAlarm}.`,
threshold: props.minMetricSamplesToAlarm,
comparisonOperator: aws_cloudwatch_1.ComparisonOperator.LESS_THAN_THRESHOLD,
treatMissingData: aws_cloudwatch_1.TreatMissingData.BREACHING,
datapointsToAlarm: 1,
evaluationPeriods: 1,
actionsEnabled,
});
alarm = new aws_cloudwatch_1.CompositeAlarm(this.alarmScope, `${alarmName}-WithSamples`, {
actionsEnabled,
compositeAlarmName: `${alarmName}-WithSamples`,
alarmDescription: this.joinDescriptionParts(alarmDescription, `Min number of samples to alarm: ${props.minMetricSamplesToAlarm}`),
alarmRule: aws_cloudwatch_1.AlarmRule.allOf(aws_cloudwatch_1.AlarmRule.fromAlarm(primaryAlarm, aws_cloudwatch_1.AlarmState.ALARM), aws_cloudwatch_1.AlarmRule.not(aws_cloudwatch_1.AlarmRule.fromAlarm(noSamplesAlarm, aws_cloudwatch_1.AlarmState.ALARM))),
});
}
// attach alarm actions
action.addAlarmActions({
alarm,
action,
dedupeString,
disambiguator: props.disambiguator,
customTags: props.customTags ?? [],
customParams: props.customParams ?? {},
});
// create annotation for the primary alarm
const annotation = this.createAnnotation({
alarm: primaryAlarm,
action,
metric: adjustedMetric,
evaluationPeriods,
datapointsToAlarm,
dedupeString,
minMetricSamplesToAlarm: props.minMetricSamplesToAlarm,
fillAlarmRange: props.fillAlarmRange ?? false,
overrideAnnotationColor: props.overrideAnnotationColor,
overrideAnnotationLabel: props.overrideAnnotationLabel,
overrideAnnotationVisibility: props.overrideAnnotationVisibility,
comparisonOperator: props.comparisonOperator,
threshold: props.threshold,
disambiguator: props.disambiguator,
customTags: props.customTags ?? [],
customParams: props.customParams ?? {},
});
// return the final result
return {
alarm,
action,
alarmName,
alarmNameSuffix,
alarmLabel,
alarmDescription,
customTags: props.customTags,
customParams: props.customParams,
alarmRuleWhenOk: aws_cloudwatch_1.AlarmRule.fromAlarm(alarm, aws_cloudwatch_1.AlarmState.OK),
alarmRuleWhenAlarming: aws_cloudwatch_1.AlarmRule.fromAlarm(alarm, aws_cloudwatch_1.AlarmState.ALARM),
alarmRuleWhenInsufficientData: aws_cloudwatch_1.AlarmRule.fromAlarm(alarm, aws_cloudwatch_1.AlarmState.INSUFFICIENT_DATA),
dedupeString,
annotation,
disambiguator: props.disambiguator,
};
}
addCompositeAlarm(alarms, props) {
const actionsEnabled = this.determineActionsEnabled(props?.actionsEnabled, props?.disambiguator);
const action = props.actionOverride ?? this.globalAlarmDefaults.action ?? NoopAlarmActionStrategy_1.noopAction();
const namingInput = { alarmNameSuffix: "Composite", ...props };
const alarmName = this.alarmNamingStrategy.getName(namingInput);
const alarmDescription = this.generateDescription(props?.alarmDescription ?? "Composite alarm", props?.alarmDescriptionOverride, props?.runbookLink, props?.documentationLink);
const dedupeString = this.alarmNamingStrategy.getDedupeString(namingInput);
const alarmRule = this.determineCompositeAlarmRule(alarms, props);
const alarm = new aws_cloudwatch_1.CompositeAlarm(this.alarmScope, alarmName, {
compositeAlarmName: alarmName,
alarmDescription,
alarmRule,
actionsEnabled,
});
action.addAlarmActions({
alarm,
action,
dedupeString,
disambiguator: props?.disambiguator,
customTags: props?.customTags,
customParams: props?.customParams,
});
return alarm;
}
determineCompositeAlarmRule(alarms, props) {
const alarmRules = alarms.map((alarm) => alarm.alarmRuleWhenAlarming);
const operator = props.compositeOperator ?? CompositeAlarmOperator.OR;
switch (operator) {
case CompositeAlarmOperator.AND:
return aws_cloudwatch_1.AlarmRule.allOf(...alarmRules);
case CompositeAlarmOperator.OR:
return aws_cloudwatch_1.AlarmRule.anyOf(...alarmRules);
default:
throw new Error(`Unsupported composite alarm operator: ${operator}`);
}
}
determineActionsEnabled(actionsEnabled, disambiguator) {
if (actionsEnabled !== undefined) {
// alarm-specific override to true or false
return actionsEnabled;
}
if (typeof this.globalAlarmDefaults.actionsEnabled === "boolean") {
// global defaults: boolean value
return this.globalAlarmDefaults.actionsEnabled;
}
if (disambiguator) {
// global defaults: disambiguator based value
return this.globalAlarmDefaults.actionsEnabled[disambiguator] ?? false;
}
return false;
}
get shouldUseDefaultDedupeForError() {
return this.globalAlarmDefaults.useDefaultDedupeForError ?? true;
}
get shouldUseDefaultDedupeForLatency() {
return this.globalAlarmDefaults.useDefaultDedupeForLatency ?? true;
}
generateDescription(alarmDescription, alarmDescriptionOverride, runbookLinkOverride, documentationLinkOverride) {
const parts = [alarmDescriptionOverride ?? alarmDescription];
const runbookLink = runbookLinkOverride ?? this.globalAlarmDefaults.runbookLink;
const documentationLink = documentationLinkOverride ?? this.globalAlarmDefaults.documentationLink;
if (runbookLink) {
parts.push(`Runbook: ${runbookLink}`);
}
if (documentationLink) {
parts.push(`Documentation: ${documentationLink}`);
}
return this.joinDescriptionParts(...parts);
}
joinDescriptionParts(...parts) {
return parts.join(" \r\n");
}
createAnnotation(props) {
const strategy = this.globalAlarmDefaults.annotationStrategy ??
new IAlarmAnnotationStrategy_1.DefaultAlarmAnnotationStrategy();
return strategy.createAnnotation(props);
}
}
exports.AlarmFactory = AlarmFactory;
_a = JSII_RTTI_SYMBOL_1;
AlarmFactory[_a] = { fqn: "cdk-monitoring-constructs.AlarmFactory", version: "1.21.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWxhcm1GYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQWxhcm1GYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsK0RBU29DO0FBR3BDLHNDQUltQjtBQUNuQix3Q0FBNkQ7QUFDN0QsK0RBQTREO0FBRTVELHlFQUlvQztBQUVwQyx1RUFBdUQ7QUFFdkQsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUF1VW5DLElBQVksc0JBVVg7QUFWRCxXQUFZLHNCQUFzQjtJQUNoQzs7T0FFRztJQUNILGlFQUFHLENBQUE7SUFFSDs7T0FFRztJQUNILCtEQUFFLENBQUE7QUFDSixDQUFDLEVBVlcsc0JBQXNCLEdBQXRCLDhCQUFzQixLQUF0Qiw4QkFBc0IsUUFVakM7QUFrRkQsTUFBYSxZQUFZO0lBTXZCLFlBQVksVUFBcUIsRUFBRSxLQUF3QjtRQUN6RCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1FBQ3JELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUM7UUFDdkQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUkseUNBQW1CLENBQ2hELEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEVBQ3pDLEtBQUssQ0FBQyxvQkFBb0IsRUFDMUIsS0FBSyxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixDQUNoRCxDQUFDO0lBQ0osQ0FBQztJQUVELFFBQVEsQ0FDTixNQUE4QixFQUM5QixLQUFvQjtRQUVwQixxQkFBcUI7UUFFckIsSUFBSSxjQUFjLEdBQUcsTUFBTSxDQUFDO1FBQzVCLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNoQixxQ0FBcUM7WUFDckMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7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LDBCQUEwQixJQUFJLElBQUksQ0FBQztJQUNyRSxDQUFDO0lBRVMsbUJBQW1CLENBQzNCLGdCQUF3QixFQUN4Qix3QkFBaUMsRUFDakMsbUJBQTRCLEVBQzVCLHlCQUFrQztRQUVsQyxNQUFNLEtBQUssR0FBRyxDQUFDLHdCQUF3QixJQUFJLGdCQUFnQixDQUFDLENBQUM7UUFFN0QsTUFBTSxXQUFXLEdBQ2YsbUJBQW1CLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQztRQUM5RCxNQUFNLGlCQUFpQixHQUNyQix5QkFBeUIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUM7UUFFMUUsSUFBSSxXQUFXLEVBQUU7WUFDZixLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksV0FBVyxFQUFFLENBQUMsQ0FBQztTQUN2QztRQUVELElBQUksaUJBQWlCLEVBQUU7WUFDckIsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1NBQ25EO1FBRUQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRVMsb0JBQW9CLENBQUMsR0FBRyxLQUFlO1FBQy9DLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRVMsZ0JBQWdCLENBQUMsS0FBbUM7UUFDNUQsTUFBTSxRQUFRLEdBQ1osSUFBSSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQjtZQUMzQyxJQUFJLHlEQUE4QixFQUFFLENBQUM7UUFDdkMsT0FBTyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQzs7QUEzU0gsb0NBNFNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIEFsYXJtQmFzZSxcbiAgQWxhcm1SdWxlLFxuICBBbGFybVN0YXRlLFxuICBDb21wYXJpc29uT3BlcmF0b3IsXG4gIENvbXBvc2l0ZUFsYXJtLFxuICBIb3Jpem9udGFsQW5ub3RhdGlvbixcbiAgSUFsYXJtUnVsZSxcbiAgVHJlYXRNaXNzaW5nRGF0YSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQge1xuICBNZXRyaWNGYWN0b3J5RGVmYXVsdHMsXG4gIE1ldHJpY1N0YXRpc3RpYyxcbiAgTWV0cmljV2l0aEFsYXJtU3VwcG9ydCxcbn0gZnJvbSBcIi4uL21ldHJpY1wiO1xuaW1wb3J0IHsgcmVtb3ZlQnJhY2tldHNXaXRoRHluYW1pY0xhYmVscyB9IGZyb20gXCIuLi9zdHJpbmdzXCI7XG5pbXBvcnQgeyBBbGFybU5hbWluZ1N0cmF0ZWd5IH0gZnJvbSBcIi4vQWxhcm1OYW1pbmdTdHJhdGVneVwiO1xuaW1wb3J0IHsgSUFsYXJtQWN0aW9uU3RyYXRlZ3kgfSBmcm9tIFwiLi9JQWxhcm1BY3Rpb25TdHJhdGVneVwiO1xuaW1wb3J0IHtcbiAgQWxhcm1Bbm5vdGF0aW9uU3RyYXRlZ3lQcm9wcyxcbiAgRGVmYXVsdEFsYXJtQW5ub3RhdGlvblN0cmF0ZWd5LFxuICBJQWxhcm1Bbm5vdGF0aW9uU3RyYXRlZ3ksXG59IGZyb20gXCIuL0lBbGFybUFubm90YXRpb25TdHJhdGVneVwiO1xuaW1wb3J0IHsgSUFsYXJtRGVkdXBlU3RyaW5nUHJvY2Vzc29yIH0gZnJvbSBcIi4vSUFsYXJtRGVkdXBlU3RyaW5nUHJvY2Vzc29yXCI7XG5pbXBvcnQgeyBub29wQWN0aW9uIH0gZnJvbSBcIi4vTm9vcEFsYXJtQWN0aW9uU3RyYXRlZ3lcIjtcblxuY29uc3QgRGVmYXVsdERhdGFwb2ludHNUb0FsYXJtID0gMztcblxuLyoqXG4gKiBDb21tb25seSB1c2VkIGRpc2FtYmlndWF0b3JzLlxuICovXG5leHBvcnQgdHlwZSBQcmVkZWZpbmVkQWxhcm1EaXNhbWJpZ3VhdG9ycyA9IFwiV2FybmluZ1wiIHwgXCJDcml0aWNhbFwiO1xuXG4vKipcbiAqIE1ldGFkYXRhIG9mIGFuIGFsYXJtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFsYXJtTWV0YWRhdGEge1xuICByZWFkb25seSBhY3Rpb246IElBbGFybUFjdGlvblN0cmF0ZWd5O1xuICByZWFkb25seSBkZWR1cGVTdHJpbmc/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRpc2FtYmlndWF0b3I/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGN1c3RvbVRhZ3M/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgY3VzdG9tUGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRhdGlvbiBvZiBhbiBhbGFybSB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxhcm1XaXRoQW5ub3RhdGlvbiBleHRlbmRzIEFsYXJtTWV0YWRhdGEge1xuICByZWFkb25seSBhbGFybTogQWxhcm1CYXNlO1xuICByZWFkb25seSBhbGFybU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYWxhcm1OYW1lU3VmZml4OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFsYXJtTGFiZWw6IHN0cmluZztcbiAgcmVhZG9ubHkgYWxhcm1EZXNjcmlwdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBhbGFybVJ1bGVXaGVuT2s6IElBbGFybVJ1bGU7XG4gIHJlYWRvbmx5IGFsYXJtUnVsZVdoZW5BbGFybWluZzogSUFsYXJtUnVsZTtcbiAgcmVhZG9ubHkgYWxhcm1SdWxlV2hlbkluc3VmZmljaWVudERhdGE6IElBbGFybVJ1bGU7XG4gIHJlYWRvbmx5IGFubm90YXRpb246IEhvcml6b250YWxBbm5vdGF0aW9uO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhIHNpbmdsZSBhbGFybSBhbmQgY29uZmlndXJlIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZEFsYXJtUHJvcHMge1xuICAvKipcbiAgICogQWxsb3dzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGFjdGlvbiBzdHJhdGVneS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGFjdGlvbiB3aWxsIGJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbk92ZXJyaWRlPzogSUFsYXJtQWN0aW9uU3RyYXRlZ3k7XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgaXMgZGVmaW5lZCwgdGhlIGFsYXJtIGRlZHVwZSBzdHJpbmcgaXMgc2V0IHRvIHRoaXMgZXhhY3QgdmFsdWUuXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHlvdSBuZWVkIHRvIGhhbmRsZSBkZWR1cGluZyBmb3IgZGlmZmVyZW50IHN0YWdlcyAoQmV0YSwgUHJvZC4uLikgYW5kIHJlYWxtcyAoRVUsIE5BLi4uKSBtYW51YWxseS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQgKG5vIG92ZXJyaWRlKVxuICAgKi9cbiAgcmVhZG9ubHkgZGVkdXBlU3RyaW5nT3ZlcnJpZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgaXMgZGVmaW5lZCwgdGhlIGFsYXJtIG5hbWUgaXMgc2V0IHRvIHRoaXMgZXhhY3QgdmFsdWUuXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHlvdSBuZWVkIHRvIHNwZWNpZnkgcHJlZml4IGZvciBkaWZmZXJlbnQgc3RhZ2VzIChCZXRhLCBQcm9kLi4uKSBhbmQgcmVhbG1zIChFVSwgTkEuLi4pIG1hbnVhbGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1OYW1lT3ZlcnJpZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHRpY2tldCBkZXNjcmlwdGlvbiBib2R5LCB3aGljaCBmdWxseSByZXBsYWNlcyB0aGUgZ2VuZXJhdGVkIHRleHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBhdXRvLWdlbmVyYXRlZCBjb250ZW50IG9ubHlcbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtRGVzY3JpcHRpb25PdmVycmlkZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGlzYW1iaWd1YXRvciBpcyBhIHN0cmluZyB0aGF0IGRpZmZlcmVudGlhdGVzIHRoaXMgYWxhcm0gZnJvbSBvdGhlciBzaW1pbGFyIG9uZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkIChubyBkaXNhbWJpZ3VhdG9yKVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYW1iaWd1YXRvcj86IHN0cmluZztcblxuICAvKipcbiAgICogQWxhcm0gZGVzY3JpcHRpb24gaXMgaW5jbHVkZWQgaW4gdGhlIHRpY2tldCBhbmQgdGhlcmVmb3JlIHNob3VsZCBkZXNjcmliZSB3aGF0IGhhcHBlbmVkLCB3aXRoIGFzIG11Y2ggY29udGV4dCBhcyBwb3NzaWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtRGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbGluayBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHRpY2tldCBkZXNjcmlwdGlvbiBib2R5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgbGluayB3aWxsIGJlIGFkZGVkXG4gICAqL1xuICByZWFkb25seSBkb2N1bWVudGF0aW9uTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbGluayBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHRpY2tldCBkZXNjcmlwdGlvbiBib2R5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgbGluayB3aWxsIGJlIGFkZGVkXG4gICAqL1xuICByZWFkb25seSBydW5ib29rTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogU3VmZml4IGFkZGVkIHRvIGJhc2UgYWxhcm0gbmFtZS4gQWxhcm0gbmFtZXMgbmVlZCB0byBiZSB1bmlxdWUuXG4gICAqL1xuICByZWFkb25seSBhbGFybU5hbWVTdWZmaXg6IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdGhpcyBpcyBkZWZpbmVkLCB0aGUgZGVmYXVsdCByZXNvdXJjZS1zcGVjaWZpYyBhbGFybSBkZWR1cGUgc3RyaW5nIHdpbGwgYmUgc2V0IGFuZCB0aGlzIHdpbGwgYmUgYWRkZWQgYXMgYSBzdWZmaXguXG4gICAqIFRoaXMgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBzYW1lIGRlZHVwZSBzdHJpbmcgZm9yIGEgZmFtaWx5IG9mIGFsYXJtcy5cbiAgICogQ2Fubm90IGJlIGRlZmluZWQgYXQgdGhlIHNhbWUgdGltZSBhcyBhbGFybURlZHVwZVN0cmluZ092ZXJyaWRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZCAobm8gc3VmZml4KVxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1EZWR1cGVTdHJpbmdTdWZmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIGNvbmZpZ3VyZWQgQ2xvdWRXYXRjaCBhbGFybSB0aWNrZXRpbmcgYWN0aW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgc2FtZSBhcyBtb25pdG9yaW5nIGZhY2FkZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBhY3Rpb25zRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRocmVzaG9sZCB0byBhbGFybSBvbi5cbiAgICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDb21wYXJpc29uIG9wZXJhdG9yIHVzZWQgdG8gY29tcGFyZSBhY3R1YWwgdmFsdWUgYWdhaW5zdCB0aGUgdGhyZXNob2xkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGFyaXNvbk9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3I7XG5cbiAgLyoqXG4gICAqIEJlaGF2aW91ciBpbiBjYXNlIHRoZSBtZXRyaWMgZGF0YSBpcyBtaXNzaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJlYXRNaXNzaW5nRGF0YTogVHJlYXRNaXNzaW5nRGF0YTtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGJyZWFjaGVzIHJlcXVpcmVkIHRvIHRyYW5zaXRpb24gaW50byBhbiBBTEFSTSBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFwb2ludHNUb0FsYXJtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcGVyaW9kcyB0byBjb25zaWRlciB3aGVuIGNoZWNraW5nIHRoZSBudW1iZXIgb2YgYnJlYWNoaW5nIGRhdGFwb2ludHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gU2FtZSBhcyBkYXRhcG9pbnRzVG9BbGFybS5cbiAgICovXG4gIHJlYWRvbmx5IGV2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQZXJpb2Qgb3ZlcnJpZGUgZm9yIHRoZSBtZXRyaWMgdG8gYWxhcm0gb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGRlZmF1bHQgc3BlY2lmaWVkIGluIE1ldHJpY0ZhY3RvcnlcbiAgICovXG4gIHJlYWRvbmx5IHBlcmlvZD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBVc2VkIG9ubHkgZm9yIGFsYXJtcyBiYXNlZCBvbiBwZXJjZW50aWxlcy5cbiAgICogSWYgeW91IHNwZWNpZnkgPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgYWxhcm0gc3RhdGUgZG9lcyBub3QgY2hhbmdlIGR1cmluZyBwZXJpb2RzIHdpdGggdG9vIGZldyBkYXRhIHBvaW50cyB0byBiZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LlxuICAgKiBJZiB5b3Ugc3BlY2lmeSA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGFsYXJtIGlzIGFsd2F5cyBldmFsdWF0ZWQgYW5kIHBvc3NpYmx5IGNoYW5nZXMgc3RhdGUgbm8gbWF0dGVyIGhvdyBtYW55IGRhdGEgcG9pbnRzIGFyZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZXZhbHVhdGVMb3dTYW1wbGVDb3VudFBlcmNlbnRpbGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IG1hbnkgc2FtcGxlcyAoTikgb2YgdGhlIG1ldHJpYyBpcyBuZWVkZWQgdG8gdHJpZ2dlciB0aGUgYWxhcm0uXG4gICAqIElmIHRoaXMgcHJvcGVydHkgaXMgc3BlY2lmaWVkLCBhbiBhcnRpZmljaWFsIGNvbXBvc2l0ZSBhbGFybSBpcyBjcmVhdGVkIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAqIDx1bD5cbiAgICogPGxpPlRoZSBvcmlnaW5hbCBhbGFybSwgY3JlYXRlZCB3aXRob3V0IHRoaXMgcHJvcGVydHkgYmVpbmcgdXNlZDsgdGhpcyBhbGFybSB3aWxsIGhhdmUgbm8gYWN0aW9ucyBzZXQuPC9saT5cbiAgICogPGxpPkEgc2Vjb25kYXJ5IGFsYXJtLCB3aGljaCB3aWxsIG1vbml0b3IgdGhlIHNhbWUgbWV0cmljIHdpdGggdGhlIE4gKFNhbXBsZUNvdW50KSBzdGF0aXN0aWMsIGNoZWNraW5nIHRoZSBzYW1wbGUgY291bnQuPC9saT5cbiAgICogPC91bD5cbiAgICogVGhlIG5ld2x5IGNyZWF0ZWQgY29tcG9zaXRlIGFsYXJtIHdpbGwgYmUgcmV0dXJuZWQgYXMgYSByZXN1bHQsIGFuZCBpdCB3aWxsIHRha2UgdGhlIG9yaWdpbmFsIGFsYXJtIGFjdGlvbnMuXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBiZWhhdmlvdXIgLSBubyBjb25kaXRpb24gb24gc2FtcGxlIGNvdW50IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGFsYXJtXG4gICAqL1xuICByZWFkb25seSBtaW5NZXRyaWNTYW1wbGVzVG9BbGFybT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhpcyBhbGxvd3MgdXNlciB0byBhdHRhY2ggY3VzdG9tIHZhbHVlcyB0byB0aGlzIGFsYXJtLCB3aGljaCBjYW4gbGF0ZXIgYmUgYWNjZXNzZWQgZnJvbSB0aGUgXCJ1c2VDcmVhdGVkQWxhcm1zXCIgbWV0aG9kLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVRhZ3M/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhpcyBhbGxvd3MgdXNlciB0byBhdHRhY2ggY3VzdG9tIHBhcmFtZXRlcnMgdG8gdGhpcyBhbGFybSwgd2hpY2ggY2FuIGxhdGVyIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFwidXNlQ3JlYXRlZEFsYXJtc1wiIG1ldGhvZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwYXJhbWV0ZXJzXG4gICAqL1xuICByZWFkb25seSBjdXN0b21QYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWxhcm1pbmcgcmFuZ2Ugb2YgdmFsdWVzIHNob3VsZCBiZSBoaWdobGlnaHRlZCBpbiB0aGUgd2lkZ2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmaWxsQWxhcm1SYW5nZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHNwZWNpZmllZCwgaXQgbW9kaWZpZXMgdGhlIGZpbmFsIGFsYXJtIGFubm90YXRpb24gY29sb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gb3ZlcnJpZGUgKGRlZmF1bHQgY29sb3IpXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZUFubm90YXRpb25Db2xvcj86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgc3BlY2lmaWVkLCBpdCBtb2RpZmllcyB0aGUgZmluYWwgYWxhcm0gYW5ub3RhdGlvbiBsYWJlbC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBvdmVycmlkZSAoZGVmYXVsdCBsYWJlbClcbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlQW5ub3RhdGlvbkxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiBzcGVjaWZpZWQsIGl0IG1vZGlmaWVzIHRoZSBmaW5hbCBhbGFybSBhbm5vdGF0aW9uIHZpc2liaWxpdHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gb3ZlcnJpZGUgKGRlZmF1bHQgdmlzaWJpbGl0eSlcbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlQW5ub3RhdGlvblZpc2liaWxpdHk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhIGNvbXBvc2l0ZSBhbGFybSBhbmQgY29uZmlndXJlIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZENvbXBvc2l0ZUFsYXJtUHJvcHMge1xuICAvKipcbiAgICogQWxsb3dzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGFjdGlvbiBzdHJhdGVneS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGFjdGlvbiB3aWxsIGJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbk92ZXJyaWRlPzogSUFsYXJtQWN0aW9uU3RyYXRlZ3k7XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgaXMgZGVmaW5lZCwgdGhlIGFsYXJtIGRlZHVwZSBzdHJpbmcgaXMgc2V0IHRvIHRoaXMgZXhhY3QgdmFsdWUuXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHlvdSBuZWVkIHRvIGhhbmRsZSBkZWR1cGluZyBmb3IgZGlmZmVyZW50IHN0YWdlcyAoQmV0YSwgUHJvZC4uLikgYW5kIHJlYWxtcyAoRVUsIE5BLi4uKSBtYW51YWxseS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQgKG5vIG92ZXJyaWRlKVxuICAgKi9cbiAgcmVhZG9ubHkgZGVkdXBlU3RyaW5nT3ZlcnJpZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgaXMgZGVmaW5lZCwgdGhlIGFsYXJtIG5hbWUgaXMgc2V0IHRvIHRoaXMgZXhhY3QgdmFsdWUuXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHlvdSBuZWVkIHRvIHNwZWNpZnkgcHJlZml4IGZvciBkaWZmZXJlbnQgc3RhZ2VzIChCZXRhLCBQcm9kLi4uKSBhbmQgcmVhbG1zIChFVSwgTkEuLi4pIG1hbnVhbGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1OYW1lT3ZlcnJpZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHRpY2tldCBkZXNjcmlwdGlvbiBib2R5LCB3aGljaCBmdWxseSByZXBsYWNlcyB0aGUgZ2VuZXJhdGVkIHRleHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBhdXRvLWdlbmVyYXRlZCBjb250ZW50IG9ubHlcbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtRGVzY3JpcHRpb25PdmVycmlkZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGlzYW1iaWd1YXRvciBpcyBhIHN0cmluZyB0aGF0IGRpZmZlcmVudGlhdGVzIHRoaXMgYWxhcm0gZnJvbSBvdGhlciBzaW1pbGFyIG9uZXMuXG4gICAqL1xuICByZWFkb25seSBkaXNhbWJpZ3VhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsYXJtIGRlc2NyaXB0aW9uIGlzIGluY2x1ZGVkIGluIHRoZSB0aWNrZXQgYW5kIHRoZXJlZm9yZSBzaG91bGQgZGVzY3JpYmUgd2hhdCBoYXBwZW5lZCwgd2l0aCBhcyBtdWNoIGNvbnRleHQgYXMgcG9zc2libGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtRGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGxpbmsgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0aWNrZXQgZGVzY3JpcHRpb24gYm9keS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIGxpbmsgd2lsbCBiZSBhZGRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZG9jdW1lbnRhdGlvbkxpbms/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGxpbmsgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0aWNrZXQgZGVzY3JpcHRpb24gYm9keS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIGxpbmsgd2lsbCBiZSBhZGRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcnVuYm9va0xpbms/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFN1ZmZpeCBhZGRlZCB0byBiYXNlIGFsYXJtIG5hbWUuIEFsYXJtIG5hbWVzIG5lZWQgdG8gYmUgdW5pcXVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHN1ZmZpeFxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1OYW1lU3VmZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGlzIGRlZmluZWQsIHRoZSBkZWZhdWx0IHJlc291cmNlLXNwZWNpZmljIGFsYXJtIGRlZHVwZSBzdHJpbmcgd2lsbCBiZSBzZXQgYW5kIHRoaXMgd2lsbCBiZSBhZGRlZCBhcyBhIHN1ZmZpeC5cbiAgICogVGhpcyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNhbWUgZGVkdXBlIHN0cmluZyBmb3IgYSBmYW1pbHkgb2YgYWxhcm1zLlxuICAgKiBDYW5ub3QgYmUgZGVmaW5lZCBhdCB0aGUgc2FtZSB0aW1lIGFzIGFsYXJtRGVkdXBlU3RyaW5nT3ZlcnJpZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkIChubyBzdWZmaXgpXG4gICAqL1xuICByZWFkb25seSBhbGFybURlZHVwZVN0cmluZ1N1ZmZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogRW5hYmxlcyB0aGUgY29uZmlndXJlZCBDbG91ZFdhdGNoIGFsYXJtIHRpY2tldGluZyBhY3Rpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBzYW1lIGFzIG1vbml0b3JpbmcgZmFjYWRlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbnNFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhpcyBhbGxvd3MgdXNlciB0byBhdHRhY2ggY3VzdG9tIHZhbHVlcyB0byB0aGlzIGFsYXJtLCB3aGljaCBjYW4gbGF0ZXIgYmUgYWNjZXNzZWQgZnJvbSB0aGUgXCJ1c2VDcmVhdGVkQWxhcm1zXCIgbWV0aG9kLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVRhZ3M/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhpcyBhbGxvd3MgdXNlciB0byBhdHRhY2ggY3VzdG9tIHBhcmFtZXRlcnMgdG8gdGhpcyBhbGFybSwgd2hpY2ggY2FuIGxhdGVyIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFwidXNlQ3JlYXRlZEFsYXJtc1wiIG1ldGhvZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwYXJhbWV0ZXJzXG4gICAqL1xuICByZWFkb25seSBjdXN0b21QYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWxhcm1pbmcgcmFuZ2Ugb2YgdmFsdWVzIHNob3VsZCBiZSBoaWdobGlnaHRlZCBpbiB0aGUgd2lkZ2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmaWxsQWxhcm1SYW5nZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIExvZ2ljYWwgb3BlcmF0b3IgdXNlZCB0byBhZ2dyZWdhdGUgdGhlIHN0YXR1cyBpbmRpdmlkdWFsIGFsYXJtcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBPUlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9zaXRlT3BlcmF0b3I/OiBDb21wb3NpdGVBbGFybU9wZXJhdG9yO1xufVxuXG4vKipcbiAqIEVuYWJsZSBhbGFybSBhY3Rpb25zIGZvciBhbGwgc2V2ZXJpdGllcyAoYm9vbGVhbikgb3IgcHJvdmlkZSBhIG1hcHBpbmcgb2YgdGhlIGRpc2FtYmlndWF0b3JzIHRvIGJvb2xlYW5zXG4gKi9cbmV4cG9ydCB0eXBlIEFjdGlvbnNFbmFibGVkID1cbiAgfCBib29sZWFuXG4gIHwgUmVjb3JkPFByZWRlZmluZWRBbGFybURpc2FtYmlndWF0b3JzIHwgc3RyaW5nLCBib29sZWFuPjtcblxuZXhwb3J0IGVudW0gQ29tcG9zaXRlQWxhcm1PcGVyYXRvciB7XG4gIC8qKlxuICAgKiB0cmlnZ2VyIG9ubHkgaWYgYWxsIHRoZSBhbGFybXMgYXJlIHRyaWdnZXJlZFxuICAgKi9cbiAgQU5ELFxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyIGlmIGFueSBvZiB0aGUgYWxhcm1zIGlzIHRyaWdnZXJlZFxuICAgKi9cbiAgT1IsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWxhcm1GYWN0b3J5RGVmYXVsdHMge1xuICAvKipcbiAgICogRW5hYmxlcyB0aGUgY29uZmlndXJlZCBDbG91ZFdhdGNoIGFsYXJtIHRpY2tldGluZyBhY3Rpb25zIGZvciBlaXRoZXIgYWxsIHNldmVyaXRpZXMsIG9yIHBlciBzZXZlcml0eS5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbnNFbmFibGVkOiBBY3Rpb25zRW5hYmxlZDtcblxuICAvKipcbiAgICogRGVmYXVsdCBhbGFybSBhY3Rpb24gdXNlZCBmb3IgZWFjaCBhbGFybSwgdW5sZXNzIGl0IGlzIG92ZXJyaWRkZW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uPzogSUFsYXJtQWN0aW9uU3RyYXRlZ3k7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBzdHJhdGVneSB0byBjcmVhdGUgYW5ub3RhdGlvbnMgZm9yIGFsYXJtcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGFubm90YXRpb25zXG4gICAqL1xuICByZWFkb25seSBhbm5vdGF0aW9uU3RyYXRlZ3k/OiBJQWxhcm1Bbm5vdGF0aW9uU3RyYXRlZ3k7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBzdHJhdGVneSB0byBwcm9jZXNzIGRlZHVwZSBzdHJpbmdzIG9mIHRoZSBhbGFybXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGJlaGF2aW91ciAobm8gY2hhbmdlKVxuICAgKi9cbiAgcmVhZG9ubHkgZGVkdXBlU3RyaW5nUHJvY2Vzc29yPzogSUFsYXJtRGVkdXBlU3RyaW5nUHJvY2Vzc29yO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgYnJlYWNoZXMgcmVxdWlyZWQgdG8gdHJhbnNpdGlvbiBpbnRvIGFuIEFMQVJNIHN0YXRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIDNcbiAgICovXG4gIHJlYWRvbmx5IGRhdGFwb2ludHNUb0FsYXJtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcGVyaW9kcyB0byBjb25zaWRlciB3aGVuIGNoZWNraW5nIHRoZSBudW1iZXIgb2YgYnJlYWNoaW5nIGRhdGFwb2ludHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gU2FtZSBhcyBkYXRhcG9pbnRzVG9BbGFybS5cbiAgICovXG4gIHJlYWRvbmx5IGV2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBHbG9iYWwgcHJlZml4IGZvciBhbGwgYWxhcm0gbmFtZXMuIFRoaXMgc2hvdWxkIGJlIHNvbWV0aGluZyB1bmlxdWUgdG8gYXZvaWQgY29sbGlzaW9ucyB3aXRoIG90aGVyIENUSXMuXG4gICAqIFRoaXMgaXMgaWdub3JlZCBpZiBhbiBhbGFybSdzIGRlZHVwZVN0cmluZ092ZXJyaWRlIGlzIGRlY2xhcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1OYW1lUHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGxpbmsgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0aWNrZXQgZGVzY3JpcHRpb24gYm9keS5cbiAgICovXG4gIHJlYWRvbmx5IGRvY3VtZW50YXRpb25MaW5rPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBsaW5rIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgdGlja2V0IGRlc2NyaXB0aW9uIGJvZHkuXG4gICAqL1xuICByZWFkb25seSBydW5ib29rTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdGhpcyBpcyBkZWZpbmVkIGFzIGZhbHNlIGFuZCBkZWR1cGVTdHJpbmdPdmVycmlkZSBpcyB1bmRlZmluZWQsIHRoZSBhbGFybSBwcmVmaXggd2lsbCBiZSBwYXJ0IG9mIHRoZSBkZWR1cGUgc3RyaW5nLlxuICAgKiBUaGlzIGVzc2VudGlhbGx5IHN0b3BzIHRoZSBkZWR1cGUgb2YgZGlmZmVyZW50IGVycm9ycyB0b2dldGhlci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQgKHRydWUpXG4gICAqL1xuICByZWFkb25seSB1c2VEZWZhdWx0RGVkdXBlRm9yRXJyb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGlzIGRlZmluZWQgYXMgZmFsc2UgYW5kIGRlZHVwZVN0cmluZ092ZXJyaWRlIGlzIHVuZGVmaW5lZCwgdGhlIGFsYXJtIHByZWZpeCB3aWxsIGJlIHBhcnQgb2YgdGhlIGRlZHVwZSBzdHJpbmcuXG4gICAqIFRoaXMgZXNzZW50aWFsbHkgc3RvcHMgdGhlIGRlZHVwZSBvZiBkaWZmZXJlbnQgbGF0ZW5jeSBpc3N1ZXMgdG9nZXRoZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkICh0cnVlKVxuICAgKi9cbiAgcmVhZG9ubHkgdXNlRGVmYXVsdERlZHVwZUZvckxhdGVuY3k/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFsYXJtRmFjdG9yeVByb3BzIHtcbiAgcmVhZG9ubHkgZ2xvYmFsQWxhcm1EZWZhdWx0czogQWxhcm1GYWN0b3J5RGVmYXVsdHM7XG4gIHJlYWRvbmx5IGdsb2JhbE1ldHJpY0RlZmF1bHRzOiBNZXRyaWNGYWN0b3J5RGVmYXVsdHM7XG4gIHJlYWRvbmx5IGxvY2FsQWxhcm1OYW1lUHJlZml4OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBBbGFybUZhY3Rvcnkge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWxhcm1TY29wZTogQ29uc3RydWN0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2xvYmFsQWxhcm1EZWZhdWx0czogQWxhcm1GYWN0b3J5RGVmYXVsdHM7XG4gIHByb3RlY3RlZCByZWFkb25seSBnbG9iYWxNZXRyaWNEZWZhdWx0czogTWV0cmljRmFjdG9yeURlZmF1bHRzO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWxhcm1OYW1pbmdTdHJhdGVneTogQWxhcm1OYW1pbmdTdHJhdGVneTtcblxuICBjb25zdHJ1Y3RvcihhbGFybVNjb3BlOiBDb25zdHJ1Y3QsIHByb3BzOiBBbGFybUZhY3RvcnlQcm9wcykge1xuICAgIHRoaXMuYWxhcm1TY29wZSA9IGFsYXJtU2NvcGU7XG4gICAgdGhpcy5nbG9iYWxBbGFybURlZmF1bHRzID0gcHJvcHMuZ2xvYmFsQWxhcm1EZWZhdWx0cztcbiAgICB0aGlzLmdsb2JhbE1ldHJpY0RlZmF1bHRzID0gcHJvcHMuZ2xvYmFsTWV0cmljRGVmYXVsdHM7XG4gICAgdGhpcy5hbGFybU5hbWluZ1N0cmF0ZWd5ID0gbmV3IEFsYXJtTmFtaW5nU3RyYXRlZ3koXG4gICAgICBwcm9wcy5nbG9iYWxBbGFybURlZmF1bHRzLmFsYXJtTmFtZVByZWZpeCxcbiAgICAgIHByb3BzLmxvY2FsQWxhcm1OYW1lUHJlZml4LFxuICAgICAgcHJvcHMuZ2xvYmFsQWxhcm1EZWZhdWx0cy5kZWR1cGVTdHJpbmdQcm9jZXNzb3JcbiAgICApO1xuICB9XG5cbiAgYWRkQWxhcm0oXG4gICAgbWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0LFxuICAgIHByb3BzOiBBZGRBbGFybVByb3BzXG4gICk6IEFsYXJtV2l0aEFubm90YXRpb24ge1xuICAgIC8vIHByZXBhcmUgdGhlIG1ldHJpY1xuXG4gICAgbGV0IGFkanVzdGVkTWV0cmljID0gbWV0cmljO1xuICAgIGlmIChwcm9wcy5wZXJpb2QpIHtcbiAgICAgIC8vIEFkanVzdCBtZXRyaWMgcGVyaW9kIGZvciB0aGUgYWxhcm1cbiAgICAgIGFkanVzdGVkTWV0cmljID0gYWRqdXN0ZWRNZXRyaWMud2l0aCh7IHBlcmlvZDogcHJvcHMucGVyaW9kIH0pO1xuICAgIH1cbiAgICBpZiAoYWRqdXN0ZWRNZXRyaWMubGFiZWwpIHtcbiAgICAgIC8vIEFubm90YXRpb25zIGRvIG5vdCBzdXBwb3J0IGR5bmFtaWMgbGFiZWxzLCBzbyB3ZSBoYXZlIHRvIHJlbW92ZSB0aGVtIGZyb20gbWV0cmljIG5hbWVcbiAgICAgIGFkanVzdGVkTWV0cmljID0gYWRqdXN0ZWRNZXRyaWMud2l0aCh7XG4gICAgICAgIGxhYmVsOiByZW1vdmVCcmFja2V0c1dpdGhEeW5hbWljTGFiZWxzKGFkanVzdGVkTWV0cmljLmxhYmVsKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHByZXBhcmUgcHJpbWFyeSBhbGFybSBwcm9wZXJ0aWVzXG5cbiAgICBjb25zdCBhY3Rpb25zRW5hYmxlZCA9IHRoaXMuZGV0ZXJtaW5lQWN0aW9uc0VuYWJsZWQoXG4gICAgICBwcm9wcy5hY3Rpb25zRW5hYmxlZCxcbiAgICAgIHByb3BzLmRpc2FtYmlndWF0b3JcbiAgICApO1xuICAgIGNvbnN0IGFjdGlvbiA9XG4gICAgICBwcm9wcy5hY3Rpb25PdmVycmlkZSA/PyB0aGlzLmdsb2JhbEFsYXJtRGVmYXVsdHMuYWN0aW9uID8/IG5vb3BBY3Rpb24oKTtcbiAgICBjb25zdCBhbGFybU5hbWUgPSB0aGlzLmFsYXJtTmFtaW5nU3RyYXRlZ3kuZ2V0TmFtZShwcm9wcyk7XG4gICAgY29uc3QgYWxhcm1OYW1lU3VmZml4ID0gcHJvcHMuYWxhcm1OYW1lU3VmZml4O1xuICAgIGNvbnN0IGFsYXJtTGFiZWwgPSB0aGlzLmFsYXJtTmFtaW5nU3RyYXRlZ3kuZ2V0V2lkZ2V0TGFiZWwocHJvcHMpO1xuICAgIGNvbnN0IGFsYXJtRGVzY3JpcHRpb24gPSB0aGlzLmdlbmVyYXRlRGVzY3JpcHRpb24oXG4gICAgICBwcm9wcy5hbGFybURlc2NyaXB0aW9uLFxuICAgICAgcHJvcHMuYWxhcm1EZXNjcmlwdGlvbk92ZXJyaWRlLFxuICAgICAgcHJvcHMucnVuYm9va0xpbmssXG4gICAgICBwcm9wcy5kb2N1bWVudGF0aW9uTGlua1xuICAgICk7XG4gICAgY29uc3QgZGVkdXBlU3RyaW5nID0gdGhpcy5hbGFybU5hbWluZ1N0cmF0ZWd5LmdldERlZHVwZVN0cmluZyhwcm9wcyk7XG4gICAgY29uc3QgZXZhbHVhdGVMb3dTYW1wbGVDb3VudFBlcmNlbnRpbGUgPVxuICAgICAgcHJvcHMuZXZhbHVhdGVMb3dTYW1wbGVDb3VudFBlcmNlbnRpbGUgPz8gdHJ1ZTtcblxuICAgIGNvbnN0IGRhdGFwb2ludHNUb0FsYXJtID1cbiAgICAgIHByb3BzLmRhdGFwb2ludHNUb0FsYXJtID8/XG4gICAgICB0aGlzLmdsb2JhbEFsYXJtRGVmYXVsdHMuZGF0YXBvaW50c1RvQWxhcm0gPz9cbiAgICAgIERlZmF1bHREYXRhcG9pbnRzVG9BbGFybTtcbiAgICBjb25zdCBldmFsdWF0aW9uUGVyaW9kcyA9XG4gICAgICBwcm9wcy5ldmFsdWF0aW9uUGVyaW9kcyA/P1xuICAgICAgdGhpcy5nbG9iYWxBbGFybURlZmF1bHRzLmV2YWx1YXRpb25QZXJpb2RzID8/XG4gICAgICBkYXRhcG9pbnRzVG9BbGFybTtcblxuICAgIGlmIChldmFsdWF0aW9uUGVyaW9kcyA8IGRhdGFwb2ludHNUb0FsYXJtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBldmFsdWF0aW9uUGVyaW9kcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBkYXRhcG9pbnRzVG9BbGFybSBmb3IgJHthbGFybU5hbWV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgcHJpbWFyeSBhbGFybVxuXG4gICAgY29uc3QgcHJpbWFyeUFsYXJtID0gYWRqdXN0ZWRNZXRyaWMuY3JlYXRlQWxhcm0oXG4gICAgICB0aGlzLmFsYXJtU2NvcGUsXG4gICAgICBhbGFybU5hbWUsXG4gICAgICB7XG4gICAgICAgIGFsYXJtTmFtZSxcbiAgICAgICAgYWxhcm1EZXNjcmlwdGlvbixcbiAgICAgICAgdGhyZXNob2xkOiBwcm9wcy50aHJlc2hvbGQsXG4gICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogcHJvcHMuY29tcGFyaXNvbk9wZXJhdG9yLFxuICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBwcm9wcy50cmVhdE1pc3NpbmdEYXRhLFxuICAgICAgICAvLyBkZWZhdWx0IHZhbHVlICh1bmRlZmluZWQpIG1lYW5zIFwiZXZhbHVhdGVcIlxuICAgICAgICBldmFsdWF0ZUxvd1NhbXBsZUNvdW50UGVyY2VudGlsZTogZXZhbHVhdGVMb3dTYW1wbGVDb3VudFBlcmNlbnRpbGVcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogXCJpZ25vcmVcIixcbiAgICAgICAgZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICBhY3Rpb25zRW5hYmxlZCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgbGV0IGFsYXJtOiBBbGFybUJhc2UgPSBwcmltYXJ5QWxhcm07XG5cbiAgICAvLyBjcmVhdGUgY29tcG9zaXRlIGFsYXJtIGZvciBtaW4gbWV0cmljIHNhbXBsZXMgKGlmIGRlZmluZWQpXG5cbiAgICBpZiAocHJvcHMubWluTWV0cmljU2FtcGxlc1RvQWxhcm0pIHtcbiAgICAgIGNvbnN0IG1ldHJpY1NhbXBsZUNvdW50ID0gYWRqdXN0ZWRNZXRyaWMud2l0aCh7XG4gICAgICAgIHN0YXRpc3RpYzogTWV0cmljU3RhdGlzdGljLk4sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG5vU2FtcGxlc0FsYXJtID0gbWV0cmljU2FtcGxlQ291bnQuY3JlYXRlQWxhcm0oXG4gICAgICAgIHRoaXMuYWxhcm1TY29wZSxcbiAgICAgICAgYCR7YWxhcm1OYW1lfS1Ob1NhbXBsZXNgLFxuICAgICAgICB7XG4gICAgICAgICAgYWxhcm1OYW1lOiBgJHthbGFybU5hbWV9LU5vU2FtcGxlc2AsXG4gICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYFRoZSBtZXRyaWMgKCR7YWRqdXN0ZWRNZXRyaWN9KSBkb2VzIG5vdCBoYXZlIGVub3VnaCBzYW1wbGVzIHRvIGFsYXJtLiBNdXN0IGhhdmUgYXQgbGVhc3QgJHtwcm9wcy5taW5NZXRyaWNTYW1wbGVzVG9BbGFybX0uYCxcbiAgICAgICAgICB0aHJlc2hvbGQ6IHByb3BzLm1pbk1ldHJpY1NhbXBsZXNUb0FsYXJtLFxuICAgICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLkxFU1NfVEhBTl9USFJFU0hPTEQsXG4gICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogVHJlYXRNaXNzaW5nRGF0YS5CUkVBQ0hJTkcsXG4gICAgICAgICAgZGF0YXBvaW50c1RvQWxhcm06IDEsXG4gICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDEsXG4gICAgICAgICAgYWN0aW9uc0VuYWJsZWQsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBhbGFybSA9IG5ldyBDb21wb3NpdGVBbGFybSh0aGlzLmFsYXJtU2NvcGUsIGAke2FsYXJtTmFtZX0tV2l0aFNhbXBsZXNgLCB7XG4gICAgICAgIGFjdGlvbnNFbmFibGVkLFxuICAgICAgICBjb21wb3NpdGVBbGFybU5hbWU6IGAke2FsYXJtTmFtZX0tV2l0aFNhbXBsZXNgLFxuICAgICAgICBhbGFybURlc2NyaXB0aW9uOiB0aGlzLmpvaW5EZXNjcmlwdGlvblBhcnRzKFxuICAgICAgICAgIGFsYXJtRGVzY3JpcHRpb24sXG4gICAgICAgICAgYE1pbiBudW1iZXIgb2Ygc2FtcGxlcyB0byBhbGFybTogJHtwcm9wcy5taW5NZXRyaWNTYW1wbGVzVG9BbGFybX1gXG4gICAgICAgICksXG4gICAgICAgIGFsYXJtUnVsZTogQWxhcm1SdWxlLmFsbE9mKFxuICAgICAgICAgIEFsYXJtUnVsZS5mcm9tQWxhcm0ocHJpbWFyeUFsYXJtLCBBbGFybVN0YXRlLkFMQVJNKSxcbiAgICAgICAgICBBbGFybVJ1bGUubm90KEFsYXJtUnVsZS5mcm9tQWxhcm0obm9TYW1wbGVzQWxhcm0sIEFsYXJtU3RhdGUuQUxBUk0pKVxuICAgICAgICApLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gYXR0YWNoIGFsYXJtIGFjdGlvbnNcblxuICAgIGFjdGlvbi5hZGRBbGFybUFjdGlvbnMoe1xuICAgICAgYWxhcm0sXG4gICAgICBhY3Rpb24sXG4gICAgICBkZWR1cGVTdHJpbmcsXG4gICAgICBkaXNhbWJpZ3VhdG9yOiBwcm9wcy5kaXNhbWJpZ3VhdG9yLFxuICAgICAgY3VzdG9tVGFnczogcHJvcHMuY3VzdG9tVGFncyA/PyBbXSxcbiAgICAgIGN1c3RvbVBhcmFtczogcHJvcHMuY3VzdG9tUGFyYW1zID8/IHt9LFxuICAgIH0pO1xuXG4gICAgLy8gY3JlYXRlIGFubm90YXRpb24gZm9yIHRoZSBwcmltYXJ5IGFsYXJtXG5cbiAgICBjb25zdCBhbm5vdGF0aW9uID0gdGhpcy5jcmVhdGVBbm5vdGF0aW9uKHtcbiAgICAgIGFsYXJtOiBwcmltYXJ5QWxhcm0sXG4gICAgICBhY3Rpb24sXG4gICAgICBtZXRyaWM6IGFkanVzdGVkTWV0cmljLFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICBkYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgIGRlZHVwZVN0cmluZyxcbiAgICAgIG1pbk1ldHJpY1NhbXBsZXNUb0FsYXJtOiBwcm9wcy5taW5NZXRyaWNTYW1wbGVzVG9BbGFybSxcbiAgICAgIGZpbGxBbGFybVJhbmdlOiBwcm9wcy5maWxsQWxhcm1SYW5nZSA/PyBmYWxzZSxcbiAgICAgIG92ZXJyaWRlQW5ub3RhdGlvbkNvbG9yOiBwcm9wcy5vdmVycmlkZUFubm90YXRpb25Db2xvcixcbiAgICAgIG92ZXJyaWRlQW5ub3RhdGlvbkxhYmVsOiBwcm9wcy5vdmVycmlkZUFubm90YXRpb25MYWJlbCxcbiAgICAgIG92ZXJyaWRlQW5ub3RhdGlvblZpc2liaWxpdHk6IHByb3BzLm92ZXJyaWRlQW5ub3RhdGlvblZpc2liaWxpdHksXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IHByb3BzLmNvbXBhcmlzb25PcGVyYXRvcixcbiAgICAgIHRocmVzaG9sZDogcHJvcHMudGhyZXNob2xkLFxuICAgICAgZGlzYW1iaWd1YXRvcjogcHJvcHMuZGlzYW1iaWd1YXRvcixcbiAgICAgIGN1c3RvbVRhZ3M6IHByb3BzLmN1c3RvbVRhZ3MgPz8gW10sXG4gICAgICBjdXN0b21QYXJhbXM6IHByb3BzLmN1c3RvbVBhcmFtcyA/PyB7fSxcbiAgICB9KTtcblxuICAgIC8vIHJldHVybiB0aGUgZmluYWwgcmVzdWx0XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWxhcm0sXG4gICAgICBhY3Rpb24sXG4gICAgICBhbGFybU5hbWUsXG4gICAgICBhbGFybU5hbWVTdWZmaXgsXG4gICAgICBhbGFybUxhYmVsLFxuICAgICAgYWxhcm1EZXNjcmlwdGlvbixcbiAgICAgIGN1c3RvbVRhZ3M6IHByb3BzLmN1c3RvbVRhZ3MsXG4gICAgICBjdXN0b21QYXJhbXM6IHByb3BzLmN1c3RvbVBhcmFtcyxcbiAgICAgIGFsYXJtUnVsZVdoZW5PazogQWxhcm1SdWxlLmZyb21BbGFybShhbGFybSwgQWxhcm1TdGF0ZS5PSyksXG4gICAgICBhbGFybVJ1bGVXaGVuQWxhcm1pbmc6IEFsYXJtUnVsZS5mcm9tQWxhcm0oYWxhcm0sIEFsYXJtU3RhdGUuQUxBUk0pLFxuICAgICAgYWxhcm1SdWxlV2hlbkluc3VmZmljaWVudERhdGE6IEFsYXJtUnVsZS5mcm9tQWxhcm0oXG4gICAgICAgIGFsYXJtLFxuICAgICAgICBBbGFybVN0YXRlLklOU1VGRklDSUVOVF9EQVRBXG4gICAgICApLFxuICAgICAgZGVkdXBlU3RyaW5nLFxuICAgICAgYW5ub3RhdGlvbixcbiAgICAgIGRpc2FtYmlndWF0b3I6IHByb3BzLmRpc2FtYmlndWF0b3IsXG4gICAgfTtcbiAgfVxuXG4gIGFkZENvbXBvc2l0ZUFsYXJtKFxuICAgIGFsYXJtczogQWxhcm1XaXRoQW5ub3RhdGlvbltdLFxuICAgIHByb3BzOiBBZGRDb21wb3NpdGVBbGFybVByb3BzXG4gICk6IENvbXBvc2l0ZUFsYXJtIHtcbiAgICBjb25zdCBhY3Rpb25zRW5hYmxlZCA9IHRoaXMuZGV0ZXJtaW5lQWN0aW9uc0VuYWJsZWQoXG4gICAgICBwcm9wcz8uYWN0aW9uc0VuYWJsZWQsXG4gICAgICBwcm9wcz8uZGlzYW1iaWd1YXRvclxuICAgICk7XG4gICAgY29uc3QgYWN0aW9uID1cbiAgICAgIHByb3BzLmFjdGlvbk92ZXJyaWRlID8/IHRoaXMuZ2xvYmFsQWxhcm1EZWZhdWx0cy5hY3Rpb24gPz8gbm9vcEFjdGlvbigpO1xuICAgIGNvbnN0IG5hbWluZ0lucHV0ID0geyBhbGFybU5hbWVTdWZmaXg6IFwiQ29tcG9zaXRlXCIsIC4uLnByb3BzIH07XG4gICAgY29uc3QgYWxhcm1OYW1lID0gdGhpcy5hbGFybU5hbWluZ1N0cmF0ZWd5LmdldE5hbWUobmFtaW5nSW5wdXQpO1xuICAgIGNvbnN0IGFsYXJtRGVzY3JpcHRpb24gPSB0aGlzLmdlbmVyYXRlRGVzY3JpcHRpb24oXG4gICAgICBwcm9wcz8uYWxhcm1EZXNjcmlwdGlvbiA/PyBcIkNvbXBvc2l0ZSBhbGFybVwiLFxuICAgICAgcHJvcHM/LmFsYXJtRGVzY3JpcHRpb25PdmVycmlkZSxcbiAgICAgIHByb3BzPy5ydW5ib29rTGluayxcbiAgICAgIHByb3BzPy5kb2N1bWVudGF0aW9uTGlua1xuICAgICk7XG4gICAgY29uc3QgZGVkdXBlU3RyaW5nID0gdGhpcy5hbGFybU5hbWluZ1N0cmF0ZWd5LmdldERlZHVwZVN0cmluZyhuYW1pbmdJbnB1dCk7XG4gICAgY29uc3QgYWxhcm1SdWxlID0gdGhpcy5kZXRlcm1pbmVDb21wb3NpdGVBbGFybVJ1bGUoYWxhcm1zLCBwcm9wcyk7XG5cbiAgICBjb25zdCBhbGFybSA9IG5ldyBDb21wb3NpdGVBbGFybSh0aGlzLmFsYXJtU2NvcGUsIGFsYXJtTmFtZSwge1xuICAgICAgY29tcG9zaXRlQWxhcm1OYW1lOiBhbGFybU5hbWUsXG4gICAgICBhbGFybURlc2NyaXB0aW9uLFxuICAgICAgYWxhcm1SdWxlLFxuICAgICAgYWN0aW9uc0VuYWJsZWQsXG4gICAgfSk7XG5cbiAgICBhY3Rpb24uYWRkQWxhcm1BY3Rpb25zKHtcbiAgICAgIGFsYXJtLFxuICAgICAgYWN0aW9uLFxuICAgICAgZGVkdXBlU3RyaW5nLFxuICAgICAgZGlzYW1iaWd1YXRvcjogcHJvcHM/LmRpc2FtYmlndWF0b3IsXG4gICAgICBjdXN0b21UYWdzOiBwcm9wcz8uY3VzdG9tVGFncyxcbiAgICAgIGN1c3RvbVBhcmFtczogcHJvcHM/LmN1c3RvbVBhcmFtcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBhbGFybTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXRlcm1pbmVDb21wb3NpdGVBbGFybVJ1bGUoXG4gICAgYWxhcm1zOiBBbGFybVdpdGhBbm5vdGF0aW9uW10sXG4gICAgcHJvcHM6IEFkZENvbXBvc2l0ZUFsYXJtUHJvcHNcbiAgKTogSUFsYXJtUnVsZSB7XG4gICAgY29uc3QgYWxhcm1SdWxlcyA9IGFsYXJtcy5tYXAoKGFsYXJtKSA9PiBhbGFybS5hbGFybVJ1bGVXaGVuQWxhcm1pbmcpO1xuICAgIGNvbnN0IG9wZXJhdG9yID0gcHJvcHMuY29tcG9zaXRlT3BlcmF0b3IgPz8gQ29tcG9zaXRlQWxhcm1PcGVyYXRvci5PUjtcbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICBjYXNlIENvbXBvc2l0ZUFsYXJtT3BlcmF0b3IuQU5EOlxuICAgICAgICByZXR1cm4gQWxhcm1SdWxlLmFsbE9mKC4uLmFsYXJtUnVsZXMpO1xuICAgICAgY2FzZSBDb21wb3NpdGVBbGFybU9wZXJhdG9yLk9SOlxuICAgICAgICByZXR1cm4gQWxhcm1SdWxlLmFueU9mKC4uLmFsYXJtUnVsZXMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBjb21wb3NpdGUgYWxhcm0gb3BlcmF0b3I6ICR7b3BlcmF0b3J9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRldGVybWluZUFjdGlvbnNFbmFibGVkKFxuICAgIGFjdGlvbnNFbmFibGVkPzogYm9vbGVhbixcbiAgICBkaXNhbWJpZ3VhdG9yPzogc3RyaW5nXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChhY3Rpb25zRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBhbGFybS1zcGVjaWZpYyBvdmVycmlkZSB0byB0cnVlIG9yIGZhbHNlXG4gICAgICByZXR1cm4gYWN