@liflig/cdk 2.7.0 → 2.8.1

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.
@@ -0,0 +1,125 @@
1
+ import * as constructs from "constructs";
2
+ import * as cdk from "aws-cdk-lib";
3
+ import * as cloudwatch from "aws-cdk-lib/aws-cloudwatch";
4
+ import * as ec2 from "aws-cdk-lib/aws-ec2";
5
+ export interface DatabaseAlarmsProps {
6
+ /**
7
+ * The default action to use for CloudWatch alarm state changes
8
+ */
9
+ action: cloudwatch.IAlarmAction;
10
+ instanceIdentifier: string;
11
+ instanceType: ec2.InstanceType;
12
+ allocatedStorage: cdk.Size;
13
+ }
14
+ export declare class DatabaseAlarms extends constructs.Construct {
15
+ private readonly action;
16
+ private readonly databaseInstanceIdentifier;
17
+ private readonly instanceType;
18
+ private readonly allocatedStorage;
19
+ constructor(scope: constructs.Construct, id: string, props: DatabaseAlarmsProps);
20
+ /**
21
+ * Sets up a CloudWatch Alarm that triggers if the CPU credit balance for
22
+ * a burstable instance breach a certain threshold.
23
+ *
24
+ * NOTE: This alarm is only applicable for burstable instances, and a balance of 0 credits will only have performance
25
+ * implications for T2 instances. T3 and T4g instances will instead cost more for prolonged high CPU utilization after
26
+ * the balance is depleted.
27
+ */
28
+ addCpuCreditsAlarm(
29
+ /**
30
+ * Configuration for an alarm.
31
+ *
32
+ * @default Configured with sane defaults.
33
+ */
34
+ props?: {
35
+ /**
36
+ * An action to use for CloudWatch alarm state changes instead of the default action
37
+ */
38
+ action?: cloudwatch.IAlarmAction;
39
+ /**
40
+ * The CloudWatch Alarm will change its state to ALARM if the number of CPU credits drops below this threshold.
41
+ *
42
+ * See https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-credits-baseline-concepts.html#earning-CPU-credits for an overview of maximum CPU credits for various instance types.
43
+ *
44
+ * @default 10% of the maximum earned CPU credits for the instance type.
45
+ */
46
+ threshold?: number;
47
+ }): void;
48
+ /**
49
+ * Sets up two CloudWatch Alarms for monitoring disk storage space:
50
+ * 1) one that triggers if the available disk storage space is low.
51
+ * 2) one that triggers if the available disk storage space is critcally low.
52
+ *
53
+ * You may want to use different alarm actions for the two alarms, e.g., one can be
54
+ * categorized as a "warning", while the other one can be considered an "alarm".
55
+ */
56
+ addStorageSpaceAlarms(props?: {
57
+ /**
58
+ * Configuration for an alarm.
59
+ *
60
+ * @default Configured with sane defaults.
61
+ */
62
+ lowStorageSpaceAlarm?: {
63
+ /**
64
+ * @default true
65
+ */
66
+ enabled?: boolean;
67
+ /**
68
+ * An action to use for CloudWatch alarm state changes instead of the default action
69
+ */
70
+ action?: cloudwatch.IAlarmAction;
71
+ /**
72
+ * @default 25% of the allocated storage.
73
+ */
74
+ threshold?: cdk.Size;
75
+ };
76
+ /**
77
+ * Configuration for an alarm.
78
+ *
79
+ * @default Configured with sane defaults.
80
+ */
81
+ criticallyLowStorageSpaceAlarm?: {
82
+ /**
83
+ * @default true
84
+ */
85
+ enabled?: boolean;
86
+ /**
87
+ * An action to use for CloudWatch alarm state changes instead of the default action
88
+ */
89
+ action?: cloudwatch.IAlarmAction;
90
+ /**
91
+ * @default 5% of the allocated storage.
92
+ */
93
+ threshold?: cdk.Size;
94
+ };
95
+ }): void;
96
+ /**
97
+ * Sets up a CloudWatch Alarm that triggers if the average CPU utilization for
98
+ * the RDS instance exceeds a given threshold.
99
+ */
100
+ addCpuUtilizationAlarm(
101
+ /**
102
+ * Configuration for an alarm.
103
+ *
104
+ * @default Configured with sane defaults.
105
+ */
106
+ props?: {
107
+ /**
108
+ * An action to use for CloudWatch alarm state changes instead of the default action
109
+ */
110
+ action?: cloudwatch.IAlarmAction;
111
+ /**
112
+ * The threshold defined as a percentage that determines if CPU utilization should trigger an alarm or not.
113
+ * @default 80
114
+ */
115
+ threshold?: number;
116
+ /**
117
+ * @default 5
118
+ */
119
+ evaluationPeriods?: number;
120
+ /**
121
+ * @default 2 minutes
122
+ */
123
+ period?: cdk.Duration;
124
+ }): void;
125
+ }
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DatabaseAlarms = void 0;
4
+ const constructs = require("constructs");
5
+ const cdk = require("aws-cdk-lib");
6
+ const cloudwatch = require("aws-cdk-lib/aws-cloudwatch");
7
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
8
+ // Based on https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-credits-baseline-concepts.html#earning-CPU-credits
9
+ const cpuCreditBalanceByInstanceType = {
10
+ "t2.nano": 72,
11
+ "t2.micro": 144,
12
+ "t2.small": 288,
13
+ "t2.medium": 576,
14
+ "t2.large": 864,
15
+ "t2.xlarge": 1296,
16
+ "t2.2xlarge": 1958.4,
17
+ "t3.nano": 144,
18
+ "t3.micro": 288,
19
+ "t3.small": 576,
20
+ "t3.medium": 576,
21
+ "t3.large": 864,
22
+ "t3.xlarge": 2304,
23
+ "t3.2xlarge": 4608,
24
+ "t3a.nano": 144,
25
+ "t3a.micro": 288,
26
+ "t3a.small": 576,
27
+ "t3a.medium": 576,
28
+ "t3a.large": 864,
29
+ "t3a.xlarge": 2304,
30
+ "t3a.2xlarge": 4608,
31
+ "t4g.nano": 144,
32
+ "t4g.micro": 288,
33
+ "t4g.small": 576,
34
+ "t4g.medium": 576,
35
+ "t4g.large": 864,
36
+ "t4g.xlarge": 2304,
37
+ "t4g.2xlarge": 4608,
38
+ };
39
+ class DatabaseAlarms extends constructs.Construct {
40
+ constructor(scope, id, props) {
41
+ super(scope, id);
42
+ this.action = props.action;
43
+ this.databaseInstanceIdentifier = props.instanceIdentifier;
44
+ this.instanceType = props.instanceType;
45
+ this.allocatedStorage = props.allocatedStorage;
46
+ }
47
+ /**
48
+ * Sets up a CloudWatch Alarm that triggers if the CPU credit balance for
49
+ * a burstable instance breach a certain threshold.
50
+ *
51
+ * NOTE: This alarm is only applicable for burstable instances, and a balance of 0 credits will only have performance
52
+ * implications for T2 instances. T3 and T4g instances will instead cost more for prolonged high CPU utilization after
53
+ * the balance is depleted.
54
+ */
55
+ addCpuCreditsAlarm(
56
+ /**
57
+ * Configuration for an alarm.
58
+ *
59
+ * @default Configured with sane defaults.
60
+ */
61
+ props) {
62
+ var _a;
63
+ if (!["t2.", "t3.", "t4g."].some((s) => this.instanceType.toString().startsWith(s))) {
64
+ throw new Error("CPU credits are only relevant for burstable instance types.");
65
+ }
66
+ const defaultThreshold = cpuCreditBalanceByInstanceType[this.instanceType.toString()] * 0.1;
67
+ const threshold = (_a = props === null || props === void 0 ? void 0 : props.threshold) !== null && _a !== void 0 ? _a : defaultThreshold;
68
+ if (!threshold) {
69
+ throw new Error(`No threshold supplied, and unable to determine a default value for instance type '${this.instanceType.toString()}'`);
70
+ }
71
+ new cloudwatch.Metric({
72
+ metricName: "CPUCreditBalance",
73
+ namespace: "AWS/RDS",
74
+ statistic: "Minimum",
75
+ unit: aws_cloudwatch_1.Unit.COUNT,
76
+ period: cdk.Duration.minutes(5),
77
+ dimensionsMap: {
78
+ DBInstanceIdentifier: this.databaseInstanceIdentifier,
79
+ },
80
+ })
81
+ .createAlarm(this, "CreditsAlarm", {
82
+ alarmDescription: `Less than ${threshold} CPU credits remaining for RDS database '${this.databaseInstanceIdentifier}'. ${this.instanceType.toString().startsWith("t2.")
83
+ ? "If this reaches 0, the instance will be limited to a baseline CPU utilization."
84
+ : "If the balance is depleted, AWS adds additional charges."}.`,
85
+ comparisonOperator: cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD,
86
+ evaluationPeriods: 1,
87
+ threshold: threshold,
88
+ treatMissingData: cloudwatch.TreatMissingData.IGNORE,
89
+ })
90
+ .addAlarmAction(this.action);
91
+ }
92
+ /**
93
+ * Sets up two CloudWatch Alarms for monitoring disk storage space:
94
+ * 1) one that triggers if the available disk storage space is low.
95
+ * 2) one that triggers if the available disk storage space is critcally low.
96
+ *
97
+ * You may want to use different alarm actions for the two alarms, e.g., one can be
98
+ * categorized as a "warning", while the other one can be considered an "alarm".
99
+ */
100
+ addStorageSpaceAlarms(props) {
101
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
102
+ const lowStorageSpaceAlarm = new cloudwatch.Metric({
103
+ metricName: "FreeStorageSpace",
104
+ namespace: "AWS/RDS",
105
+ statistic: "Minimum",
106
+ unit: aws_cloudwatch_1.Unit.GIGABYTES,
107
+ period: cdk.Duration.minutes(5),
108
+ dimensionsMap: {
109
+ DBInstanceIdentifier: this.databaseInstanceIdentifier,
110
+ },
111
+ }).createAlarm(this, "LowStorageSpaceAlarm", {
112
+ alarmDescription: `Low storage space available on RDS database '${this.databaseInstanceIdentifier}'.`,
113
+ comparisonOperator: cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD,
114
+ evaluationPeriods: 1,
115
+ threshold: (_c = (_b = (_a = props === null || props === void 0 ? void 0 : props.lowStorageSpaceAlarm) === null || _a === void 0 ? void 0 : _a.threshold) === null || _b === void 0 ? void 0 : _b.toGibibytes()) !== null && _c !== void 0 ? _c : this.allocatedStorage.toGibibytes() * 0.25,
116
+ treatMissingData: cloudwatch.TreatMissingData.IGNORE,
117
+ });
118
+ if ((_e = (_d = props === null || props === void 0 ? void 0 : props.lowStorageSpaceAlarm) === null || _d === void 0 ? void 0 : _d.enabled) !== null && _e !== void 0 ? _e : true) {
119
+ lowStorageSpaceAlarm.addAlarmAction(((_f = props === null || props === void 0 ? void 0 : props.lowStorageSpaceAlarm) === null || _f === void 0 ? void 0 : _f.action) || this.action);
120
+ lowStorageSpaceAlarm.addOkAction(((_g = props === null || props === void 0 ? void 0 : props.lowStorageSpaceAlarm) === null || _g === void 0 ? void 0 : _g.action) || this.action);
121
+ }
122
+ const criticallyLowStorageSpaceAlarm = new cloudwatch.Metric({
123
+ metricName: "FreeStorageSpace",
124
+ namespace: "AWS/RDS",
125
+ statistic: "Minimum",
126
+ unit: aws_cloudwatch_1.Unit.GIGABYTES,
127
+ period: cdk.Duration.minutes(5),
128
+ dimensionsMap: {
129
+ DBInstanceIdentifier: this.databaseInstanceIdentifier,
130
+ },
131
+ }).createAlarm(this, "CriticallyLowStorageSpaceAlarm", {
132
+ alarmDescription: `Critically low storage space available on RDS database '${this.databaseInstanceIdentifier}'.`,
133
+ comparisonOperator: cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD,
134
+ evaluationPeriods: 1,
135
+ threshold: (_k = (_j = (_h = props === null || props === void 0 ? void 0 : props.criticallyLowStorageSpaceAlarm) === null || _h === void 0 ? void 0 : _h.threshold) === null || _j === void 0 ? void 0 : _j.toGibibytes()) !== null && _k !== void 0 ? _k : this.allocatedStorage.toGibibytes() * 0.05,
136
+ treatMissingData: cloudwatch.TreatMissingData.IGNORE,
137
+ });
138
+ if ((_m = (_l = props === null || props === void 0 ? void 0 : props.criticallyLowStorageSpaceAlarm) === null || _l === void 0 ? void 0 : _l.enabled) !== null && _m !== void 0 ? _m : true) {
139
+ criticallyLowStorageSpaceAlarm.addAlarmAction(((_o = props === null || props === void 0 ? void 0 : props.criticallyLowStorageSpaceAlarm) === null || _o === void 0 ? void 0 : _o.action) || this.action);
140
+ criticallyLowStorageSpaceAlarm.addOkAction(((_p = props === null || props === void 0 ? void 0 : props.criticallyLowStorageSpaceAlarm) === null || _p === void 0 ? void 0 : _p.action) || this.action);
141
+ }
142
+ }
143
+ /**
144
+ * Sets up a CloudWatch Alarm that triggers if the average CPU utilization for
145
+ * the RDS instance exceeds a given threshold.
146
+ */
147
+ addCpuUtilizationAlarm(
148
+ /**
149
+ * Configuration for an alarm.
150
+ *
151
+ * @default Configured with sane defaults.
152
+ */
153
+ props) {
154
+ var _a, _b, _c, _d, _e;
155
+ const alarm = new cloudwatch.Metric({
156
+ metricName: "CPUUtilization",
157
+ namespace: "AWS/RDS",
158
+ statistic: "Average",
159
+ period: (_a = props === null || props === void 0 ? void 0 : props.period) !== null && _a !== void 0 ? _a : cdk.Duration.minutes(2),
160
+ dimensionsMap: {
161
+ DBInstanceIdentifier: this.databaseInstanceIdentifier,
162
+ },
163
+ }).createAlarm(this, "CpuUtilizationAlarm", {
164
+ alarmDescription: `RDS database '${this.databaseInstanceIdentifier}' has a higher than expected CPU utilization.`,
165
+ comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
166
+ evaluationPeriods: (_b = props === null || props === void 0 ? void 0 : props.evaluationPeriods) !== null && _b !== void 0 ? _b : 5,
167
+ threshold: (_c = props === null || props === void 0 ? void 0 : props.threshold) !== null && _c !== void 0 ? _c : 80,
168
+ treatMissingData: cloudwatch.TreatMissingData.IGNORE,
169
+ });
170
+ alarm.addAlarmAction((_d = props === null || props === void 0 ? void 0 : props.action) !== null && _d !== void 0 ? _d : this.action);
171
+ alarm.addOkAction((_e = props === null || props === void 0 ? void 0 : props.action) !== null && _e !== void 0 ? _e : this.action);
172
+ }
173
+ }
174
+ exports.DatabaseAlarms = DatabaseAlarms;
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UtYWxhcm1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FsYXJtcy9kYXRhYmFzZS1hbGFybXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXdDO0FBQ3hDLG1DQUFrQztBQUNsQyx5REFBd0Q7QUFFeEQsK0RBQWlEO0FBWWpELDRIQUE0SDtBQUM1SCxNQUFNLDhCQUE4QixHQUVoQztJQUNGLFNBQVMsRUFBRSxFQUFFO0lBQ2IsVUFBVSxFQUFFLEdBQUc7SUFDZixVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLElBQUk7SUFDakIsWUFBWSxFQUFFLE1BQU07SUFDcEIsU0FBUyxFQUFFLEdBQUc7SUFDZCxVQUFVLEVBQUUsR0FBRztJQUNmLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEdBQUc7SUFDaEIsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixZQUFZLEVBQUUsSUFBSTtJQUNsQixVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLFlBQVksRUFBRSxHQUFHO0lBQ2pCLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLFlBQVksRUFBRSxJQUFJO0lBQ2xCLGFBQWEsRUFBRSxJQUFJO0lBQ25CLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEdBQUc7SUFDaEIsV0FBVyxFQUFFLEdBQUc7SUFDaEIsWUFBWSxFQUFFLEdBQUc7SUFDakIsV0FBVyxFQUFFLEdBQUc7SUFDaEIsWUFBWSxFQUFFLElBQUk7SUFDbEIsYUFBYSxFQUFFLElBQUk7Q0FDcEIsQ0FBQTtBQUVELE1BQWEsY0FBZSxTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBTXRELFlBQ0UsS0FBMkIsRUFDM0IsRUFBVSxFQUNWLEtBQTBCO1FBRTFCLEtBQUssQ0FBQyxL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LENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNoRCxhQUFhLEVBQUU7Z0JBQ2Isb0JBQW9CLEVBQUUsSUFBSSxDQUFDLDBCQUEwQjthQUN0RDtTQUNGLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO1lBQzFDLGdCQUFnQixFQUFFLGlCQUFpQixJQUFJLENBQUMsMEJBQTBCLCtDQUErQztZQUNqSCxrQkFBa0IsRUFBRSxVQUFVLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCO1lBQ3hFLGlCQUFpQixFQUFFLE1BQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLGlCQUFpQixtQ0FBSSxDQUFDO1lBQ2hELFNBQVMsRUFBRSxNQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxTQUFTLG1DQUFJLEVBQUU7WUFDakMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixDQUFDLE1BQU07U0FDckQsQ0FBQyxDQUFBO1FBQ0YsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxNQUFNLG1DQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNsRCxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLE1BQU0sbUNBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ2pELENBQUM7Q0FDRjtBQW5QRCx3Q0FtUEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0ICogYXMgY2xvdWR3YXRjaCBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIlxuaW1wb3J0ICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCJcbmltcG9ydCB7IFVuaXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIlxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlQWxhcm1zUHJvcHMge1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgYWN0aW9uIHRvIHVzZSBmb3IgQ2xvdWRXYXRjaCBhbGFybSBzdGF0ZSBjaGFuZ2VzXG4gICAqL1xuICBhY3Rpb246IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uXG4gIGluc3RhbmNlSWRlbnRpZmllcjogc3RyaW5nXG4gIGluc3RhbmNlVHlwZTogZWMyLkluc3RhbmNlVHlwZVxuICBhbGxvY2F0ZWRTdG9yYWdlOiBjZGsuU2l6ZVxufVxuXG4vLyBCYXNlZCBvbiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvYnVyc3RhYmxlLWNyZWRpdHMtYmFzZWxpbmUtY29uY2VwdHMuaHRtbCNlYXJuaW5nLUNQVS1jcmVkaXRzXG5jb25zdCBjcHVDcmVkaXRCYWxhbmNlQnlJbnN0YW5jZVR5cGU6IHtcbiAgW2luc3RhbmNlVHlwZTogc3RyaW5nXTogbnVtYmVyXG59ID0ge1xuICBcInQyLm5hbm9cIjogNzIsXG4gIFwidDIubWljcm9cIjogMTQ0LFxuICBcInQyLnNtYWxsXCI6IDI4OCxcbiAgXCJ0Mi5tZWRpdW1cIjogNTc2LFxuICBcInQyLmxhcmdlXCI6IDg2NCxcbiAgXCJ0Mi54bGFyZ2VcIjogMTI5NixcbiAgXCJ0Mi4yeGxhcmdlXCI6IDE5NTguNCxcbiAgXCJ0My5uYW5vXCI6IDE0NCxcbiAgXCJ0My5taWNyb1wiOiAyODgsXG4gIFwidDMuc21hbGxcIjogNTc2LFxuICBcInQzLm1lZGl1bVwiOiA1NzYsXG4gIFwidDMubGFyZ2VcIjogODY0LFxuICBcInQzLnhsYXJnZVwiOiAyMzA0LFxuICBcInQzLjJ4bGFyZ2VcIjogNDYwOCxcbiAgXCJ0M2EubmFub1wiOiAxNDQsXG4gIFwidDNhLm1pY3JvXCI6IDI4OCxcbiAgXCJ0M2Euc21hbGxcIjogNTc2LFxuICBcInQzYS5tZWRpdW1cIjogNTc2LFxuICBcInQzYS5sYXJnZVwiOiA4NjQsXG4gIFwidDNhLnhsYXJnZVwiOiAyMzA0LFxuICBcInQzYS4yeGxhcmdlXCI6IDQ2MDgsXG4gIFwidDRnLm5hbm9cIjogMTQ0LFxuICBcInQ0Zy5taWNyb1wiOiAyODgsXG4gIFwidDRnLnNtYWxsXCI6IDU3NixcbiAgXCJ0NGcubWVkaXVtXCI6IDU3NixcbiAgXCJ0NGcubGFyZ2VcIjogODY0LFxuICBcInQ0Zy54bGFyZ2VcIjogMjMwNCxcbiAgXCJ0NGcuMnhsYXJnZVwiOiA0NjA4LFxufVxuXG5leHBvcnQgY2xhc3MgRGF0YWJhc2VBbGFybXMgZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aW9uOiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFiYXNlSW5zdGFuY2VJZGVudGlmaWVyOiBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZVR5cGU6IGVjMi5JbnN0YW5jZVR5cGVcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvY2F0ZWRTdG9yYWdlOiBjZGsuU2l6ZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBEYXRhYmFzZUFsYXJtc1Byb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLmFjdGlvbiA9IHByb3BzLmFjdGlvblxuICAgIHRoaXMuZGF0YWJhc2VJbnN0YW5jZUlkZW50aWZpZXIgPSBwcm9wcy5pbnN0YW5jZUlkZW50aWZpZXJcbiAgICB0aGlzLmluc3RhbmNlVHlwZSA9IHByb3BzLmluc3RhbmNlVHlwZVxuICAgIHRoaXMuYWxsb2NhdGVkU3RvcmFnZSA9IHByb3BzLmFsbG9jYXRlZFN0b3JhZ2VcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIGEgQ2xvdWRXYXRjaCBBbGFybSB0aGF0IHRyaWdnZXJzIGlmIHRoZSBDUFUgY3JlZGl0IGJhbGFuY2UgZm9yXG4gICAqIGEgYnVyc3RhYmxlIGluc3RhbmNlIGJyZWFjaCBhIGNlcnRhaW4gdGhyZXNob2xkLlxuICAgKlxuICAgKiBOT1RFOiBUaGlzIGFsYXJtIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgYnVyc3RhYmxlIGluc3RhbmNlcywgYW5kIGEgYmFsYW5jZSBvZiAwIGNyZWRpdHMgd2lsbCBvbmx5IGhhdmUgcGVyZm9ybWFuY2VcbiAgICogaW1wbGljYXRpb25zIGZvciBUMiBpbnN0YW5jZXMuIFQzIGFuZCBUNGcgaW5zdGFuY2VzIHdpbGwgaW5zdGVhZCBjb3N0IG1vcmUgZm9yIHByb2xvbmdlZCBoaWdoIENQVSB1dGlsaXphdGlvbiBhZnRlclxuICAgKiB0aGUgYmFsYW5jZSBpcyBkZXBsZXRlZC5cbiAgICovXG4gIGFkZENwdUNyZWRpdHNBbGFybShcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIGZvciBhbiBhbGFybS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IENvbmZpZ3VyZWQgd2l0aCBzYW5lIGRlZmF1bHRzLlxuICAgICAqL1xuICAgIHByb3BzPzoge1xuICAgICAgLyoqXG4gICAgICAgKiBBbiBhY3Rpb24gdG8gdXNlIGZvciBDbG91ZFdhdGNoIGFsYXJtIHN0YXRlIGNoYW5nZXMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBhY3Rpb25cbiAgICAgICAqL1xuICAgICAgYWN0aW9uPzogY2xvdWR3YXRjaC5JQWxhcm1BY3Rpb25cbiAgICAgIC8qKlxuICAgICAgICogVGhlIENsb3VkV2F0Y2ggQWxhcm0gd2lsbCBjaGFuZ2UgaXRzIHN0YXRlIHRvIEFMQVJNIGlmIHRoZSBudW1iZXIgb2YgQ1BVIGNyZWRpdHMgZHJvcHMgYmVsb3cgdGhpcyB0aHJlc2hvbGQuXG4gICAgICAgKlxuICAgICAgICogU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9idXJzdGFibGUtY3JlZGl0cy1iYXNlbGluZS1jb25jZXB0cy5odG1sI2Vhcm5pbmctQ1BVLWNyZWRpdHMgZm9yIGFuIG92ZXJ2aWV3IG9mIG1heGltdW0gQ1BVIGNyZWRpdHMgZm9yIHZhcmlvdXMgaW5zdGFuY2UgdHlwZXMuXG4gICAgICAgKlxuICAgICAgICogQGRlZmF1bHQgMTAlIG9mIHRoZSBtYXhpbXVtIGVhcm5lZCBDUFUgY3JlZGl0cyBmb3IgdGhlIGluc3RhbmNlIHR5cGUuXG4gICAgICAgKi9cbiAgICAgIHRocmVzaG9sZD86IG51bWJlclxuICAgIH0sXG4gICk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICFbXCJ0Mi5cIiwgXCJ0My5cIiwgXCJ0NGcuXCJdLnNvbWUoKHMpID0+XG4gICAgICAgIHRoaXMuaW5zdGFuY2VUeXBlLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChzKSxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDUFUgY3JlZGl0cyBhcmUgb25seSByZWxldmFudCBmb3IgYnVyc3RhYmxlIGluc3RhbmNlIHR5cGVzLlwiLFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRUaHJlc2hvbGQgPVxuICAgICAgY3B1Q3JlZGl0QmFsYW5jZUJ5SW5zdGFuY2VUeXBlW3RoaXMuaW5zdGFuY2VUeXBlLnRvU3RyaW5nKCldICogMC4xXG4gICAgY29uc3QgdGhyZXNob2xkID0gcHJvcHM/LnRocmVzaG9sZCA/PyBkZWZhdWx0VGhyZXNob2xkXG4gICAgaWYgKCF0aHJlc2hvbGQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vIHRocmVzaG9sZCBzdXBwbGllZCwgYW5kIHVuYWJsZSB0byBkZXRlcm1pbmUgYSBkZWZhdWx0IHZhbHVlIGZvciBpbnN0YW5jZSB0eXBlICcke3RoaXMuaW5zdGFuY2VUeXBlLnRvU3RyaW5nKCl9J2AsXG4gICAgICApXG4gICAgfVxuICAgIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lOiBcIkNQVUNyZWRpdEJhbGFuY2VcIixcbiAgICAgIG5hbWVzcGFjZTogXCJBV1MvUkRTXCIsXG4gICAgICBzdGF0aXN0aWM6IFwiTWluaW11bVwiLFxuICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgIHBlcmlvZDogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIERCSW5zdGFuY2VJZGVudGlmaWVyOiB0aGlzLmRhdGFiYXNlSW5zdGFuY2VJZGVudGlmaWVyLFxuICAgICAgfSxcbiAgICB9KVxuICAgICAgLmNyZWF0ZUFsYXJtKHRoaXMsIFwiQ3JlZGl0c0FsYXJtXCIsIHtcbiAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYExlc3MgdGhhbiAke3RocmVzaG9sZH0gQ1BVIGNyZWRpdHMgcmVtYWluaW5nIGZvciBSRFMgZGF0YWJhc2UgJyR7XG4gICAgICAgICAgdGhpcy5kYXRhYmFzZUluc3RhbmNlSWRlbnRpZmllclxuICAgICAgICB9Jy4gJHtcbiAgICAgICAgICB0aGlzLmluc3RhbmNlVHlwZS50b1N0cmluZygpLnN0YXJ0c1dpdGgoXCJ0Mi5cIilcbiAgICAgICAgICAgID8gXCJJZiB0aGlzIHJlYWNoZXMgMCwgdGhlIGluc3RhbmNlIHdpbGwgYmUgbGltaXRlZCB0byBhIGJhc2VsaW5lIENQVSB1dGlsaXphdGlvbi5cIlxuICAgICAgICAgICAgOiBcIklmIHRoZSBiYWxhbmNlIGlzIGRlcGxldGVkLCBBV1MgYWRkcyBhZGRpdGlvbmFsIGNoYXJnZXMuXCJcbiAgICAgICAgfS5gLFxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkxFU1NfVEhBTl9USFJFU0hPTEQsXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgICAgICB0aHJlc2hvbGQ6IHRocmVzaG9sZCxcbiAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLklHTk9SRSxcbiAgICAgIH0pXG4gICAgICAuYWRkQWxhcm1BY3Rpb24odGhpcy5hY3Rpb24pXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0d28gQ2xvdWRXYXRjaCBBbGFybXMgZm9yIG1vbml0b3JpbmcgZGlzayBzdG9yYWdlIHNwYWNlOlxuICAgKiAxKSBvbmUgdGhhdCB0cmlnZ2VycyBpZiB0aGUgYXZhaWxhYmxlIGRpc2sgc3RvcmFnZSBzcGFjZSBpcyBsb3cuXG4gICAqIDIpIG9uZSB0aGF0IHRyaWdnZXJzIGlmIHRoZSBhdmFpbGFibGUgZGlzayBzdG9yYWdlIHNwYWNlIGlzIGNyaXRjYWxseSBsb3cuXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byB1c2UgZGlmZmVyZW50IGFsYXJtIGFjdGlvbnMgZm9yIHRoZSB0d28gYWxhcm1zLCBlLmcuLCBvbmUgY2FuIGJlXG4gICAqIGNhdGVnb3JpemVkIGFzIGEgXCJ3YXJuaW5nXCIsIHdoaWxlIHRoZSBvdGhlciBvbmUgY2FuIGJlIGNvbnNpZGVyZWQgYW4gXCJhbGFybVwiLlxuICAgKi9cbiAgYWRkU3RvcmFnZVNwYWNlQWxhcm1zKHByb3BzPzoge1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gZm9yIGFuIGFsYXJtLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgQ29uZmlndXJlZCB3aXRoIHNhbmUgZGVmYXVsdHMuXG4gICAgICovXG4gICAgbG93U3RvcmFnZVNwYWNlQWxhcm0/OiB7XG4gICAgICAvKipcbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgZW5hYmxlZD86IGJvb2xlYW5cbiAgICAgIC8qKlxuICAgICAgICogQW4gYWN0aW9uIHRvIHVzZSBmb3IgQ2xvdWRXYXRjaCBhbGFybSBzdGF0ZSBjaGFuZ2VzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgYWN0aW9uXG4gICAgICAgKi9cbiAgICAgIGFjdGlvbj86IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uXG4gICAgICAvKipcbiAgICAgICAqIEBkZWZhdWx0IDI1JSBvZiB0aGUgYWxsb2NhdGVkIHN0b3JhZ2UuXG4gICAgICAgKi9cbiAgICAgIHRocmVzaG9sZD86IGNkay5TaXplXG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gZm9yIGFuIGFsYXJtLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgQ29uZmlndXJlZCB3aXRoIHNhbmUgZGVmYXVsdHMuXG4gICAgICovXG4gICAgY3JpdGljYWxseUxvd1N0b3JhZ2VTcGFjZUFsYXJtPzoge1xuICAgICAgLyoqXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgICAvKipcbiAgICAgICAqIEFuIGFjdGlvbiB0byB1c2UgZm9yIENsb3VkV2F0Y2ggYWxhcm0gc3RhdGUgY2hhbmdlcyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGFjdGlvblxuICAgICAgICovXG4gICAgICBhY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAgICAgLyoqXG4gICAgICAgKiBAZGVmYXVsdCA1JSBvZiB0aGUgYWxsb2NhdGVkIHN0b3JhZ2UuXG4gICAgICAgKi9cbiAgICAgIHRocmVzaG9sZD86IGNkay5TaXplXG4gICAgfVxuICB9KTogdm9pZCB7XG4gICAgY29uc3QgbG93U3RvcmFnZVNwYWNlQWxhcm0gPSBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZTogXCJGcmVlU3RvcmFnZVNwYWNlXCIsXG4gICAgICBuYW1lc3BhY2U6IFwiQVdTL1JEU1wiLFxuICAgICAgc3RhdGlzdGljOiBcIk1pbmltdW1cIixcbiAgICAgIHVuaXQ6IFVuaXQuR0lHQUJZVEVTLFxuICAgICAgcGVyaW9kOiBjZGsuRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgREJJbnN0YW5jZUlkZW50aWZpZXI6IHRoaXMuZGF0YWJhc2VJbnN0YW5jZUlkZW50aWZpZXIsXG4gICAgICB9LFxuICAgIH0pLmNyZWF0ZUFsYXJtKHRoaXMsIFwiTG93U3RvcmFnZVNwYWNlQWxhcm1cIiwge1xuICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYExvdyBzdG9yYWdlIHNwYWNlIGF2YWlsYWJsZSBvbiBSRFMgZGF0YWJhc2UgJyR7dGhpcy5kYXRhYmFzZUluc3RhbmNlSWRlbnRpZmllcn0nLmAsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkxFU1NfVEhBTl9USFJFU0hPTEQsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogMSxcbiAgICAgIHRocmVzaG9sZDpcbiAgICAgICAgcHJvcHM/Lmxvd1N0b3JhZ2VTcGFjZUFsYXJtPy50aHJlc2hvbGQ/LnRvR2liaWJ5dGVzKCkgPz9cbiAgICAgICAgdGhpcy5hbGxvY2F0ZWRTdG9yYWdlLnRvR2liaWJ5dGVzKCkgKiAwLjI1LFxuICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLklHTk9SRSxcbiAgICB9KVxuICAgIGlmIChwcm9wcz8ubG93U3RvcmFnZVNwYWNlQWxhcm0/LmVuYWJsZWQgPz8gdHJ1ZSkge1xuICAgICAgbG93U3RvcmFnZVNwYWNlQWxhcm0uYWRkQWxhcm1BY3Rpb24oXG4gICAgICAgIHByb3BzPy5sb3dTdG9yYWdlU3BhY2VBbGFybT8uYWN0aW9uIHx8IHRoaXMuYWN0aW9uLFxuICAgICAgKVxuICAgICAgbG93U3RvcmFnZVNwYWNlQWxhcm0uYWRkT2tBY3Rpb24oXG4gICAgICAgIHByb3BzPy5sb3dTdG9yYWdlU3BhY2VBbGFybT8uYWN0aW9uIHx8IHRoaXMuYWN0aW9uLFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGNyaXRpY2FsbHlMb3dTdG9yYWdlU3BhY2VBbGFybSA9IG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lOiBcIkZyZWVTdG9yYWdlU3BhY2VcIixcbiAgICAgIG5hbWVzcGFjZTogXCJBV1MvUkRTXCIsXG4gICAgICBzdGF0aXN0aWM6IFwiTWluaW11bVwiLFxuICAgICAgdW5pdDogVW5pdC5HSUdBQllURVMsXG4gICAgICBwZXJpb2Q6IGNkay5EdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBEQkluc3RhbmNlSWRlbnRpZmllcjogdGhpcy5kYXRhYmFzZUluc3RhbmNlSWRlbnRpZmllcixcbiAgICAgIH0sXG4gICAgfSkuY3JlYXRlQWxhcm0odGhpcywgXCJDcml0aWNhbGx5TG93U3RvcmFnZVNwYWNlQWxhcm1cIiwge1xuICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYENyaXRpY2FsbHkgbG93IHN0b3JhZ2Ugc3BhY2UgYXZhaWxhYmxlIG9uIFJEUyBkYXRhYmFzZSAnJHt0aGlzLmRhdGFiYXNlSW5zdGFuY2VJZGVudGlmaWVyfScuYCxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuTEVTU19USEFOX1RIUkVTSE9MRCxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgICAgdGhyZXNob2xkOlxuICAgICAgICBwcm9wcz8uY3JpdGljYWxseUxvd1N0b3JhZ2VTcGFjZUFsYXJtPy50aHJlc2hvbGQ/LnRvR2liaWJ5dGVzKCkgPz9cbiAgICAgICAgdGhpcy5hbGxvY2F0ZWRTdG9yYWdlLnRvR2liaWJ5dGVzKCkgKiAwLjA1LFxuICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLklHTk9SRSxcbiAgICB9KVxuICAgIGlmIChwcm9wcz8uY3JpdGljYWxseUxvd1N0b3JhZ2VTcGFjZUFsYXJtPy5lbmFibGVkID8/IHRydWUpIHtcbiAgICAgIGNyaXRpY2FsbHlMb3dTdG9yYWdlU3BhY2VBbGFybS5hZGRBbGFybUFjdGlvbihcbiAgICAgICAgcHJvcHM/LmNyaXRpY2FsbHlMb3dTdG9yYWdlU3BhY2VBbGFybT8uYWN0aW9uIHx8IHRoaXMuYWN0aW9uLFxuICAgICAgKVxuICAgICAgY3JpdGljYWxseUxvd1N0b3JhZ2VTcGFjZUFsYXJtLmFkZE9rQWN0aW9uKFxuICAgICAgICBwcm9wcz8uY3JpdGljYWxseUxvd1N0b3JhZ2VTcGFjZUFsYXJtPy5hY3Rpb24gfHwgdGhpcy5hY3Rpb24sXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgYSBDbG91ZFdhdGNoIEFsYXJtIHRoYXQgdHJpZ2dlcnMgaWYgdGhlIGF2ZXJhZ2UgQ1BVIHV0aWxpemF0aW9uIGZvclxuICAgKiB0aGUgUkRTIGluc3RhbmNlIGV4Y2VlZHMgYSBnaXZlbiB0aHJlc2hvbGQuXG4gICAqL1xuICBhZGRDcHVVdGlsaXphdGlvbkFsYXJtKFxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gZm9yIGFuIGFsYXJtLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgQ29uZmlndXJlZCB3aXRoIHNhbmUgZGVmYXVsdHMuXG4gICAgICovXG4gICAgcHJvcHM/OiB7XG4gICAgICAvKipcbiAgICAgICAqIEFuIGFjdGlvbiB0byB1c2UgZm9yIENsb3VkV2F0Y2ggYWxhcm0gc3RhdGUgY2hhbmdlcyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGFjdGlvblxuICAgICAgICovXG4gICAgICBhY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdGhyZXNob2xkIGRlZmluZWQgYXMgYSBwZXJjZW50YWdlIHRoYXQgZGV0ZXJtaW5lcyBpZiBDUFUgdXRpbGl6YXRpb24gc2hvdWxkIHRyaWdnZXIgYW4gYWxhcm0gb3Igbm90LlxuICAgICAgICogQGRlZmF1bHQgODBcbiAgICAgICAqL1xuICAgICAgdGhyZXNob2xkPzogbnVtYmVyXG4gICAgICAvKipcbiAgICAgICAqIEBkZWZhdWx0IDVcbiAgICAgICAqL1xuICAgICAgZXZhbHVhdGlvblBlcmlvZHM/OiBudW1iZXJcbiAgICAgIC8qKlxuICAgICAgICogQGRlZmF1bHQgMiBtaW51dGVzXG4gICAgICAgKi9cbiAgICAgIHBlcmlvZD86IGNkay5EdXJhdGlvblxuICAgIH0sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGFsYXJtID0gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG1ldHJpY05hbWU6IFwiQ1BVVXRpbGl6YXRpb25cIixcbiAgICAgIG5hbWVzcGFjZTogXCJBV1MvUkRTXCIsXG4gICAgICBzdGF0aXN0aWM6IFwiQXZlcmFnZVwiLFxuICAgICAgcGVyaW9kOiBwcm9wcz8ucGVyaW9kID8/IGNkay5EdXJhdGlvbi5taW51dGVzKDIpLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBEQkluc3RhbmNlSWRlbnRpZmllcjogdGhpcy5kYXRhYmFzZUluc3RhbmNlSWRlbnRpZmllcixcbiAgICAgIH0sXG4gICAgfSkuY3JlYXRlQWxhcm0odGhpcywgXCJDcHVVdGlsaXphdGlvbkFsYXJtXCIsIHtcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBSRFMgZGF0YWJhc2UgJyR7dGhpcy5kYXRhYmFzZUluc3RhbmNlSWRlbnRpZmllcn0nIGhhcyBhIGhpZ2hlciB0aGFuIGV4cGVjdGVkIENQVSB1dGlsaXphdGlvbi5gLFxuICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IHByb3BzPy5ldmFsdWF0aW9uUGVyaW9kcyA/PyA1LFxuICAgICAgdGhyZXNob2xkOiBwcm9wcz8udGhyZXNob2xkID8/IDgwLFxuICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLklHTk9SRSxcbiAgICB9KVxuICAgIGFsYXJtLmFkZEFsYXJtQWN0aW9uKHByb3BzPy5hY3Rpb24gPz8gdGhpcy5hY3Rpb24pXG4gICAgYWxhcm0uYWRkT2tBY3Rpb24ocHJvcHM/LmFjdGlvbiA/PyB0aGlzLmFjdGlvbilcbiAgfVxufVxuIl19
@@ -1,2 +1,3 @@
1
+ export { DatabaseAlarms, DatabaseAlarmsProps } from "./database-alarms";
1
2
  export { ServiceAlarms, ServiceAlarmsProps } from "./service-alarms";
