UNPKG

cdk-monitoring-constructs

Version:

[![NPM version](https://badge.fury.io/js/cdk-monitoring-constructs.svg)](https://badge.fury.io/js/cdk-monitoring-constructs) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.cdklabs/cdkmonitoringconstructs/badge.svg)](https://m

239 lines 48.5 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.ApiGatewayV2HttpApiMonitoring = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const ApiGatewayV2HttpApiMetricFactory_1 = require("./ApiGatewayV2HttpApiMetricFactory"); const common_1 = require("../../common"); const dashboard_1 = require("../../dashboard"); const DefaultLatencyTypesToRender = [ common_1.LatencyType.P50, common_1.LatencyType.P90, common_1.LatencyType.P99, ]; class ApiGatewayV2HttpApiMonitoring extends common_1.Monitoring { constructor(scope, props) { super(scope, props); // used when humanReadableName is not provided by user const fallbackNameArray = [props.api.apiId]; fallbackNameArray.push(props.apiStage ?? "$default"); if (props.apiMethod) { fallbackNameArray.push(props.apiMethod); } if (props.apiResource) { fallbackNameArray.push(props.apiResource); } const namingStrategy = new dashboard_1.MonitoringNamingStrategy({ ...props, namedConstruct: props.api, fallbackConstructName: fallbackNameArray .join("-") .replace(/[^a-zA-Z0-9-_]/g, ""), humanReadableName: props.humanReadableName ?? fallbackNameArray.join(" "), }); this.title = namingStrategy.resolveHumanReadableName(); this.alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName()); this.errorAlarmFactory = new common_1.ErrorAlarmFactory(this.alarmFactory); this.tpsAlarmFactory = new common_1.TpsAlarmFactory(this.alarmFactory); this.latencyAlarmFactory = new common_1.LatencyAlarmFactory(this.alarmFactory); this.tpsAnnotations = []; this.latencyAnnotations = []; this.errorCountAnnotations = []; this.errorRateAnnotations = []; const metricFactory = new ApiGatewayV2HttpApiMetricFactory_1.ApiGatewayV2HttpApiMetricFactory(scope.createMetricFactory(), props); this.tpsMetric = metricFactory.metricInvocationRate(common_1.RateComputationMethod.PER_SECOND); this.latencyMetrics = {}; this.integrationLatencyMetrics = {}; this.latencyTypesToRender = [ ...(props.latencyTypesToRender ?? DefaultLatencyTypesToRender), ]; this.error4xxCountMetric = metricFactory.metric4xxCount(); this.error4xxRateMetric = metricFactory.metric4xxRate(); this.error5xxCountMetric = metricFactory.metric5xxCount(); this.error5xxRateMetric = metricFactory.metric5xxRate(); const latencyAlarmDefinitions = { [common_1.LatencyType.P50]: props.addLatencyP50Alarm, [common_1.LatencyType.P70]: props.addLatencyP70Alarm, [common_1.LatencyType.P90]: props.addLatencyP90Alarm, [common_1.LatencyType.P95]: props.addLatencyP95Alarm, [common_1.LatencyType.P99]: props.addLatencyP99Alarm, [common_1.LatencyType.P999]: props.addLatencyP999Alarm, [common_1.LatencyType.P9999]: props.addLatencyP9999Alarm, [common_1.LatencyType.P100]: props.addLatencyP100Alarm, [common_1.LatencyType.TM50]: props.addLatencyTM50Alarm, [common_1.LatencyType.TM70]: props.addLatencyTM70Alarm, [common_1.LatencyType.TM90]: props.addLatencyTM90Alarm, [common_1.LatencyType.TM95]: props.addLatencyTM95Alarm, [common_1.LatencyType.TM99]: props.addLatencyTM99Alarm, [common_1.LatencyType.TM999]: props.addLatencyTM999Alarm, [common_1.LatencyType.TM9999]: props.addLatencyTM9999Alarm, [common_1.LatencyType.TM95_TOP]: props.addLatencyTM95OutlierAlarm, [common_1.LatencyType.TM99_TOP]: props.addLatencyTM99OutlierAlarm, [common_1.LatencyType.TM999_TOP]: props.addLatencyTM999OutlierAlarm, [common_1.LatencyType.TM9999_TOP]: props.addLatencyTM999OutlierAlarm, [common_1.LatencyType.AVERAGE]: props.addLatencyAverageAlarm, }; const integrationLatencyAlarmDefinitions = { [common_1.LatencyType.P50]: props.addIntegrationLatencyP50Alarm, [common_1.LatencyType.P70]: props.addIntegrationLatencyP70Alarm, [common_1.LatencyType.P90]: props.addIntegrationLatencyP90Alarm, [common_1.LatencyType.P95]: props.addIntegrationLatencyP95Alarm, [common_1.LatencyType.P99]: props.addIntegrationLatencyP99Alarm, [common_1.LatencyType.P999]: props.addIntegrationLatencyP999Alarm, [common_1.LatencyType.P9999]: props.addIntegrationLatencyP9999Alarm, [common_1.LatencyType.P100]: props.addIntegrationLatencyP100Alarm, [common_1.LatencyType.TM50]: props.addIntegrationLatencyTM50Alarm, [common_1.LatencyType.TM70]: props.addIntegrationLatencyTM70Alarm, [common_1.LatencyType.TM90]: props.addIntegrationLatencyTM90Alarm, [common_1.LatencyType.TM95]: props.addIntegrationLatencyTM95Alarm, [common_1.LatencyType.TM99]: props.addIntegrationLatencyTM99Alarm, [common_1.LatencyType.TM999]: props.addIntegrationLatencyTM999Alarm, [common_1.LatencyType.TM9999]: props.addIntegrationLatencyTM9999Alarm, [common_1.LatencyType.TM95_TOP]: props.addIntegrationLatencyTM95OutlierAlarm, [common_1.LatencyType.TM99_TOP]: props.addIntegrationLatencyTM99OutlierAlarm, [common_1.LatencyType.TM999_TOP]: props.addIntegrationLatencyTM999OutlierAlarm, [common_1.LatencyType.TM9999_TOP]: props.addIntegrationLatencyTM9999OutlierAlarm, [common_1.LatencyType.AVERAGE]: props.addIntegrationLatencyAverageAlarm, }; Object.values(common_1.LatencyType).forEach((latencyType) => { this.latencyMetrics[latencyType] = metricFactory.metricLatencyInMillis(latencyType); this.integrationLatencyMetrics[latencyType] = metricFactory.metricIntegrationLatencyInMillis(latencyType); }); for (const [latencyType, alarmDefinition] of Object.entries(latencyAlarmDefinitions)) { for (const disambiguator in alarmDefinition) { const alarmProps = alarmDefinition[disambiguator]; const latencyTypeEnum = latencyType; const metric = this.latencyMetrics[latencyTypeEnum]; const createdAlarm = this.latencyAlarmFactory.addLatencyAlarm(metric, latencyTypeEnum, alarmProps, disambiguator); this.latencyAnnotations.push(createdAlarm.annotation); this.latencyTypesToRender.push(latencyTypeEnum); this.addAlarm(createdAlarm); } } for (const [latencyType, alarmDefinition] of Object.entries(integrationLatencyAlarmDefinitions)) { for (const disambiguator in alarmDefinition) { const alarmProps = alarmDefinition[disambiguator]; const latencyTypeEnum = latencyType; const metric = this.integrationLatencyMetrics[latencyTypeEnum]; const createdAlarm = this.latencyAlarmFactory.addIntegrationLatencyAlarm(metric, latencyTypeEnum, alarmProps, disambiguator); this.latencyAnnotations.push(createdAlarm.annotation); this.latencyTypesToRender.push(latencyTypeEnum); this.addAlarm(createdAlarm); } } for (const disambiguator in props.add4xxCountAlarm) { const alarmProps = props.add4xxCountAlarm[disambiguator]; const createdAlarm = this.errorAlarmFactory.addErrorCountAlarm(this.error4xxCountMetric, common_1.ErrorType.ERROR, alarmProps, disambiguator); this.errorCountAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.add4xxRateAlarm) { const alarmProps = props.add4xxRateAlarm[disambiguator]; const createdAlarm = this.errorAlarmFactory.addErrorRateAlarm(this.error4xxRateMetric, common_1.ErrorType.ERROR, alarmProps, disambiguator); this.errorRateAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.add5xxCountAlarm) { const alarmProps = props.add5xxCountAlarm[disambiguator]; const createdAlarm = this.errorAlarmFactory.addErrorCountAlarm(this.error5xxCountMetric, common_1.ErrorType.FAULT, alarmProps, disambiguator); this.errorCountAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.add5xxRateAlarm) { const alarmProps = props.add5xxRateAlarm[disambiguator]; const createdAlarm = this.errorAlarmFactory.addErrorRateAlarm(this.error5xxRateMetric, 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); } props.useCreatedAlarms?.consume(this.createdAlarms()); } 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() { return [ this.createTitleWidget(), this.createTpsWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createLatencyWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createErrorCountWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createErrorRateWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), ]; } createTitleWidget() { return new dashboard_1.MonitoringHeaderWidget({ family: "API Gateway V2 HTTP Endpoint", title: this.title, }); } 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) { const left = []; Array.from(new Set(this.latencyTypesToRender)) .sort() .forEach((type) => { left.push(this.latencyMetrics[type]); left.push(this.integrationLatencyMetrics[type]); }); return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Latency", left, leftYAxis: common_1.TimeAxisMillisFromZero, leftAnnotations: this.latencyAnnotations, }); } createErrorCountWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Errors", left: [this.error4xxCountMetric, this.error5xxCountMetric], leftAnnotations: this.errorCountAnnotations, leftYAxis: common_1.CountAxisFromZero, }); } createErrorRateWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Errors (rate)", left: [this.error4xxRateMetric, this.error5xxRateMetric], leftYAxis: common_1.RateAxisFromZero, leftAnnotations: this.errorRateAnnotations, }); } } exports.ApiGatewayV2HttpApiMonitoring = ApiGatewayV2HttpApiMonitoring; _a = JSII_RTTI_SYMBOL_1; ApiGatewayV2HttpApiMonitoring[_a] = { fqn: "cdk-monitoring-constructs.ApiGatewayV2HttpApiMonitoring", version: "9.12.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBpR2F0ZXdheVYySHR0cEFwaU1vbml0b3JpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBcGlHYXRld2F5VjJIdHRwQXBpTW9uaXRvcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtEQUtvQztBQUVwQyx5RkFHNEM7QUFDNUMseUNBd0JzQjtBQUN0QiwrQ0FHeUI7QUFFekIsTUFBTSwyQkFBMkIsR0FBRztJQUNsQyxvQkFBVyxDQUFDLEdBQUc7SUFDZixvQkFBVyxDQUFDLEdBQUc7SUFDZixvQkFBVyxDQUFDLEdBQUc7Q0FDaEIsQ0FBQztBQXFGRixNQUFhLDZCQUE4QixTQUFRLG1CQUFVO0lBd0IzRCxZQUNFLEtBQXNCLEVBQ3RCLEtBQXlDO1FBRXpDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFcEIsc0RBQXNEO1FBQ3RELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRTtZQUNuQixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFO1lBQ3JCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDM0M7UUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLG9DQUF3QixDQUFDO1lBQ2xELEdBQUcsS0FBSztZQUNSLGNBQWMsRUFBRSxLQUFLLENBQUMsR0FBRztZQUN6QixxQkFBcUIsRUFBRSxpQkFBaUI7aUJBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUM7aUJBQ1QsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztZQUNqQyxpQkFBaUIs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QUFFLEtBQUssQ0FBQyxtQkFBbUI7WUFDN0MsQ0FBQyxvQkFBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxvQkFBb0I7WUFDL0MsQ0FBQyxvQkFBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxxQkFBcUI7WUFDakQsQ0FBQyxvQkFBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQywwQkFBMEI7WUFDeEQsQ0FBQyxvQkFBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQywwQkFBMEI7WUFDeEQsQ0FBQyxvQkFBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQywyQkFBMkI7WUFDMUQsQ0FBQyxvQkFBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssQ0FBQywyQkFBMkI7WUFDM0QsQ0FBQyxvQkFBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxzQkFBc0I7U0FDcEQsQ0FBQztRQUVGLE1BQU0sa0NBQWtDLEdBQUc7WUFDekMsQ0FBQyxvQkFBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyw2QkFBNkI7WUFDdEQsQ0FBQyxvQkFBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyw2QkFBNkI7WUFDdEQsQ0FBQyxvQkFBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyw2QkFBNkI7WUFDdEQsQ0FBQyxvQkFBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyw2QkFBNkI7WUFDdEQsQ0FBQyxvQkFBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyw2QkFBNkI7WUFDdEQsQ0FBQyxvQkFBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyw4QkFBOEI7WUFDeEQsQ0FBQyxvQkFBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQywrQkFBK0I7WUFDMUQsQ0FBQyxvQkFBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyw4QkFBOEI7WUFDeEQsQ0FBQyxvQkFBVyxDQUFDLElBQUksQ0FBQyxFQUFF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SSxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUMxRCxlQUFlLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtZQUMzQyxTQUFTLEVBQUUsMEJBQWlCO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUNqRCxPQUFPLElBQUksNEJBQVcsQ0FBQztZQUNyQixLQUFLO1lBQ0wsTUFBTTtZQUNOLEtBQUssRUFBRSxlQUFlO1lBQ3RCLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDeEQsU0FBUyxFQUFFLHlCQUFnQjtZQUMzQixlQUFlLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjtTQUMzQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQXZVSCxzRUF3VUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBHcmFwaFdpZGdldCxcbiAgSG9yaXpvbnRhbEFubm90YXRpb24sXG4gIElNZXRyaWMsXG4gIElXaWRnZXQsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuXG5pbXBvcnQge1xuICBBcGlHYXRld2F5VjJIdHRwQXBpTWV0cmljRmFjdG9yeSxcbiAgQXBpR2F0ZXdheVYySHR0cEFwaU1ldHJpY0ZhY3RvcnlQcm9wcyxcbn0gZnJvbSBcIi4vQXBpR2F0ZXdheVYySHR0cEFwaU1ldHJpY0ZhY3RvcnlcIjtcbmltcG9ydCB7XG4gIEFsYXJtRmFjdG9yeSxcbiAgQmFzZU1vbml0b3JpbmdQcm9wcyxcbiAgQ291bnRBeGlzRnJvbVplcm8sXG4gIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCxcbiAgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQsXG4gIEVycm9yQWxhcm1GYWN0b3J5LFxuICBFcnJvckNvdW50VGhyZXNob2xkLFxuICBFcnJvclJhdGVUaHJlc2hvbGQsXG4gIEVycm9yVHlwZSxcbiAgSGlnaFRwc1RocmVzaG9sZCxcbiAgTGF0ZW5jeUFsYXJtRmFjdG9yeSxcbiAgTGF0ZW5jeVRocmVzaG9sZCxcbiAgTGF0ZW5jeVR5cGUsXG4gIExvd1Rwc1RocmVzaG9sZCxcbiAgTWV0cmljV2l0aEFsYXJtU3VwcG9ydCxcbiAgTW9uaXRvcmluZyxcbiAgTW9uaXRvcmluZ1Njb3BlLFxuICBRdWFydGVyV2lkdGgsXG4gIFJhdGVBeGlzRnJvbVplcm8sXG4gIFJhdGVDb21wdXRhdGlvbk1ldGhvZCxcbiAgVGhpcmRXaWR0aCxcbiAgVGltZUF4aXNNaWxsaXNGcm9tWmVybyxcbiAgVHBzQWxhcm1GYWN0b3J5LFxufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1xuICBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0LFxuICBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3ksXG59IGZyb20gXCIuLi8uLi9kYXNoYm9hcmRcIjtcblxuY29uc3QgRGVmYXVsdExhdGVuY3lUeXBlc1RvUmVuZGVyID0gW1xuICBMYXRlbmN5VHlwZS5QNTAsXG4gIExhdGVuY3lUeXBlLlA5MCxcbiAgTGF0ZW5jeVR5cGUuUDk5LFxuXTtcblxuZXhwb3J0IGludGVyZmFjZSBBcGlHYXRld2F5VjJNb25pdG9yaW5nT3B0aW9ucyBleHRlbmRzIEJhc2VNb25pdG9yaW5nUHJvcHMge1xuICByZWFkb25seSBhZGQ0eHhDb3VudEFsYXJtPzogUmVjb3JkPHN0cmluZywgRXJyb3JDb3VudFRocmVzaG9sZD47XG4gIHJlYWRvbmx5IGFkZDR4eFJhdGVBbGFybT86IFJlY29yZDxzdHJpbmcsIEVycm9yUmF0ZVRocmVzaG9sZD47XG4gIHJlYWRvbmx5IGFkZDV4eENvdW50QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBFcnJvckNvdW50VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkNXh4UmF0ZUFsYXJtPzogUmVjb3JkPHN0cmluZywgRXJyb3JSYXRlVGhyZXNob2xkPjtcblxuICByZWFkb25seSBhZGRMYXRlbmN5UDUwQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkTGF0ZW5jeVA3MEFsYXJtPzogUmVjb3JkPHN0cmluZywgTGF0ZW5jeVRocmVzaG9sZD47XG4gIHJlYWRvbmx5IGFkZExhdGVuY3lQOTBBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRMYXRlbmN5UDk1QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkTGF0ZW5jeVA5OUFsYXJtPzogUmVjb3JkPHN0cmluZywgTGF0ZW5jeVRocmVzaG9sZD47XG4gIHJlYWRvbmx5IGFkZExhdGVuY3lQOTk5QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkTGF0ZW5jeVA5OTk5QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkTGF0ZW5jeVAxMDBBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuXG4gIHJlYWRvbmx5IGFkZExhdGVuY3lUTTUwQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkTGF0ZW5jeVRNNzBBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRMYXRlbmN5VE05MEFsYXJtPzogUmVjb3JkPHN0cmluZywgTGF0ZW5jeVRocmVzaG9sZD47XG4gIHJlYWRvbmx5IGFkZExhdGVuY3lUTTk1QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkTGF0ZW5jeVRNOTlBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRMYXRlbmN5VE05OTlBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRMYXRlbmN5VE05OTk5QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcblxuICByZWFkb25seSBhZGRMYXRlbmN5VE05NU91dGxpZXJBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRMYXRlbmN5VE05OU91dGxpZXJBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRMYXRlbmN5VE05OTlPdXRsaWVyQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkTGF0ZW5jeVRNOTk5OU91dGxpZXJBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuXG4gIHJlYWRvbmx5IGFkZExhdGVuY3lBdmVyYWdlQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcblxuICByZWFkb25seSBhZGRJbnRlZ3JhdGlvbkxhdGVuY3lQNTBBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRJbnRlZ3JhdGlvbkxhdGVuY3lQNzBBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRJbnRlZ3JhdGlvbkxhdGVuY3lQOTBBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRJbnRlZ3JhdGlvbkxhdGVuY3lQOTVBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRJbnRlZ3JhdGlvbkxhdGVuY3lQOTlBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRJbnRlZ3JhdGlvbkxhdGVuY3lQOTk5QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkSW50ZWdyYXRpb25MYXRlbmN5UDk5OTlBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRJbnRlZ3JhdGlvbkxhdGVuY3lQMTAwQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcblxuICByZWFkb25seSBhZGRJbnRlZ3JhdGlvbkxhdGVuY3lUTTUwQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkSW50ZWdyYXRpb25MYXRlbmN5VE03MEFsYXJtPzogUmVjb3JkPHN0cmluZywgTGF0ZW5jeVRocmVzaG9sZD47XG4gIHJlYWRvbmx5IGFkZEludGVncmF0aW9uTGF0ZW5jeVRNOTBBbGFybT86IFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRJbnRlZ3JhdGlvbkxhdGVuY3lUTTk1QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkSW50ZWdyYXRpb25MYXRlbmN5VE05OUFsYXJtPzogUmVjb3JkPHN0cmluZywgTGF0ZW5jeVRocmVzaG9sZD47XG4gIHJlYWRvbmx5IGFkZEludGVncmF0aW9uTGF0ZW5jeVRNOTk5QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkSW50ZWdyYXRpb25MYXRlbmN5VE05OTk5QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPjtcblxuICByZWFkb25seSBhZGRJbnRlZ3JhdGlvbkxhdGVuY3lUTTk1T3V0bGllckFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBMYXRlbmN5VGhyZXNob2xkXG4gID47XG4gIHJlYWRvbmx5IGFkZEludGVncmF0aW9uTGF0ZW5jeVRNOTlPdXRsaWVyQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIExhdGVuY3lUaHJlc2hvbGRcbiAgPjtcbiAgcmVhZG9ubHkgYWRkSW50ZWdyYXRpb25MYXRlbmN5VE05OTlPdXRsaWVyQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIExhdGVuY3lUaHJlc2hvbGRcbiAgPjtcbiAgcmVhZG9ubHkgYWRkSW50ZWdyYXRpb25MYXRlbmN5VE05OTk5T3V0bGllckFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBMYXRlbmN5VGhyZXNob2xkXG4gID47XG5cbiAgcmVhZG9ubHkgYWRkSW50ZWdyYXRpb25MYXRlbmN5QXZlcmFnZUFsYXJtPzogUmVjb3JkPHN0cmluZywgTGF0ZW5jeVRocmVzaG9sZD47XG5cbiAgcmVhZG9ubHkgYWRkTG93VHBzQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBMb3dUcHNUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRIaWdoVHBzQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBIaWdoVHBzVGhyZXNob2xkPjtcblxuICAvKipcbiAgICogWW91IGNhbiBzcGVjaWZ5IHdoYXQgbGF0ZW5jeSB0eXBlcyB5b3Ugd2FudCB0byBiZSByZW5kZXJlZCBpbiB0aGUgZGFzaGJvYXJkcy5cbiAgICogTm90ZTogYW55IGxhdGVuY3kgdHlwZSB3aXRoIGFuIGFsYXJtIHdpbGwgYmUgYWxzbyBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKiBJZiB0aGUgbGlzdCBpcyB1bmRlZmluZWQsIGRlZmF1bHQgdmFsdWVzIHdpbGwgYmUgc2hvd24uXG4gICAqIElmIHRoZSBsaXN0IGlzIGVtcHR5LCBvbmx5IHRoZSBsYXRlbmN5IHR5cGVzIHdpdGggYW4gYWxhcm0gd2lsbCBiZSBzaG93biAoaWYgYW55KS5cbiAgICogQGRlZmF1bHQgLSBwNTAsIHA5MCwgcDk5IChAc2VlIERlZmF1bHRMYXRlbmN5VHlwZXNTaG93bilcbiAgICovXG4gIHJlYWRvbmx5IGxhdGVuY3lUeXBlc1RvUmVuZGVyPzogTGF0ZW5jeVR5cGVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcGlHYXRld2F5VjJIdHRwQXBpTW9uaXRvcmluZ1Byb3BzXG4gIGV4dGVuZHMgQXBpR2F0ZXdheVYySHR0cEFwaU1ldHJpY0ZhY3RvcnlQcm9wcyxcbiAgICBBcGlHYXRld2F5VjJNb25pdG9yaW5nT3B0aW9ucyB7fVxuXG5leHBvcnQgY2xhc3MgQXBpR2F0ZXdheVYySHR0cEFwaU1vbml0b3JpbmcgZXh0ZW5kcyBNb25pdG9yaW5nIHtcbiAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcblxuICByZWFkb25seSBhbGFybUZhY3Rvcnk6IEFsYXJtRmFjdG9yeTtcbiAgcmVhZG9ubHkgZXJyb3JBbGFybUZhY3Rvcnk6IEVycm9yQWxhcm1GYWN0b3J5O1xuICByZWFkb25seSB0cHNBbGFybUZhY3Rvcnk6IFRwc0FsYXJtRmFjdG9yeTtcbiAgcmVhZG9ubHkgbGF0ZW5jeUFsYXJtRmFjdG9yeTogTGF0ZW5jeUFsYXJtRmFjdG9yeTtcblxuICByZWFkb25seSB0cHNBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcbiAgcmVhZG9ubHkgbGF0ZW5jeUFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuICByZWFkb25seSBlcnJvckNvdW50QW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG4gIHJlYWRvbmx5IGVycm9yUmF0ZUFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuXG4gIHJlYWRvbmx5IHRwc01ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgZXJyb3I0eHhDb3VudE1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgZXJyb3I0eHhSYXRlTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBlcnJvcjV4eENvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBlcnJvcjV4eFJhdGVNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG5cbiAgLy8ga2V5cyBhcmUgTGF0ZW5jeVR5cGUsIGJ1dCBKU0lJIGRvZXNuJ3QgbGlrZSBub24tc3RyaW5nIHR5cGVzXG4gIHJlYWRvbmx5IGxhdGVuY3lNZXRyaWNzOiBSZWNvcmQ8c3RyaW5nLCBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0PjtcbiAgcmVhZG9ubHkgaW50ZWdyYXRpb25MYXRlbmN5TWV0cmljczogUmVjb3JkPHN0cmluZywgTWV0cmljV2l0aEFsYXJtU3VwcG9ydD47XG4gIHJlYWRvbmx5IGxhdGVuY3lUeXBlc1RvUmVuZGVyOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogTW9uaXRvcmluZ1Njb3BlLFxuICAgIHByb3BzOiBBcGlHYXRld2F5VjJIdHRwQXBpTW9uaXRvcmluZ1Byb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgcHJvcHMpO1xuXG4gICAgLy8gdXNlZCB3aGVuIGh1bWFuUmVhZGFibGVOYW1lIGlzIG5vdCBwcm92aWRlZCBieSB1c2VyXG4gICAgY29uc3QgZmFsbGJhY2tOYW1lQXJyYXkgPSBbcHJvcHMuYXBpLmFwaUlkXTtcbiAgICBmYWxsYmFja05hbWVBcnJheS5wdXNoKHByb3BzLmFwaVN0YWdlID8/IFwiJGRlZmF1bHRcIik7XG4gICAgaWYgKHByb3BzLmFwaU1ldGhvZCkge1xuICAgICAgZmFsbGJhY2tOYW1lQXJyYXkucHVzaChwcm9wcy5hcGlNZXRob2QpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuYXBpUmVzb3VyY2UpIHtcbiAgICAgIGZhbGxiYWNrTmFtZUFycmF5LnB1c2gocHJvcHMuYXBpUmVzb3VyY2UpO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWluZ1N0cmF0ZWd5ID0gbmV3IE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIG5hbWVkQ29uc3RydWN0OiBwcm9wcy5hcGksXG4gICAgICBmYWxsYmFja0NvbnN0cnVjdE5hbWU6IGZhbGxiYWNrTmFtZUFycmF5XG4gICAgICAgIC5qb2luKFwiLVwiKVxuICAgICAgICAucmVwbGFjZSgvW15hLXpBLVowLTktX10vZywgXCJcIiksXG4gICAgICBodW1hblJlYWRhYmxlTmFtZTogcHJvcHMuaHVtYW5SZWFkYWJsZU5hbWUgPz8gZmFsbGJhY2tOYW1lQXJyYXkuam9pbihcIiBcIiksXG4gICAgfSk7XG5cbiAgICB0aGlzLnRpdGxlID0gbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUh1bWFuUmVhZGFibGVOYW1lKCk7XG5cbiAgICB0aGlzLmFsYXJtRmFjdG9yeSA9IHRoaXMuY3JlYXRlQWxhcm1GYWN0b3J5KFxuICAgICAgbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUFsYXJtRnJpZW5kbHlOYW1lKCksXG4gICAgKTtcblxuICAgIHRoaXMuZXJyb3JBbGFybUZhY3RvcnkgPSBuZXcgRXJyb3JBbGFybUZhY3RvcnkodGhpcy5hbGFybUZhY3RvcnkpO1xuICAgIHRoaXMudHBzQWxhcm1GYWN0b3J5ID0gbmV3IFRwc0FsYXJtRmFjdG9yeSh0aGlzLmFsYXJtRmFjdG9yeSk7XG4gICAgdGhpcy5sYXRlbmN5QWxhcm1GYWN0b3J5ID0gbmV3IExhdGVuY3lBbGFybUZhY3RvcnkodGhpcy5hbGFybUZhY3RvcnkpO1xuXG4gICAgdGhpcy50cHNBbm5vdGF0aW9ucyA9IFtdO1xuICAgIHRoaXMubGF0ZW5jeUFubm90YXRpb25zID0gW107XG4gICAgdGhpcy5lcnJvckNvdW50QW5ub3RhdGlvbnMgPSBbXTtcbiAgICB0aGlzLmVycm9yUmF0ZUFubm90YXRpb25zID0gW107XG5cbiAgICBjb25zdCBtZXRyaWNGYWN0b3J5ID0gbmV3IEFwaUdhdGV3YXlWMkh0dHBBcGlNZXRyaWNGYWN0b3J5KFxuICAgICAgc2NvcGUuY3JlYXRlTWV0cmljRmFjdG9yeSgpLFxuICAgICAgcHJvcHMsXG4gICAgKTtcblxuICAgIHRoaXMudHBzTWV0cmljID0gbWV0cmljRmFjdG9yeS5tZXRyaWNJbnZvY2F0aW9uUmF0ZShcbiAgICAgIFJhdGVDb21wdXRhdGlvbk1ldGhvZC5QRVJfU0VDT05ELFxuICAgICk7XG5cbiAgICB0aGlzLmxhdGVuY3lNZXRyaWNzID0ge307XG4gICAgdGhpcy5pbnRlZ3JhdGlvbkxhdGVuY3lNZXRyaWNzID0ge307XG4gICAgdGhpcy5sYXRlbmN5VHlwZXNUb1JlbmRlciA9IFtcbiAgICAgIC4uLihwcm9wcy5sYXRlbmN5VHlwZXNUb1JlbmRlciA/PyBEZWZhdWx0TGF0ZW5jeVR5cGVzVG9SZW5kZXIpLFxuICAgIF07XG5cbiAgICB0aGlzLmVycm9yNHh4Q291bnRNZXRyaWMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpYzR4eENvdW50KCk7XG4gICAgdGhpcy5lcnJvcjR4eFJhdGVNZXRyaWMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpYzR4eFJhdGUoKTtcblxuICAgIHRoaXMuZXJyb3I1eHhDb3VudE1ldHJpYyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljNXh4Q291bnQoKTtcbiAgICB0aGlzLmVycm9yNXh4UmF0ZU1ldHJpYyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljNXh4UmF0ZSgpO1xuXG4gICAgY29uc3QgbGF0ZW5jeUFsYXJtRGVmaW5pdGlvbnMgPSB7XG4gICAgICBbTGF0ZW5jeVR5cGUuUDUwXTogcHJvcHMuYWRkTGF0ZW5jeVA1MEFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLlA3MF06IHByb3BzLmFkZExhdGVuY3lQNzBBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5QOTBdOiBwcm9wcy5hZGRMYXRlbmN5UDkwQWxhcm0sXG4gICAgICBbTGF0ZW5jeVR5cGUuUDk1XTogcHJvcHMuYWRkTGF0ZW5jeVA5NUFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLlA5OV06IHByb3BzLmFkZExhdGVuY3lQOTlBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5QOTk5XTogcHJvcHMuYWRkTGF0ZW5jeVA5OTlBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5QOTk5OV06IHByb3BzLmFkZExhdGVuY3lQOTk5OUFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLlAxMDBdOiBwcm9wcy5hZGRMYXRlbmN5UDEwMEFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLlRNNTBdOiBwcm9wcy5hZGRMYXRlbmN5VE01MEFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLlRNNzBdOiBwcm9wcy5hZGRMYXRlbmN5VE03MEFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLlRNOTBdOiBwcm9wcy5hZGRMYXRlbmN5VE05MEFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLlRNOTVdOiBwcm9wcy5hZGRMYXRlbmN5VE05NUFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLlRNOTldOiBwcm9wcy5hZGRMYXRlbmN5VE05OUFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLlRNOTk5XTogcHJvcHMuYWRkTGF0ZW5jeVRNOTk5QWxhcm0sXG4gICAgICBbTGF0ZW5jeVR5cGUuVE05OTk5XTogcHJvcHMuYWRkTGF0ZW5jeVRNOTk5OUFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLlRNOTVfVE9QXTogcHJvcHMuYWRkTGF0ZW5jeVRNOTVPdXRsaWVyQWxhcm0sXG4gICAgICBbTGF0ZW5jeVR5cGUuVE05OV9UT1BdOiBwcm9wcy5hZGRMYXRlbmN5VE05OU91dGxpZXJBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5UTTk5OV9UT1BdOiBwcm9wcy5hZGRMYXRlbmN5VE05OTlPdXRsaWVyQWxhcm0sXG4gICAgICBbTGF0ZW5jeVR5cGUuVE05OTk5X1RPUF06IHByb3BzLmFkZExhdGVuY3lUTTk5OU91dGxpZXJBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5BVkVSQUdFXTogcHJvcHMuYWRkTGF0ZW5jeUF2ZXJhZ2VBbGFybSxcbiAgICB9O1xuXG4gICAgY29uc3QgaW50ZWdyYXRpb25MYXRlbmN5QWxhcm1EZWZpbml0aW9ucyA9IHtcbiAgICAgIFtMYXRlbmN5VHlwZS5QNTBdOiBwcm9wcy5hZGRJbnRlZ3JhdGlvbkxhdGVuY3lQNTBBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5QNzBdOiBwcm9wcy5hZGRJbnRlZ3JhdGlvbkxhdGVuY3lQNzBBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5QOTBdOiBwcm9wcy5hZGRJbnRlZ3JhdGlvbkxhdGVuY3lQOTBBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5QOTVdOiBwcm9wcy5hZGRJbnRlZ3JhdGlvbkxhdGVuY3lQOTVBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5QOTldOiBwcm9wcy5hZGRJbnRlZ3JhdGlvbkxhdGVuY3lQOTlBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5QOTk5XTogcHJvcHMuYWRkSW50ZWdyYXRpb25MYXRlbmN5UDk5OUFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLlA5OTk5XTogcHJvcHMuYWRkSW50ZWdyYXRpb25MYXRlbmN5UDk5OTlBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5QMTAwXTogcHJvcHMuYWRkSW50ZWdyYXRpb25MYXRlbmN5UDEwMEFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLlRNNTBdOiBwcm9wcy5hZGRJbnRlZ3JhdGlvbkxhdGVuY3lUTTUwQWxhcm0sXG4gICAgICBbTGF0ZW5jeVR5cGUuVE03MF06IHByb3BzLmFkZEludGVncmF0aW9uTGF0ZW5jeVRNNzBBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5UTTkwXTogcHJvcHMuYWRkSW50ZWdyYXRpb25MYXRlbmN5VE05MEFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLlRNOTVdOiBwcm9wcy5hZGRJbnRlZ3JhdGlvbkxhdGVuY3lUTTk1QWxhcm0sXG4gICAgICBbTGF0ZW5jeVR5cGUuVE05OV06IHByb3BzLmFkZEludGVncmF0aW9uTGF0ZW5jeVRNOTlBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5UTTk5OV06IHByb3BzLmFkZEludGVncmF0aW9uTGF0ZW5jeVRNOTk5QWxhcm0sXG4gICAgICBbTGF0ZW5jeVR5cGUuVE05OTk5XTogcHJvcHMuYWRkSW50ZWdyYXRpb25MYXRlbmN5VE05OTk5QWxhcm0sXG4gICAgICBbTGF0ZW5jeVR5cGUuVE05NV9UT1BdOiBwcm9wcy5hZGRJbnRlZ3JhdGlvbkxhdGVuY3lUTTk1T3V0bGllckFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLlRNOTlfVE9QXTogcHJvcHMuYWRkSW50ZWdyYXRpb25MYXRlbmN5VE05OU91dGxpZXJBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5UTTk5OV9UT1BdOiBwcm9wcy5hZGRJbnRlZ3JhdGlvbkxhdGVuY3lUTTk5OU91dGxpZXJBbGFybSxcbiAgICAgIFtMYXRlbmN5VHlwZS5UTTk5OTlfVE9QXTogcHJvcHMuYWRkSW50ZWdyYXRpb25MYXRlbmN5VE05OTk5T3V0bGllckFsYXJtLFxuICAgICAgW0xhdGVuY3lUeXBlLkFWRVJBR0VdOiBwcm9wcy5hZGRJbnRlZ3JhdGlvbkxhdGVuY3lBdmVyYWdlQWxhcm0sXG4gICAgfTtcblxuICAgIE9iamVjdC52YWx1ZXMoTGF0ZW5jeVR5cGUpLmZvckVhY2goKGxhdGVuY3lUeXBlKSA9PiB7XG4gICAgICB0aGlzLmxhdGVuY3lNZXRyaWNzW2xhdGVuY3lUeXBlXSA9XG4gICAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljTGF0ZW5jeUluTWlsbGlzKGxhdGVuY3lUeXBlKTtcbiAgICAgIHRoaXMuaW50ZWdyYXRpb25MYXRlbmN5TWV0cmljc1tsYXRlbmN5VHlwZV0gPVxuICAgICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY0ludGVncmF0aW9uTGF0ZW5jeUluTWlsbGlzKGxhdGVuY3lUeXBlKTtcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgW2xhdGVuY3lUeXBlLCBhbGFybURlZmluaXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgbGF0ZW5jeUFsYXJtRGVmaW5pdGlvbnMsXG4gICAgKSkge1xuICAgICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIGFsYXJtRGVmaW5pdGlvbikge1xuICAgICAgICBjb25zdCBhbGFybVByb3BzID0gYWxhcm1EZWZpbml0aW9uW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgICBjb25zdCBsYXRlbmN5VHlwZUVudW0gPSBsYXRlbmN5VHlwZSBhcyBMYXRlbmN5VHlwZTtcbiAgICAgICAgY29uc3QgbWV0cmljID0gdGhpcy5sYXRlbmN5TWV0cmljc1tsYXRlbmN5VHlwZUVudW1dO1xuICAgICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmxhdGVuY3lBbGFybUZhY3RvcnkuYWRkTGF0ZW5jeUFsYXJtKFxuICAgICAgICAgIG1ldHJpYyxcbiAgICAgICAgICBsYXRlbmN5VHlwZUVudW0sXG4gICAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmxhdGVuY3lBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgICAgdGhpcy5sYXRlbmN5VHlwZXNUb1JlbmRlci5wdXNoKGxhdGVuY3lUeXBlRW51bSk7XG4gICAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtsYXRlbmN5VHlwZSwgYWxhcm1EZWZpbml0aW9uXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgIGludGVncmF0aW9uTGF0ZW5jeUFsYXJtRGVmaW5pdGlvbnMsXG4gICAgKSkge1xuICAgICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIGFsYXJtRGVmaW5pdGlvbikge1xuICAgICAgICBjb25zdCBhbGFybVByb3BzID0gYWxhcm1EZWZpbml0aW9uW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgICBjb25zdCBsYXRlbmN5VHlwZUVudW0gPSBsYXRlbmN5VHlwZSBhcyBMYXRlbmN5VHlwZTtcbiAgICAgICAgY29uc3QgbWV0cmljID0gdGhpcy5pbnRlZ3JhdGlvbkxhdGVuY3lNZXRyaWNzW2xhdGVuY3lUeXBlRW51bV07XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9XG4gICAgICAgICAgdGhpcy5sYXRlbmN5QWxhcm1GYWN0b3J5LmFkZEludGVncmF0aW9uTGF0ZW5jeUFsYXJtKFxuICAgICAgICAgICAgbWV0cmljLFxuICAgICAgICAgICAgbGF0ZW5jeVR5cGVFbnVtLFxuICAgICAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sYXRlbmN5QW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICAgIHRoaXMubGF0ZW5jeVR5cGVzVG9SZW5kZXIucHVzaChsYXRlbmN5VHlwZUVudW0pO1xuICAgICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZDR4eENvdW50QWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGQ0eHhDb3VudEFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy5lcnJvckFsYXJtRmFjdG9yeS5hZGRFcnJvckNvdW50QWxhcm0oXG4gICAgICAgIHRoaXMuZXJyb3I0eHhDb3VudE1ldHJpYyxcbiAgICAgICAgRXJyb3JUeXBlLkVSUk9SLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZXJyb3JDb3VudEFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGQ0eHhSYXRlQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGQ0eHhSYXRlQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmVycm9yQWxhcm1GYWN0b3J5LmFkZEVycm9yUmF0ZUFsYXJtKFxuICAgICAgICB0aGlzLmVycm9yNHh4UmF0ZU1ldHJpYyxcbiAgICAgICAgRXJyb3JUeXBlLkVSUk9SLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZXJyb3JSYXRlQW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZDV4eENvdW50QWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGQ1eHhDb3VudEFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy5lcnJvckFsYXJtRmFjdG9yeS5hZGRFcnJvckNvdW50QWxhcm0oXG4gICAgICAgIHRoaXMuZXJyb3I1eHhDb3VudE1ldHJpYyxcbiAgICAgICAgRXJyb3JUeXBlLkZBVUxULFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZXJyb3JDb3VudEFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGQ1eHhSYXRlQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGQ1eHhSYXRlQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmVycm9yQWxhcm1GYWN0b3J5LmFkZEVycm9yUmF0ZUFsYXJtKFxuICAgICAgICB0aGlzLmVycm9yNXh4UmF0ZU1ldHJpYyxcbiAgICAgICAgRXJyb3JUeXBlLkZBVUxULFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZXJyb3JSYXRlQW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZExvd1Rwc0FsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkTG93VHBzQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLnRwc0FsYXJtRmFjdG9yeS5hZGRNaW5UcHNBbGFybShcbiAgICAgICAgdGhpcy50cHNNZXRyaWMsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy50cHNBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkSGlnaFRwc0FsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkSGlnaFRwc0FsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy50cHNBbGFybUZhY3RvcnkuYWRkTWF4VHBzQWxhcm0oXG4gICAgICAgIHRoaXMudHBzTWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMudHBzQW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuXG4gICAgcHJvcHMudXNlQ3JlYXRlZEFsYXJtcz8uY29uc3VtZSh0aGlzLmNyZWF0ZWRBbGFybXMoKSk7XG4gIH1cblxuICBzdW1tYXJ5V2lkZ2V0cygpOiBJV2lkZ2V0W10ge1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLmNyZWF0ZVRpdGxlV2lkZ2V0KCksXG4gICAgICB0aGlzLmNyZWF0ZVRwc1dpZGdldChUaGlyZFdpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgICB0aGlzLmNyZWF0ZUxhdGVuY3lXaWRnZXQoVGhpcmRXaWR0aCwgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQpLFxuICAgICAgdGhpcy5jcmVhdGVFcnJvclJhdGVXaWRnZXQoVGhpcmRXaWR0aCwgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQpLFxuICAgIF07XG4gIH1cblxuICB3aWRnZXRzKCk6IElXaWRnZXRbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuY3JlYXRlVGl0bGVXaWRnZXQoKSxcbiAgICAgIHRoaXMuY3JlYXRlVHBzV2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgIHRoaXMuY3JlYXRlTGF0ZW5jeVdpZGdldChRdWFydGVyV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICB0aGlzLmNyZWF0ZUVycm9yQ291bnRXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgdGhpcy5jcmVhdGVFcnJvclJhdGVXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgIF07XG4gIH1cblxuICBjcmVhdGVUaXRsZVdpZGdldCgpIHtcbiAgICByZXR1cm4gbmV3IE1vbml0b3JpbmdIZWFkZXJXaWRnZXQoe1xuICAgICAgZmFtaWx5OiBcIkFQSSBHYXRld2F5IFYyIEhUVFAgRW5kcG9pbnRcIixcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlVHBzV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIlRQU1wiLFxuICAgICAgbGVmdDogW3RoaXMudHBzTWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogUmF0ZUF4aXNGcm9tWmVybyxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy50cHNBbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUxhdGVuY3lXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBjb25zdCBsZWZ0OiBJTWV0cmljW10gPSBbXTtcblxuICAgIEFycmF5LmZyb20obmV3IFNldCh0aGlzLmxhdGVuY3lUeXBlc1RvUmVuZGVyKSlcbiAgICAgIC5zb3J0KClcbiAgICAgIC5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgICAgIGxlZnQucHVzaCh0aGlzLmxhdGVuY3lNZXRyaWNzW3R5cGVdKTtcbiAgICAgICAgbGVmdC5wdXNoKHRoaXMuaW50ZWdyYXRpb25MYXRlbmN5TWV0cmljc1t0eXBlXSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJMYXRlbmN5XCIsXG4gICAgICBsZWZ0LFxuICAgICAgbGVmdFlBeGlzOiBUaW1lQXhpc01pbGxpc0Zyb21aZXJvLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLmxhdGVuY3lBbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUVycm9yQ291bnRXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiRXJyb3JzXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5lcnJvcjR4eENvdW50TWV0cmljLCB0aGlzLmVycm9yNXh4Q291bnRNZXRyaWNdLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLmVycm9yQ291bnRBbm5vdGF0aW9ucyxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVFcnJvclJhdGVXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiRXJyb3JzIChyYXRlKVwiLFxuICAgICAgbGVmdDogW3RoaXMuZXJyb3I0eHhSYXRlTWV0cmljLCB0aGlzLmVycm9yNXh4UmF0ZU1ldHJpY10sXG4gICAgICBsZWZ0WUF4aXM6IFJhdGVBeGlzRnJvbVplcm8sXG4gICAgICBsZWZ0QW5ub3RhdGlvbnM6IHRoaXMuZXJyb3JSYXRlQW5ub3RhdGlvbnMsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==