@aws-cdk/aws-imagebuilder-alpha 2.226.0-alpha.0 → 2.228.0-alpha.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,970 @@
1
+ "use strict";
2
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
3
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
4
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
5
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
6
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
7
+ var _, done = false;
8
+ for (var i = decorators.length - 1; i >= 0; i--) {
9
+ var context = {};
10
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
11
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
12
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
13
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
14
+ if (kind === "accessor") {
15
+ if (result === void 0) continue;
16
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
17
+ if (_ = accept(result.get)) descriptor.get = _;
18
+ if (_ = accept(result.set)) descriptor.set = _;
19
+ if (_ = accept(result.init)) initializers.unshift(_);
20
+ }
21
+ else if (_ = accept(result)) {
22
+ if (kind === "field") initializers.unshift(_);
23
+ else descriptor[key] = _;
24
+ }
25
+ }
26
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
27
+ done = true;
28
+ };
29
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
30
+ var useValue = arguments.length > 2;
31
+ for (var i = 0; i < initializers.length; i++) {
32
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
33
+ }
34
+ return useValue ? value : void 0;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.Component = exports.AwsMarketplaceComponent = exports.AwsManagedComponent = exports.S3ComponentData = exports.ComponentData = exports.ComponentStepIfCondition = exports.ComponentStepInputs = exports.ComponentSchemaVersion = exports.ComponentPhaseName = exports.ComponentParameterType = exports.ComponentOnFailure = exports.ComponentAction = exports.ComponentConstantValue = void 0;
38
+ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
39
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
40
+ const cdk = require("aws-cdk-lib");
41
+ const iam = require("aws-cdk-lib/aws-iam");
42
+ const aws_imagebuilder_1 = require("aws-cdk-lib/aws-imagebuilder");
43
+ const s3assets = require("aws-cdk-lib/aws-s3-assets");
44
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
45
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
46
+ const yaml = require("yaml");
47
+ const os_version_1 = require("./os-version");
48
+ const COMPONENT_SYMBOL = Symbol.for('@aws-cdk/aws-imagebuilder-alpha.Component');
49
+ const LATEST_VERSION = 'x.x.x';
50
+ /**
51
+ * The value of a constant in a component document
52
+ */
53
+ class ComponentConstantValue {
54
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.ComponentConstantValue", version: "2.228.0-alpha.0" };
55
+ /**
56
+ * Creates a string type constant in a component document
57
+ *
58
+ * @param value The value of the constant
59
+ */
60
+ static fromString(value) {
61
+ return new ComponentConstantValue('string', value);
62
+ }
63
+ /**
64
+ * The data type of the constant
65
+ */
66
+ type;
67
+ /**
68
+ * The value of the constant
69
+ */
70
+ value;
71
+ constructor(type, value) {
72
+ this.type = type;
73
+ this.value = value;
74
+ }
75
+ }
76
+ exports.ComponentConstantValue = ComponentConstantValue;
77
+ /**
78
+ * The action for a step within the component document
79
+ */
80
+ var ComponentAction;
81
+ (function (ComponentAction) {
82
+ /**
83
+ * The AppendFile action adds the provided content to the pre-existing content of a file
84
+ */
85
+ ComponentAction["APPEND_FILE"] = "AppendFile";
86
+ /**
87
+ * The Assert action performs value with comparison/logic operators, and succeeds/fails the step based on the outcome
88
+ * of the assertion
89
+ */
90
+ ComponentAction["ASSERT"] = "Assert";
91
+ /**
92
+ * The CopyFile action copies files from a source file to a destination
93
+ */
94
+ ComponentAction["COPY_FILE"] = "CopyFile";
95
+ /**
96
+ * The CopyFolder action copies folders from a source to a destination
97
+ */
98
+ ComponentAction["COPY_FOLDER"] = "CopyFolder";
99
+ /**
100
+ * The CreateFile action creates a file in the provided location
101
+ */
102
+ ComponentAction["CREATE_FILE"] = "CreateFile";
103
+ /**
104
+ * The CreateFolder action creates a folder in the provided location
105
+ */
106
+ ComponentAction["CREATE_FOLDER"] = "CreateFolder";
107
+ /**
108
+ * The CreateSymlink action creates symbolic links from a given path to a target
109
+ */
110
+ ComponentAction["CREATE_SYMLINK"] = "CreateSymlink";
111
+ /**
112
+ * The DeleteFile action deletes file(s) in the provided location
113
+ */
114
+ ComponentAction["DELETE_FILE"] = "DeleteFile";
115
+ /**
116
+ * The DeleteFolder action deletes folders in the provided location
117
+ */
118
+ ComponentAction["DELETE_FOLDER"] = "DeleteFolder";
119
+ /**
120
+ * The ExecuteBash action runs bash scripts with inline bash commands
121
+ */
122
+ ComponentAction["EXECUTE_BASH"] = "ExecuteBash";
123
+ /**
124
+ * The ExecuteBinary action runs a provided binary executable
125
+ */
126
+ ComponentAction["EXECUTE_BINARY"] = "ExecuteBinary";
127
+ /**
128
+ * The ExecuteDocument action allows running other component documents from within a given component
129
+ */
130
+ ComponentAction["EXECUTE_DOCUMENT"] = "ExecuteDocument";
131
+ /**
132
+ * The ExecutePowershell action runs PowerShell scripts with inline PowerShell commands
133
+ */
134
+ ComponentAction["EXECUTE_POWERSHELL"] = "ExecutePowerShell";
135
+ /**
136
+ * The InstallMSI action runs a Windows application with the provided MSI file
137
+ */
138
+ ComponentAction["INSTALL_MSI"] = "InstallMSI";
139
+ /**
140
+ * The ListFiles action lists files in the provided folder
141
+ */
142
+ ComponentAction["LIST_FILES"] = "ListFiles";
143
+ /**
144
+ * The MoveFile action moves files from a source to a destination
145
+ */
146
+ ComponentAction["MOVE_FILE"] = "MoveFile";
147
+ /**
148
+ * The MoveFolder action moves folders from a source to a destination
149
+ */
150
+ ComponentAction["MOVE_FOLDER"] = "MoveFolder";
151
+ /**
152
+ * The ReadFile action reads the content of a text file
153
+ */
154
+ ComponentAction["READ_FILE"] = "ReadFile";
155
+ /**
156
+ * The Reboot action reboots the instance
157
+ */
158
+ ComponentAction["REBOOT"] = "Reboot";
159
+ /**
160
+ * The SetFileEncoding action modifies the encoding property of an existing file
161
+ */
162
+ ComponentAction["SET_FILE_ENCODING"] = "SetFileEncoding";
163
+ /**
164
+ * The SetFileOwner action modifies the owner and group ownership properties of an existing file
165
+ */
166
+ ComponentAction["SET_FILE_OWNER"] = "SetFileOwner";
167
+ /**
168
+ * The SetFolderOwner action recursively modifies the owner and group ownership properties of an existing folder
169
+ */
170
+ ComponentAction["SET_FOLDER_OWNER"] = "SetFolderOwner";
171
+ /**
172
+ * The SetFilePermissions action modifies the permission of an existing file
173
+ */
174
+ ComponentAction["SET_FILE_PERMISSIONS"] = "SetFilePermissions";
175
+ /**
176
+ * The SetFolderPermissions action recursively modifies the permissions of an existing folder and all of its subfiles
177
+ * and subfolders
178
+ */
179
+ ComponentAction["SET_FOLDER_PERMISSIONS"] = "SetFolderPermissions";
180
+ /**
181
+ * The SetRegistry action sets the value for the specified Windows registry key
182
+ */
183
+ ComponentAction["SET_REGISTRY"] = "SetRegistry";
184
+ /**
185
+ * The S3Download action downloads an Amazon S3 object/folder to a local destination
186
+ */
187
+ ComponentAction["S3_DOWNLOAD"] = "S3Download";
188
+ /**
189
+ * The S3Upload action uploads a file or folder to an Amazon S3 location
190
+ */
191
+ ComponentAction["S3_UPLOAD"] = "S3Upload";
192
+ /**
193
+ * The UninstallMSI action removes a Windows application using an MSI file
194
+ */
195
+ ComponentAction["UNINSTALL_MSI"] = "UninstallMSI";
196
+ /**
197
+ * The UpdateOS action installs OS updates
198
+ */
199
+ ComponentAction["UPDATE_OS"] = "UpdateOS";
200
+ /**
201
+ * The WebDownload action downloads files from a URL to a local destination
202
+ */
203
+ ComponentAction["WEB_DOWNLOAD"] = "WebDownload";
204
+ })(ComponentAction || (exports.ComponentAction = ComponentAction = {}));
205
+ /**
206
+ * Specifies what the step should do in case of failure
207
+ */
208
+ var ComponentOnFailure;
209
+ (function (ComponentOnFailure) {
210
+ /**
211
+ * Fails the step and document execution
212
+ */
213
+ ComponentOnFailure["ABORT"] = "Abort";
214
+ /**
215
+ * Fails the step and proceeds to execute the next step in the document
216
+ */
217
+ ComponentOnFailure["CONTINUE"] = "Continue";
218
+ /**
219
+ * Ignores the step and proceeds to execute the next step in the document
220
+ */
221
+ ComponentOnFailure["IGNORE"] = "Ignore";
222
+ })(ComponentOnFailure || (exports.ComponentOnFailure = ComponentOnFailure = {}));
223
+ /**
224
+ * The parameter type in a component document
225
+ */
226
+ var ComponentParameterType;
227
+ (function (ComponentParameterType) {
228
+ /**
229
+ * Indicates the parameter value is a string
230
+ */
231
+ ComponentParameterType["STRING"] = "string";
232
+ })(ComponentParameterType || (exports.ComponentParameterType = ComponentParameterType = {}));
233
+ /**
234
+ * The phases of a component document
235
+ */
236
+ var ComponentPhaseName;
237
+ (function (ComponentPhaseName) {
238
+ /**
239
+ * Build phase of the component. This phase is run during the BUILDING phase of the image build.
240
+ */
241
+ ComponentPhaseName["BUILD"] = "build";
242
+ /**
243
+ * Test phase of the component, executed directly on the instance which is used to build the container image. This
244
+ * phase is run during the TESTING phase of the image build.
245
+ */
246
+ ComponentPhaseName["CONTAINER_HOST_TEST"] = "container-host-test";
247
+ /**
248
+ * Test phase of the component. This phase is run during the TESTING phase of the image build.
249
+ */
250
+ ComponentPhaseName["TEST"] = "test";
251
+ /**
252
+ * Validate phase of the component. This phase is run during the BUILDING phase of the image build, after the build
253
+ * step of the component is executed.
254
+ */
255
+ ComponentPhaseName["VALIDATE"] = "validate";
256
+ })(ComponentPhaseName || (exports.ComponentPhaseName = ComponentPhaseName = {}));
257
+ /**
258
+ * The schema version of the component
259
+ */
260
+ var ComponentSchemaVersion;
261
+ (function (ComponentSchemaVersion) {
262
+ /**
263
+ * Schema version 1.0 for the component document
264
+ */
265
+ ComponentSchemaVersion["V1_0"] = "1.0";
266
+ })(ComponentSchemaVersion || (exports.ComponentSchemaVersion = ComponentSchemaVersion = {}));
267
+ /**
268
+ * Represents the inputs for a step in the component document
269
+ */
270
+ class ComponentStepInputs {
271
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.ComponentStepInputs", version: "2.228.0-alpha.0" };
272
+ /**
273
+ * Creates the input value from an object, for the component step
274
+ *
275
+ * @param inputsObject The object containing the input values
276
+ */
277
+ static fromObject(inputsObject) {
278
+ return new ComponentStepInputs(inputsObject);
279
+ }
280
+ /**
281
+ * Creates the input value from a list of input objects, for the component step
282
+ *
283
+ * @param inputsObjectList The list of objects containing the input values
284
+ */
285
+ static fromList(inputsObjectList) {
286
+ return new ComponentStepInputs(inputsObjectList);
287
+ }
288
+ /**
289
+ * The rendered input value
290
+ */
291
+ inputs;
292
+ constructor(input) {
293
+ this.inputs = input;
294
+ }
295
+ }
296
+ exports.ComponentStepInputs = ComponentStepInputs;
297
+ /**
298
+ * Represents an `if` condition in the component document
299
+ */
300
+ class ComponentStepIfCondition {
301
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.ComponentStepIfCondition", version: "2.228.0-alpha.0" };
302
+ /**
303
+ * Creates the `if` value from an object, for the component step
304
+ *
305
+ * @param ifObject The object containing the `if` condition
306
+ */
307
+ static fromObject(ifObject) {
308
+ return new ComponentStepIfCondition(ifObject);
309
+ }
310
+ /**
311
+ * The rendered input value
312
+ */
313
+ ifCondition;
314
+ constructor(ifCondition) {
315
+ this.ifCondition = ifCondition;
316
+ }
317
+ }
318
+ exports.ComponentStepIfCondition = ComponentStepIfCondition;
319
+ /**
320
+ * Helper class for referencing and uploading component data
321
+ */
322
+ class ComponentData {
323
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.ComponentData", version: "2.228.0-alpha.0" };
324
+ /**
325
+ * Uploads component data from a local file to S3 to use as the component data
326
+ *
327
+ * @param scope The construct scope
328
+ * @param id Identifier of the construct
329
+ * @param path The local path to the component data file
330
+ * @param options S3 asset upload options
331
+ */
332
+ static fromAsset(scope, id, path, options = {}) {
333
+ const asset = new s3assets.Asset(scope, id, { ...options, path });
334
+ return new S3ComponentDataFromAsset(asset);
335
+ }
336
+ /**
337
+ * References component data from a pre-existing S3 object
338
+ *
339
+ * @param bucket The S3 bucket where the component data is stored
340
+ * @param key The S3 key of the component data file
341
+ */
342
+ static fromS3(bucket, key) {
343
+ return new S3ComponentDataFromBucketKey(bucket, key);
344
+ }
345
+ /**
346
+ * Uses an inline JSON object as the component data
347
+ *
348
+ * @param data An inline JSON object representing the component data
349
+ */
350
+ static fromJsonObject(data) {
351
+ const inlineData = yaml.stringify(data, { indent: 2 });
352
+ return new InlineComponentData(inlineData);
353
+ }
354
+ /**
355
+ * Uses an inline JSON object as the component data, using the ComponentDocument interface
356
+ *
357
+ * @param data An inline JSON object representing the component data
358
+ */
359
+ static fromComponentDocumentJsonObject(data) {
360
+ try {
361
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_ComponentDocument(data);
362
+ }
363
+ catch (error) {
364
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
365
+ Error.captureStackTrace(error, this.fromComponentDocumentJsonObject);
366
+ }
367
+ throw error;
368
+ }
369
+ const { name, description, schemaVersion, constants, parameters, phases } = data;
370
+ return this.fromJsonObject({
371
+ ...(name !== undefined && { name }),
372
+ ...(description !== undefined && { description }),
373
+ schemaVersion: schemaVersion,
374
+ ...(constants !== undefined && {
375
+ constants: Object.entries(constants).map(([constantName, value]) => ({
376
+ [constantName]: { type: value.type, value: value.value },
377
+ })),
378
+ }),
379
+ ...(parameters !== undefined && {
380
+ parameters: Object.entries(parameters).map(([parameterName, value]) => ({ [parameterName]: value })),
381
+ }),
382
+ phases: phases.map((phase) => ({
383
+ name: phase.name,
384
+ steps: phase.steps.map((step) => ({
385
+ name: step.name,
386
+ action: step.action,
387
+ ...(step.onFailure !== undefined && { onFailure: step.onFailure }),
388
+ ...(step.timeout !== undefined && { timeoutSeconds: step.timeout.toSeconds() }),
389
+ ...(step.if !== undefined && { if: step.if.ifCondition }),
390
+ ...(step.loop !== undefined && { loop: step.loop }),
391
+ inputs: step.inputs.inputs,
392
+ })),
393
+ })),
394
+ });
395
+ }
396
+ /**
397
+ * Uses an inline JSON/YAML string as the component data
398
+ *
399
+ * @param data An inline JSON/YAML string representing the component data
400
+ */
401
+ static fromInline(data) {
402
+ return new InlineComponentData(data);
403
+ }
404
+ /**
405
+ * The resulting inline string or S3 URL which references the component data
406
+ */
407
+ value;
408
+ constructor(value) {
409
+ this.value = value;
410
+ }
411
+ }
412
+ exports.ComponentData = ComponentData;
413
+ /**
414
+ * Helper class for S3-based component data references, containing additional permission grant methods on the S3 object
415
+ */
416
+ class S3ComponentData extends ComponentData {
417
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.S3ComponentData", version: "2.228.0-alpha.0" };
418
+ isS3Reference = true;
419
+ bucket;
420
+ key;
421
+ constructor(bucket, key) {
422
+ super(bucket.s3UrlForObject(key));
423
+ this.bucket = bucket;
424
+ this.key = key;
425
+ }
426
+ /**
427
+ * Grant put permissions to the given grantee for the component data in S3
428
+ *
429
+ * @param grantee The principal
430
+ */
431
+ grantPut(grantee) {
432
+ return this.bucket.grantPut(grantee, this.key);
433
+ }
434
+ /**
435
+ * Grant read permissions to the given grantee for the component data in S3
436
+ *
437
+ * @param grantee The principal
438
+ */
439
+ grantRead(grantee) {
440
+ return this.bucket.grantRead(grantee, this.key);
441
+ }
442
+ }
443
+ exports.S3ComponentData = S3ComponentData;
444
+ class InlineComponentData extends ComponentData {
445
+ isS3Reference = false;
446
+ constructor(data) {
447
+ super(data);
448
+ }
449
+ }
450
+ class S3ComponentDataFromBucketKey extends S3ComponentData {
451
+ constructor(bucket, key) {
452
+ super(bucket, key);
453
+ }
454
+ }
455
+ class S3ComponentDataFromAsset extends S3ComponentData {
456
+ constructor(asset) {
457
+ super(asset.bucket, asset.s3ObjectKey);
458
+ }
459
+ }
460
+ /**
461
+ * Helper class for working with AWS-managed components
462
+ */
463
+ class AwsManagedComponent {
464
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.AwsManagedComponent", version: "2.228.0-alpha.0" };
465
+ /**
466
+ * Imports the AWS CLI v2 AWS-managed component
467
+ *
468
+ * @param scope The construct scope
469
+ * @param id Identifier of the construct
470
+ * @param attrs The AWS-managed component attributes
471
+ */
472
+ static awsCliV2(scope, id, attrs) {
473
+ try {
474
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_AwsManagedComponentAttributes(attrs);
475
+ }
476
+ catch (error) {
477
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
478
+ Error.captureStackTrace(error, this.awsCliV2);
479
+ }
480
+ throw error;
481
+ }
482
+ this.validatePredefinedManagedComponentMethodAttributes({
483
+ scope,
484
+ attrs,
485
+ component: 'awsCliV2',
486
+ allowedPlatforms: [os_version_1.Platform.LINUX, os_version_1.Platform.WINDOWS],
487
+ });
488
+ if (attrs.platform === os_version_1.Platform.WINDOWS) {
489
+ return this.fromAwsManagedComponentAttributes(scope, id, {
490
+ componentName: 'aws-cli-version-2-windows',
491
+ componentVersion: attrs.componentVersion,
492
+ });
493
+ }
494
+ return this.fromAwsManagedComponentAttributes(scope, id, {
495
+ componentName: 'aws-cli-version-2-linux',
496
+ componentVersion: attrs.componentVersion,
497
+ });
498
+ }
499
+ /**
500
+ * Imports the hello world AWS-managed component
501
+ *
502
+ * @param scope The construct scope
503
+ * @param id Identifier of the construct
504
+ * @param attrs The AWS-managed component attributes
505
+ */
506
+ static helloWorld(scope, id, attrs) {
507
+ try {
508
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_AwsManagedComponentAttributes(attrs);
509
+ }
510
+ catch (error) {
511
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
512
+ Error.captureStackTrace(error, this.helloWorld);
513
+ }
514
+ throw error;
515
+ }
516
+ this.validatePredefinedManagedComponentMethodAttributes({
517
+ scope,
518
+ attrs,
519
+ component: 'helloWorld',
520
+ allowedPlatforms: [os_version_1.Platform.LINUX, os_version_1.Platform.WINDOWS],
521
+ });
522
+ if (attrs.platform === os_version_1.Platform.WINDOWS) {
523
+ return this.fromAwsManagedComponentAttributes(scope, id, {
524
+ componentName: 'hello-world-windows',
525
+ componentVersion: attrs.componentVersion,
526
+ });
527
+ }
528
+ return this.fromAwsManagedComponentAttributes(scope, id, {
529
+ componentName: 'hello-world-linux',
530
+ componentVersion: attrs.componentVersion,
531
+ });
532
+ }
533
+ /**
534
+ * Imports the Python 3 AWS-managed component
535
+ *
536
+ * @param scope The construct scope
537
+ * @param id Identifier of the construct
538
+ * @param attrs The AWS-managed component attributes
539
+ */
540
+ static python3(scope, id, attrs) {
541
+ try {
542
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_AwsManagedComponentAttributes(attrs);
543
+ }
544
+ catch (error) {
545
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
546
+ Error.captureStackTrace(error, this.python3);
547
+ }
548
+ throw error;
549
+ }
550
+ this.validatePredefinedManagedComponentMethodAttributes({
551
+ scope,
552
+ attrs,
553
+ component: 'python3',
554
+ allowedPlatforms: [os_version_1.Platform.LINUX, os_version_1.Platform.WINDOWS],
555
+ });
556
+ if (attrs.platform === os_version_1.Platform.WINDOWS) {
557
+ return this.fromAwsManagedComponentAttributes(scope, id, {
558
+ componentName: 'python-3-windows',
559
+ componentVersion: attrs.componentVersion,
560
+ });
561
+ }
562
+ return this.fromAwsManagedComponentAttributes(scope, id, {
563
+ componentName: 'python-3-linux',
564
+ componentVersion: attrs.componentVersion,
565
+ });
566
+ }
567
+ /**
568
+ * Imports the reboot AWS-managed component
569
+ *
570
+ * @param scope The construct scope
571
+ * @param id Identifier of the construct
572
+ * @param attrs The AWS-managed component attributes
573
+ */
574
+ static reboot(scope, id, attrs) {
575
+ try {
576
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_AwsManagedComponentAttributes(attrs);
577
+ }
578
+ catch (error) {
579
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
580
+ Error.captureStackTrace(error, this.reboot);
581
+ }
582
+ throw error;
583
+ }
584
+ this.validatePredefinedManagedComponentMethodAttributes({
585
+ scope,
586
+ attrs,
587
+ component: 'reboot',
588
+ allowedPlatforms: [os_version_1.Platform.LINUX, os_version_1.Platform.WINDOWS],
589
+ });
590
+ if (attrs.platform === os_version_1.Platform.WINDOWS) {
591
+ return this.fromAwsManagedComponentAttributes(scope, id, {
592
+ componentName: 'reboot-windows',
593
+ componentVersion: attrs.componentVersion,
594
+ });
595
+ }
596
+ return this.fromAwsManagedComponentAttributes(scope, id, {
597
+ componentName: 'reboot-linux',
598
+ componentVersion: attrs.componentVersion,
599
+ });
600
+ }
601
+ /**
602
+ * Imports the STIG hardening AWS-managed component
603
+ *
604
+ * @param scope The construct scope
605
+ * @param id Identifier of the construct
606
+ * @param attrs The AWS-managed component attributes
607
+ *
608
+ * @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/ib-stig.html
609
+ */
610
+ static stigBuild(scope, id, attrs) {
611
+ try {
612
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_AwsManagedComponentAttributes(attrs);
613
+ }
614
+ catch (error) {
615
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
616
+ Error.captureStackTrace(error, this.stigBuild);
617
+ }
618
+ throw error;
619
+ }
620
+ this.validatePredefinedManagedComponentMethodAttributes({
621
+ scope,
622
+ attrs,
623
+ component: 'stigBuild',
624
+ allowedPlatforms: [os_version_1.Platform.LINUX, os_version_1.Platform.WINDOWS],
625
+ });
626
+ if (attrs.platform === os_version_1.Platform.WINDOWS) {
627
+ return this.fromAwsManagedComponentAttributes(scope, id, {
628
+ componentName: 'stig-build-windows',
629
+ componentVersion: attrs.componentVersion,
630
+ });
631
+ }
632
+ return this.fromAwsManagedComponentAttributes(scope, id, {
633
+ componentName: 'stig-build-linux',
634
+ componentVersion: attrs.componentVersion,
635
+ });
636
+ }
637
+ /**
638
+ * Imports the OS update AWS-managed component
639
+ *
640
+ * @param scope The construct scope
641
+ * @param id Identifier of the construct
642
+ * @param attrs The AWS-managed component attributes
643
+ */
644
+ static updateOS(scope, id, attrs) {
645
+ try {
646
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_AwsManagedComponentAttributes(attrs);
647
+ }
648
+ catch (error) {
649
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
650
+ Error.captureStackTrace(error, this.updateOS);
651
+ }
652
+ throw error;
653
+ }
654
+ this.validatePredefinedManagedComponentMethodAttributes({
655
+ scope,
656
+ attrs,
657
+ component: 'updateOS',
658
+ allowedPlatforms: [os_version_1.Platform.LINUX, os_version_1.Platform.WINDOWS],
659
+ });
660
+ if (attrs.platform === os_version_1.Platform.WINDOWS) {
661
+ return this.fromAwsManagedComponentAttributes(scope, id, {
662
+ componentName: 'update-windows',
663
+ componentVersion: attrs.componentVersion,
664
+ });
665
+ }
666
+ return this.fromAwsManagedComponentAttributes(scope, id, {
667
+ componentName: 'update-linux',
668
+ componentVersion: attrs.componentVersion,
669
+ });
670
+ }
671
+ /**
672
+ * Imports an AWS-managed component from its attributes
673
+ *
674
+ * @param scope The construct scope
675
+ * @param id Identifier of the construct
676
+ * @param attrs The AWS-managed component attributes
677
+ */
678
+ static fromAwsManagedComponentAttributes(scope, id, attrs) {
679
+ try {
680
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_AwsManagedComponentAttributes(attrs);
681
+ }
682
+ catch (error) {
683
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
684
+ Error.captureStackTrace(error, this.fromAwsManagedComponentAttributes);
685
+ }
686
+ throw error;
687
+ }
688
+ if (attrs.platform !== undefined) {
689
+ throw new cdk.ValidationError('platform can only be used with pre-defined AWS-managed component methods, such as updateOS', scope);
690
+ }
691
+ if (attrs.componentName === undefined) {
692
+ throw new cdk.ValidationError('an AWS-managed component name is required', scope);
693
+ }
694
+ return Component.fromComponentArn(scope, id, cdk.Stack.of(scope).formatArn({
695
+ service: 'imagebuilder',
696
+ account: 'aws',
697
+ resource: 'component',
698
+ resourceName: `${attrs.componentName}/${attrs.componentVersion ?? LATEST_VERSION}`,
699
+ }));
700
+ }
701
+ /**
702
+ * Imports an AWS-managed component from its name
703
+ *
704
+ * @param scope The construct scope
705
+ * @param id Identifier of the construct
706
+ * @param awsManagedComponentName - The name of the AWS-managed component
707
+ */
708
+ static fromAwsManagedComponentName(scope, id, awsManagedComponentName) {
709
+ return this.fromAwsManagedComponentAttributes(scope, id, { componentName: awsManagedComponentName });
710
+ }
711
+ static validatePredefinedManagedComponentMethodAttributes({ scope, attrs, component, allowedPlatforms, }) {
712
+ if (attrs.componentName !== undefined) {
713
+ throw new cdk.ValidationError(`a name is not allowed for ${component}`, scope);
714
+ }
715
+ if (attrs.platform === undefined) {
716
+ throw new cdk.ValidationError(`a platform is required for ${component}`, scope);
717
+ }
718
+ if (cdk.Token.isUnresolved(attrs.platform)) {
719
+ throw new cdk.ValidationError(`platform cannot be a token for ${component}`, scope);
720
+ }
721
+ if (!allowedPlatforms.includes(attrs.platform)) {
722
+ throw new cdk.ValidationError(`${attrs.platform} is not a supported platform for ${component}`, scope);
723
+ }
724
+ }
725
+ }
726
+ exports.AwsManagedComponent = AwsManagedComponent;
727
+ /**
728
+ * Helper class for working with AWS Marketplace components
729
+ */
730
+ class AwsMarketplaceComponent {
731
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.AwsMarketplaceComponent", version: "2.228.0-alpha.0" };
732
+ /**
733
+ * Imports an AWS Marketplace component from its attributes
734
+ *
735
+ * @param scope The construct scope
736
+ * @param id Identifier of the construct
737
+ * @param attrs The AWS-managed component attributes
738
+ */
739
+ static fromAwsMarketplaceComponentAttributes(scope, id, attrs) {
740
+ try {
741
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_AwsMarketplaceComponentAttributes(attrs);
742
+ }
743
+ catch (error) {
744
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
745
+ Error.captureStackTrace(error, this.fromAwsMarketplaceComponentAttributes);
746
+ }
747
+ throw error;
748
+ }
749
+ return Component.fromComponentArn(scope, id, cdk.Stack.of(scope).formatArn({
750
+ service: 'imagebuilder',
751
+ account: 'aws-marketplace',
752
+ resource: 'component',
753
+ resourceName: `${attrs.componentName}-${attrs.marketplaceProductId}/${attrs.componentVersion ?? LATEST_VERSION}`,
754
+ }));
755
+ }
756
+ }
757
+ exports.AwsMarketplaceComponent = AwsMarketplaceComponent;
758
+ /**
759
+ * A new or imported Component
760
+ */
761
+ class ComponentBase extends cdk.Resource {
762
+ /**
763
+ * Grant custom actions to the given grantee for the component
764
+ *
765
+ * @param grantee The principal
766
+ * @param actions The list of actions
767
+ */
768
+ grant(grantee, ...actions) {
769
+ return iam.Grant.addToPrincipal({
770
+ grantee,
771
+ actions,
772
+ resourceArns: [this.componentArn],
773
+ scope: this,
774
+ });
775
+ }
776
+ /**
777
+ * Grant read permissions to the given grantee for the component
778
+ *
779
+ * @param grantee The principal
780
+ */
781
+ grantRead(grantee) {
782
+ return this.grant(grantee, 'imagebuilder:GetComponent');
783
+ }
784
+ }
785
+ /**
786
+ * Represents an EC2 Image Builder Component.
787
+ *
788
+ * @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/manage-components.html
789
+ */
790
+ let Component = (() => {
791
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
792
+ let _classDescriptor;
793
+ let _classExtraInitializers = [];
794
+ let _classThis;
795
+ let _classSuper = ComponentBase;
796
+ var Component = class extends _classSuper {
797
+ static { _classThis = this; }
798
+ static {
799
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
800
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
801
+ Component = _classThis = _classDescriptor.value;
802
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
803
+ }
804
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.Component", version: "2.228.0-alpha.0" };
805
+ /** Uniquely identifies this class. */
806
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-imagebuilder-alpha.Component';
807
+ /**
808
+ * Import an existing component given its ARN.
809
+ */
810
+ static fromComponentArn(scope, id, componentArn) {
811
+ return this.fromComponentAttributes(scope, id, { componentArn });
812
+ }
813
+ /**
814
+ * Import an existing component given its name. The provided name must be normalized by converting all alphabetical
815
+ * characters to lowercase, and replacing all spaces and underscores with hyphens.
816
+ */
817
+ static fromComponentName(scope, id, componentName) {
818
+ return this.fromComponentAttributes(scope, id, { componentName });
819
+ }
820
+ /**
821
+ * Import an existing component by providing its attributes. If the component name is provided as an attribute, it
822
+ * must be normalized by converting all alphabetical characters to lowercase, and replacing all spaces and underscores
823
+ * with hyphens.
824
+ */
825
+ static fromComponentAttributes(scope, id, attrs) {
826
+ try {
827
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_ComponentAttributes(attrs);
828
+ }
829
+ catch (error) {
830
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
831
+ Error.captureStackTrace(error, this.fromComponentAttributes);
832
+ }
833
+ throw error;
834
+ }
835
+ if (attrs.componentArn && (attrs.componentName || attrs.componentVersion)) {
836
+ throw new cdk.ValidationError('a componentName or componentVersion cannot be provided when a componentArn is provided', scope);
837
+ }
838
+ if (!attrs.componentArn && !attrs.componentName) {
839
+ throw new cdk.ValidationError('either componentArn or componentName is required', scope);
840
+ }
841
+ const componentArn = attrs.componentArn ??
842
+ cdk.Stack.of(scope).formatArn({
843
+ service: 'imagebuilder',
844
+ resource: 'component',
845
+ resourceName: `${attrs.componentName}/${attrs.componentVersion ?? LATEST_VERSION}`,
846
+ });
847
+ const [componentName, componentVersion] = (() => {
848
+ if (attrs.componentName) {
849
+ return [attrs.componentName, attrs.componentVersion ?? LATEST_VERSION];
850
+ }
851
+ const componentNameVersion = cdk.Stack.of(scope).splitArn(componentArn, cdk.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
852
+ const componentNameVersionSplit = cdk.Fn.split('/', componentNameVersion);
853
+ return [cdk.Fn.select(0, componentNameVersionSplit), cdk.Fn.select(1, componentNameVersionSplit)];
854
+ })();
855
+ class Import extends ComponentBase {
856
+ componentArn = componentArn;
857
+ componentName = componentName;
858
+ componentVersion = componentVersion;
859
+ }
860
+ return new Import(scope, id);
861
+ }
862
+ /**
863
+ * Return whether the given object is a Component.
864
+ */
865
+ static isComponent(x) {
866
+ return x !== null && typeof x === 'object' && COMPONENT_SYMBOL in x;
867
+ }
868
+ /**
869
+ * The ARN of the component
870
+ */
871
+ componentArn;
872
+ /**
873
+ * The name of the component
874
+ */
875
+ componentName;
876
+ /**
877
+ * The version of the component
878
+ */
879
+ componentVersion;
880
+ /**
881
+ * Whether the component is encrypted
882
+ */
883
+ encrypted;
884
+ /**
885
+ * The type of the component
886
+ *
887
+ * @attribute
888
+ */
889
+ componentType;
890
+ kmsKey;
891
+ constructor(scope, id, props) {
892
+ super(scope, id, {
893
+ physicalName: props.componentName ??
894
+ cdk.Lazy.string({
895
+ produce: () => cdk.Names.uniqueResourceName(this, {
896
+ maxLength: 128,
897
+ separator: '-',
898
+ allowedSpecialCharacters: '-',
899
+ }).toLowerCase(), // Enforce lowercase for the auto-generated fallback
900
+ }),
901
+ });
902
+ try {
903
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_ComponentProps(props);
904
+ }
905
+ catch (error) {
906
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
907
+ Error.captureStackTrace(error, Component);
908
+ }
909
+ throw error;
910
+ }
911
+ // Enhanced CDK Analytics Telemetry
912
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
913
+ Object.defineProperty(this, COMPONENT_SYMBOL, { value: true });
914
+ this.validateComponentName();
915
+ props.supportedOsVersions?.forEach((osVersion) => {
916
+ if (osVersion.platform !== props.platform) {
917
+ throw new cdk.ValidationError(`os version ${osVersion.osVersion} is not compatible with platform ${props.platform}`, this);
918
+ }
919
+ });
920
+ const componentVersion = props.componentVersion ?? '1.0.0';
921
+ const supportedOsVersions = props.supportedOsVersions?.filter((osVersion) => osVersion.osVersion !== undefined);
922
+ const component = new aws_imagebuilder_1.CfnComponent(this, 'Resource', {
923
+ name: this.physicalName,
924
+ version: componentVersion,
925
+ changeDescription: props.changeDescription,
926
+ description: props.description,
927
+ platform: props.platform,
928
+ kmsKeyId: props.kmsKey?.keyArn,
929
+ tags: props.tags,
930
+ ...(props.data.isS3Reference ? { uri: props.data.value } : { data: props.data.value }),
931
+ ...(supportedOsVersions?.length && {
932
+ supportedOsVersions: supportedOsVersions.map((osVersion) => osVersion.osVersion),
933
+ }),
934
+ });
935
+ this.componentName = this.getResourceNameAttribute(component.attrName);
936
+ this.componentArn = this.getResourceArnAttribute(component.attrArn, {
937
+ service: 'imagebuilder',
938
+ resource: 'component',
939
+ resourceName: `${this.physicalName}/${componentVersion}`,
940
+ });
941
+ this.componentVersion = componentVersion;
942
+ this.encrypted = true; // Components are always encrypted
943
+ this.componentType = component.attrType;
944
+ this.kmsKey = props.kmsKey;
945
+ }
946
+ validateComponentName() {
947
+ if (cdk.Token.isUnresolved(this.physicalName)) {
948
+ return; // Cannot validate unresolved tokens, given their actual value is rendered at deployment time
949
+ }
950
+ if (this.physicalName.length > 128) {
951
+ throw new cdk.ValidationError(`the componentName cannot be longer than 128 characters, got: '${this.physicalName}'`, this);
952
+ }
953
+ if (this.physicalName.includes(' ')) {
954
+ throw new cdk.ValidationError(`the componentName cannot contain spaces, got: '${this.physicalName}'`, this);
955
+ }
956
+ if (this.physicalName.includes('_')) {
957
+ throw new cdk.ValidationError(`the componentName cannot contain underscores, got: '${this.physicalName}'`, this);
958
+ }
959
+ if (this.physicalName !== this.physicalName.toLowerCase()) {
960
+ throw new cdk.ValidationError(`the componentName must be lowercase, got: '${this.physicalName}'`, this);
961
+ }
962
+ }
963
+ static {
964
+ __runInitializers(_classThis, _classExtraInitializers);
965
+ }
966
+ };
967
+ return Component = _classThis;
968
+ })();
969
+ exports.Component = Component;
970
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1DQUFtQztBQUNuQywyQ0FBMkM7QUFDM0MsbUVBQTREO0FBRzVELHNEQUFzRDtBQUN0RCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBRTFFLDZCQUE2QjtBQUM3Qiw2Q0FBbUQ7QUFFbkQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7QUFFakYsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBa1cvQjs7R0FFRztBQUNILE1BQWEsc0JBQXNCOztJQUNqQzs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFhO1FBQ3BDLE9BQU8sSUFBSSxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDcEQ7SUFFRDs7T0FFRztJQUNhLElBQUksQ0FBUztJQUU3Qjs7T0FFRztJQUNhLEtBQUssQ0FBTTtJQUUzQixZQUFzQixJQUFZLEVBQUUsS0FBVTtRQUM1QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztLQUNwQjs7QUF2Qkgsd0RBd0JDO0FBMEJEOztHQUVHO0FBQ0gsSUFBWSxlQXdKWDtBQXhKRCxXQUFZLGVBQWU7SUFDekI7O09BRUc7SUFDSCw2Q0FBMEIsQ0FBQTtJQUUxQjs7O09BR0c7SUFDSCxvQ0FBaUIsQ0FBQTtJQUVqQjs7T0FFRztJQUNILHlDQUFzQixDQUFBO0lBRXRCOztPQUVHO0lBQ0gsNkNBQTBCLENBQUE7SUFFMUI7O09BRUc7SUFDSCw2Q0FBMEIsQ0FBQTtJQUUxQjs7T0FFRztJQUNILGlEQUE4QixDQUFBO0lBRTlCOztPQUVHO0lBQ0gsbURBQWdDLENBQUE7SUFFaEM7O09BRUc7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O0FBQVQsOEJBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQ2ZuQ29tcG9uZW50IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWltYWdlYnVpbGRlcic7XG5pbXBvcnQgKiBhcyBrbXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgczNhc3NldHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAneWFtbCc7XG5pbXBvcnQgeyBPU1ZlcnNpb24sIFBsYXRmb3JtIH0gZnJvbSAnLi9vcy12ZXJzaW9uJztcblxuY29uc3QgQ09NUE9ORU5UX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ0Bhd3MtY2RrL2F3cy1pbWFnZWJ1aWxkZXItYWxwaGEuQ29tcG9uZW50Jyk7XG5cbmNvbnN0IExBVEVTVF9WRVJTSU9OID0gJ3gueC54JztcblxuLyoqXG4gKiBBbiBFQzIgSW1hZ2UgQnVpbGRlciBDb21wb25lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudCBleHRlbmRzIGNkay5JUmVzb3VyY2Uge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudFxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjb21wb25lbnRWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYW50IGN1c3RvbSBhY3Rpb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIGFjdGlvbnMgVGhlIGxpc3Qgb2YgYWN0aW9uc1xuICAgKi9cbiAgZ3JhbnQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUsIC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkIHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICovXG4gIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIENvbXBvbmVudCByZXNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgZG9jdW1lbnQgY29udGVudCB0aGF0IGRlZmluZXMgdGhlIGJ1aWxkLCB2YWxpZGF0aW9uLCBvciB0ZXN0IHN0ZXBzIHRvIGJlIGV4ZWN1dGVkIGR1cmluZyB0aGUgaW1hZ2VcbiAgICogYnVpbGRpbmcgcHJvY2Vzcy5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE6IENvbXBvbmVudERhdGE7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtIHBsYXRmb3JtIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICByZWFkb25seSBwbGF0Zm9ybTogUGxhdGZvcm07XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBuYW1lIGlzIGdlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgMS4wLjBcbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudFZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNoYW5nZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29tcG9uZW50LiBEZXNjcmliZXMgd2hhdCBjaGFuZ2UgaGFzIGJlZW4gbWFkZSBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCwgb3JcbiAgICogd2hhdCBtYWtlcyB0aGlzIHZlcnNpb24gZGlmZmVyZW50IGZyb20gb3RoZXIgdmVyc2lvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZURlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgS01TIGtleSB1c2VkIHRvIGVuY3J5cHQgdGhpcyBjb21wb25lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYW4gSW1hZ2UgQnVpbGRlciBvd25lZCBrZXkgd2lsbCBiZSB1c2VkIHRvIGVuY3J5cHQgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHJlYWRvbmx5IGttc0tleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSB2ZXJzaW9ucyBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgc3VwcG9ydGVkT3NWZXJzaW9ucz86IE9TVmVyc2lvbltdO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFncyB0byBhcHBseSB0byB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGFuIEVDMiBJbWFnZSBCdWlsZGVyIGNvbXBvbmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudEF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIEFSTiBpcyBhdXRvbWF0aWNhbGx5IGNvbnN0cnVjdGVkIGlmIGEgY29tcG9uZW50TmFtZSBpcyBwcm92aWRlZCwgb3RoZXJ3aXNlIGEgY29tcG9uZW50QXJuIGlzXG4gICAqICAgICAgICAgICAgcmVxdWlyZWRcbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudEFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBuYW1lIGlzIGF1dG9tYXRpY2FsbHkgY29uc3RydWN0ZWQgaWYgYSBjb21wb25lbnRBcm4gaXMgcHJvdmlkZWQsIG90aGVyd2lzZSBhIGNvbXBvbmVudE5hbWUgaXNcbiAgICogICAgICAgICAgICByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50LCB4LngueFxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50VmVyc2lvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhbiBFQzIgSW1hZ2UgQnVpbGRlciBBV1MtbWFuYWdlZCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBd3NNYW5hZ2VkQ29tcG9uZW50QXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgQVdTLW1hbmFnZWQgY29tcG9uZW50XG4gICAqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBBV1MtbWFuYWdlZCBjb21wb25lbnQuIFRoaXMgaXMgYSByZXF1aXJlZCBhdHRyaWJ1dGUgd2hlbiB1c2luZyB0aGVcbiAgICogYHRoaXMuZnJvbUF3c01hbmFnZWRDb21wb25lbnRBdHRyaWJ1dGVzKClgIG1ldGhvZC4gVGhpcyBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSBwcm92aWRlZCB3aGVuXG4gICAqIHVzaW5nIHRoZSBwcmUtZGVmaW5lZCBtYW5hZ2VkIGNvbXBvbmVudCBtZXRob2RzLCBzdWNoIGFzIGBBd3NNYW5hZ2VkQ29tcG9uZW50LnVwZGF0ZU9TKClgIGFuZFxuICAgKiBgQXdzTWFuYWdlZENvbXBvbmVudC5yZWJvb3QoKWAuXG4gICAqXG4gICAqICBAZGVmYXVsdCAtIG5vbmUgaWYgdXNpbmcgIHRoZSBwcmUtZGVmaW5lZCBtYW5hZ2VkIGNvbXBvbmVudCBtZXRob2RzLCBvdGhlcndpc2UgYSBwbGF0Zm9ybSBpcyByZXF1aXJlZCB3aGVuIHVzaW5nXG4gICAqICAgICAgICAgICAgIGB0aGlzLmZyb21Bd3NNYW5hZ2VkQ29tcG9uZW50QXR0cmlidXRlcygpYFxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIEFXUy1tYW5hZ2VkIGNvbXBvbmVudFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50LCB4LngueFxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50VmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsYXRmb3JtIG9mIHRoZSBBV1MtbWFuYWdlZCBjb21wb25lbnQuIFRoaXMgaXMgYSByZXF1aXJlZCBhdHRyaWJ1dGUgd2hlbiB1c2luZyB0aGUgcHJlLWRlZmluZWQgbWFuYWdlZFxuICAgKiBjb21wb25lbnQgbWV0aG9kcywgc3VjaCBhcyBgQXdzTWFuYWdlZENvbXBvbmVudC51cGRhdGVPUygpYCBhbmQgYEF3c01hbmFnZWRDb21wb25lbnQucmVib290KClgLiBUaGlzIHBhcmFtZXRlclxuICAgKiBzaG91bGQgbm90IGJlIHByb3ZpZGVkIHdoZW4gdXNpbmcgdGhlIGB0aGlzLmZyb21Bd3NNYW5hZ2VkQ29tcG9uZW50QXR0cmlidXRlcygpYCBtZXRob2QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZSBpZiB1c2luZyBgdGhpcy5mcm9tQXdzTWFuYWdlZENvbXBvbmVudEF0dHJpYnV0ZXMoKWAsIG90aGVyd2lzZSBhIHBsYXRmb3JtIGlzXG4gICAqICAgICAgICAgICAgcmVxdWlyZWQgd2hlbiB1c2luZyB0aGUgcHJlLWRlZmluZWQgbWFuYWdlZCBjb21wb25lbnQgbWV0aG9kc1xuICAgKi9cbiAgcmVhZG9ubHkgcGxhdGZvcm0/OiBQbGF0Zm9ybTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhbiBFQzIgSW1hZ2UgQnVpbGRlciBBV1MgTWFya2V0cGxhY2UgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzTWFya2V0cGxhY2VDb21wb25lbnRBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBBV1MgTWFya2V0cGxhY2UgY29tcG9uZW50LiBUaGlzIG5hbWUgc2hvdWxkIGV4Y2x1ZGUgdGhlIG1hcmtldHBsYWNlIHByb2R1Y3QgSUQgZnJvbSBpdFxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbWFya2V0cGxhY2UgcHJvZHVjdCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2V0cGxhY2VQcm9kdWN0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIEFXUyBNYXJrZXRwbGFjZSBjb21wb25lbnRcbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCwgeC54LnhcbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudFZlcnNpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBvZiBhbiBFQzIgSW1hZ2UgQnVpbGRlciBDb21wb25lbnQgRG9jdW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnREb2N1bWVudCB7XG4gIC8qKlxuICAgKiBUaGUgc2NoZW1hIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZW1hVmVyc2lvbjogQ29tcG9uZW50U2NoZW1hVmVyc2lvbjtcblxuICAvKipcbiAgICogVGhlIHBoYXNlcyB3aGljaCBkZWZpbmUgdGhlIGdyb3VwaW5nIG9mIHN0ZXBzIHRvIHJ1biBpbiB0aGUgYnVpbGQgYW5kIHRlc3Qgd29ya2Zsb3dzIG9mIHRoZSBpbWFnZSBidWlsZC5cbiAgICovXG4gIHJlYWRvbmx5IHBoYXNlczogQ29tcG9uZW50RG9jdW1lbnRQaGFzZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnRcbiAgICpcbiAgICogQGRlZmF1bHQgTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkb2N1bWVudFxuICAgKlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbnN0YW50cyB0byBkZWZpbmUgaW4gdGhlIGRvY3VtZW50XG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGNvbnN0YW50cz86IHsgW2NvbnN0YW50TmFtZTogc3RyaW5nXTogQ29tcG9uZW50Q29uc3RhbnRWYWx1ZSB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyYW1ldGVycyB0byBkZWZpbmUgaW4gdGhlIGRvY3VtZW50XG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtwYXJhbWV0ZXJOYW1lOiBzdHJpbmddOiBDb21wb25lbnREb2N1bWVudFBhcmFtZXRlckRlZmluaXRpb24gfTtcbn1cblxuLyoqXG4gKiBUaGUgcGhhc2UgdG8gcnVuIGluIGEgc3BlY2lmaWMgd29ya2Zsb3cgaW4gYW4gaW1hZ2UgYnVpbGQsIHdoaWNoIGRlZmluZSB0aGUgc3RlcHMgdG8gZXhlY3V0ZSB0byBjdXN0b21pemUgb3IgdGVzdFxuICogdGhlIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudERvY3VtZW50UGhhc2Uge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHBoYXNlXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBDb21wb25lbnRQaGFzZU5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHN0ZXBzIHRvIGV4ZWN1dGUgdG8gbW9kaWZ5IG9yIHRlc3QgdGhlIGJ1aWxkL3Rlc3QgaW5zdGFuY2VcbiAgICovXG4gIHJlYWRvbmx5IHN0ZXBzOiBDb21wb25lbnREb2N1bWVudFN0ZXBbXTtcbn1cblxuLyoqXG4gKiBUaGUgc3RlcCB0byBydW4gaW4gYSBzcGVjaWZpYyBwaGFzZSBvZiB0aGUgaW1hZ2UgYnVpbGQsIHdoaWNoIGRlZmluZXMgdGhlIHN0ZXAgdG8gZXhlY3V0ZSB0byBjdXN0b21pemUgb3IgdGVzdCB0aGVcbiAqIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudERvY3VtZW50U3RlcCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc3RlcFxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIHRvIHBlcmZvcm0gaW4gdGhlIHN0ZXBcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbjogQ29tcG9uZW50QWN0aW9uO1xuXG4gIC8qKlxuICAgKiBDb250YWlucyBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IHRoZSBhY3Rpb24gdG8gcnVuIHRoZSBzdGVwXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2ltYWdlYnVpbGRlci9sYXRlc3QvdXNlcmd1aWRlL3RvZS1hY3Rpb24tbW9kdWxlcy5odG1sXG4gICAqL1xuICByZWFkb25seSBpbnB1dHM6IENvbXBvbmVudFN0ZXBJbnB1dHM7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25kaXRpb24gdG8gYXBwbHkgdG8gdGhlIHN0ZXAuIElmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UsIHRoZW4gdGhlIHN0ZXAgaXMgc2tpcHBlZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSBzdGVwIGFuZCBpdCBnZXRzIGV4ZWN1dGVkXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2ltYWdlYnVpbGRlci9sYXRlc3QvdXNlcmd1aWRlL3RvZS1jb25kaXRpb25hbC1jb25zdHJ1Y3RzLmh0bWxcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW1hZ2VidWlsZGVyL2xhdGVzdC91c2VyZ3VpZGUvdG9lLWNvbXBhcmlzb24tb3BlcmF0b3JzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGlmPzogQ29tcG9uZW50U3RlcElmQ29uZGl0aW9uO1xuXG4gIC8qKlxuICAgKiBBIGxvb3BpbmcgY29uc3RydWN0IGRlZmluaW5nIGEgcmVwZWF0ZWQgc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGxvb3A/OiBDb21wb25lbnREb2N1bWVudExvb3A7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lb3V0IG9mIHRoZSBzdGVwXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gMTIwIG1pbnV0ZXNcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBjZGsuRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGF0IHRoZSBzdGVwIHNob3VsZCBkbyBpbiBjYXNlIG9mIGZhaWx1cmVcbiAgICpcbiAgICogQGRlZmF1bHQgQ29tcG9uZW50T25GYWlsdXJlLkFCT1JUXG4gICAqL1xuICByZWFkb25seSBvbkZhaWx1cmU/OiBDb21wb25lbnRPbkZhaWx1cmU7XG59XG5cbi8qKlxuICogVGhlIGxvb3BpbmcgY29uc3RydWN0IG9mIGEgY29tcG9uZW50IGRlZmluZXMgYSByZXBlYXRlZCBzZXF1ZW5jZSBvZiBpbnN0cnVjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnREb2N1bWVudExvb3Age1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGxvb3AsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZVxuICAgKlxuICAgKiBAZGVmYXVsdCBsb29wXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9yIGxvb3AgaXRlcmF0ZXMgb24gYSByYW5nZSBvZiBpbnRlZ2VycyBzcGVjaWZpZWQgd2l0aGluIGEgYm91bmRhcnkgb3V0bGluZWQgYnkgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlXG4gICAqIHZhcmlhYmxlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmUgaWYgYGZvckVhY2hgIGlzIHByb3ZpZGVkLiBvdGhlcndpc2UsIGBmb3JgIGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9yPzogQ29tcG9uZW50RG9jdW1lbnRGb3JMb29wO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9yRWFjaCBsb29wIGl0ZXJhdGVzIG9uIGFuIGV4cGxpY2l0IGxpc3Qgb2YgdmFsdWVzLCB3aGljaCBjYW4gYmUgc3RyaW5ncyBhbmQgY2hhaW5lZCBleHByZXNzaW9uc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmUgaWYgYGZvcmAgaXMgcHJvdmlkZWQuIG90aGVyd2lzZSwgYGZvckVhY2hgIGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9yRWFjaD86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBmb3IgbG9vcCBpdGVyYXRlcyBvbiBhIHJhbmdlIG9mIGludGVnZXJzIHNwZWNpZmllZCB3aXRoaW4gYSBib3VuZGFyeSBvdXRsaW5lZCBieSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGVcbiAqIHZhcmlhYmxlcy4gVGhlIGl0ZXJhdGluZyB2YWx1ZXMgYXJlIGluIHRoZSBzZXQgW3N0YXJ0LCBlbmRdIGFuZCBpbmNsdWRlcyBib3VuZGFyeSB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50RG9jdW1lbnRGb3JMb29wIHtcbiAgLyoqXG4gICAqIFN0YXJ0aW5nIHZhbHVlIG9mIGl0ZXJhdGlvbi4gRG9lcyBub3QgYWNjZXB0IGNoYWluaW5nIGV4cHJlc3Npb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIEVuZGluZyB2YWx1ZSBvZiBpdGVyYXRpb24uIERvZXMgbm90IGFjY2VwdCBjaGFpbmluZyBleHByZXNzaW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGVuZDogbnVtYmVyO1xuICAvKipcbiAgICogRGlmZmVyZW5jZSBieSB3aGljaCBhbiBpdGVyYXRpbmcgdmFsdWUgaXMgdXBkYXRlZCB0aHJvdWdoIGFkZGl0aW9uLiBJdCBtdXN0IGJlIGEgbmVnYXRpdmUgb3IgcG9zaXRpdmUgbm9uLXplcm9cbiAgICogdmFsdWUuIERvZXMgbm90IGFjY2VwdCBjaGFpbmluZyBleHByZXNzaW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHVwZGF0ZUJ5OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgaW4gYSBjb21wb25lbnQgZG9jdW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvbmVudENvbnN0YW50VmFsdWUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHN0cmluZyB0eXBlIGNvbnN0YW50IGluIGEgY29tcG9uZW50IGRvY3VtZW50XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGNvbnN0YW50XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21TdHJpbmcodmFsdWU6IHN0cmluZyk6IENvbXBvbmVudENvbnN0YW50VmFsdWUge1xuICAgIHJldHVybiBuZXcgQ29tcG9uZW50Q29uc3RhbnRWYWx1ZSgnc3RyaW5nJywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGNvbnN0YW50XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnN0YW50XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IGFueTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgcGFyYW1ldGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50RG9jdW1lbnRQYXJhbWV0ZXJEZWZpbml0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXJcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IENvbXBvbmVudFBhcmFtZXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXJcbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lLCBpbmRpY2F0aW5nIHRoZSBwYXJhbWV0ZXIgaXMgcmVxdWlyZWRcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHQ/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVyXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBhY3Rpb24gZm9yIGEgc3RlcCB3aXRoaW4gdGhlIGNvbXBvbmVudCBkb2N1bWVudFxuICovXG5leHBvcnQgZW51bSBDb21wb25lbnRBY3Rpb24ge1xuICAvKipcbiAgICogVGhlIEFwcGVuZEZpbGUgYWN0aW9uIGFkZHMgdGhlIHByb3ZpZGVkIGNvbnRlbnQgdG8gdGhlIHByZS1leGlzdGluZyBjb250ZW50IG9mIGEgZmlsZVxuICAgKi9cbiAgQVBQRU5EX0ZJTEUgPSAnQXBwZW5kRmlsZScsXG5cbiAgLyoqXG4gICAqIFRoZSBBc3NlcnQgYWN0aW9uIHBlcmZvcm1zIHZhbHVlIHdpdGggY29tcGFyaXNvbi9sb2dpYyBvcGVyYXRvcnMsIGFuZCBzdWNjZWVkcy9mYWlscyB0aGUgc3RlcCBiYXNlZCBvbiB0aGUgb3V0Y29tZVxuICAgKiBvZiB0aGUgYXNzZXJ0aW9uXG4gICAqL1xuICBBU1NFUlQgPSAnQXNzZXJ0JyxcblxuICAvKipcbiAgICogVGhlIENvcHlGaWxlIGFjdGlvbiBjb3BpZXMgZmlsZXMgZnJvbSBhIHNvdXJjZSBmaWxlIHRvIGEgZGVzdGluYXRpb25cbiAgICovXG4gIENPUFlfRklMRSA9ICdDb3B5RmlsZScsXG5cbiAgLyoqXG4gICAqIFRoZSBDb3B5Rm9sZGVyIGFjdGlvbiBjb3BpZXMgZm9sZGVycyBmcm9tIGEgc291cmNlIHRvIGEgZGVzdGluYXRpb25cbiAgICovXG4gIENPUFlfRk9MREVSID0gJ0NvcHlGb2xkZXInLFxuXG4gIC8qKlxuICAgKiBUaGUgQ3JlYXRlRmlsZSBhY3Rpb24gY3JlYXRlcyBhIGZpbGUgaW4gdGhlIHByb3ZpZGVkIGxvY2F0aW9uXG4gICAqL1xuICBDUkVBVEVfRklMRSA9ICdDcmVhdGVGaWxlJyxcblxuICAvKipcbiAgICogVGhlIENyZWF0ZUZvbGRlciBhY3Rpb24gY3JlYXRlcyBhIGZvbGRlciBpbiB0aGUgcHJvdmlkZWQgbG9jYXRpb25cbiAgICovXG4gIENSRUFURV9GT0xERVIgPSAnQ3JlYXRlRm9sZGVyJyxcblxuICAvKipcbiAgICogVGhlIENyZWF0ZVN5bWxpbmsgYWN0aW9uIGNyZWF0ZXMgc3ltYm9saWMgbGlua3MgZnJvbSBhIGdpdmVuIHBhdGggdG8gYSB0YXJnZXRcbiAgICovXG4gIENSRUFURV9TWU1MSU5LID0gJ0NyZWF0ZVN5bWxpbmsnLFxuXG4gIC8qKlxuICAgKiBUaGUgRGVsZXRlRmlsZSBhY3Rpb24gZGVsZXRlcyBmaWxlKHMpIGluIHRoZSBwcm92aWRlZCBsb2NhdGlvblxuICAgKi9cbiAgREVMRVRFX0ZJTEUgPSAnRGVsZXRlRmlsZScsXG5cbiAgLyoqXG4gICAqIFRoZSBEZWxldGVGb2xkZXIgYWN0aW9uIGRlbGV0ZXMgZm9sZGVycyBpbiB0aGUgcHJvdmlkZWQgbG9jYXRpb25cbiAgICovXG4gIERFTEVURV9GT0xERVIgPSAnRGVsZXRlRm9sZGVyJyxcblxuICAvKipcbiAgICogVGhlIEV4ZWN1dGVCYXNoIGFjdGlvbiBydW5zIGJhc2ggc2NyaXB0cyB3aXRoIGlubGluZSBiYXNoIGNvbW1hbmRzXG4gICAqL1xuICBFWEVDVVRFX0JBU0ggPSAnRXhlY3V0ZUJhc2gnLFxuXG4gIC8qKlxuICAgKiBUaGUgRXhlY3V0ZUJpbmFyeSBhY3Rpb24gcnVucyBhIHByb3ZpZGVkIGJpbmFyeSBleGVjdXRhYmxlXG4gICAqL1xuICBFWEVDVVRFX0JJTkFSWSA9ICdFeGVjdXRlQmluYXJ5JyxcblxuICAvKipcbiAgICogVGhlIEV4ZWN1dGVEb2N1bWVudCBhY3Rpb24gYWxsb3dzIHJ1bm5pbmcgb3RoZXIgY29tcG9uZW50IGRvY3VtZW50cyBmcm9tIHdpdGhpbiBhIGdpdmVuIGNvbXBvbmVudFxuICAgKi9cbiAgRVhFQ1VURV9ET0NVTUVOVCA9ICdFeGVjdXRlRG9jdW1lbnQnLFxuXG4gIC8qKlxuICAgKiBUaGUgRXhlY3V0ZVBvd2Vyc2hlbGwgYWN0aW9uIHJ1bnMgUG93ZXJTaGVsbCBzY3JpcHRzIHdpdGggaW5saW5lIFBvd2VyU2hlbGwgY29tbWFuZHNcbiAgICovXG4gIEVYRUNVVEVfUE9XRVJTSEVMTCA9ICdFeGVjdXRlUG93ZXJTaGVsbCcsXG5cbiAgLyoqXG4gICAqIFRoZSBJbnN0YWxsTVNJIGFjdGlvbiBydW5zIGEgV2luZG93cyBhcHBsaWNhdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBNU0kgZmlsZVxuICAgKi9cbiAgSU5TVEFMTF9NU0kgPSAnSW5zdGFsbE1TSScsXG5cbiAgLyoqXG4gICAqIFRoZSBMaXN0RmlsZXMgYWN0aW9uIGxpc3RzIGZpbGVzIGluIHRoZSBwcm92aWRlZCBmb2xkZXJcbiAgICovXG4gIExJU1RfRklMRVMgPSAnTGlzdEZpbGVzJyxcblxuICAvKipcbiAgICogVGhlIE1vdmVGaWxlIGFjdGlvbiBtb3ZlcyBmaWxlcyBmcm9tIGEgc291cmNlIHRvIGEgZGVzdGluYXRpb25cbiAgICovXG4gIE1PVkVfRklMRSA9ICdNb3ZlRmlsZScsXG5cbiAgLyoqXG4gICAqIFRoZSBNb3ZlRm9sZGVyIGFjdGlvbiBtb3ZlcyBmb2xkZXJzIGZyb20gYSBzb3VyY2UgdG8gYSBkZXN0aW5hdGlvblxuICAgKi9cbiAgTU9WRV9GT0xERVIgPSAnTW92ZUZvbGRlcicsXG5cbiAgLyoqXG4gICAqIFRoZSBSZWFkRmlsZSBhY3Rpb24gcmVhZHMgdGhlIGNvbnRlbnQgb2YgYSB0ZXh0IGZpbGVcbiAgICovXG4gIFJFQURfRklMRSA9ICdSZWFkRmlsZScsXG5cbiAgLyoqXG4gICAqIFRoZSBSZWJvb3QgYWN0aW9uIHJlYm9vdHMgdGhlIGluc3RhbmNlXG4gICAqL1xuICBSRUJPT1QgPSAnUmVib290JyxcblxuICAvKipcbiAgICogVGhlIFNldEZpbGVFbmNvZGluZyBhY3Rpb24gbW9kaWZpZXMgdGhlIGVuY29kaW5nIHByb3BlcnR5IG9mIGFuIGV4aXN0aW5nIGZpbGVcbiAgICovXG4gIFNFVF9GSUxFX0VOQ09ESU5HID0gJ1NldEZpbGVFbmNvZGluZycsXG5cbiAgLyoqXG4gICAqIFRoZSBTZXRGaWxlT3duZXIgYWN0aW9uIG1vZGlmaWVzIHRoZSBvd25lciBhbmQgZ3JvdXAgb3duZXJzaGlwIHByb3BlcnRpZXMgb2YgYW4gZXhpc3RpbmcgZmlsZVxuICAgKi9cbiAgU0VUX0ZJTEVfT1dORVIgPSAnU2V0RmlsZU93bmVyJyxcblxuICAvKipcbiAgICogVGhlIFNldEZvbGRlck93bmVyIGFjdGlvbiByZWN1cnNpdmVseSBtb2RpZmllcyB0aGUgb3duZXIgYW5kIGdyb3VwIG93bmVyc2hpcCBwcm9wZXJ0aWVzIG9mIGFuIGV4aXN0aW5nIGZvbGRlclxuICAgKi9cbiAgU0VUX0ZPTERFUl9PV05FUiA9ICdTZXRGb2xkZXJPd25lcicsXG5cbiAgLyoqXG4gICAqIFRoZSBTZXRGaWxlUGVybWlzc2lvbnMgYWN0aW9uIG1vZGlmaWVzIHRoZSBwZXJtaXNzaW9uIG9mIGFuIGV4aXN0aW5nIGZpbGVcbiAgICovXG4gIFNFVF9GSUxFX1BFUk1JU1NJT05TID0gJ1NldEZpbGVQZXJtaXNzaW9ucycsXG5cbiAgLyoqXG4gICAqIFRoZSBTZXRGb2xkZXJQZXJtaXNzaW9ucyBhY3Rpb24gcmVjdXJzaXZlbHkgbW9kaWZpZXMgdGhlIHBlcm1pc3Npb25zIG9mIGFuIGV4aXN0aW5nIGZvbGRlciBhbmQgYWxsIG9mIGl0cyBzdWJmaWxlc1xuICAgKiBhbmQgc3ViZm9sZGVyc1xuICAgKi9cbiAgU0VUX0ZPTERFUl9QRVJNSVNTSU9OUyA9ICdTZXRGb2xkZXJQZXJtaXNzaW9ucycsXG5cbiAgLyoqXG4gICAqIFRoZSBTZXRSZWdpc3RyeSBhY3Rpb24gc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgV2luZG93cyByZWdpc3RyeSBrZXlcbiAgICovXG4gIFNFVF9SRUdJU1RSWSA9ICdTZXRSZWdpc3RyeScsXG5cbiAgLyoqXG4gICAqIFRoZSBTM0Rvd25sb2FkIGFjdGlvbiBkb3dubG9hZHMgYW4gQW1hem9uIFMzIG9iamVjdC9mb2xkZXIgdG8gYSBsb2NhbCBkZXN0aW5hdGlvblxuICAgKi9cbiAgUzNfRE9XTkxPQUQgPSAnUzNEb3dubG9hZCcsXG5cbiAgLyoqXG4gICAqIFRoZSBTM1VwbG9hZCBhY3Rpb24gdXBsb2FkcyBhIGZpbGUgb3IgZm9sZGVyIHRvIGFuIEFtYXpvbiBTMyBsb2NhdGlvblxuICAgKi9cbiAgUzNfVVBMT0FEID0gJ1MzVXBsb2FkJyxcblxuICAvKipcbiAgICogVGhlIFVuaW5zdGFsbE1TSSBhY3Rpb24gcmVtb3ZlcyBhIFdpbmRvd3MgYXBwbGljYXRpb24gdXNpbmcgYW4gTVNJIGZpbGVcbiAgICovXG4gIFVOSU5TVEFMTF9NU0kgPSAnVW5pbnN0YWxsTVNJJyxcblxuICAvKipcbiAgICogVGhlIFVwZGF0ZU9TIGFjdGlvbiBpbnN0YWxscyBPUyB1cGRhdGVzXG4gICAqL1xuICBVUERBVEVfT1MgPSAnVXBkYXRlT1MnLFxuXG4gIC8qKlxuICAgKiBUaGUgV2ViRG93bmxvYWQgYWN0aW9uIGRvd25sb2FkcyBmaWxlcyBmcm9tIGEgVVJMIHRvIGEgbG9jYWwgZGVzdGluYXRpb25cbiAgICovXG4gIFdFQl9ET1dOTE9BRCA9ICdXZWJEb3dubG9hZCcsXG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHdoYXQgdGhlIHN0ZXAgc2hvdWxkIGRvIGluIGNhc2Ugb2YgZmFpbHVyZVxuICovXG5leHBvcnQgZW51bSBDb21wb25lbnRPbkZhaWx1cmUge1xuICAvKipcbiAgICogRmFpbHMgdGhlIHN0ZXAgYW5kIGRvY3VtZW50IGV4ZWN1dGlvblxuICAgKi9cbiAgQUJPUlQgPSAnQWJvcnQnLFxuXG4gIC8qKlxuICAgKiBGYWlscyB0aGUgc3RlcCBhbmQgcHJvY2VlZHMgdG8gZXhlY3V0ZSB0aGUgbmV4dCBzdGVwIGluIHRoZSBkb2N1bWVudFxuICAgKi9cbiAgQ09OVElOVUUgPSAnQ29udGludWUnLFxuXG4gIC8qKlxuICAgKiBJZ25vcmVzIHRoZSBzdGVwIGFuZCBwcm9jZWVkcyB0byBleGVjdXRlIHRoZSBuZXh0IHN0ZXAgaW4gdGhlIGRvY3VtZW50XG4gICAqL1xuICBJR05PUkUgPSAnSWdub3JlJyxcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVyIHR5cGUgaW4gYSBjb21wb25lbnQgZG9jdW1lbnRcbiAqL1xuZXhwb3J0IGVudW0gQ29tcG9uZW50UGFyYW1ldGVyVHlwZSB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBhIHN0cmluZ1xuICAgKi9cbiAgU1RSSU5HID0gJ3N0cmluZycsXG59XG5cbi8qKlxuICogVGhlIHBoYXNlcyBvZiBhIGNvbXBvbmVudCBkb2N1bWVudFxuICovXG5leHBvcnQgZW51bSBDb21wb25lbnRQaGFzZU5hbWUge1xuICAvKipcbiAgICogQnVpbGQgcGhhc2Ugb2YgdGhlIGNvbXBvbmVudC4gVGhpcyBwaGFzZSBpcyBydW4gZHVyaW5nIHRoZSBCVUlMRElORyBwaGFzZSBvZiB0aGUgaW1hZ2UgYnVpbGQuXG4gICAqL1xuICBCVUlMRCA9ICdidWlsZCcsXG5cbiAgLyoqXG4gICAqIFRlc3QgcGhhc2Ugb2YgdGhlIGNvbXBvbmVudCwgZXhlY3V0ZWQgZGlyZWN0bHkgb24gdGhlIGluc3RhbmNlIHdoaWNoIGlzIHVzZWQgdG8gYnVpbGQgdGhlIGNvbnRhaW5lciBpbWFnZS4gVGhpc1xuICAgKiBwaGFzZSBpcyBydW4gZHVyaW5nIHRoZSBURVNUSU5HIHBoYXNlIG9mIHRoZSBpbWFnZSBidWlsZC5cbiAgICovXG4gIENPTlRBSU5FUl9IT1NUX1RFU1QgPSAnY29udGFpbmVyLWhvc3QtdGVzdCcsXG5cbiAgLyoqXG4gICAqIFRlc3QgcGhhc2Ugb2YgdGhlIGNvbXBvbmVudC4gVGhpcyBwaGFzZSBpcyBydW4gZHVyaW5nIHRoZSBURVNUSU5HIHBoYXNlIG9mIHRoZSBpbWFnZSBidWlsZC5cbiAgICovXG4gIFRFU1QgPSAndGVzdCcsXG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBoYXNlIG9mIHRoZSBjb21wb25lbnQuIFRoaXMgcGhhc2UgaXMgcnVuIGR1cmluZyB0aGUgQlVJTERJTkcgcGhhc2Ugb2YgdGhlIGltYWdlIGJ1aWxkLCBhZnRlciB0aGUgYnVpbGRcbiAgICogc3RlcCBvZiB0aGUgY29tcG9uZW50IGlzIGV4ZWN1dGVkLlxuICAgKi9cbiAgVkFMSURBVEUgPSAndmFsaWRhdGUnLFxufVxuXG4vKipcbiAqIFRoZSBzY2hlbWEgdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBlbnVtIENvbXBvbmVudFNjaGVtYVZlcnNpb24ge1xuICAvKipcbiAgICogU2NoZW1hIHZlcnNpb24gMS4wIGZvciB0aGUgY29tcG9uZW50IGRvY3VtZW50XG4gICAqL1xuICBWMV8wID0gJzEuMCcsXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgaW5wdXRzIGZvciBhIHN0ZXAgaW4gdGhlIGNvbXBvbmVudCBkb2N1bWVudFxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50U3RlcElucHV0cyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBpbnB1dCB2YWx1ZSBmcm9tIGFuIG9iamVjdCwgZm9yIHRoZSBjb21wb25lbnQgc3RlcFxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzT2JqZWN0IFRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgaW5wdXQgdmFsdWVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21PYmplY3QoaW5wdXRzT2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogQ29tcG9uZW50U3RlcElucHV0cyB7XG4gICAgcmV0dXJuIG5ldyBDb21wb25lbnRTdGVwSW5wdXRzKGlucHV0c09iamVjdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgaW5wdXQgdmFsdWUgZnJvbSBhIGxpc3Qgb2YgaW5wdXQgb2JqZWN0cywgZm9yIHRoZSBjb21wb25lbnQgc3RlcFxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzT2JqZWN0TGlzdCBUaGUgbGlzdCBvZiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIGlucHV0IHZhbHVlc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tTGlzdChpbnB1dHNPYmplY3RMaXN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9W10pOiBDb21wb25lbnRTdGVwSW5wdXRzIHtcbiAgICByZXR1cm4gbmV3IENvbXBvbmVudFN0ZXBJbnB1dHMoaW5wdXRzT2JqZWN0TGlzdCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlbmRlcmVkIGlucHV0IHZhbHVlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW5wdXRzOiBhbnk7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGlucHV0OiBhbnkpIHtcbiAgICB0aGlzLmlucHV0cyA9IGlucHV0O1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBgaWZgIGNvbmRpdGlvbiBpbiB0aGUgY29tcG9uZW50IGRvY3VtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRTdGVwSWZDb25kaXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgYGlmYCB2YWx1ZSBmcm9tIGFuIG9iamVjdCwgZm9yIHRoZSBjb21wb25lbnQgc3RlcFxuICAgKlxuICAgKiBAcGFyYW0gaWZPYmplY3QgVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBgaWZgIGNvbmRpdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tT2JqZWN0KGlmT2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogQ29tcG9uZW50U3RlcElmQ29uZGl0aW9uIHtcbiAgICByZXR1cm4gbmV3IENvbXBvbmVudFN0ZXBJZkNvbmRpdGlvbihpZk9iamVjdCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlbmRlcmVkIGlucHV0IHZhbHVlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWZDb25kaXRpb246IGFueTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoaWZDb25kaXRpb246IGFueSkge1xuICAgIHRoaXMuaWZDb25kaXRpb24gPSBpZkNvbmRpdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBjbGFzcyBmb3IgcmVmZXJlbmNpbmcgYW5kIHVwbG9hZGluZyBjb21wb25lbnQgZGF0YVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50RGF0YSB7XG4gIC8qKlxuICAgKiBVcGxvYWRzIGNvbXBvbmVudCBkYXRhIGZyb20gYSBsb2NhbCBmaWxlIHRvIFMzIHRvIHVzZSBhcyB0aGUgY29tcG9uZW50IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIElkZW50aWZpZXIgb2YgdGhlIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gcGF0aCBUaGUgbG9jYWwgcGF0aCB0byB0aGUgY29tcG9uZW50IGRhdGEgZmlsZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBTMyBhc3NldCB1cGxvYWQgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQXNzZXQoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zOiBzM2Fzc2V0cy5Bc3NldE9wdGlvbnMgPSB7fSxcbiAgKTogUzNDb21wb25lbnREYXRhIHtcbiAgICBjb25zdCBhc3NldCA9IG5ldyBzM2Fzc2V0cy5Bc3NldChzY29wZSwgaWQsIHsgLi4ub3B0aW9ucywgcGF0aCB9KTtcbiAgICByZXR1cm4gbmV3IFMzQ29tcG9uZW50RGF0YUZyb21Bc3NldChhc3NldCk7XG4gIH1cblxuICAvKipcbiAgICogUmVmZXJlbmNlcyBjb21wb25lbnQgZGF0YSBmcm9tIGEgcHJlLWV4aXN0aW5nIFMzIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0gYnVja2V0IFRoZSBTMyBidWNrZXQgd2hlcmUgdGhlIGNvbXBvbmVudCBkYXRhIGlzIHN0b3JlZFxuICAgKiBAcGFyYW0ga2V5IFRoZSBTMyBrZXkgb2YgdGhlIGNvbXBvbmVudCBkYXRhIGZpbGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVMzKGJ1Y2tldDogczMuSUJ1Y2tldCwga2V5OiBzdHJpbmcpOiBTM0NvbXBvbmVudERhdGEge1xuICAgIHJldHVybiBuZXcgUzNDb21wb25lbnREYXRhRnJvbUJ1Y2tldEtleShidWNrZXQsIGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlcyBhbiBpbmxpbmUgSlNPTiBvYmplY3QgYXMgdGhlIGNvbXBvbmVudCBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIEFuIGlubGluZSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudCBkYXRhXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Kc29uT2JqZWN0KGRhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiBDb21wb25lbnREYXRhIHtcbiAgICBjb25zdCBpbmxpbmVEYXRhID0geWFtbC5zdHJpbmdpZnkoZGF0YSwgeyBpbmRlbnQ6IDIgfSk7XG4gICAgcmV0dXJuIG5ldyBJbmxpbmVDb21wb25lbnREYXRhKGlubGluZURhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZXMgYW4gaW5saW5lIEpTT04gb2JqZWN0IGFzIHRoZSBjb21wb25lbnQgZGF0YSwgdXNpbmcgdGhlIENvbXBvbmVudERvY3VtZW50IGludGVyZmFjZVxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSBBbiBpbmxpbmUgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb21wb25lbnQgZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29tcG9uZW50RG9jdW1lbnRKc29uT2JqZWN0KGRhdGE6IENvbXBvbmVudERvY3VtZW50KTogQ29tcG9uZW50RGF0YSB7XG4gICAgY29uc3QgeyBuYW1lLCBkZXNjcmlwdGlvbiwgc2NoZW1hVmVyc2lvbiwgY29uc3RhbnRzLCBwYXJhbWV0ZXJzLCBwaGFzZXMgfSA9IGRhdGE7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUpzb25PYmplY3Qoe1xuICAgICAgLi4uKG5hbWUgIT09IHVuZGVmaW5lZCAmJiB7IG5hbWUgfSksXG4gICAgICAuLi4oZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgc2NoZW1hVmVyc2lvbjogc2NoZW1hVmVyc2lvbixcbiAgICAgIC4uLihjb25zdGFudHMgIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIGNvbnN0YW50czogT2JqZWN0LmVudHJpZXMoY29uc3RhbnRzKS5tYXAoKFtjb25zdGFudE5hbWUsIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICBbY29uc3RhbnROYW1lXTogeyB0eXBlOiB2YWx1ZS50eXBlLCB2YWx1ZTogdmFsdWUudmFsdWUgfSxcbiAgICAgICAgfSkpLFxuICAgICAgfSksXG4gICAgICAuLi4ocGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgcGFyYW1ldGVyczogT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykubWFwKChbcGFyYW1ldGVyTmFtZSwgdmFsdWVdKSA9PiAoeyBbcGFyYW1ldGVyTmFtZV06IHZhbHVlIH0pKSxcbiAgICAgIH0pLFxuICAgICAgcGhhc2VzOiBwaGFzZXMubWFwKChwaGFzZSkgPT4gKHtcbiAgICAgICAgbmFtZTogcGhhc2UubmFtZSxcbiAgICAgICAgc3RlcHM6IHBoYXNlLnN0ZXBzLm1hcCgoc3RlcCkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBzdGVwLm5hbWUsXG4gICAgICAgICAgYWN0aW9uOiBzdGVwLmFjdGlvbixcbiAgICAgICAgICAuLi4oc3RlcC5vbkZhaWx1cmUgIT09IHVuZGVmaW5lZCAmJiB7IG9uRmFpbHVyZTogc3RlcC5vbkZhaWx1cmUgfSksXG4gICAgICAgICAgLi4uKHN0ZXAudGltZW91dCAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dFNlY29uZHM6IHN0ZXAudGltZW91dC50b1NlY29uZHMoKSB9KSxcbiAgICAgICAgICAuLi4oc3RlcC5pZiAhPT0gdW5kZWZpbmVkICYmIHsgaWY6IHN0ZXAuaWYuaWZDb25kaXRpb24gfSksXG4gICAgICAgICAgLi4uKHN0ZXAubG9vcCAhPT0gdW5kZWZpbmVkICYmIHsgbG9vcDogc3RlcC5sb29wIH0pLFxuICAgICAgICAgIGlucHV0czogc3RlcC5pbnB1dHMuaW5wdXRzLFxuICAgICAgICB9KSksXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlcyBhbiBpbmxpbmUgSlNPTi9ZQU1MIHN0cmluZyBhcyB0aGUgY29tcG9uZW50IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgQW4gaW5saW5lIEpTT04vWUFNTCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb21wb25lbnQgZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSW5saW5lKGRhdGE6IHN0cmluZyk6IENvbXBvbmVudERhdGEge1xuICAgIHJldHVybiBuZXcgSW5saW5lQ29tcG9uZW50RGF0YShkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcHJvdmlkZWQgY29tcG9uZW50IGRhdGEgaXMgYW4gUzMgcmVmZXJlbmNlXG4gICAqL1xuICBhYnN0cmFjdCByZWFkb25seSBpc1MzUmVmZXJlbmNlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzdWx0aW5nIGlubGluZSBzdHJpbmcgb3IgUzMgVVJMIHdoaWNoIHJlZmVyZW5jZXMgdGhlIGNvbXBvbmVudCBkYXRhXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBjbGFzcyBmb3IgUzMtYmFzZWQgY29tcG9uZW50IGRhdGEgcmVmZXJlbmNlcywgY29udGFpbmluZyBhZGRpdGlvbmFsIHBlcm1pc3Npb24gZ3JhbnQgbWV0aG9kcyBvbiB0aGUgUzMgb2JqZWN0XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTM0NvbXBvbmVudERhdGEgZXh0ZW5kcyBDb21wb25lbnREYXRhIHtcbiAgcHVibGljIHJlYWRvbmx5IGlzUzNSZWZlcmVuY2UgPSB0cnVlO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBidWNrZXQ6IHMzLklCdWNrZXQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBrZXk6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYnVja2V0OiBzMy5JQnVja2V0LCBrZXk6IHN0cmluZykge1xuICAgIHN1cGVyKGJ1Y2tldC5zM1VybEZvck9iamVjdChrZXkpKTtcblxuICAgIHRoaXMuYnVja2V0ID0gYnVja2V0O1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHB1dCBwZXJtaXNzaW9ucyB0byB0aGUgZ2l2ZW4gZ3JhbnRlZSBmb3IgdGhlIGNvbXBvbmVudCBkYXRhIGluIFMzXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBncmFudFB1dChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50UHV0KGdyYW50ZWUsIHRoaXMua2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkIHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgY29tcG9uZW50IGRhdGEgaW4gUzNcbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50UmVhZChncmFudGVlLCB0aGlzLmtleSk7XG4gIH1cbn1cblxuY2xhc3MgSW5saW5lQ29tcG9uZW50RGF0YSBleHRlbmRzIENvbXBvbmVudERhdGEge1xuICBwdWJsaWMgcmVhZG9ubHkgaXNTM1JlZmVyZW5jZSA9IGZhbHNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhOiBzdHJpbmcpIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxufVxuXG5jbGFzcyBTM0NvbXBvbmVudERhdGFGcm9tQnVja2V0S2V5IGV4dGVuZHMgUzNDb21wb25lbnREYXRhIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKGJ1Y2tldDogczMuSUJ1Y2tldCwga2V5OiBzdHJpbmcpIHtcbiAgICBzdXBlcihidWNrZXQsIGtleSk7XG4gIH1cbn1cblxuY2xhc3MgUzNDb21wb25lbnREYXRhRnJvbUFzc2V0IGV4dGVuZHMgUzNDb21wb25lbnREYXRhIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKGFzc2V0OiBzM2Fzc2V0cy5Bc3NldCkge1xuICAgIHN1cGVyKGFzc2V0LmJ1Y2tldCwgYXNzZXQuczNPYmplY3RLZXkpO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciB3b3JraW5nIHdpdGggQVdTLW1hbmFnZWQgY29tcG9uZW50c1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXdzTWFuYWdlZENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBJbXBvcnRzIHRoZSBBV1MgQ0xJIHYyIEFXUy1tYW5hZ2VkIGNvbXBvbmVudFxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gaWQgSWRlbnRpZmllciBvZiB0aGUgY29uc3RydWN0XG4gICAqIEBwYXJhbSBhdHRycyBUaGUgQVdTLW1hbmFnZWQgY29tcG9uZW50IGF0dHJpYnV0ZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXdzQ2xpVjIoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IEF3c01hbmFnZWRDb21wb25lbnRBdHRyaWJ1dGVzKTogSUNvbXBvbmVudCB7XG4gICAgdGhpcy52YWxpZGF0ZVByZWRlZmluZWRNYW5hZ2VkQ29tcG9uZW50TWV0aG9kQXR0cmlidXRlcyh7XG4gICAgICBzY29wZSxcbiAgICAgIGF0dHJzLFxuICAgICAgY29tcG9uZW50OiAnYXdzQ2xpVjInLFxuICAgICAgYWxsb3dlZFBsYXRmb3JtczogW1BsYXRmb3JtLkxJTlVYLCBQbGF0Zm9ybS5XSU5ET1dTXSxcbiAgICB9KTtcblxuICAgIGlmIChhdHRycy5wbGF0Zm9ybSA9PT0gUGxhdGZvcm0uV0lORE9XUykge1xuICAgICAgcmV0dXJuIHRoaXMuZnJvbUF3c01hbmFnZWRDb21wb25lbnRBdHRyaWJ1dGVzKHNjb3BlLCBpZCwge1xuICAgICAgICBjb21wb25lbnROYW1lOiAnYXdzLWNsaS12ZXJzaW9uLTItd2luZG93cycsXG4gICAgICAgIGNvbXBvbmVudFZlcnNpb246IGF0dHJzLmNvbXBvbmVudFZlcnNpb24sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mcm9tQXdzTWFuYWdlZENvbXBvbmVudEF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICBjb21wb25lbnROYW1lOiAnYXdzLWNsaS12ZXJzaW9uLTItbGludXgnLFxuICAgICAgY29tcG9uZW50VmVyc2lvbjogYXR0cnMuY29tcG9uZW50VmVyc2lvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIHRoZSBoZWxsbyB3b3JsZCBBV1MtbWFuYWdlZCBjb21wb25lbnRcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIElkZW50aWZpZXIgb2YgdGhlIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gYXR0cnMgVGhlIEFXUy1tYW5hZ2VkIGNvbXBvbmVudCBhdHRyaWJ1dGVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGhlbGxvV29ybGQoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IEF3c01hbmFnZWRDb21wb25lbnRBdHRyaWJ1dGVzKTogSUNvbXBvbmVudCB7XG4gICAgdGhpcy52YWxpZGF0ZVByZWRlZmluZWRNYW5hZ2VkQ29tcG9uZW50TWV0aG9kQXR0cmlidXRlcyh7XG4gICAgICBzY29wZSxcbiAgICAgIGF0dHJzLFxuICAgICAgY29tcG9uZW50OiAnaGVsbG9Xb3JsZCcsXG4gICAgICBhbGxvd2VkUGxhdGZvcm1zOiBbUGxhdGZvcm0uTElOVVgsIFBsYXRmb3JtLldJTkRPV1NdLFxuICAgIH0pO1xuXG4gICAgaWYgKGF0dHJzLnBsYXRmb3JtID09PSBQbGF0Zm9ybS5XSU5ET1dTKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcm9tQXdzTWFuYWdlZENvbXBvbmVudEF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICAgIGNvbXBvbmVudE5hbWU6ICdoZWxsby13b3JsZC13aW5kb3dzJyxcbiAgICAgICAgY29tcG9uZW50VmVyc2lvbjogYXR0cnMuY29tcG9uZW50VmVyc2lvbixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZyb21Bd3NNYW5hZ2VkQ29tcG9uZW50QXR0cmlidXRlcyhzY29wZSwgaWQsIHtcbiAgICAgIGNvbXBvbmVudE5hbWU6ICdoZWxsby13b3JsZC1saW51eCcsXG4gICAgICBjb21wb25lbnRWZXJzaW9uOiBhdHRycy5jb21wb25lbnRWZXJzaW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgdGhlIFB5dGhvbiAzIEFXUy1tYW5hZ2VkIGNvbXBvbmVudFxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gaWQgSWRlbnRpZmllciBvZiB0aGUgY29uc3RydWN0XG4gICAqIEBwYXJhbSBhdHRycyBUaGUgQVdTLW1hbmFnZWQgY29tcG9uZW50IGF0dHJpYnV0ZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcHl0aG9uMyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogQXdzTWFuYWdlZENvbXBvbmVudEF0dHJpYnV0ZXMpOiBJQ29tcG9uZW50IHtcbiAgICB0aGlzLnZhbGlkYXRlUHJlZGVmaW5lZE1hbmFnZWRDb21wb25lbnRNZXRob2RBdHRyaWJ1dGVzKHtcbiAgICAgIHNjb3BlLFxuICAgICAgYXR0cnMsXG4gICAgICBjb21wb25lbnQ6ICdweXRob24zJyxcbiAgICAgIGFsbG93ZWRQbGF0Zm9ybXM6IFtQbGF0Zm9ybS5MSU5VWCwgUGxhdGZvcm0uV0lORE9XU10sXG4gICAgfSk7XG5cbiAgICBpZiAoYXR0cnMucGxhdGZvcm0gPT09IFBsYXRmb3JtLldJTkRPV1MpIHtcbiAgICAgIHJldHVybiB0aGlzLmZyb21Bd3NNYW5hZ2VkQ29tcG9uZW50QXR0cmlidXRlcyhzY29wZSwgaWQsIHtcbiAgICAgICAgY29tcG9uZW50TmFtZTogJ3B5dGhvbi0zLXdpbmRvd3MnLFxuICAgICAgICBjb21wb25lbnRWZXJzaW9uOiBhdHRycy5jb21wb25lbnRWZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZnJvbUF3c01hbmFnZWRDb21wb25lbnRBdHRyaWJ1dGVzKHNjb3BlLCBpZCwge1xuICAgICAgY29tcG9uZW50TmFtZTogJ3B5dGhvbi0zLWxpbnV4JyxcbiAgICAgIGNvbXBvbmVudFZlcnNpb246IGF0dHJzLmNvbXBvbmVudFZlcnNpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyB0aGUgcmVib290IEFXUy1tYW5hZ2VkIGNvbXBvbmVudFxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gaWQgSWRlbnRpZmllciBvZiB0aGUgY29uc3RydWN0XG4gICAqIEBwYXJhbSBhdHRycyBUaGUgQVdTLW1hbmFnZWQgY29tcG9uZW50IGF0dHJpYnV0ZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVib290KHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBBd3NNYW5hZ2VkQ29tcG9uZW50QXR0cmlidXRlcyk6IElDb21wb25lbnQge1xuICAgIHRoaXMudmFsaWRhdGVQcmVkZWZpbmVkTWFuYWdlZENvbXBvbmVudE1ldGhvZEF0dHJpYnV0ZXMoe1xuICAgICAgc2NvcGUsXG4gICAgICBhdHRycyxcbiAgICAgIGNvbXBvbmVudDogJ3JlYm9vdCcsXG4gICAgICBhbGxvd2VkUGxhdGZvcm1zOiBbUGxhdGZvcm0uTElOVVgsIFBsYXRmb3JtLldJTkRPV1NdLFxuICAgIH0pO1xuXG4gICAgaWYgKGF0dHJzLnBsYXRmb3JtID09PSBQbGF0Zm9ybS5XSU5ET1dTKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcm9tQXdzTWFuYWdlZENvbXBvbmVudEF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICAgIGNvbXBvbmVudE5hbWU6ICdyZWJvb3Qtd2luZG93cycsXG4gICAgICAgIGNvbXBvbmVudFZlcnNpb246IGF0dHJzLmNvbXBvbmVudFZlcnNpb24sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mcm9tQXdzTWFuYWdlZENvbXBvbmVudEF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICBjb21wb25lbnROYW1lOiAncmVib290LWxpbnV4JyxcbiAgICAgIGNvbXBvbmVudFZlcnNpb246IGF0dHJzLmNvbXBvbmVudFZlcnNpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyB0aGUgU1RJRyBoYXJkZW5pbmcgQVdTLW1hbmFnZWQgY29tcG9uZW50XG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGF0dHJzIFRoZSBBV1MtbWFuYWdlZCBjb21wb25lbnQgYXR0cmlidXRlc1xuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pbWFnZWJ1aWxkZXIvbGF0ZXN0L3VzZXJndWlkZS9pYi1zdGlnLmh0bWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc3RpZ0J1aWxkKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBBd3NNYW5hZ2VkQ29tcG9uZW50QXR0cmlidXRlcyk6IElDb21wb25lbnQge1xuICAgIHRoaXMudmFsaWRhdGVQcmVkZWZpbmVkTWFuYWdlZENvbXBvbmVudE1ldGhvZEF0dHJpYnV0ZXMoe1xuICAgICAgc2NvcGUsXG4gICAgICBhdHRycyxcbiAgICAgIGNvbXBvbmVudDogJ3N0aWdCdWlsZCcsXG4gICAgICBhbGxvd2VkUGxhdGZvcm1zOiBbUGxhdGZvcm0uTElOVVgsIFBsYXRmb3JtLldJTkRPV1NdLFxuICAgIH0pO1xuXG4gICAgaWYgKGF0dHJzLnBsYXRmb3JtID09PSBQbGF0Zm9ybS5XSU5ET1dTKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcm9tQXdzTWFuYWdlZENvbXBvbmVudEF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICAgIGNvbXBvbmVudE5hbWU6ICdzdGlnLWJ1aWxkLXdpbmRvd3MnLFxuICAgICAgICBjb21wb25lbnRWZXJzaW9uOiBhdHRycy5jb21wb25lbnRWZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZnJvbUF3c01hbmFnZWRDb21wb25lbnRBdHRyaWJ1dGVzKHNjb3BlLCBpZCwge1xuICAgICAgY29tcG9uZW50TmFtZTogJ3N0aWctYnVpbGQtbGludXgnLFxuICAgICAgY29tcG9uZW50VmVyc2lvbjogYXR0cnMuY29tcG9uZW50VmVyc2lvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIHRoZSBPUyB1cGRhdGUgQVdTLW1hbmFnZWQgY29tcG9uZW50XG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGF0dHJzIFRoZSBBV1MtbWFuYWdlZCBjb21wb25lbnQgYXR0cmlidXRlc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1cGRhdGVPUyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogQXdzTWFuYWdlZENvbXBvbmVudEF0dHJpYnV0ZXMpOiBJQ29tcG9uZW50IHtcbiAgICB0aGlzLnZhbGlkYXRlUHJlZGVmaW5lZE1hbmFnZWRDb21wb25lbnRNZXRob2RBdHRyaWJ1dGVzKHtcbiAgICAgIHNjb3BlLFxuICAgICAgYXR0cnMsXG4gICAgICBjb21wb25lbnQ6ICd1cGRhdGVPUycsXG4gICAgICBhbGxvd2VkUGxhdGZvcm1zOiBbUGxhdGZvcm0uTElOVVgsIFBsYXRmb3JtLldJTkRPV1NdLFxuICAgIH0pO1xuXG4gICAgaWYgKGF0dHJzLnBsYXRmb3JtID09PSBQbGF0Zm9ybS5XSU5ET1dTKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcm9tQXdzTWFuYWdlZENvbXBvbmVudEF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICAgIGNvbXBvbmVudE5hbWU6ICd1cGRhdGUtd2luZG93cycsXG4gICAgICAgIGNvbXBvbmVudFZlcnNpb246IGF0dHJzLmNvbXBvbmVudFZlcnNpb24sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mcm9tQXdzTWFuYWdlZENvbXBvbmVudEF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICBjb21wb25lbnROYW1lOiAndXBkYXRlLWxpbnV4JyxcbiAgICAgIGNvbXBvbmVudFZlcnNpb246IGF0dHJzLmNvbXBvbmVudFZlcnNpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhbiBBV1MtbWFuYWdlZCBjb21wb25lbnQgZnJvbSBpdHMgYXR0cmlidXRlc1xuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gaWQgSWRlbnRpZmllciBvZiB0aGUgY29uc3RydWN0XG4gICAqIEBwYXJhbSBhdHRycyBUaGUgQVdTLW1hbmFnZWQgY29tcG9uZW50IGF0dHJpYnV0ZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUF3c01hbmFnZWRDb21wb25lbnRBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogQXdzTWFuYWdlZENvbXBvbmVudEF0dHJpYnV0ZXMsXG4gICk6IElDb21wb25lbnQge1xuICAgIGlmIChhdHRycy5wbGF0Zm9ybSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgJ3BsYXRmb3JtIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBwcmUtZGVmaW5lZCBBV1MtbWFuYWdlZCBjb21wb25lbnQgbWV0aG9kcywgc3VjaCBhcyB1cGRhdGVPUycsXG4gICAgICAgIHNjb3BlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXR0cnMuY29tcG9uZW50TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcignYW4gQVdTLW1hbmFnZWQgY29tcG9uZW50IG5hbWUgaXMgcmVxdWlyZWQnLCBzY29wZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIENvbXBvbmVudC5mcm9tQ29tcG9uZW50QXJuKFxuICAgICAgc2NvcGUsXG4gICAgICBpZCxcbiAgICAgIGNkay5TdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogJ2ltYWdlYnVpbGRlcicsXG4gICAgICAgIGFjY291bnQ6ICdhd3MnLFxuICAgICAgICByZXNvdXJjZTogJ2NvbXBvbmVudCcsXG4gICAgICAgIHJlc291cmNlTmFtZTogYCR7YXR0cnMuY29tcG9uZW50TmFtZX0vJHthdHRycy5jb21wb25lbnRWZXJzaW9uID8/IExBVEVTVF9WRVJTSU9OfWAsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIEFXUy1tYW5hZ2VkIGNvbXBvbmVudCBmcm9tIGl0cyBuYW1lXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGF3c01hbmFnZWRDb21wb25lbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIEFXUy1tYW5hZ2VkIGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQXdzTWFuYWdlZENvbXBvbmVudE5hbWUoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXdzTWFuYWdlZENvbXBvbmVudE5hbWU6IHN0cmluZyk6IElDb21wb25lbnQge1xuICAgIHJldHVybiB0aGlzLmZyb21Bd3NNYW5hZ2VkQ29tcG9uZW50QXR0cmlidXRlcyhzY29wZSwgaWQsIHsgY29tcG9uZW50TmFtZTogYXdzTWFuYWdlZENvbXBvbmVudE5hbWUgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZVByZWRlZmluZWRNYW5hZ2VkQ29tcG9uZW50TWV0aG9kQXR0cmlidXRlcyh7XG4gICAgc2NvcGUsXG4gICAgYXR0cnMsXG4gICAgY29tcG9uZW50LFxuICAgIGFsbG93ZWRQbGF0Zm9ybXMsXG4gIH06IHtcbiAgICBzY29wZTogQ29uc3RydWN0O1xuICAgIGNvbXBvbmVudDogc3RyaW5nO1xuICAgIGF0dHJzOiBBd3NNYW5hZ2VkQ29tcG9uZW50QXR0cmlidXRlcztcbiAgICBhbGxvd2VkUGxhdGZvcm1zOiBQbGF0Zm9ybVtdO1xuICB9KSB7XG4gICAgaWYgKGF0dHJzLmNvbXBvbmVudE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoYGEgbmFtZSBpcyBub3QgYWxsb3dlZCBmb3IgJHtjb21wb25lbnR9YCwgc2NvcGUpO1xuICAgIH1cblxuICAgIGlmIChhdHRycy5wbGF0Zm9ybSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihgYSBwbGF0Zm9ybSBpcyByZXF1aXJlZCBmb3IgJHtjb21wb25lbnR9YCwgc2NvcGUpO1xuICAgIH1cblxuICAgIGlmIChjZGsuVG9rZW4uaXNVbnJlc29sdmVkKGF0dHJzLnBsYXRmb3JtKSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoYHBsYXRmb3JtIGNhbm5vdCBiZSBhIHRva2VuIGZvciAke2NvbXBvbmVudH1gLCBzY29wZSk7XG4gICAgfVxuXG4gICAgaWYgKCFhbGxvd2VkUGxhdGZvcm1zLmluY2x1ZGVzKGF0dHJzLnBsYXRmb3JtKSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoYCR7YXR0cnMucGxhdGZvcm19IGlzIG5vdCBhIHN1cHBvcnRlZCBwbGF0Zm9ybSBmb3IgJHtjb21wb25lbnR9YCwgc2NvcGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBjbGFzcyBmb3Igd29ya2luZyB3aXRoIEFXUyBNYXJrZXRwbGFjZSBjb21wb25lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBBd3NNYXJrZXRwbGFjZUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIEFXUyBNYXJrZXRwbGFjZSBjb21wb25lbnQgZnJvbSBpdHMgYXR0cmlidXRlc1xuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gaWQgSWRlbnRpZmllciBvZiB0aGUgY29uc3RydWN0XG4gICAqIEBwYXJhbSBhdHRycyBUaGUgQVdTLW1hbmFnZWQgY29tcG9uZW50IGF0dHJpYnV0ZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUF3c01hcmtldHBsYWNlQ29tcG9uZW50QXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IEF3c01hcmtldHBsYWNlQ29tcG9uZW50QXR0cmlidXRlcyxcbiAgKTogSUNvbXBvbmVudCB7XG4gICAgcmV0dXJuIENvbXBvbmVudC5mcm9tQ29tcG9uZW50QXJuKFxuICAgICAgc2NvcGUsXG4gICAgICBpZCxcbiAgICAgIGNkay5TdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogJ2ltYWdlYnVpbGRlcicsXG4gICAgICAgIGFjY291bnQ6ICdhd3MtbWFya2V0cGxhY2UnLFxuICAgICAgICByZXNvdXJjZTogJ2NvbXBvbmVudCcsXG4gICAgICAgIHJlc291cmNlTmFtZTogYCR7YXR0cnMuY29tcG9uZW50TmFtZX0tJHthdHRycy5tYXJrZXRwbGFjZVByb2R1Y3RJZH0vJHthdHRycy5jb21wb25lbnRWZXJzaW9uID8/IExBVEVTVF9WRVJTSU9OfWAsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQSBuZXcgb3IgaW1wb3J0ZWQgQ29tcG9uZW50XG4gKi9cbmFic3RyYWN0IGNsYXNzIENvbXBvbmVudEJhc2UgZXh0ZW5kcyBjZGsuUmVzb3VyY2UgaW1wbGVtZW50cyBJQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgYWJzdHJhY3QgcmVhZG9ubHkgY29tcG9uZW50QXJuOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50XG4gICAqL1xuICBhYnN0cmFjdCByZWFkb25seSBjb21wb25lbnROYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50XG4gICAqL1xuICBhYnN0cmFjdCByZWFkb25seSBjb21wb25lbnRWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYW50IGN1c3RvbSBhY3Rpb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIGFjdGlvbnMgVGhlIGxpc3Qgb2YgYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9ucyxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMuY29tcG9uZW50QXJuXSxcbiAgICAgIHNjb3BlOiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSBjb21wb25lbnRcbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoZ3JhbnRlZSwgJ2ltYWdlYnVpbGRlcjpHZXRDb21wb25lbnQnKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gRUMyIEltYWdlIEJ1aWxkZXIgQ29tcG9uZW50LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2ltYWdlYnVpbGRlci9sYXRlc3QvdXNlcmd1aWRlL21hbmFnZS1jb21wb25lbnRzLmh0bWxcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEJhc2Uge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1pbWFnZWJ1aWxkZXItYWxwaGEuQ29tcG9uZW50JztcblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIGNvbXBvbmVudCBnaXZlbiBpdHMgQVJOLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29tcG9uZW50QXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbXBvbmVudEFybjogc3RyaW5nKTogSUNvbXBvbmVudCB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUNvbXBvbmVudEF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IGNvbXBvbmVudEFybiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgY29tcG9uZW50IGdpdmVuIGl0cyBuYW1lLiBUaGUgcHJvdmlkZWQgbmFtZSBtdXN0IGJlIG5vcm1hbGl6ZWQgYnkgY29udmVydGluZyBhbGwgYWxwaGFiZXRpY2FsXG4gICAqIGNoYXJhY3RlcnMgdG8gbG93ZXJjYXNlLCBhbmQgcmVwbGFjaW5nIGFsbCBzcGFjZXMgYW5kIHVuZGVyc2NvcmVzIHdpdGggaHlwaGVucy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNvbXBvbmVudE5hbWUoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY29tcG9uZW50TmFtZTogc3RyaW5nKTogSUNvbXBvbmVudCB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUNvbXBvbmVudEF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IGNvbXBvbmVudE5hbWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIGNvbXBvbmVudCBieSBwcm92aWRpbmcgaXRzIGF0dHJpYnV0ZXMuIElmIHRoZSBjb21wb25lbnQgbmFtZSBpcyBwcm92aWRlZCBhcyBhbiBhdHRyaWJ1dGUsIGl0XG4gICAqIG11c3QgYmUgbm9ybWFsaXplZCBieSBjb252ZXJ0aW5nIGFsbCBhbHBoYWJldGljYWwgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UsIGFuZCByZXBsYWNpbmcgYWxsIHNwYWNlcyBhbmQgdW5kZXJzY29yZXNcbiAgICogd2l0aCBoeXBoZW5zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29tcG9uZW50QXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogQ29tcG9uZW50QXR0cmlidXRlcyk6IElDb21wb25lbnQge1xuICAgIGlmIChhdHRycy5jb21wb25lbnRBcm4gJiYgKGF0dHJzLmNvbXBvbmVudE5hbWUgfHwgYXR0cnMuY29tcG9uZW50VmVyc2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAnYSBjb21wb25lbnROYW1lIG9yIGNvbXBvbmVudFZlcnNpb24gY2Fubm90IGJlIHByb3ZpZGVkIHdoZW4gYSBjb21wb25lbnRBcm4gaXMgcHJvdmlkZWQnLFxuICAgICAgICBzY29wZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFhdHRycy5jb21wb25lbnRBcm4gJiYgIWF0dHJzLmNvbXBvbmVudE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdlaXRoZXIgY29tcG9uZW50QXJuIG9yIGNvbXBvbmVudE5hbWUgaXMgcmVxdWlyZWQnLCBzY29wZSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50QXJuID1cbiAgICAgIGF0dHJzLmNvbXBvbmVudEFybiA/P1xuICAgICAgY2RrLlN0YWNrLm9mKHNjb3BlKS5mb3JtYXRBcm4oe1xuICAgICAgICBzZXJ2aWNlOiAnaW1hZ2VidWlsZGVyJyxcbiAgICAgICAgcmVzb3VyY2U6ICdjb21wb25lbnQnLFxuICAgICAgICByZXNvdXJjZU5hbWU6IGAke2F0dHJzLmNvbXBvbmVudE5hbWV9LyR7YXR0cnMuY29tcG9uZW50VmVyc2lvbiA/PyBMQVRFU1RfVkVSU0lPTn1gLFxuICAgICAgfSk7XG5cbiAgICBjb25zdCBbY29tcG9uZW50TmFtZSwgY29tcG9uZW50VmVyc2lvbl0gPSAoKCkgPT4ge1xuICAgICAgaWYgKGF0dHJzLmNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIFthdHRycy5jb21wb25lbnROYW1lLCBhdHRycy5jb21wb25lbnRWZXJzaW9uID8/IExBVEVTVF9WRVJTSU9OXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29tcG9uZW50TmFtZVZlcnNpb24gPSBjZGsuU3RhY2sub2Yoc2NvcGUpLnNwbGl0QXJuKFxuICAgICAgICBjb21wb25lbnRBcm4sXG4gICAgICAgIGNkay5Bcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICAgICkucmVzb3VyY2VOYW1lITtcblxuICAgICAgY29uc3QgY29tcG9uZW50TmFtZVZlcnNpb25TcGxpdCA9IGNkay5Gbi5zcGxpdCgnLycsIGNvbXBvbmVudE5hbWVWZXJzaW9uKTtcbiAgICAgIHJldHVybiBbY2RrLkZuLnNlbGVjdCgwLCBjb21wb25lbnROYW1lVmVyc2lvblNwbGl0KSwgY2RrLkZuLnNlbGVjdCgxLCBjb21wb25lbnROYW1lVmVyc2lvblNwbGl0KV07XG4gICAgfSkoKTtcblxuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIENvbXBvbmVudEJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudEFybiA9IGNvbXBvbmVudEFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjb21wb25lbnRWZXJzaW9uID0gY29tcG9uZW50VmVyc2lvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBDb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzQ29tcG9uZW50KHg6IGFueSk6IHggaXMgQ29tcG9uZW50IHtcbiAgICByZXR1cm4geCAhPT0gbnVsbCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgQ09NUE9ORU5UX1NZTUJPTCBpbiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50VmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgZW5jcnlwdGVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnRUeXBlOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGttc0tleT86IGttcy5JS2V5O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ29tcG9uZW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTpcbiAgICAgICAgcHJvcHMuY29tcG9uZW50TmFtZSA/P1xuICAgICAgICBjZGsuTGF6eS5zdHJpbmcoe1xuICAgICAgICAgIHByb2R1Y2U6ICgpID0+XG4gICAgICAgICAgICBjZGsuTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHtcbiAgICAgICAgICAgICAgbWF4TGVuZ3RoOiAxMjgsXG4gICAgICAgICAgICAgIHNlcGFyYXRvcjogJy0nLFxuICAgICAgICAgICAgICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6ICctJyxcbiAgICAgICAgICAgIH0pLnRvTG93ZXJDYXNlKCksIC8vIEVuZm9yY2UgbG93ZXJjYXNlIGZvciB0aGUgYXV0by1nZW5lcmF0ZWQgZmFsbGJhY2tcbiAgICAgICAgfSksXG4gICAgfSk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgQ09NUE9ORU5UX1NZTUJPTCwgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuICAgIHRoaXMudmFsaWRhdGVDb21wb25lbnROYW1lKCk7XG5cbiAgICBwcm9wcy5zdXBwb3J0ZWRPc1ZlcnNpb25zPy5mb3JFYWNoKChvc1ZlcnNpb24pID0+IHtcbiAgICAgIGlmIChvc1ZlcnNpb24ucGxhdGZvcm0gIT09IHByb3BzLnBsYXRmb3JtKSB7XG4gICAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGBvcyB2ZXJzaW9uICR7b3NWZXJzaW9uLm9zVmVyc2lvbn0gaXMgbm90IGNvbXBhdGlibGUgd2l0aCBwbGF0Zm9ybSAke3Byb3BzLnBsYXRmb3JtfWAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXBvbmVudFZlcnNpb24gPSBwcm9wcy5jb21wb25lbnRWZXJzaW9uID8/ICcxLjAuMCc7XG4gICAgY29uc3Qgc3VwcG9ydGVkT3NWZXJzaW9ucyA9IHByb3BzLnN1cHBvcnRlZE9zVmVyc2lvbnM/LmZpbHRlcigob3NWZXJzaW9uKSA9PiBvc1ZlcnNpb24ub3NWZXJzaW9uICE9PSB1bmRlZmluZWQpO1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gbmV3IENmbkNvbXBvbmVudCh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIHZlcnNpb246IGNvbXBvbmVudFZlcnNpb24sXG4gICAgICBjaGFuZ2VEZXNjcmlwdGlvbjogcHJvcHMuY2hhbmdlRGVzY3JpcHRpb24sXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBwbGF0Zm9ybTogcHJvcHMucGxhdGZvcm0sXG4gICAgICBrbXNLZXlJZDogcHJvcHMua21zS2V5Py5rZXlBcm4sXG4gICAgICB0YWdzOiBwcm9wcy50YWdzLFxuICAgICAgLi4uKHByb3BzLmRhdGEuaXNTM1JlZmVyZW5jZSA/IHsgdXJpOiBwcm9wcy5kYXRhLnZhbHVlIH0gOiB7IGRhdGE6IHByb3BzLmRhdGEudmFsdWUgfSksXG4gICAgICAuLi4oc3VwcG9ydGVkT3NWZXJzaW9ucz8ubGVuZ3RoICYmIHtcbiAgICAgICAgc3VwcG9ydGVkT3NWZXJzaW9uczogc3VwcG9ydGVkT3NWZXJzaW9ucy5tYXAoKG9zVmVyc2lvbikgPT4gb3NWZXJzaW9uLm9zVmVyc2lvbiEpLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbXBvbmVudE5hbWUgPSB0aGlzLmdldFJlc291cmNlTmFtZUF0dHJpYnV0ZShjb21wb25lbnQuYXR0ck5hbWUpO1xuICAgIHRoaXMuY29tcG9uZW50QXJuID0gdGhpcy5nZXRSZXNvdXJjZUFybkF0dHJpYnV0ZShjb21wb25lbnQuYXR0ckFybiwge1xuICAgICAgc2VydmljZTogJ2ltYWdlYnVpbGRlcicsXG4gICAgICByZXNvdXJjZTogJ2NvbXBvbmVudCcsXG4gICAgICByZXNvdXJjZU5hbWU6IGAke3RoaXMucGh5c2ljYWxOYW1lfS8ke2NvbXBvbmVudFZlcnNpb259YCxcbiAgICB9KTtcbiAgICB0aGlzLmNvbXBvbmVudFZlcnNpb24gPSBjb21wb25lbnRWZXJzaW9uO1xuICAgIHRoaXMuZW5jcnlwdGVkID0gdHJ1ZTsgLy8gQ29tcG9uZW50cyBhcmUgYWx3YXlzIGVuY3J5cHRlZFxuICAgIHRoaXMuY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudC5hdHRyVHlwZTtcbiAgICB0aGlzLmttc0tleSA9IHByb3BzLmttc0tleTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVDb21wb25lbnROYW1lKCkge1xuICAgIGlmIChjZGsuVG9rZW4uaXNVbnJlc29sdmVkKHRoaXMucGh5c2ljYWxOYW1lKSkge1xuICAgICAgcmV0dXJuOyAvLyBDYW5ub3QgdmFsaWRhdGUgdW5yZXNvbHZlZCB0b2tlbnMsIGdpdmVuIHRoZWlyIGFjdHVhbCB2YWx1ZSBpcyByZW5kZXJlZCBhdCBkZXBsb3ltZW50IHRpbWVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUubGVuZ3RoID4gMTI4KSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYHRoZSBjb21wb25lbnROYW1lIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAxMjggY2hhcmFjdGVycywgZ290OiAnJHt0aGlzLnBoeXNpY2FsTmFtZX0nYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGh5c2ljYWxOYW1lLmluY2x1ZGVzKCcgJykpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGB0aGUgY29tcG9uZW50TmFtZSBjYW5ub3QgY29udGFpbiBzcGFjZXMsIGdvdDogJyR7dGhpcy5waHlzaWNhbE5hbWV9J2AsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZS5pbmNsdWRlcygnXycpKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihgdGhlIGNvbXBvbmVudE5hbWUgY2Fubm90IGNvbnRhaW4gdW5kZXJzY29yZXMsIGdvdDogJyR7dGhpcy5waHlzaWNhbE5hbWV9J2AsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZSAhPT0gdGhpcy5waHlzaWNhbE5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoYHRoZSBjb21wb25lbnROYW1lIG11c3QgYmUgbG93ZXJjYXNlLCBnb3Q6ICcke3RoaXMucGh5c2ljYWxOYW1lfSdgLCB0aGlzKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==