2
3
  export { SlackAlarm, SlackAlarmProps } from "./slack-alarm";
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SlackAlarm = exports.ServiceAlarms = void 0;
3
+ exports.SlackAlarm = exports.ServiceAlarms = exports.DatabaseAlarms = void 0;
4
+ var database_alarms_1 = require("./database-alarms");
5
+ Object.defineProperty(exports, "DatabaseAlarms", { enumerable: true, get: function () { return database_alarms_1.DatabaseAlarms; } });
4
6
  var service_alarms_1 = require("./service-alarms");
5
7
  Object.defineProperty(exports, "ServiceAlarms", { enumerable: true, get: function () { return service_alarms_1.ServiceAlarms; } });
6
8
  var slack_alarm_1 = require("./slack-alarm");
7
9
  Object.defineProperty(exports, "SlackAlarm", { enumerable: true, get: function () { return slack_alarm_1.SlackAlarm; } });
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWxhcm1zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFvRTtBQUEzRCwrR0FBQSxhQUFhLE9BQUE7QUFDdEIsNkNBQTJEO0FBQWxELHlHQUFBLFVBQVUsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFNlcnZpY2VBbGFybXMsIFNlcnZpY2VBbGFybXNQcm9wcyB9IGZyb20gXCIuL3NlcnZpY2UtYWxhcm1zXCJcbmV4cG9ydCB7IFNsYWNrQWxhcm0sIFNsYWNrQWxhcm1Qcm9wcyB9IGZyb20gXCIuL3NsYWNrLWFsYXJtXCJcbiJdfQ==
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWxhcm1zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUF1RTtBQUE5RCxpSEFBQSxjQUFjLE9BQUE7QUFDdkIsbURBQW9FO0FBQTNELCtHQUFBLGFBQWEsT0FBQTtBQUN0Qiw2Q0FBMkQ7QUFBbEQseUdBQUEsVUFBVSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgRGF0YWJhc2VBbGFybXMsIERhdGFiYXNlQWxhcm1zUHJvcHMgfSBmcm9tIFwiLi9kYXRhYmFzZS1hbGFybXNcIlxuZXhwb3J0IHsgU2VydmljZUFsYXJtcywgU2VydmljZUFsYXJtc1Byb3BzIH0gZnJvbSBcIi4vc2VydmljZS1hbGFybXNcIlxuZXhwb3J0IHsgU2xhY2tBbGFybSwgU2xhY2tBbGFybVByb3BzIH0gZnJvbSBcIi4vc2xhY2stYWxhcm1cIlxuIl19
@@ -1,9 +1,15 @@
1
- import * as constructs from "constructs";
1
+ import * as cdk from "aws-cdk-lib";
2
2
  import * as cloudwatch from "aws-cdk-lib/aws-cloudwatch";
