@cdklabs/multi-az-observability 0.0.1-alpha.6 → 0.0.1-alpha.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +2826 -1008
- package/.jsii.tabl.json +1 -0
- package/API.md +5406 -1585
- package/README.md +176 -152
- package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.d.ts +18 -14
- package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.js +98 -60
- package/lib/alarmsandrules/BaseOperationRegionalAlarmsAndRules.d.ts +3 -3
- package/lib/alarmsandrules/BaseOperationRegionalAlarmsAndRules.js +2 -2
- package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.d.ts +6 -15
- package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.js +2 -10
- package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.d.ts +11 -3
- package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.js +29 -13
- package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.d.ts +0 -8
- package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.js +1 -1
- package/lib/alarmsandrules/IOperationAlarmsAndRules.d.ts +26 -23
- package/lib/alarmsandrules/IOperationAlarmsAndRules.js +1 -1
- package/lib/alarmsandrules/IServerSideOperationRegionalAlarmsAndRules.js +1 -1
- package/lib/alarmsandrules/IServiceAlarmsAndRules.d.ts +19 -15
- package/lib/alarmsandrules/IServiceAlarmsAndRules.js +1 -1
- package/lib/alarmsandrules/OperationAlarmsAndRules.d.ts +21 -18
- package/lib/alarmsandrules/OperationAlarmsAndRules.js +60 -72
- package/lib/alarmsandrules/ServerSideOperationRegionalAlarmsAndRules.d.ts +5 -5
- package/lib/alarmsandrules/ServerSideOperationRegionalAlarmsAndRules.js +2 -3
- package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.d.ts +21 -13
- package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.js +48 -29
- package/lib/alarmsandrules/ServiceAlarmsAndRules.d.ts +19 -15
- package/lib/alarmsandrules/ServiceAlarmsAndRules.js +34 -136
- package/lib/alarmsandrules/props/BaseOperationRegionalAlarmsAndRulesProps.d.ts +4 -3
- package/lib/alarmsandrules/props/BaseOperationRegionalAlarmsAndRulesProps.js +1 -1
- package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.d.ts +6 -44
- package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.js +1 -1
- package/lib/alarmsandrules/props/OperationAlarmsAndRulesProps.d.ts +39 -7
- package/lib/alarmsandrules/props/OperationAlarmsAndRulesProps.js +1 -1
- package/lib/azmapper/AvailabilityZoneMapper.js +8 -9
- package/lib/basic_observability/BasicServiceDashboard.d.ts +0 -3
- package/lib/basic_observability/BasicServiceDashboard.js +24 -112
- package/lib/basic_observability/BasicServiceMultiAZObservability.d.ts +8 -9
- package/lib/basic_observability/BasicServiceMultiAZObservability.js +97 -349
- package/lib/basic_observability/props/ApplicationLoadBalancerDetectionProps.d.ts +66 -0
- package/lib/basic_observability/props/ApplicationLoadBalancerDetectionProps.js +3 -0
- package/lib/basic_observability/props/BasicServiceDashboardProps.d.ts +27 -13
- package/lib/basic_observability/props/BasicServiceDashboardProps.js +1 -1
- package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.d.ts +10 -44
- package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.js +1 -1
- package/lib/basic_observability/props/NatGatewayDetectionProps.d.ts +31 -0
- package/lib/basic_observability/props/NatGatewayDetectionProps.js +3 -0
- package/lib/canaries/CanaryFunction.js +14 -13
- package/lib/canaries/CanaryTest.js +4 -4
- package/lib/canaries/src/canary.zip +0 -0
- package/lib/dashboards/ContributorInsightsWidget.d.ts +1 -1
- package/lib/dashboards/ContributorInsightsWidget.js +13 -17
- package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.d.ts +2 -6
- package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.js +436 -510
- package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.d.ts +2 -10
- package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.js +420 -416
- package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.d.ts +3 -66
- package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.js +1 -1
- package/lib/dashboards/props/OperationAvailabilityWidgetProps.d.ts +7 -2
- package/lib/dashboards/props/OperationAvailabilityWidgetProps.js +1 -1
- package/lib/dashboards/props/OperationLatencyWidgetProps.d.ts +7 -2
- package/lib/dashboards/props/OperationLatencyWidgetProps.js +1 -1
- package/lib/dashboards/props/ServiceAvailabilityAndLatencyDashboardProps.d.ts +8 -8
- package/lib/dashboards/props/ServiceAvailabilityAndLatencyDashboardProps.js +1 -1
- package/lib/index.d.ts +56 -25
- package/lib/index.js +37 -19
- package/lib/metrics/ApplicationLoadBalancerMetrics.d.ts +79 -2
- package/lib/metrics/ApplicationLoadBalancerMetrics.js +883 -26
- package/lib/metrics/AvailabilityAndLatencyMetrics.d.ts +23 -0
- package/lib/metrics/AvailabilityAndLatencyMetrics.js +125 -31
- package/lib/metrics/NatGatewayMetrics.d.ts +113 -0
- package/lib/metrics/NatGatewayMetrics.js +357 -0
- package/lib/metrics/RegionalAvailabilityMetrics.js +9 -10
- package/lib/metrics/RegionalLatencyMetrics.d.ts +1 -1
- package/lib/metrics/RegionalLatencyMetrics.js +27 -20
- package/lib/metrics/ZonalAvailabilityMetrics.d.ts +2 -8
- package/lib/metrics/ZonalAvailabilityMetrics.js +13 -28
- package/lib/metrics/ZonalLatencyMetrics.d.ts +2 -1
- package/lib/metrics/ZonalLatencyMetrics.js +33 -23
- package/lib/metrics/props/AvailabilityAndLatencyMetricProps.d.ts +4 -0
- package/lib/metrics/props/AvailabilityAndLatencyMetricProps.js +1 -1
- package/lib/metrics/props/LatencyMetricProps.d.ts +6 -0
- package/lib/metrics/props/LatencyMetricProps.js +1 -1
- package/lib/metrics/props/ZonalAvailabilityMetricProps.d.ts +4 -0
- package/lib/metrics/props/ZonalAvailabilityMetricProps.js +1 -1
- package/lib/metrics/props/ZonalLatencyMetricProps.d.ts +4 -0
- package/lib/metrics/props/ZonalLatencyMetricProps.js +1 -1
- package/lib/monitoring/src/monitoring-layer.zip +0 -0
- package/lib/outlier-detection/ApplicationLoadBalancerAvailabilityOutlierAlgorithm.d.ts +10 -0
- package/lib/outlier-detection/ApplicationLoadBalancerAvailabilityOutlierAlgorithm.js +15 -0
- package/lib/{basic_observability/props/ApplicationLoadBalancerLatencyOutlierCalculation.d.ts → outlier-detection/ApplicationLoadBalancerLatencyOutlierAlgorithm.d.ts} +1 -1
- package/lib/outlier-detection/ApplicationLoadBalancerLatencyOutlierAlgorithm.js +23 -0
- package/lib/outlier-detection/LatencyOutlierMetricAggregation.d.ts +22 -0
- package/lib/outlier-detection/LatencyOutlierMetricAggregation.js +27 -0
- package/lib/outlier-detection/OutlierDetectionFunction.js +7 -6
- package/lib/outlier-detection/PacketLossOutlierAlgorithm.d.ts +10 -0
- package/lib/outlier-detection/PacketLossOutlierAlgorithm.js +15 -0
- package/lib/outlier-detection/src/outlier-detection.zip +0 -0
- package/lib/outlier-detection/src/scipy-layer.zip +0 -0
- package/lib/services/CanaryMetrics.d.ts +4 -3
- package/lib/services/CanaryMetrics.js +3 -4
- package/lib/services/CanaryTestAvailabilityMetricsOverride.d.ts +21 -0
- package/lib/services/CanaryTestAvailabilityMetricsOverride.js +23 -0
- package/lib/services/CanaryTestLatencyMetricsOverride.d.ts +15 -0
- package/lib/services/CanaryTestLatencyMetricsOverride.js +20 -0
- package/lib/services/CanaryTestMetricsOverride.d.ts +1 -13
- package/lib/services/CanaryTestMetricsOverride.js +2 -4
- package/lib/services/ContributorInsightRuleDetails.js +1 -1
- package/lib/services/ICanaryMetrics.d.ts +4 -3
- package/lib/services/ICanaryMetrics.js +1 -1
- package/lib/services/ICanaryTestAvailabilityMetricsOverride.d.ts +23 -0
- package/lib/services/ICanaryTestAvailabilityMetricsOverride.js +3 -0
- package/lib/services/ICanaryTestLatencyMetricsOverride.d.ts +13 -0
- package/lib/services/ICanaryTestLatencyMetricsOverride.js +3 -0
- package/lib/services/ICanaryTestMetricsOverride.d.ts +0 -12
- package/lib/services/ICanaryTestMetricsOverride.js +1 -1
- package/lib/services/IInstrumentedServiceMultiAZObservability.d.ts +13 -3
- package/lib/services/IInstrumentedServiceMultiAZObservability.js +1 -1
- package/lib/services/IOperation.d.ts +8 -6
- package/lib/services/IOperation.js +1 -1
- package/lib/services/IOperationAvailabilityMetricDetails.d.ts +18 -0
- package/lib/services/IOperationAvailabilityMetricDetails.js +3 -0
- package/lib/services/IOperationLatencyMetricDetails.d.ts +12 -0
- package/lib/services/IOperationLatencyMetricDetails.js +3 -0
- package/lib/services/IOperationMetricDetails.d.ts +0 -12
- package/lib/services/IOperationMetricDetails.js +1 -1
- package/lib/services/IService.d.ts +18 -4
- package/lib/services/IService.js +1 -1
- package/lib/services/IServiceAvailabilityMetricDetails.d.ts +18 -0
- package/lib/services/IServiceAvailabilityMetricDetails.js +3 -0
- package/lib/services/IServiceLatencyMetricDetails.d.ts +12 -0
- package/lib/services/IServiceLatencyMetricDetails.js +3 -0
- package/lib/services/IServiceMetricDetails.d.ts +0 -12
- package/lib/services/IServiceMetricDetails.js +1 -1
- package/lib/services/InstrumentedServiceMultiAZObservability.d.ts +15 -3
- package/lib/services/InstrumentedServiceMultiAZObservability.js +252 -228
- package/lib/services/Operation.d.ts +8 -6
- package/lib/services/Operation.js +4 -3
- package/lib/services/OperationAvailabilityMetricDetails.d.ts +22 -0
- package/lib/services/OperationAvailabilityMetricDetails.js +24 -0
- package/lib/services/OperationLatencyMetricDetails.d.ts +16 -0
- package/lib/services/OperationLatencyMetricDetails.js +21 -0
- package/lib/services/OperationMetricDetails.d.ts +1 -13
- package/lib/services/OperationMetricDetails.js +2 -8
- package/lib/services/Service.d.ts +18 -4
- package/lib/services/Service.js +4 -2
- package/lib/services/ServiceAvailabilityMetricDetails.d.ts +21 -0
- package/lib/services/ServiceAvailabilityMetricDetails.js +20 -0
- package/lib/services/ServiceLatencyMetricDetails.d.ts +15 -0
- package/lib/services/ServiceLatencyMetricDetails.js +19 -0
- package/lib/services/ServiceMetricDetails.d.ts +1 -13
- package/lib/services/ServiceMetricDetails.js +2 -4
- package/lib/services/props/CanaryMetricProps.d.ts +4 -3
- package/lib/services/props/CanaryMetricProps.js +1 -1
- package/lib/services/props/CanaryTestAvailabilityMetricsOverrideProps.d.ts +22 -0
- package/lib/services/props/CanaryTestAvailabilityMetricsOverrideProps.js +3 -0
- package/lib/services/props/CanaryTestLatencyMetricsOverrideProps.d.ts +14 -0
- package/lib/services/props/CanaryTestLatencyMetricsOverrideProps.js +3 -0
- package/lib/services/props/CanaryTestMetricsOverrideProps.d.ts +0 -16
- package/lib/services/props/CanaryTestMetricsOverrideProps.js +1 -1
- package/lib/services/props/InstrumentedServiceMultiAZObservabilityProps.d.ts +50 -5
- package/lib/services/props/InstrumentedServiceMultiAZObservabilityProps.js +1 -1
- package/lib/services/props/MetricDimensions.js +1 -1
- package/lib/services/props/OperationAvailabilityMetricDetailsProps.d.ts +22 -0
- package/lib/services/props/OperationAvailabilityMetricDetailsProps.js +3 -0
- package/lib/services/props/OperationLatencyMetricDetailsProps.d.ts +14 -0
- package/lib/services/props/OperationLatencyMetricDetailsProps.js +3 -0
- package/lib/services/props/OperationMetricDetailsProps.d.ts +0 -16
- package/lib/services/props/OperationMetricDetailsProps.js +1 -1
- package/lib/services/props/OperationProps.d.ts +4 -3
- package/lib/services/props/OperationProps.js +1 -1
- package/lib/services/props/ServiceAvailabilityMetricDetailsProps.d.ts +18 -0
- package/lib/services/props/ServiceAvailabilityMetricDetailsProps.js +3 -0
- package/lib/services/props/ServiceLatencyMetricDetailsProps.d.ts +12 -0
- package/lib/services/props/ServiceLatencyMetricDetailsProps.js +3 -0
- package/lib/services/props/ServiceMetricDetailsProps.d.ts +0 -12
- package/lib/services/props/ServiceMetricDetailsProps.js +1 -1
- package/lib/services/props/ServiceProps.d.ts +18 -4
- package/lib/services/props/ServiceProps.js +1 -1
- package/lib/utilities/MetricsHelper.d.ts +17 -9
- package/lib/utilities/MetricsHelper.js +34 -10
- package/lib/utilities/MinimumUnhealthyTargets.d.ts +25 -0
- package/lib/utilities/MinimumUnhealthyTargets.js +3 -0
- package/package.json +14 -14
- package/rosetta/default.ts-fixture +72 -0
- package/rosetta/service.ts-fixture +144 -0
- package/lib/basic_observability/props/ApplicationLoadBalancerLatencyOutlierCalculation.js +0 -23
- package/lib/services/IBasicServiceMultiAZObservability.d.ts +0 -45
- package/lib/services/IBasicServiceMultiAZObservability.js +0 -3
|
@@ -9,7 +9,6 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
|
9
9
|
const constructs_1 = require("constructs");
|
|
10
10
|
const CanaryMetrics_1 = require("./CanaryMetrics");
|
|
11
11
|
const Operation_1 = require("./Operation");
|
|
12
|
-
const OperationMetricDetails_1 = require("./OperationMetricDetails");
|
|
13
12
|
const MetricDimensions_1 = require("./props/MetricDimensions");
|
|
14
13
|
const OperationAlarmsAndRules_1 = require("../alarmsandrules/OperationAlarmsAndRules");
|
|
15
14
|
const ServiceAlarmsAndRules_1 = require("../alarmsandrules/ServiceAlarmsAndRules");
|
|
@@ -21,234 +20,284 @@ const ServiceAvailabilityAndLatencyDashboard_1 = require("../dashboards/ServiceA
|
|
|
21
20
|
const OutlierDetectionFunction_1 = require("../outlier-detection/OutlierDetectionFunction");
|
|
22
21
|
const OutlierDetectionAlgorithm_1 = require("../utilities/OutlierDetectionAlgorithm");
|
|
23
22
|
const StackWithDynamicSource_1 = require("../utilities/StackWithDynamicSource");
|
|
23
|
+
const OperationAvailabilityMetricDetails_1 = require("./OperationAvailabilityMetricDetails");
|
|
24
|
+
const OperationLatencyMetricDetails_1 = require("./OperationLatencyMetricDetails");
|
|
25
|
+
const LatencyOutlierMetricAggregation_1 = require("../outlier-detection/LatencyOutlierMetricAggregation");
|
|
24
26
|
/**
|
|
25
27
|
* An service that implements its own instrumentation to record
|
|
26
28
|
* availability and latency metrics that can be used to create
|
|
27
29
|
* alarms, rules, and dashboards from
|
|
28
30
|
*/
|
|
29
31
|
class InstrumentedServiceMultiAZObservability extends constructs_1.Construct {
|
|
32
|
+
/**
|
|
33
|
+
* Sets up the canary testing function and test
|
|
34
|
+
* events
|
|
35
|
+
* @param scope
|
|
36
|
+
* @param props
|
|
37
|
+
*/
|
|
38
|
+
setupCanaryTests(scope, props) {
|
|
39
|
+
let canary = new CanaryFunction_1.CanaryFunction(scope, 'CanaryFunction', {
|
|
40
|
+
vpc: props.service.canaryTestProps.networkConfiguration?.vpc,
|
|
41
|
+
subnetSelection: props.service.canaryTestProps.networkConfiguration?.subnetSelection,
|
|
42
|
+
httpTimeout: props.service.canaryTestProps.timeout
|
|
43
|
+
? props.service.canaryTestProps.timeout
|
|
44
|
+
: aws_cdk_lib_1.Duration.seconds(2),
|
|
45
|
+
ignoreTlsErrors: props.service.canaryTestProps.ignoreTlsErrors
|
|
46
|
+
? props.service.canaryTestProps.ignoreTlsErrors
|
|
47
|
+
: false,
|
|
48
|
+
});
|
|
49
|
+
props.service.operations.forEach((operation, index) => {
|
|
50
|
+
if (operation.optOutOfServiceCreatedCanary != true) {
|
|
51
|
+
let testProps = operation.canaryTestProps
|
|
52
|
+
? operation.canaryTestProps
|
|
53
|
+
: props.service.canaryTestProps;
|
|
54
|
+
let nestedStack = new aws_cdk_lib_1.NestedStack(this, operation.operationName + 'CanaryTest', {});
|
|
55
|
+
let test = new CanaryTest_1.CanaryTest(nestedStack, operation.operationName, {
|
|
56
|
+
function: canary.function,
|
|
57
|
+
requestCount: testProps.requestCount,
|
|
58
|
+
regionalRequestCount: testProps.regionalRequestCount
|
|
59
|
+
? testProps.regionalRequestCount
|
|
60
|
+
: testProps.requestCount,
|
|
61
|
+
schedule: testProps.schedule,
|
|
62
|
+
operation: operation,
|
|
63
|
+
loadBalancer: testProps.loadBalancer,
|
|
64
|
+
headers: testProps.headers,
|
|
65
|
+
postData: testProps.postData,
|
|
66
|
+
azMapper: this.azMapper,
|
|
67
|
+
});
|
|
68
|
+
let defaultAvailabilityMetricDetails;
|
|
69
|
+
let defaultLatencyMetricDetails;
|
|
70
|
+
if (operation.canaryMetricDetails?.canaryAvailabilityMetricDetails) {
|
|
71
|
+
defaultAvailabilityMetricDetails = new OperationAvailabilityMetricDetails_1.OperationAvailabilityMetricDetails({
|
|
72
|
+
operationName: operation.operationName,
|
|
73
|
+
metricDimensions: new MetricDimensions_1.MetricDimensions({ Operation: operation.operationName }, 'AZ-ID', 'Region'),
|
|
74
|
+
alarmStatistic: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
75
|
+
.alarmStatistic,
|
|
76
|
+
datapointsToAlarm: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
77
|
+
.datapointsToAlarm,
|
|
78
|
+
evaluationPeriods: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
79
|
+
.evaluationPeriods,
|
|
80
|
+
faultAlarmThreshold: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
81
|
+
.faultAlarmThreshold,
|
|
82
|
+
faultMetricNames: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
83
|
+
.faultMetricNames,
|
|
84
|
+
graphedFaultStatistics: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
85
|
+
.graphedFaultStatistics,
|
|
86
|
+
graphedSuccessStatistics: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
87
|
+
.graphedSuccessStatistics,
|
|
88
|
+
metricNamespace: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
89
|
+
.metricNamespace,
|
|
90
|
+
period: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
91
|
+
.period,
|
|
92
|
+
successAlarmThreshold: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
93
|
+
.successAlarmThreshold,
|
|
94
|
+
successMetricNames: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
95
|
+
.successMetricNames,
|
|
96
|
+
unit: operation.canaryMetricDetails
|
|
97
|
+
.canaryAvailabilityMetricDetails.unit,
|
|
98
|
+
}, operation.service.defaultAvailabilityMetricDetails);
|
|
99
|
+
}
|
|
100
|
+
else if (operation.canaryTestAvailabilityMetricsOverride) {
|
|
101
|
+
defaultAvailabilityMetricDetails = new OperationAvailabilityMetricDetails_1.OperationAvailabilityMetricDetails({
|
|
102
|
+
operationName: operation.operationName,
|
|
103
|
+
metricNamespace: test.metricNamespace,
|
|
104
|
+
successMetricNames: ['Success'],
|
|
105
|
+
faultMetricNames: ['Fault', 'Failure'],
|
|
106
|
+
metricDimensions: new MetricDimensions_1.MetricDimensions({ Operation: operation.operationName }, 'AZ-ID', 'Region'),
|
|
107
|
+
alarmStatistic: operation.canaryTestAvailabilityMetricsOverride
|
|
108
|
+
.alarmStatistic,
|
|
109
|
+
datapointsToAlarm: operation.canaryTestAvailabilityMetricsOverride
|
|
110
|
+
.datapointsToAlarm,
|
|
111
|
+
evaluationPeriods: operation.canaryTestAvailabilityMetricsOverride
|
|
112
|
+
.evaluationPeriods,
|
|
113
|
+
faultAlarmThreshold: operation.canaryTestAvailabilityMetricsOverride
|
|
114
|
+
.faultAlarmThreshold,
|
|
115
|
+
period: operation.canaryTestAvailabilityMetricsOverride.period,
|
|
116
|
+
successAlarmThreshold: operation.canaryTestAvailabilityMetricsOverride
|
|
117
|
+
.successAlarmThreshold,
|
|
118
|
+
}, props.service.defaultAvailabilityMetricDetails);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
defaultAvailabilityMetricDetails = new OperationAvailabilityMetricDetails_1.OperationAvailabilityMetricDetails({
|
|
122
|
+
operationName: operation.operationName,
|
|
123
|
+
metricNamespace: test.metricNamespace,
|
|
124
|
+
successMetricNames: ['Success'],
|
|
125
|
+
faultMetricNames: ['Fault', 'Failure'],
|
|
126
|
+
metricDimensions: new MetricDimensions_1.MetricDimensions({ Operation: operation.operationName }, 'AZ-ID', 'Region'),
|
|
127
|
+
}, props.service.defaultAvailabilityMetricDetails);
|
|
128
|
+
}
|
|
129
|
+
if (operation.canaryMetricDetails?.canaryLatencyMetricDetails) {
|
|
130
|
+
defaultLatencyMetricDetails = new OperationLatencyMetricDetails_1.OperationLatencyMetricDetails({
|
|
131
|
+
operationName: operation.operationName,
|
|
132
|
+
metricDimensions: new MetricDimensions_1.MetricDimensions({ Operation: operation.operationName }, 'AZ-ID', 'Region'),
|
|
133
|
+
alarmStatistic: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
134
|
+
.alarmStatistic,
|
|
135
|
+
datapointsToAlarm: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
136
|
+
.datapointsToAlarm,
|
|
137
|
+
evaluationPeriods: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
138
|
+
.evaluationPeriods,
|
|
139
|
+
faultMetricNames: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
140
|
+
.faultMetricNames,
|
|
141
|
+
graphedFaultStatistics: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
142
|
+
.graphedFaultStatistics,
|
|
143
|
+
graphedSuccessStatistics: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
144
|
+
.graphedSuccessStatistics,
|
|
145
|
+
metricNamespace: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
146
|
+
.metricNamespace,
|
|
147
|
+
period: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
148
|
+
.period,
|
|
149
|
+
successAlarmThreshold: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
150
|
+
.successAlarmThreshold,
|
|
151
|
+
successMetricNames: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
152
|
+
.successMetricNames,
|
|
153
|
+
unit: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
154
|
+
.unit,
|
|
155
|
+
}, operation.service.defaultLatencyMetricDetails);
|
|
156
|
+
}
|
|
157
|
+
else if (operation.canaryTestLatencyMetricsOverride) {
|
|
158
|
+
defaultLatencyMetricDetails = new OperationLatencyMetricDetails_1.OperationLatencyMetricDetails({
|
|
159
|
+
operationName: operation.operationName,
|
|
160
|
+
metricNamespace: test.metricNamespace,
|
|
161
|
+
successMetricNames: ['SuccessLatency'],
|
|
162
|
+
faultMetricNames: ['FaultLatency'],
|
|
163
|
+
metricDimensions: new MetricDimensions_1.MetricDimensions({ Operation: operation.operationName }, 'AZ-ID', 'Region'),
|
|
164
|
+
alarmStatistic: operation.canaryTestLatencyMetricsOverride.alarmStatistic,
|
|
165
|
+
datapointsToAlarm: operation.canaryTestLatencyMetricsOverride.datapointsToAlarm,
|
|
166
|
+
evaluationPeriods: operation.canaryTestLatencyMetricsOverride.evaluationPeriods,
|
|
167
|
+
period: operation.canaryTestLatencyMetricsOverride.period,
|
|
168
|
+
successAlarmThreshold: operation.canaryTestLatencyMetricsOverride
|
|
169
|
+
.successAlarmThreshold,
|
|
170
|
+
}, props.service.defaultLatencyMetricDetails);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
defaultLatencyMetricDetails = new OperationLatencyMetricDetails_1.OperationLatencyMetricDetails({
|
|
174
|
+
operationName: operation.operationName,
|
|
175
|
+
metricNamespace: test.metricNamespace,
|
|
176
|
+
successMetricNames: ['SuccessLatency'],
|
|
177
|
+
faultMetricNames: ['FaultLatency'],
|
|
178
|
+
metricDimensions: new MetricDimensions_1.MetricDimensions({ Operation: operation.operationName }, 'AZ-ID', 'Region'),
|
|
179
|
+
}, props.service.defaultLatencyMetricDetails);
|
|
180
|
+
}
|
|
181
|
+
let newOperation = new Operation_1.Operation({
|
|
182
|
+
serverSideAvailabilityMetricDetails: operation.serverSideAvailabilityMetricDetails,
|
|
183
|
+
serverSideLatencyMetricDetails: operation.serverSideLatencyMetricDetails,
|
|
184
|
+
serverSideContributorInsightRuleDetails: operation.serverSideContributorInsightRuleDetails,
|
|
185
|
+
service: operation.service,
|
|
186
|
+
operationName: operation.operationName,
|
|
187
|
+
path: operation.path,
|
|
188
|
+
critical: operation.critical,
|
|
189
|
+
httpMethods: operation.httpMethods,
|
|
190
|
+
canaryMetricDetails: new CanaryMetrics_1.CanaryMetrics({
|
|
191
|
+
canaryAvailabilityMetricDetails: defaultAvailabilityMetricDetails,
|
|
192
|
+
canaryLatencyMetricDetails: defaultLatencyMetricDetails,
|
|
193
|
+
}),
|
|
194
|
+
});
|
|
195
|
+
props.service.operations[index] = newOperation;
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
30
199
|
constructor(scope, id, props) {
|
|
31
200
|
super(scope, id);
|
|
32
|
-
let
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
201
|
+
let availabilityOutlierDetectionAlgorithm = props.availabilityOutlierDetectionAlgorithm || OutlierDetectionAlgorithm_1.OutlierDetectionAlgorithm.STATIC;
|
|
202
|
+
let availabilityOutlierThreshold;
|
|
203
|
+
let latencyOutlierDetectionAlgorithm = props.latencyOutlierDetectionAlgorithm || OutlierDetectionAlgorithm_1.OutlierDetectionAlgorithm.STATIC;
|
|
204
|
+
let latencyOutlierThreshold;
|
|
205
|
+
// TEMP: Force outlier detection to be static until the Lambda outlier detection function is scalable
|
|
206
|
+
availabilityOutlierDetectionAlgorithm = OutlierDetectionAlgorithm_1.OutlierDetectionAlgorithm.STATIC;
|
|
207
|
+
latencyOutlierDetectionAlgorithm = OutlierDetectionAlgorithm_1.OutlierDetectionAlgorithm.STATIC;
|
|
208
|
+
availabilityOutlierThreshold = props.availabilityOutlierThreshold || 0.7;
|
|
209
|
+
latencyOutlierThreshold = props.latencyOutlierThreshold || 0.7;
|
|
210
|
+
if (props.latencyOutlierMetricAggregation == LatencyOutlierMetricAggregation_1.LatencyOutlierMetricAggregation.VALUE && latencyOutlierDetectionAlgorithm == OutlierDetectionAlgorithm_1.OutlierDetectionAlgorithm.STATIC) {
|
|
211
|
+
throw new Error("You cannot use LatencyOutlierMetric.VALUE with OutlierDetectionAlgorithm.STATIC.");
|
|
212
|
+
}
|
|
213
|
+
/*if (!props.availabilityOutlierThreshold) {
|
|
214
|
+
switch (availabilityOutlierDetectionAlgorithm) {
|
|
215
|
+
case OutlierDetectionAlgorithm.CHI_SQUARED:
|
|
216
|
+
availabilityOutlierThreshold = 0.05;
|
|
217
|
+
break;
|
|
218
|
+
case OutlierDetectionAlgorithm.IQR:
|
|
219
|
+
availabilityOutlierThreshold = 1.5;
|
|
220
|
+
break;
|
|
221
|
+
case OutlierDetectionAlgorithm.MAD:
|
|
222
|
+
availabilityOutlierThreshold = 3;
|
|
223
|
+
break;
|
|
224
|
+
case OutlierDetectionAlgorithm.STATIC:
|
|
225
|
+
availabilityOutlierThreshold = 0.7;
|
|
226
|
+
break;
|
|
227
|
+
case OutlierDetectionAlgorithm.Z_SCORE:
|
|
228
|
+
availabilityOutlierThreshold = 3;
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
51
231
|
}
|
|
52
232
|
else {
|
|
53
|
-
|
|
233
|
+
availabilityOutlierThreshold = props.availabilityOutlierThreshold;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (!props.latencyOutlierThreshold) {
|
|
237
|
+
switch (latencyOutlierDetectionAlgorithm) {
|
|
238
|
+
case OutlierDetectionAlgorithm.CHI_SQUARED:
|
|
239
|
+
latencyOutlierThreshold = 0.05;
|
|
240
|
+
break;
|
|
241
|
+
case OutlierDetectionAlgorithm.IQR:
|
|
242
|
+
latencyOutlierThreshold = 1.5;
|
|
243
|
+
break;
|
|
244
|
+
case OutlierDetectionAlgorithm.MAD:
|
|
245
|
+
latencyOutlierThreshold = 3;
|
|
246
|
+
break;
|
|
247
|
+
case OutlierDetectionAlgorithm.STATIC:
|
|
248
|
+
latencyOutlierThreshold = 0.7;
|
|
249
|
+
break;
|
|
250
|
+
case OutlierDetectionAlgorithm.Z_SCORE:
|
|
251
|
+
latencyOutlierThreshold = 3;
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
54
254
|
}
|
|
255
|
+
else {
|
|
256
|
+
latencyOutlierThreshold = props.latencyOutlierThreshold;
|
|
257
|
+
}*/
|
|
258
|
+
// Create the AZ mapper resource that all of the resources
|
|
259
|
+
// will share
|
|
55
260
|
this.azMapper = new AvailabilityZoneMapper_1.AvailabilityZoneMapper(this, 'AZMapper', {
|
|
56
261
|
availabilityZoneNames: props.service.availabilityZoneNames,
|
|
57
262
|
});
|
|
58
|
-
if
|
|
263
|
+
// Create the canary testing stack if the user provided input
|
|
264
|
+
if (props.service.canaryTestProps) {
|
|
59
265
|
let canaryStack = new StackWithDynamicSource_1.StackWithDynamicSource(this, 'Canary', {
|
|
60
266
|
assetsBucketsParameterName: props.assetsBucketParameterName,
|
|
61
267
|
assetsBucketPrefixParameterName: props.assetsBucketPrefixParameterName,
|
|
62
268
|
});
|
|
63
|
-
|
|
64
|
-
vpc: props.service.canaryTestProps.networkConfiguration?.vpc,
|
|
65
|
-
subnetSelection: props.service.canaryTestProps.networkConfiguration?.subnetSelection,
|
|
66
|
-
httpTimeout: props.service.canaryTestProps.timeout
|
|
67
|
-
? props.service.canaryTestProps.timeout
|
|
68
|
-
: aws_cdk_lib_1.Duration.seconds(2),
|
|
69
|
-
ignoreTlsErrors: props.service.canaryTestProps.ignoreTlsErrors
|
|
70
|
-
? props.service.canaryTestProps.ignoreTlsErrors
|
|
71
|
-
: false,
|
|
72
|
-
});
|
|
73
|
-
this.canaryLogGroup = canary.logGroup;
|
|
74
|
-
for (let i = 0; i < props.service.operations.length; i++) {
|
|
75
|
-
let operation = props.service.operations[i];
|
|
76
|
-
if (operation.optOutOfServiceCreatedCanary != true) {
|
|
77
|
-
let testProps = operation.canaryTestProps
|
|
78
|
-
? operation.canaryTestProps
|
|
79
|
-
: props.service.canaryTestProps;
|
|
80
|
-
let nestedStack = new aws_cdk_lib_1.NestedStack(this, operation.operationName + 'CanaryTest', {});
|
|
81
|
-
let test = new CanaryTest_1.CanaryTest(nestedStack, operation.operationName, {
|
|
82
|
-
function: canary.function,
|
|
83
|
-
requestCount: testProps.requestCount,
|
|
84
|
-
regionalRequestCount: testProps.regionalRequestCount
|
|
85
|
-
? testProps.regionalRequestCount
|
|
86
|
-
: testProps.requestCount,
|
|
87
|
-
schedule: testProps.schedule,
|
|
88
|
-
operation: operation,
|
|
89
|
-
loadBalancer: testProps.loadBalancer,
|
|
90
|
-
headers: testProps.headers,
|
|
91
|
-
postData: testProps.postData,
|
|
92
|
-
azMapper: this.azMapper,
|
|
93
|
-
});
|
|
94
|
-
let defaultAvailabilityMetricDetails;
|
|
95
|
-
let defaultLatencyMetricDetails;
|
|
96
|
-
if (operation.canaryMetricDetails?.canaryAvailabilityMetricDetails) {
|
|
97
|
-
defaultAvailabilityMetricDetails = new OperationMetricDetails_1.OperationMetricDetails({
|
|
98
|
-
operationName: operation.operationName,
|
|
99
|
-
metricDimensions: new MetricDimensions_1.MetricDimensions({ Operation: operation.operationName }, 'AZ-ID', 'Region'),
|
|
100
|
-
alarmStatistic: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
101
|
-
.alarmStatistic,
|
|
102
|
-
datapointsToAlarm: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
103
|
-
.datapointsToAlarm,
|
|
104
|
-
evaluationPeriods: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
105
|
-
.evaluationPeriods,
|
|
106
|
-
faultAlarmThreshold: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
107
|
-
.faultAlarmThreshold,
|
|
108
|
-
faultMetricNames: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
109
|
-
.faultMetricNames,
|
|
110
|
-
graphedFaultStatistics: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
111
|
-
.graphedFaultStatistics,
|
|
112
|
-
graphedSuccessStatistics: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
113
|
-
.graphedSuccessStatistics,
|
|
114
|
-
metricNamespace: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
115
|
-
.metricNamespace,
|
|
116
|
-
period: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
117
|
-
.period,
|
|
118
|
-
successAlarmThreshold: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
119
|
-
.successAlarmThreshold,
|
|
120
|
-
successMetricNames: operation.canaryMetricDetails.canaryAvailabilityMetricDetails
|
|
121
|
-
.successMetricNames,
|
|
122
|
-
unit: operation.canaryMetricDetails
|
|
123
|
-
.canaryAvailabilityMetricDetails.unit,
|
|
124
|
-
}, operation.service.defaultAvailabilityMetricDetails);
|
|
125
|
-
}
|
|
126
|
-
else if (operation.canaryTestAvailabilityMetricsOverride) {
|
|
127
|
-
defaultAvailabilityMetricDetails = new OperationMetricDetails_1.OperationMetricDetails({
|
|
128
|
-
operationName: operation.operationName,
|
|
129
|
-
metricNamespace: test.metricNamespace,
|
|
130
|
-
successMetricNames: ['Success'],
|
|
131
|
-
faultMetricNames: ['Fault', 'Failure'],
|
|
132
|
-
metricDimensions: new MetricDimensions_1.MetricDimensions({ Operation: operation.operationName }, 'AZ-ID', 'Region'),
|
|
133
|
-
alarmStatistic: operation.canaryTestAvailabilityMetricsOverride
|
|
134
|
-
.alarmStatistic,
|
|
135
|
-
datapointsToAlarm: operation.canaryTestAvailabilityMetricsOverride
|
|
136
|
-
.datapointsToAlarm,
|
|
137
|
-
evaluationPeriods: operation.canaryTestAvailabilityMetricsOverride
|
|
138
|
-
.evaluationPeriods,
|
|
139
|
-
faultAlarmThreshold: operation.canaryTestAvailabilityMetricsOverride
|
|
140
|
-
.faultAlarmThreshold,
|
|
141
|
-
period: operation.canaryTestAvailabilityMetricsOverride.period,
|
|
142
|
-
successAlarmThreshold: operation.canaryTestAvailabilityMetricsOverride
|
|
143
|
-
.successAlarmThreshold,
|
|
144
|
-
}, props.service.defaultAvailabilityMetricDetails);
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
defaultAvailabilityMetricDetails = new OperationMetricDetails_1.OperationMetricDetails({
|
|
148
|
-
operationName: operation.operationName,
|
|
149
|
-
metricNamespace: test.metricNamespace,
|
|
150
|
-
successMetricNames: ['Success'],
|
|
151
|
-
faultMetricNames: ['Fault', 'Failure'],
|
|
152
|
-
metricDimensions: new MetricDimensions_1.MetricDimensions({ Operation: operation.operationName }, 'AZ-ID', 'Region'),
|
|
153
|
-
}, props.service.defaultAvailabilityMetricDetails);
|
|
154
|
-
}
|
|
155
|
-
if (operation.canaryMetricDetails?.canaryLatencyMetricDetails) {
|
|
156
|
-
defaultLatencyMetricDetails = new OperationMetricDetails_1.OperationMetricDetails({
|
|
157
|
-
operationName: operation.operationName,
|
|
158
|
-
metricDimensions: new MetricDimensions_1.MetricDimensions({ Operation: operation.operationName }, 'AZ-ID', 'Region'),
|
|
159
|
-
alarmStatistic: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
160
|
-
.alarmStatistic,
|
|
161
|
-
datapointsToAlarm: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
162
|
-
.datapointsToAlarm,
|
|
163
|
-
evaluationPeriods: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
164
|
-
.evaluationPeriods,
|
|
165
|
-
faultAlarmThreshold: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
166
|
-
.faultAlarmThreshold,
|
|
167
|
-
faultMetricNames: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
168
|
-
.faultMetricNames,
|
|
169
|
-
graphedFaultStatistics: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
170
|
-
.graphedFaultStatistics,
|
|
171
|
-
graphedSuccessStatistics: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
172
|
-
.graphedSuccessStatistics,
|
|
173
|
-
metricNamespace: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
174
|
-
.metricNamespace,
|
|
175
|
-
period: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
176
|
-
.period,
|
|
177
|
-
successAlarmThreshold: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
178
|
-
.successAlarmThreshold,
|
|
179
|
-
successMetricNames: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
180
|
-
.successMetricNames,
|
|
181
|
-
unit: operation.canaryMetricDetails.canaryLatencyMetricDetails
|
|
182
|
-
.unit,
|
|
183
|
-
}, operation.service.defaultLatencyMetricDetails);
|
|
184
|
-
}
|
|
185
|
-
else if (operation.canaryTestLatencyMetricsOverride) {
|
|
186
|
-
defaultLatencyMetricDetails = new OperationMetricDetails_1.OperationMetricDetails({
|
|
187
|
-
operationName: operation.operationName,
|
|
188
|
-
metricNamespace: test.metricNamespace,
|
|
189
|
-
successMetricNames: ['SuccessLatency'],
|
|
190
|
-
faultMetricNames: ['FaultLatency'],
|
|
191
|
-
metricDimensions: new MetricDimensions_1.MetricDimensions({ Operation: operation.operationName }, 'AZ-ID', 'Region'),
|
|
192
|
-
alarmStatistic: operation.canaryTestLatencyMetricsOverride.alarmStatistic,
|
|
193
|
-
datapointsToAlarm: operation.canaryTestLatencyMetricsOverride.datapointsToAlarm,
|
|
194
|
-
evaluationPeriods: operation.canaryTestLatencyMetricsOverride.evaluationPeriods,
|
|
195
|
-
faultAlarmThreshold: operation.canaryTestLatencyMetricsOverride
|
|
196
|
-
.faultAlarmThreshold,
|
|
197
|
-
period: operation.canaryTestLatencyMetricsOverride.period,
|
|
198
|
-
successAlarmThreshold: operation.canaryTestLatencyMetricsOverride
|
|
199
|
-
.successAlarmThreshold,
|
|
200
|
-
}, props.service.defaultLatencyMetricDetails);
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
defaultLatencyMetricDetails = new OperationMetricDetails_1.OperationMetricDetails({
|
|
204
|
-
operationName: operation.operationName,
|
|
205
|
-
metricNamespace: test.metricNamespace,
|
|
206
|
-
successMetricNames: ['SuccessLatency'],
|
|
207
|
-
faultMetricNames: ['FaultLatency'],
|
|
208
|
-
metricDimensions: new MetricDimensions_1.MetricDimensions({ Operation: operation.operationName }, 'AZ-ID', 'Region'),
|
|
209
|
-
}, props.service.defaultLatencyMetricDetails);
|
|
210
|
-
}
|
|
211
|
-
let newOperation = new Operation_1.Operation({
|
|
212
|
-
serverSideAvailabilityMetricDetails: operation.serverSideAvailabilityMetricDetails,
|
|
213
|
-
serverSideLatencyMetricDetails: operation.serverSideLatencyMetricDetails,
|
|
214
|
-
serverSideContributorInsightRuleDetails: operation.serverSideContributorInsightRuleDetails,
|
|
215
|
-
service: operation.service,
|
|
216
|
-
operationName: operation.operationName,
|
|
217
|
-
path: operation.path,
|
|
218
|
-
critical: operation.critical,
|
|
219
|
-
httpMethods: operation.httpMethods,
|
|
220
|
-
canaryMetricDetails: new CanaryMetrics_1.CanaryMetrics({
|
|
221
|
-
canaryAvailabilityMetricDetails: defaultAvailabilityMetricDetails,
|
|
222
|
-
canaryLatencyMetricDetails: defaultLatencyMetricDetails,
|
|
223
|
-
}),
|
|
224
|
-
});
|
|
225
|
-
props.service.operations[i] = newOperation;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
269
|
+
this.setupCanaryTests(canaryStack, props);
|
|
228
270
|
}
|
|
229
|
-
|
|
271
|
+
// Create the outlier detection lambda function stack if we're not
|
|
272
|
+
// using static outlier detection
|
|
273
|
+
if (availabilityOutlierDetectionAlgorithm != OutlierDetectionAlgorithm_1.OutlierDetectionAlgorithm.STATIC || latencyOutlierDetectionAlgorithm != OutlierDetectionAlgorithm_1.OutlierDetectionAlgorithm.STATIC) {
|
|
230
274
|
let outlierDetectionStack = new StackWithDynamicSource_1.StackWithDynamicSource(this, 'OutlierDetectionStack', {
|
|
231
275
|
assetsBucketsParameterName: props.assetsBucketParameterName,
|
|
232
276
|
assetsBucketPrefixParameterName: props.assetsBucketPrefixParameterName,
|
|
233
277
|
});
|
|
234
278
|
this.outlierDetectionFunction = new OutlierDetectionFunction_1.OutlierDetectionFunction(outlierDetectionStack, 'OutlierDetectionFunction', {}).function;
|
|
235
279
|
}
|
|
280
|
+
// Create the per operation alarms and contributor insight rules
|
|
236
281
|
this.perOperationAlarmsAndRules = Object.fromEntries(props.service.operations.map((operation) => {
|
|
237
282
|
let nestedStack = new aws_cdk_lib_1.NestedStack(this, operation.operationName + 'OperationAlarmsAndRulesNestedStack');
|
|
238
283
|
return [
|
|
239
284
|
operation.operationName,
|
|
240
285
|
new OperationAlarmsAndRules_1.OperationAlarmsAndRules(nestedStack, operation.operationName, {
|
|
241
286
|
operation: operation,
|
|
242
|
-
|
|
243
|
-
|
|
287
|
+
latencyOutlierDetectionAlgorithm: latencyOutlierDetectionAlgorithm,
|
|
288
|
+
availabilityOutlierDetectionAlgorithm: availabilityOutlierDetectionAlgorithm,
|
|
289
|
+
latencyOutlierThreshold: latencyOutlierThreshold,
|
|
290
|
+
availabilityOutlierThreshold: availabilityOutlierThreshold,
|
|
244
291
|
loadBalancer: props.service.loadBalancer,
|
|
245
292
|
azMapper: this.azMapper,
|
|
246
293
|
outlierDetectionFunction: this.outlierDetectionFunction,
|
|
294
|
+
latencyOutlierMetricAggregation: props.latencyOutlierMetricAggregation,
|
|
295
|
+
minimumUnhealthyTargets: props.service.minimumUnhealthyTargets
|
|
247
296
|
}),
|
|
248
297
|
];
|
|
249
298
|
}));
|
|
250
|
-
this.perOperationZonalImpactAlarms = Object.fromEntries(Object.entries(this.perOperationAlarmsAndRules).map(([
|
|
251
|
-
return [
|
|
299
|
+
this.perOperationZonalImpactAlarms = Object.fromEntries(Object.entries(this.perOperationAlarmsAndRules).map(([operationName, operationAlarmsAndRules]) => {
|
|
300
|
+
return [operationName, operationAlarmsAndRules.aggregateZonalAlarms];
|
|
252
301
|
}));
|
|
253
302
|
let serviceAlarmsStack = new aws_cdk_lib_1.NestedStack(this, 'ServiceAlarmsNestedStack');
|
|
254
303
|
this.serviceAlarms = new ServiceAlarmsAndRules_1.ServiceAlarmsAndRules(serviceAlarmsStack, props.service.serviceName, {
|
|
@@ -260,51 +309,26 @@ class InstrumentedServiceMultiAZObservability extends constructs_1.Construct {
|
|
|
260
309
|
this.operationDashboards = [];
|
|
261
310
|
props.service.operations.forEach((x) => {
|
|
262
311
|
let dashboardStack = new aws_cdk_lib_1.NestedStack(this, x.operationName + 'Dashboard', {});
|
|
263
|
-
|
|
264
|
-
this.
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
loadBalancer: props.service.loadBalancer,
|
|
271
|
-
regionalEndpointCanaryAvailabilityAlarm: this.perOperationAlarmsAndRules[x.operationName]
|
|
272
|
-
.canaryRegionalAlarmsAndRules?.availabilityAlarm,
|
|
273
|
-
regionalEndpointCanaryLatencyAlarm: this.perOperationAlarmsAndRules[x.operationName]
|
|
274
|
-
.canaryRegionalAlarmsAndRules?.latencyAlarm,
|
|
275
|
-
regionalEndpointServerAvailabilityAlarm: this.perOperationAlarmsAndRules[x.operationName]
|
|
276
|
-
.serverSideRegionalAlarmsAndRules.availabilityAlarm,
|
|
277
|
-
regionalEndpointServerLatencyAlarm: this.perOperationAlarmsAndRules[x.operationName]
|
|
278
|
-
.serverSideRegionalAlarmsAndRules.latencyAlarm,
|
|
279
|
-
zonalEndpointCanaryAvailabilityAlarms: this.perOperationAlarmsAndRules[x.operationName].canaryZonalAlarmsAndRules?.map((a) => a.availabilityAlarm),
|
|
280
|
-
zonalEndpointCanaryLatencyAlarms: this.perOperationAlarmsAndRules[x.operationName].canaryZonalAlarmsAndRules?.map((a) => a.latencyAlarm),
|
|
281
|
-
zonalEndpointServerAvailabilityAlarms: this.perOperationAlarmsAndRules[x.operationName].serverSideZonalAlarmsAndRules.map((a) => a.availabilityAlarm),
|
|
282
|
-
zonalEndpointServerLatencyAlarms: this.perOperationAlarmsAndRules[x.operationName].serverSideZonalAlarmsAndRules.map((a) => a.latencyAlarm),
|
|
283
|
-
isolatedAZImpactAlarms: this.perOperationAlarmsAndRules[x.operationName]
|
|
284
|
-
.aggregateZonalAlarms,
|
|
285
|
-
regionalImpactAlarm: this.perOperationAlarmsAndRules[x.operationName]
|
|
286
|
-
.aggregateRegionalAlarm,
|
|
287
|
-
instanceContributorsToFaults: this.perOperationAlarmsAndRules[x.operationName]
|
|
288
|
-
.serverSideRegionalAlarmsAndRules
|
|
289
|
-
.instanceContributorsToRegionalFaults,
|
|
290
|
-
instanceContributorsToHighLatency: this.perOperationAlarmsAndRules[x.operationName]
|
|
291
|
-
.serverSideRegionalAlarmsAndRules
|
|
292
|
-
.instanceContributorsToRegionalHighLatency,
|
|
293
|
-
}).dashboard);
|
|
294
|
-
}
|
|
312
|
+
this.operationDashboards.push(new OperationAvailabilityAndLatencyDashboard_1.OperationAvailabilityAndLatencyDashboard(dashboardStack, x.operationName, {
|
|
313
|
+
operationAlarmsAndRules: this.perOperationAlarmsAndRules[x.operationName],
|
|
314
|
+
azMapper: this.azMapper,
|
|
315
|
+
interval: props.interval
|
|
316
|
+
? props.interval
|
|
317
|
+
: aws_cdk_lib_1.Duration.minutes(60),
|
|
318
|
+
}).dashboard);
|
|
295
319
|
});
|
|
296
320
|
let dashboardStack = new aws_cdk_lib_1.NestedStack(this, 'ServiceDashboard', {});
|
|
297
321
|
this.serviceDashboard = new ServiceAvailabilityAndLatencyDashboard_1.ServiceAvailabilityAndLatencyDashboard(dashboardStack, props.service.serviceName.toLowerCase(), {
|
|
298
322
|
interval: props.interval ? props.interval : aws_cdk_lib_1.Duration.minutes(60),
|
|
323
|
+
serviceAlarmsAndRules: this.serviceAlarms,
|
|
299
324
|
service: props.service,
|
|
300
|
-
aggregateRegionalAlarm: this.serviceAlarms.regionalFaultCountServerSideAlarm,
|
|
301
|
-
zonalAggregateAlarms: this.serviceAlarms.zonalAggregateIsolatedImpactAlarms,
|
|
302
325
|
azMapper: this.azMapper,
|
|
326
|
+
operationsDashboard: this.operationDashboards
|
|
303
327
|
}).dashboard;
|
|
304
328
|
}
|
|
305
329
|
}
|
|
306
330
|
}
|
|
307
331
|
exports.InstrumentedServiceMultiAZObservability = InstrumentedServiceMultiAZObservability;
|
|
308
332
|
_a = JSII_RTTI_SYMBOL_1;
|
|
309
|
-
InstrumentedServiceMultiAZObservability[_a] = { fqn: "@cdklabs/multi-az-observability.InstrumentedServiceMultiAZObservability", version: "0.0.1-alpha.
|
|
310
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5zdHJ1bWVudGVkU2VydmljZU11bHRpQVpPYnNlcnZhYmlsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL0luc3RydW1lbnRlZFNlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFDdEMsNkNBQW9EO0FBSXBELDJDQUF1QztBQUN2QyxtREFBZ0Q7QUFJaEQsMkNBQXdDO0FBQ3hDLHFFQUFrRTtBQUVsRSwrREFBNEQ7QUFHNUQsdUZBQW9GO0FBQ3BGLG1GQUFnRjtBQUNoRiwrRUFBNEU7QUFDNUUsK0RBQTREO0FBQzVELHVEQUFvRDtBQUVwRCxxSEFBa0g7QUFDbEgsaUhBQThHO0FBQzlHLDRGQUF5RjtBQUN6RixzRkFBbUY7QUFDbkYsZ0ZBQTZFO0FBRTdFOzs7O0dBSUc7QUFDSCxNQUFhLHVDQUNYLFNBQVEsc0JBQVM7SUFtRGpCLFlBQ0UsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQW1EO1FBRW5ELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxnQkFBd0IsQ0FBQztRQUU3QixJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDNUIsUUFBUSxLQUFLLENBQUMseUJBQXlCLEVBQUUsQ0FBQztnQkFDeEMsS0FBSyxxREFBeUIsQ0FBQyxXQUFXO29CQUN4QyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7b0JBQ3hCLE1BQU07Z0JBQ1IsS0FBSyxxREFBeUIsQ0FBQyxHQUFHO29CQUNoQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7b0JBQ3ZCLE1BQU07Z0JBQ1IsS0FBSyxxREFBeUIsQ0FBQyxHQUFHO29CQUNoQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7b0JBQ3JCLE1BQU07Z0JBQ1IsS0FBSyxxREFBeUIsQ0FBQyxNQUFNO29CQUNuQyxnQkFBZ0IsR0FBRyxH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QUMsQ0FBQyxDQUFDLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDaEUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixzQkFBc0IsRUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQ0FBaUM7Z0JBQ3RELG9CQUFvQixFQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLGtDQUFrQztnQkFDdkQsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2FBQ3hCLENBQ0YsQ0FBQyxTQUFTLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQzs7QUFwZ0JILDBGQXFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5pbXBvcnQgeyBEdXJhdGlvbiwgTmVzdGVkU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBEYXNoYm9hcmQsIElBbGFybSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IElGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgSUxvZ0dyb3VwIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBDYW5hcnlNZXRyaWNzIH0gZnJvbSAnLi9DYW5hcnlNZXRyaWNzJztcbmltcG9ydCB7IElJbnN0cnVtZW50ZWRTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHkgfSBmcm9tICcuL0lJbnN0cnVtZW50ZWRTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHknO1xuaW1wb3J0IHsgSU9wZXJhdGlvbiB9IGZyb20gJy4vSU9wZXJhdGlvbic7XG5pbXBvcnQgeyBJT3BlcmF0aW9uTWV0cmljRGV0YWlscyB9IGZyb20gJy4vSU9wZXJhdGlvbk1ldHJpY0RldGFpbHMnO1xuaW1wb3J0IHsgT3BlcmF0aW9uIH0gZnJvbSAnLi9PcGVyYXRpb24nO1xuaW1wb3J0IHsgT3BlcmF0aW9uTWV0cmljRGV0YWlscyB9IGZyb20gJy4vT3BlcmF0aW9uTWV0cmljRGV0YWlscyc7XG5pbXBvcnQgeyBJbnN0cnVtZW50ZWRTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHlQcm9wcyB9IGZyb20gJy4vcHJvcHMvSW5zdHJ1bWVudGVkU2VydmljZU11bHRpQVpPYnNlcnZhYmlsaXR5UHJvcHMnO1xuaW1wb3J0IHsgTWV0cmljRGltZW5zaW9ucyB9IGZyb20gJy4vcHJvcHMvTWV0cmljRGltZW5zaW9ucyc7XG5pbXBvcnQgeyBJT3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMgfSBmcm9tICcuLi9hbGFybXNhbmRydWxlcy9JT3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMnO1xuaW1wb3J0IHsgSVNlcnZpY2VBbGFybXNBbmRSdWxlcyB9IGZyb20gJy4uL2FsYXJtc2FuZHJ1bGVzL0lTZXJ2aWNlQWxhcm1zQW5kUnVsZXMnO1xuaW1wb3J0IHsgT3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMgfSBmcm9tICcuLi9hbGFybXNhbmRydWxlcy9PcGVyYXRpb25BbGFybXNBbmRSdWxlcyc7XG5pbXBvcnQgeyBTZXJ2aWNlQWxhcm1zQW5kUnVsZXMgfSBmcm9tICcuLi9hbGFybXNhbmRydWxlcy9TZXJ2aWNlQWxhcm1zQW5kUnVsZXMnO1xuaW1wb3J0IHsgQXZhaWxhYmlsaXR5Wm9uZU1hcHBlciB9IGZyb20gJy4uL2F6bWFwcGVyL0F2YWlsYWJpbGl0eVpvbmVNYXBwZXInO1xuaW1wb3J0IHsgQ2FuYXJ5RnVuY3Rpb24gfSBmcm9tICcuLi9jYW5hcmllcy9DYW5hcnlGdW5jdGlvbic7XG5pbXBvcnQgeyBDYW5hcnlUZXN0IH0gZnJvbSAnLi4vY2FuYXJpZXMvQ2FuYXJ5VGVzdCc7XG5pbXBvcnQgeyBBZGRDYW5hcnlUZXN0UHJvcHMgfSBmcm9tICcuLi9jYW5hcmllcy9wcm9wcy9BZGRDYW5hcnlUZXN0UHJvcHMnO1xuaW1wb3J0IHsgT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZCB9IGZyb20gJy4uL2Rhc2hib2FyZHMvT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZCc7XG5pbXBvcnQgeyBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZCB9IGZyb20gJy4uL2Rhc2hib2FyZHMvU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQnO1xuaW1wb3J0IHsgT3V0bGllckRldGVjdGlvbkZ1bmN0aW9uIH0gZnJvbSAnLi4vb3V0bGllci1kZXRlY3Rpb24vT3V0bGllckRldGVjdGlvbkZ1bmN0aW9uJztcbmltcG9ydCB7IE91dGxpZXJEZXRlY3Rpb25BbGdvcml0aG0gfSBmcm9tICcuLi91dGlsaXRpZXMvT3V0bGllckRldGVjdGlvbkFsZ29yaXRobSc7XG5pbXBvcnQgeyBTdGFja1dpdGhEeW5hbWljU291cmNlIH0gZnJvbSAnLi4vdXRpbGl0aWVzL1N0YWNrV2l0aER5bmFtaWNTb3VyY2UnO1xuXG4vKipcbiAqIEFuIHNlcnZpY2UgdGhhdCBpbXBsZW1lbnRzIGl0cyBvd24gaW5zdHJ1bWVudGF0aW9uIHRvIHJlY29yZFxuICogYXZhaWxhYmlsaXR5IGFuZCBsYXRlbmN5IG1ldHJpY3MgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGVcbiAqIGFsYXJtcywgcnVsZXMsIGFuZCBkYXNoYm9hcmRzIGZyb21cbiAqL1xuZXhwb3J0IGNsYXNzIEluc3RydW1lbnRlZFNlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eVxuICBleHRlbmRzIENvbnN0cnVjdFxuICBpbXBsZW1lbnRzIElJbnN0cnVtZW50ZWRTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHkge1xuICAvKipcbiAgICogS2V5IHJlcHJlc2VudHMgdGhlIG9wZXJhdGlvbiBuYW1lIGFuZCB0aGUgdmFsdWUgaXMgdGhlIHNldFxuICAgKiBvZiB6b25hbCBhbGFybXMgYW5kIHJ1bGVzIGZvciB0aGF0IG9wZXJhdGlvbi4gVGhlIHZhbHVlcyB0aGVtc2VsdmVzXG4gICAqIGFyZSBkaWN0aW9uYXJpZXMgdGhhdCBoYXZlIGEga2V5IGZvciBlYWNoIEFaIElELlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwZXJPcGVyYXRpb25BbGFybXNBbmRSdWxlczoge1xuICAgIFtrZXk6IHN0cmluZ106IElPcGVyYXRpb25BbGFybXNBbmRSdWxlcztcbiAgfTtcblxuICAvKipcbiAgICogSW5kZXggaW50byB0aGUgZGljdGlvbmFyeSBieSBvcGVyYXRpb24gbmFtZSwgdGhlbiBieSBBdmFpbGFiaWxpdHkgWm9uZSBJZFxuICAgKiB0byBnZXQgdGhlIGFsYXJtcyB0aGF0IGluZGljYXRlIGFuIEFaIHNob3dzIGlzb2xhdGVkIGltcGFjdCBmcm9tIGF2YWlsYWJpbGl0eVxuICAgKiBvciBsYXRlbmN5IGFzIHNlZW4gYnkgZWl0aGVyIHRoZSBzZXJ2ZXItc2lkZSBvciBjYW5hcnkuIFRoZXNlIGFyZSB0aGUgYWxhcm1zXG4gICAqIHlvdSB3b3VsZCB3YW50IHRvIHVzZSB0byB0cmlnZ2VyIGF1dG9tYXRpb24gdG8gZXZhY3VhdGUgYW4gQVouXG4gICAqL1xuICByZWFkb25seSBwZXJPcGVyYXRpb25ab25hbEltcGFjdEFsYXJtczoge1xuICAgIFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogSUFsYXJtIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBhbGFybXMgYW5kIHJ1bGVzIGZvciB0aGUgb3ZlcmFsbCBzZXJ2aWNlXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlQWxhcm1zOiBJU2VydmljZUFsYXJtc0FuZFJ1bGVzO1xuXG4gIC8qKlxuICAgKiBUaGUgZGFzaGJvYXJkcyBmb3IgZWFjaCBvcGVyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbkRhc2hib2FyZHM/OiBEYXNoYm9hcmRbXTtcblxuICAvKipcbiAgICogVGhlIHNlcnZpY2UgbGV2ZWwgZGFzaGJvYXJkXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlRGFzaGJvYXJkPzogRGFzaGJvYXJkO1xuXG4gIC8qKlxuICAgKiBUaGUgQVogbWFwcGVyIGN1c3RvbSByZXNvdXJjZSB1c2VkIHRvIG1hcCBBWiBJZHMgdG8gTmFtZXMgYW5kIHZpY2UgYSB2ZXJzYVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhek1hcHBlcjogQXZhaWxhYmlsaXR5Wm9uZU1hcHBlcjtcblxuICAvKipcbiAgICogSWYgdGhlIHNlcnZpY2UgaXMgY29uZmlndXJlZCB0byBoYXZlIGNhbmFyeSB0ZXN0cyBjcmVhdGVkLCB0aGlzIHdpbGxcbiAgICogYmUgdGhlIGxvZyBncm91cCB3aGVyZSB0aGUgY2FuYXJ5J3MgbG9ncyBhcmUgc3RvcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGxvZyBncm91cCBpcyBjcmVhdGVkIGlmIHRoZSBjYW5hcnkgaXMgbm90IHJlcXVlc3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbmFyeUxvZ0dyb3VwPzogSUxvZ0dyb3VwO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb3V0bGllckRldGVjdGlvbkZ1bmN0aW9uPzogSUZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSW5zdHJ1bWVudGVkU2VydmljZU11bHRpQVpPYnNlcnZhYmlsaXR5UHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBsZXQgb3V0bGllclRocmVzaG9sZDogbnVtYmVyO1xuXG4gICAgaWYgKCFwcm9wcy5vdXRsaWVyVGhyZXNob2xkKSB7XG4gICAgICBzd2l0Y2ggKHByb3BzLm91dGxpZXJEZXRlY3Rpb25BbGdvcml0aG0pIHtcbiAgICAgICAgY2FzZSBPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtLkNISV9TUVVBUkVEOlxuICAgICAgICAgIG91dGxpZXJUaHJlc2hvbGQgPSAwLjA1O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE91dGxpZXJEZXRlY3Rpb25BbGdvcml0aG0uSVFSOlxuICAgICAgICAgIG91dGxpZXJUaHJlc2hvbGQgPSAxLjU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgT3V0bGllckRldGVjdGlvbkFsZ29yaXRobS5NQUQ6XG4gICAgICAgICAgb3V0bGllclRocmVzaG9sZCA9IDM7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgT3V0bGllckRldGVjdGlvbkFsZ29yaXRobS5TVEFUSUM6XG4gICAgICAgICAgb3V0bGllclRocmVzaG9sZCA9IDAuNztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtLlpfU0NPUkU6XG4gICAgICAgICAgb3V0bGllclRocmVzaG9sZCA9IDI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dGxpZXJUaHJlc2hvbGQgPSBwcm9wcy5vdXRsaWVyVGhyZXNob2xkO1xuICAgIH1cblxuICAgIHRoaXMuYXpNYXBwZXIgPSBuZXcgQXZhaWxhYmlsaXR5Wm9uZU1hcHBlcih0aGlzLCAnQVpNYXBwZXInLCB7XG4gICAgICBhdmFpbGFiaWxpdHlab25lTmFtZXM6IHByb3BzLnNlcnZpY2UuYXZhaWxhYmlsaXR5Wm9uZU5hbWVzLFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLnNlcnZpY2UuY2FuYXJ5VGVzdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxldCBjYW5hcnlTdGFjazogU3RhY2tXaXRoRHluYW1pY1NvdXJjZSA9IG5ldyBTdGFja1dpdGhEeW5hbWljU291cmNlKFxuICAgICAgICB0aGlzLFxuICAgICAgICAnQ2FuYXJ5JyxcbiAgICAgICAge1xuICAgICAgICAgIGFzc2V0c0J1Y2tldHNQYXJhbWV0ZXJOYW1lOiBwcm9wcy5hc3NldHNCdWNrZXRQYXJhbWV0ZXJOYW1lLFxuICAgICAgICAgIGFzc2V0c0J1Y2tldFByZWZpeFBhcmFtZXRlck5hbWU6XG4gICAgICAgICAgICBwcm9wcy5hc3NldHNCdWNrZXRQcmVmaXhQYXJhbWV0ZXJOYW1lLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgbGV0IGNhbmFyeSA9IG5ldyBDYW5hcnlGdW5jdGlvbihjYW5hcnlTdGFjaywgJ0NhbmFyeUZ1bmN0aW9uJywge1xuICAgICAgICB2cGM6IHByb3BzLnNlcnZpY2UuY2FuYXJ5VGVzdFByb3BzLm5ldHdvcmtDb25maWd1cmF0aW9uPy52cGMsXG4gICAgICAgIHN1Ym5ldFNlbGVjdGlvbjpcbiAgICAgICAgICBwcm9wcy5zZXJ2aWNlLmNhbmFyeVRlc3RQcm9wcy5uZXR3b3JrQ29uZmlndXJhdGlvbj8uc3VibmV0U2VsZWN0aW9uLFxuICAgICAgICBodHRwVGltZW91dDogcHJvcHMuc2VydmljZS5jYW5hcnlUZXN0UHJvcHMudGltZW91dFxuICAgICAgICAgID8gcHJvcHMuc2VydmljZS5jYW5hcnlUZXN0UHJvcHMudGltZW91dFxuICAgICAgICAgIDogRHVyYXRpb24uc2Vjb25kcygyKSxcbiAgICAgICAgaWdub3JlVGxzRXJyb3JzOiBwcm9wcy5zZXJ2aWNlLmNhbmFyeVRlc3RQcm9wcy5pZ25vcmVUbHNFcnJvcnNcbiAgICAgICAgICA/IHByb3BzLnNlcnZpY2UuY2FuYXJ5VGVzdFByb3BzLmlnbm9yZVRsc0Vycm9yc1xuICAgICAgICAgIDogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jYW5hcnlMb2dHcm91cCA9IGNhbmFyeS5sb2dHcm91cDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG9wZXJhdGlvbjogSU9wZXJhdGlvbiA9IHByb3BzLnNlcnZpY2Uub3BlcmF0aW9uc1tpXTtcblxuICAgICAgICBpZiAob3BlcmF0aW9uLm9wdE91dE9mU2VydmljZUNyZWF0ZWRDYW5hcnkgIT0gdHJ1ZSkge1xuICAgICAgICAgIGxldCB0ZXN0UHJvcHM6IEFkZENhbmFyeVRlc3RQcm9wcyA9IG9wZXJhdGlvbi5jYW5hcnlUZXN0UHJvcHNcbiAgICAgICAgICAgID8gb3BlcmF0aW9uLmNhbmFyeVRlc3RQcm9wc1xuICAgICAgICAgICAgOiAocHJvcHMuc2VydmljZS5jYW5hcnlUZXN0UHJvcHMgYXMgQWRkQ2FuYXJ5VGVzdFByb3BzKTtcblxuICAgICAgICAgIGxldCBuZXN0ZWRTdGFjazogTmVzdGVkU3RhY2sgPSBuZXcgTmVzdGVkU3RhY2soXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgb3BlcmF0aW9uLm9wZXJhdGlvbk5hbWUgKyAnQ2FuYXJ5VGVzdCcsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbGV0IHRlc3QgPSBuZXcgQ2FuYXJ5VGVzdChuZXN0ZWRTdGFjaywgb3BlcmF0aW9uLm9wZXJhdGlvbk5hbWUsIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uOiBjYW5hcnkuZnVuY3Rpb24sXG4gICAgICAgICAgICByZXF1ZXN0Q291bnQ6IHRlc3RQcm9wcy5yZXF1ZXN0Q291bnQsXG4gICAgICAgICAgICByZWdpb25hbFJlcXVlc3RDb3VudDogdGVzdFByb3BzLnJlZ2lvbmFsUmVxdWVzdENvdW50XG4gICAgICAgICAgICAgID8gdGVzdFByb3BzLnJlZ2lvbmFsUmVxdWVzdENvdW50XG4gICAgICAgICAgICAgIDogdGVzdFByb3BzLnJlcXVlc3RDb3VudCxcbiAgICAgICAgICAgIHNjaGVkdWxlOiB0ZXN0UHJvcHMuc2NoZWR1bGUsXG4gICAgICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICAgIGxvYWRCYWxhbmNlcjogdGVzdFByb3BzLmxvYWRCYWxhbmNlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IHRlc3RQcm9wcy5oZWFkZXJzLFxuICAgICAgICAgICAgcG9zdERhdGE6IHRlc3RQcm9wcy5wb3N0RGF0YSxcbiAgICAgICAgICAgIGF6TWFwcGVyOiB0aGlzLmF6TWFwcGVyLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbGV0IGRlZmF1bHRBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzOiBJT3BlcmF0aW9uTWV0cmljRGV0YWlscztcbiAgICAgICAgICBsZXQgZGVmYXVsdExhdGVuY3lNZXRyaWNEZXRhaWxzOiBJT3BlcmF0aW9uTWV0cmljRGV0YWlscztcblxuICAgICAgICAgIGlmIChvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscz8uY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscykge1xuICAgICAgICAgICAgZGVmYXVsdEF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMgPSBuZXcgT3BlcmF0aW9uTWV0cmljRGV0YWlscyhcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lLFxuICAgICAgICAgICAgICAgIG1ldHJpY0RpbWVuc2lvbnM6IG5ldyBNZXRyaWNEaW1lbnNpb25zKFxuICAgICAgICAgICAgICAgICAgeyBPcGVyYXRpb246IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lIH0sXG4gICAgICAgICAgICAgICAgICAnQVotSUQnLFxuICAgICAgICAgICAgICAgICAgJ1JlZ2lvbicsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBhbGFybVN0YXRpc3RpYzpcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgLmFsYXJtU3RhdGlzdGljLFxuICAgICAgICAgICAgICAgIGRhdGFwb2ludHNUb0FsYXJtOlxuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAuZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICAgICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6XG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgIC5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgICAgICAgICBmYXVsdEFsYXJtVGhyZXNob2xkOlxuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAuZmF1bHRBbGFybVRocmVzaG9sZCxcbiAgICAgICAgICAgICAgICBmYXVsdE1ldHJpY05hbWVzOlxuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAuZmF1bHRNZXRyaWNOYW1lcyxcbiAgICAgICAgICAgICAgICBncmFwaGVkRmF1bHRTdGF0aXN0aWNzOlxuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAuZ3JhcGhlZEZhdWx0U3RhdGlzdGljcyxcbiAgICAgICAgICAgICAgICBncmFwaGVkU3VjY2Vzc1N0YXRpc3RpY3M6XG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgIC5ncmFwaGVkU3VjY2Vzc1N0YXRpc3RpY3MsXG4gICAgICAgICAgICAgICAgbWV0cmljTmFtZXNwYWNlOlxuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIHBlcmlvZDpcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgLnBlcmlvZCxcbiAgICAgICAgICAgICAgICBzdWNjZXNzQWxhcm1UaHJlc2hvbGQ6XG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgIC5zdWNjZXNzQWxhcm1UaHJlc2hvbGQsXG4gICAgICAgICAgICAgICAgc3VjY2Vzc01ldHJpY05hbWVzOlxuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAuc3VjY2Vzc01ldHJpY05hbWVzLFxuICAgICAgICAgICAgICAgIHVuaXQ6IG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscy51bml0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvcGVyYXRpb24uc2VydmljZS5kZWZhdWx0QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24uY2FuYXJ5VGVzdEF2YWlsYWJpbGl0eU1ldHJpY3NPdmVycmlkZSkge1xuICAgICAgICAgICAgZGVmYXVsdEF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMgPSBuZXcgT3BlcmF0aW9uTWV0cmljRGV0YWlscyhcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lLFxuICAgICAgICAgICAgICAgIG1ldHJpY05hbWVzcGFjZTogdGVzdC5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgc3VjY2Vzc01ldHJpY05hbWVzOiBbJ1N1Y2Nlc3MnXSxcbiAgICAgICAgICAgICAgICBmYXVsdE1ldHJpY05hbWVzOiBbJ0ZhdWx0JywgJ0ZhaWx1cmUnXSxcbiAgICAgICAgICAgICAgICBtZXRyaWNEaW1lbnNpb25zOiBuZXcgTWV0cmljRGltZW5zaW9ucyhcbiAgICAgICAgICAgICAgICAgIHsgT3BlcmF0aW9uOiBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSB9LFxuICAgICAgICAgICAgICAgICAgJ0FaLUlEJyxcbiAgICAgICAgICAgICAgICAgICdSZWdpb24nLFxuICAgICAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgICAgICBhbGFybVN0YXRpc3RpYzpcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlUZXN0QXZhaWxhYmlsaXR5TWV0cmljc092ZXJyaWRlXG4gICAgICAgICAgICAgICAgICAgIC5hbGFybVN0YXRpc3RpYyxcbiAgICAgICAgICAgICAgICBkYXRhcG9pbnRzVG9BbGFybTpcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlUZXN0QXZhaWxhYmlsaXR5TWV0cmljc092ZXJyaWRlXG4gICAgICAgICAgICAgICAgICAgIC5kYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgICAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczpcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlUZXN0QXZhaWxhYmlsaXR5TWV0cmljc092ZXJyaWRlXG4gICAgICAgICAgICAgICAgICAgIC5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgICAgICAgICBmYXVsdEFsYXJtVGhyZXNob2xkOlxuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeVRlc3RBdmFpbGFiaWxpdHlNZXRyaWNzT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgICAgLmZhdWx0QWxhcm1UaHJlc2hvbGQsXG4gICAgICAgICAgICAgICAgcGVyaW9kOiBvcGVyYXRpb24uY2FuYXJ5VGVzdEF2YWlsYWJpbGl0eU1ldHJpY3NPdmVycmlkZS5wZXJpb2QsXG4gICAgICAgICAgICAgICAgc3VjY2Vzc0FsYXJtVGhyZXNob2xkOlxuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeVRlc3RBdmFpbGFiaWxpdHlNZXRyaWNzT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgICAgLnN1Y2Nlc3NBbGFybVRocmVzaG9sZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcHJvcHMuc2VydmljZS5kZWZhdWx0QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlZmF1bHRBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzID0gbmV3IE9wZXJhdGlvbk1ldHJpY0RldGFpbHMoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICBtZXRyaWNOYW1lc3BhY2U6IHRlc3QubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NNZXRyaWNOYW1lczogWydTdWNjZXNzJ10sXG4gICAgICAgICAgICAgICAgZmF1bHRNZXRyaWNOYW1lczogWydGYXVsdCcsICdGYWlsdXJlJ10sXG4gICAgICAgICAgICAgICAgbWV0cmljRGltZW5zaW9uczogbmV3IE1ldHJpY0RpbWVuc2lvbnMoXG4gICAgICAgICAgICAgICAgICB7IE9wZXJhdGlvbjogb3BlcmF0aW9uLm9wZXJhdGlvbk5hbWUgfSxcbiAgICAgICAgICAgICAgICAgICdBWi1JRCcsXG4gICAgICAgICAgICAgICAgICAnUmVnaW9uJyxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwcm9wcy5zZXJ2aWNlLmRlZmF1bHRBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHM/LmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzKSB7XG4gICAgICAgICAgICBkZWZhdWx0TGF0ZW5jeU1ldHJpY0RldGFpbHMgPSBuZXcgT3BlcmF0aW9uTWV0cmljRGV0YWlscyhcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lLFxuICAgICAgICAgICAgICAgIG1ldHJpY0RpbWVuc2lvbnM6IG5ldyBNZXRyaWNEaW1lbnNpb25zKFxuICAgICAgICAgICAgICAgICAgeyBPcGVyYXRpb246IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lIH0sXG4gICAgICAgICAgICAgICAgICAnQVotSUQnLFxuICAgICAgICAgICAgICAgICAgJ1JlZ2lvbicsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBhbGFybVN0YXRpc3RpYzpcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgIC5hbGFybVN0YXRpc3RpYyxcbiAgICAgICAgICAgICAgICBkYXRhcG9pbnRzVG9BbGFybTpcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgIC5kYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgICAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczpcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgIC5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgICAgICAgICBmYXVsdEFsYXJtVGhyZXNob2xkOlxuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgLmZhdWx0QWxhcm1UaHJlc2hvbGQsXG4gICAgICAgICAgICAgICAgZmF1bHRNZXRyaWNOYW1lczpcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgIC5mYXVsdE1ldHJpY05hbWVzLFxuICAgICAgICAgICAgICAgIGdyYXBoZWRGYXVsdFN0YXRpc3RpY3M6XG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAuZ3JhcGhlZEZhdWx0U3RhdGlzdGljcyxcbiAgICAgICAgICAgICAgICBncmFwaGVkU3VjY2Vzc1N0YXRpc3RpY3M6XG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAuZ3JhcGhlZFN1Y2Nlc3NTdGF0aXN0aWNzLFxuICAgICAgICAgICAgICAgIG1ldHJpY05hbWVzcGFjZTpcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgIC5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgcGVyaW9kOlxuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgLnBlcmlvZCxcbiAgICAgICAgICAgICAgICBzdWNjZXNzQWxhcm1UaHJlc2hvbGQ6XG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAuc3VjY2Vzc0FsYXJtVGhyZXNob2xkLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NNZXRyaWNOYW1lczpcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgIC5zdWNjZXNzTWV0cmljTmFtZXMsXG4gICAgICAgICAgICAgICAgdW5pdDogb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAgIC51bml0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvcGVyYXRpb24uc2VydmljZS5kZWZhdWx0TGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uLmNhbmFyeVRlc3RMYXRlbmN5TWV0cmljc092ZXJyaWRlKSB7XG4gICAgICAgICAgICBkZWZhdWx0TGF0ZW5jeU1ldHJpY0RldGFpbHMgPSBuZXcgT3BlcmF0aW9uTWV0cmljRGV0YWlscyhcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lLFxuICAgICAgICAgICAgICAgIG1ldHJpY05hbWVzcGFjZTogdGVzdC5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgc3VjY2Vzc01ldHJpY05hbWVzOiBbJ1N1Y2Nlc3NMYXRlbmN5J10sXG4gICAgICAgICAgICAgICAgZmF1bHRNZXRyaWNOYW1lczogWydGYXVsdExhdGVuY3knXSxcbiAgICAgICAgICAgICAgICBtZXRyaWNEaW1lbnNpb25zOiBuZXcgTWV0cmljRGltZW5zaW9ucyhcbiAgICAgICAgICAgICAgICAgIHsgT3BlcmF0aW9uOiBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSB9LFxuICAgICAgICAgICAgICAgICAgJ0FaLUlEJyxcbiAgICAgICAgICAgICAgICAgICdSZWdpb24nLFxuICAgICAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgICAgICBhbGFybVN0YXRpc3RpYzpcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlUZXN0TGF0ZW5jeU1ldHJpY3NPdmVycmlkZS5hbGFybVN0YXRpc3RpYyxcbiAgICAgICAgICAgICAgICBkYXRhcG9pbnRzVG9BbGFybTpcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlUZXN0TGF0ZW5jeU1ldHJpY3NPdmVycmlkZS5kYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgICAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczpcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlUZXN0TGF0ZW5jeU1ldHJpY3NPdmVycmlkZS5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgICAgICAgICBmYXVsdEFsYXJtVGhyZXNob2xkOlxuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeVRlc3RMYXRlbmN5TWV0cmljc092ZXJyaWRlXG4gICAgICAgICAgICAgICAgICAgIC5mYXVsdEFsYXJtVGhyZXNob2xkLFxuICAgICAgICAgICAgICAgIHBlcmlvZDogb3BlcmF0aW9uLmNhbmFyeVRlc3RMYXRlbmN5TWV0cmljc092ZXJyaWRlLnBlcmlvZCxcbiAgICAgICAgICAgICAgICBzdWNjZXNzQWxhcm1UaHJlc2hvbGQ6XG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5VGVzdExhdGVuY3lNZXRyaWNzT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgICAgLnN1Y2Nlc3NBbGFybVRocmVzaG9sZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcHJvcHMuc2VydmljZS5kZWZhdWx0TGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWZhdWx0TGF0ZW5jeU1ldHJpY0RldGFpbHMgPSBuZXcgT3BlcmF0aW9uTWV0cmljRGV0YWlscyhcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lLFxuICAgICAgICAgICAgICAgIG1ldHJpY05hbWVzcGFjZTogdGVzdC5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgc3VjY2Vzc01ldHJpY05hbWVzOiBbJ1N1Y2Nlc3NMYXRlbmN5J10sXG4gICAgICAgICAgICAgICAgZmF1bHRNZXRyaWNOYW1lczogWydGYXVsdExhdGVuY3knXSxcbiAgICAgICAgICAgICAgICBtZXRyaWNEaW1lbnNpb25zOiBuZXcgTWV0cmljRGltZW5zaW9ucyhcbiAgICAgICAgICAgICAgICAgIHsgT3BlcmF0aW9uOiBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSB9LFxuICAgICAgICAgICAgICAgICAgJ0FaLUlEJyxcbiAgICAgICAgICAgICAgICAgICdSZWdpb24nLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHByb3BzLnNlcnZpY2UuZGVmYXVsdExhdGVuY3lNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgbmV3T3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbih7XG4gICAgICAgICAgICBzZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsczpcbiAgICAgICAgICAgICAgb3BlcmF0aW9uLnNlcnZlclNpZGVBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzOlxuICAgICAgICAgICAgICBvcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgc2VydmVyU2lkZUNvbnRyaWJ1dG9ySW5zaWdodFJ1bGVEZXRhaWxzOlxuICAgICAgICAgICAgICBvcGVyYXRpb24uc2VydmVyU2lkZUNvbnRyaWJ1dG9ySW5zaWdodFJ1bGVEZXRhaWxzLFxuICAgICAgICAgICAgc2VydmljZTogb3BlcmF0aW9uLnNlcnZpY2UsXG4gICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSxcbiAgICAgICAgICAgIHBhdGg6IG9wZXJhdGlvbi5wYXRoLFxuICAgICAgICAgICAgY3JpdGljYWw6IG9wZXJhdGlvbi5jcml0aWNhbCxcbiAgICAgICAgICAgIGh0dHBNZXRob2RzOiBvcGVyYXRpb24uaHR0cE1ldGhvZHMsXG4gICAgICAgICAgICBjYW5hcnlNZXRyaWNEZXRhaWxzOiBuZXcgQ2FuYXJ5TWV0cmljcyh7XG4gICAgICAgICAgICAgIGNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHM6IGRlZmF1bHRBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgICBjYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlsczogZGVmYXVsdExhdGVuY3lNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnNbaV0gPSBuZXdPcGVyYXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJvcHMub3V0bGllckRldGVjdGlvbkFsZ29yaXRobSAhPSBPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtLlNUQVRJQykge1xuICAgICAgbGV0IG91dGxpZXJEZXRlY3Rpb25TdGFjazogU3RhY2tXaXRoRHluYW1pY1NvdXJjZSA9XG4gICAgICAgIG5ldyBTdGFja1dpdGhEeW5hbWljU291cmNlKHRoaXMsICdPdXRsaWVyRGV0ZWN0aW9uU3RhY2snLCB7XG4gICAgICAgICAgYXNzZXRzQnVja2V0c1BhcmFtZXRlck5hbWU6IHByb3BzLmFzc2V0c0J1Y2tldFBhcmFtZXRlck5hbWUsXG4gICAgICAgICAgYXNzZXRzQnVja2V0UHJlZml4UGFyYW1ldGVyTmFtZTpcbiAgICAgICAgICAgIHByb3BzLmFzc2V0c0J1Y2tldFByZWZpeFBhcmFtZXRlck5hbWUsXG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLm91dGxpZXJEZXRlY3Rpb25GdW5jdGlvbiA9IG5ldyBPdXRsaWVyRGV0ZWN0aW9uRnVuY3Rpb24oXG4gICAgICAgIG91dGxpZXJEZXRlY3Rpb25TdGFjayxcbiAgICAgICAgJ091dGxpZXJEZXRlY3Rpb25GdW5jdGlvbicsXG4gICAgICAgIHt9LFxuICAgICAgKS5mdW5jdGlvbjtcbiAgICB9XG5cbiAgICB0aGlzLnBlck9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgcHJvcHMuc2VydmljZS5vcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uOiBJT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGxldCBuZXN0ZWRTdGFjazogTmVzdGVkU3RhY2sgPSBuZXcgTmVzdGVkU3RhY2soXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSArICdPcGVyYXRpb25BbGFybXNBbmRSdWxlc05lc3RlZFN0YWNrJyxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lLFxuICAgICAgICAgIG5ldyBPcGVyYXRpb25BbGFybXNBbmRSdWxlcyhuZXN0ZWRTdGFjaywgb3BlcmF0aW9uLm9wZXJhdGlvbk5hbWUsIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICAgICAgb3V0bGllckRldGVjdGlvbkFsZ29yaXRobTogcHJvcHMub3V0bGllckRldGVjdGlvbkFsZ29yaXRobSxcbiAgICAgICAgICAgIG91dGxpZXJUaHJlc2hvbGQ6IG91dGxpZXJUaHJlc2hvbGQsXG4gICAgICAgICAgICBsb2FkQmFsYW5jZXI6IHByb3BzLnNlcnZpY2UubG9hZEJhbGFuY2VyLFxuICAgICAgICAgICAgYXpNYXBwZXI6IHRoaXMuYXpNYXBwZXIsXG4gICAgICAgICAgICBvdXRsaWVyRGV0ZWN0aW9uRnVuY3Rpb246IHRoaXMub3V0bGllckRldGVjdGlvbkZ1bmN0aW9uLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIHRoaXMucGVyT3BlcmF0aW9uWm9uYWxJbXBhY3RBbGFybXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnBlck9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICByZXR1cm4gW2tleSwgdmFsdWUuYWdncmVnYXRlWm9uYWxBbGFybXNNYXBdO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGxldCBzZXJ2aWNlQWxhcm1zU3RhY2s6IE5lc3RlZFN0YWNrID0gbmV3IE5lc3RlZFN0YWNrKFxuICAgICAgdGhpcyxcbiAgICAgICdTZXJ2aWNlQWxhcm1zTmVzdGVkU3RhY2snLFxuICAgICk7XG5cbiAgICB0aGlzLnNlcnZpY2VBbGFybXMgPSBuZXcgU2VydmljZUFsYXJtc0FuZFJ1bGVzKFxuICAgICAgc2VydmljZUFsYXJtc1N0YWNrLFxuICAgICAgcHJvcHMuc2VydmljZS5zZXJ2aWNlTmFtZSxcbiAgICAgIHtcbiAgICAgICAgcGVyT3BlcmF0aW9uQWxhcm1zQW5kUnVsZXM6IHRoaXMucGVyT3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMsXG4gICAgICAgIHNlcnZpY2U6IHByb3BzLnNlcnZpY2UsXG4gICAgICAgIGF6TWFwcGVyOiB0aGlzLmF6TWFwcGVyLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgaWYgKHByb3BzLmNyZWF0ZURhc2hib2FyZHMpIHtcbiAgICAgIHRoaXMub3BlcmF0aW9uRGFzaGJvYXJkcyA9IFtdO1xuXG4gICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnMuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICBsZXQgZGFzaGJvYXJkU3RhY2s6IE5lc3RlZFN0YWNrID0gbmV3IE5lc3RlZFN0YWNrKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgeC5vcGVyYXRpb25OYW1lICsgJ0Rhc2hib2FyZCcsXG4gICAgICAgICAge30sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uRGFzaGJvYXJkcykge1xuICAgICAgICAgIHRoaXMub3BlcmF0aW9uRGFzaGJvYXJkcy5wdXNoKFxuICAgICAgICAgICAgbmV3IE9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQoXG4gICAgICAgICAgICAgIGRhc2hib2FyZFN0YWNrLFxuICAgICAgICAgICAgICB4Lm9wZXJhdGlvbk5hbWUsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246IHgsXG4gICAgICAgICAgICAgICAgYXpNYXBwZXI6IHRoaXMuYXpNYXBwZXIsXG4gICAgICAgICAgICAgICAgaW50ZXJ2YWw6IHByb3BzLmludGVydmFsXG4gICAgICAgICAgICAgICAgICA/IHByb3BzLmludGVydmFsXG4gICAgICAgICAgICAgICAgICA6IER1cmF0aW9uLm1pbnV0ZXMoNjApLFxuICAgICAgICAgICAgICAgIGxvYWRCYWxhbmNlcjogcHJvcHMuc2VydmljZS5sb2FkQmFsYW5jZXIsXG5cbiAgICAgICAgICAgICAgICByZWdpb25hbEVuZHBvaW50Q2FuYXJ5QXZhaWxhYmlsaXR5QWxhcm06XG4gICAgICAgICAgICAgICAgICB0aGlzLnBlck9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzW3gub3BlcmF0aW9uTmFtZV1cbiAgICAgICAgICAgICAgICAgICAgLmNhbmFyeVJlZ2lvbmFsQWxhcm1zQW5kUnVsZXM/LmF2YWlsYWJpbGl0eUFsYXJtLFxuXG4gICAgICAgICAgICAgICAgcmVnaW9uYWxFbmRwb2ludENhbmFyeUxhdGVuY3lBbGFybTpcbiAgICAgICAgICAgICAgICAgIHRoaXMucGVyT3BlcmF0aW9uQWxhcm1zQW5kUnVsZXNbeC5vcGVyYXRpb25OYW1lXVxuICAgICAgICAgICAgICAgICAgICAuY2FuYXJ5UmVnaW9uYWxBbGFybXNBbmRSdWxlcz8ubGF0ZW5jeUFsYXJtLFxuXG4gICAgICAgICAgICAgICAgcmVnaW9uYWxFbmRwb2ludFNlcnZlckF2YWlsYWJpbGl0eUFsYXJtOlxuICAgICAgICAgICAgICAgICAgdGhpcy5wZXJPcGVyYXRpb25BbGFybXNBbmRSdWxlc1t4Lm9wZXJhdGlvbk5hbWVdXG4gICAgICAgICAgICAgICAgICAgIC5zZXJ2ZXJTaWRlUmVnaW9uYWxBbGFybXNBbmRSdWxlcy5hdmFpbGFiaWxpdHlBbGFybSxcblxuICAgICAgICAgICAgICAgIHJlZ2lvbmFsRW5kcG9pbnRTZXJ2ZXJMYXRlbmN5QWxhcm06XG4gICAgICAgICAgICAgICAgICB0aGlzLnBlck9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzW3gub3BlcmF0aW9uTmFtZV1cbiAgICAgICAgICAgICAgICAgICAgLnNlcnZlclNpZGVSZWdpb25hbEFsYXJtc0FuZFJ1bGVzLmxhdGVuY3lBbGFybSxcblxuICAgICAgICAgICAgICAgIHpvbmFsRW5kcG9pbnRDYW5hcnlBdmFpbGFiaWxpdHlBbGFybXM6XG4gICAgICAgICAgICAgICAgICB0aGlzLnBlck9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzW1xuICAgICAgICAgICAgICAgICAgICB4Lm9wZXJhdGlvbk5hbWVcbiAgICAgICAgICAgICAgICAgIF0uY2FuYXJ5Wm9uYWxBbGFybXNBbmRSdWxlcz8ubWFwKChhKSA9PiBhLmF2YWlsYWJpbGl0eUFsYXJtKSxcblxuICAgICAgICAgICAgICAgIHpvbmFsRW5kcG9pbnRDYW5hcnlMYXRlbmN5QWxhcm1zOlxuICAgICAgICAgICAgICAgICAgdGhpcy5wZXJPcGVyYXRpb25BbGFybXNBbmRSdWxlc1tcbiAgICAgICAgICAgICAgICAgICAgeC5vcGVyYXRpb25OYW1lXG4gICAgICAgICAgICAgICAgICBdLmNhbmFyeVpvbmFsQWxhcm1zQW5kUnVsZXM/Lm1hcCgoYSkgPT4gYS5sYXRlbmN5QWxhcm0pLFxuXG4gICAgICAgICAgICAgICAgem9uYWxFbmRwb2ludFNlcnZlckF2YWlsYWJpbGl0eUFsYXJtczpcbiAgICAgICAgICAgICAgICAgIHRoaXMucGVyT3BlcmF0aW9uQWxhcm1zQW5kUnVsZXNbXG4gICAgICAgICAgICAgICAgICAgIHgub3BlcmF0aW9uTmFtZVxuICAgICAgICAgICAgICAgICAgXS5zZXJ2ZXJTaWRlWm9uYWxBbGFybXNBbmRSdWxlcy5tYXAoXG4gICAgICAgICAgICAgICAgICAgIChhKSA9PiBhLmF2YWlsYWJpbGl0eUFsYXJtLFxuICAgICAgICAgICAgICAgICAgKSxcblxuICAgICAgICAgICAgICAgIHpvbmFsRW5kcG9pbnRTZXJ2ZXJMYXRlbmN5QWxhcm1zOlxuICAgICAgICAgICAgICAgICAgdGhpcy5wZXJPcGVyYXRpb25BbGFybXNBbmRSdWxlc1tcbiAgICAgICAgICAgICAgICAgICAgeC5vcGVyYXRpb25OYW1lXG4gICAgICAgICAgICAgICAgICBdLnNlcnZlclNpZGVab25hbEFsYXJtc0FuZFJ1bGVzLm1hcCgoYSkgPT4gYS5sYXRlbmN5QWxhcm0pLFxuXG4gICAgICAgICAgICAgICAgaXNvbGF0ZWRBWkltcGFjdEFsYXJtczpcbiAgICAgICAgICAgICAgICAgIHRoaXMucGVyT3BlcmF0aW9uQWxhcm1zQW5kUnVsZXNbeC5vcGVyYXRpb25OYW1lXVxuICAgICAgICAgICAgICAgICAgICAuYWdncmVnYXRlWm9uYWxBbGFybXMsXG5cbiAgICAgICAgICAgICAgICByZWdpb25hbEltcGFjdEFsYXJtOlxuICAgICAgICAgICAgICAgICAgdGhpcy5wZXJPcGVyYXRpb25BbGFybXNBbmRSdWxlc1t4Lm9wZXJhdGlvbk5hbWVdXG4gICAgICAgICAgICAgICAgICAgIC5hZ2dyZWdhdGVSZWdpb25hbEFsYXJtLFxuXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDb250cmlidXRvcnNUb0ZhdWx0czpcbiAgICAgICAgICAgICAgICAgIHRoaXMucGVyT3BlcmF0aW9uQWxhcm1zQW5kUnVsZXNbeC5vcGVyYXRpb25OYW1lXVxuICAgICAgICAgICAgICAgICAgICAuc2VydmVyU2lkZVJlZ2lvbmFsQWxhcm1zQW5kUnVsZXNcbiAgICAgICAgICAgICAgICAgICAgLmluc3RhbmNlQ29udHJpYnV0b3JzVG9SZWdpb25hbEZhdWx0cyxcblxuICAgICAgICAgICAgICAgIGluc3RhbmNlQ29udHJpYnV0b3JzVG9IaWdoTGF0ZW5jeTpcbiAgICAgICAgICAgICAgICAgIHRoaXMucGVyT3BlcmF0aW9uQWxhcm1zQW5kUnVsZXNbeC5vcGVyYXRpb25OYW1lXVxuICAgICAgICAgICAgICAgICAgICAuc2VydmVyU2lkZVJlZ2lvbmFsQWxhcm1zQW5kUnVsZXNcbiAgICAgICAgICAgICAgICAgICAgLmluc3RhbmNlQ29udHJpYnV0b3JzVG9SZWdpb25hbEhpZ2hMYXRlbmN5LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKS5kYXNoYm9hcmQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBkYXNoYm9hcmRTdGFjazogTmVzdGVkU3RhY2sgPSBuZXcgTmVzdGVkU3RhY2soXG4gICAgICAgIHRoaXMsXG4gICAgICAgICdTZXJ2aWNlRGFzaGJvYXJkJyxcbiAgICAgICAge30sXG4gICAgICApO1xuXG4gICAgICB0aGlzLnNlcnZpY2VEYXNoYm9hcmQgPSBuZXcgU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQoXG4gICAgICAgIGRhc2hib2FyZFN0YWNrLFxuICAgICAgICBwcm9wcy5zZXJ2aWNlLnNlcnZpY2VOYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIHtcbiAgICAgICAgICBpbnRlcnZhbDogcHJvcHMuaW50ZXJ2YWwgPyBwcm9wcy5pbnRlcnZhbCA6IER1cmF0aW9uLm1pbnV0ZXMoNjApLFxuICAgICAgICAgIHNlcnZpY2U6IHByb3BzLnNlcnZpY2UsXG4gICAgICAgICAgYWdncmVnYXRlUmVnaW9uYWxBbGFybTpcbiAgICAgICAgICAgIHRoaXMuc2VydmljZUFsYXJtcy5yZWdpb25hbEZhdWx0Q291bnRTZXJ2ZXJTaWRlQWxhcm0sXG4gICAgICAgICAgem9uYWxBZ2dyZWdhdGVBbGFybXM6XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VBbGFybXMuem9uYWxBZ2dyZWdhdGVJc29sYXRlZEltcGFjdEFsYXJtcyxcbiAgICAgICAgICBhek1hcHBlcjogdGhpcy5hek1hcHBlcixcbiAgICAgICAgfSxcbiAgICAgICkuZGFzaGJvYXJkO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
333
|
+
InstrumentedServiceMultiAZObservability[_a] = { fqn: "@cdklabs/multi-az-observability.InstrumentedServiceMultiAZObservability", version: "0.0.1-alpha.60" };
|
|
334
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5zdHJ1bWVudGVkU2VydmljZU11bHRpQVpPYnNlcnZhYmlsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL0luc3RydW1lbnRlZFNlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFDdEMsNkNBQW9EO0FBSXBELDJDQUFtRDtBQUNuRCxtREFBZ0Q7QUFHaEQsMkNBQXdDO0FBRXhDLCtEQUE0RDtBQUc1RCx1RkFBb0Y7QUFDcEYsbUZBQWdGO0FBQ2hGLCtFQUE0RTtBQUM1RSwrREFBNEQ7QUFDNUQsdURBQW9EO0FBRXBELHFIQUFrSDtBQUNsSCxpSEFBOEc7QUFDOUcsNEZBQXlGO0FBQ3pGLHNGQUFtRjtBQUNuRixnRkFBNkU7QUFDN0UsNkZBQTBGO0FBQzFGLG1GQUFnRjtBQUdoRiwwR0FBdUc7QUFFdkc7Ozs7R0FJRztBQUNILE1BQWEsdUNBQ1gsU0FBUSxzQkFBUztJQXNEakI7Ozs7O09BS0c7SUFDSyxnQkFBZ0IsQ0FDdEIsS0FBaUIsRUFDakIsS0FBbUQ7UUFJbkQsSUFBSSxNQUFNLEdBQUcsSUFBSSwrQkFBYyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtZQUN2RCxHQUFHLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFnQixDQUFDLG9CQUFvQixFQUFFLEdBQUc7WUFDN0QsZUFBZSxFQUNkLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZ0IsQ0FBQyxvQkFBb0IsRUFBRSxlQUFlO1lBQ3JFLFdBQVcsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWdCLENBQUMsT0FBTztnQkFDakQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZ0IsQ0FBQyxPQUFPO2dCQUN4QyxDQUFDLENBQUMsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLGVBQWUsRUFBRSxLQUFLLENB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OztBQS9mSCwwRkFnZ0JDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuaW1wb3J0IHsgRHVyYXRpb24sIE5lc3RlZFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgRGFzaGJvYXJkLCBJQWxhcm0gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBJRnVuY3Rpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IElMb2dHcm91cCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ2FuYXJ5TWV0cmljcyB9IGZyb20gJy4vQ2FuYXJ5TWV0cmljcyc7XG5pbXBvcnQgeyBJSW5zdHJ1bWVudGVkU2VydmljZU11bHRpQVpPYnNlcnZhYmlsaXR5IH0gZnJvbSAnLi9JSW5zdHJ1bWVudGVkU2VydmljZU11bHRpQVpPYnNlcnZhYmlsaXR5JztcbmltcG9ydCB7IElPcGVyYXRpb24gfSBmcm9tICcuL0lPcGVyYXRpb24nO1xuaW1wb3J0IHsgT3BlcmF0aW9uIH0gZnJvbSAnLi9PcGVyYXRpb24nO1xuaW1wb3J0IHsgSW5zdHJ1bWVudGVkU2VydmljZU11bHRpQVpPYnNlcnZhYmlsaXR5UHJvcHMgfSBmcm9tICcuL3Byb3BzL0luc3RydW1lbnRlZFNlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eVByb3BzJztcbmltcG9ydCB7IE1ldHJpY0RpbWVuc2lvbnMgfSBmcm9tICcuL3Byb3BzL01ldHJpY0RpbWVuc2lvbnMnO1xuaW1wb3J0IHsgSU9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzIH0gZnJvbSAnLi4vYWxhcm1zYW5kcnVsZXMvSU9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzJztcbmltcG9ydCB7IElTZXJ2aWNlQWxhcm1zQW5kUnVsZXMgfSBmcm9tICcuLi9hbGFybXNhbmRydWxlcy9JU2VydmljZUFsYXJtc0FuZFJ1bGVzJztcbmltcG9ydCB7IE9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzIH0gZnJvbSAnLi4vYWxhcm1zYW5kcnVsZXMvT3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMnO1xuaW1wb3J0IHsgU2VydmljZUFsYXJtc0FuZFJ1bGVzIH0gZnJvbSAnLi4vYWxhcm1zYW5kcnVsZXMvU2VydmljZUFsYXJtc0FuZFJ1bGVzJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eVpvbmVNYXBwZXIgfSBmcm9tICcuLi9hem1hcHBlci9BdmFpbGFiaWxpdHlab25lTWFwcGVyJztcbmltcG9ydCB7IENhbmFyeUZ1bmN0aW9uIH0gZnJvbSAnLi4vY2FuYXJpZXMvQ2FuYXJ5RnVuY3Rpb24nO1xuaW1wb3J0IHsgQ2FuYXJ5VGVzdCB9IGZyb20gJy4uL2NhbmFyaWVzL0NhbmFyeVRlc3QnO1xuaW1wb3J0IHsgQWRkQ2FuYXJ5VGVzdFByb3BzIH0gZnJvbSAnLi4vY2FuYXJpZXMvcHJvcHMvQWRkQ2FuYXJ5VGVzdFByb3BzJztcbmltcG9ydCB7IE9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQgfSBmcm9tICcuLi9kYXNoYm9hcmRzL09wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQnO1xuaW1wb3J0IHsgU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQgfSBmcm9tICcuLi9kYXNoYm9hcmRzL1NlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkJztcbmltcG9ydCB7IE91dGxpZXJEZXRlY3Rpb25GdW5jdGlvbiB9IGZyb20gJy4uL291dGxpZXItZGV0ZWN0aW9uL091dGxpZXJEZXRlY3Rpb25GdW5jdGlvbic7XG5pbXBvcnQgeyBPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtIH0gZnJvbSAnLi4vdXRpbGl0aWVzL091dGxpZXJEZXRlY3Rpb25BbGdvcml0aG0nO1xuaW1wb3J0IHsgU3RhY2tXaXRoRHluYW1pY1NvdXJjZSB9IGZyb20gJy4uL3V0aWxpdGllcy9TdGFja1dpdGhEeW5hbWljU291cmNlJztcbmltcG9ydCB7IE9wZXJhdGlvbkF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMgfSBmcm9tICcuL09wZXJhdGlvbkF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMnO1xuaW1wb3J0IHsgT3BlcmF0aW9uTGF0ZW5jeU1ldHJpY0RldGFpbHMgfSBmcm9tICcuL09wZXJhdGlvbkxhdGVuY3lNZXRyaWNEZXRhaWxzJztcbmltcG9ydCB7IElPcGVyYXRpb25BdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzIH0gZnJvbSAnLi9JT3BlcmF0aW9uQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyc7XG5pbXBvcnQgeyBJT3BlcmF0aW9uTGF0ZW5jeU1ldHJpY0RldGFpbHMgfSBmcm9tICcuL0lPcGVyYXRpb25MYXRlbmN5TWV0cmljRGV0YWlscyc7XG5pbXBvcnQgeyBMYXRlbmN5T3V0bGllck1ldHJpY0FnZ3JlZ2F0aW9uIH0gZnJvbSAnLi4vb3V0bGllci1kZXRlY3Rpb24vTGF0ZW5jeU91dGxpZXJNZXRyaWNBZ2dyZWdhdGlvbic7XG5cbi8qKlxuICogQW4gc2VydmljZSB0aGF0IGltcGxlbWVudHMgaXRzIG93biBpbnN0cnVtZW50YXRpb24gdG8gcmVjb3JkXG4gKiBhdmFpbGFiaWxpdHkgYW5kIGxhdGVuY3kgbWV0cmljcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZVxuICogYWxhcm1zLCBydWxlcywgYW5kIGRhc2hib2FyZHMgZnJvbVxuICovXG5leHBvcnQgY2xhc3MgSW5zdHJ1bWVudGVkU2VydmljZU11bHRpQVpPYnNlcnZhYmlsaXR5XG4gIGV4dGVuZHMgQ29uc3RydWN0XG4gIGltcGxlbWVudHMgSUluc3RydW1lbnRlZFNlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eSB7XG5cbiAgLyoqXG4gICAqIEtleSByZXByZXNlbnRzIHRoZSBvcGVyYXRpb24gbmFtZSBhbmQgdGhlIHZhbHVlIGlzIHRoZSBzZXRcbiAgICogb2Ygem9uYWwgYWxhcm1zIGFuZCBydWxlcyBmb3IgdGhhdCBvcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBwZXJPcGVyYXRpb25BbGFybXNBbmRSdWxlczoge1xuICAgIFtrZXk6IHN0cmluZ106IElPcGVyYXRpb25BbGFybXNBbmRSdWxlcztcbiAgfTtcblxuICAvKipcbiAgICogSW5kZXggaW50byB0aGUgZGljdGlvbmFyeSBieSBvcGVyYXRpb24gbmFtZSwgdGhlbiBieSBBdmFpbGFiaWxpdHkgWm9uZSBJZFxuICAgKiB0byBnZXQgdGhlIGFsYXJtcyB0aGF0IGluZGljYXRlIGFuIEFaIHNob3dzIGlzb2xhdGVkIGltcGFjdCBmcm9tIGF2YWlsYWJpbGl0eVxuICAgKiBvciBsYXRlbmN5IGFzIHNlZW4gYnkgZWl0aGVyIHRoZSBzZXJ2ZXItc2lkZSBvciBjYW5hcnkuIFRoZXNlIGFyZSB0aGUgYWxhcm1zXG4gICAqIHlvdSB3b3VsZCB3YW50IHRvIHVzZSB0byB0cmlnZ2VyIGF1dG9tYXRpb24gdG8gZXZhY3VhdGUgYW4gQVouXG4gICAqL1xuICByZWFkb25seSBwZXJPcGVyYXRpb25ab25hbEltcGFjdEFsYXJtczoge1xuICAgIFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogSUFsYXJtIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBhbGFybXMgYW5kIHJ1bGVzIGZvciB0aGUgb3ZlcmFsbCBzZXJ2aWNlXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlQWxhcm1zOiBJU2VydmljZUFsYXJtc0FuZFJ1bGVzO1xuXG4gIC8qKlxuICAgKiBUaGUgZGFzaGJvYXJkcyBmb3IgZWFjaCBvcGVyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbkRhc2hib2FyZHM/OiBEYXNoYm9hcmRbXTtcblxuICAvKipcbiAgICogVGhlIHNlcnZpY2UgbGV2ZWwgZGFzaGJvYXJkXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlRGFzaGJvYXJkPzogRGFzaGJvYXJkO1xuXG4gIC8qKlxuICAgKiBUaGUgQVogbWFwcGVyIGN1c3RvbSByZXNvdXJjZSB1c2VkIHRvIG1hcCBBWiBJZHMgdG8gTmFtZXMgYW5kIHZpY2UgYSB2ZXJzYVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhek1hcHBlcjogQXZhaWxhYmlsaXR5Wm9uZU1hcHBlcjtcblxuICAvKipcbiAgICogSWYgdGhlIHNlcnZpY2UgaXMgY29uZmlndXJlZCB0byBoYXZlIGNhbmFyeSB0ZXN0cyBjcmVhdGVkLCB0aGlzIHdpbGxcbiAgICogYmUgdGhlIGxvZyBncm91cCB3aGVyZSB0aGUgY2FuYXJ5J3MgbG9ncyBhcmUgc3RvcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGxvZyBncm91cCBpcyBjcmVhdGVkIGlmIHRoZSBjYW5hcnkgaXMgbm90IHJlcXVlc3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbmFyeUxvZ0dyb3VwPzogSUxvZ0dyb3VwO1xuXG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgdGhlIG91dGxpZXIgZGV0ZWN0aW9uIGNhbGN1bGF0aW9uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG91dGxpZXJEZXRlY3Rpb25GdW5jdGlvbj86IElGdW5jdGlvbjtcblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgY2FuYXJ5IHRlc3RpbmcgZnVuY3Rpb24gYW5kIHRlc3RcbiAgICogZXZlbnRzXG4gICAqIEBwYXJhbSBzY29wZSBcbiAgICogQHBhcmFtIHByb3BzIFxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cENhbmFyeVRlc3RzKFxuICAgIHNjb3BlOiBJQ29uc3RydWN0LFxuICAgIHByb3BzOiBJbnN0cnVtZW50ZWRTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHlQcm9wcyxcbiAgKSA6IHZvaWQge1xuXG5cbiAgICBsZXQgY2FuYXJ5ID0gbmV3IENhbmFyeUZ1bmN0aW9uKHNjb3BlLCAnQ2FuYXJ5RnVuY3Rpb24nLCB7XG4gICAgICB2cGM6IHByb3BzLnNlcnZpY2UuY2FuYXJ5VGVzdFByb3BzIS5uZXR3b3JrQ29uZmlndXJhdGlvbj8udnBjLFxuICAgICAgc3VibmV0U2VsZWN0aW9uOlxuICAgICAgIHByb3BzLnNlcnZpY2UuY2FuYXJ5VGVzdFByb3BzIS5uZXR3b3JrQ29uZmlndXJhdGlvbj8uc3VibmV0U2VsZWN0aW9uLFxuICAgICAgaHR0cFRpbWVvdXQ6IHByb3BzLnNlcnZpY2UuY2FuYXJ5VGVzdFByb3BzIS50aW1lb3V0XG4gICAgICAgID8gcHJvcHMuc2VydmljZS5jYW5hcnlUZXN0UHJvcHMhLnRpbWVvdXRcbiAgICAgICAgOiBEdXJhdGlvbi5zZWNvbmRzKDIpLFxuICAgICAgaWdub3JlVGxzRXJyb3JzOiBwcm9wcy5zZXJ2aWNlLmNhbmFyeVRlc3RQcm9wcyEuaWdub3JlVGxzRXJyb3JzXG4gICAgICAgID8gcHJvcHMuc2VydmljZS5jYW5hcnlUZXN0UHJvcHMhLmlnbm9yZVRsc0Vycm9yc1xuICAgICAgICA6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgcHJvcHMuc2VydmljZS5vcGVyYXRpb25zLmZvckVhY2goKG9wZXJhdGlvbjogSU9wZXJhdGlvbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKG9wZXJhdGlvbi5vcHRPdXRPZlNlcnZpY2VDcmVhdGVkQ2FuYXJ5ICE9IHRydWUpIHtcbiAgICAgICAgbGV0IHRlc3RQcm9wczogQWRkQ2FuYXJ5VGVzdFByb3BzID0gb3BlcmF0aW9uLmNhbmFyeVRlc3RQcm9wc1xuICAgICAgICAgID8gb3BlcmF0aW9uLmNhbmFyeVRlc3RQcm9wc1xuICAgICAgICAgIDogKHByb3BzLnNlcnZpY2UuY2FuYXJ5VGVzdFByb3BzIGFzIEFkZENhbmFyeVRlc3RQcm9wcyk7XG5cbiAgICAgICAgbGV0IG5lc3RlZFN0YWNrOiBOZXN0ZWRTdGFjayA9IG5ldyBOZXN0ZWRTdGFjayhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lICsgJ0NhbmFyeVRlc3QnLFxuICAgICAgICAgIHt9LFxuICAgICAgICApO1xuXG4gICAgICAgIGxldCB0ZXN0ID0gbmV3IENhbmFyeVRlc3QobmVzdGVkU3RhY2ssIG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lLCB7XG4gICAgICAgICAgZnVuY3Rpb246IGNhbmFyeS5mdW5jdGlvbixcbiAgICAgICAgICByZXF1ZXN0Q291bnQ6IHRlc3RQcm9wcy5yZXF1ZXN0Q291bnQsXG4gICAgICAgICAgcmVnaW9uYWxSZXF1ZXN0Q291bnQ6IHRlc3RQcm9wcy5yZWdpb25hbFJlcXVlc3RDb3VudFxuICAgICAgICAgICAgPyB0ZXN0UHJvcHMucmVnaW9uYWxSZXF1ZXN0Q291bnRcbiAgICAgICAgICAgIDogdGVzdFByb3BzLnJlcXVlc3RDb3VudCxcbiAgICAgICAgICBzY2hlZHVsZTogdGVzdFByb3BzLnNjaGVkdWxlLFxuICAgICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICAgIGxvYWRCYWxhbmNlcjogdGVzdFByb3BzLmxvYWRCYWxhbmNlcixcbiAgICAgICAgICBoZWFkZXJzOiB0ZXN0UHJvcHMuaGVhZGVycyxcbiAgICAgICAgICBwb3N0RGF0YTogdGVzdFByb3BzLnBvc3REYXRhLFxuICAgICAgICAgIGF6TWFwcGVyOiB0aGlzLmF6TWFwcGVyLFxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZGVmYXVsdEF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHM6IElPcGVyYXRpb25BdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzO1xuICAgICAgICBsZXQgZGVmYXVsdExhdGVuY3lNZXRyaWNEZXRhaWxzOiBJT3BlcmF0aW9uTGF0ZW5jeU1ldHJpY0RldGFpbHM7XG5cbiAgICAgICAgaWYgKG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzPy5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzKSB7XG4gICAgICAgICAgZGVmYXVsdEF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMgPSBuZXcgT3BlcmF0aW9uQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogb3BlcmF0aW9uLm9wZXJhdGlvbk5hbWUsXG4gICAgICAgICAgICAgIG1ldHJpY0RpbWVuc2lvbnM6IG5ldyBNZXRyaWNEaW1lbnNpb25zKFxuICAgICAgICAgICAgICAgIHsgT3BlcmF0aW9uOiBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSB9LFxuICAgICAgICAgICAgICAgICdBWi1JRCcsXG4gICAgICAgICAgICAgICAgJ1JlZ2lvbicsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIGFsYXJtU3RhdGlzdGljOlxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAgIC5hbGFybVN0YXRpc3RpYyxcbiAgICAgICAgICAgICAgZGF0YXBvaW50c1RvQWxhcm06XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgLmRhdGFwb2ludHNUb0FsYXJtLFxuICAgICAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczpcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAuZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgICAgICAgIGZhdWx0QWxhcm1UaHJlc2hvbGQ6XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgLmZhdWx0QWxhcm1UaHJlc2hvbGQsXG4gICAgICAgICAgICAgIGZhdWx0TWV0cmljTmFtZXM6XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgLmZhdWx0TWV0cmljTmFtZXMsXG4gICAgICAgICAgICAgIGdyYXBoZWRGYXVsdFN0YXRpc3RpY3M6XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgLmdyYXBoZWRGYXVsdFN0YXRpc3RpY3MsXG4gICAgICAgICAgICAgIGdyYXBoZWRTdWNjZXNzU3RhdGlzdGljczpcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAuZ3JhcGhlZFN1Y2Nlc3NTdGF0aXN0aWNzLFxuICAgICAgICAgICAgICBtZXRyaWNOYW1lc3BhY2U6XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgLm1ldHJpY05hbWVzcGFjZSxcbiAgICAgICAgICAgICAgcGVyaW9kOlxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAgIC5wZXJpb2QsXG4gICAgICAgICAgICAgIHN1Y2Nlc3NBbGFybVRocmVzaG9sZDpcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAuc3VjY2Vzc0FsYXJtVGhyZXNob2xkLFxuICAgICAgICAgICAgICBzdWNjZXNzTWV0cmljTmFtZXM6XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgLnN1Y2Nlc3NNZXRyaWNOYW1lcyxcbiAgICAgICAgICAgICAgdW5pdDogb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscy51bml0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wZXJhdGlvbi5zZXJ2aWNlLmRlZmF1bHRBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uLmNhbmFyeVRlc3RBdmFpbGFiaWxpdHlNZXRyaWNzT3ZlcnJpZGUpIHtcbiAgICAgICAgICBkZWZhdWx0QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyA9IG5ldyBPcGVyYXRpb25BdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSxcbiAgICAgICAgICAgICAgbWV0cmljTmFtZXNwYWNlOiB0ZXN0Lm1ldHJpY05hbWVzcGFjZSxcbiAgICAgICAgICAgICAgc3VjY2Vzc01ldHJpY05hbWVzOiBbJ1N1Y2Nlc3MnXSxcbiAgICAgICAgICAgICAgZmF1bHRNZXRyaWNOYW1lczogWydGYXVsdCcsICdGYWlsdXJlJ10sXG4gICAgICAgICAgICAgIG1ldHJpY0RpbWVuc2lvbnM6IG5ldyBNZXRyaWNEaW1lbnNpb25zKFxuICAgICAgICAgICAgICAgIHsgT3BlcmF0aW9uOiBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSB9LFxuICAgICAgICAgICAgICAgICdBWi1JRCcsXG4gICAgICAgICAgICAgICAgJ1JlZ2lvbicsXG4gICAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgICAgYWxhcm1TdGF0aXN0aWM6XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeVRlc3RBdmFpbGFiaWxpdHlNZXRyaWNzT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgIC5hbGFybVN0YXRpc3RpYyxcbiAgICAgICAgICAgICAgZGF0YXBvaW50c1RvQWxhcm06XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeVRlc3RBdmFpbGFiaWxpdHlNZXRyaWNzT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgIC5kYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeVRlc3RBdmFpbGFiaWxpdHlNZXRyaWNzT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgIC5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgICAgICAgZmF1bHRBbGFybVRocmVzaG9sZDpcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5VGVzdEF2YWlsYWJpbGl0eU1ldHJpY3NPdmVycmlkZVxuICAgICAgICAgICAgICAgICAgLmZhdWx0QWxhcm1UaHJlc2hvbGQsXG4gICAgICAgICAgICAgIHBlcmlvZDogb3BlcmF0aW9uLmNhbmFyeVRlc3RBdmFpbGFiaWxpdHlNZXRyaWNzT3ZlcnJpZGUucGVyaW9kLFxuICAgICAgICAgICAgICBzdWNjZXNzQWxhcm1UaHJlc2hvbGQ6XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeVRlc3RBdmFpbGFiaWxpdHlNZXRyaWNzT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgIC5zdWNjZXNzQWxhcm1UaHJlc2hvbGQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvcHMuc2VydmljZS5kZWZhdWx0QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlZmF1bHRBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzID0gbmV3IE9wZXJhdGlvbkF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lLFxuICAgICAgICAgICAgICBtZXRyaWNOYW1lc3BhY2U6IHRlc3QubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgICAgICBzdWNjZXNzTWV0cmljTmFtZXM6IFsnU3VjY2VzcyddLFxuICAgICAgICAgICAgICBmYXVsdE1ldHJpY05hbWVzOiBbJ0ZhdWx0JywgJ0ZhaWx1cmUnXSxcbiAgICAgICAgICAgICAgbWV0cmljRGltZW5zaW9uczogbmV3IE1ldHJpY0RpbWVuc2lvbnMoXG4gICAgICAgICAgICAgICAgeyBPcGVyYXRpb246IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lIH0sXG4gICAgICAgICAgICAgICAgJ0FaLUlEJyxcbiAgICAgICAgICAgICAgICAnUmVnaW9uJyxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9wcy5zZXJ2aWNlLmRlZmF1bHRBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHM/LmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzKSB7XG4gICAgICAgICAgZGVmYXVsdExhdGVuY3lNZXRyaWNEZXRhaWxzID0gbmV3IE9wZXJhdGlvbkxhdGVuY3lNZXRyaWNEZXRhaWxzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSxcbiAgICAgICAgICAgICAgbWV0cmljRGltZW5zaW9uczogbmV3IE1ldHJpY0RpbWVuc2lvbnMoXG4gICAgICAgICAgICAgICAgeyBPcGVyYXRpb246IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lIH0sXG4gICAgICAgICAgICAgICAgJ0FaLUlEJyxcbiAgICAgICAgICAgICAgICAnUmVnaW9uJyxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgYWxhcm1TdGF0aXN0aWM6XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAgIC5hbGFybVN0YXRpc3RpYyxcbiAgICAgICAgICAgICAgZGF0YXBvaW50c1RvQWxhcm06XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAgIC5kYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAgIC5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgICAgICAgZmF1bHRNZXRyaWNOYW1lczpcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgLmZhdWx0TWV0cmljTmFtZXMsXG4gICAgICAgICAgICAgIGdyYXBoZWRGYXVsdFN0YXRpc3RpY3M6XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAgIC5ncmFwaGVkRmF1bHRTdGF0aXN0aWNzLFxuICAgICAgICAgICAgICBncmFwaGVkU3VjY2Vzc1N0YXRpc3RpY3M6XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAgIC5ncmFwaGVkU3VjY2Vzc1N0YXRpc3RpY3MsXG4gICAgICAgICAgICAgIG1ldHJpY05hbWVzcGFjZTpcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgLm1ldHJpY05hbWVzcGFjZSxcbiAgICAgICAgICAgICAgcGVyaW9kOlxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAucGVyaW9kLFxuICAgICAgICAgICAgICBzdWNjZXNzQWxhcm1UaHJlc2hvbGQ6XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAgIC5zdWNjZXNzQWxhcm1UaHJlc2hvbGQsXG4gICAgICAgICAgICAgIHN1Y2Nlc3NNZXRyaWNOYW1lczpcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgLnN1Y2Nlc3NNZXRyaWNOYW1lcyxcbiAgICAgICAgICAgICAgdW5pdDogb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHNcbiAgICAgICAgICAgICAgICAudW5pdCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcGVyYXRpb24uc2VydmljZS5kZWZhdWx0TGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24uY2FuYXJ5VGVzdExhdGVuY3lNZXRyaWNzT3ZlcnJpZGUpIHtcbiAgICAgICAgICBkZWZhdWx0TGF0ZW5jeU1ldHJpY0RldGFpbHMgPSBuZXcgT3BlcmF0aW9uTGF0ZW5jeU1ldHJpY0RldGFpbHMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lLFxuICAgICAgICAgICAgICBtZXRyaWNOYW1lc3BhY2U6IHRlc3QubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgICAgICBzdWNjZXNzTWV0cmljTmFtZXM6IFsnU3VjY2Vzc0xhdGVuY3knXSxcbiAgICAgICAgICAgICAgZmF1bHRNZXRyaWNOYW1lczogWydGYXVsdExhdGVuY3knXSxcbiAgICAgICAgICAgICAgbWV0cmljRGltZW5zaW9uczogbmV3IE1ldHJpY0RpbWVuc2lvbnMoXG4gICAgICAgICAgICAgICAgeyBPcGVyYXRpb246IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lIH0sXG4gICAgICAgICAgICAgICAgJ0FaLUlEJyxcbiAgICAgICAgICAgICAgICAnUmVnaW9uJyxcbiAgICAgICAgICAgICAgKSxcblxuICAgICAgICAgICAgICBhbGFybVN0YXRpc3RpYzpcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5VGVzdExhdGVuY3lNZXRyaWNzT3ZlcnJpZGUuYWxhcm1TdGF0aXN0aWMsXG4gICAgICAgICAgICAgIGRhdGFwb2ludHNUb0FsYXJtOlxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlUZXN0TGF0ZW5jeU1ldHJpY3NPdmVycmlkZS5kYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeVRlc3RMYXRlbmN5TWV0cmljc092ZXJyaWRlLmV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICAgICAgICBwZXJpb2Q6IG9wZXJhdGlvbi5jYW5hcnlUZXN0TGF0ZW5jeU1ldHJpY3NPdmVycmlkZS5wZXJpb2QsXG4gICAgICAgICAgICAgIHN1Y2Nlc3NBbGFybVRocmVzaG9sZDpcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5VGVzdExhdGVuY3lNZXRyaWNzT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgIC5zdWNjZXNzQWxhcm1UaHJlc2hvbGQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvcHMuc2VydmljZS5kZWZhdWx0TGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWZhdWx0TGF0ZW5jeU1ldHJpY0RldGFpbHMgPSBuZXcgT3BlcmF0aW9uTGF0ZW5jeU1ldHJpY0RldGFpbHMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lLFxuICAgICAgICAgICAgICBtZXRyaWNOYW1lc3BhY2U6IHRlc3QubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgICAgICBzdWNjZXNzTWV0cmljTmFtZXM6IFsnU3VjY2Vzc0xhdGVuY3knXSxcbiAgICAgICAgICAgICAgZmF1bHRNZXRyaWNOYW1lczogWydGYXVsdExhdGVuY3knXSxcbiAgICAgICAgICAgICAgbWV0cmljRGltZW5zaW9uczogbmV3IE1ldHJpY0RpbWVuc2lvbnMoXG4gICAgICAgICAgICAgICAgeyBPcGVyYXRpb246IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lIH0sXG4gICAgICAgICAgICAgICAgJ0FaLUlEJyxcbiAgICAgICAgICAgICAgICAnUmVnaW9uJyxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9wcy5zZXJ2aWNlLmRlZmF1bHRMYXRlbmN5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5ld09wZXJhdGlvbiA9IG5ldyBPcGVyYXRpb24oe1xuICAgICAgICAgIHNlcnZlclNpZGVBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzOlxuICAgICAgICAgICAgb3BlcmF0aW9uLnNlcnZlclNpZGVBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgIHNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlsczpcbiAgICAgICAgICAgIG9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgc2VydmVyU2lkZUNvbnRyaWJ1dG9ySW5zaWdodFJ1bGVEZXRhaWxzOlxuICAgICAgICAgICAgb3BlcmF0aW9uLnNlcnZlclNpZGVDb250cmlidXRvckluc2lnaHRSdWxlRGV0YWlscyxcbiAgICAgICAgICBzZXJ2aWNlOiBvcGVyYXRpb24uc2VydmljZSxcbiAgICAgICAgICBvcGVyYXRpb25OYW1lOiBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSxcbiAgICAgICAgICBwYXRoOiBvcGVyYXRpb24ucGF0aCxcbiAgICAgICAgICBjcml0aWNhbDogb3BlcmF0aW9uLmNyaXRpY2FsLFxuICAgICAgICAgIGh0dHBNZXRob2RzOiBvcGVyYXRpb24uaHR0cE1ldGhvZHMsXG4gICAgICAgICAgY2FuYXJ5TWV0cmljRGV0YWlsczogbmV3IENhbmFyeU1ldHJpY3Moe1xuICAgICAgICAgICAgY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsczogZGVmYXVsdEF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBjYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlsczogZGVmYXVsdExhdGVuY3lNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcblxuICAgICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnNbaW5kZXhdID0gbmV3T3BlcmF0aW9uO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJbnN0cnVtZW50ZWRTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHlQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGxldCBhdmFpbGFiaWxpdHlPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtOiBPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtID0gcHJvcHMuYXZhaWxhYmlsaXR5T3V0bGllckRldGVjdGlvbkFsZ29yaXRobSB8fCBPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtLlNUQVRJQztcbiAgICBsZXQgYXZhaWxhYmlsaXR5T3V0bGllclRocmVzaG9sZDogbnVtYmVyO1xuXG4gICAgbGV0IGxhdGVuY3lPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtOiBPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtID0gcHJvcHMubGF0ZW5jeU91dGxpZXJEZXRlY3Rpb25BbGdvcml0aG0gfHwgT3V0bGllckRldGVjdGlvbkFsZ29yaXRobS5TVEFUSUM7XG4gICAgbGV0IGxhdGVuY3lPdXRsaWVyVGhyZXNob2xkOiBudW1iZXI7XG5cbiAgICAvLyBURU1QOiBGb3JjZSBvdXRsaWVyIGRldGVjdGlvbiB0byBiZSBzdGF0aWMgdW50aWwgdGhlIExhbWJkYSBvdXRsaWVyIGRldGVjdGlvbiBmdW5jdGlvbiBpcyBzY2FsYWJsZVxuICAgIGF2YWlsYWJpbGl0eU91dGxpZXJEZXRlY3Rpb25BbGdvcml0aG0gPSBPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtLlNUQVRJQztcbiAgICBsYXRlbmN5T3V0bGllckRldGVjdGlvbkFsZ29yaXRobSA9IE91dGxpZXJEZXRlY3Rpb25BbGdvcml0aG0uU1RBVElDO1xuICAgIGF2YWlsYWJpbGl0eU91dGxpZXJUaHJlc2hvbGQgPSBwcm9wcy5hdmFpbGFiaWxpdHlPdXRsaWVyVGhyZXNob2xkIHx8IDAuN1xuICAgIGxhdGVuY3lPdXRsaWVyVGhyZXNob2xkID0gcHJvcHMubGF0ZW5jeU91dGxpZXJUaHJlc2hvbGQgfHwgMC43O1xuXG4gICAgaWYgKHByb3BzLmxhdGVuY3lPdXRsaWVyTWV0cmljQWdncmVnYXRpb24gPT0gTGF0ZW5jeU91dGxpZXJNZXRyaWNBZ2dyZWdhdGlvbi5WQUxVRSAmJiBsYXRlbmN5T3V0bGllckRldGVjdGlvbkFsZ29yaXRobSA9PSBPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtLlNUQVRJQykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbm5vdCB1c2UgTGF0ZW5jeU91dGxpZXJNZXRyaWMuVkFMVUUgd2l0aCBPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtLlNUQVRJQy5cIik7XG4gICAgfVxuXG4gICAgLyppZiAoIXByb3BzLmF2YWlsYWJpbGl0eU91dGxpZXJUaHJlc2hvbGQpIHtcbiAgICAgIHN3aXRjaCAoYXZhaWxhYmlsaXR5T3V0bGllckRldGVjdGlvbkFsZ29yaXRobSkge1xuICAgICAgICBjYXNlIE91dGxpZXJEZXRlY3Rpb25BbGdvcml0aG0uQ0hJX1NRVUFSRUQ6XG4gICAgICAgICAgYXZhaWxhYmlsaXR5T3V0bGllclRocmVzaG9sZCA9IDAuMDU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgT3V0bGllckRldGVjdGlvbkFsZ29yaXRobS5JUVI6XG4gICAgICAgICAgYXZhaWxhYmlsaXR5T3V0bGllclRocmVzaG9sZCA9IDEuNTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtLk1BRDpcbiAgICAgICAgICBhdmFpbGFiaWxpdHlPdXRsaWVyVGhyZXNob2xkID0gMztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtLlNUQVRJQzpcbiAgICAgICAgICBhdmFpbGFiaWxpdHlPdXRsaWVyVGhyZXNob2xkID0gMC43O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE91dGxpZXJEZXRlY3Rpb25BbGdvcml0aG0uWl9TQ09SRTpcbiAgICAgICAgICBhdmFpbGFiaWxpdHlPdXRsaWVyVGhyZXNob2xkID0gMztcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBhdmFpbGFiaWxpdHlPdXRsaWVyVGhyZXNob2xkID0gcHJvcHMuYXZhaWxhYmlsaXR5T3V0bGllclRocmVzaG9sZDtcbiAgICB9XG5cbiAgICBpZiAoIXByb3BzLmxhdGVuY3lPdXRsaWVyVGhyZXNob2xkKSB7XG4gICAgICBzd2l0Y2ggKGxhdGVuY3lPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtKSB7XG4gICAgICAgIGNhc2UgT3V0bGllckRldGVjdGlvbkFsZ29yaXRobS5DSElfU1FVQVJFRDpcbiAgICAgICAgICBsYXRlbmN5T3V0bGllclRocmVzaG9sZCA9IDAuMDU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgT3V0bGllckRldGVjdGlvbkFsZ29yaXRobS5JUVI6XG4gICAgICAgICAgbGF0ZW5jeU91dGxpZXJUaHJlc2hvbGQgPSAxLjU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgT3V0bGllckRldGVjdGlvbkFsZ29yaXRobS5NQUQ6XG4gICAgICAgICAgbGF0ZW5jeU91dGxpZXJUaHJlc2hvbGQgPSAzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE91dGxpZXJEZXRlY3Rpb25BbGdvcml0aG0uU1RBVElDOlxuICAgICAgICAgIGxhdGVuY3lPdXRsaWVyVGhyZXNob2xkID0gMC43O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE91dGxpZXJEZXRlY3Rpb25BbGdvcml0aG0uWl9TQ09SRTpcbiAgICAgICAgICBsYXRlbmN5T3V0bGllclRocmVzaG9sZCA9IDM7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbGF0ZW5jeU91dGxpZXJUaHJlc2hvbGQgPSBwcm9wcy5sYXRlbmN5T3V0bGllclRocmVzaG9sZDtcbiAgICB9Ki9cblxuICAgIC8vIENyZWF0ZSB0aGUgQVogbWFwcGVyIHJlc291cmNlIHRoYXQgYWxsIG9mIHRoZSByZXNvdXJjZXNcbiAgICAvLyB3aWxsIHNoYXJlXG4gICAgdGhpcy5hek1hcHBlciA9IG5ldyBBdmFpbGFiaWxpdHlab25lTWFwcGVyKHRoaXMsICdBWk1hcHBlcicsIHtcbiAgICAgIGF2YWlsYWJpbGl0eVpvbmVOYW1lczogcHJvcHMuc2VydmljZS5hdmFpbGFiaWxpdHlab25lTmFtZXMsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGNhbmFyeSB0ZXN0aW5nIHN0YWNrIGlmIHRoZSB1c2VyIHByb3ZpZGVkIGlucHV0XG4gICAgaWYgKHByb3BzLnNlcnZpY2UuY2FuYXJ5VGVzdFByb3BzKSB7XG4gICAgICBsZXQgY2FuYXJ5U3RhY2s6IFN0YWNrV2l0aER5bmFtaWNTb3VyY2UgPSBuZXcgU3RhY2tXaXRoRHluYW1pY1NvdXJjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgJ0NhbmFyeScsXG4gICAgICAgIHtcbiAgICAgICAgICBhc3NldHNCdWNrZXRzUGFyYW1ldGVyTmFtZTogcHJvcHMuYXNzZXRzQnVja2V0UGFyYW1ldGVyTmFtZSxcbiAgICAgICAgICBhc3NldHNCdWNrZXRQcmVmaXhQYXJhbWV0ZXJOYW1lOlxuICAgICAgICAgICAgcHJvcHMuYXNzZXRzQnVja2V0UHJlZml4UGFyYW1ldGVyTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuc2V0dXBDYW5hcnlUZXN0cyhjYW5hcnlTdGFjaywgcHJvcHMpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgb3V0bGllciBkZXRlY3Rpb24gbGFtYmRhIGZ1bmN0aW9uIHN0YWNrIGlmIHdlJ3JlIG5vdFxuICAgIC8vIHVzaW5nIHN0YXRpYyBvdXRsaWVyIGRldGVjdGlvblxuICAgIGlmIChhdmFpbGFiaWxpdHlPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtICE9IE91dGxpZXJEZXRlY3Rpb25BbGdvcml0aG0uU1RBVElDIHx8IGxhdGVuY3lPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtICE9IE91dGxpZXJEZXRlY3Rpb25BbGdvcml0aG0uU1RBVElDKSB7XG4gICAgICBsZXQgb3V0bGllckRldGVjdGlvblN0YWNrOiBTdGFja1dpdGhEeW5hbWljU291cmNlID1cbiAgICAgICAgbmV3IFN0YWNrV2l0aER5bmFtaWNTb3VyY2UodGhpcywgJ091dGxpZXJEZXRlY3Rpb25TdGFjaycsIHtcbiAgICAgICAgICBhc3NldHNCdWNrZXRzUGFyYW1ldGVyTmFtZTogcHJvcHMuYXNzZXRzQnVja2V0UGFyYW1ldGVyTmFtZSxcbiAgICAgICAgICBhc3NldHNCdWNrZXRQcmVmaXhQYXJhbWV0ZXJOYW1lOlxuICAgICAgICAgICAgcHJvcHMuYXNzZXRzQnVja2V0UHJlZml4UGFyYW1ldGVyTmFtZSxcbiAgICAgICAgfSk7XG4gIFxuICAgICAgdGhpcy5vdXRsaWVyRGV0ZWN0aW9uRnVuY3Rpb24gPSBuZXcgT3V0bGllckRldGVjdGlvbkZ1bmN0aW9uKFxuICAgICAgICBvdXRsaWVyRGV0ZWN0aW9uU3RhY2ssXG4gICAgICAgICdPdXRsaWVyRGV0ZWN0aW9uRnVuY3Rpb24nLFxuICAgICAgICB7fSxcbiAgICAgICkuZnVuY3Rpb247XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBwZXIgb3BlcmF0aW9uIGFsYXJtcyBhbmQgY29udHJpYnV0b3IgaW5zaWdodCBydWxlc1xuICAgIHRoaXMucGVyT3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnMubWFwKChvcGVyYXRpb246IElPcGVyYXRpb24pID0+IHtcbiAgICAgICAgbGV0IG5lc3RlZFN0YWNrOiBOZXN0ZWRTdGFjayA9IG5ldyBOZXN0ZWRTdGFjayhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lICsgJ09wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzTmVzdGVkU3RhY2snLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgb3BlcmF0aW9uLm9wZXJhdGlvbk5hbWUsXG4gICAgICAgICAgbmV3IE9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzKG5lc3RlZFN0YWNrLCBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSwge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb24sXG4gICAgICAgICAgICBsYXRlbmN5T3V0bGllckRldGVjdGlvbkFsZ29yaXRobTogbGF0ZW5jeU91dGxpZXJEZXRlY3Rpb25BbGdvcml0aG0sXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtOiBhdmFpbGFiaWxpdHlPdXRsaWVyRGV0ZWN0aW9uQWxnb3JpdGhtLFxuICAgICAgICAgICAgbGF0ZW5jeU91dGxpZXJUaHJlc2hvbGQ6IGxhdGVuY3lPdXRsaWVyVGhyZXNob2xkLFxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5T3V0bGllclRocmVzaG9sZDogYXZhaWxhYmlsaXR5T3V0bGllclRocmVzaG9sZCxcbiAgICAgICAgICAgIGxvYWRCYWxhbmNlcjogcHJvcHMuc2VydmljZS5sb2FkQmFsYW5jZXIsXG4gICAgICAgICAgICBhek1hcHBlcjogdGhpcy5hek1hcHBlcixcbiAgICAgICAgICAgIG91dGxpZXJEZXRlY3Rpb25GdW5jdGlvbjogdGhpcy5vdXRsaWVyRGV0ZWN0aW9uRnVuY3Rpb24sXG4gICAgICAgICAgICBsYXRlbmN5T3V0bGllck1ldHJpY0FnZ3JlZ2F0aW9uOiBwcm9wcy5sYXRlbmN5T3V0bGllck1ldHJpY0FnZ3JlZ2F0aW9uLFxuICAgICAgICAgICAgbWluaW11bVVuaGVhbHRoeVRhcmdldHM6IHByb3BzLnNlcnZpY2UubWluaW11bVVuaGVhbHRoeVRhcmdldHNcbiAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLnBlck9wZXJhdGlvblpvbmFsSW1wYWN0QWxhcm1zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5wZXJPcGVyYXRpb25BbGFybXNBbmRSdWxlcykubWFwKChbb3BlcmF0aW9uTmFtZSwgb3BlcmF0aW9uQWxhcm1zQW5kUnVsZXNdKSA9PiB7XG4gICAgICAgIHJldHVybiBbb3BlcmF0aW9uTmFtZSwgb3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMuYWdncmVnYXRlWm9uYWxBbGFybXNdO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGxldCBzZXJ2aWNlQWxhcm1zU3RhY2s6IE5lc3RlZFN0YWNrID0gbmV3IE5lc3RlZFN0YWNrKFxuICAgICAgdGhpcyxcbiAgICAgICdTZXJ2aWNlQWxhcm1zTmVzdGVkU3RhY2snLFxuICAgICk7XG5cbiAgICB0aGlzLnNlcnZpY2VBbGFybXMgPSBuZXcgU2VydmljZUFsYXJtc0FuZFJ1bGVzKFxuICAgICAgc2VydmljZUFsYXJtc1N0YWNrLFxuICAgICAgcHJvcHMuc2VydmljZS5zZXJ2aWNlTmFtZSxcbiAgICAgIHtcbiAgICAgICAgcGVyT3BlcmF0aW9uQWxhcm1zQW5kUnVsZXM6IHRoaXMucGVyT3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMsXG4gICAgICAgIHNlcnZpY2U6IHByb3BzLnNlcnZpY2UsXG4gICAgICAgIGF6TWFwcGVyOiB0aGlzLmF6TWFwcGVyLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgaWYgKHByb3BzLmNyZWF0ZURhc2hib2FyZHMpIHtcbiAgICAgIHRoaXMub3BlcmF0aW9uRGFzaGJvYXJkcyA9IFtdO1xuXG4gICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnMuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICBsZXQgZGFzaGJvYXJkU3RhY2s6IE5lc3RlZFN0YWNrID0gbmV3IE5lc3RlZFN0YWNrKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgeC5vcGVyYXRpb25OYW1lICsgJ0Rhc2hib2FyZCcsXG4gICAgICAgICAge30sXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vcGVyYXRpb25EYXNoYm9hcmRzIS5wdXNoKFxuICAgICAgICAgIG5ldyBPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkKFxuICAgICAgICAgICAgZGFzaGJvYXJkU3RhY2ssXG4gICAgICAgICAgICB4Lm9wZXJhdGlvbk5hbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzOiB0aGlzLnBlck9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzW3gub3BlcmF0aW9uTmFtZV0sXG4gICAgICAgICAgICAgIGF6TWFwcGVyOiB0aGlzLmF6TWFwcGVyLFxuICAgICAgICAgICAgICBpbnRlcnZhbDogcHJvcHMuaW50ZXJ2YWxcbiAgICAgICAgICAgICAgICA/IHByb3BzLmludGVydmFsXG4gICAgICAgICAgICAgICAgOiBEdXJhdGlvbi5taW51dGVzKDYwKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKS5kYXNoYm9hcmQsXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgbGV0IGRhc2hib2FyZFN0YWNrOiBOZXN0ZWRTdGFjayA9IG5ldyBOZXN0ZWRTdGFjayhcbiAgICAgICAgdGhpcyxcbiAgICAgICAgJ1NlcnZpY2VEYXNoYm9hcmQnLFxuICAgICAgICB7fSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuc2VydmljZURhc2hib2FyZCA9IG5ldyBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZChcbiAgICAgICAgZGFzaGJvYXJkU3RhY2ssXG4gICAgICAgIHByb3BzLnNlcnZpY2Uuc2VydmljZU5hbWUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAge1xuICAgICAgICAgIGludGVydmFsOiBwcm9wcy5pbnRlcnZhbCA/IHByb3BzLmludGVydmFsIDogRHVyYXRpb24ubWludXRlcyg2MCksXG4gICAgICAgICAgc2VydmljZUFsYXJtc0FuZFJ1bGVzOiB0aGlzLnNlcnZpY2VBbGFybXMsXG4gICAgICAgICAgc2VydmljZTogcHJvcHMuc2VydmljZSxcbiAgICAgICAgICBhek1hcHBlcjogdGhpcy5hek1hcHBlcixcbiAgICAgICAgICBvcGVyYXRpb25zRGFzaGJvYXJkOiB0aGlzLm9wZXJhdGlvbkRhc2hib2FyZHNcbiAgICAgICAgfSxcbiAgICAgICkuZGFzaGJvYXJkO1xuICAgIH1cbiAgfVxufVxuIl19
|