@aws-cdk/aws-imagebuilder-alpha 2.229.1-alpha.0 → 2.231.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,459 @@
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.LifecyclePolicy = exports.LifecyclePolicyResourceType = exports.LifecyclePolicyStatus = exports.LifecyclePolicyActionType = 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 metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
44
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
45
+ const LIFECYCLE_POLICY_SYMBOL = Symbol.for('@aws-cdk/aws-imagebuilder-alpha.LifecyclePolicy');
46
+ /**
47
+ * The action to perform on the resources which the policy applies to
48
+ */
49
+ var LifecyclePolicyActionType;
50
+ (function (LifecyclePolicyActionType) {
51
+ /**
52
+ * Indicates that the rule should delete the resource when it is applied
53
+ */
54
+ LifecyclePolicyActionType["DELETE"] = "DELETE";
55
+ /**
56
+ * Indicates that the rule should deprecate the resource when it is applied
57
+ */
58
+ LifecyclePolicyActionType["DEPRECATE"] = "DEPRECATE";
59
+ /**
60
+ * Indicates that the rule should disable the resource when it is applied
61
+ */
62
+ LifecyclePolicyActionType["DISABLE"] = "DISABLE";
63
+ })(LifecyclePolicyActionType || (exports.LifecyclePolicyActionType = LifecyclePolicyActionType = {}));
64
+ /**
65
+ * The status of the lifecycle policy, indicating whether it will run
66
+ */
67
+ var LifecyclePolicyStatus;
68
+ (function (LifecyclePolicyStatus) {
69
+ /**
70
+ * Indicates that the lifecycle policy should be enabled
71
+ */
72
+ LifecyclePolicyStatus["ENABLED"] = "ENABLED";
73
+ /**
74
+ * Indicates that the lifecycle policy should be disabled
75
+ */
76
+ LifecyclePolicyStatus["DISABLED"] = "DISABLED";
77
+ })(LifecyclePolicyStatus || (exports.LifecyclePolicyStatus = LifecyclePolicyStatus = {}));
78
+ /**
79
+ * The resource type which the lifecycle policy is applied to
80
+ */
81
+ var LifecyclePolicyResourceType;
82
+ (function (LifecyclePolicyResourceType) {
83
+ /**
84
+ * Indicates the policy applies to AMI-based images
85
+ */
86
+ LifecyclePolicyResourceType["AMI_IMAGE"] = "AMI_IMAGE";
87
+ /**
88
+ * Indicates the policy applies to container images
89
+ */
90
+ LifecyclePolicyResourceType["CONTAINER_IMAGE"] = "CONTAINER_IMAGE";
91
+ })(LifecyclePolicyResourceType || (exports.LifecyclePolicyResourceType = LifecyclePolicyResourceType = {}));
92
+ class LifecyclePolicyBase extends cdk.Resource {
93
+ grant(grantee, ...actions) {
94
+ return iam.Grant.addToPrincipal({
95
+ grantee,
96
+ actions,
97
+ resourceArns: [this.lifecyclePolicyArn],
98
+ scope: this,
99
+ });
100
+ }
101
+ grantRead(grantee) {
102
+ return this.grant(grantee, 'imagebuilder:GetLifecyclePolicy');
103
+ }
104
+ }
105
+ /**
106
+ * Represents an EC2 Image Builder Lifecycle Policy.
107
+ *
108
+ * @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/manage-image-lifecycles.html
109
+ */
110
+ let LifecyclePolicy = (() => {
111
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
112
+ let _classDescriptor;
113
+ let _classExtraInitializers = [];
114
+ let _classThis;
115
+ let _classSuper = LifecyclePolicyBase;
116
+ var LifecyclePolicy = class extends _classSuper {
117
+ static { _classThis = this; }
118
+ static {
119
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
120
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
121
+ LifecyclePolicy = _classThis = _classDescriptor.value;
122
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
123
+ }
124
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.LifecyclePolicy", version: "2.231.0-alpha.0" };
125
+ /** Uniquely identifies this class. */
126
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-imagebuilder-alpha.LifecyclePolicy';
127
+ /**
128
+ * Import an existing lifecycle policy given its ARN.
129
+ */
130
+ static fromLifecyclePolicyArn(scope, id, lifecyclePolicyArn) {
131
+ const lifecyclePolicyName = cdk.Stack.of(scope).splitArn(lifecyclePolicyArn, cdk.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
132
+ class Import extends LifecyclePolicyBase {
133
+ lifecyclePolicyArn = lifecyclePolicyArn;
134
+ lifecyclePolicyName = lifecyclePolicyName;
135
+ }
136
+ return new Import(scope, id);
137
+ }
138
+ /**
139
+ * Import an existing lifecycle policy given its name. If the name is a token representing a dynamic CloudFormation
140
+ * expression, you must ensure all alphabetic characters in the expression are already lowercased
141
+ */
142
+ static fromLifecyclePolicyName(scope, id, lifecyclePolicyName) {
143
+ return LifecyclePolicy.fromLifecyclePolicyArn(scope, id, cdk.Stack.of(scope).formatArn({
144
+ service: 'imagebuilder',
145
+ resource: 'lifecycle-policy',
146
+ resourceName: lifecyclePolicyName,
147
+ }));
148
+ }
149
+ /**
150
+ * Return whether the given object is a LifecyclePolicy.
151
+ */
152
+ static isLifecyclePolicy(x) {
153
+ return x !== null && typeof x === 'object' && LIFECYCLE_POLICY_SYMBOL in x;
154
+ }
155
+ /**
156
+ * The ARN of the lifecycle policy
157
+ */
158
+ lifecyclePolicyArn;
159
+ /**
160
+ * The name of the lifecycle policy
161
+ */
162
+ lifecyclePolicyName;
163
+ /**
164
+ * The execution role used for lifecycle policy executions
165
+ */
166
+ executionRole;
167
+ constructor(scope, id, props) {
168
+ super(scope, id, {
169
+ physicalName: props.lifecyclePolicyName ??
170
+ cdk.Lazy.string({
171
+ produce: () => cdk.Names.uniqueResourceName(this, {
172
+ maxLength: 128,
173
+ separator: '-',
174
+ allowedSpecialCharacters: '-',
175
+ }).toLowerCase(),
176
+ }),
177
+ });
178
+ try {
179
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_LifecyclePolicyProps(props);
180
+ }
181
+ catch (error) {
182
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
183
+ Error.captureStackTrace(error, LifecyclePolicy);
184
+ }
185
+ throw error;
186
+ }
187
+ // Enhanced CDK Analytics Telemetry
188
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
189
+ Object.defineProperty(this, LIFECYCLE_POLICY_SYMBOL, { value: true });
190
+ this.validateLifecyclePolicyName();
191
+ this.validatePolicy(props);
192
+ this.executionRole =
193
+ props.executionRole ??
194
+ new iam.Role(this, 'ExecutionRole', {
195
+ assumedBy: new iam.ServicePrincipal('imagebuilder.amazonaws.com'),
196
+ managedPolicies: [
197
+ iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/EC2ImageBuilderLifecycleExecutionPolicy'),
198
+ ],
199
+ });
200
+ const lifecyclePolicy = new aws_imagebuilder_1.CfnLifecyclePolicy(this, 'Resource', {
201
+ name: this.physicalName,
202
+ description: props.description,
203
+ resourceType: props.resourceType,
204
+ executionRole: this.executionRole.roleArn,
205
+ policyDetails: this.buildPolicyDetails(props.resourceType, props.details),
206
+ resourceSelection: {
207
+ ...(props.resourceSelection.recipes !== undefined && {
208
+ recipes: this.buildRecipes(props.resourceType, props.resourceSelection.recipes),
209
+ }),
210
+ tagMap: props.resourceSelection.tags,
211
+ },
212
+ status: props.status,
213
+ tags: props.tags,
214
+ });
215
+ this.lifecyclePolicyName = this.getResourceNameAttribute(lifecyclePolicy.ref);
216
+ this.lifecyclePolicyArn = this.getResourceArnAttribute(lifecyclePolicy.attrArn, {
217
+ service: 'imagebuilder',
218
+ resource: 'lifecycle-policy',
219
+ resourceName: this.physicalName,
220
+ });
221
+ }
222
+ /**
223
+ * Generates the policy details property into the `PolicyDetail` type in the CloudFormation L1 definition.
224
+ *
225
+ * @param resourceType The resource type of the lifecycle policy
226
+ * @param details The lifecycle policy rules
227
+ * @private
228
+ */
229
+ buildPolicyDetails(resourceType, details) {
230
+ return details.map((detail) => {
231
+ const action = this.buildAction(resourceType, detail.action);
232
+ const exclusionRules = detail.exclusionRules !== undefined ? this.buildExclusionRules(detail.exclusionRules) : undefined;
233
+ this.validatePolicyDetailAction(resourceType, detail.action, exclusionRules?.amis);
234
+ this.validatePolicyDetailFilter(detail.filter);
235
+ return {
236
+ action: action,
237
+ filter: {
238
+ retainAtLeast: detail.filter.ageFilter?.retainAtLeast,
239
+ type: detail.filter.ageFilter !== undefined ? 'AGE' : 'COUNT',
240
+ ...(detail.filter.ageFilter !== undefined
241
+ ? this.convertDurationToTimeUnitValue(detail.filter.ageFilter.age)
242
+ : { value: detail.filter.countFilter.count }),
243
+ },
244
+ ...(exclusionRules !== undefined && { exclusionRules }),
245
+ };
246
+ });
247
+ }
248
+ /**
249
+ * Generates the recipes property in the resource selection into the `RecipeSelection` type in the CloudFormation L1
250
+ * definition.
251
+ *
252
+ * @param resourceType The resource type of the lifecycle policy
253
+ * @param recipes The recipes passed in the props
254
+ * @private
255
+ */
256
+ buildRecipes(resourceType, recipes) {
257
+ return recipes?.map((recipe) => {
258
+ if (recipe._isImageRecipe()) {
259
+ if (resourceType === LifecyclePolicyResourceType.CONTAINER_IMAGE) {
260
+ throw new cdk.ValidationError(`recipes in the resource selection must all be container recipes for policy type ${LifecyclePolicyResourceType.CONTAINER_IMAGE}`, this);
261
+ }
262
+ return {
263
+ name: recipe.imageRecipeName,
264
+ semanticVersion: recipe.imageRecipeVersion,
265
+ };
266
+ }
267
+ if (recipe._isContainerRecipe()) {
268
+ if (resourceType === LifecyclePolicyResourceType.AMI_IMAGE) {
269
+ throw new cdk.ValidationError(`recipes in the resource selection must all be image recipes for policy type ${LifecyclePolicyResourceType.AMI_IMAGE}`, this);
270
+ }
271
+ return {
272
+ name: recipe.containerRecipeName,
273
+ semanticVersion: recipe.containerRecipeVersion,
274
+ };
275
+ }
276
+ throw new cdk.ValidationError('recipes in the resource selection must either be an IImageRecipe or IContainerRecipe', this);
277
+ });
278
+ }
279
+ /**
280
+ * Generates the exclusion rules property into the `ExclusionRules` type in the CloudFormation L1 definition.
281
+ *
282
+ * @param exclusionRules The exclusion rules for resources applied in the lifecycle policy rule
283
+ * @private
284
+ */
285
+ buildExclusionRules(exclusionRules) {
286
+ const amiExclusionRules = {
287
+ ...(exclusionRules.amiExclusionRules?.isPublic && { isPublic: exclusionRules.amiExclusionRules.isPublic }),
288
+ ...(exclusionRules.amiExclusionRules?.lastLaunched !== undefined && {
289
+ lastLaunched: this.convertDurationToTimeUnitValue(exclusionRules.amiExclusionRules.lastLaunched, 365),
290
+ }),
291
+ ...(exclusionRules.amiExclusionRules?.regions?.length && { regions: exclusionRules.amiExclusionRules.regions }),
292
+ ...(exclusionRules.amiExclusionRules?.sharedAccounts?.length && {
293
+ sharedAccounts: exclusionRules.amiExclusionRules.sharedAccounts,
294
+ }),
295
+ ...(exclusionRules.amiExclusionRules?.tags && { tagMap: exclusionRules.amiExclusionRules.tags }),
296
+ };
297
+ const cfnExclusionRules = {
298
+ ...(Object.keys(amiExclusionRules).length && { amis: amiExclusionRules }),
299
+ ...(exclusionRules.imageExclusionRules !== undefined && { tagMap: exclusionRules.imageExclusionRules.tags }),
300
+ };
301
+ return Object.keys(exclusionRules).length ? cfnExclusionRules : undefined;
302
+ }
303
+ /**
304
+ * Generates the action property into the `Action` type in the CloudFormation L1 definition.
305
+ *
306
+ * @param resourceType The resource type of the lifecycle policy
307
+ * @param action The action being taken in the lifecycle policy rule
308
+ * @private
309
+ */
310
+ buildAction(resourceType, action) {
311
+ const isContainerPolicy = !cdk.Token.isUnresolved(resourceType) && resourceType === LifecyclePolicyResourceType.CONTAINER_IMAGE;
312
+ const isAmiPolicy = !cdk.Token.isUnresolved(resourceType) && resourceType === LifecyclePolicyResourceType.AMI_IMAGE;
313
+ const amis = action.includeAmis ?? (isAmiPolicy ? true : undefined);
314
+ const snapshots = action.includeSnapshots ?? (isAmiPolicy ? true : undefined);
315
+ const containers = action.includeContainers ?? (isContainerPolicy ? true : undefined);
316
+ const includeResources = {
317
+ ...(amis !== undefined && { amis }),
318
+ ...(snapshots !== undefined && { snapshots }),
319
+ ...(containers !== undefined && { containers }),
320
+ };
321
+ return {
322
+ type: action.type,
323
+ ...(Object.keys(includeResources).length && { includeResources }),
324
+ };
325
+ }
326
+ /**
327
+ * Validates the top-level properties of the policy
328
+ *
329
+ * @param props The props passed as input to the construct
330
+ * @private
331
+ */
332
+ validatePolicy(props) {
333
+ if (props.resourceSelection.recipes?.length && Object.keys(props.resourceSelection.tags || {}).length) {
334
+ throw new cdk.ValidationError('resource selection cannot contain both recipes and tags', this);
335
+ }
336
+ if (!props.resourceSelection.recipes?.length && !Object.keys(props.resourceSelection.tags || {}).length) {
337
+ throw new cdk.ValidationError('resource selection must contain either recipes or tags', this);
338
+ }
339
+ if (props.details.length === 0) {
340
+ throw new cdk.ValidationError('a lifecycle policy must have at least 1 rule', this);
341
+ }
342
+ if (props.details.length > 3) {
343
+ throw new cdk.ValidationError('a lifecycle policy can only have up to 3 rules', this);
344
+ }
345
+ const actions = props.details.map((detail) => detail.action.type);
346
+ if (new Set(actions).size != actions.length) {
347
+ throw new cdk.ValidationError('lifecycle policy rules may not have duplicate actions', this);
348
+ }
349
+ }
350
+ /**
351
+ * Validates a policy detail filter within a lifecycle policy rule
352
+ *
353
+ * @param resourceType The resource type of the lifecycle policy
354
+ * @param action The action being taken in the lifecycle policy rule
355
+ * @param amiExclusionRules The AMI exclusion rules in the lifecycle policy rule
356
+ * @private
357
+ */
358
+ validatePolicyDetailAction(resourceType, action, amiExclusionRules) {
359
+ if (!cdk.Token.isUnresolved(resourceType) && resourceType === LifecyclePolicyResourceType.CONTAINER_IMAGE) {
360
+ if (!cdk.Token.isUnresolved(action.type) && action.type !== LifecyclePolicyActionType.DELETE) {
361
+ throw new cdk.ValidationError('you may only specify DELETE rules for container policies', this);
362
+ }
363
+ if (action.includeAmis) {
364
+ throw new cdk.ValidationError('you cannot include AMIs in a container policy', this);
365
+ }
366
+ if (action.includeSnapshots) {
367
+ throw new cdk.ValidationError('you cannot include snapshots in a container policy', this);
368
+ }
369
+ if (amiExclusionRules !== undefined) {
370
+ throw new cdk.ValidationError('you cannot exclude AMIs in a container policy', this);
371
+ }
372
+ }
373
+ if (!cdk.Token.isUnresolved(resourceType) &&
374
+ resourceType === LifecyclePolicyResourceType.AMI_IMAGE &&
375
+ action.includeContainers) {
376
+ throw new cdk.ValidationError('you cannot include containers in an AMI policy', this);
377
+ }
378
+ }
379
+ /**
380
+ * Validates a policy detail filter
381
+ *
382
+ * @param filter The lifecycle policy resource filter applied in the rule
383
+ * @private
384
+ */
385
+ validatePolicyDetailFilter(filter) {
386
+ if (filter.ageFilter !== undefined && filter.countFilter !== undefined) {
387
+ throw new cdk.ValidationError('either age count can be specified in a policy filter, but not both', this);
388
+ }
389
+ if (filter.ageFilter === undefined && filter.countFilter === undefined) {
390
+ throw new cdk.ValidationError('you must provide an age or count filter in the policy', this);
391
+ }
392
+ const retainAtLeast = filter.ageFilter?.retainAtLeast;
393
+ if (retainAtLeast !== undefined) {
394
+ if (retainAtLeast < 1) {
395
+ throw new cdk.ValidationError('the retainAtLeast filter value must be at least 1', this);
396
+ }
397
+ if (retainAtLeast > 10) {
398
+ throw new cdk.ValidationError('the retainAtLeast filter value must be at most 10', this);
399
+ }
400
+ }
401
+ }
402
+ /**
403
+ * Converts a `cdk.Duration` into the value and unit which is accepted as filter age and last launched age in the
404
+ * lifecycle policy. The value is rounded up to the nearest whole number.
405
+ *
406
+ * @param duration The duration to convert
407
+ * @param valueLimit The maximum value that can be specified
408
+ * @private
409
+ */
410
+ convertDurationToTimeUnitValue(duration, valueLimit = 1000) {
411
+ const DAYS_PER_WEEK = 7;
412
+ const DAYS_PER_MONTH = 30;
413
+ const DAYS_PER_YEAR = 365;
414
+ const valueInDays = Math.ceil(duration.toDays());
415
+ if (valueInDays < 1) {
416
+ throw new cdk.ValidationError('the provided duration must be at least 1 day', this);
417
+ }
418
+ if (valueInDays <= valueLimit) {
419
+ return { value: valueInDays, unit: 'DAYS' };
420
+ }
421
+ const valueInWeeks = Math.ceil(valueInDays / DAYS_PER_WEEK);
422
+ if (valueInWeeks <= valueLimit) {
423
+ return { value: valueInWeeks, unit: 'WEEKS' };
424
+ }
425
+ const valueInMonths = Math.ceil(valueInDays / DAYS_PER_MONTH);
426
+ if (valueInMonths <= valueLimit) {
427
+ return { value: valueInMonths, unit: 'MONTHS' };
428
+ }
429
+ const valueInYears = Math.ceil(valueInDays / DAYS_PER_YEAR);
430
+ if (valueInYears <= valueLimit) {
431
+ return { value: valueInYears, unit: 'YEARS' };
432
+ }
433
+ throw new cdk.ValidationError(`the provided duration must be less than ${valueLimit} years`, this);
434
+ }
435
+ validateLifecyclePolicyName() {
436
+ if (cdk.Token.isUnresolved(this.physicalName)) {
437
+ return; // Cannot validate unresolved tokens, given their actual value is rendered at deployment time
438
+ }
439
+ if (this.physicalName.length > 128) {
440
+ throw new cdk.ValidationError('The lifecyclePolicyName cannot be longer than 128 characters', this);
441
+ }
442
+ if (this.physicalName.includes(' ')) {
443
+ throw new cdk.ValidationError('The lifecyclePolicyName cannot contain spaces', this);
444
+ }
445
+ if (this.physicalName.includes('_')) {
446
+ throw new cdk.ValidationError('The lifecyclePolicyName cannot contain underscores', this);
447
+ }
448
+ if (this.physicalName !== this.physicalName.toLowerCase()) {
449
+ throw new cdk.ValidationError('The lifecyclePolicyName must be lowercase', this);
450
+ }
451
+ }
452
+ static {
453
+ __runInitializers(_classThis, _classExtraInitializers);
454
+ }
455
+ };
456
+ return LifecyclePolicy = _classThis;
457
+ })();
458
+ exports.LifecyclePolicy = LifecyclePolicy;
459
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZWN5Y2xlLXBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxpZmVjeWNsZS1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQW1DO0FBQ25DLDJDQUEyQztBQUMzQyxtRUFBa0U7QUFDbEUsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUkxRSxNQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsaURBQWlELENBQUMsQ0FBQztBQW9DOUY7O0dBRUc7QUFDSCxJQUFZLHlCQWFYO0FBYkQsV0FBWSx5QkFBeUI7SUFDbkM7O09BRUc7SUFDSCw4Q0FBaUIsQ0FBQTtJQUNqQjs7T0FFRztJQUNILG9EQUF1QixDQUFBO0lBQ3ZCOztPQUVHO0lBQ0gsZ0RBQW1CLENBQUE7QUFDckIsQ0FBQyxFQWJXLHlCQUF5Qix5Q0FBekIseUJBQXlCLFFBYXBDO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLHFCQVVYO0FBVkQsV0FBWSxxQkFBcUI7SUFDL0I7O09BRUc7SUFDSCw0Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILDhDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFWVyxxQkFBcUIscUNBQXJCLHFCQUFxQixRQVVoQztBQUVEOztHQUVHO0FBQ0gsSUFBWSwyQkFVWDtBQVZELFdBQVksMkJBQTJCO0lBQ3JDOztPQUVHO0lBQ0gsc0RBQXVCLENBQUE7SUFFdkI7O09BRUc7SUFDSCxrRUFBbUMsQ0FBQTtBQUNyQyxDQUFDLEVBVlcsMkJBQTJCLDJDQUEzQiwyQkFBMkIsUUFVdEM7QUF5UEQsTUFBZSxtQkFBb0IsU0FBUSxHQUFHLENBQUMsUUFBUTtJQUk5QyxLQUFLLENBQUMsT0FBdUIsRUFBRSxHQUFHLE9BQWlCO1FBQ3hELE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDOUIsT0FBTztZQUNQLE9BQU87WUFDUCxZQUFZLEVBQUUsQ0FB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QUksRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUNoRCxDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsMkNBQTJDLFVBQVUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3BHO1FBRU8sMkJBQTJCO1lBQ2pDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLE9BQU8sQ0FBQyw2RkFBNkY7WUFDdkcsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLDhEQUE4RCxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RHLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLCtDQUErQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3ZGLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLG9EQUFvRCxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVGLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQywyQ0FBMkMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuRixDQUFDO1NBQ0Y7O1lBM1pVLHVEQUFlOzs7OztBQUFmLDBDQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IENmbkxpZmVjeWNsZVBvbGljeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pbWFnZWJ1aWxkZXInO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJUmVjaXBlQmFzZSB9IGZyb20gJy4vcmVjaXBlLWJhc2UnO1xuXG5jb25zdCBMSUZFQ1lDTEVfUE9MSUNZX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ0Bhd3MtY2RrL2F3cy1pbWFnZWJ1aWxkZXItYWxwaGEuTGlmZWN5Y2xlUG9saWN5Jyk7XG5cbi8qKlxuICogQW4gRUMyIEltYWdlIEJ1aWxkZXIgTGlmZWN5Y2xlIFBvbGljeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTGlmZWN5Y2xlUG9saWN5IGV4dGVuZHMgY2RrLklSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBsaWZlY3ljbGUgcG9saWN5XG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGxpZmVjeWNsZVBvbGljeUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbGlmZWN5Y2xlIHBvbGljeVxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBsaWZlY3ljbGVQb2xpY3lOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYW50IGN1c3RvbSBhY3Rpb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgbGlmZWN5Y2xlIHBvbGljeVxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSAtIFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIGFjdGlvbnMgLSBUaGUgbGlzdCBvZiBhY3Rpb25zXG4gICAqL1xuICBncmFudChncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgLi4uYWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSBsaWZlY3ljbGUgcG9saWN5XG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIC0gVGhlIHByaW5jaXBhbFxuICAgKi9cbiAgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xufVxuXG4vKipcbiAqIFRoZSBhY3Rpb24gdG8gcGVyZm9ybSBvbiB0aGUgcmVzb3VyY2VzIHdoaWNoIHRoZSBwb2xpY3kgYXBwbGllcyB0b1xuICovXG5leHBvcnQgZW51bSBMaWZlY3ljbGVQb2xpY3lBY3Rpb25UeXBlIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSBydWxlIHNob3VsZCBkZWxldGUgdGhlIHJlc291cmNlIHdoZW4gaXQgaXMgYXBwbGllZFxuICAgKi9cbiAgREVMRVRFID0gJ0RFTEVURScsXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcnVsZSBzaG91bGQgZGVwcmVjYXRlIHRoZSByZXNvdXJjZSB3aGVuIGl0IGlzIGFwcGxpZWRcbiAgICovXG4gIERFUFJFQ0FURSA9ICdERVBSRUNBVEUnLFxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHJ1bGUgc2hvdWxkIGRpc2FibGUgdGhlIHJlc291cmNlIHdoZW4gaXQgaXMgYXBwbGllZFxuICAgKi9cbiAgRElTQUJMRSA9ICdESVNBQkxFJyxcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBsaWZlY3ljbGUgcG9saWN5LCBpbmRpY2F0aW5nIHdoZXRoZXIgaXQgd2lsbCBydW5cbiAqL1xuZXhwb3J0IGVudW0gTGlmZWN5Y2xlUG9saWN5U3RhdHVzIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSBsaWZlY3ljbGUgcG9saWN5IHNob3VsZCBiZSBlbmFibGVkXG4gICAqL1xuICBFTkFCTEVEID0gJ0VOQUJMRUQnLFxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbGlmZWN5Y2xlIHBvbGljeSBzaG91bGQgYmUgZGlzYWJsZWRcbiAgICovXG4gIERJU0FCTEVEID0gJ0RJU0FCTEVEJyxcbn1cblxuLyoqXG4gKiBUaGUgcmVzb3VyY2UgdHlwZSB3aGljaCB0aGUgbGlmZWN5Y2xlIHBvbGljeSBpcyBhcHBsaWVkIHRvXG4gKi9cbmV4cG9ydCBlbnVtIExpZmVjeWNsZVBvbGljeVJlc291cmNlVHlwZSB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIHBvbGljeSBhcHBsaWVzIHRvIEFNSS1iYXNlZCBpbWFnZXNcbiAgICovXG4gIEFNSV9JTUFHRSA9ICdBTUlfSU1BR0UnLFxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIHBvbGljeSBhcHBsaWVzIHRvIGNvbnRhaW5lciBpbWFnZXNcbiAgICovXG4gIENPTlRBSU5FUl9JTUFHRSA9ICdDT05UQUlORVJfSU1BR0UnLFxufVxuXG4vKipcbiAqIFRoZSBhY3Rpb24gdG8gcGVyZm9ybSBpbiB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlUG9saWN5QWN0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBhY3Rpb24gdG8gcGVyZm9ybSBvbiB0aGUgcmVzb3VyY2VzIHNlbGVjdGVkIGluIHRoZSBsaWZlY3ljbGUgcG9saWN5IHJ1bGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IExpZmVjeWNsZVBvbGljeUFjdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBBTUlzIGluIHRoZSBzY29wZSBvZiB0aGUgbGlmZWN5Y2xlIHJ1bGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB0cnVlIGZvciBBTUktYmFzZWQgcG9saWNpZXMsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZUFtaXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgY29udGFpbmVycyBpbiB0aGUgc2NvcGUgb2YgdGhlIGxpZmVjeWNsZSBydWxlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZSBmb3IgY29udGFpbmVyLWJhc2VkIHBvbGljaWVzLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVDb250YWluZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHNuYXBzaG90cyBpbiB0aGUgc2NvcGUgb2YgdGhlIGxpZmVjeWNsZSBydWxlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZSBmb3IgQU1JLWJhc2VkIHBvbGljaWVzLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVTbmFwc2hvdHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSByZXNvdXJjZSBmaWx0ZXJpbmcgdG8gYXBwbHkgaW4gdGhlIGxpZmVjeWNsZSBwb2xpY3kgcnVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZVBvbGljeUZpbHRlciB7XG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgYWdlIGZpbHRlciB0byBhcHBseSBpbiB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZSBpZiBhIGNvdW50IGZpbHRlciBpcyBwcm92aWRlZC4gT3RoZXJ3aXNlLCBhbiBhZ2UgZmlsdGVyIGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYWdlRmlsdGVyPzogTGlmZWN5Y2xlUG9saWN5QWdlRmlsdGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgY291bnQgZmlsdGVyIHRvIGFwcGx5IGluIHRoZSBsaWZlY3ljbGUgcG9saWN5IHJ1bGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lIGlmIGFuIGFnZSBmaWx0ZXIgaXMgcHJvdmlkZWQuIE90aGVyd2lzZSwgYSBjb3VudCBmaWx0ZXIgaXMgcmVxdWlyZWQuXG4gICAqL1xuICByZWFkb25seSBjb3VudEZpbHRlcj86IExpZmVjeWNsZVBvbGljeUNvdW50RmlsdGVyO1xufVxuXG4vKipcbiAqIFRoZSBjb3VudC1iYXNlZCBmaWx0ZXJpbmcgdG8gYXBwbHkgaW4gYSBsaWZlY3ljbGUgcG9saWN5IHJ1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVQb2xpY3lDb3VudEZpbHRlciB7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBudW1iZXIgb2YgcmVzb3VyY2VzIHRvIGtlZXAgb24gaGFuZCBhcyBwYXJ0IG9mIHJlc291cmNlIGZpbHRlcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgY291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgYWdlLWJhc2VkIGZpbHRlcmluZyB0byBhcHBseSBpbiBhIGxpZmVjeWNsZSBwb2xpY3kgcnVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZVBvbGljeUFnZUZpbHRlciB7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBhZ2Ugb2YgdGhlIHJlc291cmNlIHRvIGZpbHRlci4gVGhlIHByb3ZpZGVkIGR1cmF0aW9uIHdpbGwgYmUgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdFxuICAgKiBkYXkvd2Vlay9tb250aC95ZWFyIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWdlOiBjZGsuRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEZvciBhZ2UtYmFzZWQgZmlsdGVycywgdGhlIG51bWJlciBvZiBFQzIgSW1hZ2UgQnVpbGRlciBpbWFnZXMgdG8ga2VlcCBvbiBoYW5kIG9uY2UgdGhlIHJ1bGUgaXMgYXBwbGllZC4gVGhlIHZhbHVlXG4gICAqIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMC5cbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgcmVhZG9ubHkgcmV0YWluQXRMZWFzdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgcnVsZXMgdG8gYXBwbHkgZm9yIGV4Y2x1ZGluZyBFQzIgSW1hZ2UgQnVpbGRlciBpbWFnZXMgZnJvbSB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlUG9saWN5SW1hZ2VFeGNsdXNpb25SdWxlcyB7XG4gIC8qKlxuICAgKiBFeGNsdWRlcyBFQzIgSW1hZ2UgQnVpbGRlciBpbWFnZXMgd2l0aCBhbnkgb2YgdGhlIHByb3ZpZGVkIHRhZ3MgZnJvbSB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gICAqL1xuICByZWFkb25seSB0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIFRoZSBydWxlcyB0byBhcHBseSBmb3IgZXhjbHVkaW5nIEFNSXMgZnJvbSB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlUG9saWN5QW1pRXhjbHVzaW9uUnVsZXMge1xuICAvKipcbiAgICogRXhjbHVkZXMgcHVibGljIEFNSXMgZnJvbSB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlIGlmIHRydWVcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGlzUHVibGljPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXhjbHVkZXMgQU1JcyB3aGljaCB3ZXJlIGxhdW5jaGVkIGZyb20gd2l0aGluIHRoZSBwcm92aWRlZCBkdXJhdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICByZWFkb25seSBsYXN0TGF1bmNoZWQ/OiBjZGsuRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEV4Y2x1ZGVzIEFNSXMgd2hpY2ggcmVzaWRlIGluIGFueSBvZiB0aGUgcHJvdmlkZWQgcmVnaW9uc1xuICAgKlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICByZWFkb25seSByZWdpb25zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEV4Y2x1ZGVzIEFNSXMgd2hpY2ggYXJlIHNoYXJlZCB3aXRoIGFueSBvZiB0aGUgcHJvdmlkZWQgc2hhcmVkIGFjY291bnRzXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHNoYXJlZEFjY291bnRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEV4Y2x1ZGVzIEFNSXMgd2hpY2ggaGF2ZSBhbnkgb2YgdGhlIHByb3ZpZGVkIHRhZ3MgYXBwbGllZCB0byBpdFxuICAgKlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBUaGUgcnVsZXMgdG8gYXBwbHkgZm9yIGV4Y2x1ZGluZyByZXNvdXJjZXMgZnJvbSB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlUG9saWN5RXhjbHVzaW9uUnVsZXMge1xuICAvKipcbiAgICogVGhlIHJ1bGVzIHRvIGFwcGx5IGZvciBleGNsdWRpbmcgRUMyIEltYWdlIEJ1aWxkZXIgaW1hZ2VzIGZyb20gdGhlIGxpZmVjeWNsZSBwb2xpY3kgcnVsZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4Y2x1c2lvbiBydWxlcyBhcmUgYXBwbGllZCBvbiB0aGUgaW1hZ2VcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlRXhjbHVzaW9uUnVsZXM/OiBMaWZlY3ljbGVQb2xpY3lJbWFnZUV4Y2x1c2lvblJ1bGVzO1xuXG4gIC8qKlxuICAgKiBUaGUgcnVsZXMgdG8gYXBwbHkgZm9yIGV4Y2x1ZGluZyBBTUlzIGZyb20gdGhlIGxpZmVjeWNsZSBwb2xpY3kgcnVsZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4Y2x1c2lvbiBydWxlcyBhcmUgYXBwbGllZCBvbiB0aGUgQU1JXG4gICAqL1xuICByZWFkb25seSBhbWlFeGNsdXNpb25SdWxlcz86IExpZmVjeWNsZVBvbGljeUFtaUV4Y2x1c2lvblJ1bGVzO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgdGhlIGxpZmVjeWNsZSBwb2xpY3kgcnVsZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVQb2xpY3lEZXRhaWwge1xuICAvKipcbiAgICogVGhlIGFjdGlvbiB0byBwZXJmb3JtIGluIHRoZSBsaWZlY3ljbGUgcG9saWN5IHJ1bGVcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbjogTGlmZWN5Y2xlUG9saWN5QWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgZmlsdGVyaW5nIHRvIGFwcGx5IGluIHRoZSBsaWZlY3ljbGUgcG9saWN5IHJ1bGVcbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlcjogTGlmZWN5Y2xlUG9saWN5RmlsdGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcnVsZXMgdG8gYXBwbHkgZm9yIGV4Y2x1ZGluZyByZXNvdXJjZXMgZnJvbSB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXhjbHVzaW9uIHJ1bGVzIGFyZSBhcHBsaWVkIG9uIGFueSByZXNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVzaW9uUnVsZXM/OiBMaWZlY3ljbGVQb2xpY3lFeGNsdXNpb25SdWxlcztcbn1cblxuLyoqXG4gKiBTZWxlY3Rpb24gY3JpdGVyaWEgZm9yIHRoZSByZXNvdXJjZXMgdGhhdCB0aGUgbGlmZWN5Y2xlIHBvbGljeSBhcHBsaWVzIHRvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlUG9saWN5UmVzb3VyY2VTZWxlY3Rpb24ge1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgaW1hZ2UgcmVjaXBlcyBvciBjb250YWluZXIgcmVjaXBlcyB0byBhcHBseSB0aGUgbGlmZWN5Y2xlIHBvbGljeSB0b1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmUgaWYgdGFnIHNlbGVjdGlvbnMgYXJlIHByb3ZpZGVkLiBPdGhlcndpc2UsIGF0IGxlYXN0IG9uZSByZWNpcGUgb3IgdGFnIHNlbGVjdGlvbiBtdXN0IGJlIHByb3ZpZGVkXG4gICAqL1xuICByZWFkb25seSByZWNpcGVzPzogSVJlY2lwZUJhc2VbXTtcblxuICAvKipcbiAgICogU2VsZWN0cyBFQzIgSW1hZ2UgQnVpbGRlciBpbWFnZXMgY29udGFpbmluZyBhbnkgb2YgdGhlIHByb3ZpZGVkIHRhZ3NcbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lIGlmIHJlY2lwZSBzZWxlY3Rpb25zIGFyZSBwcm92aWRlZC4gT3RoZXJ3aXNlLCBhdCBsZWFzdCBvbmUgcmVjaXBlIG9yIHRhZyBzZWxlY3Rpb24gbXVzdCBiZSBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBMaWZlY3ljbGUgUG9saWN5IHJlc291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlUG9saWN5UHJvcHMge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgSW1hZ2UgQnVpbGRlciByZXNvdXJjZSB0aGF0IHRoZSBsaWZlY3ljbGUgcG9saWN5IGFwcGxpZXMgdG8uXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZVR5cGU6IExpZmVjeWNsZVBvbGljeVJlc291cmNlVHlwZTtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlcy5cbiAgICovXG4gIHJlYWRvbmx5IGRldGFpbHM6IExpZmVjeWNsZVBvbGljeURldGFpbFtdO1xuXG4gIC8qKlxuICAgKiBTZWxlY3Rpb24gY3JpdGVyaWEgZm9yIHRoZSByZXNvdXJjZXMgdGhhdCB0aGUgbGlmZWN5Y2xlIHBvbGljeSBhcHBsaWVzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VTZWxlY3Rpb246IExpZmVjeWNsZVBvbGljeVJlc291cmNlU2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbGlmZWN5Y2xlIHBvbGljeS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5hbWUgaXMgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBsaWZlY3ljbGVQb2xpY3lOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxpZmVjeWNsZSBwb2xpY3kuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBsaWZlY3ljbGUgcG9saWN5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBMaWZlY3ljbGVQb2xpY3lTdGF0dXMuRU5BQkxFRFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzPzogTGlmZWN5Y2xlUG9saWN5U3RhdHVzO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlY3V0aW9uIHJvbGUgdGhhdCBncmFudHMgSW1hZ2UgQnVpbGRlciBhY2Nlc3MgdG8gcnVuIGxpZmVjeWNsZSBhY3Rpb25zLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhbiBleGVjdXRpb24gcm9sZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgbWluaW1hbCBwZXJtaXNzaW9ucyBuZWVkZWQgdG8gZXhlY3V0ZSB0aGUgbGlmZWN5Y2xlIHBvbGljeVxuICAgKiBhY3Rpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFuIGV4ZWN1dGlvbiByb2xlIHdpbGwgYmUgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBleGVjdXRpb25Sb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFncyB0byBhcHBseSB0byB0aGUgbGlmZWN5Y2xlIHBvbGljeVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG5hYnN0cmFjdCBjbGFzcyBMaWZlY3ljbGVQb2xpY3lCYXNlIGV4dGVuZHMgY2RrLlJlc291cmNlIGltcGxlbWVudHMgSUxpZmVjeWNsZVBvbGljeSB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IGxpZmVjeWNsZVBvbGljeUFybjogc3RyaW5nO1xuICBhYnN0cmFjdCByZWFkb25seSBsaWZlY3ljbGVQb2xpY3lOYW1lOiBzdHJpbmc7XG5cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9ucyxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMubGlmZWN5Y2xlUG9saWN5QXJuXSxcbiAgICAgIHNjb3BlOiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoZ3JhbnRlZSwgJ2ltYWdlYnVpbGRlcjpHZXRMaWZlY3ljbGVQb2xpY3knKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gRUMyIEltYWdlIEJ1aWxkZXIgTGlmZWN5Y2xlIFBvbGljeS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pbWFnZWJ1aWxkZXIvbGF0ZXN0L3VzZXJndWlkZS9tYW5hZ2UtaW1hZ2UtbGlmZWN5Y2xlcy5odG1sXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBMaWZlY3ljbGVQb2xpY3kgZXh0ZW5kcyBMaWZlY3ljbGVQb2xpY3lCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtaW1hZ2VidWlsZGVyLWFscGhhLkxpZmVjeWNsZVBvbGljeSc7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBsaWZlY3ljbGUgcG9saWN5IGdpdmVuIGl0cyBBUk4uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21MaWZlY3ljbGVQb2xpY3lBcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgbGlmZWN5Y2xlUG9saWN5QXJuOiBzdHJpbmcpOiBJTGlmZWN5Y2xlUG9saWN5IHtcbiAgICBjb25zdCBsaWZlY3ljbGVQb2xpY3lOYW1lID0gY2RrLlN0YWNrLm9mKHNjb3BlKS5zcGxpdEFybihcbiAgICAgIGxpZmVjeWNsZVBvbGljeUFybixcbiAgICAgIGNkay5Bcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICApLnJlc291cmNlTmFtZSE7XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBMaWZlY3ljbGVQb2xpY3lCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBsaWZlY3ljbGVQb2xpY3lBcm4gPSBsaWZlY3ljbGVQb2xpY3lBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbGlmZWN5Y2xlUG9saWN5TmFtZSA9IGxpZmVjeWNsZVBvbGljeU5hbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgbGlmZWN5Y2xlIHBvbGljeSBnaXZlbiBpdHMgbmFtZS4gSWYgdGhlIG5hbWUgaXMgYSB0b2tlbiByZXByZXNlbnRpbmcgYSBkeW5hbWljIENsb3VkRm9ybWF0aW9uXG4gICAqIGV4cHJlc3Npb24sIHlvdSBtdXN0IGVuc3VyZSBhbGwgYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGluIHRoZSBleHByZXNzaW9uIGFyZSBhbHJlYWR5IGxvd2VyY2FzZWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUxpZmVjeWNsZVBvbGljeU5hbWUoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgbGlmZWN5Y2xlUG9saWN5TmFtZTogc3RyaW5nKTogSUxpZmVjeWNsZVBvbGljeSB7XG4gICAgcmV0dXJuIExpZmVjeWNsZVBvbGljeS5mcm9tTGlmZWN5Y2xlUG9saWN5QXJuKFxuICAgICAgc2NvcGUsXG4gICAgICBpZCxcbiAgICAgIGNkay5TdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogJ2ltYWdlYnVpbGRlcicsXG4gICAgICAgIHJlc291cmNlOiAnbGlmZWN5Y2xlLXBvbGljeScsXG4gICAgICAgIHJlc291cmNlTmFtZTogbGlmZWN5Y2xlUG9saWN5TmFtZSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIExpZmVjeWNsZVBvbGljeS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNMaWZlY3ljbGVQb2xpY3koeDogYW55KTogeCBpcyBMaWZlY3ljbGVQb2xpY3kge1xuICAgIHJldHVybiB4ICE9PSBudWxsICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiBMSUZFQ1lDTEVfUE9MSUNZX1NZTUJPTCBpbiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGxpZmVjeWNsZSBwb2xpY3lcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsaWZlY3ljbGVQb2xpY3lBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGxpZmVjeWNsZSBwb2xpY3lcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsaWZlY3ljbGVQb2xpY3lOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjdXRpb24gcm9sZSB1c2VkIGZvciBsaWZlY3ljbGUgcG9saWN5IGV4ZWN1dGlvbnNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBleGVjdXRpb25Sb2xlOiBpYW0uSVJvbGU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBMaWZlY3ljbGVQb2xpY3lQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOlxuICAgICAgICBwcm9wcy5saWZlY3ljbGVQb2xpY3lOYW1lID8/XG4gICAgICAgIGNkay5MYXp5LnN0cmluZyh7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT5cbiAgICAgICAgICAgIGNkay5OYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywge1xuICAgICAgICAgICAgICBtYXhMZW5ndGg6IDEyOCxcbiAgICAgICAgICAgICAgc2VwYXJhdG9yOiAnLScsXG4gICAgICAgICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogJy0nLFxuICAgICAgICAgICAgfSkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgfSksXG4gICAgfSk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTElGRUNZQ0xFX1BPTElDWV9TWU1CT0wsIHsgdmFsdWU6IHRydWUgfSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlTGlmZWN5Y2xlUG9saWN5TmFtZSgpO1xuICAgIHRoaXMudmFsaWRhdGVQb2xpY3kocHJvcHMpO1xuXG4gICAgdGhpcy5leGVjdXRpb25Sb2xlID1cbiAgICAgIHByb3BzLmV4ZWN1dGlvblJvbGUgPz9cbiAgICAgIG5ldyBpYW0uUm9sZSh0aGlzLCAnRXhlY3V0aW9uUm9sZScsIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2ltYWdlYnVpbGRlci5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0VDMkltYWdlQnVpbGRlckxpZmVjeWNsZUV4ZWN1dGlvblBvbGljeScpLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICBjb25zdCBsaWZlY3ljbGVQb2xpY3kgPSBuZXcgQ2ZuTGlmZWN5Y2xlUG9saWN5KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgcmVzb3VyY2VUeXBlOiBwcm9wcy5yZXNvdXJjZVR5cGUsXG4gICAgICBleGVjdXRpb25Sb2xlOiB0aGlzLmV4ZWN1dGlvblJvbGUucm9sZUFybixcbiAgICAgIHBvbGljeURldGFpbHM6IHRoaXMuYnVpbGRQb2xpY3lEZXRhaWxzKHByb3BzLnJlc291cmNlVHlwZSwgcHJvcHMuZGV0YWlscyksXG4gICAgICByZXNvdXJjZVNlbGVjdGlvbjoge1xuICAgICAgICAuLi4ocHJvcHMucmVzb3VyY2VTZWxlY3Rpb24ucmVjaXBlcyAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgICByZWNpcGVzOiB0aGlzLmJ1aWxkUmVjaXBlcyhwcm9wcy5yZXNvdXJjZVR5cGUsIHByb3BzLnJlc291cmNlU2VsZWN0aW9uLnJlY2lwZXMpLFxuICAgICAgICB9KSxcbiAgICAgICAgdGFnTWFwOiBwcm9wcy5yZXNvdXJjZVNlbGVjdGlvbi50YWdzLFxuICAgICAgfSxcbiAgICAgIHN0YXR1czogcHJvcHMuc3RhdHVzLFxuICAgICAgdGFnczogcHJvcHMudGFncyxcbiAgICB9KTtcblxuICAgIHRoaXMubGlmZWN5Y2xlUG9saWN5TmFtZSA9IHRoaXMuZ2V0UmVzb3VyY2VOYW1lQXR0cmlidXRlKGxpZmVjeWNsZVBvbGljeS5yZWYpO1xuICAgIHRoaXMubGlmZWN5Y2xlUG9saWN5QXJuID0gdGhpcy5nZXRSZXNvdXJjZUFybkF0dHJpYnV0ZShsaWZlY3ljbGVQb2xpY3kuYXR0ckFybiwge1xuICAgICAgc2VydmljZTogJ2ltYWdlYnVpbGRlcicsXG4gICAgICByZXNvdXJjZTogJ2xpZmVjeWNsZS1wb2xpY3knLFxuICAgICAgcmVzb3VyY2VOYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgdGhlIHBvbGljeSBkZXRhaWxzIHByb3BlcnR5IGludG8gdGhlIGBQb2xpY3lEZXRhaWxgIHR5cGUgaW4gdGhlIENsb3VkRm9ybWF0aW9uIEwxIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSByZXNvdXJjZVR5cGUgVGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIGxpZmVjeWNsZSBwb2xpY3lcbiAgICogQHBhcmFtIGRldGFpbHMgVGhlIGxpZmVjeWNsZSBwb2xpY3kgcnVsZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYnVpbGRQb2xpY3lEZXRhaWxzKFxuICAgIHJlc291cmNlVHlwZTogTGlmZWN5Y2xlUG9saWN5UmVzb3VyY2VUeXBlLFxuICAgIGRldGFpbHM6IExpZmVjeWNsZVBvbGljeURldGFpbFtdLFxuICApOiBDZm5MaWZlY3ljbGVQb2xpY3kuUG9saWN5RGV0YWlsUHJvcGVydHlbXSB7XG4gICAgcmV0dXJuIGRldGFpbHMubWFwKChkZXRhaWwpOiBDZm5MaWZlY3ljbGVQb2xpY3kuUG9saWN5RGV0YWlsUHJvcGVydHkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5idWlsZEFjdGlvbihyZXNvdXJjZVR5cGUsIGRldGFpbC5hY3Rpb24pO1xuICAgICAgY29uc3QgZXhjbHVzaW9uUnVsZXMgPVxuICAgICAgICBkZXRhaWwuZXhjbHVzaW9uUnVsZXMgIT09IHVuZGVmaW5lZCA/IHRoaXMuYnVpbGRFeGNsdXNpb25SdWxlcyhkZXRhaWwuZXhjbHVzaW9uUnVsZXMpIDogdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnZhbGlkYXRlUG9saWN5RGV0YWlsQWN0aW9uKHJlc291cmNlVHlwZSwgZGV0YWlsLmFjdGlvbiwgZXhjbHVzaW9uUnVsZXM/LmFtaXMpO1xuICAgICAgdGhpcy52YWxpZGF0ZVBvbGljeURldGFpbEZpbHRlcihkZXRhaWwuZmlsdGVyKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgIHJldGFpbkF0TGVhc3Q6IGRldGFpbC5maWx0ZXIuYWdlRmlsdGVyPy5yZXRhaW5BdExlYXN0LFxuICAgICAgICAgIHR5cGU6IGRldGFpbC5maWx0ZXIuYWdlRmlsdGVyICE9PSB1bmRlZmluZWQgPyAnQUdFJyA6ICdDT1VOVCcsXG4gICAgICAgICAgLi4uKGRldGFpbC5maWx0ZXIuYWdlRmlsdGVyICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gdGhpcy5jb252ZXJ0RHVyYXRpb25Ub1RpbWVVbml0VmFsdWUoZGV0YWlsLmZpbHRlci5hZ2VGaWx0ZXIuYWdlKVxuICAgICAgICAgICAgOiB7IHZhbHVlOiBkZXRhaWwuZmlsdGVyLmNvdW50RmlsdGVyIS5jb3VudCB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uKGV4Y2x1c2lvblJ1bGVzICE9PSB1bmRlZmluZWQgJiYgeyBleGNsdXNpb25SdWxlcyB9KSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHRoZSByZWNpcGVzIHByb3BlcnR5IGluIHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gaW50byB0aGUgYFJlY2lwZVNlbGVjdGlvbmAgdHlwZSBpbiB0aGUgQ2xvdWRGb3JtYXRpb24gTDFcbiAgICogZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlVHlwZSBUaGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgbGlmZWN5Y2xlIHBvbGljeVxuICAgKiBAcGFyYW0gcmVjaXBlcyBUaGUgcmVjaXBlcyBwYXNzZWQgaW4gdGhlIHByb3BzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUmVjaXBlcyhcbiAgICByZXNvdXJjZVR5cGU6IExpZmVjeWNsZVBvbGljeVJlc291cmNlVHlwZSxcbiAgICByZWNpcGVzOiBJUmVjaXBlQmFzZVtdLFxuICApOiBDZm5MaWZlY3ljbGVQb2xpY3kuUmVjaXBlU2VsZWN0aW9uUHJvcGVydHlbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHJlY2lwZXM/Lm1hcCgocmVjaXBlKTogQ2ZuTGlmZWN5Y2xlUG9saWN5LlJlY2lwZVNlbGVjdGlvblByb3BlcnR5ID0+IHtcbiAgICAgIGlmIChyZWNpcGUuX2lzSW1hZ2VSZWNpcGUoKSkge1xuICAgICAgICBpZiAocmVzb3VyY2VUeXBlID09PSBMaWZlY3ljbGVQb2xpY3lSZXNvdXJjZVR5cGUuQ09OVEFJTkVSX0lNQUdFKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBgcmVjaXBlcyBpbiB0aGUgcmVzb3VyY2Ugc2VsZWN0aW9uIG11c3QgYWxsIGJlIGNvbnRhaW5lciByZWNpcGVzIGZvciBwb2xpY3kgdHlwZSAke0xpZmVjeWNsZVBvbGljeVJlc291cmNlVHlwZS5DT05UQUlORVJfSU1BR0V9YCxcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogcmVjaXBlLmltYWdlUmVjaXBlTmFtZSxcbiAgICAgICAgICBzZW1hbnRpY1ZlcnNpb246IHJlY2lwZS5pbWFnZVJlY2lwZVZlcnNpb24sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNpcGUuX2lzQ29udGFpbmVyUmVjaXBlKCkpIHtcbiAgICAgICAgaWYgKHJlc291cmNlVHlwZSA9PT0gTGlmZWN5Y2xlUG9saWN5UmVzb3VyY2VUeXBlLkFNSV9JTUFHRSkge1xuICAgICAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICAgYHJlY2lwZXMgaW4gdGhlIHJlc291cmNlIHNlbGVjdGlvbiBtdXN0IGFsbCBiZSBpbWFnZSByZWNpcGVzIGZvciBwb2xpY3kgdHlwZSAke0xpZmVjeWNsZVBvbGljeVJlc291cmNlVHlwZS5BTUlfSU1BR0V9YCxcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogcmVjaXBlLmNvbnRhaW5lclJlY2lwZU5hbWUsXG4gICAgICAgICAgc2VtYW50aWNWZXJzaW9uOiByZWNpcGUuY29udGFpbmVyUmVjaXBlVmVyc2lvbixcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdyZWNpcGVzIGluIHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gbXVzdCBlaXRoZXIgYmUgYW4gSUltYWdlUmVjaXBlIG9yIElDb250YWluZXJSZWNpcGUnLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgdGhlIGV4Y2x1c2lvbiBydWxlcyBwcm9wZXJ0eSBpbnRvIHRoZSBgRXhjbHVzaW9uUnVsZXNgIHR5cGUgaW4gdGhlIENsb3VkRm9ybWF0aW9uIEwxIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBleGNsdXNpb25SdWxlcyBUaGUgZXhjbHVzaW9uIHJ1bGVzIGZvciByZXNvdXJjZXMgYXBwbGllZCBpbiB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRXhjbHVzaW9uUnVsZXMoXG4gICAgZXhjbHVzaW9uUnVsZXM6IExpZmVjeWNsZVBvbGljeUV4Y2x1c2lvblJ1bGVzLFxuICApOiBDZm5MaWZlY3ljbGVQb2xpY3kuRXhjbHVzaW9uUnVsZXNQcm9wZXJ0eSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYW1pRXhjbHVzaW9uUnVsZXM6IENmbkxpZmVjeWNsZVBvbGljeS5BbWlFeGNsdXNpb25SdWxlc1Byb3BlcnR5ID0ge1xuICAgICAgLi4uKGV4Y2x1c2lvblJ1bGVzLmFtaUV4Y2x1c2lvblJ1bGVzPy5pc1B1YmxpYyAmJiB7IGlzUHVibGljOiBleGNsdXNpb25SdWxlcy5hbWlFeGNsdXNpb25SdWxlcy5pc1B1YmxpYyB9KSxcbiAgICAgIC4uLihleGNsdXNpb25SdWxlcy5hbWlFeGNsdXNpb25SdWxlcz8ubGFzdExhdW5jaGVkICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBsYXN0TGF1bmNoZWQ6IHRoaXMuY29udmVydER1cmF0aW9uVG9UaW1lVW5pdFZhbHVlKGV4Y2x1c2lvblJ1bGVzLmFtaUV4Y2x1c2lvblJ1bGVzLmxhc3RMYXVuY2hlZCwgMzY1KSxcbiAgICAgIH0pLFxuICAgICAgLi4uKGV4Y2x1c2lvblJ1bGVzLmFtaUV4Y2x1c2lvblJ1bGVzPy5yZWdpb25zPy5sZW5ndGggJiYgeyByZWdpb25zOiBleGNsdXNpb25SdWxlcy5hbWlFeGNsdXNpb25SdWxlcy5yZWdpb25zIH0pLFxuICAgICAgLi4uKGV4Y2x1c2lvblJ1bGVzLmFtaUV4Y2x1c2lvblJ1bGVzPy5zaGFyZWRBY2NvdW50cz8ubGVuZ3RoICYmIHtcbiAgICAgICAgc2hhcmVkQWNjb3VudHM6IGV4Y2x1c2lvblJ1bGVzLmFtaUV4Y2x1c2lvblJ1bGVzLnNoYXJlZEFjY291bnRzLFxuICAgICAgfSksXG4gICAgICAuLi4oZXhjbHVzaW9uUnVsZXMuYW1pRXhjbHVzaW9uUnVsZXM/LnRhZ3MgJiYgeyB0YWdNYXA6IGV4Y2x1c2lvblJ1bGVzLmFtaUV4Y2x1c2lvblJ1bGVzLnRhZ3MgfSksXG4gICAgfTtcblxuICAgIGNvbnN0IGNmbkV4Y2x1c2lvblJ1bGVzOiBDZm5MaWZlY3ljbGVQb2xpY3kuRXhjbHVzaW9uUnVsZXNQcm9wZXJ0eSA9IHtcbiAgICAgIC4uLihPYmplY3Qua2V5cyhhbWlFeGNsdXNpb25SdWxlcykubGVuZ3RoICYmIHsgYW1pczogYW1pRXhjbHVzaW9uUnVsZXMgfSksXG4gICAgICAuLi4oZXhjbHVzaW9uUnVsZXMuaW1hZ2VFeGNsdXNpb25SdWxlcyAhPT0gdW5kZWZpbmVkICYmIHsgdGFnTWFwOiBleGNsdXNpb25SdWxlcy5pbWFnZUV4Y2x1c2lvblJ1bGVzLnRhZ3MgfSksXG4gICAgfTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhleGNsdXNpb25SdWxlcykubGVuZ3RoID8gY2ZuRXhjbHVzaW9uUnVsZXMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHRoZSBhY3Rpb24gcHJvcGVydHkgaW50byB0aGUgYEFjdGlvbmAgdHlwZSBpbiB0aGUgQ2xvdWRGb3JtYXRpb24gTDEgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlVHlwZSBUaGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgbGlmZWN5Y2xlIHBvbGljeVxuICAgKiBAcGFyYW0gYWN0aW9uIFRoZSBhY3Rpb24gYmVpbmcgdGFrZW4gaW4gdGhlIGxpZmVjeWNsZSBwb2xpY3kgcnVsZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFjdGlvbihcbiAgICByZXNvdXJjZVR5cGU6IExpZmVjeWNsZVBvbGljeVJlc291cmNlVHlwZSxcbiAgICBhY3Rpb246IExpZmVjeWNsZVBvbGljeUFjdGlvbixcbiAgKTogQ2ZuTGlmZWN5Y2xlUG9saWN5LkFjdGlvblByb3BlcnR5IHtcbiAgICBjb25zdCBpc0NvbnRhaW5lclBvbGljeSA9XG4gICAgICAhY2RrLlRva2VuLmlzVW5yZXNvbHZlZChyZXNvdXJjZVR5cGUpICYmIHJlc291cmNlVHlwZSA9PT0gTGlmZWN5Y2xlUG9saWN5UmVzb3VyY2VUeXBlLkNPTlRBSU5FUl9JTUFHRTtcbiAgICBjb25zdCBpc0FtaVBvbGljeSA9ICFjZGsuVG9rZW4uaXNVbnJlc29sdmVkKHJlc291cmNlVHlwZSkgJiYgcmVzb3VyY2VUeXBlID09PSBMaWZlY3ljbGVQb2xpY3lSZXNvdXJjZVR5cGUuQU1JX0lNQUdFO1xuXG4gICAgY29uc3QgYW1pcyA9IGFjdGlvbi5pbmNsdWRlQW1pcyA/PyAoaXNBbWlQb2xpY3kgPyB0cnVlIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBzbmFwc2hvdHMgPSBhY3Rpb24uaW5jbHVkZVNuYXBzaG90cyA/PyAoaXNBbWlQb2xpY3kgPyB0cnVlIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjb250YWluZXJzID0gYWN0aW9uLmluY2x1ZGVDb250YWluZXJzID8/IChpc0NvbnRhaW5lclBvbGljeSA/IHRydWUgOiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGluY2x1ZGVSZXNvdXJjZXM6IENmbkxpZmVjeWNsZVBvbGljeS5JbmNsdWRlUmVzb3VyY2VzUHJvcGVydHkgPSB7XG4gICAgICAuLi4oYW1pcyAhPT0gdW5kZWZpbmVkICYmIHsgYW1pcyB9KSxcbiAgICAgIC4uLihzbmFwc2hvdHMgIT09IHVuZGVmaW5lZCAmJiB7IHNuYXBzaG90cyB9KSxcbiAgICAgIC4uLihjb250YWluZXJzICE9PSB1bmRlZmluZWQgJiYgeyBjb250YWluZXJzIH0pLFxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogYWN0aW9uLnR5cGUsXG4gICAgICAuLi4oT2JqZWN0LmtleXMoaW5jbHVkZVJlc291cmNlcykubGVuZ3RoICYmIHsgaW5jbHVkZVJlc291cmNlcyB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgdG9wLWxldmVsIHByb3BlcnRpZXMgb2YgdGhlIHBvbGljeVxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BzIHBhc3NlZCBhcyBpbnB1dCB0byB0aGUgY29uc3RydWN0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUG9saWN5KHByb3BzOiBMaWZlY3ljbGVQb2xpY3lQcm9wcyk6IHZvaWQge1xuICAgIGlmIChwcm9wcy5yZXNvdXJjZVNlbGVjdGlvbi5yZWNpcGVzPy5sZW5ndGggJiYgT2JqZWN0LmtleXMocHJvcHMucmVzb3VyY2VTZWxlY3Rpb24udGFncyB8fCB7fSkubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigncmVzb3VyY2Ugc2VsZWN0aW9uIGNhbm5vdCBjb250YWluIGJvdGggcmVjaXBlcyBhbmQgdGFncycsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICghcHJvcHMucmVzb3VyY2VTZWxlY3Rpb24ucmVjaXBlcz8ubGVuZ3RoICYmICFPYmplY3Qua2V5cyhwcm9wcy5yZXNvdXJjZVNlbGVjdGlvbi50YWdzIHx8IHt9KS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdyZXNvdXJjZSBzZWxlY3Rpb24gbXVzdCBjb250YWluIGVpdGhlciByZWNpcGVzIG9yIHRhZ3MnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZGV0YWlscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdhIGxpZmVjeWNsZSBwb2xpY3kgbXVzdCBoYXZlIGF0IGxlYXN0IDEgcnVsZScsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5kZXRhaWxzLmxlbmd0aCA+IDMpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdhIGxpZmVjeWNsZSBwb2xpY3kgY2FuIG9ubHkgaGF2ZSB1cCB0byAzIHJ1bGVzJywgdGhpcyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9ucyA9IHByb3BzLmRldGFpbHMubWFwKChkZXRhaWwpID0+IGRldGFpbC5hY3Rpb24udHlwZSk7XG4gICAgaWYgKG5ldyBTZXQoYWN0aW9ucykuc2l6ZSAhPSBhY3Rpb25zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ2xpZmVjeWNsZSBwb2xpY3kgcnVsZXMgbWF5IG5vdCBoYXZlIGR1cGxpY2F0ZSBhY3Rpb25zJywgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHBvbGljeSBkZXRhaWwgZmlsdGVyIHdpdGhpbiBhIGxpZmVjeWNsZSBwb2xpY3kgcnVsZVxuICAgKlxuICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIFRoZSByZXNvdXJjZSB0eXBlIG9mIHRoZSBsaWZlY3ljbGUgcG9saWN5XG4gICAqIEBwYXJhbSBhY3Rpb24gVGhlIGFjdGlvbiBiZWluZyB0YWtlbiBpbiB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gICAqIEBwYXJhbSBhbWlFeGNsdXNpb25SdWxlcyBUaGUgQU1JIGV4Y2x1c2lvbiBydWxlcyBpbiB0aGUgbGlmZWN5Y2xlIHBvbGljeSBydWxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUG9saWN5RGV0YWlsQWN0aW9uKFxuICAgIHJlc291cmNlVHlwZTogTGlmZWN5Y2xlUG9saWN5UmVzb3VyY2VUeXBlLFxuICAgIGFjdGlvbjogTGlmZWN5Y2xlUG9saWN5QWN0aW9uLFxuICAgIGFtaUV4Y2x1c2lvblJ1bGVzOiBDZm5MaWZlY3ljbGVQb2xpY3kuQW1pRXhjbHVzaW9uUnVsZXNQcm9wZXJ0eSB8IGNkay5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgaWYgKCFjZGsuVG9rZW4uaXNVbnJlc29sdmVkKHJlc291cmNlVHlwZSkgJiYgcmVzb3VyY2VUeXBlID09PSBMaWZlY3ljbGVQb2xpY3lSZXNvdXJjZVR5cGUuQ09OVEFJTkVSX0lNQUdFKSB7XG4gICAgICBpZiAoIWNkay5Ub2tlbi5pc1VucmVzb2x2ZWQoYWN0aW9uLnR5cGUpICYmIGFjdGlvbi50eXBlICE9PSBMaWZlY3ljbGVQb2xpY3lBY3Rpb25UeXBlLkRFTEVURSkge1xuICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigneW91IG1heSBvbmx5IHNwZWNpZnkgREVMRVRFIHJ1bGVzIGZvciBjb250YWluZXIgcG9saWNpZXMnLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGlvbi5pbmNsdWRlQW1pcykge1xuICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigneW91IGNhbm5vdCBpbmNsdWRlIEFNSXMgaW4gYSBjb250YWluZXIgcG9saWN5JywgdGhpcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3Rpb24uaW5jbHVkZVNuYXBzaG90cykge1xuICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigneW91IGNhbm5vdCBpbmNsdWRlIHNuYXBzaG90cyBpbiBhIGNvbnRhaW5lciBwb2xpY3knLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFtaUV4Y2x1c2lvblJ1bGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ3lvdSBjYW5ub3QgZXhjbHVkZSBBTUlzIGluIGEgY29udGFpbmVyIHBvbGljeScsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFjZGsuVG9rZW4uaXNVbnJlc29sdmVkKHJlc291cmNlVHlwZSkgJiZcbiAgICAgIHJlc291cmNlVHlwZSA9PT0gTGlmZWN5Y2xlUG9saWN5UmVzb3VyY2VUeXBlLkFNSV9JTUFHRSAmJlxuICAgICAgYWN0aW9uLmluY2x1ZGVDb250YWluZXJzXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigneW91IGNhbm5vdCBpbmNsdWRlIGNvbnRhaW5lcnMgaW4gYW4gQU1JIHBvbGljeScsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBwb2xpY3kgZGV0YWlsIGZpbHRlclxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBsaWZlY3ljbGUgcG9saWN5IHJlc291cmNlIGZpbHRlciBhcHBsaWVkIGluIHRoZSBydWxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUG9saWN5RGV0YWlsRmlsdGVyKGZpbHRlcjogTGlmZWN5Y2xlUG9saWN5RmlsdGVyKSB7XG4gICAgaWYgKGZpbHRlci5hZ2VGaWx0ZXIgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIuY291bnRGaWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ2VpdGhlciBhZ2UgY291bnQgY2FuIGJlIHNwZWNpZmllZCBpbiBhIHBvbGljeSBmaWx0ZXIsIGJ1dCBub3QgYm90aCcsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChmaWx0ZXIuYWdlRmlsdGVyID09PSB1bmRlZmluZWQgJiYgZmlsdGVyLmNvdW50RmlsdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCd5b3UgbXVzdCBwcm92aWRlIGFuIGFnZSBvciBjb3VudCBmaWx0ZXIgaW4gdGhlIHBvbGljeScsIHRoaXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHJldGFpbkF0TGVhc3QgPSBmaWx0ZXIuYWdlRmlsdGVyPy5yZXRhaW5BdExlYXN0O1xuICAgIGlmIChyZXRhaW5BdExlYXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChyZXRhaW5BdExlYXN0IDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigndGhlIHJldGFpbkF0TGVhc3QgZmlsdGVyIHZhbHVlIG11c3QgYmUgYXQgbGVhc3QgMScsIHRoaXMpO1xuICAgICAgfVxuICAgICAgaWYgKHJldGFpbkF0TGVhc3QgPiAxMCkge1xuICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigndGhlIHJldGFpbkF0TGVhc3QgZmlsdGVyIHZhbHVlIG11c3QgYmUgYXQgbW9zdCAxMCcsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGBjZGsuRHVyYXRpb25gIGludG8gdGhlIHZhbHVlIGFuZCB1bml0IHdoaWNoIGlzIGFjY2VwdGVkIGFzIGZpbHRlciBhZ2UgYW5kIGxhc3QgbGF1bmNoZWQgYWdlIGluIHRoZVxuICAgKiBsaWZlY3ljbGUgcG9saWN5LiBUaGUgdmFsdWUgaXMgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCB3aG9sZSBudW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gdG8gY29udmVydFxuICAgKiBAcGFyYW0gdmFsdWVMaW1pdCBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSBzcGVjaWZpZWRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY29udmVydER1cmF0aW9uVG9UaW1lVW5pdFZhbHVlKFxuICAgIGR1cmF0aW9uOiBjZGsuRHVyYXRpb24sXG4gICAgdmFsdWVMaW1pdDogbnVtYmVyID0gMTAwMCxcbiAgKTogeyB2YWx1ZTogbnVtYmVyOyB1bml0OiAnREFZUycgfCAnV0VFS1MnIHwgJ01PTlRIUycgfCAnWUVBUlMnIH0ge1xuICAgIGNvbnN0IERBWVNfUEVSX1dFRUsgPSA3O1xuICAgIGNvbnN0IERBWVNfUEVSX01PTlRIID0gMzA7XG4gICAgY29uc3QgREFZU19QRVJfWUVBUiA9IDM2NTtcblxuICAgIGNvbnN0IHZhbHVlSW5EYXlzID0gTWF0aC5jZWlsKGR1cmF0aW9uLnRvRGF5cygpKTtcbiAgICBpZiAodmFsdWVJbkRheXMgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigndGhlIHByb3ZpZGVkIGR1cmF0aW9uIG11c3QgYmUgYXQgbGVhc3QgMSBkYXknLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVJbkRheXMgPD0gdmFsdWVMaW1pdCkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlSW5EYXlzLCB1bml0OiAnREFZUycgfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZUluV2Vla3MgPSBNYXRoLmNlaWwodmFsdWVJbkRheXMgLyBEQVlTX1BFUl9XRUVLKTtcbiAgICBpZiAodmFsdWVJbldlZWtzIDw9IHZhbHVlTGltaXQpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZUluV2Vla3MsIHVuaXQ6ICdXRUVLUycgfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZUluTW9udGhzID0gTWF0aC5jZWlsKHZhbHVlSW5EYXlzIC8gREFZU19QRVJfTU9OVEgpO1xuICAgIGlmICh2YWx1ZUluTW9udGhzIDw9IHZhbHVlTGltaXQpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZUluTW9udGhzLCB1bml0OiAnTU9OVEhTJyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlSW5ZZWFycyA9IE1hdGguY2VpbCh2YWx1ZUluRGF5cyAvIERBWVNfUEVSX1lFQVIpO1xuICAgIGlmICh2YWx1ZUluWWVhcnMgPD0gdmFsdWVMaW1pdCkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlSW5ZZWFycywgdW5pdDogJ1lFQVJTJyB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGB0aGUgcHJvdmlkZWQgZHVyYXRpb24gbXVzdCBiZSBsZXNzIHRoYW4gJHt2YWx1ZUxpbWl0fSB5ZWFyc2AsIHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUxpZmVjeWNsZVBvbGljeU5hbWUoKSB7XG4gICAgaWYgKGNkay5Ub2tlbi5pc1VucmVzb2x2ZWQodGhpcy5waHlzaWNhbE5hbWUpKSB7XG4gICAgICByZXR1cm47IC8vIENhbm5vdCB2YWxpZGF0ZSB1bnJlc29sdmVkIHRva2VucywgZ2l2ZW4gdGhlaXIgYWN0dWFsIHZhbHVlIGlzIHJlbmRlcmVkIGF0IGRlcGxveW1lbnQgdGltZVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZS5sZW5ndGggPiAxMjgpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdUaGUgbGlmZWN5Y2xlUG9saWN5TmFtZSBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gMTI4IGNoYXJhY3RlcnMnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUuaW5jbHVkZXMoJyAnKSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ1RoZSBsaWZlY3ljbGVQb2xpY3lOYW1lIGNhbm5vdCBjb250YWluIHNwYWNlcycsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZS5pbmNsdWRlcygnXycpKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcignVGhlIGxpZmVjeWNsZVBvbGljeU5hbWUgY2Fubm90IGNvbnRhaW4gdW5kZXJzY29yZXMnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUgIT09IHRoaXMucGh5c2ljYWxOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdUaGUgbGlmZWN5Y2xlUG9saWN5TmFtZSBtdXN0IGJlIGxvd2VyY2FzZScsIHRoaXMpO1xuICAgIH1cbiAgfVxufVxuIl19
package/lib/os-version.js CHANGED
@@ -25,7 +25,7 @@ var Platform;
25
25
  * Represents an OS version for an EC2 Image Builder image