3
3
  import * as logs from "aws-cdk-lib/aws-logs";
4
- import * as cdk from "aws-cdk-lib";
4
+ import * as constructs from "constructs";
5
5
  export interface ServiceAlarmsProps extends cdk.StackProps {
6
+ /**
7
+ * The default action to use for CloudWatch alarm state changes
8
+ */
6
9
  action: cloudwatch.IAlarmAction;
10
+ /**
11
+ * The name of the ECS service.
12
+ */
7
13
  serviceName: string;
8
14
  }
9
15
  /**
@@ -26,15 +32,114 @@ export declare class ServiceAlarms extends constructs.Construct {
26
32
  addJsonErrorAlarm(props: {
27
33
  logGroup: logs.ILogGroup;
28
34
  alarmDescription?: string;
29
- /** Set to `false` to stop the alarm from sending OK events.
30
- * @default true */
35
+ /**
36
+ * Set to `false` to stop the alarm from sending OK events.
37
+ * @default true
38
+ * */
31
39
  enableOkAction?: boolean;
40
+ /**
41
+ * An action to use for CloudWatch alarm state changes instead of the default action
42
+ */
43
+ action?: cloudwatch.IAlarmAction;
32
44
  }): void;
33
45
  /**
34
- * Monitor healthy host count and connection errors from load balancer.
46
+ * Sets up three CloudWatch Alarms for monitoring an ECS service behind a target group:
47
+ * 1) one that triggers if the target is responding with too many 5xx errors.
48
+ * 2) one that triggers if the 95% percentile of response times from the target is too high.
49
+ * 3) one that triggers if there are no healthy targets or if the load balancer fails to connect to targets.
35
50
  */
