@rio-cloud/cdk-v2-constructs 6.1.0 → 6.2.2

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,352 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.RunnerRoles = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const aws_ecr_1 = require("aws-cdk-lib/aws-ecr");
8
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
9
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
10
+ const aws_ssm_1 = require("aws-cdk-lib/aws-ssm");
11
+ const constructs_1 = require("constructs");
12
+ const rio_landing_zone_1 = require("../../../rio-landing-zone");
13
+ /**
14
+ * This construct provides a set of base roles for gitlab runners in order to build, test, validate and deploy applications
15
+ * on RIO. The roles need to be assumed during job runtime to perform more permissive actions, such as creating certificates to
16
+ * authenticate towards the RIO MSK, pushing docker images to ECR, performing a secrets backup, deploying stacks,
17
+ * or to publish an SPA to a S3 bucket. Do not assume the deployment role unless needed.
18
+ * The base role can be the default role attached to GitLab runners.
19
+ * The role allows to read various basic parameters such as the NIST data mirror, the OSS license bucket, DataDog keys
20
+ * and to pull ECR images form public Gallery or the specified account in the environment.
21
+ * The Role ARNs are export using CFNOutputs. Use the outputs to configure environment variables in your GitLab group.
22
+ */
23
+ class RunnerRoles extends constructs_1.Construct {
24
+ constructor(scope, id, props) {
25
+ super(scope, id);
26
+ const accountNameParameter = rio_landing_zone_1.RioLandingZone.getAccountNameParameter(scope);
27
+ const teamNameParameter = rio_landing_zone_1.RioLandingZone.getTeamIdentifierParameter(scope);
28
+ const nistMirrorParameter = aws_ssm_1.StringParameter.fromStringParameterName(this, 'NistMirrorParameter', '/config/nist-data-mirror/url');
29
+ const ossLicensesBucketParameter = aws_ssm_1.StringParameter.fromStringParameterAttributes(this, 'OssLicensesBucketParameter', {
30
+ parameterName: '/config/oss-licenses/bucket-name',
31
+ });
32
+ const ossLicensesBucket = aws_s3_1.Bucket.fromBucketName(this, 'OssLicensesBucket', ossLicensesBucketParameter.stringValue);
33
+ const ddApiKeyParam = aws_ssm_1.StringParameter.fromStringParameterAttributes(this, 'DataDogApiKeyParam', {
34
+ parameterName: '/rio/config/datadog-integration/api-key',
35
+ });
36
+ const ddSiteParam = aws_ssm_1.StringParameter.fromStringParameterAttributes(this, 'DataDogSiteParam', {
37
+ parameterName: '/rio/config/datadog-integration/site',
38
+ });
39
+ const kafkaIntegrationPolicy = aws_iam_1.ManagedPolicy.fromManagedPolicyArn(this, 'KafkaIntegrationPolicy', aws_cdk_lib_1.Fn.importValue('kafka-integration-policy-arn'));
40
+ this.runnerBaseRole = new aws_iam_1.Role(this, 'GlRunnerBuildRole', {
41
+ assumedBy: new aws_iam_1.ServicePrincipal('ec2.amazonaws.com', {}),
42
+ inlinePolicies: {
43
+ CdkSynthLookUp: aws_iam_1.PolicyDocument.fromJson({
44
+ Version: '2012-10-17',
45
+ Statement: [
46
+ {
47
+ Effect: 'Allow',
48
+ Action: ['s3:*Object', 's3:ListBucket', 's3:GetBucketLocation'],
49
+ Resource: ['arn:aws:s3:::cdktoolkit-*'],
50
+ },
51
+ {
52
+ Sid: 'assumerole',
53
+ Effect: 'Allow',
54
+ Action: ['sts:AssumeRole', 'iam:PassRole'],
55
+ Resource: [
56
+ 'arn:aws:iam::*:role/cdk-readOnlyRole',
57
+ 'arn:aws:iam::*:role/cdk-hnb659fds-lookup-role-*',
58
+ ],
59
+ },
60
+ {
61
+ Sid: 'pullEcrImages',
62
+ Effect: 'Allow',
63
+ Action: [
64
+ 'ecr:BatchCheckLayerAvailability',
65
+ 'ecr:BatchGetImage',
66
+ 'ecr:DescribeImages',
67
+ 'ecr:DescribeRepositories',
68
+ 'ecr:GetDownloadUrlForLayer',
69
+ ],
70
+ Resource: [
71
+ `${props.env.account}.dkr.ecr.${props.env.region}.amazonaws.com/*`,
72
+ ],
73
+ },
74
+ ],
75
+ }),
76
+ },
77
+ });
78
+ this.runnerBaseRole.node.defaultChild.overrideLogicalId('GlRunnerBuildRole');
79
+ nistMirrorParameter.grantRead(this.runnerBaseRole);
80
+ ossLicensesBucketParameter.grantRead(this.runnerBaseRole);
81
+ ossLicensesBucket.grantReadWrite(this.runnerBaseRole);
82
+ accountNameParameter.grantRead(this.runnerBaseRole);
83
+ teamNameParameter.grantRead(this.runnerBaseRole);
84
+ ddApiKeyParam.grantRead(this.runnerBaseRole);
85
+ ddSiteParam.grantRead(this.runnerBaseRole);
86
+ aws_ecr_1.PublicGalleryAuthorizationToken.grantRead(this.runnerBaseRole);
87
+ const webContentPublishRole = new aws_iam_1.Role(this, 'GlRunnerS3WebContentDeployRole', {
88
+ roleName: 'gl-runner-web-content-s3-deploy-role',
89
+ assumedBy: this.runnerBaseRole,
90
+ inlinePolicies: {
91
+ PublishWebContentOnS3: aws_iam_1.PolicyDocument.fromJson({
92
+ Version: '2012-10-17',
93
+ Statement: [
94
+ {
95
+ Effect: 'Allow',
96
+ Action: [
97
+ 's3:Abort*',
98
+ 's3:DeleteObject*',
99
+ 's3:GetBucket*',
100
+ 's3:GetObject*',
101
+ 's3:List*',
102
+ 's3:PutObject',
103
+ 's3:PutObjectLegalHold',
104
+ 's3:PutObjectRetention',
105
+ 's3:PutObjectTagging',
106
+ 's3:PutObjectVersionTagging',
107
+ ],
108
+ Resource: ['arn:aws:s3:::*'],
109
+ },
110
+ {
111
+ Action: [
112
+ 'ssm:DescribeParameters',
113
+ 'ssm:GetParameter',
114
+ 'ssm:GetParameterHistory',
115
+ 'ssm:GetParameters',
116
+ 'ssm:GetParametersByPath',
117
+ ],
118
+ Effect: 'Allow',
119
+ Resource: [
120
+ `arn:aws:ssm:${props.env.region}:${props.env.account}:parameter/config/*`,
121
+ `arn:aws:ssm:${props.env.region}:${props.env.account}:parameter/secret/*`,
122
+ ],
123
+ },
124
+ ],
125
+ }),
126
+ },
127
+ });
128
+ webContentPublishRole.node.defaultChild.overrideLogicalId('GlRunnerS3WebContentDeployRole');
129
+ const createMSKCertRole = new aws_iam_1.Role(this, 'GlRunnerCreateAndSignCertRole', {
130
+ roleName: 'gl-runner-create-and-sign-rio-msk-cert-role',
131
+ assumedBy: this.runnerBaseRole,
132
+ inlinePolicies: {
133
+ ParameterStoreReadKeyStore: aws_iam_1.PolicyDocument.fromJson({
134
+ Version: '2012-10-17',
135
+ Statement: [
136
+ {
137
+ Action: [
138
+ 'ssm:DescribeParameters',
139
+ 'ssm:GetParameter',
140
+ 'ssm:GetParameterHistory',
141
+ 'ssm:GetParameters',
142
+ 'ssm:GetParametersByPath',
143
+ ],
144
+ Effect: 'Allow',
145
+ Resource: [
146
+ `arn:aws:ssm:${props.env.region}:${props.env.account}:parameter/config/*`,
147
+ `arn:aws:ssm:${props.env.region}:${props.env.account}:parameter/secret/*`,
148
+ ],
149
+ },
150
+ ],
151
+ }),
152
+ SecretsManagerReadKeyStore: aws_iam_1.PolicyDocument.fromJson({
153
+ Version: '2012-10-17',
154
+ Statement: [
155
+ {
156
+ Action: [
157
+ 'secretsmanager:DescribeSecret',
158
+ 'secretsmanager:GetSecretValue',
159
+ 'secretsmanager:GetResourcePolicy',
160
+ 'secretsmanager:ListSecretVersionIds',
161
+ ],
162
+ Effect: 'Allow',
163
+ Resource: [
164
+ `arn:aws:secretsmanager:${props.env.region}:${props.env.account}:secret:/secret/*/service-keystore-password-??????`,
165
+ `arn:aws:secretsmanager:${props.env.region}:${props.env.account}:secret:/secret/*/service-keystore-password`,
166
+ `arn:aws:secretsmanager:${props.env.region}:${props.env.account}:secret:/config/*/service-keystore-password-??????`,
167
+ `arn:aws:secretsmanager:${props.env.region}:${props.env.account}:secret:/config/*/service-keystore-password`,
168
+ ],
169
+ },
170
+ ],
171
+ }),
172
+ },
173
+ managedPolicies: [kafkaIntegrationPolicy],
174
+ });
175
+ accountNameParameter.grantRead(createMSKCertRole);
176
+ teamNameParameter.grantRead(this.runnerBaseRole);
177
+ createMSKCertRole.node.defaultChild.overrideLogicalId('GlRunnerCreateAndSignCertRole');
178
+ const ecrDeployRole = new aws_iam_1.Role(this, 'GlRunnerECRDeployRole', {
179
+ roleName: 'gl-runner-deploy-to-ecr-role',
180
+ assumedBy: this.runnerBaseRole,
181
+ inlinePolicies: {
182
+ DeployToECR: aws_iam_1.PolicyDocument.fromJson({
183
+ Version: '2012-10-17',
184
+ Statement: [
185
+ {
186
+ Action: [
187
+ 'ecr:BatchCheckLayerAvailability',
188
+ 'ecr:BatchGetImage',
189
+ 'ecr:CompleteLayerUpload',
190
+ 'ecr:GetDownloadUrlForLayer',
191
+ 'ecr:InitiateLayerUpload',
192
+ 'ecr:PutImage',
193
+ 'ecr:UploadLayerPart',
194
+ 'ecr:GetAuthorizationToken',
195
+ 'ecr:DescribeRepositories',
196
+ ],
197
+ Effect: 'Allow',
198
+ Resource: [
199
+ `${props.env.account}.dkr.ecr.${props.env.region}.amazonaws.com/*`,
200
+ ],
201
+ },
202
+ ],
203
+ }),
204
+ },
205
+ });
206
+ aws_ecr_1.PublicGalleryAuthorizationToken.grantRead(ecrDeployRole);
207
+ ecrDeployRole.node.defaultChild.overrideLogicalId('GlRunnerECRDeployRole');
208
+ const iamPolicyKMS = new aws_iam_1.PolicyStatement({
209
+ actions: ['kms:Decrypt'],
210
+ resources: [
211
+ 'arn:aws:kms:*:903404386550:key/*',
212
+ `arn:aws:kms:*:${props.env.account}:key/*`,
213
+ ],
214
+ conditions: {
215
+ 'ForAnyValue:StringLike': {
216
+ 'kms:ResourceAliases': 'alias/rio-lz-backup-key*',
217
+ },
218
+ },
219
+ });
220
+ const iamPolicyLambdaExecution = new aws_iam_1.PolicyStatement({
221
+ actions: ['lambda:InvokeFunction'],
222
+ resources: [
223
+ `arn:aws:lambda:eu-west-1:${props.env.account}:function:SecretsRestoreHandler`,
224
+ ],
225
+ });
226
+ const secretsBackUpRole = new aws_iam_1.Role(this, 'GlRunnerSecretsBackupRole', {
227
+ roleName: 'gl-runner-secrets-backup-role',
228
+ assumedBy: this.runnerBaseRole,
229
+ inlinePolicies: {
230
+ SecretsBackup: new aws_iam_1.PolicyDocument({
231
+ statements: [iamPolicyKMS, iamPolicyLambdaExecution],
232
+ }),
233
+ },
234
+ });
235
+ secretsBackUpRole.node.defaultChild.overrideLogicalId('GlRunnerSecretsBackupRole');
236
+ const deployRole = new aws_iam_1.Role(this, 'GlRunnerCDKDeployRole', {
237
+ roleName: 'gl-runner-cdk-deploy-role',
238
+ assumedBy: this.runnerBaseRole,
239
+ managedPolicies: [kafkaIntegrationPolicy], // required to create Kafka topics and publish event specification in deploy jobs
240
+ inlinePolicies: {
241
+ CdkDeploy: aws_iam_1.PolicyDocument.fromJson({
242
+ Version: '2012-10-17',
243
+ Statement: [
244
+ {
245
+ Effect: 'Allow',
246
+ Action: [
247
+ 'cloudformation:DescribeStacks',
248
+ 'cloudformation:CreateChangeSet',
249
+ 'cloudformation:DescribeChangeSet',
250
+ 'cloudformation:ExecuteChangeSet',
251
+ 'cloudformation:DescribeStackEvents',
252
+ 'cloudformation:DeleteChangeSet',
253
+ 'cloudformation:GetTemplate',
254
+ ],
255
+ Resource: [
256
+ `arn:aws:cloudformation:${props.env.region}:${props.env.account}:stack/*`,
257
+ ],
258
+ },
259
+ {
260
+ Effect: 'Allow',
261
+ Action: ['s3:*Object', 's3:ListBucket', 's3:GetBucketLocation'],
262
+ Resource: ['arn:aws:s3:::cdktoolkit-*'],
263
+ },
264
+ {
265
+ Sid: 'assumerole',
266
+ Effect: 'Allow',
267
+ Action: ['sts:AssumeRole', 'iam:PassRole'],
268
+ Resource: [
269
+ 'arn:aws:iam::*:role/cdk-readOnlyRole',
270
+ 'arn:aws:iam::*:role/cdk-hnb659fds-deploy-role-*',
271
+ 'arn:aws:iam::*:role/cdk-hnb659fds-file-publishing-*',
272
+ 'arn:aws:iam::*:role/cdk-hnb659fds-lookup-role-*',
273
+ ],
274
+ },
275
+ ],
276
+ }),
277
+ CfnDeploy: aws_iam_1.PolicyDocument.fromJson({
278
+ Version: '2012-10-17',
279
+ Statement: [
280
+ {
281
+ Effect: 'Allow',
282
+ Action: ['*'],
283
+ Resource: [
284
+ `arn:aws:cloudformation:${props.env.region}:${props.env.account}:stack/*`,
285
+ ],
286
+ Condition: {
287
+ 'ForAnyValue:StringEquals': {
288
+ 'aws:CalledVia': 'cloudformation.amazonaws.com',
289
+ },
290
+ },
291
+ },
292
+ ],
293
+ }),
294
+ },
295
+ });
296
+ deployRole.node.defaultChild.overrideLogicalId('GlRunnerCDKDeployRole');
297
+ const glRunnerCdkDeployRoleArn = new aws_cdk_lib_1.CfnOutput(scope, 'GlRunnerCDKDeployRoleArn', {
298
+ value: deployRole.roleArn,
299
+ exportName: 'gl-runner-cdk-deploy-role-arn',
300
+ });
301
+ glRunnerCdkDeployRoleArn.overrideLogicalId('GlRunnerCDKDeployRoleArn');
302
+ const glRunnerCdkDeployRoleName = new aws_cdk_lib_1.CfnOutput(scope, 'GlRunnerCDKDeployRoleName', {
303
+ value: deployRole.roleName,
304
+ exportName: 'gl-runner-cdk-deploy-role-name',
305
+ });
306
+ glRunnerCdkDeployRoleName.overrideLogicalId('GlRunnerCDKDeployRoleName');
307
+ const glRunnerCdkCreateAndSignCertRoleName = new aws_cdk_lib_1.CfnOutput(scope, 'GlRunnerCDKCreateAndSignCertRoleName', {
308
+ value: createMSKCertRole.roleName,
309
+ exportName: 'gl-runner-cdk-create-and-sign-msk-cert-role-name',
310
+ });
311
+ glRunnerCdkCreateAndSignCertRoleName.overrideLogicalId('GlRunnerCDKCreateAndSignCertRoleName');
312
+ const glRunnerCdkCreateAndSignCertRoleArn = new aws_cdk_lib_1.CfnOutput(scope, 'GlRunnerCDKCreateAndSignCertRoleArn', {
313
+ value: createMSKCertRole.roleArn,
314
+ exportName: 'gl-runner-cdk-create-and-sign-msk-cert-role-arn',
315
+ });
316
+ glRunnerCdkCreateAndSignCertRoleArn.overrideLogicalId('GlRunnerCDKCreateAndSignCertRoleArn');
317
+ const glRunnerCdkPublishWebContentRoleName = new aws_cdk_lib_1.CfnOutput(scope, 'GlRunnerCDKPublishWebContentRoleName', {
318
+ value: webContentPublishRole.roleName,
319
+ exportName: 'gl-runner-cdk-publish-web-content-on-s3-role-name',
320
+ });
321
+ glRunnerCdkPublishWebContentRoleName.overrideLogicalId('GlRunnerCDKPublishWebContentRoleName');
322
+ const glRunnerCdkPublishWebContentRoleArn = new aws_cdk_lib_1.CfnOutput(scope, 'GlRunnerCDKPublishWebContentRoleArn', {
323
+ value: webContentPublishRole.roleArn,
324
+ exportName: 'gl-runner-cdk-publish-web-content-on-s3-role-arn',
325
+ });
326
+ glRunnerCdkPublishWebContentRoleArn.overrideLogicalId('GlRunnerCDKPublishWebContentRoleArn');
327
+ const glRunnerCdkDeployToEcrRoleName = new aws_cdk_lib_1.CfnOutput(scope, 'GlRunnerCDKDeployToEcrRoleName', {
328
+ value: ecrDeployRole.roleName,
329
+ exportName: 'gl-runner-cdk-deploy-to-ecr-role-name',
330
+ });
331
+ glRunnerCdkDeployToEcrRoleName.overrideLogicalId('GlRunnerCDKDeployToEcrRoleName');
332
+ const glRunnerCdkDeployToEcrRoleArn = new aws_cdk_lib_1.CfnOutput(scope, 'GlRunnerCDKDeployToEcrRoleArn', {
333
+ value: ecrDeployRole.roleArn,
334
+ exportName: 'gl-runner-cdk-deploy-to-ecr-role-arn',
335
+ });
336
+ glRunnerCdkDeployToEcrRoleArn.overrideLogicalId('GlRunnerCDKDeployToEcrRoleArn');
337
+ const glRunnerCdkSecretsBackupRoleName = new aws_cdk_lib_1.CfnOutput(scope, 'GlRunnerCDKSecretsBackupRoleName', {
338
+ value: secretsBackUpRole.roleName,
339
+ exportName: 'gl-runner-cdk-secrets-backup-role-name',
340
+ });
341
+ glRunnerCdkSecretsBackupRoleName.overrideLogicalId('GlRunnerCDKSecretsBackupRoleName');
342
+ const glRunnerCdkSecretsBackupRoleArn = new aws_cdk_lib_1.CfnOutput(scope, 'GlRunnerCDKSecretsBackupRoleArn', {
343
+ value: secretsBackUpRole.roleArn,
344
+ exportName: 'gl-runner-cdk-secrets-backup-role-arn',
345
+ });
346
+ glRunnerCdkSecretsBackupRoleArn.overrideLogicalId('GlRunnerCDKSecretsBackupRoleArn');
347
+ }
348
+ }
349
+ exports.RunnerRoles = RunnerRoles;
350
+ _a = JSII_RTTI_SYMBOL_1;
351
+ RunnerRoles[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.RunnerRoles", version: "0.0.0" };
352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLXJvbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbnRyaWJ1dGlvbnMvc21hcnQtcm91dGUvZ2l0bGFiLXJ1bm5lci9ydW5uZXItcm9sZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBZ0U7QUFDaEUsaURBQXNFO0FBQ3RFLGlEQU82QjtBQUM3QiwrQ0FBNEM7QUFDNUMsaURBQXNEO0FBQ3RELDJDQUF1QztBQUN2QyxnRUFBMkQ7QUFNM0Q7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsc0JBQVM7SUFFeEMsWUFBWSxLQUFZLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQzFELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsTUFBTSxvQkFBb0IsR0FBRyxpQ0FBYyxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNFLE1BQU0saUJBQWlCLEdBQUcsaUNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUzRSxNQUFNLG1CQUFtQixHQUFHLHlCQUFlLENBQUMsdUJBQXVCLENBQ2pFLElBQUksRUFDSixxQkFBcUIsRUFDckIsOEJBQThCLENBQy9CLENBQUM7UUFFRixNQUFNLDBCQUEwQixHQUM5Qix5QkFBZSxDQUFDLDZCQUE2QixDQUMzQyxJQUFJLEVBQ0osNEJBQTRCLEVBQzVCO1lBQ0UsYUFBYSxFQUFFLGtDQUFrQztTQUNsRCxDQUNGLENBQUM7UUFDSixNQUFNLGlCQUFpQixHQUFHLGVBQU0sQ0FBQyxjQUFjLENBQzdDLElBQUksRUFDSixtQkFBbUIsRUFDbkIsMEJBQTBCLENBQUMsV0FBVyxDQUN2QyxDQUFDO1FBRUYsTUFBTSxhQUFhLEdBQUcseUJBQWUsQ0FBQyw2QkFBNkIsQ0FDakUsSUFBSSxFQUNKLG9CQUFvQixFQUNwQjtZQUNFLGFBQWEsRUFBRSx5Q0FBeUM7U0FDekQsQ0FDRixDQUFDO1FB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LEdBQUcsSUFBSSx1QkFBUyxDQUNsRCxLQUFLLEVBQ0wsZ0NBQWdDLEVBQ2hDO1lBQ0UsS0FBSyxFQUFFLGFBQWEsQ0FBQyxRQUFRO1lBQzdCLFVBQVUsRUFBRSx1Q0FBdUM7U0FDcEQsQ0FDRixDQUFDO1FBQ0YsOEJBQThCLENBQUMsaUJBQWlCLENBQzlDLGdDQUFnQyxDQUNqQyxDQUFDO1FBQ0YsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLHVCQUFTLENBQ2pELEtBQUssRUFDTCwrQkFBK0IsRUFDL0I7WUFDRSxLQUFLLEVBQUUsYUFBYSxDQUFDLE9BQU87WUFDNUIsVUFBVSxFQUFFLHNDQUFzQztTQUNuRCxDQUNGLENBQUM7UUFDRiw2QkFBNkIsQ0FBQyxpQkFBaUIsQ0FDN0MsK0JBQStCLENBQ2hDLENBQUM7UUFFRixNQUFNLGdDQUFnQyxHQUFHLElBQUksdUJBQVMsQ0FDcEQsS0FBSyxFQUNMLGtDQUFrQyxFQUNsQztZQUNFLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxRQUFRO1lBQ2pDLFVBQVUsRUFBRSx3Q0FBd0M7U0FDckQsQ0FDRixDQUFDO1FBQ0YsZ0NBQWdDLENBQUMsaUJBQWlCLENBQ2hELGtDQUFrQyxDQUNuQyxDQUFDO1FBQ0YsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLHVCQUFTLENBQ25ELEtBQUssRUFDTCxpQ0FBaUMsRUFDakM7WUFDRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsT0FBTztZQUNoQyxVQUFVLEVBQUUsdUNBQXVDO1NBQ3BELENBQ0YsQ0FBQztRQUNGLCtCQUErQixDQUFDLGlCQUFpQixDQUMvQyxpQ0FBaUMsQ0FDbEMsQ0FBQztJQUNKLENBQUM7O0FBcmJILGtDQXNiQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCwgRW52aXJvbm1lbnQsIEZuLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IFB1YmxpY0dhbGxlcnlBdXRob3JpemF0aW9uVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyJztcbmltcG9ydCB7XG4gIENmblJvbGUsXG4gIE1hbmFnZWRQb2xpY3ksXG4gIFBvbGljeURvY3VtZW50LFxuICBQb2xpY3lTdGF0ZW1lbnQsXG4gIFJvbGUsXG4gIFNlcnZpY2VQcmluY2lwYWwsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IFN0cmluZ1BhcmFtZXRlciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zc20nO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBSaW9MYW5kaW5nWm9uZSB9IGZyb20gJy4uLy4uLy4uL3Jpby1sYW5kaW5nLXpvbmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bm5lclJvbGVQcm9wcyB7XG4gIHJlYWRvbmx5IGVudjogRW52aXJvbm1lbnQ7XG59XG5cbi8qKlxuICogVGhpcyBjb25zdHJ1Y3QgcHJvdmlkZXMgYSBzZXQgb2YgYmFzZSByb2xlcyBmb3IgZ2l0bGFiIHJ1bm5lcnMgaW4gb3JkZXIgdG8gYnVpbGQsIHRlc3QsIHZhbGlkYXRlIGFuZCBkZXBsb3kgYXBwbGljYXRpb25zXG4gKiBvbiBSSU8uIFRoZSByb2xlcyBuZWVkIHRvIGJlIGFzc3VtZWQgZHVyaW5nIGpvYiBydW50aW1lIHRvIHBlcmZvcm0gbW9yZSBwZXJtaXNzaXZlIGFjdGlvbnMsIHN1Y2ggYXMgY3JlYXRpbmcgY2VydGlmaWNhdGVzIHRvXG4gKiBhdXRoZW50aWNhdGUgdG93YXJkcyB0aGUgUklPIE1TSywgcHVzaGluZyBkb2NrZXIgaW1hZ2VzIHRvIEVDUiwgcGVyZm9ybWluZyBhIHNlY3JldHMgYmFja3VwLCBkZXBsb3lpbmcgc3RhY2tzLFxuICogb3IgdG8gcHVibGlzaCBhbiBTUEEgdG8gYSBTMyBidWNrZXQuIERvIG5vdCBhc3N1bWUgdGhlIGRlcGxveW1lbnQgcm9sZSB1bmxlc3MgbmVlZGVkLlxuICogVGhlIGJhc2Ugcm9sZSBjYW4gYmUgdGhlIGRlZmF1bHQgcm9sZSBhdHRhY2hlZCB0byBHaXRMYWIgcnVubmVycy5cbiAqIFRoZSByb2xlIGFsbG93cyB0byByZWFkIHZhcmlvdXMgYmFzaWMgcGFyYW1ldGVycyBzdWNoIGFzIHRoZSBOSVNUIGRhdGEgbWlycm9yLCB0aGUgT1NTIGxpY2Vuc2UgYnVja2V0LCBEYXRhRG9nIGtleXNcbiAqIGFuZCB0byBwdWxsIEVDUiBpbWFnZXMgZm9ybSBwdWJsaWMgR2FsbGVyeSBvciB0aGUgc3BlY2lmaWVkIGFjY291bnQgaW4gdGhlIGVudmlyb25tZW50LlxuICogVGhlIFJvbGUgQVJOcyBhcmUgZXhwb3J0IHVzaW5nIENGTk91dHB1dHMuIFVzZSB0aGUgb3V0cHV0cyB0byBjb25maWd1cmUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIHlvdXIgR2l0TGFiIGdyb3VwLlxuICovXG5leHBvcnQgY2xhc3MgUnVubmVyUm9sZXMgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICByZWFkb25seSBydW5uZXJCYXNlUm9sZTogUm9sZTtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IFN0YWNrLCBpZDogc3RyaW5nLCBwcm9wczogUnVubmVyUm9sZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICBjb25zdCBhY2NvdW50TmFtZVBhcmFtZXRlciA9IFJpb0xhbmRpbmdab25lLmdldEFjY291bnROYW1lUGFyYW1ldGVyKHNjb3BlKTtcbiAgICBjb25zdCB0ZWFtTmFtZVBhcmFtZXRlciA9IFJpb0xhbmRpbmdab25lLmdldFRlYW1JZGVudGlmaWVyUGFyYW1ldGVyKHNjb3BlKTtcblxuICAgIGNvbnN0IG5pc3RNaXJyb3JQYXJhbWV0ZXIgPSBTdHJpbmdQYXJhbWV0ZXIuZnJvbVN0cmluZ1BhcmFtZXRlck5hbWUoXG4gICAgICB0aGlzLFxuICAgICAgJ05pc3RNaXJyb3JQYXJhbWV0ZXInLFxuICAgICAgJy9jb25maWcvbmlzdC1kYXRhLW1pcnJvci91cmwnLFxuICAgICk7XG5cbiAgICBjb25zdCBvc3NMaWNlbnNlc0J1Y2tldFBhcmFtZXRlciA9XG4gICAgICBTdHJpbmdQYXJhbWV0ZXIuZnJvbVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMoXG4gICAgICAgIHRoaXMsXG4gICAgICAgICdPc3NMaWNlbnNlc0J1Y2tldFBhcmFtZXRlcicsXG4gICAgICAgIHtcbiAgICAgICAgICBwYXJhbWV0ZXJOYW1lOiAnL2NvbmZpZy9vc3MtbGljZW5zZXMvYnVja2V0LW5hbWUnLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICBjb25zdCBvc3NMaWNlbnNlc0J1Y2tldCA9IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShcbiAgICAgIHRoaXMsXG4gICAgICAnT3NzTGljZW5zZXNCdWNrZXQnLFxuICAgICAgb3NzTGljZW5zZXNCdWNrZXRQYXJhbWV0ZXIuc3RyaW5nVmFsdWUsXG4gICAgKTtcblxuICAgIGNvbnN0IGRkQXBpS2V5UGFyYW0gPSBTdHJpbmdQYXJhbWV0ZXIuZnJvbVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMoXG4gICAgICB0aGlzLFxuICAgICAgJ0RhdGFEb2dBcGlLZXlQYXJhbScsXG4gICAgICB7XG4gICAgICAgIHBhcmFtZXRlck5hbWU6ICcvcmlvL2NvbmZpZy9kYXRhZG9nLWludGVncmF0aW9uL2FwaS1rZXknLFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IGRkU2l0ZVBhcmFtID0gU3RyaW5nUGFyYW1ldGVyLmZyb21TdHJpbmdQYXJhbWV0ZXJBdHRyaWJ1dGVzKFxuICAgICAgdGhpcyxcbiAgICAgICdEYXRhRG9nU2l0ZVBhcmFtJyxcbiAgICAgIHtcbiAgICAgICAgcGFyYW1ldGVyTmFtZTogJy9yaW8vY29uZmlnL2RhdGFkb2ctaW50ZWdyYXRpb24vc2l0ZScsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBrYWZrYUludGVncmF0aW9uUG9saWN5ID0gTWFuYWdlZFBvbGljeS5mcm9tTWFuYWdlZFBvbGljeUFybihcbiAgICAgIHRoaXMsXG4gICAgICAnS2Fma2FJbnRlZ3JhdGlvblBvbGljeScsXG4gICAgICBGbi5pbXBvcnRWYWx1ZSgna2Fma2EtaW50ZWdyYXRpb24tcG9saWN5LWFybicpLFxuICAgICk7XG5cbiAgICB0aGlzLnJ1bm5lckJhc2VSb2xlID0gbmV3IFJvbGUodGhpcywgJ0dsUnVubmVyQnVpbGRSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnZWMyLmFtYXpvbmF3cy5jb20nLCB7fSksXG4gICAgICBpbmxpbmVQb2xpY2llczoge1xuICAgICAgICBDZGtTeW50aExvb2tVcDogUG9saWN5RG9jdW1lbnQuZnJvbUpzb24oe1xuICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcbiAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgICBBY3Rpb246IFsnczM6Kk9iamVjdCcsICdzMzpMaXN0QnVja2V0JywgJ3MzOkdldEJ1Y2tldExvY2F0aW9uJ10sXG4gICAgICAgICAgICAgIFJlc291cmNlOiBbJ2Fybjphd3M6czM6OjpjZGt0b29sa2l0LSonXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFNpZDogJ2Fzc3VtZXJvbGUnLFxuICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICAgIEFjdGlvbjogWydzdHM6QXNzdW1lUm9sZScsICdpYW06UGFzc1JvbGUnXSxcbiAgICAgICAgICAgICAgUmVzb3VyY2U6IFtcbiAgICAgICAgICAgICAgICAnYXJuOmF3czppYW06Oio6cm9sZS9jZGstcmVhZE9ubHlSb2xlJyxcbiAgICAgICAgICAgICAgICAnYXJuOmF3czppYW06Oio6cm9sZS9jZGstaG5iNjU5ZmRzLWxvb2t1cC1yb2xlLSonLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgU2lkOiAncHVsbEVjckltYWdlcycsXG4gICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgQWN0aW9uOiBbXG4gICAgICAgICAgICAgICAgJ2VjcjpCYXRjaENoZWNrTGF5ZXJBdmFpbGFiaWxpdHknLFxuICAgICAgICAgICAgICAgICdlY3I6QmF0Y2hHZXRJbWFnZScsXG4gICAgICAgICAgICAgICAgJ2VjcjpEZXNjcmliZUltYWdlcycsXG4gICAgICAgICAgICAgICAgJ2VjcjpEZXNjcmliZVJlcG9zaXRvcmllcycsXG4gICAgICAgICAgICAgICAgJ2VjcjpHZXREb3dubG9hZFVybEZvckxheWVyJyxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgUmVzb3VyY2U6IFtcbiAgICAgICAgICAgICAgICBgJHtwcm9wcy5lbnYuYWNjb3VudH0uZGtyLmVjci4ke3Byb3BzLmVudi5yZWdpb259LmFtYXpvbmF3cy5jb20vKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICAodGhpcy5ydW5uZXJCYXNlUm9sZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5Sb2xlKS5vdmVycmlkZUxvZ2ljYWxJZChcbiAgICAgICdHbFJ1bm5lckJ1aWxkUm9sZScsXG4gICAgKTtcbiAgICBuaXN0TWlycm9yUGFyYW1ldGVyLmdyYW50UmVhZCh0aGlzLnJ1bm5lckJhc2VSb2xlKTtcbiAgICBvc3NMaWNlbnNlc0J1Y2tldFBhcmFtZXRlci5ncmFudFJlYWQodGhpcy5ydW5uZXJCYXNlUm9sZSk7XG4gICAgb3NzTGljZW5zZXNCdWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5ydW5uZXJCYXNlUm9sZSk7XG4gICAgYWNjb3VudE5hbWVQYXJhbWV0ZXIuZ3JhbnRSZWFkKHRoaXMucnVubmVyQmFzZVJvbGUpO1xuICAgIHRlYW1OYW1lUGFyYW1ldGVyLmdyYW50UmVhZCh0aGlzLnJ1bm5lckJhc2VSb2xlKTtcbiAgICBkZEFwaUtleVBhcmFtLmdyYW50UmVhZCh0aGlzLnJ1bm5lckJhc2VSb2xlKTtcbiAgICBkZFNpdGVQYXJhbS5ncmFudFJlYWQodGhpcy5ydW5uZXJCYXNlUm9sZSk7XG4gICAgUHVibGljR2FsbGVyeUF1dGhvcml6YXRpb25Ub2tlbi5ncmFudFJlYWQodGhpcy5ydW5uZXJCYXNlUm9sZSk7XG5cbiAgICBjb25zdCB3ZWJDb250ZW50UHVibGlzaFJvbGUgPSBuZXcgUm9sZShcbiAgICAgIHRoaXMsXG4gICAgICAnR2xSdW5uZXJTM1dlYkNvbnRlbnREZXBsb3lSb2xlJyxcbiAgICAgIHtcbiAgICAgICAgcm9sZU5hbWU6ICdnbC1ydW5uZXItd2ViLWNvbnRlbnQtczMtZGVwbG95LXJvbGUnLFxuICAgICAgICBhc3N1bWVkQnk6IHRoaXMucnVubmVyQmFzZVJvbGUsXG4gICAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgICAgUHVibGlzaFdlYkNvbnRlbnRPblMzOiBQb2xpY3lEb2N1bWVudC5mcm9tSnNvbih7XG4gICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgICBBY3Rpb246IFtcbiAgICAgICAgICAgICAgICAgICdzMzpBYm9ydConLFxuICAgICAgICAgICAgICAgICAgJ3MzOkRlbGV0ZU9iamVjdConLFxuICAgICAgICAgICAgICAgICAgJ3MzOkdldEJ1Y2tldConLFxuICAgICAgICAgICAgICAgICAgJ3MzOkdldE9iamVjdConLFxuICAgICAgICAgICAgICAgICAgJ3MzOkxpc3QqJyxcbiAgICAgICAgICAgICAgICAgICdzMzpQdXRPYmplY3QnLFxuICAgICAgICAgICAgICAgICAgJ3MzOlB1dE9iamVjdExlZ2FsSG9sZCcsXG4gICAgICAgICAgICAgICAgICAnczM6UHV0T2JqZWN0UmV0ZW50aW9uJyxcbiAgICAgICAgICAgICAgICAgICdzMzpQdXRPYmplY3RUYWdnaW5nJyxcbiAgICAgICAgICAgICAgICAgICdzMzpQdXRPYmplY3RWZXJzaW9uVGFnZ2luZycsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBSZXNvdXJjZTogWydhcm46YXdzOnMzOjo6KiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgQWN0aW9uOiBbXG4gICAgICAgICAgICAgICAgICAnc3NtOkRlc2NyaWJlUGFyYW1ldGVycycsXG4gICAgICAgICAgICAgICAgICAnc3NtOkdldFBhcmFtZXRlcicsXG4gICAgICAgICAgICAgICAgICAnc3NtOkdldFBhcmFtZXRlckhpc3RvcnknLFxuICAgICAgICAgICAgICAgICAgJ3NzbTpHZXRQYXJhbWV0ZXJzJyxcbiAgICAgICAgICAgICAgICAgICdzc206R2V0UGFyYW1ldGVyc0J5UGF0aCcsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6IFtcbiAgICAgICAgICAgICAgICAgIGBhcm46YXdzOnNzbToke3Byb3BzLmVudi5yZWdpb259OiR7cHJvcHMuZW52LmFjY291bnR9OnBhcmFtZXRlci9jb25maWcvKmAsXG4gICAgICAgICAgICAgICAgICBgYXJuOmF3czpzc206JHtwcm9wcy5lbnYucmVnaW9ufToke3Byb3BzLmVudi5hY2NvdW50fTpwYXJhbWV0ZXIvc2VjcmV0LypgLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICAgICh3ZWJDb250ZW50UHVibGlzaFJvbGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuUm9sZSkub3ZlcnJpZGVMb2dpY2FsSWQoXG4gICAgICAnR2xSdW5uZXJTM1dlYkNvbnRlbnREZXBsb3lSb2xlJyxcbiAgICApO1xuXG4gICAgY29uc3QgY3JlYXRlTVNLQ2VydFJvbGUgPSBuZXcgUm9sZSh0aGlzLCAnR2xSdW5uZXJDcmVhdGVBbmRTaWduQ2VydFJvbGUnLCB7XG4gICAgICByb2xlTmFtZTogJ2dsLXJ1bm5lci1jcmVhdGUtYW5kLXNpZ24tcmlvLW1zay1jZXJ0LXJvbGUnLFxuICAgICAgYXNzdW1lZEJ5OiB0aGlzLnJ1bm5lckJhc2VSb2xlLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgUGFyYW1ldGVyU3RvcmVSZWFkS2V5U3RvcmU6IFBvbGljeURvY3VtZW50LmZyb21Kc29uKHtcbiAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXG4gICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIEFjdGlvbjogW1xuICAgICAgICAgICAgICAgICdzc206RGVzY3JpYmVQYXJhbWV0ZXJzJyxcbiAgICAgICAgICAgICAgICAnc3NtOkdldFBhcmFtZXRlcicsXG4gICAgICAgICAgICAgICAgJ3NzbTpHZXRQYXJhbWV0ZXJIaXN0b3J5JyxcbiAgICAgICAgICAgICAgICAnc3NtOkdldFBhcmFtZXRlcnMnLFxuICAgICAgICAgICAgICAgICdzc206R2V0UGFyYW1ldGVyc0J5UGF0aCcsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgUmVzb3VyY2U6IFtcbiAgICAgICAgICAgICAgICBgYXJuOmF3czpzc206JHtwcm9wcy5lbnYucmVnaW9ufToke3Byb3BzLmVudi5hY2NvdW50fTpwYXJhbWV0ZXIvY29uZmlnLypgLFxuICAgICAgICAgICAgICAgIGBhcm46YXdzOnNzbToke3Byb3BzLmVudi5yZWdpb259OiR7cHJvcHMuZW52LmFjY291bnR9OnBhcmFtZXRlci9zZWNyZXQvKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgICBTZWNyZXRzTWFuYWdlclJlYWRLZXlTdG9yZTogUG9saWN5RG9jdW1lbnQuZnJvbUpzb24oe1xuICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcbiAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgQWN0aW9uOiBbXG4gICAgICAgICAgICAgICAgJ3NlY3JldHNtYW5hZ2VyOkRlc2NyaWJlU2VjcmV0JyxcbiAgICAgICAgICAgICAgICAnc2VjcmV0c21hbmFnZXI6R2V0U2VjcmV0VmFsdWUnLFxuICAgICAgICAgICAgICAgICdzZWNyZXRzbWFuYWdlcjpHZXRSZXNvdXJjZVBvbGljeScsXG4gICAgICAgICAgICAgICAgJ3NlY3JldHNtYW5hZ2VyOkxpc3RTZWNyZXRWZXJzaW9uSWRzJyxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgICBSZXNvdXJjZTogW1xuICAgICAgICAgICAgICAgIGBhcm46YXdzOnNlY3JldHNtYW5hZ2VyOiR7cHJvcHMuZW52LnJlZ2lvbn06JHtwcm9wcy5lbnYuYWNjb3VudH06c2VjcmV0Oi9zZWNyZXQvKi9zZXJ2aWNlLWtleXN0b3JlLXBhc3N3b3JkLT8/Pz8/P2AsXG4gICAgICAgICAgICAgICAgYGFybjphd3M6c2VjcmV0c21hbmFnZXI6JHtwcm9wcy5lbnYucmVnaW9ufToke3Byb3BzLmVudi5hY2NvdW50fTpzZWNyZXQ6L3NlY3JldC8qL3NlcnZpY2Uta2V5c3RvcmUtcGFzc3dvcmRgLFxuICAgICAgICAgICAgICAgIGBhcm46YXdzOnNlY3JldHNtYW5hZ2VyOiR7cHJvcHMuZW52LnJlZ2lvbn06JHtwcm9wcy5lbnYuYWNjb3VudH06c2VjcmV0Oi9jb25maWcvKi9zZXJ2aWNlLWtleXN0b3JlLXBhc3N3b3JkLT8/Pz8/P2AsXG4gICAgICAgICAgICAgICAgYGFybjphd3M6c2VjcmV0c21hbmFnZXI6JHtwcm9wcy5lbnYucmVnaW9ufToke3Byb3BzLmVudi5hY2NvdW50fTpzZWNyZXQ6L2NvbmZpZy8qL3NlcnZpY2Uta2V5c3RvcmUtcGFzc3dvcmRgLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtrYWZrYUludGVncmF0aW9uUG9saWN5XSxcbiAgICB9KTtcbiAgICBhY2NvdW50TmFtZVBhcmFtZXRlci5ncmFudFJlYWQoY3JlYXRlTVNLQ2VydFJvbGUpO1xuICAgIHRlYW1OYW1lUGFyYW1ldGVyLmdyYW50UmVhZCh0aGlzLnJ1bm5lckJhc2VSb2xlKTtcbiAgICAoY3JlYXRlTVNLQ2VydFJvbGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuUm9sZSkub3ZlcnJpZGVMb2dpY2FsSWQoXG4gICAgICAnR2xSdW5uZXJDcmVhdGVBbmRTaWduQ2VydFJvbGUnLFxuICAgICk7XG5cbiAgICBjb25zdCBlY3JEZXBsb3lSb2xlID0gbmV3IFJvbGUodGhpcywgJ0dsUnVubmVyRUNSRGVwbG95Um9sZScsIHtcbiAgICAgIHJvbGVOYW1lOiAnZ2wtcnVubmVyLWRlcGxveS10by1lY3Itcm9sZScsXG4gICAgICBhc3N1bWVkQnk6IHRoaXMucnVubmVyQmFzZVJvbGUsXG4gICAgICBpbmxpbmVQb2xpY2llczoge1xuICAgICAgICBEZXBsb3lUb0VDUjogUG9saWN5RG9jdW1lbnQuZnJvbUpzb24oe1xuICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcbiAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgQWN0aW9uOiBbXG4gICAgICAgICAgICAgICAgJ2VjcjpCYXRjaENoZWNrTGF5ZXJBdmFpbGFiaWxpdHknLFxuICAgICAgICAgICAgICAgICdlY3I6QmF0Y2hHZXRJbWFnZScsXG4gICAgICAgICAgICAgICAgJ2VjcjpDb21wbGV0ZUxheWVyVXBsb2FkJyxcbiAgICAgICAgICAgICAgICAnZWNyOkdldERvd25sb2FkVXJsRm9yTGF5ZXInLFxuICAgICAgICAgICAgICAgICdlY3I6SW5pdGlhdGVMYXllclVwbG9hZCcsXG4gICAgICAgICAgICAgICAgJ2VjcjpQdXRJbWFnZScsXG4gICAgICAgICAgICAgICAgJ2VjcjpVcGxvYWRMYXllclBhcnQnLFxuICAgICAgICAgICAgICAgICdlY3I6R2V0QXV0aG9yaXphdGlvblRva2VuJyxcbiAgICAgICAgICAgICAgICAnZWNyOkRlc2NyaWJlUmVwb3NpdG9yaWVzJyxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgICBSZXNvdXJjZTogW1xuICAgICAgICAgICAgICAgIGAke3Byb3BzLmVudi5hY2NvdW50fS5ka3IuZWNyLiR7cHJvcHMuZW52LnJlZ2lvbn0uYW1hem9uYXdzLmNvbS8qYCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIFB1YmxpY0dhbGxlcnlBdXRob3JpemF0aW9uVG9rZW4uZ3JhbnRSZWFkKGVjckRlcGxveVJvbGUpO1xuICAgIChlY3JEZXBsb3lSb2xlLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmblJvbGUpLm92ZXJyaWRlTG9naWNhbElkKFxuICAgICAgJ0dsUnVubmVyRUNSRGVwbG95Um9sZScsXG4gICAgKTtcblxuICAgIGNvbnN0IGlhbVBvbGljeUtNUyA9IG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgYWN0aW9uczogWydrbXM6RGVjcnlwdCddLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICdhcm46YXdzOmttczoqOjkwMzQwNDM4NjU1MDprZXkvKicsXG4gICAgICAgIGBhcm46YXdzOmttczoqOiR7cHJvcHMuZW52LmFjY291bnR9OmtleS8qYCxcbiAgICAgIF0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICdGb3JBbnlWYWx1ZTpTdHJpbmdMaWtlJzoge1xuICAgICAgICAgICdrbXM6UmVzb3VyY2VBbGlhc2VzJzogJ2FsaWFzL3Jpby1sei1iYWNrdXAta2V5KicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGlhbVBvbGljeUxhbWJkYUV4ZWN1dGlvbiA9IG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgYWN0aW9uczogWydsYW1iZGE6SW52b2tlRnVuY3Rpb24nXSxcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICBgYXJuOmF3czpsYW1iZGE6ZXUtd2VzdC0xOiR7cHJvcHMuZW52LmFjY291bnR9OmZ1bmN0aW9uOlNlY3JldHNSZXN0b3JlSGFuZGxlcmAsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGNvbnN0IHNlY3JldHNCYWNrVXBSb2xlID0gbmV3IFJvbGUodGhpcywgJ0dsUnVubmVyU2VjcmV0c0JhY2t1cFJvbGUnLCB7XG4gICAgICByb2xlTmFtZTogJ2dsLXJ1bm5lci1zZWNyZXRzLWJhY2t1cC1yb2xlJyxcbiAgICAgIGFzc3VtZWRCeTogdGhpcy5ydW5uZXJCYXNlUm9sZSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIFNlY3JldHNCYWNrdXA6IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW2lhbVBvbGljeUtNUywgaWFtUG9saWN5TGFtYmRhRXhlY3V0aW9uXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIChzZWNyZXRzQmFja1VwUm9sZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5Sb2xlKS5vdmVycmlkZUxvZ2ljYWxJZChcbiAgICAgICdHbFJ1bm5lclNlY3JldHNCYWNrdXBSb2xlJyxcbiAgICApO1xuXG4gICAgY29uc3QgZGVwbG95Um9sZSA9IG5ldyBSb2xlKHRoaXMsICdHbFJ1bm5lckNES0RlcGxveVJvbGUnLCB7XG4gICAgICByb2xlTmFtZTogJ2dsLXJ1bm5lci1jZGstZGVwbG95LXJvbGUnLFxuICAgICAgYXNzdW1lZEJ5OiB0aGlzLnJ1bm5lckJhc2VSb2xlLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBba2Fma2FJbnRlZ3JhdGlvblBvbGljeV0sIC8vIHJlcXVpcmVkIHRvIGNyZWF0ZSBLYWZrYSB0b3BpY3MgYW5kIHB1Ymxpc2ggZXZlbnQgc3BlY2lmaWNhdGlvbiBpbiBkZXBsb3kgam9ic1xuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgQ2RrRGVwbG95OiBQb2xpY3lEb2N1bWVudC5mcm9tSnNvbih7XG4gICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxuICAgICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICAgIEFjdGlvbjogW1xuICAgICAgICAgICAgICAgICdjbG91ZGZvcm1hdGlvbjpEZXNjcmliZVN0YWNrcycsXG4gICAgICAgICAgICAgICAgJ2Nsb3VkZm9ybWF0aW9uOkNyZWF0ZUNoYW5nZVNldCcsXG4gICAgICAgICAgICAgICAgJ2Nsb3VkZm9ybWF0aW9uOkRlc2NyaWJlQ2hhbmdlU2V0JyxcbiAgICAgICAgICAgICAgICAnY2xvdWRmb3JtYXRpb246RXhlY3V0ZUNoYW5nZVNldCcsXG4gICAgICAgICAgICAgICAgJ2Nsb3VkZm9ybWF0aW9uOkRlc2NyaWJlU3RhY2tFdmVudHMnLFxuICAgICAgICAgICAgICAgICdjbG91ZGZvcm1hdGlvbjpEZWxldGVDaGFuZ2VTZXQnLFxuICAgICAgICAgICAgICAgICdjbG91ZGZvcm1hdGlvbjpHZXRUZW1wbGF0ZScsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIFJlc291cmNlOiBbXG4gICAgICAgICAgICAgICAgYGFybjphd3M6Y2xvdWRmb3JtYXRpb246JHtwcm9wcy5lbnYucmVnaW9ufToke3Byb3BzLmVudi5hY2NvdW50fTpzdGFjay8qYCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgQWN0aW9uOiBbJ3MzOipPYmplY3QnLCAnczM6TGlzdEJ1Y2tldCcsICdzMzpHZXRCdWNrZXRMb2NhdGlvbiddLFxuICAgICAgICAgICAgICBSZXNvdXJjZTogWydhcm46YXdzOnMzOjo6Y2RrdG9vbGtpdC0qJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBTaWQ6ICdhc3N1bWVyb2xlJyxcbiAgICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgICBBY3Rpb246IFsnc3RzOkFzc3VtZVJvbGUnLCAnaWFtOlBhc3NSb2xlJ10sXG4gICAgICAgICAgICAgIFJlc291cmNlOiBbXG4gICAgICAgICAgICAgICAgJ2Fybjphd3M6aWFtOjoqOnJvbGUvY2RrLXJlYWRPbmx5Um9sZScsXG4gICAgICAgICAgICAgICAgJ2Fybjphd3M6aWFtOjoqOnJvbGUvY2RrLWhuYjY1OWZkcy1kZXBsb3ktcm9sZS0qJyxcbiAgICAgICAgICAgICAgICAnYXJuOmF3czppYW06Oio6cm9sZS9jZGstaG5iNjU5ZmRzLWZpbGUtcHVibGlzaGluZy0qJyxcbiAgICAgICAgICAgICAgICAnYXJuOmF3czppYW06Oio6cm9sZS9jZGstaG5iNjU5ZmRzLWxvb2t1cC1yb2xlLSonLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgICAgQ2ZuRGVwbG95OiBQb2xpY3lEb2N1bWVudC5mcm9tSnNvbih7XG4gICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxuICAgICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICAgIEFjdGlvbjogWycqJ10sXG4gICAgICAgICAgICAgIFJlc291cmNlOiBbXG4gICAgICAgICAgICAgICAgYGFybjphd3M6Y2xvdWRmb3JtYXRpb246JHtwcm9wcy5lbnYucmVnaW9ufToke3Byb3BzLmVudi5hY2NvdW50fTpzdGFjay8qYCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgQ29uZGl0aW9uOiB7XG4gICAgICAgICAgICAgICAgJ0ZvckFueVZhbHVlOlN0cmluZ0VxdWFscyc6IHtcbiAgICAgICAgICAgICAgICAgICdhd3M6Q2FsbGVkVmlhJzogJ2Nsb3VkZm9ybWF0aW9uLmFtYXpvbmF3cy5jb20nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICAoZGVwbG95Um9sZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5Sb2xlKS5vdmVycmlkZUxvZ2ljYWxJZChcbiAgICAgICdHbFJ1bm5lckNES0RlcGxveVJvbGUnLFxuICAgICk7XG5cbiAgICBjb25zdCBnbFJ1bm5lckNka0RlcGxveVJvbGVBcm4gPSBuZXcgQ2ZuT3V0cHV0KFxuICAgICAgc2NvcGUsXG4gICAgICAnR2xSdW5uZXJDREtEZXBsb3lSb2xlQXJuJyxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IGRlcGxveVJvbGUucm9sZUFybixcbiAgICAgICAgZXhwb3J0TmFtZTogJ2dsLXJ1bm5lci1jZGstZGVwbG95LXJvbGUtYXJuJyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBnbFJ1bm5lckNka0RlcGxveVJvbGVBcm4ub3ZlcnJpZGVMb2dpY2FsSWQoJ0dsUnVubmVyQ0RLRGVwbG95Um9sZUFybicpO1xuICAgIGNvbnN0IGdsUnVubmVyQ2RrRGVwbG95Um9sZU5hbWUgPSBuZXcgQ2ZuT3V0cHV0KFxuICAgICAgc2NvcGUsXG4gICAgICAnR2xSdW5uZXJDREtEZXBsb3lSb2xlTmFtZScsXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiBkZXBsb3lSb2xlLnJvbGVOYW1lLFxuICAgICAgICBleHBvcnROYW1lOiAnZ2wtcnVubmVyLWNkay1kZXBsb3ktcm9sZS1uYW1lJyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBnbFJ1bm5lckNka0RlcGxveVJvbGVOYW1lLm92ZXJyaWRlTG9naWNhbElkKCdHbFJ1bm5lckNES0RlcGxveVJvbGVOYW1lJyk7XG5cbiAgICBjb25zdCBnbFJ1bm5lckNka0NyZWF0ZUFuZFNpZ25DZXJ0Um9sZU5hbWUgPSBuZXcgQ2ZuT3V0cHV0KFxuICAgICAgc2NvcGUsXG4gICAgICAnR2xSdW5uZXJDREtDcmVhdGVBbmRTaWduQ2VydFJvbGVOYW1lJyxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IGNyZWF0ZU1TS0NlcnRSb2xlLnJvbGVOYW1lLFxuICAgICAgICBleHBvcnROYW1lOiAnZ2wtcnVubmVyLWNkay1jcmVhdGUtYW5kLXNpZ24tbXNrLWNlcnQtcm9sZS1uYW1lJyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBnbFJ1bm5lckNka0NyZWF0ZUFuZFNpZ25DZXJ0Um9sZU5hbWUub3ZlcnJpZGVMb2dpY2FsSWQoXG4gICAgICAnR2xSdW5uZXJDREtDcmVhdGVBbmRTaWduQ2VydFJvbGVOYW1lJyxcbiAgICApO1xuICAgIGNvbnN0IGdsUnVubmVyQ2RrQ3JlYXRlQW5kU2lnbkNlcnRSb2xlQXJuID0gbmV3IENmbk91dHB1dChcbiAgICAgIHNjb3BlLFxuICAgICAgJ0dsUnVubmVyQ0RLQ3JlYXRlQW5kU2lnbkNlcnRSb2xlQXJuJyxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IGNyZWF0ZU1TS0NlcnRSb2xlLnJvbGVBcm4sXG4gICAgICAgIGV4cG9ydE5hbWU6ICdnbC1ydW5uZXItY2RrLWNyZWF0ZS1hbmQtc2lnbi1tc2stY2VydC1yb2xlLWFybicsXG4gICAgICB9LFxuICAgICk7XG4gICAgZ2xSdW5uZXJDZGtDcmVhdGVBbmRTaWduQ2VydFJvbGVBcm4ub3ZlcnJpZGVMb2dpY2FsSWQoXG4gICAgICAnR2xSdW5uZXJDREtDcmVhdGVBbmRTaWduQ2VydFJvbGVBcm4nLFxuICAgICk7XG5cbiAgICBjb25zdCBnbFJ1bm5lckNka1B1Ymxpc2hXZWJDb250ZW50Um9sZU5hbWUgPSBuZXcgQ2ZuT3V0cHV0KFxuICAgICAgc2NvcGUsXG4gICAgICAnR2xSdW5uZXJDREtQdWJsaXNoV2ViQ29udGVudFJvbGVOYW1lJyxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHdlYkNvbnRlbnRQdWJsaXNoUm9sZS5yb2xlTmFtZSxcbiAgICAgICAgZXhwb3J0TmFtZTogJ2dsLXJ1bm5lci1jZGstcHVibGlzaC13ZWItY29udGVudC1vbi1zMy1yb2xlLW5hbWUnLFxuICAgICAgfSxcbiAgICApO1xuICAgIGdsUnVubmVyQ2RrUHVibGlzaFdlYkNvbnRlbnRSb2xlTmFtZS5vdmVycmlkZUxvZ2ljYWxJZChcbiAgICAgICdHbFJ1bm5lckNES1B1Ymxpc2hXZWJDb250ZW50Um9sZU5hbWUnLFxuICAgICk7XG4gICAgY29uc3QgZ2xSdW5uZXJDZGtQdWJsaXNoV2ViQ29udGVudFJvbGVBcm4gPSBuZXcgQ2ZuT3V0cHV0KFxuICAgICAgc2NvcGUsXG4gICAgICAnR2xSdW5uZXJDREtQdWJsaXNoV2ViQ29udGVudFJvbGVBcm4nLFxuICAgICAge1xuICAgICAgICB2YWx1ZTogd2ViQ29udGVudFB1Ymxpc2hSb2xlLnJvbGVBcm4sXG4gICAgICAgIGV4cG9ydE5hbWU6ICdnbC1ydW5uZXItY2RrLXB1Ymxpc2gtd2ViLWNvbnRlbnQtb24tczMtcm9sZS1hcm4nLFxuICAgICAgfSxcbiAgICApO1xuICAgIGdsUnVubmVyQ2RrUHVibGlzaFdlYkNvbnRlbnRSb2xlQXJuLm92ZXJyaWRlTG9naWNhbElkKFxuICAgICAgJ0dsUnVubmVyQ0RLUHVibGlzaFdlYkNvbnRlbnRSb2xlQXJuJyxcbiAgICApO1xuXG4gICAgY29uc3QgZ2xSdW5uZXJDZGtEZXBsb3lUb0VjclJvbGVOYW1lID0gbmV3IENmbk91dHB1dChcbiAgICAgIHNjb3BlLFxuICAgICAgJ0dsUnVubmVyQ0RLRGVwbG95VG9FY3JSb2xlTmFtZScsXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiBlY3JEZXBsb3lSb2xlLnJvbGVOYW1lLFxuICAgICAgICBleHBvcnROYW1lOiAnZ2wtcnVubmVyLWNkay1kZXBsb3ktdG8tZWNyLXJvbGUtbmFtZScsXG4gICAgICB9LFxuICAgICk7XG4gICAgZ2xSdW5uZXJDZGtEZXBsb3lUb0VjclJvbGVOYW1lLm92ZXJyaWRlTG9naWNhbElkKFxuICAgICAgJ0dsUnVubmVyQ0RLRGVwbG95VG9FY3JSb2xlTmFtZScsXG4gICAgKTtcbiAgICBjb25zdCBnbFJ1bm5lckNka0RlcGxveVRvRWNyUm9sZUFybiA9IG5ldyBDZm5PdXRwdXQoXG4gICAgICBzY29wZSxcbiAgICAgICdHbFJ1bm5lckNES0RlcGxveVRvRWNyUm9sZUFybicsXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiBlY3JEZXBsb3lSb2xlLnJvbGVBcm4sXG4gICAgICAgIGV4cG9ydE5hbWU6ICdnbC1ydW5uZXItY2RrLWRlcGxveS10by1lY3Itcm9sZS1hcm4nLFxuICAgICAgfSxcbiAgICApO1xuICAgIGdsUnVubmVyQ2RrRGVwbG95VG9FY3JSb2xlQXJuLm92ZXJyaWRlTG9naWNhbElkKFxuICAgICAgJ0dsUnVubmVyQ0RLRGVwbG95VG9FY3JSb2xlQXJuJyxcbiAgICApO1xuXG4gICAgY29uc3QgZ2xSdW5uZXJDZGtTZWNyZXRzQmFja3VwUm9sZU5hbWUgPSBuZXcgQ2ZuT3V0cHV0KFxuICAgICAgc2NvcGUsXG4gICAgICAnR2xSdW5uZXJDREtTZWNyZXRzQmFja3VwUm9sZU5hbWUnLFxuICAgICAge1xuICAgICAgICB2YWx1ZTogc2VjcmV0c0JhY2tVcFJvbGUucm9sZU5hbWUsXG4gICAgICAgIGV4cG9ydE5hbWU6ICdnbC1ydW5uZXItY2RrLXNlY3JldHMtYmFja3VwLXJvbGUtbmFtZScsXG4gICAgICB9LFxuICAgICk7XG4gICAgZ2xSdW5uZXJDZGtTZWNyZXRzQmFja3VwUm9sZU5hbWUub3ZlcnJpZGVMb2dpY2FsSWQoXG4gICAgICAnR2xSdW5uZXJDREtTZWNyZXRzQmFja3VwUm9sZU5hbWUnLFxuICAgICk7XG4gICAgY29uc3QgZ2xSdW5uZXJDZGtTZWNyZXRzQmFja3VwUm9sZUFybiA9IG5ldyBDZm5PdXRwdXQoXG4gICAgICBzY29wZSxcbiAgICAgICdHbFJ1bm5lckNES1NlY3JldHNCYWNrdXBSb2xlQXJuJyxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHNlY3JldHNCYWNrVXBSb2xlLnJvbGVBcm4sXG4gICAgICAgIGV4cG9ydE5hbWU6ICdnbC1ydW5uZXItY2RrLXNlY3JldHMtYmFja3VwLXJvbGUtYXJuJyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBnbFJ1bm5lckNka1NlY3JldHNCYWNrdXBSb2xlQXJuLm92ZXJyaWRlTG9naWNhbElkKFxuICAgICAgJ0dsUnVubmVyQ0RLU2VjcmV0c0JhY2t1cFJvbGVBcm4nLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import { Construct } from 'constructs';
2
+ /**
3
+ * The construct creates a service linked role required to run GitLab Runners using Spot EC2 instances.
4
+ */
5
+ export declare class SpotServiceLinkedRole extends Construct {
6
+ constructor(scope: Construct, id: string);
7
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.SpotServiceLinkedRole = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
7
+ const constructs_1 = require("constructs");
8
+ /**
9
+ * The construct creates a service linked role required to run GitLab Runners using Spot EC2 instances.
10
+ */
11
+ class SpotServiceLinkedRole extends constructs_1.Construct {
12
+ constructor(scope, id) {
13
+ super(scope, id);
14
+ new aws_iam_1.CfnServiceLinkedRole(scope, 'Ec2SpotServiceLinkedRole', {
15
+ awsServiceName: 'spot.amazonaws.com',
16
+ });
17
+ }
18
+ }
19
+ exports.SpotServiceLinkedRole = SpotServiceLinkedRole;
20
+ _a = JSII_RTTI_SYMBOL_1;
21
+ SpotServiceLinkedRole[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.SpotServiceLinkedRole", version: "0.0.0" };
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdC1yb2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbnRyaWJ1dGlvbnMvc21hcnQtcm91dGUvZ2l0bGFiLXJ1bm5lci9zcG90LXJvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpREFBMkQ7QUFDM0QsMkNBQXVDO0FBR3ZDOztHQUVHO0FBQ0gsTUFBYSxxQkFBc0IsU0FBUSxzQkFBUztJQUNsRCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksOEJBQW9CLENBQUMsS0FBSyxFQUFFLDBCQUEwQixFQUFFO1lBQzFELGNBQWMsRUFBRSxvQkFBb0I7U0FDckMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFOSCxzREFPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmblNlcnZpY2VMaW5rZWRSb2xlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuXG4vKipcbiAqIFRoZSBjb25zdHJ1Y3QgY3JlYXRlcyBhIHNlcnZpY2UgbGlua2VkIHJvbGUgcmVxdWlyZWQgdG8gcnVuIEdpdExhYiBSdW5uZXJzIHVzaW5nIFNwb3QgRUMyIGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNwb3RTZXJ2aWNlTGlua2VkUm9sZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIG5ldyBDZm5TZXJ2aWNlTGlua2VkUm9sZShzY29wZSwgJ0VjMlNwb3RTZXJ2aWNlTGlua2VkUm9sZScsIHtcbiAgICAgIGF3c1NlcnZpY2VOYW1lOiAnc3BvdC5hbWF6b25hd3MuY29tJyxcbiAgICB9KTtcbiAgfVxufVxuIl19
package/lib/index.d.ts CHANGED
@@ -21,3 +21,4 @@ export * from './contributions/team-claid/datadog-usage-monitoring';
21
21
  export * from './contributions/team-oubout-order-book/aws-ecs-abruptly-stopped-monitor';
22
22
  export * from './backup';
23
23
  export * as backup from './backup';
24
+ export * from './contributions/smart-route/gitlab-runner';
package/lib/index.js CHANGED
@@ -38,4 +38,5 @@ __exportStar(require("./contributions/team-claid/datadog-usage-monitoring"), exp
38
38
  __exportStar(require("./contributions/team-oubout-order-book/aws-ecs-abruptly-stopped-monitor"), exports);
39
39
  __exportStar(require("./backup"), exports);
40
40
  exports.backup = require("./backup");
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBMkI7QUFFM0IsNkNBQTJDO0FBRTNDLHFEQUFtQztBQUNuQyxzREFBb0M7QUFDcEMsb0RBQWtDO0FBRWxDLGdFQUE4QztBQUM5Qyx1Q0FBcUM7QUFFckMseUVBQXVEO0FBQ3ZELDhFQUE0RDtBQUM1RCwrREFBNkM7QUFFN0MsMENBQXdCO0FBQ3hCLG1DQUFpQztBQUVqQyw0Q0FBMEI7QUFDMUIsdUNBQXFDO0FBQ3JDLDJDQUF5QztBQUV6QywwRUFBd0Q7QUFFeEQsNkVBQTJEO0FBQzNELDhFQUE0RDtBQUU1RCxtRkFBaUU7QUFDakUsc0ZBQW9FO0FBRXBFLDBHQUF3RjtBQUV4RiwyQ0FBeUI7QUFDekIscUNBQW1DIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi93YXRjaGZ1bCc7XG5cbmV4cG9ydCAqIGFzIHdhdGNoZnVsdjIgZnJvbSAnLi93YXRjaGZ1bHYyJztcblxuZXhwb3J0ICogZnJvbSAnLi9yaW8tbGFuZGluZy16b25lJztcbmV4cG9ydCAqIGZyb20gJy4vcmlvLWxvYWQtYmFsYW5jZXInO1xuZXhwb3J0ICogZnJvbSAnLi9yaW8tY2xhaWRvbWV0ZXInO1xuXG5leHBvcnQgKiBmcm9tICcuL2ZhcmdhdGUvcmlvLWZhcmdhdGUtc2VydmljZSc7XG5leHBvcnQgKiBhcyBmYXJnYXRlIGZyb20gJy4vZmFyZ2F0ZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmUvcmlvLWJpdGJ1Y2tldC1zb3VyY2UtYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmUvcmlvLWJhY2t1cC1zZWNyZXRzLXJlc3RvcmUtc3RhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZS9yaW8tcGlwZWxpbmUtdHlwZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4va2Fma2EnO1xuZXhwb3J0ICogYXMga2Fma2EgZnJvbSAnLi9rYWZrYSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vZGF0YWRvZyc7XG5leHBvcnQgKiBhcyBkYXRhZG9nIGZyb20gJy4vZGF0YWRvZyc7XG5leHBvcnQgKiBhcyBkYXRhZG9ndjIgZnJvbSAnLi9kYXRhZG9ndjInO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRyaWJ1dGlvbnMvY29wLWZyb250ZW5kL2Nsb3VkZnJvbnQnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRyaWJ1dGlvbnMvdGVhbS10cmFuc3BvcnQtdHdvL2RhdGFkb2cnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmlidXRpb25zL3RlYW0tdHJhbnNwb3J0LXR3by9waXBlbGluZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY29udHJpYnV0aW9ucy90ZWFtLWNsYWlkL2F3cy1iYWNrdXAtbW9uaXRvcmluZyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyaWJ1dGlvbnMvdGVhbS1jbGFpZC9kYXRhZG9nLXVzYWdlLW1vbml0b3JpbmcnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRyaWJ1dGlvbnMvdGVhbS1vdWJvdXQtb3JkZXItYm9vay9hd3MtZWNzLWFicnVwdGx5LXN0b3BwZWQtbW9uaXRvcic7XG5cbmV4cG9ydCAqIGZyb20gJy4vYmFja3VwJztcbmV4cG9ydCAqIGFzIGJhY2t1cCBmcm9tICcuL2JhY2t1cCc7XG4iXX0=
41
+ __exportStar(require("./contributions/smart-route/gitlab-runner"), exports);
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBMkI7QUFFM0IsNkNBQTJDO0FBRTNDLHFEQUFtQztBQUNuQyxzREFBb0M7QUFDcEMsb0RBQWtDO0FBRWxDLGdFQUE4QztBQUM5Qyx1Q0FBcUM7QUFFckMseUVBQXVEO0FBQ3ZELDhFQUE0RDtBQUM1RCwrREFBNkM7QUFFN0MsMENBQXdCO0FBQ3hCLG1DQUFpQztBQUVqQyw0Q0FBMEI7QUFDMUIsdUNBQXFDO0FBQ3JDLDJDQUF5QztBQUV6QywwRUFBd0Q7QUFFeEQsNkVBQTJEO0FBQzNELDhFQUE0RDtBQUU1RCxtRkFBaUU7QUFDakUsc0ZBQW9FO0FBRXBFLDBHQUF3RjtBQUV4RiwyQ0FBeUI7QUFDekIscUNBQW1DO0FBRW5DLDRFQUEwRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vd2F0Y2hmdWwnO1xuXG5leHBvcnQgKiBhcyB3YXRjaGZ1bHYyIGZyb20gJy4vd2F0Y2hmdWx2Mic7XG5cbmV4cG9ydCAqIGZyb20gJy4vcmlvLWxhbmRpbmctem9uZSc7XG5leHBvcnQgKiBmcm9tICcuL3Jpby1sb2FkLWJhbGFuY2VyJztcbmV4cG9ydCAqIGZyb20gJy4vcmlvLWNsYWlkb21ldGVyJztcblxuZXhwb3J0ICogZnJvbSAnLi9mYXJnYXRlL3Jpby1mYXJnYXRlLXNlcnZpY2UnO1xuZXhwb3J0ICogYXMgZmFyZ2F0ZSBmcm9tICcuL2ZhcmdhdGUnO1xuXG5leHBvcnQgKiBmcm9tICcuL3BpcGVsaW5lL3Jpby1iaXRidWNrZXQtc291cmNlLWFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3BpcGVsaW5lL3Jpby1iYWNrdXAtc2VjcmV0cy1yZXN0b3JlLXN0YWdlJztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmUvcmlvLXBpcGVsaW5lLXR5cGUnO1xuXG5leHBvcnQgKiBmcm9tICcuL2thZmthJztcbmV4cG9ydCAqIGFzIGthZmthIGZyb20gJy4va2Fma2EnO1xuXG5leHBvcnQgKiBmcm9tICcuL2RhdGFkb2cnO1xuZXhwb3J0ICogYXMgZGF0YWRvZyBmcm9tICcuL2RhdGFkb2cnO1xuZXhwb3J0ICogYXMgZGF0YWRvZ3YyIGZyb20gJy4vZGF0YWRvZ3YyJztcblxuZXhwb3J0ICogZnJvbSAnLi9jb250cmlidXRpb25zL2NvcC1mcm9udGVuZC9jbG91ZGZyb250JztcblxuZXhwb3J0ICogZnJvbSAnLi9jb250cmlidXRpb25zL3RlYW0tdHJhbnNwb3J0LXR3by9kYXRhZG9nJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJpYnV0aW9ucy90ZWFtLXRyYW5zcG9ydC10d28vcGlwZWxpbmUnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRyaWJ1dGlvbnMvdGVhbS1jbGFpZC9hd3MtYmFja3VwLW1vbml0b3JpbmcnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmlidXRpb25zL3RlYW0tY2xhaWQvZGF0YWRvZy11c2FnZS1tb25pdG9yaW5nJztcblxuZXhwb3J0ICogZnJvbSAnLi9jb250cmlidXRpb25zL3RlYW0tb3Vib3V0LW9yZGVyLWJvb2svYXdzLWVjcy1hYnJ1cHRseS1zdG9wcGVkLW1vbml0b3InO1xuXG5leHBvcnQgKiBmcm9tICcuL2JhY2t1cCc7XG5leHBvcnQgKiBhcyBiYWNrdXAgZnJvbSAnLi9iYWNrdXAnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRyaWJ1dGlvbnMvc21hcnQtcm91dGUvZ2l0bGFiLXJ1bm5lcic7XG4iXX0=
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  ],
16
16
  "main": "lib/index.js",
17
17
  "license": "Apache-2.0",
18
- "version": "6.1.0",
18
+ "version": "6.2.2",
19
19
  "types": "lib/index.d.ts",
20
20
  "stability": "stable",
21
21
  "exports": {
@@ -51,7 +51,8 @@
51
51
  "bump": "commit-and-tag-version -a",
52
52
  "test": "jest --coverage",
53
53
  "test:watch": "jest --watch",
54
- "eslint": "eslint --ext .ts,.tsx --fix --no-error-on-unmatched-pattern src test",
54
+ "eslint": "eslint --ext .ts,.tsx --no-error-on-unmatched-pattern src test",
55
+ "eslint-fix": "eslint --ext .ts,.tsx --fix --no-error-on-unmatched-pattern src test",
55
56
  "docgen": "jsii-docgen -o ./docs/API.md",
56
57
  "cdk": "cdk",
57
58
  "release:check": "node release-commit-check.js",
@@ -99,6 +100,9 @@
99
100
  "@datadog/datadog-api-client": "^1.24.0",
100
101
  "js-yaml": "~4.1.0"
101
102
  },
103
+ "optionalDependencies": {
104
+ "@pepperize/cdk-autoscaling-gitlab-runner": "^0.2.613"
105
+ },
102
106
  "bundledDependencies": [
103
107
  "js-yaml"
104
108
  ],
package/version.json CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "6.1.0"
2
+ "version": "6.2.2"
3
3
  }