@aws-cdk/aws-imagebuilder-alpha 2.226.0-alpha.0 → 2.227.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.
- package/.jsii +5536 -521
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +223 -1
- package/README.md +387 -0
- package/lib/component.d.ts +833 -0
- package/lib/component.js +970 -0
- package/lib/distribution-configuration.d.ts +410 -0
- package/lib/distribution-configuration.js +413 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.js +4 -1
- package/lib/infrastructure-configuration.js +1 -1
- package/lib/os-version.d.ts +126 -0
- package/lib/os-version.js +158 -0
- package/package.json +6 -6
- package/rosetta/default.ts-fixture +1 -0
package/lib/component.js
ADDED
|
@@ -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.227.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.227.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.227.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.227.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.227.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.227.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.227.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.227.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==
|