36
- addTargetGroupAlarm(props: {
51
+ addTargetGroupAlarms(props: {
52
+ /**
53
+ * The full name of the target group.
54
+ */
37
55
  targetGroupFullName: string;
56
+ /**
57
+ * The full name of the application load balancer.
58
+ */
38
59
  loadBalancerFullName: string;
60
+ /**
61
+ * Configuration for a composite alarm.
62
+ *
63
+ * @default Configured with sane defaults.
64
+ */
65
+ targetHealthAlarm?: {
66
+ /**
67
+ * @default true
68
+ */
69
+ enabled?: boolean;
70
+ /**
71
+ * An action to use for CloudWatch alarm state changes instead of the default action
72
+ */
73
+ action?: cloudwatch.IAlarmAction;
74
+ /**
75
+ * @default 60 seconds
76
+ */
77
+ period?: cdk.Duration;
78
+ /**
79
+ * @default 1
80
+ */
81
+ evaluationPeriods?: number;
82
+ /**
83
+ * @default 1
84
+ */
85
+ threshold?: number;
86
+ description?: string;
87
+ };
88
+ /**
89
+ * Configuration for an alarm.
90
+ *
91
+ * @default Configured with sane defaults.
92
+ */
93
+ tooMany5xxResponsesFromTargetsAlarm?: {
94
+ /**
95
+ * @default true
96
+ */
97
+ enabled?: boolean;
98
+ /**
99
+ * An action to use for CloudWatch alarm state changes instead of the default action
100
+ */
101
+ action?: cloudwatch.IAlarmAction;
102
+ /**
103
+ * @default 60 seconds
104
+ */
105
+ period?: cdk.Duration;
106
+ /**
107
+ * @default 3
108
+ */
109
+ evaluationPeriods?: number;
110
+ /**
111
+ * @default 10
112
+ */
113
+ threshold?: number;
114
+ description?: string;
115
+ };
116
+ /**
117
+ * Configuration for an alarm.
118
+ *
119
+ * @default Configured with sane defaults.
120
+ */
121
+ targetResponseTimeAlarm?: {
122
+ /**
123
+ * @default true
124
+ */
125
+ enabled?: boolean;
126
+ /**
127
+ * An action to use for CloudWatch alarm state changes instead of the default action
128
+ */
129
+ action?: cloudwatch.IAlarmAction;
130
+ /**
131
+ * @default 5 minutes
132
+ */
133
+ period?: cdk.Duration;
134
+ /**
135
+ * @default 1
136
+ */
137
+ evaluationPeriods?: number;
138
+ /**
139
+ * @default 500 milliseconds
140
+ */
141
+ threshold?: cdk.Duration;
142
+ description?: string;
143
+ };
39
144
  }): void;
40
145
  }
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ServiceAlarms = void 0;
4
- const constructs = require("constructs");
4
+ const cdk = require("aws-cdk-lib");
5
5
  const cloudwatch = require("aws-cdk-lib/aws-cloudwatch");
6
6
  const logs = require("aws-cdk-lib/aws-logs");
7
- const cdk = require("aws-cdk-lib");
7
+ const constructs = require("constructs");
8
8
  /**
9
9
  * Various alarms and monitoring.
10
10
  *
@@ -25,7 +25,7 @@ class ServiceAlarms extends constructs.Construct {
25
25
  * that causes 500 for logging with liflig-logging.
26
26
  */
27
27
  addJsonErrorAlarm(props) {
28
- var _a, _b;
28
+ var _a, _b, _c, _d;
29
29
  const errorMetricFilter = props.logGroup.addMetricFilter("ErrorMetricFilter", {
30
30
  filterPattern: logs.FilterPattern.any(logs.FilterPattern.stringValue("$.level", "=", "ERROR"),
31
31
  // FATAL covers some applications we run that uses log4j or
@@ -48,52 +48,102 @@ class ServiceAlarms extends constructs.Construct {
48
48
  threshold: 1,
49
49
  treatMissingData: cloudwatch.TreatMissingData.NOT_BREACHING,
50
50
  });
51
- errorAlarm.addAlarmAction(this.action);
52
- if ((_b = props.enableOkAction) !== null && _b !== void 0 ? _b : true) {
53
- errorAlarm.addOkAction(this.action);
51
+ errorAlarm.addAlarmAction((_b = props.action) !== null && _b !== void 0 ? _b : this.action);
52
+ if ((_c = props.enableOkAction) !== null && _c !== void 0 ? _c : true) {
53
+ errorAlarm.addOkAction((_d = props.action) !== null && _d !== void 0 ? _d : this.action);
54
54
  }
55
55
  }
56
56
  /**
57
- * Monitor healthy host count and connection errors from load balancer.
57
+ * Sets up three CloudWatch Alarms for monitoring an ECS service behind a target group:
58
+ * 1) one that triggers if the target is responding with too many 5xx errors.
59
+ * 2) one that triggers if the 95% percentile of response times from the target is too high.
60
+ * 3) one that triggers if there are no healthy targets or if the load balancer fails to connect to targets.
58
61
  */
59
- addTargetGroupAlarm(props) {
62
+ addTargetGroupAlarms(props) {
63
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19;
64
+ const targetConnectionErrorAlarm = new cloudwatch.Metric({
65
+ metricName: "TargetConnectionErrorCount",
66
+ namespace: "AWS/ApplicationELB",
67
+ statistic: "Sum",
68
+ period: (_b = (_a = props.targetHealthAlarm) === null || _a === void 0 ? void 0 : _a.period) !== null && _b !== void 0 ? _b : cdk.Duration.seconds(60),
69
+ dimensionsMap: {
70
+ TargetGroup: props.targetGroupFullName,
71
+ LoadBalancer: props.loadBalancerFullName,
72
+ },
73
+ }).createAlarm(this, "ConnectionAlarm", {
74
+ actionsEnabled: true,
75
+ alarmDescription: `Load balancer is failing to connect to target(s) in ECS service '${this.serviceName}'.`,
76
+ evaluationPeriods: (_d = (_c = props.targetHealthAlarm) === null || _c === void 0 ? void 0 : _c.evaluationPeriods) !== null && _d !== void 0 ? _d : 1,
77
+ threshold: 1,
78
+ treatMissingData: cloudwatch.TreatMissingData.NOT_BREACHING,
79
+ });
60
80
  const healthAlarm = new cloudwatch.Metric({
61
81
  metricName: "HealthyHostCount",
62
82
  namespace: "AWS/ApplicationELB",
63
- statistic: "Average",
64
- period: cdk.Duration.seconds(60),
83
+ statistic: "Minimum",
84
+ period: (_f = (_e = props.targetHealthAlarm) === null || _e === void 0 ? void 0 : _e.period) !== null && _f !== void 0 ? _f : cdk.Duration.seconds(60),
65
85
  dimensionsMap: {
66
86
  TargetGroup: props.targetGroupFullName,
67
87
  LoadBalancer: props.loadBalancerFullName,
68
88
  },
69
89
  }).createAlarm(this, "HealthAlarm", {
70
- alarmDescription: "Service might be unavailable! It is not responding to health checks.",
90
+ alarmDescription: `There are no healthy target(s) in ECS service '${this.serviceName}'.`,
71
91
  comparisonOperator: cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD,
72
- evaluationPeriods: 1,
92
+ evaluationPeriods: (_h = (_g = props.targetHealthAlarm) === null || _g === void 0 ? void 0 : _g.evaluationPeriods) !== null && _h !== void 0 ? _h : 1,
73
93
  threshold: 1,
74
94
  treatMissingData: cloudwatch.TreatMissingData.BREACHING,
75
95
  });
76
- healthAlarm.addAlarmAction(this.action);
77
- healthAlarm.addOkAction(this.action);
78
- const connectionAlarm = new cloudwatch.Metric({
79
- metricName: "TargetConnectionErrorCount",
96
+ const targetHealthAlarm = new cloudwatch.CompositeAlarm(this, "TargetHealthAlarm", {
97
+ alarmRule: cdk.aws_cloudwatch.AlarmRule.anyOf(cdk.aws_cloudwatch.AlarmRule.fromAlarm(targetConnectionErrorAlarm, cloudwatch.AlarmState.ALARM), cdk.aws_cloudwatch.AlarmRule.fromAlarm(healthAlarm, cloudwatch.AlarmState.ALARM)),
98
+ alarmDescription: (_k = (_j = props.targetHealthAlarm) === null || _j === void 0 ? void 0 : _j.description) !== null && _k !== void 0 ? _k : `The load balancer is either receiving bad health checks from or is unable to connect to target(s) in ECS service '${this.serviceName}'`,
99
+ actionsEnabled: false,
100
+ });
101
+ if ((_m = (_l = props.targetHealthAlarm) === null || _l === void 0 ? void 0 : _l.enabled) !== null && _m !== void 0 ? _m : true) {
102
+ targetHealthAlarm.addAlarmAction((_p = (_o = props.targetHealthAlarm) === null || _o === void 0 ? void 0 : _o.action) !== null && _p !== void 0 ? _p : this.action);
103
+ targetHealthAlarm.addOkAction((_r = (_q = props.targetHealthAlarm) === null || _q === void 0 ? void 0 : _q.action) !== null && _r !== void 0 ? _r : this.action);
104
+ }
105
+ const tooMany5xxResponsesFromTargetsAlarm = new cloudwatch.Metric({
106
+ metricName: "HTTPCode_Target_5XX_Count",
80
107
  namespace: "AWS/ApplicationELB",
81
108
  statistic: "Sum",
82
- period: cdk.Duration.seconds(60),
109
+ period: (_t = (_s = props.tooMany5xxResponsesFromTargetsAlarm) === null || _s === void 0 ? void 0 : _s.period) !== null && _t !== void 0 ? _t : cdk.Duration.seconds(60),
83
110
  dimensionsMap: {
84
111
  TargetGroup: props.targetGroupFullName,
85
112
  LoadBalancer: props.loadBalancerFullName,
86
113
  },
87
- }).createAlarm(this, "ConnectionAlarm", {
114
+ }).createAlarm(this, "AlbTargets5xxAlarm", {
88
115
  actionsEnabled: true,
89
- alarmDescription: "Load balancer could not connect to target",
90
- evaluationPeriods: 1,
91
- threshold: 1,
116
+ alarmDescription: (_v = (_u = props.tooMany5xxResponsesFromTargetsAlarm) === null || _u === void 0 ? void 0 : _u.description) !== null && _v !== void 0 ? _v : `Load balancer received too many 5XX responses from target(s) in ECS service '${this.serviceName}'.`,
117
+ evaluationPeriods: (_x = (_w = props.tooMany5xxResponsesFromTargetsAlarm) === null || _w === void 0 ? void 0 : _w.evaluationPeriods) !== null && _x !== void 0 ? _x : 3,
118
+ threshold: (_z = (_y = props.tooMany5xxResponsesFromTargetsAlarm) === null || _y === void 0 ? void 0 : _y.threshold) !== null && _z !== void 0 ? _z : 10,
92
119
  treatMissingData: cloudwatch.TreatMissingData.NOT_BREACHING,
93
120
  });
94
- connectionAlarm.addAlarmAction(this.action);
95
- connectionAlarm.addOkAction(this.action);
121
+ if ((_1 = (_0 = props.tooMany5xxResponsesFromTargetsAlarm) === null || _0 === void 0 ? void 0 : _0.enabled) !== null && _1 !== void 0 ? _1 : true) {
122
+ tooMany5xxResponsesFromTargetsAlarm.addAlarmAction((_3 = (_2 = props.tooMany5xxResponsesFromTargetsAlarm) === null || _2 === void 0 ? void 0 : _2.action) !== null && _3 !== void 0 ? _3 : this.action);
123
+ tooMany5xxResponsesFromTargetsAlarm.addOkAction((_5 = (_4 = props.tooMany5xxResponsesFromTargetsAlarm) === null || _4 === void 0 ? void 0 : _4.action) !== null && _5 !== void 0 ? _5 : this.action);
124
+ }
125
+ const targetResponseTimeAlarm = new cloudwatch.Metric({
126
+ metricName: "TargetResponseTime",
127
+ namespace: "AWS/ApplicationELB",
128
+ statistic: "p95",
129
+ period: (_7 = (_6 = props.targetResponseTimeAlarm) === null || _6 === void 0 ? void 0 : _6.period) !== null && _7 !== void 0 ? _7 : cdk.Duration.minutes(5),
130
+ unit: cloudwatch.Unit.MILLISECONDS,
131
+ dimensionsMap: {
132
+ LoadBalancer: props.loadBalancerFullName,
133
+ TargetGroup: props.targetGroupFullName,
134
+ },
135
+ }).createAlarm(this, "TargetResponseTimeAlarm", {
136
+ alarmDescription: (_9 = (_8 = props.targetResponseTimeAlarm) === null || _8 === void 0 ? void 0 : _8.description) !== null && _9 !== void 0 ? _9 : `5% of responses from ECS service '${this.serviceName}' are taking longer than expected.`,
137
+ comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
138
+ evaluationPeriods: (_11 = (_10 = props.targetResponseTimeAlarm) === null || _10 === void 0 ? void 0 : _10.evaluationPeriods) !== null && _11 !== void 0 ? _11 : 1,
139
+ threshold: ((_13 = (_12 = props.targetResponseTimeAlarm) === null || _12 === void 0 ? void 0 : _12.threshold) !== null && _13 !== void 0 ? _13 : cdk.Duration.millis(500)).toMilliseconds(),
140
+ treatMissingData: cloudwatch.TreatMissingData.IGNORE,
141
+ });
142
+ if ((_15 = (_14 = props.targetResponseTimeAlarm) === null || _14 === void 0 ? void 0 : _14.enabled) !== null && _15 !== void 0 ? _15 : true) {
143
+ targetResponseTimeAlarm.addAlarmAction((_17 = (_16 = props.targetResponseTimeAlarm) === null || _16 === void 0 ? void 0 : _16.action) !== null && _17 !== void 0 ? _17 : this.action);
144
+ targetResponseTimeAlarm.addOkAction((_19 = (_18 = props.targetResponseTimeAlarm) === null || _18 === void 0 ? void 0 : _18.action) !== null && _19 !== void 0 ? _19 : this.action);
145
+ }
96
146
  }
97
147
  }
98
148
  exports.ServiceAlarms = ServiceAlarms;
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1hbGFybXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWxhcm1zL3NlcnZpY2UtYWxhcm1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF3QztBQUN4Qyx5REFBd0Q7QUFDeEQsNkNBQTRDO0FBQzVDLG1DQUFrQztBQU9sQzs7Ozs7OztHQU9HO0FBQ0gsTUFBYSxhQUFjLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFJckQsWUFDRSxLQUEyQixFQUMzQixFQUFVLEVBQ1YsS0FBeUI7UUFFekIsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUE7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFBO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsS0FNakI7O1FBQ0MsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FDdEQsbUJBQW1CLEVBQ25CO1lBQ0UsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQztZQUN2RCwyREFBMkQ7WUFDM0QsZ0RBQWdEO1lBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVztZQUM1QixzQkFBc0I7WUFDdEIsMkJBQTJCLEVBQzNCLEdBQUcsRUFDSCx1QkFBdUIsQ0FDeEIsQ0FDRjtZQUNELFVBQVUsRUFBRSxRQUFRO1lBQ3BCLGVBQWUsRUFBRSxTQUFTLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMs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dHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgY2xvdWR3YXRjaCBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIlxuaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUFsYXJtc1Byb3BzIGV4dGVuZHMgY2RrLlN0YWNrUHJvcHMge1xuICBhY3Rpb246IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBWYXJpb3VzIGFsYXJtcyBhbmQgbW9uaXRvcmluZy5cbiAqXG4gKiBCeSBpdHNlbGYgbm8gYWxhcm1zIGlzIGNyZWF0ZWQuIFVzZSB0aGUgbWV0aG9kcyBhdmFpbGFibGVcbiAqIHRvIGFkZCBhbGFybXMuXG4gKlxuICogU2VlIFNsYWNrQWxhcm0gY29uc3RydWN0IGZvciBTTlMgQWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgU2VydmljZUFsYXJtcyBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhY3Rpb246IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZU5hbWU6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBTZXJ2aWNlQWxhcm1zUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIHRoaXMuYWN0aW9uID0gcHJvcHMuYWN0aW9uXG4gICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHByb3BzLnNlcnZpY2VOYW1lXG4gIH1cblxuICAvKipcbiAgICogRm9yIGxvZ3Mgc3RvcmVkIGFzIEpTT04sIG1vbml0b3IgbG9nIGVudHJpZXMgbG9nZ2VkXG4gICAqIHdpdGggbGV2ZWwgRVJST1Igb3IgaGlnaGVyLCBhcyB3ZWxsIGFzIGFueSByZXF1ZXN0c1xuICAgKiB0aGF0IGNhdXNlcyA1MDAgZm9yIGxvZ2dpbmcgd2l0aCBsaWZsaWctbG9nZ2luZy5cbiAgICovXG4gIGFkZEpzb25FcnJvckFsYXJtKHByb3BzOiB7XG4gICAgbG9nR3JvdXA6IGxvZ3MuSUxvZ0dyb3VwXG4gICAgYWxhcm1EZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgIC8qKiBTZXQgdG8gYGZhbHNlYCB0byBzdG9wIHRoZSBhbGFybSBmcm9tIHNlbmRpbmcgT0sgZXZlbnRzLlxuICAgICAqIEBkZWZhdWx0IHRydWUgKi9cbiAgICBlbmFibGVPa0FjdGlvbj86IGJvb2xlYW5cbiAgfSk6IHZvaWQge1xuICAgIGNvbnN0IGVycm9yTWV0cmljRmlsdGVyID0gcHJvcHMubG9nR3JvdXAuYWRkTWV0cmljRmlsdGVyKFxuICAgICAgXCJFcnJvck1ldHJpY0ZpbHRlclwiLFxuICAgICAge1xuICAgICAgICBmaWx0ZXJQYXR0ZXJuOiBsb2dzLkZpbHRlclBhdHRlcm4uYW55KFxuICAgICAgICAgIGxvZ3MuRmlsdGVyUGF0dGVybi5zdHJpbmdWYWx1ZShcIiQubGV2ZWxcIiwgXCI9XCIsIFwiRVJST1JcIiksXG4gICAgICAgICAgLy8gRkFUQUwgY292ZXJzIHNvbWUgYXBwbGljYXRpb25zIHdlIHJ1biB0aGF0IHVzZXMgbG9nNGogb3JcbiAgICAgICAgICAvLyBvdGhlciBsaWJyYXJpZXMuIEl0IGlzIG5vdCBleGlzdGVudCBpbiBzbGY0ai5cbiAgICAgICAgICBsb2dzLkZpbHRlclBhdHRlcm4uc3RyaW5nVmFsdWUoXCIkLmxldmVsXCIsIFwiPVwiLCBcIkZBVEFMXCIpLFxuICAgICAgICAgIGxvZ3MuRmlsdGVyUGF0dGVybi5zdHJpbmdWYWx1ZShcbiAgICAgICAgICAgIC8vIEZvciBsaWZsaWctbG9nZ2luZy5cbiAgICAgICAgICAgIFwiJC5yZXF1ZXN0SW5mby5zdGF0dXMuY29kZVwiLFxuICAgICAgICAgICAgXCI9XCIsXG4gICAgICAgICAgICBcIklOVEVSTkFMX1NFUlZFUl9FUlJPUlwiLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICAgIG1ldHJpY05hbWU6IFwiRXJyb3JzXCIsXG4gICAgICAgIG1ldHJpY05hbWVzcGFjZTogYHN0YWNrLyR7Y2RrLlN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX0vJHtcbiAgICAgICAgICB0aGlzLnNlcnZpY2VOYW1lXG4gICAgICAgIH0vRXJyb3JzYCxcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgY29uc3QgZXJyb3JBbGFybSA9IGVycm9yTWV0cmljRmlsdGVyXG4gICAgICAubWV0cmljKClcbiAgICAgIC53aXRoKHtcbiAgICAgICAgc3RhdGlzdGljOiBcIlN1bVwiLFxuICAgICAgICBwZXJpb2Q6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIH0pXG4gICAgICAuY3JlYXRlQWxhcm0odGhpcywgXCJFcnJvckxvZ0FsYXJtXCIsIHtcbiAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjpcbiAgICAgICAgICBwcm9wcy5hbGFybURlc2NyaXB0aW9uID8/IGAke3RoaXMuc2VydmljZU5hbWV9IGxvZ2dlZCBhbiBlcnJvcmAsXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGNsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YS5OT1RfQlJFQUNISU5HLFxuICAgICAgfSlcblxuICAgIGVycm9yQWxhcm0uYWRkQWxhcm1BY3Rpb24odGhpcy5hY3Rpb24pXG4gICAgaWYgKHByb3BzLmVuYWJsZU9rQWN0aW9uID8/IHRydWUpIHtcbiAgICAgIGVycm9yQWxhcm0uYWRkT2tBY3Rpb24odGhpcy5hY3Rpb24pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vbml0b3IgaGVhbHRoeSBob3N0IGNvdW50IGFuZCBjb25uZWN0aW9uIGVycm9ycyBmcm9tIGxvYWQgYmFsYW5jZXIuXG4gICAqL1xuICBhZGRUYXJnZXRHcm91cEFsYXJtKHByb3BzOiB7XG4gICAgdGFyZ2V0R3JvdXBGdWxsTmFtZTogc3RyaW5nXG4gICAgbG9hZEJhbGFuY2VyRnVsbE5hbWU6IHN0cmluZ1xuICB9KTogdm9pZCB7XG4gICAgY29uc3QgaGVhbHRoQWxhcm0gPSBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZTogXCJIZWFsdGh5SG9zdENvdW50XCIsXG4gICAgICBuYW1lc3BhY2U6IFwiQVdTL0FwcGxpY2F0aW9uRUxCXCIsXG4gICAgICBzdGF0aXN0aWM6IFwiQXZlcmFnZVwiLFxuICAgICAgcGVyaW9kOiBjZGsuRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIFRhcmdldEdyb3VwOiBwcm9wcy50YXJnZXRHcm91cEZ1bGxOYW1lLFxuICAgICAgICBMb2FkQmFsYW5jZXI6IHByb3BzLmxvYWRCYWxhbmNlckZ1bGxOYW1lLFxuICAgICAgfSxcbiAgICB9KS5jcmVhdGVBbGFybSh0aGlzLCBcIkhlYWx0aEFsYXJtXCIsIHtcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246XG4gICAgICAgIFwiU2VydmljZSBtaWdodCBiZSB1bmF2YWlsYWJsZSEgSXQgaXMgbm90IHJlc3BvbmRpbmcgdG8gaGVhbHRoIGNoZWNrcy5cIixcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuTEVTU19USEFOX1RIUkVTSE9MRCxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLkJSRUFDSElORyxcbiAgICB9KVxuXG4gICAgaGVhbHRoQWxhcm0uYWRkQWxhcm1BY3Rpb24odGhpcy5hY3Rpb24pXG4gICAgaGVhbHRoQWxhcm0uYWRkT2tBY3Rpb24odGhpcy5hY3Rpb24pXG5cbiAgICBjb25zdCBjb25uZWN0aW9uQWxhcm0gPSBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZTogXCJUYXJnZXRDb25uZWN0aW9uRXJyb3JDb3VudFwiLFxuICAgICAgbmFtZXNwYWNlOiBcIkFXUy9BcHBsaWNhdGlvbkVMQlwiLFxuICAgICAgc3RhdGlzdGljOiBcIlN1bVwiLFxuICAgICAgcGVyaW9kOiBjZGsuRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIFRhcmdldEdyb3VwOiBwcm9wcy50YXJnZXRHcm91cEZ1bGxOYW1lLFxuICAgICAgICBMb2FkQmFsYW5jZXI6IHByb3BzLmxvYWRCYWxhbmNlckZ1bGxOYW1lLFxuICAgICAgfSxcbiAgICB9KS5jcmVhdGVBbGFybSh0aGlzLCBcIkNvbm5lY3Rpb25BbGFybVwiLCB7XG4gICAgICBhY3Rpb25zRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246IFwiTG9hZCBiYWxhbmNlciBjb3VsZCBub3QgY29ubmVjdCB0byB0YXJnZXRcIixcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgfSlcblxuICAgIGNvbm5lY3Rpb25BbGFybS5hZGRBbGFybUFjdGlvbih0aGlzLmFjdGlvbilcbiAgICBjb25uZWN0aW9uQWxhcm0uYWRkT2tBY3Rpb24odGhpcy5hY3Rpb24pXG4gIH1cbn1cbiJdfQ==
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1hbGFybXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWxhcm1zL3NlcnZpY2UtYWxhcm1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFrQztBQUNsQyx5REFBd0Q7QUFDeEQsNkNBQTRDO0FBQzVDLHlDQUF3QztBQWF4Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBYSxhQUFjLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFJckQsWUFDRSxLQUEyQixFQUMzQixFQUFVLEVBQ1YsS0FBeUI7UUFFekIsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUE7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFBO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsS0FZakI7O1FBQ0MsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FDdEQsbUJBQW1CLEVBQ25CO1lBQ0UsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQztZQUN2RCwyREFBMkQ7WUFDM0QsZ0RBQWdEO1lBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVztZQUM1QixzQkFBc0I7WUFDdEIsMkJBQTJCLEVBQzNCLEdBQUcsRUFDSCx1QkFBdUIsQ0FDeEIsQ0FDRjtZQUNELFVBQVUsRUFBRSxRQUFRO1lBQ3BCLGVBQWUsRUFBRSxTQUFTLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMs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Q0EwU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCJcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCJcbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VBbGFybXNQcm9wcyBleHRlbmRzIGNkay5TdGFja1Byb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGFjdGlvbiB0byB1c2UgZm9yIENsb3VkV2F0Y2ggYWxhcm0gc3RhdGUgY2hhbmdlc1xuICAgKi9cbiAgYWN0aW9uOiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIEVDUyBzZXJ2aWNlLlxuICAgKi9cbiAgc2VydmljZU5hbWU6IHN0cmluZ1xufVxuXG4vKipcbiAqIFZhcmlvdXMgYWxhcm1zIGFuZCBtb25pdG9yaW5nLlxuICpcbiAqIEJ5IGl0c2VsZiBubyBhbGFybXMgaXMgY3JlYXRlZC4gVXNlIHRoZSBtZXRob2RzIGF2YWlsYWJsZVxuICogdG8gYWRkIGFsYXJtcy5cbiAqXG4gKiBTZWUgU2xhY2tBbGFybSBjb25zdHJ1Y3QgZm9yIFNOUyBBY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlQWxhcm1zIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFjdGlvbjogY2xvdWR3YXRjaC5JQWxhcm1BY3Rpb25cbiAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlTmFtZTogc3RyaW5nXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFNlcnZpY2VBbGFybXNQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5hY3Rpb24gPSBwcm9wcy5hY3Rpb25cbiAgICB0aGlzLnNlcnZpY2VOYW1lID0gcHJvcHMuc2VydmljZU5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgbG9ncyBzdG9yZWQgYXMgSlNPTiwgbW9uaXRvciBsb2cgZW50cmllcyBsb2dnZWRcbiAgICogd2l0aCBsZXZlbCBFUlJPUiBvciBoaWdoZXIsIGFzIHdlbGwgYXMgYW55IHJlcXVlc3RzXG4gICAqIHRoYXQgY2F1c2VzIDUwMCBmb3IgbG9nZ2luZyB3aXRoIGxpZmxpZy1sb2dnaW5nLlxuICAgKi9cbiAgYWRkSnNvbkVycm9yQWxhcm0ocHJvcHM6IHtcbiAgICBsb2dHcm91cDogbG9ncy5JTG9nR3JvdXBcbiAgICBhbGFybURlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gc3RvcCB0aGUgYWxhcm0gZnJvbSBzZW5kaW5nIE9LIGV2ZW50cy5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICogKi9cbiAgICBlbmFibGVPa0FjdGlvbj86IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBbiBhY3Rpb24gdG8gdXNlIGZvciBDbG91ZFdhdGNoIGFsYXJtIHN0YXRlIGNoYW5nZXMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBhY3Rpb25cbiAgICAgKi9cbiAgICBhY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICB9KTogdm9pZCB7XG4gICAgY29uc3QgZXJyb3JNZXRyaWNGaWx0ZXIgPSBwcm9wcy5sb2dHcm91cC5hZGRNZXRyaWNGaWx0ZXIoXG4gICAgICBcIkVycm9yTWV0cmljRmlsdGVyXCIsXG4gICAgICB7XG4gICAgICAgIGZpbHRlclBhdHRlcm46IGxvZ3MuRmlsdGVyUGF0dGVybi5hbnkoXG4gICAgICAgICAgbG9ncy5GaWx0ZXJQYXR0ZXJuLnN0cmluZ1ZhbHVlKFwiJC5sZXZlbFwiLCBcIj1cIiwgXCJFUlJPUlwiKSxcbiAgICAgICAgICAvLyBGQVRBTCBjb3ZlcnMgc29tZSBhcHBsaWNhdGlvbnMgd2UgcnVuIHRoYXQgdXNlcyBsb2c0aiBvclxuICAgICAgICAgIC8vIG90aGVyIGxpYnJhcmllcy4gSXQgaXMgbm90IGV4aXN0ZW50IGluIHNsZjRqLlxuICAgICAgICAgIGxvZ3MuRmlsdGVyUGF0dGVybi5zdHJpbmdWYWx1ZShcIiQubGV2ZWxcIiwgXCI9XCIsIFwiRkFUQUxcIiksXG4gICAgICAgICAgbG9ncy5GaWx0ZXJQYXR0ZXJuLnN0cmluZ1ZhbHVlKFxuICAgICAgICAgICAgLy8gRm9yIGxpZmxpZy1sb2dnaW5nLlxuICAgICAgICAgICAgXCIkLnJlcXVlc3RJbmZvLnN0YXR1cy5jb2RlXCIsXG4gICAgICAgICAgICBcIj1cIixcbiAgICAgICAgICAgIFwiSU5URVJOQUxfU0VSVkVSX0VSUk9SXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICAgbWV0cmljTmFtZTogXCJFcnJvcnNcIixcbiAgICAgICAgbWV0cmljTmFtZXNwYWNlOiBgc3RhY2svJHtjZGsuU3RhY2sub2YodGhpcykuc3RhY2tOYW1lfS8ke1xuICAgICAgICAgIHRoaXMuc2VydmljZU5hbWVcbiAgICAgICAgfS9FcnJvcnNgLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBjb25zdCBlcnJvckFsYXJtID0gZXJyb3JNZXRyaWNGaWx0ZXJcbiAgICAgIC5tZXRyaWMoKVxuICAgICAgLndpdGgoe1xuICAgICAgICBzdGF0aXN0aWM6IFwiU3VtXCIsXG4gICAgICAgIHBlcmlvZDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgfSlcbiAgICAgIC5jcmVhdGVBbGFybSh0aGlzLCBcIkVycm9yTG9nQWxhcm1cIiwge1xuICAgICAgICBhbGFybURlc2NyaXB0aW9uOlxuICAgICAgICAgIHByb3BzLmFsYXJtRGVzY3JpcHRpb24gPz8gYCR7dGhpcy5zZXJ2aWNlTmFtZX0gbG9nZ2VkIGFuIGVycm9yYCxcbiAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDEsXG4gICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgICB9KVxuXG4gICAgZXJyb3JBbGFybS5hZGRBbGFybUFjdGlvbihwcm9wcy5hY3Rpb24gPz8gdGhpcy5hY3Rpb24pXG4gICAgaWYgKHByb3BzLmVuYWJsZU9rQWN0aW9uID8/IHRydWUpIHtcbiAgICAgIGVycm9yQWxhcm0uYWRkT2tBY3Rpb24ocHJvcHMuYWN0aW9uID8/IHRoaXMuYWN0aW9uKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIHRocmVlIENsb3VkV2F0Y2ggQWxhcm1zIGZvciBtb25pdG9yaW5nIGFuIEVDUyBzZXJ2aWNlIGJlaGluZCBhIHRhcmdldCBncm91cDpcbiAgICogMSkgb25lIHRoYXQgdHJpZ2dlcnMgaWYgdGhlIHRhcmdldCBpcyByZXNwb25kaW5nIHdpdGggdG9vIG1hbnkgNXh4IGVycm9ycy5cbiAgICogMikgb25lIHRoYXQgdHJpZ2dlcnMgaWYgdGhlIDk1JSBwZXJjZW50aWxlIG9mIHJlc3BvbnNlIHRpbWVzIGZyb20gdGhlIHRhcmdldCBpcyB0b28gaGlnaC5cbiAgICogMykgb25lIHRoYXQgdHJpZ2dlcnMgaWYgdGhlcmUgYXJlIG5vIGhlYWx0aHkgdGFyZ2V0cyBvciBpZiB0aGUgbG9hZCBiYWxhbmNlciBmYWlscyB0byBjb25uZWN0IHRvIHRhcmdldHMuXG4gICAqL1xuICBhZGRUYXJnZXRHcm91cEFsYXJtcyhwcm9wczoge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHRhcmdldCBncm91cC5cbiAgICAgKi9cbiAgICB0YXJnZXRHcm91cEZ1bGxOYW1lOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBsb2FkIGJhbGFuY2VyLlxuICAgICAqL1xuICAgIGxvYWRCYWxhbmNlckZ1bGxOYW1lOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIGZvciBhIGNvbXBvc2l0ZSBhbGFybS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IENvbmZpZ3VyZWQgd2l0aCBzYW5lIGRlZmF1bHRzLlxuICAgICAqL1xuICAgIHRhcmdldEhlYWx0aEFsYXJtPzoge1xuICAgICAgLyoqXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgICAvKipcbiAgICAgICAqIEFuIGFjdGlvbiB0byB1c2UgZm9yIENsb3VkV2F0Y2ggYWxhcm0gc3RhdGUgY2hhbmdlcyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGFjdGlvblxuICAgICAgICovXG4gICAgICBhY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAgICAgLyoqXG4gICAgICAgKiBAZGVmYXVsdCA2MCBzZWNvbmRzXG4gICAgICAgKi9cbiAgICAgIHBlcmlvZD86IGNkay5EdXJhdGlvblxuICAgICAgLyoqXG4gICAgICAgKiBAZGVmYXVsdCAxXG4gICAgICAgKi9cbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyXG4gICAgICAvKipcbiAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAqL1xuICAgICAgdGhyZXNob2xkPzogbnVtYmVyXG4gICAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIGZvciBhbiBhbGFybS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IENvbmZpZ3VyZWQgd2l0aCBzYW5lIGRlZmF1bHRzLlxuICAgICAqL1xuICAgIHRvb01hbnk1eHhSZXNwb25zZXNGcm9tVGFyZ2V0c0FsYXJtPzoge1xuICAgICAgLyoqXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgICAvKipcbiAgICAgICAqIEFuIGFjdGlvbiB0byB1c2UgZm9yIENsb3VkV2F0Y2ggYWxhcm0gc3RhdGUgY2hhbmdlcyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGFjdGlvblxuICAgICAgICovXG4gICAgICBhY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAgICAgLyoqXG4gICAgICAgKiBAZGVmYXVsdCA2MCBzZWNvbmRzXG4gICAgICAgKi9cbiAgICAgIHBlcmlvZD86IGNkay5EdXJhdGlvblxuICAgICAgLyoqXG4gICAgICAgKiBAZGVmYXVsdCAzXG4gICAgICAgKi9cbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyXG4gICAgICAvKipcbiAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgKi9cbiAgICAgIHRocmVzaG9sZD86IG51bWJlclxuICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJhdGlvbiBmb3IgYW4gYWxhcm0uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBDb25maWd1cmVkIHdpdGggc2FuZSBkZWZhdWx0cy5cbiAgICAgKi9cbiAgICB0YXJnZXRSZXNwb25zZVRpbWVBbGFybT86IHtcbiAgICAgIC8qKlxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBlbmFibGVkPzogYm9vbGVhblxuICAgICAgLyoqXG4gICAgICAgKiBBbiBhY3Rpb24gdG8gdXNlIGZvciBDbG91ZFdhdGNoIGFsYXJtIHN0YXRlIGNoYW5nZXMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBhY3Rpb25cbiAgICAgICAqL1xuICAgICAgYWN0aW9uPzogY2xvdWR3YXRjaC5JQWxhcm1BY3Rpb25cbiAgICAgIC8qKlxuICAgICAgICogQGRlZmF1bHQgNSBtaW51dGVzXG4gICAgICAgKi9cbiAgICAgIHBlcmlvZD86IGNkay5EdXJhdGlvblxuICAgICAgLyoqXG4gICAgICAgKiBAZGVmYXVsdCAxXG4gICAgICAgKi9cbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyXG4gICAgICAvKipcbiAgICAgICAqIEBkZWZhdWx0IDUwMCBtaWxsaXNlY29uZHNcbiAgICAgICAqL1xuICAgICAgdGhyZXNob2xkPzogY2RrLkR1cmF0aW9uXG4gICAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgIH1cbiAgfSk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldENvbm5lY3Rpb25FcnJvckFsYXJtID0gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG1ldHJpY05hbWU6IFwiVGFyZ2V0Q29ubmVjdGlvbkVycm9yQ291bnRcIixcbiAgICAgIG5hbWVzcGFjZTogXCJBV1MvQXBwbGljYXRpb25FTEJcIixcbiAgICAgIHN0YXRpc3RpYzogXCJTdW1cIixcbiAgICAgIHBlcmlvZDogcHJvcHMudGFyZ2V0SGVhbHRoQWxhcm0/LnBlcmlvZCA/PyBjZGsuRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIFRhcmdldEdyb3VwOiBwcm9wcy50YXJnZXRHcm91cEZ1bGxOYW1lLFxuICAgICAgICBMb2FkQmFsYW5jZXI6IHByb3BzLmxvYWRCYWxhbmNlckZ1bGxOYW1lLFxuICAgICAgfSxcbiAgICB9KS5jcmVhdGVBbGFybSh0aGlzLCBcIkNvbm5lY3Rpb25BbGFybVwiLCB7XG4gICAgICBhY3Rpb25zRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBMb2FkIGJhbGFuY2VyIGlzIGZhaWxpbmcgdG8gY29ubmVjdCB0byB0YXJnZXQocykgaW4gRUNTIHNlcnZpY2UgJyR7dGhpcy5zZXJ2aWNlTmFtZX0nLmAsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogcHJvcHMudGFyZ2V0SGVhbHRoQWxhcm0/LmV2YWx1YXRpb25QZXJpb2RzID8/IDEsXG4gICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICB0cmVhdE1pc3NpbmdEYXRhOiBjbG91ZHdhdGNoLlRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgICB9KVxuXG4gICAgY29uc3QgaGVhbHRoQWxhcm0gPSBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZTogXCJIZWFsdGh5SG9zdENvdW50XCIsXG4gICAgICBuYW1lc3BhY2U6IFwiQVdTL0FwcGxpY2F0aW9uRUxCXCIsXG4gICAgICBzdGF0aXN0aWM6IFwiTWluaW11bVwiLFxuICAgICAgcGVyaW9kOiBwcm9wcy50YXJnZXRIZWFsdGhBbGFybT8ucGVyaW9kID8/IGNkay5EdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgVGFyZ2V0R3JvdXA6IHByb3BzLnRhcmdldEdyb3VwRnVsbE5hbWUsXG4gICAgICAgIExvYWRCYWxhbmNlcjogcHJvcHMubG9hZEJhbGFuY2VyRnVsbE5hbWUsXG4gICAgICB9LFxuICAgIH0pLmNyZWF0ZUFsYXJtKHRoaXMsIFwiSGVhbHRoQWxhcm1cIiwge1xuICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYFRoZXJlIGFyZSBubyBoZWFsdGh5IHRhcmdldChzKSBpbiBFQ1Mgc2VydmljZSAnJHt0aGlzLnNlcnZpY2VOYW1lfScuYCxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuTEVTU19USEFOX1RIUkVTSE9MRCxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBwcm9wcy50YXJnZXRIZWFsdGhBbGFybT8uZXZhbHVhdGlvblBlcmlvZHMgPz8gMSxcbiAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGNsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YS5CUkVBQ0hJTkcsXG4gICAgfSlcblxuICAgIGNvbnN0IHRhcmdldEhlYWx0aEFsYXJtID0gbmV3IGNsb3Vkd2F0Y2guQ29tcG9zaXRlQWxhcm0oXG4gICAgICB0aGlzLFxuICAgICAgXCJUYXJnZXRIZWFsdGhBbGFybVwiLFxuICAgICAge1xuICAgICAgICBhbGFybVJ1bGU6IGNkay5hd3NfY2xvdWR3YXRjaC5BbGFybVJ1bGUuYW55T2YoXG4gICAgICAgICAgY2RrLmF3c19jbG91ZHdhdGNoLkFsYXJtUnVsZS5mcm9tQWxhcm0oXG4gICAgICAgICAgICB0YXJnZXRDb25uZWN0aW9uRXJyb3JBbGFybSxcbiAgICAgICAgICAgIGNsb3Vkd2F0Y2guQWxhcm1TdGF0ZS5BTEFSTSxcbiAgICAgICAgICApLFxuICAgICAgICAgIGNkay5hd3NfY2xvdWR3YXRjaC5BbGFybVJ1bGUuZnJvbUFsYXJtKFxuICAgICAgICAgICAgaGVhbHRoQWxhcm0sXG4gICAgICAgICAgICBjbG91ZHdhdGNoLkFsYXJtU3RhdGUuQUxBUk0sXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjpcbiAgICAgICAgICBwcm9wcy50YXJnZXRIZWFsdGhBbGFybT8uZGVzY3JpcHRpb24gPz9cbiAgICAgICAgICBgVGhlIGxvYWQgYmFsYW5jZXIgaXMgZWl0aGVyIHJlY2VpdmluZyBiYWQgaGVhbHRoIGNoZWNrcyBmcm9tIG9yIGlzIHVuYWJsZSB0byBjb25uZWN0IHRvIHRhcmdldChzKSBpbiBFQ1Mgc2VydmljZSAnJHt0aGlzLnNlcnZpY2VOYW1lfSdgLFxuICAgICAgICBhY3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIClcbiAgICBpZiAocHJvcHMudGFyZ2V0SGVhbHRoQWxhcm0/LmVuYWJsZWQgPz8gdHJ1ZSkge1xuICAgICAgdGFyZ2V0SGVhbHRoQWxhcm0uYWRkQWxhcm1BY3Rpb24oXG4gICAgICAgIHByb3BzLnRhcmdldEhlYWx0aEFsYXJtPy5hY3Rpb24gPz8gdGhpcy5hY3Rpb24sXG4gICAgICApXG4gICAgICB0YXJnZXRIZWFsdGhBbGFybS5hZGRPa0FjdGlvbihcbiAgICAgICAgcHJvcHMudGFyZ2V0SGVhbHRoQWxhcm0/LmFjdGlvbiA/PyB0aGlzLmFjdGlvbixcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCB0b29NYW55NXh4UmVzcG9uc2VzRnJvbVRhcmdldHNBbGFybSA9IG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lOiBcIkhUVFBDb2RlX1RhcmdldF81WFhfQ291bnRcIixcbiAgICAgIG5hbWVzcGFjZTogXCJBV1MvQXBwbGljYXRpb25FTEJcIixcbiAgICAgIHN0YXRpc3RpYzogXCJTdW1cIixcbiAgICAgIHBlcmlvZDpcbiAgICAgICAgcHJvcHMudG9vTWFueTV4eFJlc3BvbnNlc0Zyb21UYXJnZXRzQWxhcm0/LnBlcmlvZCA/P1xuICAgICAgICBjZGsuRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIFRhcmdldEdyb3VwOiBwcm9wcy50YXJnZXRHcm91cEZ1bGxOYW1lLFxuICAgICAgICBMb2FkQmFsYW5jZXI6IHByb3BzLmxvYWRCYWxhbmNlckZ1bGxOYW1lLFxuICAgICAgfSxcbiAgICB9KS5jcmVhdGVBbGFybSh0aGlzLCBcIkFsYlRhcmdldHM1eHhBbGFybVwiLCB7XG4gICAgICBhY3Rpb25zRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246XG4gICAgICAgIHByb3BzLnRvb01hbnk1eHhSZXNwb25zZXNGcm9tVGFyZ2V0c0FsYXJtPy5kZXNjcmlwdGlvbiA/P1xuICAgICAgICBgTG9hZCBiYWxhbmNlciByZWNlaXZlZCB0b28gbWFueSA1WFggcmVzcG9uc2VzIGZyb20gdGFyZ2V0KHMpIGluIEVDUyBzZXJ2aWNlICcke3RoaXMuc2VydmljZU5hbWV9Jy5gLFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHM6XG4gICAgICAgIHByb3BzLnRvb01hbnk1eHhSZXNwb25zZXNGcm9tVGFyZ2V0c0FsYXJtPy5ldmFsdWF0aW9uUGVyaW9kcyA/PyAzLFxuICAgICAgdGhyZXNob2xkOiBwcm9wcy50b29NYW55NXh4UmVzcG9uc2VzRnJvbVRhcmdldHNBbGFybT8udGhyZXNob2xkID8/IDEwLFxuICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgfSlcbiAgICBpZiAocHJvcHMudG9vTWFueTV4eFJlc3BvbnNlc0Zyb21UYXJnZXRzQWxhcm0/LmVuYWJsZWQgPz8gdHJ1ZSkge1xuICAgICAgdG9vTWFueTV4eFJlc3BvbnNlc0Zyb21UYXJnZXRzQWxhcm0uYWRkQWxhcm1BY3Rpb24oXG4gICAgICAgIHByb3BzLnRvb01hbnk1eHhSZXNwb25zZXNGcm9tVGFyZ2V0c0FsYXJtPy5hY3Rpb24gPz8gdGhpcy5hY3Rpb24sXG4gICAgICApXG4gICAgICB0b29NYW55NXh4UmVzcG9uc2VzRnJvbVRhcmdldHNBbGFybS5hZGRPa0FjdGlvbihcbiAgICAgICAgcHJvcHMudG9vTWFueTV4eFJlc3BvbnNlc0Zyb21UYXJnZXRzQWxhcm0/LmFjdGlvbiA/PyB0aGlzLmFjdGlvbixcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRSZXNwb25zZVRpbWVBbGFybSA9IG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lOiBcIlRhcmdldFJlc3BvbnNlVGltZVwiLFxuICAgICAgbmFtZXNwYWNlOiBcIkFXUy9BcHBsaWNhdGlvbkVMQlwiLFxuICAgICAgc3RhdGlzdGljOiBcInA5NVwiLFxuICAgICAgcGVyaW9kOiBwcm9wcy50YXJnZXRSZXNwb25zZVRpbWVBbGFybT8ucGVyaW9kID8/IGNkay5EdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgdW5pdDogY2xvdWR3YXRjaC5Vbml0Lk1JTExJU0VDT05EUyxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgTG9hZEJhbGFuY2VyOiBwcm9wcy5sb2FkQmFsYW5jZXJGdWxsTmFtZSxcbiAgICAgICAgVGFyZ2V0R3JvdXA6IHByb3BzLnRhcmdldEdyb3VwRnVsbE5hbWUsXG4gICAgICB9LFxuICAgIH0pLmNyZWF0ZUFsYXJtKHRoaXMsIFwiVGFyZ2V0UmVzcG9uc2VUaW1lQWxhcm1cIiwge1xuICAgICAgYWxhcm1EZXNjcmlwdGlvbjpcbiAgICAgICAgcHJvcHMudGFyZ2V0UmVzcG9uc2VUaW1lQWxhcm0/LmRlc2NyaXB0aW9uID8/XG4gICAgICAgIGA1JSBvZiByZXNwb25zZXMgZnJvbSBFQ1Mgc2VydmljZSAnJHt0aGlzLnNlcnZpY2VOYW1lfScgYXJlIHRha2luZyBsb25nZXIgdGhhbiBleHBlY3RlZC5gLFxuICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IHByb3BzLnRhcmdldFJlc3BvbnNlVGltZUFsYXJtPy5ldmFsdWF0aW9uUGVyaW9kcyA/PyAxLFxuICAgICAgdGhyZXNob2xkOiAoXG4gICAgICAgIHByb3BzLnRhcmdldFJlc3BvbnNlVGltZUFsYXJtPy50aHJlc2hvbGQgPz8gY2RrLkR1cmF0aW9uLm1pbGxpcyg1MDApXG4gICAgICApLnRvTWlsbGlzZWNvbmRzKCksXG4gICAgICB0cmVhdE1pc3NpbmdEYXRhOiBjbG91ZHdhdGNoLlRyZWF0TWlzc2luZ0RhdGEuSUdOT1JFLFxuICAgIH0pXG4gICAgaWYgKHByb3BzLnRhcmdldFJlc3BvbnNlVGltZUFsYXJtPy5lbmFibGVkID8/IHRydWUpIHtcbiAgICAgIHRhcmdldFJlc3BvbnNlVGltZUFsYXJtLmFkZEFsYXJtQWN0aW9uKFxuICAgICAgICBwcm9wcy50YXJnZXRSZXNwb25zZVRpbWVBbGFybT8uYWN0aW9uID8/IHRoaXMuYWN0aW9uLFxuICAgICAgKVxuICAgICAgdGFyZ2V0UmVzcG9uc2VUaW1lQWxhcm0uYWRkT2tBY3Rpb24oXG4gICAgICAgIHByb3BzLnRhcmdldFJlc3BvbnNlVGltZUFsYXJtPy5hY3Rpb24gPz8gdGhpcy5hY3Rpb24sXG4gICAgICApXG4gICAgfVxuICB9XG59XG4iXX0=
@@ -41,6 +41,9 @@ export interface DatabaseProps extends cdk.StackProps {
41
41
  export declare class Database extends constructs.Construct {
42
42
  readonly secret: sm.ISecret;
43
43
  readonly connections: ec2.Connections;
44
+ readonly databaseInstance: rds.IDatabaseInstance;
45
+ readonly instanceType: ec2.InstanceType;
46
+ readonly allocatedStorage: cdk.Size;
44
47
  constructor(scope: constructs.Construct, id: string, props: DatabaseProps);
45
48
  allowConnectionFrom(source: ec2.ISecurityGroup): void;
46
49
  }
@@ -33,6 +33,8 @@ class Database extends constructs.Construct {
33
33
  backupRetention: cdk.Duration.days(35),
34
34
  ...props.overrideDbOptions,
35
35
  };
36
+ this.allocatedStorage = cdk.Size.gibibytes(options.allocatedStorage);
37
+ this.instanceType = options.instanceType;
36
38
  const db = props.snapshotIdentifier
37
39
  ? new rds.DatabaseInstanceFromSnapshot(this, "Resource", {
38
40
  ...options,
@@ -45,6 +47,7 @@ class Database extends constructs.Construct {
45
47
  credentials: rds.Credentials.fromSecret(secret),
46
48
  storageEncrypted: true,
47
49
  });
50
+ this.databaseInstance = db;
48
51
  this.secret = db.secret;
49
52
  this.connections = db.connections;
50
53
  db.node.defaultChild.publiclyAccessible = false;
@@ -54,4 +57,4 @@ class Database extends constructs.Construct {
54
57
  }
55
58
  }
56
59
  exports.Database = Database;
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmRzL2RhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF3QztBQUN4QywyQ0FBMEM7QUFDMUMsMkNBQTBDO0FBRTFDLG1DQUFrQztBQXNDbEMsTUFBYSxRQUFTLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFJaEQsWUFBWSxLQUEyQixFQUFFLEVBQVUsRUFBRSxLQUFvQjs7UUFDdkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixNQUFNLGNBQWMsR0FBRyxNQUFBLEtBQUssQ0FBQyxjQUFjLG1DQUFJLFFBQVEsQ0FBQTtRQUN2RCxNQUFNLFlBQVksR0FBRyxNQUFBLEtBQUssQ0FBQyxZQUFZLG1DQUFJLEtBQUssQ0FBQTtRQUVoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUNwRCxRQUFRLEVBQUUsY0FBYztTQUN6QixDQUFDLENBQUE7UUFFRixNQUFNLE9BQU8sR0FBb0M7WUFDL0MsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLHdCQUF3QixFQUFFLElBQUk7WUFDOUIsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtZQUM1QyxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2QsVUFBVSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7Z0JBQ2hDLENBQUMsQ0FBQztvQkFDRSxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNO2lCQUNsQztnQkFDSCxDQUFDLENBQUMsU0FBUztZQUNiLE9BQU8sRUFBRSxNQUFBLEtBQUssQ0FBQyxTQUFTLG1DQUFJLElBQUk7WUFDaEMsa0RBQWtEO1lBQ2xELHdCQUF3QjtZQUN4QixnQkFBZ0IsRUFBRSxNQUFBLEtBQUssQ0FBQyxrQkFBa0IsbUNBQUksRUFBRTtZQUNoRCx1Q0FBdUM7WUFDdkMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxHQUFHLEtBQUssQ0FBQyxpQkFBaUI7U0FDM0IsQ0FBQTtRQUVELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxrQkFBa0I7WUFDakMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLDRCQUE0QixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ3JELEdBQUcsT0FBTztnQkFDVixrQkFBa0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCO2dCQUM1QyxXQUFXLEVBQUUsR0FBRyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7YUFDeEQsQ0FBQztZQUNKLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUN6QyxHQUFHLE9BQU87Z0JBQ1YsWUFBWTtnQkFDWixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO2dCQUMvQyxnQkFBZ0IsRUFBRSxJQUFJO2FBQ3ZCLENBQUMsQ0FBQTtRQUVOLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU8sQ0FBQTtRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBSWhDO1FBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFrQyxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQTtJQUN6RSxDQUFDO0lBRU0sbUJBQW1CLENBQUMsTUFBMEI7UUFDbkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0NBQ0Y7QUExREQsNEJBMERDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIlxuaW1wb3J0ICogYXMgcmRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtcmRzXCJcbmltcG9ydCAqIGFzIHNtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VQcm9wcyBleHRlbmRzIGNkay5TdGFja1Byb3BzIHtcbiAgdnBjOiBlYzIuSVZwY1xuICBlbmdpbmU6IHJkcy5JSW5zdGFuY2VFbmdpbmVcbiAgLyoqXG4gICAqIEBkZWZhdWx0IG1hc3RlclxuICAgKi9cbiAgbWFzdGVyVXNlcm5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEBkZWZhdWx0IGFwcFxuICAgKi9cbiAgZGF0YWJhc2VOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAyNVxuICAgKi9cbiAgYWxsb2NhdGVkU3RvcmFnZUdiPzogbnVtYmVyXG4gIGluc3RhbmNlVHlwZTogZWMyLkluc3RhbmNlVHlwZVxuICBpbnN0YW5jZUlkZW50aWZpZXI6IHN0cmluZ1xuICAvKipcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgaXNNdWx0aUF6PzogYm9vbGVhblxuICAvKipcbiAgICogTXVzdCBub3QgYmUgcmVtb3ZlZCBvbmNlIGl0IGhhcyBiZWVuIHNldCwgYXMgY2hhbmdpbmcgdGhpc1xuICAgKiByZXN1bHRzIGluIGEgbmV3IERCIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQuXG4gICAqXG4gICAqIEFsc28sIHJlbWVtYmVyIHRvIGdpdmUgZGF0YWJhc2UgYSBuZXcgbmFtZSB3aGVuIGNoYW5naW5nIHRoaXMgcHJvcCwgb3IgZWxzZVxuICAgKiB0aGUgbmV3IGluc3RhbmNlIG5hbWUgd2lsbCBjcmFzaCB3aXRoIHRoZSBleGlzdGluZyBpbnN0YW5jZS5cbiAgICovXG4gIHNuYXBzaG90SWRlbnRpZmllcj86IHN0cmluZ1xuICAvKipcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHVzZVB1YmxpY1N1Ym5ldHM/OiBib29sZWFuXG4gIG92ZXJyaWRlRGJPcHRpb25zPzogUGFydGlhbDxyZHMuRGF0YWJhc2VJbnN0YW5jZVNvdXJjZVByb3BzPlxufVxuXG5leHBvcnQgY2xhc3MgRGF0YWJhc2UgZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBzZWNyZXQ6IHNtLklTZWNyZXRcbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25zOiBlYzIuQ29ubmVjdGlvbnNcblxuICBjb25zdHJ1Y3RvcihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEYXRhYmFzZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgY29uc3QgbWFzdGVyVXNlcm5hbWUgPSBwcm9wcy5tYXN0ZXJVc2VybmFtZSA/PyBcIm1hc3RlclwiXG4gICAgY29uc3QgZGF0YWJhc2VOYW1lID0gcHJvcHMuZGF0YWJhc2VOYW1lID8/IFwiYXBwXCJcblxuICAgIGNvbnN0IHNlY3JldCA9IG5ldyByZHMuRGF0YWJhc2VTZWNyZXQodGhpcywgXCJTZWNyZXRcIiwge1xuICAgICAgdXNlcm5hbWU6IG1hc3RlclVzZXJuYW1lLFxuICAgIH0pXG5cbiAgICBjb25zdCBvcHRpb25zOiByZHMuRGF0YWJhc2VJbnN0YW5jZVNvdXJjZVByb3BzID0ge1xuICAgICAgZW5naW5lOiBwcm9wcy5lbmdpbmUsXG4gICAgICBhbGxvd01ham9yVmVyc2lvblVwZ3JhZGU6IHRydWUsXG4gICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IHByb3BzLmluc3RhbmNlSWRlbnRpZmllcixcbiAgICAgIGluc3RhbmNlVHlwZTogcHJvcHMuaW5zdGFuY2VUeXBlLFxuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICB2cGNTdWJuZXRzOiBwcm9wcy51c2VQdWJsaWNTdWJuZXRzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc3VibmV0VHlwZTogZWMyLlN1Ym5ldFR5cGUuUFVCTElDLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBtdWx0aUF6OiBwcm9wcy5pc011bHRpQXogPz8gdHJ1ZSxcbiAgICAgIC8vIFdlIGRlZmF1bHQgdG8gMjUgR2lCIHN0b3JhZ2UgaW5zdGVhZCBvZiAxMDAgR2lCXG4gICAgICAvLyBpZiB3ZSBkbyBub3Qgc3BlY2lmeS5cbiAgICAgIGFsbG9jYXRlZFN0b3JhZ2U6IHByb3BzLmFsbG9jYXRlZFN0b3JhZ2VHYiA/PyAyNSxcbiAgICAgIC8vIFdlIHNwZWNpZnkgbWF4aW11bSBiYWNrdXAgcmV0ZW50aW9uLlxuICAgICAgYmFja3VwUmV0ZW50aW9uOiBjZGsuRHVyYXRpb24uZGF5cygzNSksXG4gICAgICAuLi5wcm9wcy5vdmVycmlkZURiT3B0aW9ucyxcbiAgICB9XG5cbiAgICBjb25zdCBkYiA9IHByb3BzLnNuYXBzaG90SWRlbnRpZmllclxuICAgICAgPyBuZXcgcmRzLkRhdGFiYXNlSW5zdGFuY2VGcm9tU25hcHNob3QodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICBzbmFwc2hvdElkZW50aWZpZXI6IHByb3BzLnNuYXBzaG90SWRlbnRpZmllcixcbiAgICAgICAgICBjcmVkZW50aWFsczogcmRzLlNuYXBzaG90Q3JlZGVudGlhbHMuZnJvbVNlY3JldChzZWNyZXQpLFxuICAgICAgICB9KVxuICAgICAgOiBuZXcgcmRzLkRhdGFiYXNlSW5zdGFuY2UodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICBkYXRhYmFzZU5hbWUsXG4gICAgICAgICAgY3JlZGVudGlhbHM6IHJkcy5DcmVkZW50aWFscy5mcm9tU2VjcmV0KHNlY3JldCksXG4gICAgICAgICAgc3RvcmFnZUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgICAgfSlcblxuICAgIHRoaXMuc2VjcmV0ID0gZGIuc2VjcmV0IVxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBkYi5jb25uZWN0aW9uc1xuXG4gICAgLy8gT3ZlcnJpZGUgaW4gY2FzZSB3ZSBoYXZlIHBsYWNlZCBpdCBpbiBhIHB1YmxpYyBzdWJuZXQuXG4gICAgLy8gSXQgd291bGQgZGVmYXVsdCB0byBiZWluZyBwdWJsaWMgYWNjZXNzaWJsZSB3aGljaCB3ZSBkbyBub3Qgd2FudC5cbiAgICA7KGRiLm5vZGUuZGVmYXVsdENoaWxkIGFzIHJkcy5DZm5EQkluc3RhbmNlKS5wdWJsaWNseUFjY2Vzc2libGUgPSBmYWxzZVxuICB9XG5cbiAgcHVibGljIGFsbG93Q29ubmVjdGlvbkZyb20oc291cmNlOiBlYzIuSVNlY3VyaXR5R3JvdXApOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zLmFsbG93RGVmYXVsdFBvcnRGcm9tKHNvdXJjZSlcbiAgfVxufVxuIl19
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmRzL2RhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF3QztBQUN4QywyQ0FBMEM7QUFDMUMsMkNBQTBDO0FBRTFDLG1DQUFrQztBQXNDbEMsTUFBYSxRQUFTLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFPaEQsWUFBWSxLQUEyQixFQUFFLEVBQVUsRUFBRSxLQUFvQjs7UUFDdkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixNQUFNLGNBQWMsR0FBRyxNQUFBLEtBQUssQ0FBQyxjQUFjLG1DQUFJLFFBQVEsQ0FBQTtRQUN2RCxNQUFNLFlBQVksR0FBRyxNQUFBLEtBQUssQ0FBQyxZQUFZLG1DQUFJLEtBQUssQ0FBQTtRQUVoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUNwRCxRQUFRLEVBQUUsY0FBYztTQUN6QixDQUFDLENBQUE7UUFFRixNQUFNLE9BQU8sR0FBb0M7WUFDL0MsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLHdCQUF3QixFQUFFLElBQUk7WUFDOUIsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtZQUM1QyxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2QsVUFBVSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7Z0JBQ2hDLENBQUMsQ0FBQztvQkFDRSxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNO2lCQUNsQztnQkFDSCxDQUFDLENBQUMsU0FBUztZQUNiLE9BQU8sRUFBRSxNQUFBLEtBQUssQ0FBQyxTQUFTLG1DQUFJLElBQUk7WUFDaEMsa0RBQWtEO1lBQ2xELHdCQUF3QjtZQUN4QixnQkFBZ0IsRUFBRSxNQUFBLEtBQUssQ0FBQyxrQkFBa0IsbUNBQUksRUFBRTtZQUNoRCx1Q0FBdUM7WUFDdkMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxHQUFHLEtBQUssQ0FBQyxpQkFBaUI7U0FDM0IsQ0FBQTtRQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsZ0JBQWlCLENBQUMsQ0FBQTtRQUNyRSxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFhLENBQUE7UUFFekMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLGtCQUFrQjtZQUNqQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsNEJBQTRCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDckQsR0FBRyxPQUFPO2dCQUNWLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxrQkFBa0I7Z0JBQzVDLFdBQVcsRUFBRSxHQUFHLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQzthQUN4RCxDQUFDO1lBQ0osQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ3pDLEdBQUcsT0FBTztnQkFDVixZQUFZO2dCQUNaLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBQy9DLGdCQUFnQixFQUFFLElBQUk7YUFDdkIsQ0FBQyxDQUFBO1FBRU4sSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQTtRQUUxQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFPLENBQUE7UUFDeEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUloQztRQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBa0MsQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUE7SUFDekUsQ0FBQztJQUVNLG1CQUFtQixDQUFDLE1BQTBCO1FBQ25ELElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDL0MsQ0FBQztDQUNGO0FBakVELDRCQWlFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCJcbmltcG9ydCAqIGFzIHJkcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiXG5pbXBvcnQgKiBhcyBzbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCJcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIlxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlUHJvcHMgZXh0ZW5kcyBjZGsuU3RhY2tQcm9wcyB7XG4gIHZwYzogZWMyLklWcGNcbiAgZW5naW5lOiByZHMuSUluc3RhbmNlRW5naW5lXG4gIC8qKlxuICAgKiBAZGVmYXVsdCBtYXN0ZXJcbiAgICovXG4gIG1hc3RlclVzZXJuYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBAZGVmYXVsdCBhcHBcbiAgICovXG4gIGRhdGFiYXNlTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogQGRlZmF1bHQgMjVcbiAgICovXG4gIGFsbG9jYXRlZFN0b3JhZ2VHYj86IG51bWJlclxuICBpbnN0YW5jZVR5cGU6IGVjMi5JbnN0YW5jZVR5cGVcbiAgaW5zdGFuY2VJZGVudGlmaWVyOiBzdHJpbmdcbiAgLyoqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGlzTXVsdGlBej86IGJvb2xlYW5cbiAgLyoqXG4gICAqIE11c3Qgbm90IGJlIHJlbW92ZWQgb25jZSBpdCBoYXMgYmVlbiBzZXQsIGFzIGNoYW5naW5nIHRoaXNcbiAgICogcmVzdWx0cyBpbiBhIG5ldyBEQiBpbnN0YW5jZSBiZWluZyBjcmVhdGVkLlxuICAgKlxuICAgKiBBbHNvLCByZW1lbWJlciB0byBnaXZlIGRhdGFiYXNlIGEgbmV3IG5hbWUgd2hlbiBjaGFuZ2luZyB0aGlzIHByb3AsIG9yIGVsc2VcbiAgICogdGhlIG5ldyBpbnN0YW5jZSBuYW1lIHdpbGwgY3Jhc2ggd2l0aCB0aGUgZXhpc3RpbmcgaW5zdGFuY2UuXG4gICAqL1xuICBzbmFwc2hvdElkZW50aWZpZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB1c2VQdWJsaWNTdWJuZXRzPzogYm9vbGVhblxuICBvdmVycmlkZURiT3B0aW9ucz86IFBhcnRpYWw8cmRzLkRhdGFiYXNlSW5zdGFuY2VTb3VyY2VQcm9wcz5cbn1cblxuZXhwb3J0IGNsYXNzIERhdGFiYXNlIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0OiBzbS5JU2VjcmV0XG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uczogZWMyLkNvbm5lY3Rpb25zXG4gIHB1YmxpYyByZWFkb25seSBkYXRhYmFzZUluc3RhbmNlOiByZHMuSURhdGFiYXNlSW5zdGFuY2VcbiAgcHVibGljIHJlYWRvbmx5IGluc3RhbmNlVHlwZTogZWMyLkluc3RhbmNlVHlwZVxuICBwdWJsaWMgcmVhZG9ubHkgYWxsb2NhdGVkU3RvcmFnZTogY2RrLlNpemVcblxuICBjb25zdHJ1Y3RvcihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEYXRhYmFzZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgY29uc3QgbWFzdGVyVXNlcm5hbWUgPSBwcm9wcy5tYXN0ZXJVc2VybmFtZSA/PyBcIm1hc3RlclwiXG4gICAgY29uc3QgZGF0YWJhc2VOYW1lID0gcHJvcHMuZGF0YWJhc2VOYW1lID8/IFwiYXBwXCJcblxuICAgIGNvbnN0IHNlY3JldCA9IG5ldyByZHMuRGF0YWJhc2VTZWNyZXQodGhpcywgXCJTZWNyZXRcIiwge1xuICAgICAgdXNlcm5hbWU6IG1hc3RlclVzZXJuYW1lLFxuICAgIH0pXG5cbiAgICBjb25zdCBvcHRpb25zOiByZHMuRGF0YWJhc2VJbnN0YW5jZVNvdXJjZVByb3BzID0ge1xuICAgICAgZW5naW5lOiBwcm9wcy5lbmdpbmUsXG4gICAgICBhbGxvd01ham9yVmVyc2lvblVwZ3JhZGU6IHRydWUsXG4gICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IHByb3BzLmluc3RhbmNlSWRlbnRpZmllcixcbiAgICAgIGluc3RhbmNlVHlwZTogcHJvcHMuaW5zdGFuY2VUeXBlLFxuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICB2cGNTdWJuZXRzOiBwcm9wcy51c2VQdWJsaWNTdWJuZXRzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc3VibmV0VHlwZTogZWMyLlN1Ym5ldFR5cGUuUFVCTElDLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBtdWx0aUF6OiBwcm9wcy5pc011bHRpQXogPz8gdHJ1ZSxcbiAgICAgIC8vIFdlIGRlZmF1bHQgdG8gMjUgR2lCIHN0b3JhZ2UgaW5zdGVhZCBvZiAxMDAgR2lCXG4gICAgICAvLyBpZiB3ZSBkbyBub3Qgc3BlY2lmeS5cbiAgICAgIGFsbG9jYXRlZFN0b3JhZ2U6IHByb3BzLmFsbG9jYXRlZFN0b3JhZ2VHYiA/PyAyNSxcbiAgICAgIC8vIFdlIHNwZWNpZnkgbWF4aW11bSBiYWNrdXAgcmV0ZW50aW9uLlxuICAgICAgYmFja3VwUmV0ZW50aW9uOiBjZGsuRHVyYXRpb24uZGF5cygzNSksXG4gICAgICAuLi5wcm9wcy5vdmVycmlkZURiT3B0aW9ucyxcbiAgICB9XG4gICAgdGhpcy5hbGxvY2F0ZWRTdG9yYWdlID0gY2RrLlNpemUuZ2liaWJ5dGVzKG9wdGlvbnMuYWxsb2NhdGVkU3RvcmFnZSEpXG4gICAgdGhpcy5pbnN0YW5jZVR5cGUgPSBvcHRpb25zLmluc3RhbmNlVHlwZSFcblxuICAgIGNvbnN0IGRiID0gcHJvcHMuc25hcHNob3RJZGVudGlmaWVyXG4gICAgICA/IG5ldyByZHMuRGF0YWJhc2VJbnN0YW5jZUZyb21TbmFwc2hvdCh0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIHNuYXBzaG90SWRlbnRpZmllcjogcHJvcHMuc25hcHNob3RJZGVudGlmaWVyLFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiByZHMuU25hcHNob3RDcmVkZW50aWFscy5mcm9tU2VjcmV0KHNlY3JldCksXG4gICAgICAgIH0pXG4gICAgICA6IG5ldyByZHMuRGF0YWJhc2VJbnN0YW5jZSh0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIGRhdGFiYXNlTmFtZSxcbiAgICAgICAgICBjcmVkZW50aWFsczogcmRzLkNyZWRlbnRpYWxzLmZyb21TZWNyZXQoc2VjcmV0KSxcbiAgICAgICAgICBzdG9yYWdlRW5jcnlwdGVkOiB0cnVlLFxuICAgICAgICB9KVxuXG4gICAgdGhpcy5kYXRhYmFzZUluc3RhbmNlID0gZGJcblxuICAgIHRoaXMuc2VjcmV0ID0gZGIuc2VjcmV0IVxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBkYi5jb25uZWN0aW9uc1xuXG4gICAgLy8gT3ZlcnJpZGUgaW4gY2FzZSB3ZSBoYXZlIHBsYWNlZCBpdCBpbiBhIHB1YmxpYyBzdWJuZXQuXG4gICAgLy8gSXQgd291bGQgZGVmYXVsdCB0byBiZWluZyBwdWJsaWMgYWNjZXNzaWJsZSB3aGljaCB3ZSBkbyBub3Qgd2FudC5cbiAgICA7KGRiLm5vZGUuZGVmYXVsdENoaWxkIGFzIHJkcy5DZm5EQkluc3RhbmNlKS5wdWJsaWNseUFjY2Vzc2libGUgPSBmYWxzZVxuICB9XG5cbiAgcHVibGljIGFsbG93Q29ubmVjdGlvbkZyb20oc291cmNlOiBlYzIuSVNlY3VyaXR5R3JvdXApOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zLmFsbG93RGVmYXVsdFBvcnRGcm9tKHNvdXJjZSlcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liflig/cdk",
3
- "version": "2.7.0",
3
+ "version": "2.8.1",
4
4
  "description": "CDK library for Liflig",
5
5
  "repository": {
6
6
  "type": "git",
@@ -37,15 +37,15 @@
37
37
  "@aws-cdk/assert": "2.35.0",
38
38
  "@commitlint/cli": "17.1.2",
39
39
  "@commitlint/config-conventional": "17.1.0",
40
- "@types/aws-lambda": "8.10.106",
40
+ "@types/aws-lambda": "8.10.108",
41
41
  "@types/jest": "27.5.2",
42
- "@types/node": "16.11.62",
43
- "@typescript-eslint/eslint-plugin": "5.38.1",
44
- "@typescript-eslint/parser": "5.38.1",
42
+ "@types/node": "16.11.68",
43
+ "@typescript-eslint/eslint-plugin": "5.40.1",
44
+ "@typescript-eslint/parser": "5.40.1",
45
45
  "aws-cdk": "2.35.0",
46
46
  "aws-cdk-lib": "2.35.0",
47
- "constructs": "10.1.94",
48
- "eslint": "8.24.0",
47
+ "constructs": "10.1.131",
48
+ "eslint": "8.26.0",
49
49
  "eslint-config-prettier": "8.5.0",
50
50
  "eslint-plugin-prettier": "4.2.1",
51
51
  "husky": "8.0.1",