@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
|
@@ -7,580 +7,506 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
|
7
7
|
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
8
8
|
const constructs_1 = require("constructs");
|
|
9
9
|
const ContributorInsightsWidget_1 = require("./ContributorInsightsWidget");
|
|
10
|
-
const ApplicationLoadBalancerMetrics_1 = require("../metrics/ApplicationLoadBalancerMetrics");
|
|
11
|
-
const NetworkLoadBalancerMetrics_1 = require("../metrics/NetworkLoadBalancerMetrics");
|
|
12
|
-
const RegionalAvailabilityMetrics_1 = require("../metrics/RegionalAvailabilityMetrics");
|
|
13
|
-
const RegionalLatencyMetrics_1 = require("../metrics/RegionalLatencyMetrics");
|
|
14
|
-
const ZonalAvailabilityMetrics_1 = require("../metrics/ZonalAvailabilityMetrics");
|
|
15
10
|
const ZonalLatencyMetrics_1 = require("../metrics/ZonalLatencyMetrics");
|
|
16
11
|
const AvailabilityMetricType_1 = require("../utilities/AvailabilityMetricType");
|
|
17
12
|
const LatencyMetricType_1 = require("../utilities/LatencyMetricType");
|
|
18
13
|
const MetricsHelper_1 = require("../utilities/MetricsHelper");
|
|
14
|
+
const AvailabilityAndLatencyMetrics_1 = require("../metrics/AvailabilityAndLatencyMetrics");
|
|
19
15
|
/**
|
|
20
16
|
* Creates an operation level availability and latency dashboard
|
|
21
17
|
*/
|
|
22
18
|
class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
23
|
-
static
|
|
24
|
-
let
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}),
|
|
32
|
-
];
|
|
33
|
-
for (let i = 0; i < availabilityZoneIds.length; i++) {
|
|
34
|
-
let availabilityZoneId = availabilityZoneIds[i];
|
|
35
|
-
topLevelAggregateAlarms.push(new aws_cloudwatch_1.AlarmStatusWidget({
|
|
36
|
-
height: 2,
|
|
37
|
-
width: 8,
|
|
38
|
-
alarms: [props.isolatedAZImpactAlarms[i]],
|
|
39
|
-
title: availabilityZoneId + ' Isolated Impact',
|
|
40
|
-
}));
|
|
41
|
-
}
|
|
42
|
-
topLevelAggregateAlarms.push(new aws_cloudwatch_1.TextWidget({ height: 2, width: 24, markdown: '**AZ Contributors**' }));
|
|
43
|
-
let zonalServerSideHighLatencyMetrics = [];
|
|
44
|
-
let zonalServerSideFaultCountMetrics = [];
|
|
45
|
-
let zonalCanaryHighLatencyMetrics = [];
|
|
46
|
-
let zonalCanaryFaultCountMetrics = [];
|
|
47
|
-
let keyPrefix = MetricsHelper_1.MetricsHelper.nextChar();
|
|
48
|
-
for (let i = 0; i < availabilityZoneIds.length; i++) {
|
|
49
|
-
let availabilityZoneId = availabilityZoneIds[i];
|
|
50
|
-
zonalServerSideHighLatencyMetrics.push(ZonalLatencyMetrics_1.ZonalLatencyMetrics.createZonalCountLatencyMetric({
|
|
51
|
-
availabilityZoneId: availabilityZoneId,
|
|
52
|
-
metricDetails: props.operation.serverSideLatencyMetricDetails,
|
|
53
|
-
label: availabilityZoneId + ' high latency responses',
|
|
54
|
-
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
55
|
-
statistic: `TC(${props.operation.serverSideLatencyMetricDetails.successAlarmThreshold}:)`,
|
|
56
|
-
keyPrefix: keyPrefix,
|
|
57
|
-
}));
|
|
58
|
-
zonalServerSideFaultCountMetrics.push(ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalAvailabilityMetric({
|
|
59
|
-
availabilityZoneId: availabilityZoneId,
|
|
60
|
-
metricDetails: props.operation.serverSideAvailabilityMetricDetails,
|
|
61
|
-
label: availabilityZoneId + ' fault count',
|
|
62
|
-
metricType: AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT,
|
|
63
|
-
keyPrefix: keyPrefix,
|
|
64
|
-
}));
|
|
65
|
-
if (props.operation.canaryMetricDetails !== undefined &&
|
|
66
|
-
props.operation.canaryMetricDetails != null) {
|
|
67
|
-
zonalCanaryHighLatencyMetrics.push(ZonalLatencyMetrics_1.ZonalLatencyMetrics.createZonalCountLatencyMetric({
|
|
68
|
-
availabilityZoneId: availabilityZoneId,
|
|
69
|
-
metricDetails: props.operation.canaryMetricDetails.canaryLatencyMetricDetails,
|
|
70
|
-
label: availabilityZoneId + ' high latency responses',
|
|
71
|
-
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
72
|
-
statistic: `TC(${props.operation.canaryMetricDetails.canaryLatencyMetricDetails.successAlarmThreshold}:)`,
|
|
73
|
-
keyPrefix: keyPrefix,
|
|
74
|
-
}));
|
|
75
|
-
zonalCanaryFaultCountMetrics.push(ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalAvailabilityMetric({
|
|
76
|
-
availabilityZoneId: availabilityZoneId,
|
|
77
|
-
metricDetails: props.operation.canaryMetricDetails
|
|
78
|
-
.canaryAvailabilityMetricDetails,
|
|
79
|
-
label: availabilityZoneId + ' fault count',
|
|
80
|
-
metricType: AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT,
|
|
81
|
-
keyPrefix: keyPrefix,
|
|
82
|
-
}));
|
|
83
|
-
}
|
|
84
|
-
keyPrefix = MetricsHelper_1.MetricsHelper.nextChar(keyPrefix);
|
|
85
|
-
}
|
|
86
|
-
topLevelAggregateAlarms.push(new aws_cloudwatch_1.GraphWidget({
|
|
87
|
-
height: 6,
|
|
88
|
-
width: 24,
|
|
89
|
-
title: 'Server-side AZ Fault Contributors',
|
|
90
|
-
left: zonalServerSideFaultCountMetrics,
|
|
91
|
-
}));
|
|
92
|
-
if (zonalCanaryFaultCountMetrics.length > 0) {
|
|
93
|
-
topLevelAggregateAlarms.push(new aws_cloudwatch_1.GraphWidget({
|
|
94
|
-
height: 6,
|
|
95
|
-
width: 24,
|
|
96
|
-
title: 'Canary AZ Fault Contributors',
|
|
97
|
-
left: zonalCanaryFaultCountMetrics,
|
|
98
|
-
}));
|
|
99
|
-
}
|
|
100
|
-
topLevelAggregateAlarms.push(new aws_cloudwatch_1.GraphWidget({
|
|
101
|
-
height: 6,
|
|
102
|
-
width: 24,
|
|
103
|
-
title: 'Server-side High Latency Contributors',
|
|
104
|
-
left: zonalServerSideHighLatencyMetrics,
|
|
19
|
+
static createServerSideWidgets(dashboard, props) {
|
|
20
|
+
let operation = props.operationAlarmsAndRules.operation;
|
|
21
|
+
let availabilityZones = props.operationAlarmsAndRules.operation.service.availabilityZoneNames;
|
|
22
|
+
dashboard.addWidgets(new aws_cloudwatch_1.TextWidget({
|
|
23
|
+
markdown: "## **Server-side Metrics**",
|
|
24
|
+
background: aws_cloudwatch_1.TextWidgetBackground.TRANSPARENT,
|
|
25
|
+
height: 1,
|
|
26
|
+
width: 24
|
|
105
27
|
}));
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
topLevelAggregateAlarms.push(new aws_cloudwatch_1.TextWidget({ height: 2, width: 24, markdown: '**TPS Metrics**' }));
|
|
115
|
-
topLevelAggregateAlarms.push(new aws_cloudwatch_1.GraphWidget({
|
|
116
|
-
height: 6,
|
|
117
|
-
width: 24,
|
|
118
|
-
title: aws_cdk_lib_1.Fn.sub('${AWS::Region} TPS'),
|
|
119
|
-
region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
|
|
28
|
+
dashboard.addWidgets(
|
|
29
|
+
// Server-side availability
|
|
30
|
+
new aws_cloudwatch_1.GraphWidget({
|
|
31
|
+
height: 8,
|
|
32
|
+
width: 6,
|
|
33
|
+
title: 'Availability',
|
|
34
|
+
region: aws_cdk_lib_1.Aws.REGION,
|
|
120
35
|
left: [
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
36
|
+
...availabilityZones.map((availabilityZone, index) => {
|
|
37
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
38
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
39
|
+
return AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createZonalAvailabilityMetric({
|
|
40
|
+
availabilityZoneId: availabilityZoneId,
|
|
41
|
+
availabilityZone: availabilityZone,
|
|
42
|
+
label: availabilityZoneId + " (avg: ${AVG} min: ${MIN})",
|
|
43
|
+
metricDetails: operation.serverSideAvailabilityMetricDetails,
|
|
44
|
+
metricType: AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE,
|
|
45
|
+
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
46
|
+
}, operation.serverSideLatencyMetricDetails.metricDimensions.zonalDimensions(availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
|
|
125
47
|
}),
|
|
48
|
+
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createAvailabilityMetric({
|
|
49
|
+
label: aws_cdk_lib_1.Aws.REGION + " (avg: ${AVG} min: ${MIN})",
|
|
50
|
+
metricDetails: operation.serverSideAvailabilityMetricDetails,
|
|
51
|
+
metricType: AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE,
|
|
52
|
+
color: MetricsHelper_1.MetricsHelper.regionColor
|
|
53
|
+
}, operation.serverSideLatencyMetricDetails.metricDimensions.regionalDimensions(aws_cdk_lib_1.Aws.REGION))
|
|
126
54
|
],
|
|
127
55
|
statistic: 'Sum',
|
|
128
56
|
leftYAxis: {
|
|
129
|
-
|
|
57
|
+
max: 100,
|
|
58
|
+
min: 95,
|
|
59
|
+
label: 'Percent',
|
|
130
60
|
showUnits: false,
|
|
131
61
|
},
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
title: availabilityZoneId + ' TPS',
|
|
139
|
-
region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
|
|
140
|
-
left: [
|
|
141
|
-
ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalAvailabilityMetric({
|
|
142
|
-
availabilityZoneId: availabilityZoneId,
|
|
143
|
-
label: availabilityZoneId + ' tps',
|
|
144
|
-
metricDetails: props.operation.serverSideAvailabilityMetricDetails,
|
|
145
|
-
metricType: AvailabilityMetricType_1.AvailabilityMetricType.REQUEST_COUNT,
|
|
146
|
-
}),
|
|
147
|
-
],
|
|
148
|
-
statistic: 'Sum',
|
|
149
|
-
leftYAxis: {
|
|
150
|
-
label: 'TPS',
|
|
151
|
-
showUnits: false,
|
|
62
|
+
leftAnnotations: [
|
|
63
|
+
{
|
|
64
|
+
value: operation.serverSideAvailabilityMetricDetails.successAlarmThreshold,
|
|
65
|
+
visible: true,
|
|
66
|
+
color: aws_cloudwatch_1.Color.RED,
|
|
67
|
+
label: 'High Severity',
|
|
152
68
|
},
|
|
153
|
-
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
69
|
+
]
|
|
70
|
+
}),
|
|
71
|
+
// Server-side fault count
|
|
72
|
+
new aws_cloudwatch_1.GraphWidget({
|
|
73
|
+
height: 8,
|
|
74
|
+
width: 6,
|
|
75
|
+
title: 'Fault Count',
|
|
76
|
+
region: aws_cdk_lib_1.Aws.REGION,
|
|
77
|
+
left: availabilityZones.map((availabilityZone, index) => {
|
|
78
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
79
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
80
|
+
return AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createZonalAvailabilityMetric({
|
|
81
|
+
availabilityZoneId: availabilityZoneId,
|
|
82
|
+
availabilityZone: availabilityZone,
|
|
83
|
+
label: availabilityZoneId + " (avg: ${AVG} max: ${MAX})",
|
|
84
|
+
metricDetails: operation.serverSideAvailabilityMetricDetails,
|
|
85
|
+
metricType: AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT,
|
|
86
|
+
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
87
|
+
}, operation.serverSideLatencyMetricDetails.metricDimensions.zonalDimensions(availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
|
|
88
|
+
}),
|
|
89
|
+
statistic: 'Sum',
|
|
90
|
+
leftYAxis: {
|
|
91
|
+
min: 0,
|
|
92
|
+
label: 'Count',
|
|
93
|
+
showUnits: false,
|
|
94
|
+
}
|
|
95
|
+
}),
|
|
96
|
+
// Server-side request count
|
|
97
|
+
new aws_cloudwatch_1.GraphWidget({
|
|
98
|
+
height: 8,
|
|
99
|
+
width: 6,
|
|
100
|
+
title: "Request Count",
|
|
101
|
+
region: aws_cdk_lib_1.Aws.REGION,
|
|
102
|
+
left: availabilityZones.map((availabilityZone, index) => {
|
|
103
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
104
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
105
|
+
return AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createZonalAvailabilityMetric({
|
|
106
|
+
availabilityZoneId: availabilityZoneId,
|
|
107
|
+
availabilityZone: availabilityZone,
|
|
108
|
+
label: availabilityZoneId + " (avg: ${AVG} max: ${MAX})",
|
|
109
|
+
metricDetails: operation.serverSideAvailabilityMetricDetails,
|
|
110
|
+
metricType: AvailabilityMetricType_1.AvailabilityMetricType.REQUEST_COUNT,
|
|
111
|
+
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
112
|
+
}, operation.serverSideLatencyMetricDetails.metricDimensions.zonalDimensions(availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
|
|
113
|
+
}),
|
|
114
|
+
statistic: 'Sum',
|
|
115
|
+
leftYAxis: {
|
|
116
|
+
label: 'Count',
|
|
117
|
+
showUnits: false,
|
|
118
|
+
},
|
|
119
|
+
}),
|
|
120
|
+
// Server-side instance contributors to faults
|
|
121
|
+
...props.operationAlarmsAndRules.serverSideRegionalAlarmsAndRules.instanceContributorsToRegionalFaults ?
|
|
122
|
+
[
|
|
123
|
+
new ContributorInsightsWidget_1.ContributorInsightsWidget({
|
|
124
|
+
height: 8,
|
|
125
|
+
width: 6,
|
|
126
|
+
title: 'Individual Instance Contributors to Fault Count',
|
|
127
|
+
insightRule: props.operationAlarmsAndRules.serverSideRegionalAlarmsAndRules.instanceContributorsToRegionalFaults,
|
|
128
|
+
period: operation.serverSideAvailabilityMetricDetails.period,
|
|
129
|
+
legendPosition: aws_cloudwatch_1.LegendPosition.BOTTOM,
|
|
130
|
+
orderStatistic: 'Sum',
|
|
131
|
+
accountId: aws_cdk_lib_1.Aws.ACCOUNT_ID,
|
|
132
|
+
topContributors: 10,
|
|
133
|
+
})
|
|
134
|
+
] : []);
|
|
135
|
+
// Server-side latency
|
|
136
|
+
let latencyWidgets = [];
|
|
137
|
+
operation.serverSideLatencyMetricDetails.successMetricNames.forEach((metricName) => {
|
|
138
|
+
operation.serverSideLatencyMetricDetails.graphedSuccessStatistics?.forEach((statistic) => {
|
|
139
|
+
latencyWidgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
140
|
+
height: 8,
|
|
141
|
+
width: 6,
|
|
142
|
+
title: `${metricName} Latency (${statistic})`,
|
|
143
|
+
region: aws_cdk_lib_1.Aws.REGION,
|
|
144
|
+
left: [
|
|
145
|
+
...availabilityZones.map((availabilityZone, index) => {
|
|
146
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
147
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
148
|
+
return ZonalLatencyMetrics_1.ZonalLatencyMetrics.createZonalLatencyMetric({
|
|
149
|
+
metricName: metricName,
|
|
150
|
+
label: availabilityZoneId + " (avg: ${AVG} max: ${MAX})",
|
|
151
|
+
metricDetails: operation.serverSideLatencyMetricDetails,
|
|
152
|
+
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
153
|
+
statistic: statistic,
|
|
154
|
+
availabilityZoneId: availabilityZoneId,
|
|
155
|
+
availabilityZone: availabilityZone,
|
|
156
|
+
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
157
|
+
});
|
|
158
|
+
}),
|
|
159
|
+
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createLatencyMetric({
|
|
160
|
+
metricName: metricName,
|
|
161
|
+
label: aws_cdk_lib_1.Aws.REGION + " (avg: ${AVG} max: ${MAX})",
|
|
162
|
+
metricDetails: operation.serverSideLatencyMetricDetails,
|
|
163
|
+
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
164
|
+
statistic: statistic,
|
|
165
|
+
color: MetricsHelper_1.MetricsHelper.regionColor
|
|
166
|
+
}, operation.serverSideLatencyMetricDetails.metricDimensions.regionalDimensions(aws_cdk_lib_1.Aws.REGION))
|
|
167
|
+
],
|
|
168
|
+
leftYAxis: {
|
|
169
|
+
max: MetricsHelper_1.MetricsHelper.convertDurationByUnit(operation.serverSideLatencyMetricDetails.successAlarmThreshold, operation.serverSideLatencyMetricDetails.unit) * 1.5,
|
|
170
|
+
min: 0,
|
|
171
|
+
label: operation.serverSideLatencyMetricDetails.unit,
|
|
172
|
+
showUnits: false,
|
|
173
|
+
},
|
|
174
|
+
leftAnnotations: [
|
|
175
|
+
{
|
|
176
|
+
value: MetricsHelper_1.MetricsHelper.convertDurationByUnit(operation.serverSideLatencyMetricDetails.successAlarmThreshold, operation.serverSideLatencyMetricDetails.unit),
|
|
177
|
+
visible: true,
|
|
178
|
+
color: aws_cloudwatch_1.Color.RED,
|
|
179
|
+
label: 'High Severity',
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
}));
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
dashboard.addWidgets(...latencyWidgets,
|
|
186
|
+
// Server-side high latency request count
|
|
187
|
+
new aws_cloudwatch_1.GraphWidget({
|
|
165
188
|
height: 8,
|
|
189
|
+
width: 6,
|
|
190
|
+
title: 'High Latency Request Count',
|
|
191
|
+
left: availabilityZones.map((availabilityZone, index) => {
|
|
192
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
193
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
194
|
+
return ZonalLatencyMetrics_1.ZonalLatencyMetrics.createZonalCountLatencyMetric({
|
|
195
|
+
availabilityZoneId: availabilityZoneId,
|
|
196
|
+
availabilityZone: availabilityZone,
|
|
197
|
+
metricDetails: operation.serverSideLatencyMetricDetails,
|
|
198
|
+
label: availabilityZoneId + " (avg: ${AVG} max: ${MAX})",
|
|
199
|
+
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
200
|
+
statistic: `TC(${MetricsHelper_1.MetricsHelper.convertDurationByUnit(operation.serverSideLatencyMetricDetails.successAlarmThreshold, operation.serverSideLatencyMetricDetails.unit)}:)`,
|
|
201
|
+
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
202
|
+
});
|
|
203
|
+
}),
|
|
204
|
+
statistic: 'Sum',
|
|
205
|
+
leftYAxis: {
|
|
206
|
+
label: 'Count',
|
|
207
|
+
showUnits: false,
|
|
208
|
+
},
|
|
209
|
+
}),
|
|
210
|
+
// Server-side instance contributors to latency
|
|
211
|
+
...props.operationAlarmsAndRules.serverSideRegionalAlarmsAndRules.instanceContributorsToRegionalHighLatency ?
|
|
212
|
+
[
|
|
213
|
+
new ContributorInsightsWidget_1.ContributorInsightsWidget({
|
|
214
|
+
height: 8,
|
|
215
|
+
width: 6,
|
|
216
|
+
title: 'Individual Instance Contributors to High Latency',
|
|
217
|
+
insightRule: props.operationAlarmsAndRules.serverSideRegionalAlarmsAndRules.instanceContributorsToRegionalHighLatency,
|
|
218
|
+
period: operation.serverSideLatencyMetricDetails.period,
|
|
219
|
+
legendPosition: aws_cloudwatch_1.LegendPosition.BOTTOM,
|
|
220
|
+
orderStatistic: 'Sum',
|
|
221
|
+
accountId: aws_cdk_lib_1.Aws.ACCOUNT_ID,
|
|
222
|
+
topContributors: 10,
|
|
223
|
+
})
|
|
224
|
+
] : []);
|
|
225
|
+
dashboard.addWidgets(new aws_cloudwatch_1.TextWidget({
|
|
226
|
+
height: 1,
|
|
166
227
|
width: 24,
|
|
167
|
-
|
|
168
|
-
|
|
228
|
+
markdown: "### Alarms",
|
|
229
|
+
background: aws_cloudwatch_1.TextWidgetBackground.TRANSPARENT
|
|
230
|
+
}), ...Object.keys(props.operationAlarmsAndRules.serverSideZonalAlarmsAndRules).map((availabilityZone) => {
|
|
231
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
232
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
233
|
+
return new aws_cloudwatch_1.AlarmWidget({
|
|
234
|
+
alarm: props.operationAlarmsAndRules.serverSideZonalAlarmsAndRules[availabilityZone].availabilityAlarm,
|
|
235
|
+
title: `${availabilityZoneId} Availability`,
|
|
236
|
+
height: 2,
|
|
237
|
+
width: 8
|
|
238
|
+
});
|
|
239
|
+
}), ...Object.keys(props.operationAlarmsAndRules.serverSideZonalAlarmsAndRules).map((availabilityZone) => {
|
|
240
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
241
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
242
|
+
return new aws_cloudwatch_1.AlarmWidget({
|
|
243
|
+
alarm: props.operationAlarmsAndRules.serverSideZonalAlarmsAndRules[availabilityZone].latencyAlarm,
|
|
244
|
+
title: `${availabilityZoneId} Latency`,
|
|
245
|
+
height: 2,
|
|
246
|
+
width: 8
|
|
247
|
+
});
|
|
248
|
+
}));
|
|
249
|
+
}
|
|
250
|
+
static createCanaryWidgets(dashboard, props) {
|
|
251
|
+
let operation = props.operationAlarmsAndRules.operation;
|
|
252
|
+
let availabilityZones = operation.service.availabilityZoneNames;
|
|
253
|
+
dashboard.addWidgets(new aws_cloudwatch_1.TextWidget({
|
|
254
|
+
markdown: "## **Canary Metrics**",
|
|
255
|
+
background: aws_cloudwatch_1.TextWidgetBackground.TRANSPARENT,
|
|
256
|
+
height: 1,
|
|
257
|
+
width: 24
|
|
258
|
+
}));
|
|
259
|
+
dashboard.addWidgets(
|
|
260
|
+
// Canary availability
|
|
261
|
+
new aws_cloudwatch_1.GraphWidget({
|
|
262
|
+
height: 8,
|
|
263
|
+
width: 6,
|
|
264
|
+
title: 'Availability',
|
|
265
|
+
region: aws_cdk_lib_1.Aws.REGION,
|
|
169
266
|
left: [
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
267
|
+
...availabilityZones.map((availabilityZone, index) => {
|
|
268
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
269
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
270
|
+
return AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createZonalAvailabilityMetric({
|
|
271
|
+
availabilityZoneId: availabilityZoneId,
|
|
272
|
+
availabilityZone: availabilityZone,
|
|
273
|
+
label: availabilityZoneId + " (avg: ${AVG} min: ${MIN})",
|
|
274
|
+
metricDetails: operation.canaryMetricDetails.canaryAvailabilityMetricDetails,
|
|
275
|
+
metricType: AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE,
|
|
276
|
+
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
277
|
+
}, operation.canaryMetricDetails.canaryAvailabilityMetricDetails.metricDimensions.zonalDimensions(availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
|
|
175
278
|
}),
|
|
279
|
+
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createAvailabilityMetric({
|
|
280
|
+
label: aws_cdk_lib_1.Aws.REGION + " (avg: ${AVG} min: ${MIN})",
|
|
281
|
+
metricDetails: operation.canaryMetricDetails.canaryAvailabilityMetricDetails,
|
|
282
|
+
metricType: AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE,
|
|
283
|
+
color: MetricsHelper_1.MetricsHelper.regionColor
|
|
284
|
+
}, operation.canaryMetricDetails.canaryAvailabilityMetricDetails.metricDimensions.regionalDimensions(aws_cdk_lib_1.Aws.REGION))
|
|
176
285
|
],
|
|
177
286
|
statistic: 'Sum',
|
|
178
287
|
leftYAxis: {
|
|
179
288
|
max: 100,
|
|
180
289
|
min: 95,
|
|
181
|
-
label: '
|
|
290
|
+
label: 'Percent',
|
|
182
291
|
showUnits: false,
|
|
183
292
|
},
|
|
184
293
|
leftAnnotations: [
|
|
185
294
|
{
|
|
186
|
-
value:
|
|
295
|
+
value: operation.canaryMetricDetails.canaryAvailabilityMetricDetails.successAlarmThreshold,
|
|
187
296
|
visible: true,
|
|
188
297
|
color: aws_cloudwatch_1.Color.RED,
|
|
189
298
|
label: 'High Severity',
|
|
190
299
|
},
|
|
191
|
-
]
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
300
|
+
]
|
|
301
|
+
}),
|
|
302
|
+
// Canary fault count
|
|
303
|
+
new aws_cloudwatch_1.GraphWidget({
|
|
304
|
+
height: 8,
|
|
305
|
+
width: 6,
|
|
306
|
+
title: 'Fault Count',
|
|
307
|
+
region: aws_cdk_lib_1.Aws.REGION,
|
|
308
|
+
left: [
|
|
309
|
+
...availabilityZones.map((availabilityZone, index) => {
|
|
310
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
311
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
312
|
+
return AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createZonalAvailabilityMetric({
|
|
313
|
+
availabilityZoneId: availabilityZoneId,
|
|
314
|
+
availabilityZone: availabilityZone,
|
|
315
|
+
metricDetails: operation.canaryMetricDetails.canaryAvailabilityMetricDetails,
|
|
316
|
+
label: availabilityZoneId + " (avg: ${AVG} max: ${MAX})",
|
|
317
|
+
metricType: AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT,
|
|
318
|
+
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
319
|
+
}, operation.canaryMetricDetails.canaryAvailabilityMetricDetails.metricDimensions.zonalDimensions(availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
|
|
198
320
|
}),
|
|
321
|
+
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createAvailabilityMetric({
|
|
322
|
+
metricDetails: operation.canaryMetricDetails.canaryAvailabilityMetricDetails,
|
|
323
|
+
label: aws_cdk_lib_1.Aws.REGION + " (avg: ${AVG} max: ${MAX})",
|
|
324
|
+
metricType: AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT,
|
|
325
|
+
color: MetricsHelper_1.MetricsHelper.regionColor
|
|
326
|
+
}, operation.canaryMetricDetails.canaryAvailabilityMetricDetails.metricDimensions.regionalDimensions(aws_cdk_lib_1.Aws.REGION))
|
|
199
327
|
],
|
|
200
|
-
|
|
201
|
-
|
|
328
|
+
statistic: 'Sum',
|
|
329
|
+
leftYAxis: {
|
|
330
|
+
min: 0,
|
|
331
|
+
label: 'Count',
|
|
202
332
|
showUnits: false,
|
|
203
|
-
}
|
|
204
|
-
})
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
availabilityWidgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
217
|
-
height: 6,
|
|
218
|
-
width: 8,
|
|
219
|
-
title: availabilityZoneId + ' Availability',
|
|
220
|
-
region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
|
|
221
|
-
left: [
|
|
222
|
-
ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalAvailabilityMetric({
|
|
223
|
-
availabilityZoneId: availabilityZoneId,
|
|
224
|
-
label: availabilityZoneId + ' availability',
|
|
225
|
-
metricDetails: props.availabilityMetricDetails,
|
|
226
|
-
metricType: AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE,
|
|
227
|
-
keyPrefix: keyPrefix3,
|
|
228
|
-
}),
|
|
229
|
-
],
|
|
230
|
-
statistic: 'Sum',
|
|
231
|
-
leftYAxis: {
|
|
232
|
-
max: 100,
|
|
233
|
-
min: 95,
|
|
234
|
-
label: 'Availability',
|
|
235
|
-
showUnits: false,
|
|
236
|
-
},
|
|
237
|
-
leftAnnotations: [
|
|
238
|
-
{
|
|
239
|
-
value: props.availabilityMetricDetails.successAlarmThreshold,
|
|
240
|
-
visible: true,
|
|
241
|
-
color: aws_cloudwatch_1.Color.RED,
|
|
242
|
-
label: 'High Severity',
|
|
243
|
-
},
|
|
244
|
-
],
|
|
245
|
-
right: [
|
|
246
|
-
ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalAvailabilityMetric({
|
|
333
|
+
}
|
|
334
|
+
}),
|
|
335
|
+
// Canary request count
|
|
336
|
+
new aws_cloudwatch_1.GraphWidget({
|
|
337
|
+
height: 8,
|
|
338
|
+
width: 6,
|
|
339
|
+
title: 'Request Count',
|
|
340
|
+
region: aws_cdk_lib_1.Aws.REGION,
|
|
341
|
+
left: [
|
|
342
|
+
...availabilityZones.map((availabilityZone, index) => {
|
|
343
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
344
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
345
|
+
return AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createZonalAvailabilityMetric({
|
|
247
346
|
availabilityZoneId: availabilityZoneId,
|
|
248
|
-
|
|
249
|
-
metricDetails:
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
width: 8,
|
|
267
|
-
region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
|
|
268
|
-
alarm: props.zonalEndpointAvailabilityAlarms[k],
|
|
269
|
-
title: 'Success Rate',
|
|
270
|
-
}));
|
|
271
|
-
}
|
|
272
|
-
rowTracker += i + 1;
|
|
347
|
+
availabilityZone: availabilityZone,
|
|
348
|
+
metricDetails: operation.canaryMetricDetails.canaryAvailabilityMetricDetails,
|
|
349
|
+
label: availabilityZoneId + " (avg: ${AVG} max: ${MAX})",
|
|
350
|
+
metricType: AvailabilityMetricType_1.AvailabilityMetricType.REQUEST_COUNT,
|
|
351
|
+
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
352
|
+
}, operation.canaryMetricDetails.canaryAvailabilityMetricDetails.metricDimensions.zonalDimensions(availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
|
|
353
|
+
}),
|
|
354
|
+
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createAvailabilityMetric({
|
|
355
|
+
metricDetails: operation.canaryMetricDetails.canaryAvailabilityMetricDetails,
|
|
356
|
+
label: aws_cdk_lib_1.Aws.REGION + " (avg: ${AVG} max: ${MAX})",
|
|
357
|
+
metricType: AvailabilityMetricType_1.AvailabilityMetricType.REQUEST_COUNT,
|
|
358
|
+
color: MetricsHelper_1.MetricsHelper.regionColor
|
|
359
|
+
}, operation.canaryMetricDetails.canaryAvailabilityMetricDetails.metricDimensions.regionalDimensions(aws_cdk_lib_1.Aws.REGION))
|
|
360
|
+
],
|
|
361
|
+
statistic: 'Sum',
|
|
362
|
+
leftYAxis: {
|
|
363
|
+
label: 'Count',
|
|
364
|
+
showUnits: false,
|
|
273
365
|
}
|
|
274
|
-
}
|
|
275
|
-
if (!props.isCanary &&
|
|
276
|
-
props.instanceContributorsToFaults !== undefined &&
|
|
277
|
-
props.instanceContributorsToFaults != null) {
|
|
278
|
-
availabilityWidgets.push(new ContributorInsightsWidget_1.ContributorInsightsWidget({
|
|
279
|
-
height: 6,
|
|
280
|
-
width: 24,
|
|
281
|
-
title: 'Individual Instance Contributors to Fault Count',
|
|
282
|
-
insightRule: props.instanceContributorsToFaults,
|
|
283
|
-
period: props.availabilityMetricDetails.period,
|
|
284
|
-
legendPosition: aws_cloudwatch_1.LegendPosition.BOTTOM,
|
|
285
|
-
orderStatistic: 'Sum',
|
|
286
|
-
accountId: aws_cdk_lib_1.Fn.ref('AWS::AccountId'),
|
|
287
|
-
topContributors: 10,
|
|
288
|
-
}));
|
|
289
|
-
}
|
|
290
|
-
return availabilityWidgets;
|
|
291
|
-
}
|
|
292
|
-
static createLatencyWidgets(props, title) {
|
|
293
|
-
let latencyWidgets = [];
|
|
294
|
-
latencyWidgets.push(new aws_cloudwatch_1.TextWidget({ height: 2, width: 24, markdown: title }));
|
|
295
|
-
let rowTracker = 0;
|
|
296
|
-
let keyPrefix = '';
|
|
297
|
-
let latencyMetrics = [];
|
|
298
|
-
let stats = props.latencyMetricDetails.graphedSuccessStatistics !== undefined
|
|
299
|
-
? props.latencyMetricDetails.graphedSuccessStatistics
|
|
300
|
-
: ['p99'];
|
|
301
|
-
let latencySuccessMetrics = stats.map((x) => {
|
|
302
|
-
keyPrefix = MetricsHelper_1.MetricsHelper.nextChar(keyPrefix);
|
|
303
|
-
return RegionalLatencyMetrics_1.RegionalLatencyMetrics.createRegionalAverageLatencyMetric({
|
|
304
|
-
label: x + ' Success Latency',
|
|
305
|
-
metricDetails: props.latencyMetricDetails,
|
|
306
|
-
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
307
|
-
statistic: x,
|
|
308
|
-
keyPrefix: keyPrefix,
|
|
309
|
-
});
|
|
310
|
-
});
|
|
311
|
-
stats =
|
|
312
|
-
props.latencyMetricDetails.graphedFaultStatistics !== undefined
|
|
313
|
-
? props.latencyMetricDetails.graphedFaultStatistics
|
|
314
|
-
: ['p99'];
|
|
315
|
-
let latencyFaultMetrics = stats.map((x) => {
|
|
316
|
-
keyPrefix = MetricsHelper_1.MetricsHelper.nextChar(keyPrefix);
|
|
317
|
-
return RegionalLatencyMetrics_1.RegionalLatencyMetrics.createRegionalAverageLatencyMetric({
|
|
318
|
-
label: x + ' Fault Latency',
|
|
319
|
-
metricDetails: props.latencyMetricDetails,
|
|
320
|
-
metricType: LatencyMetricType_1.LatencyMetricType.FAULT_LATENCY,
|
|
321
|
-
statistic: x,
|
|
322
|
-
keyPrefix: keyPrefix,
|
|
323
|
-
});
|
|
324
|
-
});
|
|
325
|
-
latencyMetrics = latencySuccessMetrics.concat(latencyFaultMetrics);
|
|
326
|
-
if (latencyMetrics.length > 0) {
|
|
327
|
-
latencyWidgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
328
|
-
height: 8,
|
|
329
|
-
width: 24,
|
|
330
|
-
title: aws_cdk_lib_1.Fn.sub('${AWS::Region} Latency'),
|
|
331
|
-
region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
|
|
332
|
-
left: latencyMetrics,
|
|
333
|
-
leftYAxis: {
|
|
334
|
-
max: props.latencyMetricDetails.successAlarmThreshold * 1.5,
|
|
335
|
-
min: 0,
|
|
336
|
-
label: 'Latency',
|
|
337
|
-
showUnits: false,
|
|
338
|
-
},
|
|
339
|
-
leftAnnotations: [
|
|
340
|
-
{
|
|
341
|
-
value: props.latencyMetricDetails.successAlarmThreshold,
|
|
342
|
-
visible: true,
|
|
343
|
-
color: aws_cloudwatch_1.Color.RED,
|
|
344
|
-
label: 'High Severity',
|
|
345
|
-
},
|
|
346
|
-
],
|
|
347
|
-
}));
|
|
348
|
-
}
|
|
349
|
-
latencyWidgets.push(new aws_cloudwatch_1.AlarmWidget({
|
|
350
|
-
height: 2,
|
|
351
|
-
width: 24,
|
|
352
|
-
region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
|
|
353
|
-
alarm: props.regionalEndpointLatencyAlarm,
|
|
354
366
|
}));
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
let stats2 = props.latencyMetricDetails.graphedSuccessStatistics
|
|
360
|
-
? props.latencyMetricDetails.graphedSuccessStatistics
|
|
361
|
-
: ['p99'];
|
|
362
|
-
let zonalSuccessLatencyMetrics = stats2.map((x) => {
|
|
363
|
-
keyPrefix = MetricsHelper_1.MetricsHelper.nextChar(keyPrefix);
|
|
364
|
-
return ZonalLatencyMetrics_1.ZonalLatencyMetrics.createZonalAverageLatencyMetric({
|
|
365
|
-
label: x + ' Success Latency',
|
|
366
|
-
metricDetails: props.latencyMetricDetails,
|
|
367
|
-
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
368
|
-
statistic: x,
|
|
369
|
-
availabilityZoneId: availabilityZoneId,
|
|
370
|
-
keyPrefix: keyPrefix,
|
|
371
|
-
});
|
|
372
|
-
});
|
|
373
|
-
stats2 = props.latencyMetricDetails.graphedFaultStatistics
|
|
374
|
-
? props.latencyMetricDetails.graphedFaultStatistics
|
|
375
|
-
: ['p99'];
|
|
376
|
-
let zonalFaultLatencyMetrics = stats2.map((x) => {
|
|
377
|
-
keyPrefix = MetricsHelper_1.MetricsHelper.nextChar(keyPrefix);
|
|
378
|
-
return ZonalLatencyMetrics_1.ZonalLatencyMetrics.createZonalAverageLatencyMetric({
|
|
379
|
-
label: x + ' Fault Latency',
|
|
380
|
-
metricDetails: props.latencyMetricDetails,
|
|
381
|
-
metricType: LatencyMetricType_1.LatencyMetricType.FAULT_LATENCY,
|
|
382
|
-
statistic: x,
|
|
383
|
-
availabilityZoneId: availabilityZoneId,
|
|
384
|
-
keyPrefix: keyPrefix,
|
|
385
|
-
});
|
|
386
|
-
});
|
|
387
|
-
latencyMetrics2 = zonalSuccessLatencyMetrics.concat(zonalFaultLatencyMetrics);
|
|
388
|
-
if (latencyMetrics2.length > 0) {
|
|
367
|
+
let latencyWidgets = [];
|
|
368
|
+
// Canary latency
|
|
369
|
+
operation.canaryMetricDetails.canaryLatencyMetricDetails.successMetricNames.forEach((metricName) => {
|
|
370
|
+
operation.canaryMetricDetails.canaryLatencyMetricDetails.graphedSuccessStatistics?.forEach((statistic) => {
|
|
389
371
|
latencyWidgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
390
|
-
height:
|
|
391
|
-
width:
|
|
392
|
-
title:
|
|
393
|
-
region: aws_cdk_lib_1.
|
|
394
|
-
left:
|
|
372
|
+
height: 8,
|
|
373
|
+
width: 6,
|
|
374
|
+
title: `${metricName} Latency (${statistic})`,
|
|
375
|
+
region: aws_cdk_lib_1.Aws.REGION,
|
|
376
|
+
left: [
|
|
377
|
+
...availabilityZones.map((availabilityZone, index) => {
|
|
378
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
379
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
380
|
+
return ZonalLatencyMetrics_1.ZonalLatencyMetrics.createZonalLatencyMetric({
|
|
381
|
+
metricName: metricName,
|
|
382
|
+
label: availabilityZoneId + " (avg: ${AVG} max: ${MAX})",
|
|
383
|
+
metricDetails: operation.canaryMetricDetails.canaryLatencyMetricDetails,
|
|
384
|
+
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
385
|
+
statistic: statistic,
|
|
386
|
+
availabilityZoneId: availabilityZoneId,
|
|
387
|
+
availabilityZone: availabilityZone,
|
|
388
|
+
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
389
|
+
});
|
|
390
|
+
}),
|
|
391
|
+
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createLatencyMetric({
|
|
392
|
+
metricName: metricName,
|
|
393
|
+
label: aws_cdk_lib_1.Aws.REGION + " (avg: ${AVG} max: ${MAX})",
|
|
394
|
+
metricDetails: operation.canaryMetricDetails.canaryLatencyMetricDetails,
|
|
395
|
+
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
396
|
+
statistic: statistic,
|
|
397
|
+
color: MetricsHelper_1.MetricsHelper.regionColor
|
|
398
|
+
}, operation.canaryMetricDetails.canaryLatencyMetricDetails.metricDimensions.regionalDimensions(aws_cdk_lib_1.Aws.REGION))
|
|
399
|
+
],
|
|
400
|
+
leftYAxis: {
|
|
401
|
+
max: MetricsHelper_1.MetricsHelper.convertDurationByUnit(operation.canaryMetricDetails.canaryLatencyMetricDetails.successAlarmThreshold, operation.canaryMetricDetails.canaryLatencyMetricDetails.unit) * 1.5,
|
|
402
|
+
min: 0,
|
|
403
|
+
label: operation.canaryMetricDetails.canaryLatencyMetricDetails.unit,
|
|
404
|
+
showUnits: false,
|
|
405
|
+
},
|
|
395
406
|
leftAnnotations: [
|
|
396
407
|
{
|
|
397
|
-
value:
|
|
408
|
+
value: MetricsHelper_1.MetricsHelper.convertDurationByUnit(operation.canaryMetricDetails.canaryLatencyMetricDetails.successAlarmThreshold, operation.canaryMetricDetails.canaryLatencyMetricDetails.unit),
|
|
398
409
|
visible: true,
|
|
399
410
|
color: aws_cloudwatch_1.Color.RED,
|
|
400
411
|
label: 'High Severity',
|
|
401
412
|
},
|
|
402
413
|
],
|
|
403
|
-
leftYAxis: {
|
|
404
|
-
max: props.latencyMetricDetails.successAlarmThreshold * 1.5,
|
|
405
|
-
min: 0,
|
|
406
|
-
label: 'Latency',
|
|
407
|
-
showUnits: false,
|
|
408
|
-
},
|
|
409
414
|
}));
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
for (let k = rowTracker; k <= i; k++) {
|
|
416
|
-
latencyWidgets.push(new aws_cloudwatch_1.AlarmWidget({
|
|
417
|
-
height: 2,
|
|
418
|
-
width: 8,
|
|
419
|
-
region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
|
|
420
|
-
alarm: props.zonalEndpointLatencyAlarms[k],
|
|
421
|
-
}));
|
|
422
|
-
}
|
|
423
|
-
rowTracker += i + 1;
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
if (!props.isCanary &&
|
|
427
|
-
props.instanceContributorsToHighLatency !== undefined &&
|
|
428
|
-
props.instanceContributorsToHighLatency != null) {
|
|
429
|
-
latencyWidgets.push(new ContributorInsightsWidget_1.ContributorInsightsWidget({
|
|
430
|
-
height: 6,
|
|
431
|
-
width: 24,
|
|
432
|
-
title: 'Individual Instance Contributors to High Latency',
|
|
433
|
-
insightRule: props.instanceContributorsToHighLatency,
|
|
434
|
-
period: props.latencyMetricDetails.period,
|
|
435
|
-
legendPosition: aws_cloudwatch_1.LegendPosition.BOTTOM,
|
|
436
|
-
orderStatistic: 'Sum',
|
|
437
|
-
accountId: aws_cdk_lib_1.Fn.ref('AWS::AccountId'),
|
|
438
|
-
topContributors: 10,
|
|
439
|
-
}));
|
|
440
|
-
}
|
|
441
|
-
return latencyWidgets;
|
|
442
|
-
}
|
|
443
|
-
static createApplicationLoadBalancerWidgets(props, title, availabilityZoneNames) {
|
|
444
|
-
let albWidgets = [];
|
|
445
|
-
albWidgets.push(new aws_cloudwatch_1.TextWidget({ height: 2, width: 24, markdown: title }));
|
|
446
|
-
albWidgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
dashboard.addWidgets(...latencyWidgets,
|
|
418
|
+
// Canary high-latency request count
|
|
419
|
+
new aws_cloudwatch_1.GraphWidget({
|
|
447
420
|
height: 8,
|
|
448
|
-
width:
|
|
449
|
-
title:
|
|
450
|
-
region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
|
|
421
|
+
width: 6,
|
|
422
|
+
title: 'High Latency Request Count',
|
|
451
423
|
left: [
|
|
452
|
-
|
|
424
|
+
...availabilityZones.map((availabilityZone, index) => {
|
|
425
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
426
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
427
|
+
return ZonalLatencyMetrics_1.ZonalLatencyMetrics.createZonalCountLatencyMetric({
|
|
428
|
+
availabilityZoneId: availabilityZoneId,
|
|
429
|
+
availabilityZone: availabilityZone,
|
|
430
|
+
metricDetails: operation.canaryMetricDetails.canaryLatencyMetricDetails,
|
|
431
|
+
label: availabilityZoneId + " (avg: ${AVG} max: ${MAX})",
|
|
432
|
+
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
433
|
+
statistic: `TC(${MetricsHelper_1.MetricsHelper.convertDurationByUnit(operation.canaryMetricDetails.canaryLatencyMetricDetails.successAlarmThreshold, operation.canaryMetricDetails.canaryLatencyMetricDetails.unit)}:)`,
|
|
434
|
+
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
435
|
+
});
|
|
436
|
+
}),
|
|
437
|
+
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createLatencyCountMetric({
|
|
438
|
+
label: aws_cdk_lib_1.Aws.REGION + " (avg: ${AVG} max: ${MAX})",
|
|
439
|
+
metricDetails: operation.canaryMetricDetails.canaryLatencyMetricDetails,
|
|
440
|
+
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
441
|
+
statistic: `TC(${MetricsHelper_1.MetricsHelper.convertDurationByUnit(operation.canaryMetricDetails.canaryLatencyMetricDetails.successAlarmThreshold, operation.canaryMetricDetails.canaryLatencyMetricDetails.unit)}:)`,
|
|
442
|
+
color: MetricsHelper_1.MetricsHelper.regionColor
|
|
443
|
+
}, operation.canaryMetricDetails.canaryLatencyMetricDetails.metricDimensions.regionalDimensions(aws_cdk_lib_1.Aws.REGION))
|
|
453
444
|
],
|
|
445
|
+
statistic: 'Sum',
|
|
454
446
|
leftYAxis: {
|
|
455
|
-
label: '
|
|
456
|
-
showUnits:
|
|
447
|
+
label: 'Count',
|
|
448
|
+
showUnits: false,
|
|
457
449
|
},
|
|
458
450
|
}));
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
albWidgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
462
|
-
height: 6,
|
|
463
|
-
width: 8,
|
|
464
|
-
title: availabilityZoneId + ' Processed Bytes',
|
|
465
|
-
region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
|
|
466
|
-
left: [
|
|
467
|
-
ApplicationLoadBalancerMetrics_1.ApplicationLoadBalancerMetrics.getPerAZProcessedBytesMetric(props.loadBalancer, availabilityZoneName, availabilityZoneId, props.operation.serverSideAvailabilityMetricDetails.period),
|
|
468
|
-
],
|
|
469
|
-
leftYAxis: {
|
|
470
|
-
label: 'Processed Bytes',
|
|
471
|
-
showUnits: true,
|
|
472
|
-
},
|
|
473
|
-
}));
|
|
474
|
-
});
|
|
475
|
-
return albWidgets;
|
|
476
|
-
}
|
|
477
|
-
static createNetworkLoadBalancerWidgets(props, title, availabilityZoneNames) {
|
|
478
|
-
let nlbWidgets = [];
|
|
479
|
-
let loadBalancerFullName = props.loadBalancer
|
|
480
|
-
.loadBalancerFullName;
|
|
481
|
-
nlbWidgets.push(new aws_cloudwatch_1.TextWidget({ height: 2, width: 24, markdown: title }));
|
|
482
|
-
nlbWidgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
483
|
-
height: 8,
|
|
451
|
+
dashboard.addWidgets(new aws_cloudwatch_1.TextWidget({
|
|
452
|
+
height: 1,
|
|
484
453
|
width: 24,
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
454
|
+
markdown: "### Alarms",
|
|
455
|
+
background: aws_cloudwatch_1.TextWidgetBackground.TRANSPARENT
|
|
456
|
+
}), new aws_cloudwatch_1.AlarmWidget({
|
|
457
|
+
alarm: props.operationAlarmsAndRules.canaryRegionalAlarmsAndRules.availabilityAlarm,
|
|
458
|
+
title: "Regional Availability",
|
|
459
|
+
height: 2,
|
|
460
|
+
width: 12
|
|
461
|
+
}), new aws_cloudwatch_1.AlarmWidget({
|
|
462
|
+
alarm: props.operationAlarmsAndRules.canaryRegionalAlarmsAndRules.latencyAlarm,
|
|
463
|
+
title: "Regional Latency",
|
|
464
|
+
height: 2,
|
|
465
|
+
width: 12
|
|
466
|
+
}), ...Object.keys(props.operationAlarmsAndRules.canaryZonalAlarmsAndRules).map((availabilityZone) => {
|
|
467
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
468
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
469
|
+
return new aws_cloudwatch_1.AlarmWidget({
|
|
470
|
+
alarm: props.operationAlarmsAndRules.canaryZonalAlarmsAndRules[availabilityZone].availabilityAlarm,
|
|
471
|
+
title: `${availabilityZoneId} Availability`,
|
|
472
|
+
height: 2,
|
|
473
|
+
width: 8
|
|
474
|
+
});
|
|
475
|
+
}), ...Object.keys(props.operationAlarmsAndRules.canaryZonalAlarmsAndRules).map((availabilityZone) => {
|
|
476
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
477
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
478
|
+
return new aws_cloudwatch_1.AlarmWidget({
|
|
479
|
+
alarm: props.operationAlarmsAndRules.canaryZonalAlarmsAndRules[availabilityZone].latencyAlarm,
|
|
480
|
+
title: `${availabilityZoneId} Latency`,
|
|
481
|
+
height: 2,
|
|
482
|
+
width: 8
|
|
483
|
+
});
|
|
494
484
|
}));
|
|
495
|
-
availabilityZoneNames.forEach((availabilityZoneName) => {
|
|
496
|
-
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(availabilityZoneName.substring(availabilityZoneName.length - 1));
|
|
497
|
-
nlbWidgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
498
|
-
height: 6,
|
|
499
|
-
width: 8,
|
|
500
|
-
title: availabilityZoneId + ' Processed Bytes',
|
|
501
|
-
region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
|
|
502
|
-
left: [
|
|
503
|
-
NetworkLoadBalancerMetrics_1.NetworkLoadBalancerMetrics.createZonalNetworkLoadBalancerProcessedBytesMetric(loadBalancerFullName, availabilityZoneName, props.operation.serverSideAvailabilityMetricDetails.period),
|
|
504
|
-
],
|
|
505
|
-
leftYAxis: {
|
|
506
|
-
label: 'Processed Bytes',
|
|
507
|
-
showUnits: true,
|
|
508
|
-
},
|
|
509
|
-
}));
|
|
510
|
-
});
|
|
511
|
-
return nlbWidgets;
|
|
512
485
|
}
|
|
513
486
|
constructor(scope, id, props) {
|
|
514
487
|
super(scope, id);
|
|
515
|
-
let widgets = [];
|
|
516
|
-
this.azMapper = props.azMapper;
|
|
517
|
-
let availabilityZoneIds = props.operation.service.availabilityZoneNames.map((x) => {
|
|
518
|
-
return this.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(x.substring(x.length - 1));
|
|
519
|
-
});
|
|
520
|
-
widgets.push(OperationAvailabilityAndLatencyDashboard.createTopLevelAggregateAlarmWidgets(props, '**Top Level Aggregate Alarms**', availabilityZoneIds));
|
|
521
|
-
widgets.push(OperationAvailabilityAndLatencyDashboard.createAvailabilityWidgets({
|
|
522
|
-
operation: props.operation,
|
|
523
|
-
availabilityMetricDetails: props.operation.serverSideAvailabilityMetricDetails,
|
|
524
|
-
availabilityZoneIds: availabilityZoneIds,
|
|
525
|
-
isCanary: false,
|
|
526
|
-
zonalEndpointAvailabilityAlarms: props.zonalEndpointServerAvailabilityAlarms,
|
|
527
|
-
regionalEndpointAvailabilityAlarm: props.regionalEndpointServerAvailabilityAlarm,
|
|
528
|
-
instanceContributorsToFaults: props.instanceContributorsToFaults,
|
|
529
|
-
}, '**Server-side Availability**'));
|
|
530
|
-
widgets.push(OperationAvailabilityAndLatencyDashboard.createLatencyWidgets({
|
|
531
|
-
operation: props.operation,
|
|
532
|
-
latencyMetricDetails: props.operation.serverSideLatencyMetricDetails,
|
|
533
|
-
availabilityZoneIds: availabilityZoneIds,
|
|
534
|
-
isCanary: false,
|
|
535
|
-
zonalEndpointLatencyAlarms: props.zonalEndpointServerLatencyAlarms,
|
|
536
|
-
regionalEndpointLatencyAlarm: props.regionalEndpointServerLatencyAlarm,
|
|
537
|
-
instanceContributorsToHighLatency: props.instanceContributorsToHighLatency,
|
|
538
|
-
}, '**Server-side Latency**'));
|
|
539
|
-
let lb = props.loadBalancer?.node
|
|
540
|
-
.defaultChild;
|
|
541
|
-
if (lb !== undefined && lb != null) {
|
|
542
|
-
if (lb.type == 'application') {
|
|
543
|
-
widgets.push(OperationAvailabilityAndLatencyDashboard.createApplicationLoadBalancerWidgets(props, '**Application Load Balancer Metrics**', props.operation.service.availabilityZoneNames));
|
|
544
|
-
}
|
|
545
|
-
else if (lb.type == 'network') {
|
|
546
|
-
widgets.push(OperationAvailabilityAndLatencyDashboard.createNetworkLoadBalancerWidgets(props, '**Network Load Balancer Metrics**', props.operation.service.availabilityZoneNames));
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
if (props.operation.canaryMetricDetails !== undefined &&
|
|
550
|
-
props.operation.canaryMetricDetails != null) {
|
|
551
|
-
if (props.zonalEndpointCanaryAvailabilityAlarms &&
|
|
552
|
-
props.zonalEndpointCanaryLatencyAlarms &&
|
|
553
|
-
props.regionalEndpointCanaryAvailabilityAlarm &&
|
|
554
|
-
props.regionalEndpointCanaryLatencyAlarm) {
|
|
555
|
-
widgets.push(OperationAvailabilityAndLatencyDashboard.createAvailabilityWidgets({
|
|
556
|
-
operation: props.operation,
|
|
557
|
-
availabilityMetricDetails: props.operation.canaryMetricDetails
|
|
558
|
-
.canaryAvailabilityMetricDetails,
|
|
559
|
-
availabilityZoneIds: availabilityZoneIds,
|
|
560
|
-
isCanary: true,
|
|
561
|
-
zonalEndpointAvailabilityAlarms: props.zonalEndpointCanaryAvailabilityAlarms,
|
|
562
|
-
regionalEndpointAvailabilityAlarm: props.regionalEndpointCanaryAvailabilityAlarm,
|
|
563
|
-
}, '**Canary Measured Availability**'));
|
|
564
|
-
widgets.push(OperationAvailabilityAndLatencyDashboard.createLatencyWidgets({
|
|
565
|
-
operation: props.operation,
|
|
566
|
-
latencyMetricDetails: props.operation.canaryMetricDetails.canaryLatencyMetricDetails,
|
|
567
|
-
availabilityZoneIds: availabilityZoneIds,
|
|
568
|
-
isCanary: true,
|
|
569
|
-
zonalEndpointLatencyAlarms: props.zonalEndpointCanaryLatencyAlarms,
|
|
570
|
-
regionalEndpointLatencyAlarm: props.regionalEndpointCanaryLatencyAlarm,
|
|
571
|
-
}, '**Canary Measured Latency**'));
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
488
|
this.dashboard = new aws_cloudwatch_1.Dashboard(this, 'Dashboard', {
|
|
575
|
-
dashboardName: props.operation.service.serviceName.toLowerCase() +
|
|
489
|
+
dashboardName: props.operationAlarmsAndRules.operation.service.serviceName.toLowerCase() +
|
|
576
490
|
'-' +
|
|
577
|
-
props.operation.operationName.toLowerCase() +
|
|
578
|
-
|
|
491
|
+
props.operationAlarmsAndRules.operation.operationName.toLowerCase() +
|
|
492
|
+
`-availability-and-latency-${aws_cdk_lib_1.Aws.REGION}`,
|
|
579
493
|
defaultInterval: props.interval,
|
|
580
|
-
periodOverride: aws_cloudwatch_1.PeriodOverride.AUTO
|
|
581
|
-
widgets: widgets,
|
|
494
|
+
periodOverride: aws_cloudwatch_1.PeriodOverride.AUTO
|
|
582
495
|
});
|
|
496
|
+
this.dashboard.addWidgets(new aws_cloudwatch_1.AlarmStatusWidget({
|
|
497
|
+
height: 2,
|
|
498
|
+
width: 24,
|
|
499
|
+
alarms: [
|
|
500
|
+
props.operationAlarmsAndRules.regionalImpactAlarm,
|
|
501
|
+
...Object.values(props.operationAlarmsAndRules.aggregateZonalAlarms)
|
|
502
|
+
],
|
|
503
|
+
title: "Aggregate Alarms"
|
|
504
|
+
}));
|
|
505
|
+
OperationAvailabilityAndLatencyDashboard.createServerSideWidgets(this.dashboard, props);
|
|
506
|
+
if (props.operationAlarmsAndRules.operation.canaryMetricDetails) {
|
|
507
|
+
OperationAvailabilityAndLatencyDashboard.createCanaryWidgets(this.dashboard, props);
|
|
508
|
+
}
|
|
583
509
|
}
|
|
584
510
|
}
|
|
585
511
|
exports.OperationAvailabilityAndLatencyDashboard = OperationAvailabilityAndLatencyDashboard;
|
|
586
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXNoYm9hcmRzL09wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUN0Qyw2Q0FBaUM7QUFDakMsK0RBV29DO0FBTXBDLDJDQUF1QztBQUN2QywyRUFBd0U7QUFNeEUsOEZBQTJGO0FBQzNGLHNGQUFtRjtBQUNuRix3RkFBcUY7QUFDckYsOEVBQTJFO0FBQzNFLGtGQUErRTtBQUMvRSx3RUFBcUU7QUFDckUsZ0ZBQTZFO0FBQzdFLHNFQUFtRTtBQUNuRSw4REFBMkQ7QUFFM0Q7O0dBRUc7QUFDSCxNQUFhLHdDQUNYLFNBQVEsc0JBQVM7SUFFVCxNQUFNLENBQUMsbUNBQW1DLENBQ2hELEtBQW9ELEVBQ3BELEtBQWEsRUFDYixtQkFBNkI7UUFFN0IsSUFBSSx1QkFBdUIsR0FBYztZQUN2QyxJQUFJLDJCQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3pELElBQUksa0NBQWlCLENBQUM7Z0JBQ3BCLE1BQU0sRUFBRSxDQUFDO2dCQUNULEtBQUssRUFBRSxFQUFFO2dCQUNULE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztnQkFDbkMsS0FBSyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLGtCQUFrQjthQUMxRCxDQUFDO1NBQ0gsQ0FBQztRQUVGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwRCxJQUFJLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDLENB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RixPQUFPLENBQUMsSUFBSSxDQUNWLHdDQUF3QyxDQUFDLG9CQUFvQixDQUMzRDtvQkFDRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7b0JBQzFCLG9CQUFvQixFQUNsQixLQUFLLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLDBCQUEwQjtvQkFDaEUsbUJBQW1CLEVBQUUsbUJBQW1CO29CQUN4QyxRQUFRLEVBQUUsSUFBSTtvQkFDZCwwQkFBMEIsRUFDeEIsS0FBSyxDQUFDLGdDQUFnQztvQkFDeEMsNEJBQTRCLEVBQzFCLEtBQUssQ0FBQyxrQ0FBa0M7aUJBQzNDLEVBQ0QsNkJBQTZCLENBQzlCLENBQ0YsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLDBCQUFTLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUNoRCxhQUFhLEVBQ1gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRTtnQkFDakQsR0FBRztnQkFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUU7Z0JBQzNDLGdCQUFFLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxDQUFDO1lBQ3BELGVBQWUsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUMvQixjQUFjLEVBQUUsK0JBQWMsQ0FBQyxJQUFJO1lBQ25DLE9BQU8sRUFBRSxPQUFPO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQW56QkQsNEZBbXpCQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbmltcG9ydCB7IEZuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgRGFzaGJvYXJkLFxuICBJTWV0cmljLFxuICBQZXJpb2RPdmVycmlkZSxcbiAgSVdpZGdldCxcbiAgVGV4dFdpZGdldCxcbiAgQWxhcm1TdGF0dXNXaWRnZXQsXG4gIEdyYXBoV2lkZ2V0LFxuICBDb2xvcixcbiAgQWxhcm1XaWRnZXQsXG4gIExlZ2VuZFBvc2l0aW9uLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQge1xuICBCYXNlTG9hZEJhbGFuY2VyLFxuICBDZm5Mb2FkQmFsYW5jZXIsXG4gIElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcixcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBDb250cmlidXRvckluc2lnaHRzV2lkZ2V0IH0gZnJvbSAnLi9Db250cmlidXRvckluc2lnaHRzV2lkZ2V0JztcbmltcG9ydCB7IElPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkIH0gZnJvbSAnLi9JT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZCc7XG5pbXBvcnQgeyBPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHMgfSBmcm9tICcuL3Byb3BzL09wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRQcm9wcyc7XG5pbXBvcnQgeyBPcGVyYXRpb25BdmFpbGFiaWxpdHlXaWRnZXRQcm9wcyB9IGZyb20gJy4vcHJvcHMvT3BlcmF0aW9uQXZhaWxhYmlsaXR5V2lkZ2V0UHJvcHMnO1xuaW1wb3J0IHsgT3BlcmF0aW9uTGF0ZW5jeVdpZGdldFByb3BzIH0gZnJvbSAnLi9wcm9wcy9PcGVyYXRpb25MYXRlbmN5V2lkZ2V0UHJvcHMnO1xuaW1wb3J0IHsgSUF2YWlsYWJpbGl0eVpvbmVNYXBwZXIgfSBmcm9tICcuLi9hem1hcHBlci9JQXZhaWxhYmlsaXR5Wm9uZU1hcHBlcic7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1ldHJpY3MgfSBmcm9tICcuLi9tZXRyaWNzL0FwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTWV0cmljcyc7XG5pbXBvcnQgeyBOZXR3b3JrTG9hZEJhbGFuY2VyTWV0cmljcyB9IGZyb20gJy4uL21ldHJpY3MvTmV0d29ya0xvYWRCYWxhbmNlck1ldHJpY3MnO1xuaW1wb3J0IHsgUmVnaW9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzIH0gZnJvbSAnLi4vbWV0cmljcy9SZWdpb25hbEF2YWlsYWJpbGl0eU1ldHJpY3MnO1xuaW1wb3J0IHsgUmVnaW9uYWxMYXRlbmN5TWV0cmljcyB9IGZyb20gJy4uL21ldHJpY3MvUmVnaW9uYWxMYXRlbmN5TWV0cmljcyc7XG5pbXBvcnQgeyBab25hbEF2YWlsYWJpbGl0eU1ldHJpY3MgfSBmcm9tICcuLi9tZXRyaWNzL1pvbmFsQXZhaWxhYmlsaXR5TWV0cmljcyc7XG5pbXBvcnQgeyBab25hbExhdGVuY3lNZXRyaWNzIH0gZnJvbSAnLi4vbWV0cmljcy9ab25hbExhdGVuY3lNZXRyaWNzJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUgfSBmcm9tICcuLi91dGlsaXRpZXMvQXZhaWxhYmlsaXR5TWV0cmljVHlwZSc7XG5pbXBvcnQgeyBMYXRlbmN5TWV0cmljVHlwZSB9IGZyb20gJy4uL3V0aWxpdGllcy9MYXRlbmN5TWV0cmljVHlwZSc7XG5pbXBvcnQgeyBNZXRyaWNzSGVscGVyIH0gZnJvbSAnLi4vdXRpbGl0aWVzL01ldHJpY3NIZWxwZXInO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb3BlcmF0aW9uIGxldmVsIGF2YWlsYWJpbGl0eSBhbmQgbGF0ZW5jeSBkYXNoYm9hcmRcbiAqL1xuZXhwb3J0IGNsYXNzIE9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRcbiAgZXh0ZW5kcyBDb25zdHJ1Y3RcbiAgaW1wbGVtZW50cyBJT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZCB7XG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVRvcExldmVsQWdncmVnYXRlQWxhcm1XaWRnZXRzKFxuICAgIHByb3BzOiBPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHMsXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBhdmFpbGFiaWxpdHlab25lSWRzOiBzdHJpbmdbXSxcbiAgKTogSVdpZGdldFtdIHtcbiAgICBsZXQgdG9wTGV2ZWxBZ2dyZWdhdGVBbGFybXM6IElXaWRnZXRbXSA9IFtcbiAgICAgIG5ldyBUZXh0V2lkZ2V0KHsgaGVpZ2h0OiAyLCB3aWR0aDogMjQsIG1hcmtkb3duOiB0aXRsZSB9KSxcbiAgICAgIG5ldyBBbGFybVN0YXR1c1dpZGdldCh7XG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICBhbGFybXM6IFtwcm9wcy5yZWdpb25hbEltcGFjdEFsYXJtXSxcbiAgICAgICAgdGl0bGU6IHByb3BzLm9wZXJhdGlvbi5vcGVyYXRpb25OYW1lICsgJyBSZWdpb25hbCBJbXBhY3QnLFxuICAgICAgfSksXG4gICAgXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXZhaWxhYmlsaXR5Wm9uZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZCA9IGF2YWlsYWJpbGl0eVpvbmVJZHNbaV07XG5cbiAgICAgIHRvcExldmVsQWdncmVnYXRlQWxhcm1zLnB1c2goXG4gICAgICAgIG5ldyBBbGFybVN0YXR1c1dpZGdldCh7XG4gICAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICAgIHdpZHRoOiA4LFxuICAgICAgICAgIGFsYXJtczogW3Byb3BzLmlzb2xhdGVkQVpJbXBhY3RBbGFybXNbaV1dLFxuICAgICAgICAgIHRpdGxlOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIElzb2xhdGVkIEltcGFjdCcsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0b3BMZXZlbEFnZ3JlZ2F0ZUFsYXJtcy5wdXNoKFxuICAgICAgbmV3IFRleHRXaWRnZXQoeyBoZWlnaHQ6IDIsIHdpZHRoOiAyNCwgbWFya2Rvd246ICcqKkFaIENvbnRyaWJ1dG9ycyoqJyB9KSxcbiAgICApO1xuXG4gICAgbGV0IHpvbmFsU2VydmVyU2lkZUhpZ2hMYXRlbmN5TWV0cmljczogSU1ldHJpY1tdID0gW107XG4gICAgbGV0IHpvbmFsU2VydmVyU2lkZUZhdWx0Q291bnRNZXRyaWNzOiBJTWV0cmljW10gPSBbXTtcblxuICAgIGxldCB6b25hbENhbmFyeUhpZ2hMYXRlbmN5TWV0cmljczogSU1ldHJpY1tdID0gW107XG4gICAgbGV0IHpvbmFsQ2FuYXJ5RmF1bHRDb3VudE1ldHJpY3M6IElNZXRyaWNbXSA9IFtdO1xuXG4gICAgbGV0IGtleVByZWZpeDogc3RyaW5nID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcigpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdmFpbGFiaWxpdHlab25lSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lSWRzW2ldO1xuXG4gICAgICB6b25hbFNlcnZlclNpZGVIaWdoTGF0ZW5jeU1ldHJpY3MucHVzaChcbiAgICAgICAgWm9uYWxMYXRlbmN5TWV0cmljcy5jcmVhdGVab25hbENvdW50TGF0ZW5jeU1ldHJpYyh7XG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgbWV0cmljRGV0YWlsczogcHJvcHMub3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBoaWdoIGxhdGVuY3kgcmVzcG9uc2VzJyxcbiAgICAgICAgICBtZXRyaWNUeXBlOiBMYXRlbmN5TWV0cmljVHlwZS5TVUNDRVNTX0xBVEVOQ1ksXG4gICAgICAgICAgc3RhdGlzdGljOiBgVEMoJHtwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLnN1Y2Nlc3NBbGFybVRocmVzaG9sZH06KWAsXG4gICAgICAgICAga2V5UHJlZml4OiBrZXlQcmVmaXgsXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgem9uYWxTZXJ2ZXJTaWRlRmF1bHRDb3VudE1ldHJpY3MucHVzaChcbiAgICAgICAgWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmNyZWF0ZVpvbmFsQXZhaWxhYmlsaXR5TWV0cmljKHtcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgZmF1bHQgY291bnQnLFxuICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfQ09VTlQsXG4gICAgICAgICAga2V5UHJlZml4OiBrZXlQcmVmaXgsXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICBwcm9wcy5vcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHByb3BzLm9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzICE9IG51bGxcbiAgICAgICkge1xuICAgICAgICB6b25hbENhbmFyeUhpZ2hMYXRlbmN5TWV0cmljcy5wdXNoKFxuICAgICAgICAgIFpvbmFsTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxDb3VudExhdGVuY3lNZXRyaWMoe1xuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICBtZXRyaWNEZXRhaWxzOlxuICAgICAgICAgICAgICBwcm9wcy5vcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIGhpZ2ggbGF0ZW5jeSByZXNwb25zZXMnLFxuICAgICAgICAgICAgbWV0cmljVHlwZTogTGF0ZW5jeU1ldHJpY1R5cGUuU1VDQ0VTU19MQVRFTkNZLFxuICAgICAgICAgICAgc3RhdGlzdGljOiBgVEMoJHtwcm9wcy5vcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscy5zdWNjZXNzQWxhcm1UaHJlc2hvbGR9OilgLFxuICAgICAgICAgICAga2V5UHJlZml4OiBrZXlQcmVmaXgsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgem9uYWxDYW5hcnlGYXVsdENvdW50TWV0cmljcy5wdXNoKFxuICAgICAgICAgIFpvbmFsQXZhaWxhYmlsaXR5TWV0cmljcy5jcmVhdGVab25hbEF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6XG4gICAgICAgICAgICAgIHByb3BzLm9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBmYXVsdCBjb3VudCcsXG4gICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5ULFxuICAgICAgICAgICAga2V5UHJlZml4OiBrZXlQcmVmaXgsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGtleVByZWZpeCA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoa2V5UHJlZml4KTtcbiAgICB9XG5cbiAgICB0b3BMZXZlbEFnZ3JlZ2F0ZUFsYXJtcy5wdXNoKFxuICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiA2LFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgIHRpdGxlOiAnU2VydmVyLXNpZGUgQVogRmF1bHQgQ29udHJpYnV0b3JzJyxcbiAgICAgICAgbGVmdDogem9uYWxTZXJ2ZXJTaWRlRmF1bHRDb3VudE1ldHJpY3MsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgaWYgKHpvbmFsQ2FuYXJ5RmF1bHRDb3VudE1ldHJpY3MubGVuZ3RoID4gMCkge1xuICAgICAgdG9wTGV2ZWxBZ2dyZWdhdGVBbGFybXMucHVzaChcbiAgICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICAgIHRpdGxlOiAnQ2FuYXJ5IEFaIEZhdWx0IENvbnRyaWJ1dG9ycycsXG4gICAgICAgICAgbGVmdDogem9uYWxDYW5hcnlGYXVsdENvdW50TWV0cmljcyxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRvcExldmVsQWdncmVnYXRlQWxhcm1zLnB1c2goXG4gICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgdGl0bGU6ICdTZXJ2ZXItc2lkZSBIaWdoIExhdGVuY3kgQ29udHJpYnV0b3JzJyxcbiAgICAgICAgbGVmdDogem9uYWxTZXJ2ZXJTaWRlSGlnaExhdGVuY3lNZXRyaWNzLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGlmICh6b25hbENhbmFyeUhpZ2hMYXRlbmN5TWV0cmljcy5sZW5ndGggPiAwKSB7XG4gICAgICB0b3BMZXZlbEFnZ3JlZ2F0ZUFsYXJtcy5wdXNoKFxuICAgICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICAgIGhlaWdodDogNixcbiAgICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgICAgdGl0bGU6ICdDYW5hcnkgSGlnaCBMYXRlbmN5IENvbnRyaWJ1dG9ycycsXG4gICAgICAgICAgbGVmdDogem9uYWxDYW5hcnlIaWdoTGF0ZW5jeU1ldHJpY3MsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0b3BMZXZlbEFnZ3JlZ2F0ZUFsYXJtcy5wdXNoKFxuICAgICAgbmV3IFRleHRXaWRnZXQoeyBoZWlnaHQ6IDIsIHdpZHRoOiAyNCwgbWFya2Rvd246ICcqKlRQUyBNZXRyaWNzKionIH0pLFxuICAgICk7XG5cbiAgICB0b3BMZXZlbEFnZ3JlZ2F0ZUFsYXJtcy5wdXNoKFxuICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiA2LFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgIHRpdGxlOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259IFRQUycpLFxuICAgICAgICByZWdpb246IEZuLnN1YignJHtBV1M6OlJlZ2lvbn0nKSxcbiAgICAgICAgbGVmdDogW1xuICAgICAgICAgIFJlZ2lvbmFsQXZhaWxhYmlsaXR5TWV0cmljcy5jcmVhdGVSZWdpb25hbEF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICBsYWJlbDogRm4ucmVmKCdBV1M6OlJlZ2lvbicpICsgJyB0cHMnLFxuICAgICAgICAgICAgbWV0cmljRGV0YWlsczogcHJvcHMub3BlcmF0aW9uLnNlcnZlclNpZGVBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgbWV0cmljVHlwZTogQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5SRVFVRVNUX0NPVU5ULFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBsYWJlbDogJ1RQUycsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF2YWlsYWJpbGl0eVpvbmVJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IGF2YWlsYWJpbGl0eVpvbmVJZHNbaV07XG5cbiAgICAgIHRvcExldmVsQWdncmVnYXRlQWxhcm1zLnB1c2goXG4gICAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgICAgaGVpZ2h0OiA2LFxuICAgICAgICAgIHdpZHRoOiA4LFxuICAgICAgICAgIHRpdGxlOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIFRQUycsXG4gICAgICAgICAgcmVnaW9uOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259JyksXG4gICAgICAgICAgbGVmdDogW1xuICAgICAgICAgICAgWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmNyZWF0ZVpvbmFsQXZhaWxhYmlsaXR5TWV0cmljKHtcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIHRwcycsXG4gICAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6XG4gICAgICAgICAgICAgICAgcHJvcHMub3BlcmF0aW9uLnNlcnZlclNpZGVBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlJFUVVFU1RfQ09VTlQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgICBsYWJlbDogJ1RQUycsXG4gICAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9wTGV2ZWxBZ2dyZWdhdGVBbGFybXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVBdmFpbGFiaWxpdHlXaWRnZXRzKFxuICAgIHByb3BzOiBPcGVyYXRpb25BdmFpbGFiaWxpdHlXaWRnZXRQcm9wcyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICApOiBJV2lkZ2V0W10ge1xuICAgIGxldCBhdmFpbGFiaWxpdHlXaWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcbiAgICBhdmFpbGFiaWxpdHlXaWRnZXRzLnB1c2goXG4gICAgICBuZXcgVGV4dFdpZGdldCh7IGhlaWdodDogMiwgd2lkdGg6IDI0LCBtYXJrZG93bjogdGl0bGUgfSksXG4gICAgKTtcblxuICAgIGxldCByb3dUcmFja2VyOiBudW1iZXIgPSAwO1xuICAgIGxldCBrZXlQcmVmaXgxOiBzdHJpbmcgPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKCk7XG4gICAgbGV0IGtleVByZWZpeDI6IHN0cmluZyA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoa2V5UHJlZml4MSk7XG5cbiAgICAvLyBDcmVhdGUgcmVnaW9uYWwgYXZhaWxhYmlsaXR5IGFuZCBmYXVsdCBtZXRyaWNzIGFuZCBhdmFpbGFiaWxpdHkgYWxhcm0gd2lkZ2V0c1xuICAgIGF2YWlsYWJpbGl0eVdpZGdldHMucHVzaChcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICB0aXRsZTogRm4uc3ViKCcke0FXUzo6UmVnaW9ufSBBdmFpbGFiaWxpdHknKSxcbiAgICAgICAgcmVnaW9uOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259JyksXG4gICAgICAgIGxlZnQ6IFtcbiAgICAgICAgICBSZWdpb25hbEF2YWlsYWJpbGl0eU1ldHJpY3MuY3JlYXRlUmVnaW9uYWxBdmFpbGFiaWxpdHlNZXRyaWMoe1xuICAgICAgICAgICAgbGFiZWw6IEZuLnJlZignQVdTOjpSZWdpb24nKSArICcgYXZhaWxhYmlsaXR5JyxcbiAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHByb3BzLmF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlNVQ0NFU1NfUkFURSxcbiAgICAgICAgICAgIGtleVByZWZpeDoga2V5UHJlZml4MSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgbWF4OiAxMDAsXG4gICAgICAgICAgbWluOiA5NSxcbiAgICAgICAgICBsYWJlbDogJ0F2YWlsYWJpbGl0eScsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgbGVmdEFubm90YXRpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IHByb3BzLmF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMuc3VjY2Vzc0FsYXJtVGhyZXNob2xkLFxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbG9yOiBDb2xvci5SRUQsXG4gICAgICAgICAgICBsYWJlbDogJ0hpZ2ggU2V2ZXJpdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHJpZ2h0OiBbXG4gICAgICAgICAgUmVnaW9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmNyZWF0ZVJlZ2lvbmFsQXZhaWxhYmlsaXR5TWV0cmljKHtcbiAgICAgICAgICAgIGxhYmVsOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJykgKyAnIGZhdWx0IGNvdW50JyxcbiAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHByb3BzLmF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5ULFxuICAgICAgICAgICAga2V5UHJlZml4OiBrZXlQcmVmaXgyLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgICByaWdodFlBeGlzOiB7XG4gICAgICAgICAgbGFiZWw6ICdGYXVsdCBDb3VudCcsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBhdmFpbGFiaWxpdHlXaWRnZXRzLnB1c2goXG4gICAgICBuZXcgQWxhcm1XaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgcmVnaW9uOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259JyksXG4gICAgICAgIGFsYXJtOiBwcm9wcy5yZWdpb25hbEVuZHBvaW50QXZhaWxhYmlsaXR5QWxhcm0sXG4gICAgICAgIHRpdGxlOiAnU3VjY2VzcyBSYXRlJyxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmF2YWlsYWJpbGl0eVpvbmVJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IHByb3BzLmF2YWlsYWJpbGl0eVpvbmVJZHNbaV07XG5cbiAgICAgIGxldCBrZXlQcmVmaXgzOiBzdHJpbmcgPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKCk7XG4gICAgICBsZXQga2V5UHJlZml4NDogc3RyaW5nID1cbiAgICAgICAgTWV0cmljc0hlbHBlci5uZXh0Q2hhcihrZXlQcmVmaXgzKTtcblxuICAgICAgYXZhaWxhYmlsaXR5V2lkZ2V0cy5wdXNoKFxuICAgICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICAgIGhlaWdodDogNixcbiAgICAgICAgICB3aWR0aDogOCxcbiAgICAgICAgICB0aXRsZTogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBBdmFpbGFiaWxpdHknLFxuICAgICAgICAgIHJlZ2lvbjogRm4uc3ViKCcke0FXUzo6UmVnaW9ufScpLFxuICAgICAgICAgIGxlZnQ6IFtcbiAgICAgICAgICAgIFpvbmFsQXZhaWxhYmlsaXR5TWV0cmljcy5jcmVhdGVab25hbEF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBhdmFpbGFiaWxpdHknLFxuICAgICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBwcm9wcy5hdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlNVQ0NFU1NfUkFURSxcbiAgICAgICAgICAgICAga2V5UHJlZml4OiBrZXlQcmVmaXgzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgICAgbWF4OiAxMDAsXG4gICAgICAgICAgICBtaW46IDk1LFxuICAgICAgICAgICAgbGFiZWw6ICdBdmFpbGFiaWxpdHknLFxuICAgICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxlZnRBbm5vdGF0aW9uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YWx1ZTogcHJvcHMuYXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscy5zdWNjZXNzQWxhcm1UaHJlc2hvbGQsXG4gICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgIGNvbG9yOiBDb2xvci5SRUQsXG4gICAgICAgICAgICAgIGxhYmVsOiAnSGlnaCBTZXZlcml0eScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmlnaHQ6IFtcbiAgICAgICAgICAgIFpvbmFsQXZhaWxhYmlsaXR5TWV0cmljcy5jcmVhdGVab25hbEF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBmYXVsdCBjb3VudCcsXG4gICAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHByb3BzLmF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfQ09VTlQsXG4gICAgICAgICAgICAgIGtleVByZWZpeDoga2V5UHJlZml4NCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmlnaHRZQXhpczoge1xuICAgICAgICAgICAgbGFiZWw6ICdGYXVsdCBDb3VudCcsXG4gICAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy9XZSdyZSBvbiB0aGUgdGhpcmQgb25lIGZvciB0aGlzIHNldCwgYWRkIDMgYWxhcm1zXG4gICAgICAvL29yIGlmIHdlJ3JlIGF0IHRoZSBlbmQsIGF0IHRoZSBuZWNlc3NhcnkgYW1vdW50XG4gICAgICAvL29mIGFsYXJtcywgMSwgMiwgb3IgM1xuICAgICAgaWYgKGkgJSAzID09IDIgfHwgaSAtIDEgPT0gcHJvcHMuYXZhaWxhYmlsaXR5Wm9uZUlkcy5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQgayA9IHJvd1RyYWNrZXI7IGsgPD0gaTsgaysrKSB7XG4gICAgICAgICAgYXZhaWxhYmlsaXR5V2lkZ2V0cy5wdXNoKFxuICAgICAgICAgICAgbmV3IEFsYXJtV2lkZ2V0KHtcbiAgICAgICAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICAgICAgICB3aWR0aDogOCxcbiAgICAgICAgICAgICAgcmVnaW9uOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259JyksXG4gICAgICAgICAgICAgIGFsYXJtOiBwcm9wcy56b25hbEVuZHBvaW50QXZhaWxhYmlsaXR5QWxhcm1zW2tdLFxuICAgICAgICAgICAgICB0aXRsZTogJ1N1Y2Nlc3MgUmF0ZScsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcm93VHJhY2tlciArPSBpICsgMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhcHJvcHMuaXNDYW5hcnkgJiZcbiAgICAgIHByb3BzLmluc3RhbmNlQ29udHJpYnV0b3JzVG9GYXVsdHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcHJvcHMuaW5zdGFuY2VDb250cmlidXRvcnNUb0ZhdWx0cyAhPSBudWxsXG4gICAgKSB7XG4gICAgICBhdmFpbGFiaWxpdHlXaWRnZXRzLnB1c2goXG4gICAgICAgIG5ldyBDb250cmlidXRvckluc2lnaHRzV2lkZ2V0KHtcbiAgICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICAgIHRpdGxlOiAnSW5kaXZpZHVhbCBJbnN0YW5jZSBDb250cmlidXRvcnMgdG8gRmF1bHQgQ291bnQnLFxuICAgICAgICAgIGluc2lnaHRSdWxlOiBwcm9wcy5pbnN0YW5jZUNvbnRyaWJ1dG9yc1RvRmF1bHRzLFxuICAgICAgICAgIHBlcmlvZDogcHJvcHMuYXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscy5wZXJpb2QsXG4gICAgICAgICAgbGVnZW5kUG9zaXRpb246IExlZ2VuZFBvc2l0aW9uLkJPVFRPTSxcbiAgICAgICAgICBvcmRlclN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgICAgYWNjb3VudElkOiBGbi5yZWYoJ0FXUzo6QWNjb3VudElkJyksXG4gICAgICAgICAgdG9wQ29udHJpYnV0b3JzOiAxMCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhdmFpbGFiaWxpdHlXaWRnZXRzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlTGF0ZW5jeVdpZGdldHMoXG4gICAgcHJvcHM6IE9wZXJhdGlvbkxhdGVuY3lXaWRnZXRQcm9wcyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICApOiBJV2lkZ2V0W10ge1xuICAgIGxldCBsYXRlbmN5V2lkZ2V0czogSVdpZGdldFtdID0gW107XG4gICAgbGF0ZW5jeVdpZGdldHMucHVzaChcbiAgICAgIG5ldyBUZXh0V2lkZ2V0KHsgaGVpZ2h0OiAyLCB3aWR0aDogMjQsIG1hcmtkb3duOiB0aXRsZSB9KSxcbiAgICApO1xuXG4gICAgbGV0IHJvd1RyYWNrZXI6IG51bWJlciA9IDA7XG4gICAgbGV0IGtleVByZWZpeDogc3RyaW5nID0gJyc7XG5cbiAgICBsZXQgbGF0ZW5jeU1ldHJpY3M6IElNZXRyaWNbXSA9IFtdO1xuXG4gICAgbGV0IHN0YXRzOiBzdHJpbmdbXSA9XG4gICAgICBwcm9wcy5sYXRlbmN5TWV0cmljRGV0YWlscy5ncmFwaGVkU3VjY2Vzc1N0YXRpc3RpY3MgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHByb3BzLmxhdGVuY3lNZXRyaWNEZXRhaWxzLmdyYXBoZWRTdWNjZXNzU3RhdGlzdGljc1xuICAgICAgICA6IFsncDk5J107XG5cbiAgICBsZXQgbGF0ZW5jeVN1Y2Nlc3NNZXRyaWNzOiBJTWV0cmljW10gPSBzdGF0cy5tYXAoKHgpID0+IHtcbiAgICAgIGtleVByZWZpeCA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoa2V5UHJlZml4KTtcbiAgICAgIHJldHVybiBSZWdpb25hbExhdGVuY3lNZXRyaWNzLmNyZWF0ZVJlZ2lvbmFsQXZlcmFnZUxhdGVuY3lNZXRyaWMoe1xuICAgICAgICBsYWJlbDogeCArICcgU3VjY2VzcyBMYXRlbmN5JyxcbiAgICAgICAgbWV0cmljRGV0YWlsczogcHJvcHMubGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgIG1ldHJpY1R5cGU6IExhdGVuY3lNZXRyaWNUeXBlLlNVQ0NFU1NfTEFURU5DWSxcbiAgICAgICAgc3RhdGlzdGljOiB4LFxuICAgICAgICBrZXlQcmVmaXg6IGtleVByZWZpeCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc3RhdHMgPVxuICAgICAgcHJvcHMubGF0ZW5jeU1ldHJpY0RldGFpbHMuZ3JhcGhlZEZhdWx0U3RhdGlzdGljcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gcHJvcHMubGF0ZW5jeU1ldHJpY0RldGFpbHMuZ3JhcGhlZEZhdWx0U3RhdGlzdGljc1xuICAgICAgICA6IFsncDk5J107XG5cbiAgICBsZXQgbGF0ZW5jeUZhdWx0TWV0cmljczogSU1ldHJpY1tdID0gc3RhdHMubWFwKCh4KSA9PiB7XG4gICAgICBrZXlQcmVmaXggPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKGtleVByZWZpeCk7XG4gICAgICByZXR1cm4gUmVnaW9uYWxMYXRlbmN5TWV0cmljcy5jcmVhdGVSZWdpb25hbEF2ZXJhZ2VMYXRlbmN5TWV0cmljKHtcbiAgICAgICAgbGFiZWw6IHggKyAnIEZhdWx0IExhdGVuY3knLFxuICAgICAgICBtZXRyaWNEZXRhaWxzOiBwcm9wcy5sYXRlbmN5TWV0cmljRGV0YWlscyxcbiAgICAgICAgbWV0cmljVHlwZTogTGF0ZW5jeU1ldHJpY1R5cGUuRkFVTFRfTEFURU5DWSxcbiAgICAgICAgc3RhdGlzdGljOiB4LFxuICAgICAgICBrZXlQcmVmaXg6IGtleVByZWZpeCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgbGF0ZW5jeU1ldHJpY3MgPSBsYXRlbmN5U3VjY2Vzc01ldHJpY3MuY29uY2F0KGxhdGVuY3lGYXVsdE1ldHJpY3MpO1xuXG4gICAgaWYgKGxhdGVuY3lNZXRyaWNzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxhdGVuY3lXaWRnZXRzLnB1c2goXG4gICAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgICB0aXRsZTogRm4uc3ViKCcke0FXUzo6UmVnaW9ufSBMYXRlbmN5JyksXG4gICAgICAgICAgcmVnaW9uOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259JyksXG4gICAgICAgICAgbGVmdDogbGF0ZW5jeU1ldHJpY3MsXG4gICAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgICBtYXg6IHByb3BzLmxhdGVuY3lNZXRyaWNEZXRhaWxzLnN1Y2Nlc3NBbGFybVRocmVzaG9sZCAqIDEuNSxcbiAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgIGxhYmVsOiAnTGF0ZW5jeScsXG4gICAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbGVmdEFubm90YXRpb25zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiBwcm9wcy5sYXRlbmN5TWV0cmljRGV0YWlscy5zdWNjZXNzQWxhcm1UaHJlc2hvbGQsXG4gICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgIGNvbG9yOiBDb2xvci5SRUQsXG4gICAgICAgICAgICAgIGxhYmVsOiAnSGlnaCBTZXZlcml0eScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsYXRlbmN5V2lkZ2V0cy5wdXNoKFxuICAgICAgbmV3IEFsYXJtV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgIHJlZ2lvbjogRm4uc3ViKCcke0FXUzo6UmVnaW9ufScpLFxuICAgICAgICBhbGFybTogcHJvcHMucmVnaW9uYWxFbmRwb2ludExhdGVuY3lBbGFybSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBrZXlQcmVmaXggPSAnJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMuYXZhaWxhYmlsaXR5Wm9uZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXZhaWxhYmlsaXR5Wm9uZUlkc1tpXTtcblxuICAgICAgbGV0IGxhdGVuY3lNZXRyaWNzMjogSU1ldHJpY1tdID0gW107XG5cbiAgICAgIGxldCBzdGF0czI6IHN0cmluZ1tdID0gcHJvcHMubGF0ZW5jeU1ldHJpY0RldGFpbHMuZ3JhcGhlZFN1Y2Nlc3NTdGF0aXN0aWNzXG4gICAgICAgID8gcHJvcHMubGF0ZW5jeU1ldHJpY0RldGFpbHMuZ3JhcGhlZFN1Y2Nlc3NTdGF0aXN0aWNzXG4gICAgICAgIDogWydwOTknXTtcblxuICAgICAgbGV0IHpvbmFsU3VjY2Vzc0xhdGVuY3lNZXRyaWNzOiBJTWV0cmljW10gPSBzdGF0czIubWFwKCh4KSA9PiB7XG4gICAgICAgIGtleVByZWZpeCA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoa2V5UHJlZml4KTtcbiAgICAgICAgcmV0dXJuIFpvbmFsTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxBdmVyYWdlTGF0ZW5jeU1ldHJpYyh7XG4gICAgICAgICAgbGFiZWw6IHggKyAnIFN1Y2Nlc3MgTGF0ZW5jeScsXG4gICAgICAgICAgbWV0cmljRGV0YWlsczogcHJvcHMubGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgbWV0cmljVHlwZTogTGF0ZW5jeU1ldHJpY1R5cGUuU1VDQ0VTU19MQVRFTkNZLFxuICAgICAgICAgIHN0YXRpc3RpYzogeCxcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICBrZXlQcmVmaXg6IGtleVByZWZpeCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc3RhdHMyID0gcHJvcHMubGF0ZW5jeU1ldHJpY0RldGFpbHMuZ3JhcGhlZEZhdWx0U3RhdGlzdGljc1xuICAgICAgICA/IHByb3BzLmxhdGVuY3lNZXRyaWNEZXRhaWxzLmdyYXBoZWRGYXVsdFN0YXRpc3RpY3NcbiAgICAgICAgOiBbJ3A5OSddO1xuXG4gICAgICBsZXQgem9uYWxGYXVsdExhdGVuY3lNZXRyaWNzOiBJTWV0cmljW10gPSBzdGF0czIubWFwKCh4KSA9PiB7XG4gICAgICAgIGtleVByZWZpeCA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoa2V5UHJlZml4KTtcbiAgICAgICAgcmV0dXJuIFpvbmFsTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxBdmVyYWdlTGF0ZW5jeU1ldHJpYyh7XG4gICAgICAgICAgbGFiZWw6IHggKyAnIEZhdWx0IExhdGVuY3knLFxuICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHByb3BzLmxhdGVuY3lNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgIG1ldHJpY1R5cGU6IExhdGVuY3lNZXRyaWNUeXBlLkZBVUxUX0xBVEVOQ1ksXG4gICAgICAgICAgc3RhdGlzdGljOiB4LFxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgIGtleVByZWZpeDoga2V5UHJlZml4LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBsYXRlbmN5TWV0cmljczIgPSB6b25hbFN1Y2Nlc3NMYXRlbmN5TWV0cmljcy5jb25jYXQoXG4gICAgICAgIHpvbmFsRmF1bHRMYXRlbmN5TWV0cmljcyxcbiAgICAgICk7XG5cbiAgICAgIGlmIChsYXRlbmN5TWV0cmljczIubGVuZ3RoID4gMCkge1xuICAgICAgICBsYXRlbmN5V2lkZ2V0cy5wdXNoKFxuICAgICAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgICAgICB3aWR0aDogOCxcbiAgICAgICAgICAgIHRpdGxlOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIExhdGVuY3knLFxuICAgICAgICAgICAgcmVnaW9uOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259JyksXG4gICAgICAgICAgICBsZWZ0OiBsYXRlbmN5TWV0cmljczIsXG4gICAgICAgICAgICBsZWZ0QW5ub3RhdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wcy5sYXRlbmN5TWV0cmljRGV0YWlscy5zdWNjZXNzQWxhcm1UaHJlc2hvbGQsXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogQ29sb3IuUkVELFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnSGlnaCBTZXZlcml0eScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgICAgIG1heDogcHJvcHMubGF0ZW5jeU1ldHJpY0RldGFpbHMuc3VjY2Vzc0FsYXJtVGhyZXNob2xkICogMS41LFxuICAgICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICAgIGxhYmVsOiAnTGF0ZW5jeScsXG4gICAgICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvL1dlJ3JlIG9uIHRoZSB0aGlyZCBvbmUgZm9yIHRoaXMgc2V0LCBhZGQgMyBhbGFybXNcbiAgICAgIC8vb3IgaWYgd2UncmUgYXQgdGhlIGVuZCwgYXQgdGhlIG5lY2Vzc2FyeSBhbW91bnRcbiAgICAgIC8vb2YgYWxhcm1zLCAxLCAyLCBvciAzXG4gICAgICBpZiAoaSAlIDMgPT0gMiB8fCBpIC0gMSA9PSBwcm9wcy5hdmFpbGFiaWxpdHlab25lSWRzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGxldCBrID0gcm93VHJhY2tlcjsgayA8PSBpOyBrKyspIHtcbiAgICAgICAgICBsYXRlbmN5V2lkZ2V0cy5wdXNoKFxuICAgICAgICAgICAgbmV3IEFsYXJtV2lkZ2V0KHtcbiAgICAgICAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICAgICAgICB3aWR0aDogOCxcbiAgICAgICAgICAgICAgcmVnaW9uOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259JyksXG4gICAgICAgICAgICAgIGFsYXJtOiBwcm9wcy56b25hbEVuZHBvaW50TGF0ZW5jeUFsYXJtc1trXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcm93VHJhY2tlciArPSBpICsgMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhcHJvcHMuaXNDYW5hcnkgJiZcbiAgICAgIHByb3BzLmluc3RhbmNlQ29udHJpYnV0b3JzVG9IaWdoTGF0ZW5jeSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwcm9wcy5pbnN0YW5jZUNvbnRyaWJ1dG9yc1RvSGlnaExhdGVuY3kgIT0gbnVsbFxuICAgICkge1xuICAgICAgbGF0ZW5jeVdpZGdldHMucHVzaChcbiAgICAgICAgbmV3IENvbnRyaWJ1dG9ySW5zaWdodHNXaWRnZXQoe1xuICAgICAgICAgIGhlaWdodDogNixcbiAgICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgICAgdGl0bGU6ICdJbmRpdmlkdWFsIEluc3RhbmNlIENvbnRyaWJ1dG9ycyB0byBIaWdoIExhdGVuY3knLFxuICAgICAgICAgIGluc2lnaHRSdWxlOiBwcm9wcy5pbnN0YW5jZUNvbnRyaWJ1dG9yc1RvSGlnaExhdGVuY3ksXG4gICAgICAgICAgcGVyaW9kOiBwcm9wcy5sYXRlbmN5TWV0cmljRGV0YWlscy5wZXJpb2QsXG4gICAgICAgICAgbGVnZW5kUG9zaXRpb246IExlZ2VuZFBvc2l0aW9uLkJPVFRPTSxcbiAgICAgICAgICBvcmRlclN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgICAgYWNjb3VudElkOiBGbi5yZWYoJ0FXUzo6QWNjb3VudElkJyksXG4gICAgICAgICAgdG9wQ29udHJpYnV0b3JzOiAxMCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBsYXRlbmN5V2lkZ2V0cztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyV2lkZ2V0cyhcbiAgICBwcm9wczogT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgYXZhaWxhYmlsaXR5Wm9uZU5hbWVzOiBzdHJpbmdbXSxcbiAgKTogSVdpZGdldFtdIHtcbiAgICBsZXQgYWxiV2lkZ2V0czogSVdpZGdldFtdID0gW107XG5cbiAgICBhbGJXaWRnZXRzLnB1c2gobmV3IFRleHRXaWRnZXQoeyBoZWlnaHQ6IDIsIHdpZHRoOiAyNCwgbWFya2Rvd246IHRpdGxlIH0pKTtcblxuICAgIGFsYldpZGdldHMucHVzaChcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICB0aXRsZTogRm4uc3ViKCcke0FXUzo6UmVnaW9ufSBQcm9jZXNzZWQgQnl0ZXMnKSxcbiAgICAgICAgcmVnaW9uOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259JyksXG4gICAgICAgIGxlZnQ6IFtcbiAgICAgICAgICBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1ldHJpY3MuZ2V0UmVnaW9uYWxQcm9jZXNzZWRCeXRlc01ldHJpYyhcbiAgICAgICAgICAgIHByb3BzLmxvYWRCYWxhbmNlciBhcyBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIsXG4gICAgICAgICAgICBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMucGVyaW9kLFxuICAgICAgICAgICksXG4gICAgICAgIF0sXG4gICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgIGxhYmVsOiAnUHJvY2Vzc2VkIEJ5dGVzJyxcbiAgICAgICAgICBzaG93VW5pdHM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgYXZhaWxhYmlsaXR5Wm9uZU5hbWVzLmZvckVhY2goKGF2YWlsYWJpbGl0eVpvbmVOYW1lKSA9PiB7XG4gICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPVxuICAgICAgICBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lTmFtZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZU5hbWUubGVuZ3RoIC0gMSksXG4gICAgICAgICk7XG5cbiAgICAgIGFsYldpZGdldHMucHVzaChcbiAgICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgICAgd2lkdGg6IDgsXG4gICAgICAgICAgdGl0bGU6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgUHJvY2Vzc2VkIEJ5dGVzJyxcbiAgICAgICAgICByZWdpb246IEZuLnN1YignJHtBV1M6OlJlZ2lvbn0nKSxcbiAgICAgICAgICBsZWZ0OiBbXG4gICAgICAgICAgICBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1ldHJpY3MuZ2V0UGVyQVpQcm9jZXNzZWRCeXRlc01ldHJpYyhcbiAgICAgICAgICAgICAgcHJvcHMubG9hZEJhbGFuY2VyIGFzIElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcixcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZU5hbWUsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgcHJvcHMub3BlcmF0aW9uLnNlcnZlclNpZGVBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLnBlcmlvZCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnUHJvY2Vzc2VkIEJ5dGVzJyxcbiAgICAgICAgICAgIHNob3dVbml0czogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYWxiV2lkZ2V0cztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZU5ldHdvcmtMb2FkQmFsYW5jZXJXaWRnZXRzKFxuICAgIHByb3BzOiBPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHMsXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBhdmFpbGFiaWxpdHlab25lTmFtZXM6IHN0cmluZ1tdLFxuICApOiBJV2lkZ2V0W10ge1xuICAgIGxldCBubGJXaWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcbiAgICBsZXQgbG9hZEJhbGFuY2VyRnVsbE5hbWU6IHN0cmluZyA9IChwcm9wcy5sb2FkQmFsYW5jZXIgYXMgQmFzZUxvYWRCYWxhbmNlcilcbiAgICAgIC5sb2FkQmFsYW5jZXJGdWxsTmFtZTtcblxuICAgIG5sYldpZGdldHMucHVzaChuZXcgVGV4dFdpZGdldCh7IGhlaWdodDogMiwgd2lkdGg6IDI0LCBtYXJrZG93bjogdGl0bGUgfSkpO1xuXG4gICAgbmxiV2lkZ2V0cy5wdXNoKFxuICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgIHRpdGxlOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259IFByb2Nlc3NlZCBCeXRlcycpLFxuICAgICAgICByZWdpb246IEZuLnN1YignJHtBV1M6OlJlZ2lvbn0nKSxcbiAgICAgICAgbGVmdDogW1xuICAgICAgICAgIE5ldHdvcmtMb2FkQmFsYW5jZXJNZXRyaWNzLmNyZWF0ZVJlZ2lvbmFsTmV0d29ya0xvYWRCYWxhbmNlclByb2Nlc3NlZEJ5dGVzTWV0cmljKFxuICAgICAgICAgICAgbG9hZEJhbGFuY2VyRnVsbE5hbWUsXG4gICAgICAgICAgICBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMucGVyaW9kLFxuICAgICAgICAgICksXG4gICAgICAgIF0sXG4gICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgIGxhYmVsOiAnUHJvY2Vzc2VkIEJ5dGVzJyxcbiAgICAgICAgICBzaG93VW5pdHM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgYXZhaWxhYmlsaXR5Wm9uZU5hbWVzLmZvckVhY2goKGF2YWlsYWJpbGl0eVpvbmVOYW1lKSA9PiB7XG4gICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPVxuICAgICAgICBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lTmFtZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZU5hbWUubGVuZ3RoIC0gMSksXG4gICAgICAgICk7XG5cbiAgICAgIG5sYldpZGdldHMucHVzaChcbiAgICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgICAgd2lkdGg6IDgsXG4gICAgICAgICAgdGl0bGU6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgUHJvY2Vzc2VkIEJ5dGVzJyxcbiAgICAgICAgICByZWdpb246IEZuLnN1YignJHtBV1M6OlJlZ2lvbn0nKSxcbiAgICAgICAgICBsZWZ0OiBbXG4gICAgICAgICAgICBOZXR3b3JrTG9hZEJhbGFuY2VyTWV0cmljcy5jcmVhdGVab25hbE5ldHdvcmtMb2FkQmFsYW5jZXJQcm9jZXNzZWRCeXRlc01ldHJpYyhcbiAgICAgICAgICAgICAgbG9hZEJhbGFuY2VyRnVsbE5hbWUsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVOYW1lLFxuICAgICAgICAgICAgICBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMucGVyaW9kLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgICAgbGFiZWw6ICdQcm9jZXNzZWQgQnl0ZXMnLFxuICAgICAgICAgICAgc2hvd1VuaXRzOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBubGJXaWRnZXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpb24gbGV2ZWwgZGFzaGJvYXJkXG4gICAqL1xuICBkYXNoYm9hcmQ6IERhc2hib2FyZDtcblxuICBwcml2YXRlIGF6TWFwcGVyOiBJQXZhaWxhYmlsaXR5Wm9uZU1hcHBlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IE9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGxldCB3aWRnZXRzOiBJV2lkZ2V0W11bXSA9IFtdO1xuXG4gICAgdGhpcy5hek1hcHBlciA9IHByb3BzLmF6TWFwcGVyO1xuXG4gICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZHM6IHN0cmluZ1tdID1cbiAgICAgIHByb3BzLm9wZXJhdGlvbi5zZXJ2aWNlLmF2YWlsYWJpbGl0eVpvbmVOYW1lcy5tYXAoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoXG4gICAgICAgICAgeC5zdWJzdHJpbmcoeC5sZW5ndGggLSAxKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5jcmVhdGVUb3BMZXZlbEFnZ3JlZ2F0ZUFsYXJtV2lkZ2V0cyhcbiAgICAgICAgcHJvcHMsXG4gICAgICAgICcqKlRvcCBMZXZlbCBBZ2dyZWdhdGUgQWxhcm1zKionLFxuICAgICAgICBhdmFpbGFiaWxpdHlab25lSWRzLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5jcmVhdGVBdmFpbGFiaWxpdHlXaWRnZXRzKFxuICAgICAgICB7XG4gICAgICAgICAgb3BlcmF0aW9uOiBwcm9wcy5vcGVyYXRpb24sXG4gICAgICAgICAgYXZhaWxhYmlsaXR5TWV0cmljRGV0YWlsczpcbiAgICAgICAgICAgIHByb3BzLm9wZXJhdGlvbi5zZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWRzOiBhdmFpbGFiaWxpdHlab25lSWRzLFxuICAgICAgICAgIGlzQ2FuYXJ5OiBmYWxzZSxcbiAgICAgICAgICB6b25hbEVuZHBvaW50QXZhaWxhYmlsaXR5QWxhcm1zOlxuICAgICAgICAgICAgcHJvcHMuem9uYWxFbmRwb2ludFNlcnZlckF2YWlsYWJpbGl0eUFsYXJtcyxcbiAgICAgICAgICByZWdpb25hbEVuZHBvaW50QXZhaWxhYmlsaXR5QWxhcm06XG4gICAgICAgICAgICBwcm9wcy5yZWdpb25hbEVuZHBvaW50U2VydmVyQXZhaWxhYmlsaXR5QWxhcm0sXG4gICAgICAgICAgaW5zdGFuY2VDb250cmlidXRvcnNUb0ZhdWx0czogcHJvcHMuaW5zdGFuY2VDb250cmlidXRvcnNUb0ZhdWx0cyxcbiAgICAgICAgfSxcbiAgICAgICAgJyoqU2VydmVyLXNpZGUgQXZhaWxhYmlsaXR5KionLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5jcmVhdGVMYXRlbmN5V2lkZ2V0cyhcbiAgICAgICAge1xuICAgICAgICAgIG9wZXJhdGlvbjogcHJvcHMub3BlcmF0aW9uLFxuICAgICAgICAgIGxhdGVuY3lNZXRyaWNEZXRhaWxzOiBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZHM6IGF2YWlsYWJpbGl0eVpvbmVJZHMsXG4gICAgICAgICAgaXNDYW5hcnk6IGZhbHNlLFxuICAgICAgICAgIHpvbmFsRW5kcG9pbnRMYXRlbmN5QWxhcm1zOiBwcm9wcy56b25hbEVuZHBvaW50U2VydmVyTGF0ZW5jeUFsYXJtcyxcbiAgICAgICAgICByZWdpb25hbEVuZHBvaW50TGF0ZW5jeUFsYXJtOlxuICAgICAgICAgICAgcHJvcHMucmVnaW9uYWxFbmRwb2ludFNlcnZlckxhdGVuY3lBbGFybSxcbiAgICAgICAgICBpbnN0YW5jZUNvbnRyaWJ1dG9yc1RvSGlnaExhdGVuY3k6XG4gICAgICAgICAgICBwcm9wcy5pbnN0YW5jZUNvbnRyaWJ1dG9yc1RvSGlnaExhdGVuY3ksXG4gICAgICAgIH0sXG4gICAgICAgICcqKlNlcnZlci1zaWRlIExhdGVuY3kqKicsXG4gICAgICApLFxuICAgICk7XG5cbiAgICBsZXQgbGI6IENmbkxvYWRCYWxhbmNlciA9IHByb3BzLmxvYWRCYWxhbmNlcj8ubm9kZVxuICAgICAgLmRlZmF1bHRDaGlsZCBhcyBDZm5Mb2FkQmFsYW5jZXI7XG5cbiAgICBpZiAobGIgIT09IHVuZGVmaW5lZCAmJiBsYiAhPSBudWxsKSB7XG4gICAgICBpZiAobGIudHlwZSA9PSAnYXBwbGljYXRpb24nKSB7XG4gICAgICAgIHdpZGdldHMucHVzaChcbiAgICAgICAgICBPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmNyZWF0ZUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyV2lkZ2V0cyhcbiAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgJyoqQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlciBNZXRyaWNzKionLFxuICAgICAgICAgICAgcHJvcHMub3BlcmF0aW9uLnNlcnZpY2UuYXZhaWxhYmlsaXR5Wm9uZU5hbWVzLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGxiLnR5cGUgPT0gJ25ldHdvcmsnKSB7XG4gICAgICAgIHdpZGdldHMucHVzaChcbiAgICAgICAgICBPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmNyZWF0ZU5ldHdvcmtMb2FkQmFsYW5jZXJXaWRnZXRzKFxuICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAnKipOZXR3b3JrIExvYWQgQmFsYW5jZXIgTWV0cmljcyoqJyxcbiAgICAgICAgICAgIHByb3BzLm9wZXJhdGlvbi5zZXJ2aWNlLmF2YWlsYWJpbGl0eVpvbmVOYW1lcyxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHByb3BzLm9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHByb3BzLm9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzICE9IG51bGxcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMuem9uYWxFbmRwb2ludENhbmFyeUF2YWlsYWJpbGl0eUFsYXJtcyAmJlxuICAgICAgICBwcm9wcy56b25hbEVuZHBvaW50Q2FuYXJ5TGF0ZW5jeUFsYXJtcyAmJlxuICAgICAgICBwcm9wcy5yZWdpb25hbEVuZHBvaW50Q2FuYXJ5QXZhaWxhYmlsaXR5QWxhcm0gJiZcbiAgICAgICAgcHJvcHMucmVnaW9uYWxFbmRwb2ludENhbmFyeUxhdGVuY3lBbGFybVxuICAgICAgKSB7XG4gICAgICAgIHdpZGdldHMucHVzaChcbiAgICAgICAgICBPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmNyZWF0ZUF2YWlsYWJpbGl0eVdpZGdldHMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbjogcHJvcHMub3BlcmF0aW9uLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzOlxuICAgICAgICAgICAgICAgIHByb3BzLm9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkczogYXZhaWxhYmlsaXR5Wm9uZUlkcyxcbiAgICAgICAgICAgICAgaXNDYW5hcnk6IHRydWUsXG4gICAgICAgICAgICAgIHpvbmFsRW5kcG9pbnRBdmFpbGFiaWxpdHlBbGFybXM6XG4gICAgICAgICAgICAgICAgcHJvcHMuem9uYWxFbmRwb2ludENhbmFyeUF2YWlsYWJpbGl0eUFsYXJtcyxcbiAgICAgICAgICAgICAgcmVnaW9uYWxFbmRwb2ludEF2YWlsYWJpbGl0eUFsYXJtOlxuICAgICAgICAgICAgICAgIHByb3BzLnJlZ2lvbmFsRW5kcG9pbnRDYW5hcnlBdmFpbGFiaWxpdHlBbGFybSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnKipDYW5hcnkgTWVhc3VyZWQgQXZhaWxhYmlsaXR5KionLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG5cbiAgICAgICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgICAgIE9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQuY3JlYXRlTGF0ZW5jeVdpZGdldHMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbjogcHJvcHMub3BlcmF0aW9uLFxuICAgICAgICAgICAgICBsYXRlbmN5TWV0cmljRGV0YWlsczpcbiAgICAgICAgICAgICAgICBwcm9wcy5vcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkczogYXZhaWxhYmlsaXR5Wm9uZUlkcyxcbiAgICAgICAgICAgICAgaXNDYW5hcnk6IHRydWUsXG4gICAgICAgICAgICAgIHpvbmFsRW5kcG9pbnRMYXRlbmN5QWxhcm1zOlxuICAgICAgICAgICAgICAgIHByb3BzLnpvbmFsRW5kcG9pbnRDYW5hcnlMYXRlbmN5QWxhcm1zLFxuICAgICAgICAgICAgICByZWdpb25hbEVuZHBvaW50TGF0ZW5jeUFsYXJtOlxuICAgICAgICAgICAgICAgIHByb3BzLnJlZ2lvbmFsRW5kcG9pbnRDYW5hcnlMYXRlbmN5QWxhcm0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyoqQ2FuYXJ5IE1lYXN1cmVkIExhdGVuY3kqKicsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRhc2hib2FyZCA9IG5ldyBEYXNoYm9hcmQodGhpcywgJ0Rhc2hib2FyZCcsIHtcbiAgICAgIGRhc2hib2FyZE5hbWU6XG4gICAgICAgIHByb3BzLm9wZXJhdGlvbi5zZXJ2aWNlLnNlcnZpY2VOYW1lLnRvTG93ZXJDYXNlKCkgK1xuICAgICAgICAnLScgK1xuICAgICAgICBwcm9wcy5vcGVyYXRpb24ub3BlcmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpICtcbiAgICAgICAgRm4uc3ViKCctYXZhaWxhYmlsaXR5LWFuZC1sYXRlbmN5LSR7QVdTOjpSZWdpb259JyksXG4gICAgICBkZWZhdWx0SW50ZXJ2YWw6IHByb3BzLmludGVydmFsLFxuICAgICAgcGVyaW9kT3ZlcnJpZGU6IFBlcmlvZE92ZXJyaWRlLkFVVE8sXG4gICAgICB3aWRnZXRzOiB3aWRnZXRzLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
512
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXNoYm9hcmRzL09wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUN0Qyw2Q0FBa0M7QUFDbEMsK0RBV29DO0FBQ3BDLDJDQUF1QztBQUN2QywyRUFBd0U7QUFHeEUsd0VBQXFFO0FBQ3JFLGdGQUE2RTtBQUM3RSxzRUFBbUU7QUFDbkUsOERBQTJEO0FBQzNELDRGQUF5RjtBQUd6Rjs7R0FFRztBQUNILE1BQWEsd0NBQ1gsU0FBUSxzQkFBUztJQUdULE1BQU0sQ0FBQyx1QkFBdUIsQ0FDcEMsU0FBb0IsRUFDcEIsS0FBb0Q7UUFHcEQsSUFBSSxTQUFTLEdBQWUsS0FBSyxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQztRQUNwRSxJQUFJLGlCQUFpQixHQUFhLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1FBRXhHLFNBQVMsQ0FBQyxVQUFVLENBQ2xCLElBQUksMkJBQVUsQ0FBQztZQUNiLFFBQVEsRUFBRSw0QkFBNEI7WUFDdEMsVUFBVSxFQUFFLHFDQUFvQixDQUFDLFdBQVc7WUFDNUMsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUMsQ0FDSCxDQUFDO1FBRUYsU0FBUyxDQUFDLFVBQVU7UUFFbEIsMkJBQTJCO1FBQzNCLElBQUksNEJBQVcsQ0FBQztZQUNkLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLENBQUM7WUFDUixLQUFLLEVBQUUsY0FBYztZQUNyQixNQUFNLEVBQUUsaUJBQUcsQ0FBQyxNQUFNO1lBQ2xCLElBQUksRUFBRTtnQkFDSixHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUF3QixFQUFFLEtBQWEsRUFBRSxFQUFFO29CQUNuRSxJQUFJLFFBQVEsR0FBVyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUMvRSxJQUFJLGtCQUFrQixHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUMsNENBQTRDLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBRXZHLE9BQU8sNkRBQTZCLENBQUMsNkJBQTZCLENBQUM7d0JBQ2pFLGtCQUFrQixFQUFFLGtCQUFrQjt3QkFDdEMsZ0JBQWdCLEVBQUUsZ0JBQWdCO3dCQUNsQyxLQUFLLEVBQUUsa0JBQWtCLEdBQUcsNkJBQTZCO3dCQUN6RCxhQUFhLEVBQUUsU0FBUyxDQUFDLG1DQUFtQzt3QkFDNUQsVUFBVSxFQUFFLCtDQUFzQixDQUFDLFlBQVk7d0JBQy9DLEtBQUssRUFBRSw2QkFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7cUJBQ25DLEVBQ0QsU0FBUyxDQUFDLDhCQUE4QixDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FDdkUsa0JBQWtCLEVBQ2xCLGlCQUFHLENBQUMsTUFBTSxDQUNYLENBQUMsQ0FBQTtnQkFDSixDQUFDLENBQUM7Z0JBQ0YsNkRBQTZCLENBQUMsd0JBQXdCLENBQUM7b0JBQ3JELEtBQUssRUFBRSxpQkFBRyxDQUFDLE1BQU0sR0FBRyw2QkFBNkI7b0JBQ2pELGFBQWEsRUFBRSxTQUFTLENBQUMsbUNBQW1DO29CQUM1RCxVQUFVLEVBQUUsK0NBQXNCLENBQUMsWUFBWTtvQkFDL0MsS0FBSyxFQUFFLDZCQUFhLENBQUMsV0FBVztpQkFDakMsRUFDRCxTQUFTLENBQUMsOEJBQThCLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQzFFLGlCQUFHLENBQUMsTUFBTSxDQUNYLENBQUM7YUFDSDtZQUNELFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFNBQVMsRUFBRTtnQkFDVCxHQUFHLEVBQUUsR0FBRztnQkFDUixHQUFHLEVBQUUsRUFBRTtnQkFDUCxLQUFLLEVBQUUsU0FBUztnQkFDaEIsU0FBUyxFQUFFLEtBQUs7YUFDakI7WUFDRCxlQUFlLEVBQUU7Z0JBQ2Y7b0JBQ0UsS0FBSyxFQUFFLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQyxxQkFBcUI7b0JBQzFFLE9BQU8sRUFBRSxJQUFJO29CQUNiLEtBQUssRUFBRSxzQkFBSyxDQUFDLEdBQUc7b0JBQ2hCLEtBQUssRUFBRSxlQUFlO2lCQUN2QjthQUNGO1NBQ0YsQ0FBQztRQUVGLDBCQUEwQjtRQUMxQixJQUFJLDRCQUFXLENBQUM7WUFDZCxNQUFNLEVBQUUsQ0FBQztZQUNULEtBQUssRUFBRSxDQUFDO1lBQ1IsS0FBSyxFQUFFLGFBQWE7WUFDcEIsTUFBTSxFQUFFLGlCQUFHLENBQUMsTUFBTTtZQUNsQixJQUFJLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsZ0JBQXdCLEVBQUUsS0FBYSxFQUFFLEVBQUU7Z0JBQ3RFLElBQUksUUFBUSxHQUFXLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQy9FLElBQUksa0JBQWtCLEdBQVcsS0FBSyxDQUFDLFFBQVEsQ0FBQyw0Q0FBNEMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFdkcsT0FBTyw2REFBNkIsQ0FBQyw2QkFBNkIsQ0FBQztvQkFDakUsa0JBQWtCLEVBQUUsa0JBQWtCO29CQUN0QyxnQkFBZ0IsRUFBRSxnQkFBZ0I7b0JBQ2xDLEtBQUssRUFBRSxrQkFBa0IsR0FBRyw2QkFBNkI7b0JBQ3pELGFBQWEsRUFBRSxTQUFTLENBQUMsbUNBQW1DO29CQUM1RCxVQUFVLEVBQUUsK0NBQXNCLENBQUMsV0FBVztvQkFDOUMsS0FBSyxFQUFFLDZCQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztpQkFDbkMsRUFDRCxTQUFTLENBQUMsOEJBQThCLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUN2RSxrQkFBa0IsRUFDbEIsaUJBQUcsQ0FBQyxNQUFNLENBQ1gsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDO1lBQ0YsU0FBUyxFQUFFLEtBQUs7WUFDaEIsU0FBUyxFQUFFO2dCQUNULEdBQUcsRUFBRSxDQUFDO2dCQUNOLEtBQUssRUFBRSxPQUFPO2dCQUNkLFNBQVMsRUFBRSxLQUFLO2FBQ2pCO1NBQ0YsQ0FBQztRQUVGLDRCQUE0QjtRQUM1QixJQUFJLDRCQUFXLENBQUM7WUFDZCxNQUFNLEVBQUUsQ0FBQztZQUNULEtBQUssRUFBRSxDQUFDO1lBQ1IsS0FBSyxFQUFFLGVBQWU7WUFDdEIsTUFBTSxFQUFFLGlCQUFHLENBQUMsTUFBTTtZQUNsQixJQUFJLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsZ0JBQXdCLEVBQUUsS0FBYSxFQUFFLEVBQUU7Z0JBQ3RFLElBQUksUUFBUSxHQUFXLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQy9FLElBQUksa0JBQWtCLEdBQVcsS0FBSyxDQUFDLFFBQVEsQ0FBQyw0Q0FBNEMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFdkcsT0FBTyw2REFBNkIsQ0FBQyw2QkFBNkIsQ0FBQztvQkFDakUsa0JBQWtCLEVBQUUsa0JBQWtCO29CQUN0QyxnQkFBZ0IsRUFBRSxnQkFBZ0I7b0JBQ2xDLEtBQUssRUFBRSxrQkFBa0IsR0FBRyw2QkFBNkI7b0JBQ3pELGFBQWEsRUFBRSxTQUFTLENBQUMsbUNBQW1DO29CQUM1RCxVQUFVLEVBQUUsK0NBQXNCLENBQUMsYUFBYTtvQkFDaEQsS0FBSyxFQUFFLDZCQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztpQkFDbkMsRUFDRCxTQUFTLENBQUMsOEJBQThCLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUN2RSxrQkFBa0IsRUFDbEIsaUJBQUcsQ0FBQyxNQUFNLENBQ1gsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDO1lBQ0YsU0FBUyxFQUFFLEtBQUs7WUFDaEIsU0FBUyxFQUFFO2dCQUNULEtBQUssRUFBRSxPQUFPO2dCQUNkLFNBQVMsRUFBRSxLQUFLO2FBQ2pCO1NBQ0YsQ0FBQztRQUVGLDhDQUE4QztRQUM5QyxHQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1lBQ3ZHO2dCQUNFLElBQUkscURBQXlCLENBQUM7b0JBQzVCLE1BQU0sRUFBRSxDQUFDO29CQUNULEtBQUssRUFBRSxDQUFDO29CQUNSLEtBQUssRUFBRSxpREFBaUQ7b0JBQ3hELFdBQVcsRUFBRSxLQUFLLENBQUMsdUJBQXVCLENBQUMsZ0NBQWdDLENBQUMsb0NBQW9DO29CQUNoSCxNQUFNLEVBQUUsU0FBUyxDQUFDLG1DQUFtQyxDQUFDLE1BQU07b0JBQzVELGNBQWMsRUFBRSwrQkFBYyxDQUFDLE1BQU07b0JBQ3JDLGNBQWMsRUFBRSxLQUFLO29CQUNyQixTQUFTLEVBQUUsaUJBQUcsQ0FBQyxVQUFVO29CQUN6QixlQUFlLEVBQUUsRUFBRTtpQkFDcEIsQ0FBQzthQUNILENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDUCxDQUFDO1FBRUosc0JBQXNCO1FBQ3RCLElBQUksY0FBYyxHQUFjLEVBQUUsQ0FBQztRQUNuQyxTQUFTLENBQUMsOEJBQThCLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBa0IsRUFBRSxFQUFFO1lBRXpGLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFpQixFQUFFLEVBQUU7Z0JBRS9GLGNBQWMsQ0FBQyxJQUFJLENBQ2pCLElBQUksNEJBQVcsQ0FBQztvQkFDZCxNQUFNLEVBQUUsQ0FBQztvQkFDVCxLQUFLLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUUsR0FBRyxVQUFVLGFBQWEsU0FBUyxHQUFHO29CQUM3QyxNQUFNLEVBQUUsaUJBQUcsQ0FBQyxNQUFNO29CQUNsQixJQUFJLEVBQUU7d0JBQ0osR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBd0IsRUFBRSxLQUFhLEVBQUUsRUFBRTs0QkFDbkUsSUFBSSxRQUFRLEdBQVcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDL0UsSUFBSSxrQkFBa0IsR0FBVyxLQUFLLENBQUMsUUFBUSxDQUFDLDRDQUE0QyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUV2RyxPQUFPLHlDQUFtQixDQUFDLHdCQUF3QixDQUFDO2dDQUNsRCxVQUFVLEVBQUUsVUFBVTtnQ0FDdEIsS0FBSyxFQUFFLGtCQUFrQixHQUFHLDZCQUE2QjtnQ0FDekQsYUFBYSxFQUFFLFNBQVMsQ0FBQyw4QkFBOEI7Z0NBQ3ZELFVBQVUsRUFBRSxxQ0FBaUIsQ0FBQyxlQUFlO2dDQUM3QyxTQUFTLEVBQUUsU0FBUztnQ0FDcEIsa0JBQWtCLEVBQUUsa0JBQWtCO2dDQUN0QyxnQkFBZ0IsRUFBRSxnQkFBZ0I7Z0NBQ2xDLEtBQUssRUFBRSw2QkFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7NkJBQ25DLENBQUMsQ0FBQzt3QkFDTCxDQUFDLENBQUM7d0JBQ0YsNkRBQTZCLENBQUMsbUJBQW1CLENBQUM7NEJBQ2hELFVBQVUsRUFBRSxVQUFVOzRCQUN0QixLQUFLLEVBQUUsaUJBQUcsQ0FBQyxNQUFNLEdBQUcsNkJBQTZCOzRCQUNqRCxhQUFhLEVBQUUsU0FBUyxDQUFDLDhCQUE4Qjs0QkFDdkQsVUFBVSxFQUFFLHFDQUFpQixDQUFDLGVBQWU7NEJBQzdDLFNBQVMsRUFBRSxTQUFTOzRCQUNwQixLQUFLLEVBQUUsNkJBQWEsQ0FBQyxXQUFXO3lCQUNqQyxFQUNELFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FDMUUsaUJBQUcsQ0FBQyxNQUFNLENBQ1gsQ0FBQztxQkFDSDtvQkFDRCxTQUFTLEVBQUU7d0JBQ1QsR0FBRyxFQUFFLDZCQUFhLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLDhCQUE4QixDQUFDLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHO3dCQUM3SixHQUFHLEVBQUUsQ0FBQzt3QkFDTixLQUFLLEVBQUUsU0FBUyxDQUFDLDhCQUE4QixDQUFDLElBQUk7d0JBQ3BELFNBQVMsRUFBRSxLQUFLO3FCQUNqQjtvQkFDRCxlQUFlLEVBQUU7d0JBQ2Y7NEJBQ0UsS0FBSyxFQUFFLDZCQUFhLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLDhCQUE4QixDQUFDLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUM7NEJBQ3pKLE9BQU8sRUFBRSxJQUFJOzRCQUNiLEtBQUssRUFBRSxzQkFBSyxDQUFDLEdBQUc7NEJBQ2hCLEtBQUssRUFBRSxlQUFlO3lCQUN2QjtxQkFDRjtpQkFDRixDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxTQUFTLENBQUMsVUFBVSxDQUNsQixHQUFHLGNBQWM7UUFFakIseUNBQXlDO1FBQ3pDLElBQUksNEJBQVcsQ0FBQztZQUNkLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLENBQUM7WUFDUixLQUFLLEVBQUUsNEJBQTRCO1lBQ25DLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBd0IsRUFBRSxLQUFhLEVBQUUsRUFBRTtnQkFDdEUsSUFBSSxRQUFRLEdBQVcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDL0UsSUFBSSxrQkFBa0IsR0FBVyxLQUFLLENBQUMsUUFBUSxDQUFDLDRDQUE0QyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUV2RyxPQUFPLHlDQUFtQixDQUFDLDZCQUE2QixDQUFDO29CQUN2RCxrQkFBa0IsRUFBRSxrQkFBa0I7b0JBQ3RDLGdCQUFnQixFQUFFLGdCQUFnQjtvQkFDbEMsYUFBYSxFQUFFLFNBQVMsQ0FBQyw4QkFBOEI7b0JBQ3ZELEtBQUssRUFBRSxrQkFBa0IsR0FBRyw2QkFBNkI7b0JBQ3pELFVBQVUsRUFBRSxxQ0FBaUIsQ0FBQyxlQUFlO29CQUM3QyxTQUFTLEVBQUUsTUFBTSw2QkFBYSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxxQkFBcUIsRUFBRSxTQUFTLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLElBQUk7b0JBQ3ZLLEtBQUssRUFBRSw2QkFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7aUJBQ25DLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQztZQUNGLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFNBQVMsRUFBRTtnQkFDVCxLQUFLLEVBQUUsT0FBTztnQkFDZCxTQUFTLEVBQUUsS0FBSzthQUNqQjtTQUNGLENBQUM7UUFFRiwrQ0FBK0M7UUFDL0MsR0FBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsZ0NBQWdDLENBQUMseUNBQXlDLENBQUMsQ0FBQztZQUM1RztnQkFDRSxJQUFJLHFEQUF5QixDQUFDO29CQUM1QixNQUFNLEVBQUUsQ0FBQztvQkFDVCxLQUFLLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUUsa0RBQWtEO29CQUN6RCxXQUFXLEVBQUUsS0FBSyxDQUFDLHVCQUF1QixDQUFDLGdDQUFnQyxDQUFDLHlDQUF5QztvQkFDckgsTUFBTSxFQUFFLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxNQUFNO29CQUN2RCxjQUFjLEVBQUUsK0JBQWMsQ0FBQyxNQUFNO29CQUNyQyxjQUFjLEVBQUUsS0FBSztvQkFDckIsU0FBUyxFQUFFLGlCQUFHLENBQUMsVUFBVTtvQkFDekIsZUFBZSxFQUFFLEVBQUU7aUJBQ3BCLENBQUM7YUFDSCxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ1QsQ0FBQztRQUVGLFNBQVMsQ0FBQyxVQUFVLENBQ2xCLElBQUksMkJBQVUsQ0FBQztZQUNiLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxRQUFRLEVBQUUsWUFBWTtZQUN0QixVQUFVLEVBQUUscUNBQW9CLENBQUMsV0FBVztTQUM3QyxDQUFDLEVBQ0YsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUF3QixFQUFFLEVBQUU7WUFDM0csSUFBSSxRQUFRLEdBQVcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvRSxJQUFJLGtCQUFrQixHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUMsNENBQTRDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdkcsT0FBTyxJQUFJLDRCQUFXLENBQUM7Z0JBQ3JCLEtBQUssRUFBRSxLQUFLLENBQUMsdUJBQXVCLENBQUMsNkJBQTZCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxpQkFBaUI7Z0JBQ3RHLEtBQUssRUFBRSxHQUFHLGtCQUFrQixlQUFlO2dCQUMzQyxNQUFNLEVBQUUsQ0FBQztnQkFDVCxLQUFLLEVBQUUsQ0FBQzthQUNULENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxFQUNGLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBd0IsRUFBRSxFQUFFO1lBQzNHLElBQUksUUFBUSxHQUFXLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0UsSUFBSSxrQkFBa0IsR0FBVyxLQUFLLENBQUMsUUFBUSxDQUFDLDRDQUE0QyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXZHLE9BQU8sSUFBSSw0QkFBVyxDQUFDO2dCQUNyQixLQUFLLEVBQUUsS0FBSyxDQUFDLHVCQUF1QixDQUFDLDZCQUE2QixDQUFDLGdCQUFnQixDQUFDLENBQUMsWUFBWTtnQkFDakcsS0FBSyxFQUFFLEdBQUcsa0JBQWtCLFVBQVU7Z0JBQ3RDLE1BQU0sRUFBRSxDQUFDO2dCQUNULEtBQUssRUFBRSxDQUFDO2FBQ1QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTyxNQUFNLENBQUMsbUJBQW1CLENBQ2hDLFNBQW9CLEVBQ3BCLEtBQW9EO1FBR3BELElBQUksU0FBUyxHQUFlLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUM7UUFDcEUsSUFBSSxpQkFBaUIsR0FBYSxTQUFTLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1FBRTFFLFNBQVMsQ0FBQyxVQUFVLENBQ2xCLElBQUksMkJBQVUsQ0FBQztZQUNiLFFBQVEsRUFBRSx1QkFBdUI7WUFDakMsVUFBVSxFQUFFLHFDQUFvQixDQUFDLFdBQVc7WUFDNUMsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUMsQ0FDSCxDQUFDO1FBRUYsU0FBUyxDQUFDLFVBQVU7UUFDbEIsc0JBQXNCO1FBQ3RCLElBQUksNEJBQVcsQ0FBQztZQUNkLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLENBQUM7WUFDUixLQUFLLEVBQUUsY0FBYztZQUNyQixNQUFNLEVBQUUsaUJBQUcsQ0FBQyxNQUFNO1lBQ2xCLElBQUksRUFBRTtnQkFDSixHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUF3QixFQUFFLEtBQWEsRUFBRSxFQUFFO29CQUNuRSxJQUFJLFFBQVEsR0FBVyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUMvRSxJQUFJLGtCQUFrQixHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUMsNENBQTRDLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBRXZHLE9BQU8sNkRBQTZCLENBQUMsNkJBQTZCLENBQUM7d0JBQ2pFLGtCQUFrQixFQUFFLGtCQUFrQjt3QkFDdEMsZ0JBQWdCLEVBQUUsZ0JBQWdCO3dCQUNsQyxLQUFLLEVBQUUsa0JBQWtCLEdBQUcsNkJBQTZCO3dCQUN6RCxhQUFhLEVBQUUsU0FBUyxDQUFDLG1CQUFvQixDQUFDLCtCQUErQjt3QkFDN0UsVUFBVSxFQUFFLCtDQUFzQixDQUFDLFlBQVk7d0JBQy9DLEtBQUssRUFBRSw2QkFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7cUJBQ25DLEVBQ0QsU0FBUyxDQUFDLG1CQUFvQixDQUFDLCtCQUErQixDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FDN0Ysa0JBQWtCLEVBQ2xCLGlCQUFHLENBQUMsTUFBTSxDQUNYLENBQUMsQ0FBQTtnQkFDSixDQUFDLENBQUM7Z0JBQ0YsNkRBQTZCLENBQUMsd0JBQXdCLENBQUM7b0JBQ3JELEtBQUssRUFBRSxpQkFBRyxDQUFDLE1BQU0sR0FBRyw2QkFBNkI7b0JBQ2pELGFBQWEsRUFBRSxTQUFTLENBQUMsbUJBQW9CLENBQUMsK0JBQStCO29CQUM3RSxVQUFVLEVBQUUsK0NBQXNCLENBQUMsWUFBWTtvQkFDL0MsS0FBSyxFQUFFLDZCQUFhLENBQUMsV0FBVztpQkFDakMsRUFDRCxTQUFTLENBQUMsbUJBQW9CLENBQUMsK0JBQStCLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQ2hHLGlCQUFHLENBQUMsTUFBTSxDQUNYLENBQUM7YUFDSDtZQUNELFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFNBQVMsRUFBRTtnQkFDVCxHQUFHLEVBQUUsR0FBRztnQkFDUixHQUFHLEVBQUUsRUFBRTtnQkFDUCxLQUFLLEVBQUUsU0FBUztnQkFDaEIsU0FBUyxFQUFFLEtBQUs7YUFDakI7WUFDRCxlQUFlLEVBQUU7Z0JBQ2Y7b0JBQ0UsS0FBSyxFQUFFLFNBQVMsQ0FBQyxtQkFBb0IsQ0FBQywrQkFBK0IsQ0FBQyxxQkFBcUI7b0JBQzNGLE9BQU8sRUFBRSxJQUFJO29CQUNiLEtBQUssRUFBRSxzQkFBSyxDQUFDLEdBQUc7b0JBQ2hCLEtBQUssRUFBRSxlQUFlO2lCQUN2QjthQUNGO1NBQ0YsQ0FBQztRQUVGLHFCQUFxQjtRQUNyQixJQUFJLDRCQUFXLENBQUM7WUFDZCxNQUFNLEVBQUUsQ0FBQztZQUNULEtBQUssRUFBRSxDQUFDO1lBQ1IsS0FBSyxFQUFFLGFBQWE7WUFDcEIsTUFBTSxFQUFFLGlCQUFHLENBQUMsTUFBTTtZQUNsQixJQUFJLEVBQUU7Z0JBQ0osR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBd0IsRUFBRSxLQUFhLEVBQUUsRUFBRTtvQkFDbkUsSUFBSSxRQUFRLEdBQVcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDL0UsSUFBSSxrQkFBa0IsR0FBVyxLQUFLLENBQUMsUUFBUSxDQUFDLDRDQUE0QyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUV2RyxPQUFPLDZEQUE2QixDQUFDLDZCQUE2QixDQUFDO3dCQUNqRSxrQkFBa0IsRUFBRSxrQkFBa0I7d0JBQ3RDLGdCQUFnQixFQUFFLGdCQUFnQjt3QkFDbEMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxtQkFBb0IsQ0FBQywrQkFBK0I7d0JBQzdFLEtBQUssRUFBRSxrQkFBa0IsR0FBRyw2QkFBNkI7d0JBQ3pELFVBQVUsRUFBRSwrQ0FBc0IsQ0FBQyxXQUFXO3dCQUM5QyxLQUFLLEVBQUUsNkJBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO3FCQUNuQyxFQUNELFNBQVMsQ0FBQyxtQkFBb0IsQ0FBQywrQkFBK0IsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQzdGLGtCQUFrQixFQUNsQixpQkFBRyxDQUFDLE1BQU0sQ0FDWCxDQUFDLENBQUE7Z0JBQ0osQ0FBQyxDQUFDO2dCQUNGLDZEQUE2QixDQUFDLHdCQUF3QixDQUFDO29CQUNyRCxhQUFhLEVBQUUsU0FBUyxDQUFDLG1CQUFvQixDQUFDLCtCQUErQjtvQkFDN0UsS0FBSyxFQUFFLGlCQUFHLENBQUMsTUFBTSxHQUFHLDZCQUE2QjtvQkFDakQsVUFBVSxFQUFFLCtDQUFzQixDQUFDLFdBQVc7b0JBQzlDLEtBQUssRUFBRSw2QkFBYSxDQUFDLFdBQVc7aUJBQ2pDLEVBQ0QsU0FBUyxDQUFDLG1CQUFvQixDQUFDLCtCQUErQixDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUNoRyxpQkFBRyxDQUFDLE1BQU0sQ0FDWCxDQUFDO2FBQ0g7WUFDRCxTQUFTLEVBQUUsS0FBSztZQUNoQixTQUFTLEVBQUU7Z0JBQ1QsR0FBRyxFQUFFLENBQUM7Z0JBQ04sS0FBSyxFQUFFLE9BQU87Z0JBQ2QsU0FBUyxFQUFFLEtBQUs7YUFDakI7U0FDRixDQUFDO1FBRUYsdUJBQXVCO1FBQ3ZCLElBQUksNEJBQVcsQ0FBQztZQUNkLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLENBQUM7WUFDUixLQUFLLEVBQUUsZUFBZTtZQUN0QixNQUFNLEVBQUUsaUJBQUcsQ0FBQyxNQUFNO1lBQ2xCLElBQUksRUFBRTtnQkFDSixHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUF3QixFQUFFLEtBQWEsRUFBRSxFQUFFO29CQUNuRSxJQUFJLFFBQVEsR0FBVyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUMvRSxJQUFJLGtCQUFrQixHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUMsNENBQTRDLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3ZHLE9BQU8sNkRBQTZCLENBQUMsNkJBQTZCLENBQUM7d0JBQ2pFLGtCQUFrQixFQUFFLGtCQUFrQjt3QkFDdEMsZ0JBQWdCLEVBQUUsZ0JBQWdCO3dCQUNsQyxhQUFhLEVBQUUsU0FBUyxDQUFDLG1CQUFvQixDQUFDLCtCQUErQjt3QkFDN0UsS0FBSyxFQUFFLGtCQUFrQixHQUFHLDZCQUE2Qjt3QkFDekQsVUFBVSxFQUFFLCtDQUFzQixDQUFDLGFBQWE7d0JBQ2hELEtBQUssRUFBRSw2QkFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7cUJBQ25DLEVBQ0QsU0FBUyxDQUFDLG1CQUFvQixDQUFDLCtCQUErQixDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FDN0Ysa0JBQWtCLEVBQ2xCLGlCQUFHLENBQUMsTUFBTSxDQUNYLENBQUMsQ0FBQTtnQkFDSixDQUFDLENBQUM7Z0JBQ0YsNkRBQTZCLENBQUMsd0JBQXdCLENBQUM7b0JBQ3JELGFBQWEsRUFBRSxTQUFTLENBQUMsbUJBQW9CLENBQUMsK0JBQStCO29CQUM3RSxLQUFLLEVBQUUsaUJBQUcsQ0FBQyxNQUFNLEdBQUcsNkJBQTZCO29CQUNqRCxVQUFVLEVBQUUsK0NBQXNCLENBQUMsYUFBYTtvQkFDaEQsS0FBSyxFQUFFLDZCQUFhLENBQUMsV0FBVztpQkFDakMsRUFDRCxTQUFTLENBQUMsbUJBQW9CLENBQUMsK0JBQStCLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQ2hHLGlCQUFHLENBQUMsTUFBTSxDQUNYLENBQUM7YUFDSDtZQUNELFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFNBQVMsRUFBRTtnQkFDVCxLQUFLLEVBQUUsT0FBTztnQkFDZCxTQUFTLEVBQUUsS0FBSzthQUNqQjtTQUNGLENBQUMsQ0FDSCxDQUFDO1FBRUYsSUFBSSxjQUFjLEdBQWMsRUFBRSxDQUFDO1FBRW5DLGlCQUFpQjtRQUNqQixTQUFTLENBQUMsbUJBQW9CLENBQUMsMEJBQTBCLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBa0IsRUFBRSxFQUFFO1lBQzFHLFNBQVMsQ0FBQyxtQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFpQixFQUFFLEVBQUU7Z0JBRWhILGNBQWMsQ0FBQyxJQUFJLENBQ2pCLElBQUksNEJBQVcsQ0FBQztvQkFDZCxNQUFNLEVBQUUsQ0FBQztvQkFDVCxLQUFLLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUUsR0FBRyxVQUFVLGFBQWEsU0FBUyxHQUFHO29CQUM3QyxNQUFNLEVBQUUsaUJBQUcsQ0FBQyxNQUFNO29CQUNsQixJQUFJLEVBQUU7d0JBQ0osR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBd0IsRUFBRSxLQUFhLEVBQUUsRUFBRTs0QkFDbkUsSUFBSSxRQUFRLEdBQVcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDL0UsSUFBSSxrQkFBa0IsR0FBVyxLQUFLLENBQUMsUUFBUSxDQUFDLDRDQUE0QyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUV2RyxPQUFPLHlDQUFtQixDQUFDLHdCQUF3QixDQUFDO2dDQUNsRCxVQUFVLEVBQUUsVUFBVTtnQ0FDdEIsS0FBSyxFQUFFLGtCQUFrQixHQUFHLDZCQUE2QjtnQ0FDekQsYUFBYSxFQUFFLFNBQVMsQ0FBQyxtQkFBb0IsQ0FBQywwQkFBMEI7Z0NBQ3hFLFVBQVUsRUFBRSxxQ0FBaUIsQ0FBQyxlQUFlO2dDQUM3QyxTQUFTLEVBQUUsU0FBUztnQ0FDcEIsa0JBQWtCLEVBQUUsa0JBQWtCO2dDQUN0QyxnQkFBZ0IsRUFBRSxnQkFBZ0I7Z0NBQ2xDLEtBQUssRUFBRSw2QkFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7NkJBQ25DLENBQUMsQ0FBQzt3QkFDTCxDQUFDLENBQUM7d0JBQ0YsNkRBQTZCLENBQUMsbUJBQW1CLENBQUM7NEJBQ2hELFVBQVUsRUFBRSxVQUFVOzRCQUN0QixLQUFLLEVBQUUsaUJBQUcsQ0FBQyxNQUFNLEdBQUcsNkJBQTZCOzRCQUNqRCxhQUFhLEVBQUUsU0FBUyxDQUFDLG1CQUFvQixDQUFDLDBCQUEwQjs0QkFDeEUsVUFBVSxFQUFFLHFDQUFpQixDQUFDLGVBQWU7NEJBQzdDLFNBQVMsRUFBRSxTQUFTOzRCQUNwQixLQUFLLEVBQUUsNkJBQWEsQ0FBQyxXQUFXO3lCQUNqQyxFQUNELFNBQVMsQ0FBQyxtQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FDM0YsaUJBQUcsQ0FBQyxNQUFNLENBQ1gsQ0FBQztxQkFDSDtvQkFDRCxTQUFTLEVBQUU7d0JBQ1QsR0FBRyxFQUFFLDZCQUFhLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLG1CQUFvQixDQUFDLDBCQUEwQixDQUFDLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyxtQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHO3dCQUMvTCxHQUFHLEVBQUUsQ0FBQzt3QkFDTixLQUFLLEVBQUUsU0FBUyxDQUFDLG1CQUFvQixDQUFDLDBCQUEwQixDQUFDLElBQUk7d0JBQ3JFLFNBQVMsRUFBRSxLQUFLO3FCQUNqQjtvQkFDRCxlQUFlLEVBQUU7d0JBQ2Y7NEJBQ0UsS0FBSyxFQUFFLDZCQUFhLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLG1CQUFvQixDQUFDLDBCQUEwQixDQUFDLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyxtQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUM7NEJBQzNMLE9BQU8sRUFBRSxJQUFJOzRCQUNiLEtBQUssRUFBRSxzQkFBSyxDQUFDLEdBQUc7NEJBQ2hCLEtBQUssRUFBRSxlQUFlO3lCQUN2QjtxQkFDRjtpQkFDRixDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxTQUFTLENBQUMsVUFBVSxDQUNsQixHQUFHLGNBQWM7UUFFakIsb0NBQW9DO1FBQ3BDLElBQUksNEJBQVcsQ0FBQztZQUNkLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLENBQUM7WUFDUixLQUFLLEVBQUUsNEJBQTRCO1lBQ25DLElBQUksRUFBRTtnQkFDSixHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUF3QixFQUFFLEtBQWEsRUFBRSxFQUFFO29CQUNuRSxJQUFJLFFBQVEsR0FBVyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUMvRSxJQUFJLGtCQUFrQixHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUMsNENBQTRDLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBRXZHLE9BQU8seUNBQW1CLENBQUMsNkJBQTZCLENBQUM7d0JBQ3ZELGtCQUFrQixFQUFFLGtCQUFrQjt3QkFDdEMsZ0JBQWdCLEVBQUUsZ0JBQWdCO3dCQUNsQyxhQUFhLEVBQUUsU0FBUyxDQUFDLG1CQUFvQixDQUFDLDBCQUEwQjt3QkFDeEUsS0FBSyxFQUFFLGtCQUFrQixHQUFHLDZCQUE2Qjt3QkFDekQsVUFBVSxFQUFFLHFDQUFpQixDQUFDLGVBQWU7d0JBQzdDLFNBQVMsRUFBRSxNQUFNLDZCQUFhLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLG1CQUFvQixDQUFDLDBCQUEwQixDQUFDLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyxtQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsSUFBSTt3QkFDek0sS0FBSyxFQUFFLDZCQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztxQkFDbkMsQ0FBQyxDQUFBO2dCQUNKLENBQUMsQ0FBQztnQkFDRiw2REFBNkIsQ0FBQyx3QkFBd0IsQ0FBQztvQkFDckQsS0FBSyxFQUFFLGlCQUFHLENBQUMsTUFBTSxHQUFHLDZCQUE2QjtvQkFDakQsYUFBYSxFQUFFLFNBQVMsQ0FBQyxtQkFBb0IsQ0FBQywwQkFBMEI7b0JBQ3hFLFVBQVUsRUFBRSxxQ0FBaUIsQ0FBQyxlQUFlO29CQUM3QyxTQUFTLEVBQUUsTUFBTSw2QkFBYSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxtQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxxQkFBcUIsRUFBRSxTQUFTLENBQUMsbUJBQW9CLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUk7b0JBQ3pNLEtBQUssRUFBRSw2QkFBYSxDQUFDLFdBQVc7aUJBQ2pDLEVBQ0QsU0FBUyxDQUFDLG1CQUFvQixDQUFDLDBCQUEwQixDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUMzRixpQkFBRyxDQUFDLE1BQU0sQ0FDWCxDQUFDO2FBQ0g7WUFDRCxTQUFTLEVBQUUsS0FBSztZQUNoQixTQUFTLEVBQUU7Z0JBQ1QsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsU0FBUyxFQUFFLEtBQUs7YUFDakI7U0FDRixDQUFDLENBQ0gsQ0FBQztRQUVGLFNBQVMsQ0FBQyxVQUFVLENBQ2xCLElBQUksMkJBQVUsQ0FBQztZQUNiLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxRQUFRLEVBQUUsWUFBWTtZQUN0QixVQUFVLEVBQUUscUNBQW9CLENBQUMsV0FBVztTQUM3QyxDQUFDLEVBQ0YsSUFBSSw0QkFBVyxDQUFDO1lBQ2QsS0FBSyxFQUFFLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyw0QkFBNkIsQ0FBQyxpQkFBaUI7WUFDcEYsS0FBSyxFQUFFLHVCQUF1QjtZQUM5QixNQUFNLEVBQUUsQ0FBQztZQUNULEtBQUssRUFBRSxFQUFFO1NBQ1YsQ0FBQyxFQUNGLElBQUksNEJBQVcsQ0FBQztZQUNkLEtBQUssRUFBRSxLQUFLLENBQUMsdUJBQXVCLENBQUMsNEJBQTZCLENBQUMsWUFBWTtZQUMvRSxLQUFLLEVBQUUsa0JBQWtCO1lBQ3pCLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDLEVBQ0YsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyx5QkFBMEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUF3QixFQUFFLEVBQUU7WUFDeEcsSUFBSSxRQUFRLEdBQVcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvRSxJQUFJLGtCQUFrQixHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUMsNENBQTRDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdkcsT0FBTyxJQUFJLDRCQUFXLENBQUM7Z0JBQ3JCLEtBQUssRUFBRSxLQUFLLENBQUMsdUJBQXVCLENBQUMseUJBQTBCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxpQkFBaUI7Z0JBQ25HLEtBQUssRUFBRSxHQUFHLGtCQUFrQixlQUFlO2dCQUMzQyxNQUFNLEVBQUUsQ0FBQztnQkFDVCxLQUFLLEVBQUUsQ0FBQzthQUNULENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxFQUNGLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMseUJBQTBCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBd0IsRUFBRSxFQUFFO1lBQ3hHLElBQUksUUFBUSxHQUFXLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0UsSUFBSSxrQkFBa0IsR0FBVyxLQUFLLENBQUMsUUFBUSxDQUFDLDRDQUE0QyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXZHLE9BQU8sSUFBSSw0QkFBVyxDQUFDO2dCQUNyQixLQUFLLEVBQUUsS0FBSyxDQUFDLHVCQUF1QixDQUFDLHlCQUEwQixDQUFDLGdCQUFnQixDQUFDLENBQUMsWUFBWTtnQkFDOUYsS0FBSyxFQUFFLEdBQUcsa0JBQWtCLFVBQVU7Z0JBQ3RDLE1BQU0sRUFBRSxDQUFDO2dCQUNULEtBQUssRUFBRSxDQUFDO2FBQ1QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFPRCxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUFvRDtRQUVwRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSwwQkFBUyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUU7WUFDaEQsYUFBYSxFQUNYLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3pFLEdBQUc7Z0JBQ0gsS0FBSyxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFO2dCQUNuRSw2QkFBNkIsaUJBQUcsQ0FBQyxNQUFNLEVBQUU7WUFDM0MsZUFBZSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQy9CLGNBQWMsRUFBRSwrQkFBYyxDQUFDLElBQUk7U0FDcEMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQ3ZCLElBQUksa0NBQWlCLENBQUM7WUFDcEIsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULE1BQU0sRUFBRTtnQkFDTixLQUFLLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CO2dCQUNqRCxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLG9CQUFvQixDQUFDO2FBQ3JFO1lBQ0QsS0FBSyxFQUFFLGtCQUFrQjtTQUMxQixDQUNGLENBQUMsQ0FBQztRQUVILHdDQUF3QyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEYsSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDaEUsd0NBQXdDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0RixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBbG5CRCw0RkFrbkJDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuaW1wb3J0IHsgQXdzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgRGFzaGJvYXJkLFxuICBQZXJpb2RPdmVycmlkZSxcbiAgSVdpZGdldCxcbiAgQWxhcm1TdGF0dXNXaWRnZXQsXG4gIEdyYXBoV2lkZ2V0LFxuICBDb2xvcixcbiAgTGVnZW5kUG9zaXRpb24sXG4gIFRleHRXaWRnZXQsXG4gIFRleHRXaWRnZXRCYWNrZ3JvdW5kLFxuICBBbGFybVdpZGdldCxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBDb250cmlidXRvckluc2lnaHRzV2lkZ2V0IH0gZnJvbSAnLi9Db250cmlidXRvckluc2lnaHRzV2lkZ2V0JztcbmltcG9ydCB7IElPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkIH0gZnJvbSAnLi9JT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZCc7XG5pbXBvcnQgeyBPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHMgfSBmcm9tICcuL3Byb3BzL09wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRQcm9wcyc7XG5pbXBvcnQgeyBab25hbExhdGVuY3lNZXRyaWNzIH0gZnJvbSAnLi4vbWV0cmljcy9ab25hbExhdGVuY3lNZXRyaWNzJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUgfSBmcm9tICcuLi91dGlsaXRpZXMvQXZhaWxhYmlsaXR5TWV0cmljVHlwZSc7XG5pbXBvcnQgeyBMYXRlbmN5TWV0cmljVHlwZSB9IGZyb20gJy4uL3V0aWxpdGllcy9MYXRlbmN5TWV0cmljVHlwZSc7XG5pbXBvcnQgeyBNZXRyaWNzSGVscGVyIH0gZnJvbSAnLi4vdXRpbGl0aWVzL01ldHJpY3NIZWxwZXInO1xuaW1wb3J0IHsgQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MgfSBmcm9tICcuLi9tZXRyaWNzL0F2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzJztcbmltcG9ydCB7IElPcGVyYXRpb24gfSBmcm9tICcuLi9zZXJ2aWNlcy9JT3BlcmF0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9wZXJhdGlvbiBsZXZlbCBhdmFpbGFiaWxpdHkgYW5kIGxhdGVuY3kgZGFzaGJvYXJkXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkXG4gIGV4dGVuZHMgQ29uc3RydWN0XG4gIGltcGxlbWVudHMgSU9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQge1xuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVNlcnZlclNpZGVXaWRnZXRzKFxuICAgIGRhc2hib2FyZDogRGFzaGJvYXJkLFxuICAgIHByb3BzOiBPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHNcbiAgKTogdm9pZCB7XG5cbiAgICBsZXQgb3BlcmF0aW9uOiBJT3BlcmF0aW9uID0gcHJvcHMub3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMub3BlcmF0aW9uO1xuICAgIGxldCBhdmFpbGFiaWxpdHlab25lczogc3RyaW5nW10gPSBwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5vcGVyYXRpb24uc2VydmljZS5hdmFpbGFiaWxpdHlab25lTmFtZXM7XG4gICAgXG4gICAgZGFzaGJvYXJkLmFkZFdpZGdldHMoXG4gICAgICBuZXcgVGV4dFdpZGdldCh7XG4gICAgICAgIG1hcmtkb3duOiBcIiMjICoqU2VydmVyLXNpZGUgTWV0cmljcyoqXCIsXG4gICAgICAgIGJhY2tncm91bmQ6IFRleHRXaWRnZXRCYWNrZ3JvdW5kLlRSQU5TUEFSRU5ULFxuICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgIHdpZHRoOiAyNFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgZGFzaGJvYXJkLmFkZFdpZGdldHMoXG5cbiAgICAgIC8vIFNlcnZlci1zaWRlIGF2YWlsYWJpbGl0eVxuICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICB3aWR0aDogNixcbiAgICAgICAgdGl0bGU6ICdBdmFpbGFiaWxpdHknLFxuICAgICAgICByZWdpb246IEF3cy5SRUdJT04sXG4gICAgICAgIGxlZnQ6IFtcbiAgICAgICAgICAuLi5hdmFpbGFiaWxpdHlab25lcy5tYXAoKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWMoe1xuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArIFwiIChhdmc6ICR7QVZHfSAgbWluOiAke01JTn0pXCIsXG4gICAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IG9wZXJhdGlvbi5zZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgICAgbWV0cmljVHlwZTogQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5TVUNDRVNTX1JBVEUsXG4gICAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLmNvbG9yc1tpbmRleF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMuem9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIEF3cy5SRUdJT05cbiAgICAgICAgICAgICkpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlQXZhaWxhYmlsaXR5TWV0cmljKHtcbiAgICAgICAgICAgIGxhYmVsOiBBd3MuUkVHSU9OICsgXCIgKGF2ZzogJHtBVkd9ICBtaW46ICR7TUlOfSlcIixcbiAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IG9wZXJhdGlvbi5zZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuU1VDQ0VTU19SQVRFLFxuICAgICAgICAgICAgY29sb3I6IE1ldHJpY3NIZWxwZXIucmVnaW9uQ29sb3JcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMubWV0cmljRGltZW5zaW9ucy5yZWdpb25hbERpbWVuc2lvbnMoXG4gICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgKSlcbiAgICAgICAgXSxcbiAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgbWF4OiAxMDAsXG4gICAgICAgICAgbWluOiA5NSxcbiAgICAgICAgICBsYWJlbDogJ1BlcmNlbnQnLFxuICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGxlZnRBbm5vdGF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBvcGVyYXRpb24uc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMuc3VjY2Vzc0FsYXJtVGhyZXNob2xkLFxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbG9yOiBDb2xvci5SRUQsXG4gICAgICAgICAgICBsYWJlbDogJ0hpZ2ggU2V2ZXJpdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICAgIH0pLFxuXG4gICAgICAvLyBTZXJ2ZXItc2lkZSBmYXVsdCBjb3VudFxuICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICB3aWR0aDogNixcbiAgICAgICAgdGl0bGU6ICdGYXVsdCBDb3VudCcsXG4gICAgICAgIHJlZ2lvbjogQXdzLlJFR0lPTixcbiAgICAgICAgbGVmdDogYXZhaWxhYmlsaXR5Wm9uZXMubWFwKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBsZXQgYXpMZXR0ZXI6IHN0cmluZyA9IGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICAgICAgcmV0dXJuIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZVpvbmFsQXZhaWxhYmlsaXR5TWV0cmljKHtcbiAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIiAoYXZnOiAke0FWR30gIG1heDogJHtNQVh9KVwiLFxuICAgICAgICAgICAgbWV0cmljRGV0YWlsczogb3BlcmF0aW9uLnNlcnZlclNpZGVBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgbWV0cmljVHlwZTogQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5GQVVMVF9DT1VOVCxcbiAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLmNvbG9yc1tpbmRleF1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMubWV0cmljRGltZW5zaW9ucy56b25hbERpbWVuc2lvbnMoXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgKSlcbiAgICAgICAgfSksXG4gICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICBsYWJlbDogJ0NvdW50JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICB9KSxcblxuICAgICAgLy8gU2VydmVyLXNpZGUgcmVxdWVzdCBjb3VudFxuICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICB3aWR0aDogNixcbiAgICAgICAgdGl0bGU6IFwiUmVxdWVzdCBDb3VudFwiLFxuICAgICAgICByZWdpb246IEF3cy5SRUdJT04sXG4gICAgICAgIGxlZnQ6IGF2YWlsYWJpbGl0eVpvbmVzLm1hcCgoYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IHByb3BzLmF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgICAgIHJldHVybiBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVab25hbEF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCIgKGF2ZzogJHtBVkd9ICBtYXg6ICR7TUFYfSlcIixcbiAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IG9wZXJhdGlvbi5zZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuUkVRVUVTVF9DT1VOVCxcbiAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLmNvbG9yc1tpbmRleF1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMubWV0cmljRGltZW5zaW9ucy56b25hbERpbWVuc2lvbnMoXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgKSlcbiAgICAgICAgfSksXG4gICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgIGxhYmVsOiAnQ291bnQnLFxuICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KSxcblxuICAgICAgLy8gU2VydmVyLXNpZGUgaW5zdGFuY2UgY29udHJpYnV0b3JzIHRvIGZhdWx0c1xuICAgICAgLi4uIHByb3BzLm9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzLnNlcnZlclNpZGVSZWdpb25hbEFsYXJtc0FuZFJ1bGVzLmluc3RhbmNlQ29udHJpYnV0b3JzVG9SZWdpb25hbEZhdWx0cyA/XG4gICAgICAgIFsgXG4gICAgICAgICAgbmV3IENvbnRyaWJ1dG9ySW5zaWdodHNXaWRnZXQoe1xuICAgICAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgICAgICB0aXRsZTogJ0luZGl2aWR1YWwgSW5zdGFuY2UgQ29udHJpYnV0b3JzIHRvIEZhdWx0IENvdW50JyxcbiAgICAgICAgICAgIGluc2lnaHRSdWxlOiBwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5zZXJ2ZXJTaWRlUmVnaW9uYWxBbGFybXNBbmRSdWxlcy5pbnN0YW5jZUNvbnRyaWJ1dG9yc1RvUmVnaW9uYWxGYXVsdHMsXG4gICAgICAgICAgICBwZXJpb2Q6IG9wZXJhdGlvbi5zZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscy5wZXJpb2QsXG4gICAgICAgICAgICBsZWdlbmRQb3NpdGlvbjogTGVnZW5kUG9zaXRpb24uQk9UVE9NLFxuICAgICAgICAgICAgb3JkZXJTdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICAgICAgYWNjb3VudElkOiBBd3MuQUNDT1VOVF9JRCwgXG4gICAgICAgICAgICB0b3BDb250cmlidXRvcnM6IDEwLFxuICAgICAgICAgIH0pIFxuICAgICAgICBdIDogW11cbiAgICAgICk7XG5cbiAgICAvLyBTZXJ2ZXItc2lkZSBsYXRlbmN5XG4gICAgbGV0IGxhdGVuY3lXaWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcbiAgICBvcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLnN1Y2Nlc3NNZXRyaWNOYW1lcy5mb3JFYWNoKChtZXRyaWNOYW1lOiBzdHJpbmcpID0+IHtcblxuICAgICAgb3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscy5ncmFwaGVkU3VjY2Vzc1N0YXRpc3RpY3M/LmZvckVhY2goKHN0YXRpc3RpYzogc3RyaW5nKSA9PiB7XG5cbiAgICAgICAgbGF0ZW5jeVdpZGdldHMucHVzaChcbiAgICAgICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgICAgICB0aXRsZTogYCR7bWV0cmljTmFtZX0gTGF0ZW5jeSAoJHtzdGF0aXN0aWN9KWAsXG4gICAgICAgICAgICByZWdpb246IEF3cy5SRUdJT04sXG4gICAgICAgICAgICBsZWZ0OiBbXG4gICAgICAgICAgICAgIC4uLmF2YWlsYWJpbGl0eVpvbmVzLm1hcCgoYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IHByb3BzLmF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvbmFsTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxMYXRlbmN5TWV0cmljKHtcbiAgICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IG1ldHJpY05hbWUsXG4gICAgICAgICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCIgKGF2ZzogJHtBVkd9ICBtYXg6ICR7TUFYfSlcIixcbiAgICAgICAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IG9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBMYXRlbmN5TWV0cmljVHlwZS5TVUNDRVNTX0xBVEVOQ1ksXG4gICAgICAgICAgICAgICAgICBzdGF0aXN0aWM6IHN0YXRpc3RpYyxcbiAgICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLmNvbG9yc1tpbmRleF1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZUxhdGVuY3lNZXRyaWMoe1xuICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IG1ldHJpY05hbWUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IEF3cy5SRUdJT04gKyBcIiAoYXZnOiAke0FWR30gIG1heDogJHtNQVh9KVwiLFxuICAgICAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IG9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgICAgbWV0cmljVHlwZTogTGF0ZW5jeU1ldHJpY1R5cGUuU1VDQ0VTU19MQVRFTkNZLFxuICAgICAgICAgICAgICAgIHN0YXRpc3RpYzogc3RhdGlzdGljLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLnJlZ2lvbkNvbG9yXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMubWV0cmljRGltZW5zaW9ucy5yZWdpb25hbERpbWVuc2lvbnMoXG4gICAgICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgICAgICBtYXg6IE1ldHJpY3NIZWxwZXIuY29udmVydER1cmF0aW9uQnlVbml0KG9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMuc3VjY2Vzc0FsYXJtVGhyZXNob2xkLCBvcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLnVuaXQpICogMS41LFxuICAgICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICAgIGxhYmVsOiBvcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLnVuaXQsXG4gICAgICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVmdEFubm90YXRpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogTWV0cmljc0hlbHBlci5jb252ZXJ0RHVyYXRpb25CeVVuaXQob3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscy5zdWNjZXNzQWxhcm1UaHJlc2hvbGQsIG9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMudW5pdCksXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogQ29sb3IuUkVELFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnSGlnaCBTZXZlcml0eScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkYXNoYm9hcmQuYWRkV2lkZ2V0cyhcbiAgICAgIC4uLmxhdGVuY3lXaWRnZXRzLFxuXG4gICAgICAvLyBTZXJ2ZXItc2lkZSBoaWdoIGxhdGVuY3kgcmVxdWVzdCBjb3VudFxuICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICB3aWR0aDogNixcbiAgICAgICAgdGl0bGU6ICdIaWdoIExhdGVuY3kgUmVxdWVzdCBDb3VudCcsXG4gICAgICAgIGxlZnQ6IGF2YWlsYWJpbGl0eVpvbmVzLm1hcCgoYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IHByb3BzLmF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgICAgIHJldHVybiBab25hbExhdGVuY3lNZXRyaWNzLmNyZWF0ZVpvbmFsQ291bnRMYXRlbmN5TWV0cmljKHtcbiAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IG9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCIgKGF2ZzogJHtBVkd9ICBtYXg6ICR7TUFYfSlcIixcbiAgICAgICAgICAgIG1ldHJpY1R5cGU6IExhdGVuY3lNZXRyaWNUeXBlLlNVQ0NFU1NfTEFURU5DWSxcbiAgICAgICAgICAgIHN0YXRpc3RpYzogYFRDKCR7TWV0cmljc0hlbHBlci5jb252ZXJ0RHVyYXRpb25CeVVuaXQob3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscy5zdWNjZXNzQWxhcm1UaHJlc2hvbGQsIG9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMudW5pdCl9OilgLFxuICAgICAgICAgICAgY29sb3I6IE1ldHJpY3NIZWxwZXIuY29sb3JzW2luZGV4XVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBsYWJlbDogJ0NvdW50JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSksXG5cbiAgICAgIC8vIFNlcnZlci1zaWRlIGluc3RhbmNlIGNvbnRyaWJ1dG9ycyB0byBsYXRlbmN5XG4gICAgICAuLi4gcHJvcHMub3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMuc2VydmVyU2lkZVJlZ2lvbmFsQWxhcm1zQW5kUnVsZXMuaW5zdGFuY2VDb250cmlidXRvcnNUb1JlZ2lvbmFsSGlnaExhdGVuY3kgP1xuICAgICAgICBbXG4gICAgICAgICAgbmV3IENvbnRyaWJ1dG9ySW5zaWdodHNXaWRnZXQoe1xuICAgICAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgICAgICB0aXRsZTogJ0luZGl2aWR1YWwgSW5zdGFuY2UgQ29udHJpYnV0b3JzIHRvIEhpZ2ggTGF0ZW5jeScsXG4gICAgICAgICAgICBpbnNpZ2h0UnVsZTogcHJvcHMub3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMuc2VydmVyU2lkZVJlZ2lvbmFsQWxhcm1zQW5kUnVsZXMuaW5zdGFuY2VDb250cmlidXRvcnNUb1JlZ2lvbmFsSGlnaExhdGVuY3ksXG4gICAgICAgICAgICBwZXJpb2Q6IG9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMucGVyaW9kLFxuICAgICAgICAgICAgbGVnZW5kUG9zaXRpb246IExlZ2VuZFBvc2l0aW9uLkJPVFRPTSxcbiAgICAgICAgICAgIG9yZGVyU3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgICAgIGFjY291bnRJZDogQXdzLkFDQ09VTlRfSUQsXG4gICAgICAgICAgICB0b3BDb250cmlidXRvcnM6IDEwLFxuICAgICAgICAgIH0pIFxuICAgICAgICBdIDogW11cbiAgICApO1xuXG4gICAgZGFzaGJvYXJkLmFkZFdpZGdldHMoXG4gICAgICBuZXcgVGV4dFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogMSxcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICBtYXJrZG93bjogXCIjIyMgQWxhcm1zXCIsXG4gICAgICAgIGJhY2tncm91bmQ6IFRleHRXaWRnZXRCYWNrZ3JvdW5kLlRSQU5TUEFSRU5UXG4gICAgICB9KSxcbiAgICAgIC4uLk9iamVjdC5rZXlzKHByb3BzLm9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzLnNlcnZlclNpZGVab25hbEFsYXJtc0FuZFJ1bGVzKS5tYXAoKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgYXpMZXR0ZXI6IHN0cmluZyA9IGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IHByb3BzLmF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcbiAgXG4gICAgICAgIHJldHVybiBuZXcgQWxhcm1XaWRnZXQoe1xuICAgICAgICAgIGFsYXJtOiBwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5zZXJ2ZXJTaWRlWm9uYWxBbGFybXNBbmRSdWxlc1thdmFpbGFiaWxpdHlab25lXS5hdmFpbGFiaWxpdHlBbGFybSxcbiAgICAgICAgICB0aXRsZTogYCR7YXZhaWxhYmlsaXR5Wm9uZUlkfSBBdmFpbGFiaWxpdHlgLFxuICAgICAgICAgIGhlaWdodDogMixcbiAgICAgICAgICB3aWR0aDogOFxuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgLi4uT2JqZWN0LmtleXMocHJvcHMub3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMuc2VydmVyU2lkZVpvbmFsQWxhcm1zQW5kUnVsZXMpLm1hcCgoYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuICBcbiAgICAgICAgcmV0dXJuIG5ldyBBbGFybVdpZGdldCh7XG4gICAgICAgICAgYWxhcm06IHByb3BzLm9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzLnNlcnZlclNpZGVab25hbEFsYXJtc0FuZFJ1bGVzW2F2YWlsYWJpbGl0eVpvbmVdLmxhdGVuY3lBbGFybSxcbiAgICAgICAgICB0aXRsZTogYCR7YXZhaWxhYmlsaXR5Wm9uZUlkfSBMYXRlbmN5YCxcbiAgICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgICAgd2lkdGg6IDhcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUNhbmFyeVdpZGdldHMoXG4gICAgZGFzaGJvYXJkOiBEYXNoYm9hcmQsXG4gICAgcHJvcHM6IE9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRQcm9wc1xuICApOiB2b2lkIHtcblxuICAgIGxldCBvcGVyYXRpb246IElPcGVyYXRpb24gPSBwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5vcGVyYXRpb247XG4gICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVzOiBzdHJpbmdbXSA9IG9wZXJhdGlvbi5zZXJ2aWNlLmF2YWlsYWJpbGl0eVpvbmVOYW1lcztcblxuICAgIGRhc2hib2FyZC5hZGRXaWRnZXRzKFxuICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICBtYXJrZG93bjogXCIjIyAqKkNhbmFyeSBNZXRyaWNzKipcIixcbiAgICAgICAgYmFja2dyb3VuZDogVGV4dFdpZGdldEJhY2tncm91bmQuVFJBTlNQQVJFTlQsXG4gICAgICAgIGhlaWdodDogMSxcbiAgICAgICAgd2lkdGg6IDI0XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBkYXNoYm9hcmQuYWRkV2lkZ2V0cyhcbiAgICAgIC8vIENhbmFyeSBhdmFpbGFiaWxpdHlcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgIHRpdGxlOiAnQXZhaWxhYmlsaXR5JyxcbiAgICAgICAgcmVnaW9uOiBBd3MuUkVHSU9OLFxuICAgICAgICBsZWZ0OiBbXG4gICAgICAgICAgLi4uYXZhaWxhYmlsaXR5Wm9uZXMubWFwKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IHByb3BzLmF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZVpvbmFsQXZhaWxhYmlsaXR5TWV0cmljKHtcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIiAoYXZnOiAke0FWR30gIG1pbjogJHtNSU59KVwiLFxuICAgICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgICAgbWV0cmljVHlwZTogQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5TVUNDRVNTX1JBVEUsXG4gICAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLmNvbG9yc1tpbmRleF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnpvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgICApKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZUF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICBsYWJlbDogQXdzLlJFR0lPTiArIFwiIChhdmc6ICR7QVZHfSAgbWluOiAke01JTn0pXCIsXG4gICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuU1VDQ0VTU19SQVRFLFxuICAgICAgICAgICAgY29sb3I6IE1ldHJpY3NIZWxwZXIucmVnaW9uQ29sb3JcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMucmVnaW9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICkpXG4gICAgICAgIF0sXG4gICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgIG1heDogMTAwLFxuICAgICAgICAgIG1pbjogOTUsXG4gICAgICAgICAgbGFiZWw6ICdQZXJjZW50JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBsZWZ0QW5ub3RhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMuc3VjY2Vzc0FsYXJtVGhyZXNob2xkLFxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbG9yOiBDb2xvci5SRUQsXG4gICAgICAgICAgICBsYWJlbDogJ0hpZ2ggU2V2ZXJpdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICAgIH0pLFxuXG4gICAgICAvLyBDYW5hcnkgZmF1bHQgY291bnRcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgIHRpdGxlOiAnRmF1bHQgQ291bnQnLFxuICAgICAgICByZWdpb246IEF3cy5SRUdJT04sXG4gICAgICAgIGxlZnQ6IFtcbiAgICAgICAgICAuLi5hdmFpbGFiaWxpdHlab25lcy5tYXAoKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWMoe1xuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIiAoYXZnOiAke0FWR30gIG1heDogJHtNQVh9KVwiLFxuICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5ULFxuICAgICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMubWV0cmljRGltZW5zaW9ucy56b25hbERpbWVuc2lvbnMoXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICAgKSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVBdmFpbGFiaWxpdHlNZXRyaWMoe1xuICAgICAgICAgICAgbWV0cmljRGV0YWlsczogb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBsYWJlbDogQXdzLlJFR0lPTiArIFwiIChhdmc6ICR7QVZHfSAgbWF4OiAke01BWH0pXCIsXG4gICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5ULFxuICAgICAgICAgICAgY29sb3I6IE1ldHJpY3NIZWxwZXIucmVnaW9uQ29sb3JcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMucmVnaW9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICkpXG4gICAgICAgIF0sXG4gICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICBsYWJlbDogJ0NvdW50JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICB9KSxcblxuICAgICAgLy8gQ2FuYXJ5IHJlcXVlc3QgY291bnRcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgIHRpdGxlOiAnUmVxdWVzdCBDb3VudCcsXG4gICAgICAgIHJlZ2lvbjogQXdzLlJFR0lPTixcbiAgICAgICAgbGVmdDogW1xuICAgICAgICAgIC4uLmF2YWlsYWJpbGl0eVpvbmVzLm1hcCgoYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBsZXQgYXpMZXR0ZXI6IHN0cmluZyA9IGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG4gICAgICAgICAgICByZXR1cm4gQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWMoe1xuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIiAoYXZnOiAke0FWR30gIG1heDogJHtNQVh9KVwiLFxuICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlJFUVVFU1RfQ09VTlQsXG4gICAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLmNvbG9yc1tpbmRleF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnpvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgICApKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZUF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgIGxhYmVsOiBBd3MuUkVHSU9OICsgXCIgKGF2ZzogJHtBVkd9ICBtYXg6ICR7TUFYfSlcIixcbiAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuUkVRVUVTVF9DT1VOVCxcbiAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLnJlZ2lvbkNvbG9yXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnJlZ2lvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgICAgIEF3cy5SRUdJT05cbiAgICAgICAgICApKVxuICAgICAgICBdLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBsYWJlbDogJ0NvdW50JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBsZXQgbGF0ZW5jeVdpZGdldHM6IElXaWRnZXRbXSA9IFtdO1xuXG4gICAgLy8gQ2FuYXJ5IGxhdGVuY3lcbiAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMuc3VjY2Vzc01ldHJpY05hbWVzLmZvckVhY2goKG1ldHJpY05hbWU6IHN0cmluZykgPT4ge1xuICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLmdyYXBoZWRTdWNjZXNzU3RhdGlzdGljcz8uZm9yRWFjaCgoc3RhdGlzdGljOiBzdHJpbmcpID0+IHtcblxuICAgICAgICBsYXRlbmN5V2lkZ2V0cy5wdXNoKFxuICAgICAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgICAgICBoZWlnaHQ6IDgsXG4gICAgICAgICAgICB3aWR0aDogNixcbiAgICAgICAgICAgIHRpdGxlOiBgJHttZXRyaWNOYW1lfSBMYXRlbmN5ICgke3N0YXRpc3RpY30pYCxcbiAgICAgICAgICAgIHJlZ2lvbjogQXdzLlJFR0lPTixcbiAgICAgICAgICAgIGxlZnQ6IFtcbiAgICAgICAgICAgICAgLi4uYXZhaWxhYmlsaXR5Wm9uZXMubWFwKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgYXpMZXR0ZXI6IHN0cmluZyA9IGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9uYWxMYXRlbmN5TWV0cmljcy5jcmVhdGVab25hbExhdGVuY3lNZXRyaWMoe1xuICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogbWV0cmljTmFtZSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIiAoYXZnOiAke0FWR30gIG1heDogJHtNQVh9KVwiLFxuICAgICAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgbWV0cmljVHlwZTogTGF0ZW5jeU1ldHJpY1R5cGUuU1VDQ0VTU19MQVRFTkNZLFxuICAgICAgICAgICAgICAgICAgc3RhdGlzdGljOiBzdGF0aXN0aWMsXG4gICAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVMYXRlbmN5TWV0cmljKHtcbiAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBtZXRyaWNOYW1lLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBBd3MuUkVHSU9OICsgXCIgKGF2ZzogJHtBVkd9ICBtYXg6ICR7TUFYfSlcIixcbiAgICAgICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgICAgbWV0cmljVHlwZTogTGF0ZW5jeU1ldHJpY1R5cGUuU1VDQ0VTU19MQVRFTkNZLFxuICAgICAgICAgICAgICAgIHN0YXRpc3RpYzogc3RhdGlzdGljLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLnJlZ2lvbkNvbG9yXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnJlZ2lvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgICAgIG1heDogTWV0cmljc0hlbHBlci5jb252ZXJ0RHVyYXRpb25CeVVuaXQob3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLnN1Y2Nlc3NBbGFybVRocmVzaG9sZCwgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLnVuaXQpICogMS41LFxuICAgICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICAgIGxhYmVsOiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMudW5pdCxcbiAgICAgICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWZ0QW5ub3RhdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBNZXRyaWNzSGVscGVyLmNvbnZlcnREdXJhdGlvbkJ5VW5pdChvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMuc3VjY2Vzc0FsYXJtVGhyZXNob2xkLCBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMudW5pdCksXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogQ29sb3IuUkVELFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnSGlnaCBTZXZlcml0eScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkYXNoYm9hcmQuYWRkV2lkZ2V0cyhcbiAgICAgIC4uLmxhdGVuY3lXaWRnZXRzLFxuXG4gICAgICAvLyBDYW5hcnkgaGlnaC1sYXRlbmN5IHJlcXVlc3QgY291bnRcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgIHRpdGxlOiAnSGlnaCBMYXRlbmN5IFJlcXVlc3QgQ291bnQnLFxuICAgICAgICBsZWZ0OiBbXG4gICAgICAgICAgLi4uYXZhaWxhYmlsaXR5Wm9uZXMubWFwKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IHByb3BzLmF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIFpvbmFsTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxDb3VudExhdGVuY3lNZXRyaWMoe1xuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCIgKGF2ZzogJHtBVkd9ICBtYXg6ICR7TUFYfSlcIixcbiAgICAgICAgICAgICAgbWV0cmljVHlwZTogTGF0ZW5jeU1ldHJpY1R5cGUuU1VDQ0VTU19MQVRFTkNZLFxuICAgICAgICAgICAgICBzdGF0aXN0aWM6IGBUQygke01ldHJpY3NIZWxwZXIuY29udmVydER1cmF0aW9uQnlVbml0KG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscy5zdWNjZXNzQWxhcm1UaHJlc2hvbGQsIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscy51bml0KX06KWAsXG4gICAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLmNvbG9yc1tpbmRleF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSksXG4gICAgICAgICAgQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlTGF0ZW5jeUNvdW50TWV0cmljKHtcbiAgICAgICAgICAgIGxhYmVsOiBBd3MuUkVHSU9OICsgXCIgKGF2ZzogJHtBVkd9ICBtYXg6ICR7TUFYfSlcIiwgXG4gICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBtZXRyaWNUeXBlOiBMYXRlbmN5TWV0cmljVHlwZS5TVUNDRVNTX0xBVEVOQ1ksXG4gICAgICAgICAgICBzdGF0aXN0aWM6IGBUQygke01ldHJpY3NIZWxwZXIuY29udmVydER1cmF0aW9uQnlVbml0KG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscy5zdWNjZXNzQWxhcm1UaHJlc2hvbGQsIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscy51bml0KX06KWAsXG4gICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5yZWdpb25Db2xvclxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMucmVnaW9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICkpXG4gICAgICAgIF0sXG4gICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgIGxhYmVsOiAnQ291bnQnLFxuICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgZGFzaGJvYXJkLmFkZFdpZGdldHMoXG4gICAgICBuZXcgVGV4dFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogMSxcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICBtYXJrZG93bjogXCIjIyMgQWxhcm1zXCIsXG4gICAgICAgIGJhY2tncm91bmQ6IFRleHRXaWRnZXRCYWNrZ3JvdW5kLlRSQU5TUEFSRU5UXG4gICAgICB9KSxcbiAgICAgIG5ldyBBbGFybVdpZGdldCh7XG4gICAgICAgIGFsYXJtOiBwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5jYW5hcnlSZWdpb25hbEFsYXJtc0FuZFJ1bGVzIS5hdmFpbGFiaWxpdHlBbGFybSxcbiAgICAgICAgdGl0bGU6IFwiUmVnaW9uYWwgQXZhaWxhYmlsaXR5XCIsXG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDEyXG4gICAgICB9KSxcbiAgICAgIG5ldyBBbGFybVdpZGdldCh7XG4gICAgICAgIGFsYXJtOiBwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5jYW5hcnlSZWdpb25hbEFsYXJtc0FuZFJ1bGVzIS5sYXRlbmN5QWxhcm0sXG4gICAgICAgIHRpdGxlOiBcIlJlZ2lvbmFsIExhdGVuY3lcIixcbiAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICB3aWR0aDogMTJcbiAgICAgIH0pLFxuICAgICAgLi4uT2JqZWN0LmtleXMocHJvcHMub3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMuY2FuYXJ5Wm9uYWxBbGFybXNBbmRSdWxlcyEpLm1hcCgoYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIG5ldyBBbGFybVdpZGdldCh7XG4gICAgICAgICAgYWxhcm06IHByb3BzLm9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzLmNhbmFyeVpvbmFsQWxhcm1zQW5kUnVsZXMhW2F2YWlsYWJpbGl0eVpvbmVdLmF2YWlsYWJpbGl0eUFsYXJtLFxuICAgICAgICAgIHRpdGxlOiBgJHthdmFpbGFiaWxpdHlab25lSWR9IEF2YWlsYWJpbGl0eWAsXG4gICAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICAgIHdpZHRoOiA4XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICAuLi5PYmplY3Qua2V5cyhwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5jYW5hcnlab25hbEFsYXJtc0FuZFJ1bGVzISkubWFwKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG4gIFxuICAgICAgICByZXR1cm4gbmV3IEFsYXJtV2lkZ2V0KHtcbiAgICAgICAgICBhbGFybTogcHJvcHMub3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMuY2FuYXJ5Wm9uYWxBbGFybXNBbmRSdWxlcyFbYXZhaWxhYmlsaXR5Wm9uZV0ubGF0ZW5jeUFsYXJtLFxuICAgICAgICAgIHRpdGxlOiBgJHthdmFpbGFiaWxpdHlab25lSWR9IExhdGVuY3lgLFxuICAgICAgICAgIGhlaWdodDogMixcbiAgICAgICAgICB3aWR0aDogOFxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW9uIGxldmVsIGRhc2hib2FyZFxuICAgKi9cbiAgZGFzaGJvYXJkOiBEYXNoYm9hcmQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmRhc2hib2FyZCA9IG5ldyBEYXNoYm9hcmQodGhpcywgJ0Rhc2hib2FyZCcsIHtcbiAgICAgIGRhc2hib2FyZE5hbWU6XG4gICAgICAgIHByb3BzLm9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzLm9wZXJhdGlvbi5zZXJ2aWNlLnNlcnZpY2VOYW1lLnRvTG93ZXJDYXNlKCkgK1xuICAgICAgICAnLScgK1xuICAgICAgICBwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5vcGVyYXRpb24ub3BlcmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpICtcbiAgICAgICAgYC1hdmFpbGFiaWxpdHktYW5kLWxhdGVuY3ktJHtBd3MuUkVHSU9OfWAsXG4gICAgICBkZWZhdWx0SW50ZXJ2YWw6IHByb3BzLmludGVydmFsLFxuICAgICAgcGVyaW9kT3ZlcnJpZGU6IFBlcmlvZE92ZXJyaWRlLkFVVE9cbiAgICB9KTtcblxuICAgIHRoaXMuZGFzaGJvYXJkLmFkZFdpZGdldHMoXG4gICAgICBuZXcgQWxhcm1TdGF0dXNXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgYWxhcm1zOiBbXG4gICAgICAgICAgcHJvcHMub3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMucmVnaW9uYWxJbXBhY3RBbGFybSxcbiAgICAgICAgICAuLi5PYmplY3QudmFsdWVzKHByb3BzLm9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzLmFnZ3JlZ2F0ZVpvbmFsQWxhcm1zKVxuICAgICAgICBdLFxuICAgICAgICB0aXRsZTogXCJBZ2dyZWdhdGUgQWxhcm1zXCJcbiAgICAgIH1cbiAgICApKTtcblxuICAgIE9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQuY3JlYXRlU2VydmVyU2lkZVdpZGdldHModGhpcy5kYXNoYm9hcmQsIHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5vcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscykge1xuICAgICAgT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5jcmVhdGVDYW5hcnlXaWRnZXRzKHRoaXMuZGFzaGJvYXJkLCBwcm9wcyk7XG4gICAgfVxuICB9XG59Il19
|