26
26
  */
27
27
  class OSVersion {
28
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.OSVersion", version: "2.229.1-alpha.0" };
28
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.OSVersion", version: "2.231.0-alpha.0" };
29
29
  /**
30
30
  * OS version for all Linux images
31
31
  */
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Represents the latest version of a resource. When using the resource, the latest version of it will be resolved
3
+ * when executing an image build.
4
+ *
5
+ * @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/ibhow-semantic-versioning.html
6
+ */
7
+ export declare const LATEST_VERSION = "x.x.x";
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LATEST_VERSION = void 0;
4
+ /**
5
+ * Represents the latest version of a resource. When using the resource, the latest version of it will be resolved
6
+ * when executing an image build.
7
+ *
8
+ * @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/ibhow-semantic-versioning.html
9
+ */
10
+ exports.LATEST_VERSION = 'x.x.x';
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7OztHQUtHO0FBQ1UsUUFBQSxjQUFjLEdBQUcsT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBhIHJlc291cmNlLiBXaGVuIHVzaW5nIHRoZSByZXNvdXJjZSwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGl0IHdpbGwgYmUgcmVzb2x2ZWRcbiAqIHdoZW4gZXhlY3V0aW5nIGFuIGltYWdlIGJ1aWxkLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2ltYWdlYnVpbGRlci9sYXRlc3QvdXNlcmd1aWRlL2liaG93LXNlbWFudGljLXZlcnNpb25pbmcuaHRtbFxuICovXG5leHBvcnQgY29uc3QgTEFURVNUX1ZFUlNJT04gPSAneC54LngnO1xuIl19
@@ -0,0 +1,26 @@
1
+ import { CfnImage, CfnImagePipeline } from 'aws-cdk-lib/aws-imagebuilder';
2
+ import { Construct } from 'constructs';
3
+ import { ImageProps } from '../image';
4
+ import { ImagePipelineProps } from '../image-pipeline';
5
+ /**
6
+ * Generates the image tests configuration property into the `ImageTestsConfiguration` type in the CloudFormation L1
7
+ * definition.
8
+ *
9
+ * @param props Props input for the construct
10
+ */
11
+ export declare const buildImageTestsConfiguration: <PropsT extends ImagePipelineProps | ImageProps, OutputT extends CfnImagePipeline.ImageTestsConfigurationProperty | CfnImage.ImageTestsConfigurationProperty>(props: PropsT) => OutputT | undefined;
12
+ /**
13
+ * Generates the image scanning configuration property into the `ImageScanningConfiguration` type in the CloudFormation
14
+ * L1 definition.
15
+ *
16
+ * @param scope The construct scope
17
+ * @param props Props input for the construct
18
+ */
19
+ export declare const buildImageScanningConfiguration: <PropsT extends ImagePipelineProps | ImageProps, OutputT extends CfnImagePipeline.ImageScanningConfigurationProperty | CfnImage.ImageScanningConfigurationProperty>(scope: Construct, props: PropsT) => OutputT | undefined;
20
+ /**
21
+ * Generates the workflows property into the `WorkflowConfiguration` type in the CloudFormation L1
22
+ * definition.
23
+ *
24
+ * @param props Props input for the construct
25
+ */
26
+ export declare const buildWorkflows: <PropsT extends ImagePipelineProps | ImageProps, OutputT extends CfnImagePipeline.WorkflowConfigurationProperty[] | CfnImage.WorkflowConfigurationProperty[]>(props: PropsT) => OutputT | undefined;