terraform-cdk-serverless-github-actions-runner-controller 0.0.0

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 @@
1
+ import "cdktf/lib/testing/adapters/jest";
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const cdktf_1 = require("cdktf");
4
+ require("cdktf/lib/testing/adapters/jest");
5
+ const azure_1 = require("../lib/azure");
6
+ // To learn more about testing see cdk.tf/testing
7
+ describe("MyConstruct", () => {
8
+ it("should synthesize", () => {
9
+ expect(cdktf_1.Testing.synthScope((scope) => {
10
+ new azure_1.Azure(scope, "my-construct");
11
+ })).toMatchSnapshot();
12
+ });
13
+ });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtdGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgtdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlDQUFnQztBQUNoQywyQ0FBeUM7QUFDekMsd0NBQXFDO0FBRXJDLGlEQUFpRDtBQUNqRCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixFQUFFLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO1FBQzNCLE1BQU0sQ0FDSixlQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0IsSUFBSSxhQUFLLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUNILENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3RpbmcgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCBcImNka3RmL2xpYi90ZXN0aW5nL2FkYXB0ZXJzL2plc3RcIjtcbmltcG9ydCB7IEF6dXJlIH0gZnJvbSBcIi4uL2xpYi9henVyZVwiO1xuXG4vLyBUbyBsZWFybiBtb3JlIGFib3V0IHRlc3Rpbmcgc2VlIGNkay50Zi90ZXN0aW5nXG5kZXNjcmliZShcIk15Q29uc3RydWN0XCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgc3ludGhlc2l6ZVwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgVGVzdGluZy5zeW50aFNjb3BlKChzY29wZSkgPT4ge1xuICAgICAgICBuZXcgQXp1cmUoc2NvcGUsIFwibXktY29uc3RydWN0XCIpO1xuICAgICAgfSlcbiAgICApLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICB9KTtcbn0pOyJdfQ==
package/lib/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './lib/azure';
package/lib/index.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./lib/azure"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2F6dXJlJ1xuIl19
@@ -0,0 +1,4 @@
1
+ import { Construct } from "constructs";
2
+ export declare class Azure extends Construct {
3
+ constructor(scope: Construct, id: string);
4
+ }
@@ -0,0 +1,478 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Azure = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const provider_1 = require("@cdktf/provider-azurerm/lib/provider");
7
+ const provider_2 = require("../.gen/providers/azapi/provider");
8
+ const resource_1 = require("../.gen/providers/azapi/resource");
9
+ const data_azapi_resource_action_1 = require("../.gen/providers/azapi/data-azapi-resource-action");
10
+ const cdktf_1 = require("cdktf");
11
+ const constructs_1 = require("constructs");
12
+ const resource_group_1 = require("@cdktf/provider-azurerm/lib/resource-group");
13
+ const container_registry_1 = require("@cdktf/provider-azurerm/lib/container-registry");
14
+ const user_assigned_identity_1 = require("@cdktf/provider-azurerm/lib/user-assigned-identity");
15
+ const role_assignment_1 = require("@cdktf/provider-azurerm/lib/role-assignment");
16
+ const log_analytics_workspace_1 = require("@cdktf/provider-azurerm/lib/log-analytics-workspace");
17
+ const role_definition_1 = require("@cdktf/provider-azurerm/lib/role-definition");
18
+ const data_azurerm_subscription_1 = require("@cdktf/provider-azurerm/lib/data-azurerm-subscription");
19
+ const container_app_1 = require("@cdktf/provider-azurerm/lib/container-app");
20
+ const variables_1 = require("./variables");
21
+ const container_app_environment_storage_1 = require("@cdktf/provider-azurerm/lib/container-app-environment-storage");
22
+ const provider_3 = require("@cdktf/provider-random/lib/provider");
23
+ const string_resource_1 = require("@cdktf/provider-random/lib/string-resource");
24
+ class Azure extends constructs_1.Construct {
25
+ constructor(scope, id) {
26
+ super(scope, id);
27
+ new provider_1.AzurermProvider(this, 'azurerm', {
28
+ features: [
29
+ {}
30
+ ]
31
+ });
32
+ new provider_2.AzapiProvider(this, 'azapi', {});
33
+ new provider_3.RandomProvider(this, 'random');
34
+ const sub = new data_azurerm_subscription_1.DataAzurermSubscription(this, 'sub', {});
35
+ const { pat, githubConfigUrl } = (0, variables_1.commonVariables)(this);
36
+ const location = new cdktf_1.TerraformVariable(this, 'location', {
37
+ default: 'westeurope',
38
+ description: 'Location where to provision resources to',
39
+ type: 'string',
40
+ sensitive: false,
41
+ nullable: false
42
+ }).value;
43
+ const rg = new resource_group_1.ResourceGroup(this, 'rg', {
44
+ location,
45
+ name: 'gha-runner-rg',
46
+ lifecycle: {
47
+ ignoreChanges: [
48
+ 'tags'
49
+ ]
50
+ }
51
+ });
52
+ const random = new string_resource_1.StringResource(this, 'randomSuffix', {
53
+ length: 6,
54
+ special: false,
55
+ upper: false,
56
+ });
57
+ const acr = new container_registry_1.ContainerRegistry(this, 'acr', {
58
+ location,
59
+ name: `runneracr${random.result}`,
60
+ resourceGroupName: rg.name,
61
+ sku: 'Basic',
62
+ lifecycle: {
63
+ ignoreChanges: [
64
+ 'tags'
65
+ ]
66
+ }
67
+ });
68
+ // use caching for images
69
+ const runnerCache = new resource_1.Resource(this, 'runnerCache', {
70
+ type: 'Microsoft.ContainerRegistry/registries/cacheRules@2023-01-01-preview',
71
+ parentId: acr.id,
72
+ name: 'root-runner-cache',
73
+ body: {
74
+ properties: {
75
+ sourceRepository: 'ghcr.io/hi-fi/root-actions-runner',
76
+ targetRepository: 'root-actions-runner'
77
+ }
78
+ }
79
+ });
80
+ const autoscalerCache = new resource_1.Resource(this, 'autoscalerCache', {
81
+ type: 'Microsoft.ContainerRegistry/registries/cacheRules@2023-01-01-preview',
82
+ parentId: acr.id,
83
+ name: 'autoscaler-cache',
84
+ body: {
85
+ properties: {
86
+ sourceRepository: 'ghcr.io/hi-fi/gha-runners-on-managed-env',
87
+ targetRepository: 'autoscaler'
88
+ }
89
+ }
90
+ });
91
+ const identity = new user_assigned_identity_1.UserAssignedIdentity(this, 'identity', {
92
+ location,
93
+ name: 'aca-acr-access',
94
+ resourceGroupName: rg.name,
95
+ lifecycle: {
96
+ ignoreChanges: [
97
+ 'tags'
98
+ ]
99
+ }
100
+ });
101
+ new role_assignment_1.RoleAssignment(this, 'roleAssignment', {
102
+ principalId: identity.principalId,
103
+ scope: acr.id,
104
+ roleDefinitionName: 'AcrPull'
105
+ });
106
+ const log = new log_analytics_workspace_1.LogAnalyticsWorkspace(this, 'log', {
107
+ location,
108
+ name: 'gha-example-logs',
109
+ resourceGroupName: rg.name,
110
+ lifecycle: {
111
+ ignoreChanges: [
112
+ 'tags'
113
+ ]
114
+ }
115
+ });
116
+ const storageAccount = new resource_1.Resource(this, 'storageAccount', {
117
+ type: 'Microsoft.Storage/storageAccounts@2023-01-01',
118
+ parentId: rg.id,
119
+ location,
120
+ name: `ghastorageaccount${random.result}`,
121
+ body: {
122
+ properties: {
123
+ largeFileSharesState: 'Enabled'
124
+ },
125
+ sku: {
126
+ name: 'Standard_LRS'
127
+ },
128
+ kind: 'StorageV2',
129
+ },
130
+ lifecycle: {
131
+ ignoreChanges: [
132
+ 'tags'
133
+ ]
134
+ },
135
+ responseExportValues: []
136
+ });
137
+ const storageShare = new resource_1.Resource(this, 'storageShare', {
138
+ type: 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-01-01',
139
+ name: 'ghaexampleshare',
140
+ parentId: `${storageAccount.id}/fileServices/default`,
141
+ body: {
142
+ properties: {
143
+ enabledProtocols: 'SMB',
144
+ }
145
+ },
146
+ });
147
+ const externalsShare = new resource_1.Resource(this, 'externalsShare', {
148
+ type: 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-01-01',
149
+ name: 'ghaexternalsshare',
150
+ parentId: `${storageAccount.id}/fileServices/default`,
151
+ body: {
152
+ properties: {
153
+ enabledProtocols: 'SMB',
154
+ }
155
+ },
156
+ });
157
+ const environment = new resource_1.Resource(this, 'acaenv', {
158
+ type: 'Microsoft.App/managedEnvironments@2024-03-01',
159
+ parentId: rg.id,
160
+ location,
161
+ name: 'gha-runner-environment',
162
+ body: {
163
+ properties: {
164
+ appLogsConfiguration: {
165
+ destination: 'log-analytics',
166
+ logAnalyticsConfiguration: {
167
+ customerId: log.workspaceId,
168
+ sharedKey: log.primarySharedKey,
169
+ }
170
+ },
171
+ infrastructureResourceGroup: 'managed-aca-rg',
172
+ workloadProfiles: [
173
+ {
174
+ name: 'Consumption',
175
+ workloadProfileType: 'Consumption'
176
+ }
177
+ ]
178
+ }
179
+ },
180
+ lifecycle: {
181
+ ignoreChanges: [
182
+ 'tags'
183
+ ]
184
+ }
185
+ });
186
+ const storageAccessKey = new data_azapi_resource_action_1.DataAzapiResourceAction(this, 'storageAccessKeys', {
187
+ type: 'Microsoft.Storage/storageAccounts@2023-01-01',
188
+ action: 'listKeys',
189
+ resourceId: storageAccount.id,
190
+ responseExportValues: ['*'],
191
+ dependsOn: [
192
+ storageAccount
193
+ ]
194
+ });
195
+ // see https://github.com/hashicorp/terraform-cdk/issues/1641
196
+ // For older Azapi way to get key would be this when (default) data output was json. Witn 2.0.0-beta default was changed to HCL
197
+ // const accessKey = Fn.lookup(Fn.element(Fn.lookup(Fn.jsondecode(storageAccessKey.output as any), 'keys'), 0), 'value')
198
+ const accessKey = cdktf_1.Fn.lookup(cdktf_1.Fn.element(cdktf_1.Fn.element(storageAccessKey.output.lookup('0'), 0), 0), 'value');
199
+ const acaEnvStorage = new container_app_environment_storage_1.ContainerAppEnvironmentStorage(this, 'acaenvstorage', {
200
+ name: 'gharunnerjobstorage',
201
+ accessKey,
202
+ accessMode: 'ReadWrite',
203
+ accountName: storageAccount.name,
204
+ containerAppEnvironmentId: environment.id,
205
+ shareName: storageShare.name,
206
+ dependsOn: [
207
+ // Name doesn't create dependsOn requirement, so adding that explicitly
208
+ storageShare
209
+ ]
210
+ });
211
+ const acaExternalStorage = new container_app_environment_storage_1.ContainerAppEnvironmentStorage(this, 'acaexternalstorage', {
212
+ name: 'gharunnerexternalstorage',
213
+ accessKey,
214
+ accessMode: 'ReadWrite',
215
+ accountName: storageAccount.name,
216
+ containerAppEnvironmentId: environment.id,
217
+ shareName: externalsShare.name,
218
+ dependsOn: [
219
+ // Name doesn't create dependsOn requirement, so adding that explicitly
220
+ externalsShare
221
+ ]
222
+ });
223
+ const runnerVolumeName = 'work';
224
+ const externalVolumeName = 'externals';
225
+ /**
226
+ * @see https://learn.microsoft.com/en-us/azure/templates/microsoft.app/jobs?pivots=deployment-language-terraform
227
+ */
228
+ const ghaRunnerJob = new resource_1.Resource(this, 'ghaRunnerJob', {
229
+ type: 'Microsoft.App/jobs@2024-02-02-preview',
230
+ identity: [
231
+ {
232
+ type: 'UserAssigned',
233
+ identityIds: [
234
+ identity.id
235
+ ]
236
+ }
237
+ ],
238
+ name: 'gha-runner-job-01',
239
+ parentId: rg.id,
240
+ location,
241
+ body: {
242
+ properties: {
243
+ configuration: {
244
+ manualTriggerConfig: {
245
+ parallelism: 1,
246
+ replicaCompletionCount: 1,
247
+ },
248
+ triggerType: 'Manual',
249
+ replicaTimeout: 1200,
250
+ registries: [
251
+ {
252
+ identity: identity.id,
253
+ server: acr.loginServer
254
+ }
255
+ ],
256
+ },
257
+ environmentId: environment.id,
258
+ template: {
259
+ containers: [
260
+ {
261
+ resources: {
262
+ cpu: 1,
263
+ memory: '2Gi',
264
+ },
265
+ // Have to use custom image as we want to run service as root to be able to install packages
266
+ image: `${acr.loginServer}/root-actions-runner:latest`,
267
+ name: 'main',
268
+ command: ['/bin/sh', '-c', 'export EXECID=$(cat /proc/sys/kernel/random/uuid) && mkdir -p /tmp/_work/$EXECID && ln -s /tmp/_work/$EXECID _work && /home/runner/run.sh ; rm -r /tmp/_work/$EXECID'],
269
+ volumeMounts: [
270
+ {
271
+ mountPath: '/tmp/_work',
272
+ volumeName: runnerVolumeName,
273
+ },
274
+ {
275
+ mountPath: '/tmp/externals',
276
+ volumeName: externalVolumeName,
277
+ }
278
+ ],
279
+ env: [
280
+ // https://github.com/microsoft/azure-container-apps/issues/502#issuecomment-1340225438
281
+ {
282
+ name: 'APPSETTING_WEBSITE_SITE_NAME',
283
+ value: 'identity-workaround'
284
+ },
285
+ // https://github.com/microsoft/azure-container-apps/issues/442#issuecomment-1665621031
286
+ {
287
+ name: 'AZURE_CLIENT_ID',
288
+ value: identity.clientId
289
+ },
290
+ {
291
+ name: 'RG_NAME',
292
+ value: rg.name
293
+ },
294
+ {
295
+ name: 'LOG_ID',
296
+ value: log.workspaceId
297
+ },
298
+ {
299
+ name: 'STORAGE_NAME',
300
+ value: acaEnvStorage.name
301
+ },
302
+ {
303
+ name: 'EXTERNAL_STORAGE_NAME',
304
+ value: acaExternalStorage.name
305
+ },
306
+ {
307
+ name: 'SUBSCRIPTION_ID',
308
+ value: sub.subscriptionId
309
+ },
310
+ {
311
+ name: 'ACA_ENVIRONMENT_ID',
312
+ value: environment.id
313
+ }
314
+ ],
315
+ },
316
+ ],
317
+ volumes: [
318
+ {
319
+ name: runnerVolumeName,
320
+ storageName: acaEnvStorage.name,
321
+ storageType: 'AzureFile',
322
+ mountOptions: 'mfsymlinks'
323
+ },
324
+ {
325
+ name: externalVolumeName,
326
+ storageName: acaExternalStorage.name,
327
+ storageType: 'AzureFile',
328
+ mountOptions: 'mfsymlinks'
329
+ }
330
+ ]
331
+ }
332
+ }
333
+ },
334
+ dependsOn: [
335
+ runnerCache
336
+ ],
337
+ lifecycle: {
338
+ ignoreChanges: [
339
+ 'tags'
340
+ ]
341
+ }
342
+ });
343
+ const autoscalerApp = new container_app_1.ContainerApp(this, 'autoscalerApp', {
344
+ containerAppEnvironmentId: environment.id,
345
+ name: 'autoscaler-app-01',
346
+ resourceGroupName: rg.name,
347
+ revisionMode: 'Single',
348
+ identity: {
349
+ type: 'SystemAssigned, UserAssigned',
350
+ identityIds: [
351
+ identity.id
352
+ ]
353
+ },
354
+ secret: [
355
+ {
356
+ name: 'pat',
357
+ value: pat.value
358
+ }
359
+ ],
360
+ registry: [
361
+ {
362
+ identity: identity.id,
363
+ server: acr.loginServer
364
+ }
365
+ ],
366
+ template: {
367
+ container: [
368
+ {
369
+ // CPU and Memory can be lower with workload profile
370
+ cpu: 0.25,
371
+ memory: '0.5Gi',
372
+ image: `${acr.loginServer}/autoscaler:test`,
373
+ name: 'autoscaler',
374
+ env: [
375
+ {
376
+ name: 'PAT',
377
+ secretName: 'pat',
378
+ },
379
+ {
380
+ name: 'GITHUB_CONFIG_URL',
381
+ value: githubConfigUrl.value
382
+ },
383
+ {
384
+ name: 'AZURE_TENANT_ID',
385
+ value: sub.tenantId,
386
+ },
387
+ {
388
+ name: 'SUBSCRIPTION_ID',
389
+ value: sub.subscriptionId
390
+ },
391
+ {
392
+ name: 'RESOURCE_GROUP_NAME',
393
+ value: rg.name
394
+ },
395
+ {
396
+ name: 'JOB_NAME',
397
+ value: ghaRunnerJob.name
398
+ },
399
+ {
400
+ name: 'SCALE_SET_NAME',
401
+ value: 'aca-runner-set'
402
+ },
403
+ ]
404
+ }
405
+ ]
406
+ },
407
+ dependsOn: [
408
+ autoscalerCache
409
+ ],
410
+ lifecycle: {
411
+ ignoreChanges: [
412
+ 'tags',
413
+ 'workload_profile_name'
414
+ ]
415
+ }
416
+ });
417
+ /**
418
+ * @see https://github.com/microsoft/azure-container-apps/issues/1024
419
+ */
420
+ const role = new role_definition_1.RoleDefinition(this, 'jobRole', {
421
+ name: `gha-example-revision-start-role-${random.result}`,
422
+ scope: sub.id,
423
+ permissions: [
424
+ {
425
+ actions: [
426
+ 'microsoft.app/jobs/start/action',
427
+ 'microsoft.app/jobs/stop/action',
428
+ 'microsoft.app/jobs/read',
429
+ 'microsoft.app/jobs/executions/read',
430
+ ],
431
+ }
432
+ ]
433
+ });
434
+ const jobCreationRole = new role_definition_1.RoleDefinition(this, 'jobCreationRole', {
435
+ name: `gha-example-revision-create-role-${random.result}`,
436
+ scope: sub.id,
437
+ permissions: [
438
+ {
439
+ actions: [
440
+ 'microsoft.app/jobs/start/action',
441
+ 'microsoft.app/jobs/stop/action',
442
+ 'microsoft.app/jobs/read',
443
+ 'microsoft.app/jobs/write',
444
+ 'microsoft.app/jobs/executions/read',
445
+ 'microsoft.app/managedEnvironments/join/action',
446
+ 'microsoft.app/jobs/delete' // cleanup for jobs
447
+ ],
448
+ }
449
+ ]
450
+ });
451
+ // Allow autoscaler to create new revision of app
452
+ new role_assignment_1.RoleAssignment(this, 'scaleJobRoleAssignment', {
453
+ principalId: autoscalerApp.identity.principalId,
454
+ scope: ghaRunnerJob.id,
455
+ roleDefinitionId: role.roleDefinitionResourceId
456
+ });
457
+ // Allow runner to start the job. As each one created new job, have to give to RG level.
458
+ new role_assignment_1.RoleAssignment(this, 'actionContainerStartRoleAssignment', {
459
+ principalId: identity.principalId,
460
+ scope: rg.id,
461
+ roleDefinitionId: jobCreationRole.roleDefinitionResourceId
462
+ });
463
+ new role_assignment_1.RoleAssignment(this, 'imagePushRoleAssignment', {
464
+ principalId: identity.principalId,
465
+ scope: acr.id,
466
+ roleDefinitionName: 'AcrPush'
467
+ });
468
+ new role_assignment_1.RoleAssignment(this, 'jobLogReadAssignment', {
469
+ principalId: identity.principalId,
470
+ scope: log.id,
471
+ roleDefinitionName: 'Log Analytics Reader'
472
+ });
473
+ }
474
+ }
475
+ exports.Azure = Azure;
476
+ _a = JSII_RTTI_SYMBOL_1;
477
+ Azure[_a] = { fqn: "terraform-cdk-serverless-github-actions-runner-controller.Azure", version: "0.0.0" };
478
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2F6dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUVBQXVFO0FBQ3ZFLCtEQUFnRTtBQUNoRSwrREFBMkQ7QUFDM0QsbUdBQTRGO0FBQzVGLGlDQUE4QztBQUM5QywyQ0FBdUM7QUFDdkMsK0VBQTJFO0FBQzNFLHVGQUFtRjtBQUNuRiwrRkFBMEY7QUFDMUYsaUZBQTZFO0FBQzdFLGlHQUE0RjtBQUM1RixpRkFBNkU7QUFDN0UscUdBQWdHO0FBQ2hHLDZFQUF5RTtBQUN6RSwyQ0FBOEM7QUFDOUMscUhBQStHO0FBQy9HLGtFQUFxRTtBQUNyRSxnRkFBNEU7QUFFNUUsTUFBYSxLQUFNLFNBQVEsc0JBQVM7SUFDaEMsWUFBWSxLQUFnQixFQUFFLEVBQVU7UUFDcEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLDBCQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUNqQyxRQUFRLEVBQUU7Z0JBQ04sRUFBRTthQUNMO1NBQ0osQ0FBQyxDQUFBO1FBRUYsSUFBSSx3QkFBYSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFDaEMsQ0FBQyxDQUFBO1FBRUYsSUFBSSx5QkFBYyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUVsQyxNQUFNLEdBQUcsR0FBRyxJQUFJLG1EQUF1QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFekQsTUFBTSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsR0FBRyxJQUFBLDJCQUFlLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkQsTUFBTSxRQUFRLEdBQUcsSUFBSSx5QkFBaUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3JELE9BQU8sRUFBRSxZQUFZO1lBQ3JCLFdBQVcsRUFBRSwwQ0FBMEM7WUFDdkQsSUFBSSxFQUFFLFFBQVE7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YixrQkFBa0IsRUFBRSxTQUFTO1NBQ2hDLENBQUMsQ0FBQztRQUVILElBQUksZ0NBQWMsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUU7WUFDN0MsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO1lBQ2pDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNiLGtCQUFrQixFQUFFLHNCQUFzQjtTQUM3QyxDQUFDLENBQUE7SUFDTixDQUFDOztBQXBlTCxzQkFxZUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBenVyZXJtUHJvdmlkZXIgfSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF6dXJlcm0vbGliL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBBemFwaVByb3ZpZGVyIH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvYXphcGkvcHJvdmlkZXInXG5pbXBvcnQgeyBSZXNvdXJjZSB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL2F6YXBpL3Jlc291cmNlJ1xuaW1wb3J0IHsgRGF0YUF6YXBpUmVzb3VyY2VBY3Rpb24gfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9hemFwaS9kYXRhLWF6YXBpLXJlc291cmNlLWFjdGlvbidcbmltcG9ydCB7IEZuLCBUZXJyYWZvcm1WYXJpYWJsZSB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFJlc291cmNlR3JvdXAgfSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF6dXJlcm0vbGliL3Jlc291cmNlLWdyb3VwXCI7XG5pbXBvcnQgeyBDb250YWluZXJSZWdpc3RyeSB9IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXp1cmVybS9saWIvY29udGFpbmVyLXJlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBVc2VyQXNzaWduZWRJZGVudGl0eSB9IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXp1cmVybS9saWIvdXNlci1hc3NpZ25lZC1pZGVudGl0eVwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnQgfSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF6dXJlcm0vbGliL3JvbGUtYXNzaWdubWVudFwiO1xuaW1wb3J0IHsgTG9nQW5hbHl0aWNzV29ya3NwYWNlIH0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci1henVyZXJtL2xpYi9sb2ctYW5hbHl0aWNzLXdvcmtzcGFjZVwiO1xuaW1wb3J0IHsgUm9sZURlZmluaXRpb24gfSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF6dXJlcm0vbGliL3JvbGUtZGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgRGF0YUF6dXJlcm1TdWJzY3JpcHRpb24gfSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF6dXJlcm0vbGliL2RhdGEtYXp1cmVybS1zdWJzY3JpcHRpb25cIjtcbmltcG9ydCB7IENvbnRhaW5lckFwcCB9IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXp1cmVybS9saWIvY29udGFpbmVyLWFwcFwiO1xuaW1wb3J0IHsgY29tbW9uVmFyaWFibGVzIH0gZnJvbSBcIi4vdmFyaWFibGVzXCI7XG5pbXBvcnQgeyBDb250YWluZXJBcHBFbnZpcm9ubWVudFN0b3JhZ2UgfSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF6dXJlcm0vbGliL2NvbnRhaW5lci1hcHAtZW52aXJvbm1lbnQtc3RvcmFnZVwiO1xuaW1wb3J0IHsgUmFuZG9tUHJvdmlkZXIgfSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLXJhbmRvbS9saWIvcHJvdmlkZXJcIjtcbmltcG9ydCB7IFN0cmluZ1Jlc291cmNlIH0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci1yYW5kb20vbGliL3N0cmluZy1yZXNvdXJjZVwiO1xuXG5leHBvcnQgY2xhc3MgQXp1cmUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICAgICAgXG4gICAgICAgIG5ldyBBenVyZXJtUHJvdmlkZXIodGhpcywgJ2F6dXJlcm0nLCB7XG4gICAgICAgICAgICBmZWF0dXJlczogW1xuICAgICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pXG5cbiAgICAgICAgbmV3IEF6YXBpUHJvdmlkZXIodGhpcywgJ2F6YXBpJywge1xuICAgICAgICB9KVxuXG4gICAgICAgIG5ldyBSYW5kb21Qcm92aWRlcih0aGlzLCAncmFuZG9tJylcblxuICAgICAgICBjb25zdCBzdWIgPSBuZXcgRGF0YUF6dXJlcm1TdWJzY3JpcHRpb24odGhpcywgJ3N1YicsIHt9KTtcblxuICAgICAgICBjb25zdCB7IHBhdCwgZ2l0aHViQ29uZmlnVXJsIH0gPSBjb21tb25WYXJpYWJsZXModGhpcyk7XG5cbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSBuZXcgVGVycmFmb3JtVmFyaWFibGUodGhpcywgJ2xvY2F0aW9uJywge1xuICAgICAgICAgICAgZGVmYXVsdDogJ3dlc3RldXJvcGUnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdMb2NhdGlvbiB3aGVyZSB0byBwcm92aXNpb24gcmVzb3VyY2VzIHRvJyxcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgc2Vuc2l0aXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG51bGxhYmxlOiBmYWxzZVxuICAgICAgICB9KS52YWx1ZTtcblxuICAgICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHRoaXMsICdyZycsIHtcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgbmFtZTogJ2doYS1ydW5uZXItcmcnLFxuICAgICAgICAgICAgbGlmZWN5Y2xlOiB7XG4gICAgICAgICAgICAgICAgaWdub3JlQ2hhbmdlczogW1xuICAgICAgICAgICAgICAgICAgICAndGFncydcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJhbmRvbSA9IG5ldyBTdHJpbmdSZXNvdXJjZSh0aGlzLCAncmFuZG9tU3VmZml4Jywge1xuICAgICAgICAgICAgbGVuZ3RoOiA2LFxuICAgICAgICAgICAgc3BlY2lhbDogZmFsc2UsXG4gICAgICAgICAgICB1cHBlcjogZmFsc2UsXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgYWNyID0gbmV3IENvbnRhaW5lclJlZ2lzdHJ5KHRoaXMsICdhY3InLCB7XG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIG5hbWU6IGBydW5uZXJhY3Ike3JhbmRvbS5yZXN1bHR9YCxcbiAgICAgICAgICAgIHJlc291cmNlR3JvdXBOYW1lOiByZy5uYW1lLFxuICAgICAgICAgICAgc2t1OiAnQmFzaWMnLFxuICAgICAgICAgICAgbGlmZWN5Y2xlOiB7XG4gICAgICAgICAgICAgICAgaWdub3JlQ2hhbmdlczogW1xuICAgICAgICAgICAgICAgICAgICAndGFncydcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHVzZSBjYWNoaW5nIGZvciBpbWFnZXNcbiAgICAgICAgY29uc3QgcnVubmVyQ2FjaGUgPSBuZXcgUmVzb3VyY2UodGhpcywgJ3J1bm5lckNhY2hlJywge1xuICAgICAgICAgICAgdHlwZTogJ01pY3Jvc29mdC5Db250YWluZXJSZWdpc3RyeS9yZWdpc3RyaWVzL2NhY2hlUnVsZXNAMjAyMy0wMS0wMS1wcmV2aWV3JyxcbiAgICAgICAgICAgIHBhcmVudElkOiBhY3IuaWQsXG4gICAgICAgICAgICBuYW1lOiAncm9vdC1ydW5uZXItY2FjaGUnLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlUmVwb3NpdG9yeTogJ2doY3IuaW8vaGktZmkvcm9vdC1hY3Rpb25zLXJ1bm5lcicsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFJlcG9zaXRvcnk6ICdyb290LWFjdGlvbnMtcnVubmVyJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBhdXRvc2NhbGVyQ2FjaGUgPSBuZXcgUmVzb3VyY2UodGhpcywgJ2F1dG9zY2FsZXJDYWNoZScsIHtcbiAgICAgICAgICAgIHR5cGU6ICdNaWNyb3NvZnQuQ29udGFpbmVyUmVnaXN0cnkvcmVnaXN0cmllcy9jYWNoZVJ1bGVzQDIwMjMtMDEtMDEtcHJldmlldycsXG4gICAgICAgICAgICBwYXJlbnRJZDogYWNyLmlkLFxuICAgICAgICAgICAgbmFtZTogJ2F1dG9zY2FsZXItY2FjaGUnLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlUmVwb3NpdG9yeTogJ2doY3IuaW8vaGktZmkvZ2hhLXJ1bm5lcnMtb24tbWFuYWdlZC1lbnYnLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZXBvc2l0b3J5OiAnYXV0b3NjYWxlcidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgaWRlbnRpdHkgPSBuZXcgVXNlckFzc2lnbmVkSWRlbnRpdHkodGhpcywgJ2lkZW50aXR5Jywge1xuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBuYW1lOiAnYWNhLWFjci1hY2Nlc3MnLFxuICAgICAgICAgICAgcmVzb3VyY2VHcm91cE5hbWU6IHJnLm5hbWUsXG4gICAgICAgICAgICBsaWZlY3ljbGU6IHtcbiAgICAgICAgICAgICAgICBpZ25vcmVDaGFuZ2VzOiBbXG4gICAgICAgICAgICAgICAgICAgICd0YWdzJ1xuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFJvbGVBc3NpZ25tZW50KHRoaXMsICdyb2xlQXNzaWdubWVudCcsIHtcbiAgICAgICAgICAgIHByaW5jaXBhbElkOiBpZGVudGl0eS5wcmluY2lwYWxJZCxcbiAgICAgICAgICAgIHNjb3BlOiBhY3IuaWQsXG4gICAgICAgICAgICByb2xlRGVmaW5pdGlvbk5hbWU6ICdBY3JQdWxsJ1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBsb2cgPSBuZXcgTG9nQW5hbHl0aWNzV29ya3NwYWNlKHRoaXMsICdsb2cnLCB7XG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIG5hbWU6ICdnaGEtZXhhbXBsZS1sb2dzJyxcbiAgICAgICAgICAgIHJlc291cmNlR3JvdXBOYW1lOiByZy5uYW1lLFxuICAgICAgICAgICAgbGlmZWN5Y2xlOiB7XG4gICAgICAgICAgICAgICAgaWdub3JlQ2hhbmdlczogW1xuICAgICAgICAgICAgICAgICAgICAndGFncydcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3Qgc3RvcmFnZUFjY291bnQgPSBuZXcgUmVzb3VyY2UodGhpcywgJ3N0b3JhZ2VBY2NvdW50Jywge1xuICAgICAgICAgICAgdHlwZTogJ01pY3Jvc29mdC5TdG9yYWdlL3N0b3JhZ2VBY2NvdW50c0AyMDIzLTAxLTAxJyxcbiAgICAgICAgICAgIHBhcmVudElkOiByZy5pZCxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgbmFtZTogYGdoYXN0b3JhZ2VhY2NvdW50JHtyYW5kb20ucmVzdWx0fWAsXG4gICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICBsYXJnZUZpbGVTaGFyZXNTdGF0ZTogJ0VuYWJsZWQnXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBza3U6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1N0YW5kYXJkX0xSUydcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGtpbmQ6ICdTdG9yYWdlVjInLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxpZmVjeWNsZToge1xuICAgICAgICAgICAgICAgIGlnbm9yZUNoYW5nZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ3RhZ3MnXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3BvbnNlRXhwb3J0VmFsdWVzOiBbXG5cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc3RvcmFnZVNoYXJlID0gbmV3IFJlc291cmNlKHRoaXMsICdzdG9yYWdlU2hhcmUnLCB7XG4gICAgICAgICAgICB0eXBlOiAnTWljcm9zb2Z0LlN0b3JhZ2Uvc3RvcmFnZUFjY291bnRzL2ZpbGVTZXJ2aWNlcy9zaGFyZXNAMjAyMy0wMS0wMScsXG4gICAgICAgICAgICBuYW1lOiAnZ2hhZXhhbXBsZXNoYXJlJyxcbiAgICAgICAgICAgIHBhcmVudElkOiBgJHtzdG9yYWdlQWNjb3VudC5pZH0vZmlsZVNlcnZpY2VzL2RlZmF1bHRgLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZFByb3RvY29sczogJ1NNQicsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZXh0ZXJuYWxzU2hhcmUgPSBuZXcgUmVzb3VyY2UodGhpcywgJ2V4dGVybmFsc1NoYXJlJywge1xuICAgICAgICAgICAgdHlwZTogJ01pY3Jvc29mdC5TdG9yYWdlL3N0b3JhZ2VBY2NvdW50cy9maWxlU2VydmljZXMvc2hhcmVzQDIwMjMtMDEtMDEnLFxuICAgICAgICAgICAgbmFtZTogJ2doYWV4dGVybmFsc3NoYXJlJyxcbiAgICAgICAgICAgIHBhcmVudElkOiBgJHtzdG9yYWdlQWNjb3VudC5pZH0vZmlsZVNlcnZpY2VzL2RlZmF1bHRgLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZFByb3RvY29sczogJ1NNQicsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZW52aXJvbm1lbnQgPSBuZXcgUmVzb3VyY2UodGhpcywgJ2FjYWVudicsIHtcbiAgICAgICAgICAgIHR5cGU6ICdNaWNyb3NvZnQuQXBwL21hbmFnZWRFbnZpcm9ubWVudHNAMjAyNC0wMy0wMScsXG4gICAgICAgICAgICBwYXJlbnRJZDogcmcuaWQsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIG5hbWU6ICdnaGEtcnVubmVyLWVudmlyb25tZW50JyxcbiAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICAgIGFwcExvZ3NDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogJ2xvZy1hbmFseXRpY3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nQW5hbHl0aWNzQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWVySWQ6IGxvZy53b3Jrc3BhY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRLZXk6IGxvZy5wcmltYXJ5U2hhcmVkS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBpbmZyYXN0cnVjdHVyZVJlc291cmNlR3JvdXA6ICdtYW5hZ2VkLWFjYS1yZycsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtsb2FkUHJvZmlsZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQ29uc3VtcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtsb2FkUHJvZmlsZVR5cGU6ICdDb25zdW1wdGlvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsaWZlY3ljbGU6IHtcbiAgICAgICAgICAgICAgICBpZ25vcmVDaGFuZ2VzOiBbXG4gICAgICAgICAgICAgICAgICAgICd0YWdzJ1xuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc3RvcmFnZUFjY2Vzc0tleSA9IG5ldyBEYXRhQXphcGlSZXNvdXJjZUFjdGlvbih0aGlzLCAnc3RvcmFnZUFjY2Vzc0tleXMnLCB7XG4gICAgICAgICAgICB0eXBlOiAnTWljcm9zb2Z0LlN0b3JhZ2Uvc3RvcmFnZUFjY291bnRzQDIwMjMtMDEtMDEnLFxuICAgICAgICAgICAgYWN0aW9uOiAnbGlzdEtleXMnLFxuICAgICAgICAgICAgcmVzb3VyY2VJZDogc3RvcmFnZUFjY291bnQuaWQsXG4gICAgICAgICAgICByZXNwb25zZUV4cG9ydFZhbHVlczogWycqJ10sXG4gICAgICAgICAgICBkZXBlbmRzT246IFtcbiAgICAgICAgICAgICAgICBzdG9yYWdlQWNjb3VudFxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tY2RrL2lzc3Vlcy8xNjQxXG4gICAgICAgIC8vIEZvciBvbGRlciBBemFwaSB3YXkgdG8gZ2V0IGtleSB3b3VsZCBiZSB0aGlzIHdoZW4gKGRlZmF1bHQpIGRhdGEgb3V0cHV0IHdhcyBqc29uLiBXaXRuIDIuMC4wLWJldGEgZGVmYXVsdCB3YXMgY2hhbmdlZCB0byBIQ0xcbiAgICAgICAgLy8gY29uc3QgYWNjZXNzS2V5ID0gRm4ubG9va3VwKEZuLmVsZW1lbnQoRm4ubG9va3VwKEZuLmpzb25kZWNvZGUoc3RvcmFnZUFjY2Vzc0tleS5vdXRwdXQgYXMgYW55KSwgJ2tleXMnKSwgMCksICd2YWx1ZScpXG5cbiAgICAgICAgY29uc3QgYWNjZXNzS2V5ID0gRm4ubG9va3VwKEZuLmVsZW1lbnQoRm4uZWxlbWVudChzdG9yYWdlQWNjZXNzS2V5Lm91dHB1dC5sb29rdXAoJzAnKSwgMCksIDApLCAndmFsdWUnKVxuXG4gICAgICAgIGNvbnN0IGFjYUVudlN0b3JhZ2UgPSBuZXcgQ29udGFpbmVyQXBwRW52aXJvbm1lbnRTdG9yYWdlKHRoaXMsICdhY2FlbnZzdG9yYWdlJywge1xuICAgICAgICAgICAgbmFtZTogJ2doYXJ1bm5lcmpvYnN0b3JhZ2UnLFxuICAgICAgICAgICAgYWNjZXNzS2V5LFxuICAgICAgICAgICAgYWNjZXNzTW9kZTogJ1JlYWRXcml0ZScsXG4gICAgICAgICAgICBhY2NvdW50TmFtZTogc3RvcmFnZUFjY291bnQubmFtZSxcbiAgICAgICAgICAgIGNvbnRhaW5lckFwcEVudmlyb25tZW50SWQ6IGVudmlyb25tZW50LmlkLFxuICAgICAgICAgICAgc2hhcmVOYW1lOiBzdG9yYWdlU2hhcmUubmFtZSxcbiAgICAgICAgICAgIGRlcGVuZHNPbjogW1xuICAgICAgICAgICAgICAgIC8vIE5hbWUgZG9lc24ndCBjcmVhdGUgZGVwZW5kc09uIHJlcXVpcmVtZW50LCBzbyBhZGRpbmcgdGhhdCBleHBsaWNpdGx5XG4gICAgICAgICAgICAgICAgc3RvcmFnZVNoYXJlXG4gICAgICAgICAgICBdIFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBhY2FFeHRlcm5hbFN0b3JhZ2UgPSBuZXcgQ29udGFpbmVyQXBwRW52aXJvbm1lbnRTdG9yYWdlKHRoaXMsICdhY2FleHRlcm5hbHN0b3JhZ2UnLCB7XG4gICAgICAgICAgICBuYW1lOiAnZ2hhcnVubmVyZXh0ZXJuYWxzdG9yYWdlJyxcbiAgICAgICAgICAgIGFjY2Vzc0tleSxcbiAgICAgICAgICAgIGFjY2Vzc01vZGU6ICdSZWFkV3JpdGUnLFxuICAgICAgICAgICAgYWNjb3VudE5hbWU6IHN0b3JhZ2VBY2NvdW50Lm5hbWUsXG4gICAgICAgICAgICBjb250YWluZXJBcHBFbnZpcm9ubWVudElkOiBlbnZpcm9ubWVudC5pZCxcbiAgICAgICAgICAgIHNoYXJlTmFtZTogZXh0ZXJuYWxzU2hhcmUubmFtZSxcbiAgICAgICAgICAgIGRlcGVuZHNPbjogW1xuICAgICAgICAgICAgICAgIC8vIE5hbWUgZG9lc24ndCBjcmVhdGUgZGVwZW5kc09uIHJlcXVpcmVtZW50LCBzbyBhZGRpbmcgdGhhdCBleHBsaWNpdGx5XG4gICAgICAgICAgICAgICAgZXh0ZXJuYWxzU2hhcmVcbiAgICAgICAgICAgIF0gXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJ1bm5lclZvbHVtZU5hbWUgPSAnd29yaydcbiAgICAgICAgY29uc3QgZXh0ZXJuYWxWb2x1bWVOYW1lID0gJ2V4dGVybmFscydcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHNlZSBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvdGVtcGxhdGVzL21pY3Jvc29mdC5hcHAvam9icz9waXZvdHM9ZGVwbG95bWVudC1sYW5ndWFnZS10ZXJyYWZvcm1cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGdoYVJ1bm5lckpvYiA9IG5ldyBSZXNvdXJjZSh0aGlzLCAnZ2hhUnVubmVySm9iJywge1xuICAgICAgICAgICAgdHlwZTogJ01pY3Jvc29mdC5BcHAvam9ic0AyMDI0LTAyLTAyLXByZXZpZXcnLFxuICAgICAgICAgICAgaWRlbnRpdHk6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdVc2VyQXNzaWduZWQnLFxuICAgICAgICAgICAgICAgICAgICBpZGVudGl0eUlkczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHkuaWRcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBuYW1lOiAnZ2hhLXJ1bm5lci1qb2ItMDEnLFxuICAgICAgICAgICAgcGFyZW50SWQ6IHJnLmlkLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYW51YWxUcmlnZ2VyQ29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWxsZWxpc206IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGljYUNvbXBsZXRpb25Db3VudDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZTogJ01hbnVhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsaWNhVGltZW91dDogMTIwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJpZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aXR5OiBpZGVudGl0eS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyOiBhY3IubG9naW5TZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudElkOiBlbnZpcm9ubWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5OiAnMkdpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGF2ZSB0byB1c2UgY3VzdG9tIGltYWdlIGFzIHdlIHdhbnQgdG8gcnVuIHNlcnZpY2UgYXMgcm9vdCB0byBiZSBhYmxlIHRvIGluc3RhbGwgcGFja2FnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IGAke2Fjci5sb2dpblNlcnZlcn0vcm9vdC1hY3Rpb25zLXJ1bm5lcjpsYXRlc3RgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IFsnL2Jpbi9zaCcsICctYycsICdleHBvcnQgRVhFQ0lEPSQoY2F0IC9wcm9jL3N5cy9rZXJuZWwvcmFuZG9tL3V1aWQpICYmIG1rZGlyIC1wIC90bXAvX3dvcmsvJEVYRUNJRCAmJiBsbiAtcyAvdG1wL193b3JrLyRFWEVDSUQgX3dvcmsgJiYgL2hvbWUvcnVubmVyL3J1bi5zaCA7IHJtIC1yIC90bXAvX3dvcmsvJEVYRUNJRCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVNb3VudHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudFBhdGg6ICcvdG1wL193b3JrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVOYW1lOiBydW5uZXJWb2x1bWVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudFBhdGg6ICcvdG1wL2V4dGVybmFscycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lTmFtZTogZXh0ZXJuYWxWb2x1bWVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvYXp1cmUtY29udGFpbmVyLWFwcHMvaXNzdWVzLzUwMiNpc3N1ZWNvbW1lbnQtMTM0MDIyNTQzOFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdBUFBTRVRUSU5HX1dFQlNJVEVfU0lURV9OQU1FJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ2lkZW50aXR5LXdvcmthcm91bmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9henVyZS1jb250YWluZXItYXBwcy9pc3N1ZXMvNDQyI2lzc3VlY29tbWVudC0xNjY1NjIxMDMxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FaVVJFX0NMSUVOVF9JRCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGlkZW50aXR5LmNsaWVudElkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdSR19OQU1FJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmcubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnTE9HX0lEJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbG9nLndvcmtzcGFjZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdTVE9SQUdFX05BTUUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBhY2FFbnZTdG9yYWdlLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0VYVEVSTkFMX1NUT1JBR0VfTkFNRScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGFjYUV4dGVybmFsU3RvcmFnZS5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdTVUJTQ1JJUFRJT05fSUQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzdWIuc3Vic2NyaXB0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FDQV9FTlZJUk9OTUVOVF9JRCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVudmlyb25tZW50LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBydW5uZXJWb2x1bWVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlTmFtZTogYWNhRW52U3RvcmFnZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlVHlwZTogJ0F6dXJlRmlsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50T3B0aW9uczogJ21mc3ltbGlua3MnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGV4dGVybmFsVm9sdW1lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZU5hbWU6IGFjYUV4dGVybmFsU3RvcmFnZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlVHlwZTogJ0F6dXJlRmlsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50T3B0aW9uczogJ21mc3ltbGlua3MnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlcGVuZHNPbjogW1xuICAgICAgICAgICAgICAgIHJ1bm5lckNhY2hlXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbGlmZWN5Y2xlOiB7XG4gICAgICAgICAgICAgICAgaWdub3JlQ2hhbmdlczogW1xuICAgICAgICAgICAgICAgICAgICAndGFncydcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGF1dG9zY2FsZXJBcHAgPSBuZXcgQ29udGFpbmVyQXBwKHRoaXMsICdhdXRvc2NhbGVyQXBwJywge1xuICAgICAgICAgICAgY29udGFpbmVyQXBwRW52aXJvbm1lbnRJZDogZW52aXJvbm1lbnQuaWQsXG4gICAgICAgICAgICBuYW1lOiAnYXV0b3NjYWxlci1hcHAtMDEnLFxuICAgICAgICAgICAgcmVzb3VyY2VHcm91cE5hbWU6IHJnLm5hbWUsXG4gICAgICAgICAgICByZXZpc2lvbk1vZGU6ICdTaW5nbGUnLFxuICAgICAgICAgICAgaWRlbnRpdHk6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3lzdGVtQXNzaWduZWQsIFVzZXJBc3NpZ25lZCcsXG4gICAgICAgICAgICAgICAgaWRlbnRpdHlJZHM6IFtcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHkuaWRcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VjcmV0OiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAncGF0JyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBhdC52YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZWdpc3RyeTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHk6IGlkZW50aXR5LmlkLFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXI6IGFjci5sb2dpblNlcnZlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB0ZW1wbGF0ZToge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDUFUgYW5kIE1lbW9yeSBjYW4gYmUgbG93ZXIgd2l0aCB3b3JrbG9hZCBwcm9maWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBjcHU6IDAuMjUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnk6ICcwLjVHaScsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZTogYCR7YWNyLmxvZ2luU2VydmVyfS9hdXRvc2NhbGVyOnRlc3RgLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2F1dG9zY2FsZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW52OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnUEFUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjcmV0TmFtZTogJ3BhdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdHSVRIVUJfQ09ORklHX1VSTCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnaXRodWJDb25maWdVcmwudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FaVVJFX1RFTkFOVF9JRCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzdWIudGVuYW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdTVUJTQ1JJUFRJT05fSUQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc3ViLnN1YnNjcmlwdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdSRVNPVVJDRV9HUk9VUF9OQU1FJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJnLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0pPQl9OQU1FJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdoYVJ1bm5lckpvYi5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdTQ0FMRV9TRVRfTkFNRScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnYWNhLXJ1bm5lci1zZXQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZXBlbmRzT246IFtcbiAgICAgICAgICAgICAgICBhdXRvc2NhbGVyQ2FjaGVcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBsaWZlY3ljbGU6IHtcbiAgICAgICAgICAgICAgICBpZ25vcmVDaGFuZ2VzOiBbXG4gICAgICAgICAgICAgICAgICAgICd0YWdzJyxcbiAgICAgICAgICAgICAgICAgICAgJ3dvcmtsb2FkX3Byb2ZpbGVfbmFtZSdcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvYXp1cmUtY29udGFpbmVyLWFwcHMvaXNzdWVzLzEwMjRcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHJvbGUgPSBuZXcgUm9sZURlZmluaXRpb24odGhpcywgJ2pvYlJvbGUnLCB7XG4gICAgICAgICAgICBuYW1lOiBgZ2hhLWV4YW1wbGUtcmV2aXNpb24tc3RhcnQtcm9sZS0ke3JhbmRvbS5yZXN1bHR9YCxcbiAgICAgICAgICAgIHNjb3BlOiBzdWIuaWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ21pY3Jvc29mdC5hcHAvam9icy9zdGFydC9hY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21pY3Jvc29mdC5hcHAvam9icy9zdG9wL2FjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAnbWljcm9zb2Z0LmFwcC9qb2JzL3JlYWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21pY3Jvc29mdC5hcHAvam9icy9leGVjdXRpb25zL3JlYWQnLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBqb2JDcmVhdGlvblJvbGUgPSBuZXcgUm9sZURlZmluaXRpb24odGhpcywgJ2pvYkNyZWF0aW9uUm9sZScsIHtcbiAgICAgICAgICAgIG5hbWU6IGBnaGEtZXhhbXBsZS1yZXZpc2lvbi1jcmVhdGUtcm9sZS0ke3JhbmRvbS5yZXN1bHR9YCxcbiAgICAgICAgICAgIHNjb3BlOiBzdWIuaWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ21pY3Jvc29mdC5hcHAvam9icy9zdGFydC9hY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21pY3Jvc29mdC5hcHAvam9icy9zdG9wL2FjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAnbWljcm9zb2Z0LmFwcC9qb2JzL3JlYWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21pY3Jvc29mdC5hcHAvam9icy93cml0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnbWljcm9zb2Z0LmFwcC9qb2JzL2V4ZWN1dGlvbnMvcmVhZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnbWljcm9zb2Z0LmFwcC9tYW5hZ2VkRW52aXJvbm1lbnRzL2pvaW4vYWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdtaWNyb3NvZnQuYXBwL2pvYnMvZGVsZXRlJyAvLyBjbGVhbnVwIGZvciBqb2JzXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEFsbG93IGF1dG9zY2FsZXIgdG8gY3JlYXRlIG5ldyByZXZpc2lvbiBvZiBhcHBcbiAgICAgICAgbmV3IFJvbGVBc3NpZ25tZW50KHRoaXMsICdzY2FsZUpvYlJvbGVBc3NpZ25tZW50Jywge1xuICAgICAgICAgICAgcHJpbmNpcGFsSWQ6IGF1dG9zY2FsZXJBcHAuaWRlbnRpdHkucHJpbmNpcGFsSWQsXG4gICAgICAgICAgICBzY29wZTogZ2hhUnVubmVySm9iLmlkLFxuICAgICAgICAgICAgcm9sZURlZmluaXRpb25JZDogcm9sZS5yb2xlRGVmaW5pdGlvblJlc291cmNlSWRcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBBbGxvdyBydW5uZXIgdG8gc3RhcnQgdGhlIGpvYi4gQXMgZWFjaCBvbmUgY3JlYXRlZCBuZXcgam9iLCBoYXZlIHRvIGdpdmUgdG8gUkcgbGV2ZWwuXG4gICAgICAgIG5ldyBSb2xlQXNzaWdubWVudCh0aGlzLCAnYWN0aW9uQ29udGFpbmVyU3RhcnRSb2xlQXNzaWdubWVudCcsIHtcbiAgICAgICAgICAgIHByaW5jaXBhbElkOiBpZGVudGl0eS5wcmluY2lwYWxJZCxcbiAgICAgICAgICAgIHNjb3BlOiByZy5pZCxcbiAgICAgICAgICAgIHJvbGVEZWZpbml0aW9uSWQ6IGpvYkNyZWF0aW9uUm9sZS5yb2xlRGVmaW5pdGlvblJlc291cmNlSWRcbiAgICAgICAgfSlcblxuICAgICAgICBuZXcgUm9sZUFzc2lnbm1lbnQodGhpcywgJ2ltYWdlUHVzaFJvbGVBc3NpZ25tZW50Jywge1xuICAgICAgICAgICAgcHJpbmNpcGFsSWQ6IGlkZW50aXR5LnByaW5jaXBhbElkLFxuICAgICAgICAgICAgc2NvcGU6IGFjci5pZCxcbiAgICAgICAgICAgIHJvbGVEZWZpbml0aW9uTmFtZTogJ0FjclB1c2gnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBSb2xlQXNzaWdubWVudCh0aGlzLCAnam9iTG9nUmVhZEFzc2lnbm1lbnQnLCB7XG4gICAgICAgICAgICBwcmluY2lwYWxJZDogaWRlbnRpdHkucHJpbmNpcGFsSWQsXG4gICAgICAgICAgICBzY29wZTogbG9nLmlkLFxuICAgICAgICAgICAgcm9sZURlZmluaXRpb25OYW1lOiAnTG9nIEFuYWx5dGljcyBSZWFkZXInXG4gICAgICAgIH0pXG4gICAgfVxufSJdfQ==
@@ -0,0 +1,7 @@
1
+ import { TerraformVariable } from "cdktf";
2
+ import { Construct } from "constructs";
3
+ export interface Variables {
4
+ pat: TerraformVariable;
5
+ githubConfigUrl: TerraformVariable;
6
+ }
7
+ export declare function commonVariables(scope: Construct): Variables;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.commonVariables = commonVariables;
4
+ const cdktf_1 = require("cdktf");
5
+ function commonVariables(scope) {
6
+ const pat = new cdktf_1.TerraformVariable(scope, 'PAT', {
7
+ description: 'Github PAT with Actions:Read and Admin:Read+Write scopes',
8
+ nullable: false,
9
+ sensitive: true
10
+ });
11
+ const githubConfigUrl = new cdktf_1.TerraformVariable(scope, 'github_config_url', {
12
+ description: 'Github URL where runners should register to. Format https://<GitHub host>/<your_enterprise/org/repo>',
13
+ nullable: false,
14
+ });
15
+ return {
16
+ pat,
17
+ githubConfigUrl
18
+ };
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi92YXJpYWJsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFRQSwwQ0FnQkM7QUF4QkQsaUNBQTBDO0FBUTFDLFNBQWdCLGVBQWUsQ0FBQyxLQUFnQjtJQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLHlCQUFpQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7UUFDNUMsV0FBVyxFQUFFLDBEQUEwRDtRQUN2RSxRQUFRLEVBQUUsS0FBSztRQUNmLFNBQVMsRUFBRSxJQUFJO0tBQ2xCLENBQUMsQ0FBQTtJQUVGLE1BQU0sZUFBZSxHQUFHLElBQUkseUJBQWlCLENBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFO1FBQ3RFLFdBQVcsRUFBRSxzR0FBc0c7UUFDbkgsUUFBUSxFQUFFLEtBQUs7S0FDbEIsQ0FBQyxDQUFBO0lBRUYsT0FBTztRQUNILEdBQUc7UUFDSCxlQUFlO0tBQ2xCLENBQUE7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVycmFmb3JtVmFyaWFibGUgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGVzIHtcbiAgICBwYXQ6IFRlcnJhZm9ybVZhcmlhYmxlO1xuICAgIGdpdGh1YkNvbmZpZ1VybDogVGVycmFmb3JtVmFyaWFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21tb25WYXJpYWJsZXMoc2NvcGU6IENvbnN0cnVjdCk6IFZhcmlhYmxlcyB7XG4gICAgY29uc3QgcGF0ID0gbmV3IFRlcnJhZm9ybVZhcmlhYmxlKHNjb3BlLCAnUEFUJywge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ0dpdGh1YiBQQVQgd2l0aCBBY3Rpb25zOlJlYWQgYW5kIEFkbWluOlJlYWQrV3JpdGUgc2NvcGVzJyxcbiAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICBzZW5zaXRpdmU6IHRydWVcbiAgICB9KVxuXG4gICAgY29uc3QgZ2l0aHViQ29uZmlnVXJsID0gbmV3IFRlcnJhZm9ybVZhcmlhYmxlKHNjb3BlLCAnZ2l0aHViX2NvbmZpZ191cmwnLCB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnR2l0aHViIFVSTCB3aGVyZSBydW5uZXJzIHNob3VsZCByZWdpc3RlciB0by4gRm9ybWF0IGh0dHBzOi8vPEdpdEh1YiBob3N0Pi88eW91cl9lbnRlcnByaXNlL29yZy9yZXBvPicsXG4gICAgICAgIG51bGxhYmxlOiBmYWxzZSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcGF0LFxuICAgICAgICBnaXRodWJDb25maWdVcmxcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};