@aws-cdk/aws-bedrock-agentcore-alpha 2.221.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.
Files changed (43) hide show
  1. package/.eslintrc.js +4 -0
  2. package/.jsii +12000 -0
  3. package/.jsii.tabl.json.gz +0 -0
  4. package/.warnings.jsii.js +183 -0
  5. package/LICENSE +201 -0
  6. package/NOTICE +2 -0
  7. package/README.md +796 -0
  8. package/agentcore/index.d.ts +11 -0
  9. package/agentcore/index.js +36 -0
  10. package/agentcore/network/network-configuration.d.ts +152 -0
  11. package/agentcore/network/network-configuration.js +234 -0
  12. package/agentcore/runtime/perms.d.ts +67 -0
  13. package/agentcore/runtime/perms.js +101 -0
  14. package/agentcore/runtime/runtime-artifact.d.ts +42 -0
  15. package/agentcore/runtime/runtime-artifact.js +90 -0
  16. package/agentcore/runtime/runtime-authorizer-configuration.d.ts +62 -0
  17. package/agentcore/runtime/runtime-authorizer-configuration.js +165 -0
  18. package/agentcore/runtime/runtime-base.d.ts +309 -0
  19. package/agentcore/runtime/runtime-base.js +207 -0
  20. package/agentcore/runtime/runtime-endpoint-base.d.ts +130 -0
  21. package/agentcore/runtime/runtime-endpoint-base.js +31 -0
  22. package/agentcore/runtime/runtime-endpoint.d.ts +182 -0
  23. package/agentcore/runtime/runtime-endpoint.js +372 -0
  24. package/agentcore/runtime/runtime.d.ts +230 -0
  25. package/agentcore/runtime/runtime.js +590 -0
  26. package/agentcore/runtime/types.d.ts +16 -0
  27. package/agentcore/runtime/types.js +21 -0
  28. package/agentcore/runtime/validation-helpers.d.ts +37 -0
  29. package/agentcore/runtime/validation-helpers.js +85 -0
  30. package/agentcore/tools/browser.d.ts +519 -0
  31. package/agentcore/tools/browser.js +641 -0
  32. package/agentcore/tools/code-interpreter.d.ts +447 -0
  33. package/agentcore/tools/code-interpreter.js +553 -0
  34. package/agentcore/tools/perms.d.ts +74 -0
  35. package/agentcore/tools/perms.js +122 -0
  36. package/agentcore/tools/validation-helpers.d.ts +37 -0
  37. package/agentcore/tools/validation-helpers.js +85 -0
  38. package/jest.config.js +2 -0
  39. package/lib/index.d.ts +1 -0
  40. package/lib/index.js +22 -0
  41. package/package.json +122 -0
  42. package/rosetta/_generated.ts-fixture +6 -0
  43. package/rosetta/default.ts-fixture +19 -0
@@ -0,0 +1,553 @@
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.CodeInterpreterCustom = exports.CodeInterpreterCustomBase = void 0;
38
+ const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
39
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
40
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
41
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
42
+ const iam = require("aws-cdk-lib/aws-iam");
43
+ const ec2 = require("aws-cdk-lib/aws-ec2");
44
+ const agent_core = require("aws-cdk-lib/aws-bedrockagentcore");
45
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
46
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
47
+ // Internal Libs
48
+ const perms = require("./perms");
49
+ const validation_helpers_1 = require("./validation-helpers");
50
+ const network_configuration_1 = require("../network/network-configuration");
51
+ /******************************************************************************
52
+ * CONSTANTS
53
+ *****************************************************************************/
54
+ /**
55
+ * Minimum length for code interpreter name
56
+ * @internal
57
+ */
58
+ const CODE_INTERPRETER_NAME_MIN_LENGTH = 1;
59
+ /**
60
+ * Maximum length for code interpreter name
61
+ * @internal
62
+ */
63
+ const CODE_INTERPRETER_NAME_MAX_LENGTH = 48;
64
+ /**
65
+ * Minimum length for code interpreter tag
66
+ * @internal
67
+ */
68
+ const CODE_INTERPRETER_TAG_MIN_LENGTH = 1;
69
+ /**
70
+ * Maximum length for code interpreter tag
71
+ * @internal
72
+ */
73
+ const CODE_INTERPRETER_TAG_MAX_LENGTH = 256;
74
+ /******************************************************************************
75
+ * ABSTRACT BASE CLASS
76
+ *****************************************************************************/
77
+ /**
78
+ * Abstract base class for a Code Interpreter.
79
+ * Contains methods and attributes valid for Code Interpreters either created with CDK or imported.
80
+ */
81
+ class CodeInterpreterCustomBase extends aws_cdk_lib_1.Resource {
82
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.CodeInterpreterCustomBase", version: "2.221.0-alpha.0" };
83
+ /**
84
+ * An accessor for the Connections object that will fail if this Browser does not have a VPC
85
+ * configured.
86
+ */
87
+ get connections() {
88
+ if (!this._connections) {
89
+ throw new Error('Cannot manage network access without configuring a VPC');
90
+ }
91
+ return this._connections;
92
+ }
93
+ /**
94
+ * The actual Connections object for this Browser. This may be unset in the event that a VPC has not
95
+ * been configured.
96
+ * @internal
97
+ */
98
+ _connections;
99
+ constructor(scope, id) {
100
+ super(scope, id);
101
+ }
102
+ /**
103
+ * Grants IAM actions to the IAM Principal
104
+ * @param grantee - The IAM principal to grant permissions to
105
+ * @param actions - The actions to grant
106
+ * @returns An IAM Grant object representing the granted permissions
107
+ */
108
+ grant(grantee, ...actions) {
109
+ return iam.Grant.addToPrincipal({
110
+ grantee: grantee,
111
+ resourceArns: [this.codeInterpreterArn],
112
+ actions: actions,
113
+ });
114
+ }
115
+ /**
116
+ * Grant read permissions on this code interpreter to an IAM principal.
117
+ * This includes both read permissions on the specific code interpreter and list permissions on all code interpreters.
118
+ *
119
+ * @param grantee - The IAM principal to grant read permissions to
120
+ * @default - Default grant configuration:
121
+ * - actions: ['bedrock-agentcore:GetCodeInterpreter', 'bedrock-agentcore:GetCodeInterpreterSession'] on this.codeInterpreterArn
122
+ * - actions: ['bedrock-agentcore:ListCodeInterpreters', 'bedrock-agentcore:ListCodeInterpreterSessions'] on all resources (*)
123
+ * @returns An IAM Grant object representing the granted permissions
124
+ */
125
+ grantRead(grantee) {
126
+ const resourceSpecificGrant = this.grant(grantee, ...perms.CODE_INTERPRETER_READ_PERMS);
127
+ const allResourceGrant = iam.Grant.addToPrincipal({
128
+ grantee: grantee,
129
+ resourceArns: ['*'],
130
+ actions: perms.CODE_INTERPRETER_LIST_PERMS,
131
+ });
132
+ // Return combined grant
133
+ return resourceSpecificGrant.combine(allResourceGrant);
134
+ }
135
+ /**
136
+ * Grant invoke permissions on this code interpreter to an IAM principal.
137
+ *
138
+ * @param grantee - The IAM principal to grant invoke permissions to
139
+ * @default - Default grant configuration:
140
+ * - actions: ['bedrock-agentcore:StartCodeInterpreterSession', 'bedrock-agentcore:InvokeCodeInterpreter', 'bedrock-agentcore:StopCodeInterpreterSession']
141
+ * - resourceArns: [this.codeInterpreterArn]
142
+ * @returns An IAM Grant object representing the granted permissions
143
+ */
144
+ grantUse(grantee) {
145
+ return this.grant(grantee, ...perms.CODE_INTERPRETER_USE_PERMS);
146
+ }
147
+ /**
148
+ * Grant invoke permissions on this code interpreter to an IAM principal.
149
+ *
150
+ * @param grantee - The IAM principal to grant invoke permissions to
151
+ * @returns An IAM Grant object representing the granted permissions
152
+ * @default - Default grant configuration:
153
+ * - actions: ['bedrock-agentcore:InvokeCodeInterpreter']
154
+ * - resourceArns: [this.codeInterpreterArn]
155
+ */
156
+ grantInvoke(grantee) {
157
+ return this.grant(grantee, ...perms.CODE_INTERPRETER_INVOKE_PERMS);
158
+ }
159
+ // ------------------------------------------------------
160
+ // Metrics
161
+ // ------------------------------------------------------
162
+ /**
163
+ * Return the given named metric for this code interpreter.
164
+ *
165
+ * By default, the metric will be calculated as a sum over a period of 5 minutes.
166
+ * You can customize this by using the `statistic` and `period` properties.
167
+ */
168
+ metric(metricName, dimensions, props) {
169
+ const metricProps = {
170
+ namespace: 'AWS/Bedrock-AgentCore',
171
+ metricName,
172
+ dimensionsMap: { ...dimensions, Resource: this.codeInterpreterArn },
173
+ ...props,
174
+ };
175
+ return this.configureMetric(metricProps);
176
+ }
177
+ /**
178
+ * Creates a CloudWatch metric for tracking code interpreter api operations..
179
+ *
180
+ * @param props - Configuration options for the metric
181
+ * @default - Default metric configuration:
182
+ * - namespace: 'AWS/Bedrock-AgentCore'
183
+ * - metricName: metricName
184
+ * - dimensionsMap: { CodeInterpreterId: this.codeInterpreterId }
185
+ * @returns A CloudWatch Metric configured for code interpreter api operations
186
+ */
187
+ metricForApiOperation(metricName, operation, props) {
188
+ return this.metric(metricName, { Operation: operation }, props);
189
+ }
190
+ /**
191
+ * Creates a CloudWatch metric for tracking code interpreter latencies.
192
+ *
193
+ * @param props - Configuration options for the metric
194
+ * @default - Default metric configuration:
195
+ * - namespace: 'AWS/Bedrock-AgentCore'
196
+ * - metricName: Latency
197
+ * @returns A CloudWatch Metric configured for code interpreter latencies
198
+ */
199
+ metricLatencyForApiOperation(operation, props) {
200
+ return this.metricForApiOperation('Latency', operation, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
201
+ }
202
+ /**
203
+ * Creates a CloudWatch metric for tracking code interpreter invocations.
204
+ *
205
+ * @param props - Configuration options for the metric
206
+ * @default - Default metric configuration:
207
+ * - namespace: 'AWS/Bedrock-AgentCore'
208
+ * - metricName: Invocations
209
+ * @returns A CloudWatch Metric configured for code interpreter invocations
210
+ */
211
+ metricInvocationsForApiOperation(operation, props) {
212
+ return this.metricForApiOperation('Invocations', operation, {
213
+ statistic: aws_cloudwatch_1.Stats.SUM,
214
+ ...props,
215
+ });
216
+ }
217
+ /**
218
+ * Creates a CloudWatch metric for tracking code interpreter errors.
219
+ *
220
+ * @param props - Configuration options for the metric
221
+ * @default - Default metric configuration:
222
+ * - namespace: 'AWS/Bedrock-AgentCore'
223
+ * - metricName: Errors
224
+ * @returns A CloudWatch Metric configured for code interpreter errors
225
+ */
226
+ metricErrorsForApiOperation(operation, props) {
227
+ return this.metricForApiOperation('Errors', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
228
+ }
229
+ /**
230
+ * Creates a CloudWatch metric for tracking code interpreter throttles.
231
+ *
232
+ * @param props - Configuration options for the metric
233
+ * @default - Default metric configuration:
234
+ * - namespace: 'AWS/Bedrock-AgentCore'
235
+ * - metricName: Throttles
236
+ * @returns A CloudWatch Metric configured for code interpreter throttles
237
+ */
238
+ metricThrottlesForApiOperation(operation, props) {
239
+ return this.metricForApiOperation('Throttles', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
240
+ }
241
+ /**
242
+ * Creates a CloudWatch metric for tracking code interpreter system errors.
243
+ *
244
+ * @param props - Configuration options for the metric
245
+ * @default - Default metric configuration:
246
+ * - namespace: 'AWS/Bedrock-AgentCore'
247
+ * - metricName: SystemErrors
248
+ * @returns A CloudWatch Metric configured for code interpreter system errors
249
+ */
250
+ metricSystemErrorsForApiOperation(operation, props) {
251
+ return this.metricForApiOperation('SystemErrors', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
252
+ }
253
+ /**
254
+ * Creates a CloudWatch metric for tracking code interpreter user errors.
255
+ *
256
+ * @param props - Configuration options for the metric
257
+ * @default - Default metric configuration:
258
+ * - namespace: 'AWS/Bedrock-AgentCore'
259
+ * - metricName: UserErrors
260
+ * @returns A CloudWatch Metric configured for code interpreter user errors
261
+ */
262
+ metricUserErrorsForApiOperation(operation, props) {
263
+ return this.metricForApiOperation('UserErrors', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
264
+ }
265
+ /**
266
+ * Creates a CloudWatch metric for tracking code interpreter session duration.
267
+ *
268
+ * @param props - Configuration options for the metric
269
+ * @default - Default metric configuration:
270
+ * - namespace: 'AWS/Bedrock-AgentCore'
271
+ * - metricName: Duration
272
+ * @returns A CloudWatch Metric configured for code interpreter session duration
273
+ */
274
+ metricSessionDuration(props) {
275
+ return this.metric('Duration', { Operation: 'CodeInterpreterSession' }, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
276
+ }
277
+ /**
278
+ * Internal method to create a metric.
279
+ *
280
+ * @param props - Configuration options for the metric
281
+ * @returns A CloudWatch Metric configured for code interpreter api operations
282
+ */
283
+ configureMetric(props) {
284
+ return new aws_cloudwatch_1.Metric({
285
+ ...props,
286
+ region: props?.region ?? this.stack.region,
287
+ account: props?.account ?? this.stack.account,
288
+ });
289
+ }
290
+ }
291
+ exports.CodeInterpreterCustomBase = CodeInterpreterCustomBase;
292
+ /******************************************************************************
293
+ * Class
294
+ *****************************************************************************/
295
+ /**
296
+ * Custom code interpreter resource for AWS Bedrock Agent Core.
297
+ * Provides a sandboxed environment for code execution with configurable network access.
298
+ *
299
+ * @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/code-interpreter.html
300
+ * @resource AWS::BedrockAgentCore::CodeInterpreterCustom
301
+ */
302
+ let CodeInterpreterCustom = (() => {
303
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
304
+ let _classDescriptor;
305
+ let _classExtraInitializers = [];
306
+ let _classThis;
307
+ let _classSuper = CodeInterpreterCustomBase;
308
+ var CodeInterpreterCustom = class extends _classSuper {
309
+ static { _classThis = this; }
310
+ static {
311
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
312
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
313
+ CodeInterpreterCustom = _classThis = _classDescriptor.value;
314
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
315
+ }
316
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.CodeInterpreterCustom", version: "2.221.0-alpha.0" };
317
+ /** Uniquely identifies this class. */
318
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.CodeInterpreterCustom';
319
+ /**
320
+ * Static Method for importing an existing Bedrock AgentCore Code Interpreter Custom.
321
+ */
322
+ /**
323
+ * Creates an Code Interpreter Custom reference from an existing code interpreter's attributes.
324
+ *
325
+ * @param scope - The construct scope
326
+ * @param id - Identifier of the construct
327
+ * @param attrs - Attributes of the existing code interpreter custom
328
+ * @returns An ICodeInterpreterCustom reference to the existing code interpreter
329
+ */
330
+ static fromCodeInterpreterCustomAttributes(scope, id, attrs) {
331
+ try {
332
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_CodeInterpreterCustomAttributes(attrs);
333
+ }
334
+ catch (error) {
335
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
336
+ Error.captureStackTrace(error, this.fromCodeInterpreterCustomAttributes);
337
+ }
338
+ throw error;
339
+ }
340
+ class Import extends CodeInterpreterCustomBase {
341
+ codeInterpreterArn = attrs.codeInterpreterArn;
342
+ codeInterpreterId = aws_cdk_lib_1.Arn.split(attrs.codeInterpreterArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
343
+ executionRole = iam.Role.fromRoleArn(scope, `${id}Role`, attrs.roleArn);
344
+ lastUpdatedAt = attrs.lastUpdatedAt;
345
+ grantPrincipal = this.executionRole;
346
+ status = attrs.status;
347
+ createdAt = attrs.createdAt;
348
+ constructor(s, i) {
349
+ super(s, i);
350
+ this.grantPrincipal = this.executionRole || new iam.UnknownPrincipal({ resource: this });
351
+ if (attrs.securityGroups) {
352
+ this._connections = new ec2.Connections({
353
+ securityGroups: attrs.securityGroups,
354
+ });
355
+ }
356
+ }
357
+ }
358
+ // Return new Code Interpreter Custom
359
+ return new Import(scope, id);
360
+ }
361
+ // ------------------------------------------------------
362
+ // Attributes
363
+ // ------------------------------------------------------
364
+ /**
365
+ * The ARN of the code interpreter resource
366
+ * @attribute
367
+ */
368
+ codeInterpreterArn;
369
+ /**
370
+ * The id of the code interpreter
371
+ * @attribute
372
+ */
373
+ codeInterpreterId;
374
+ /**
375
+ * The name of the code interpreter
376
+ */
377
+ name;
378
+ /**
379
+ * The description of the code interpreter
380
+ */
381
+ description;
382
+ /**
383
+ * The network configuration of the code interpreter
384
+ */
385
+ networkConfiguration;
386
+ /**
387
+ * The status of the code interpreter
388
+ * @attribute
389
+ */
390
+ status;
391
+ /**
392
+ * The created timestamp of the code interpreter
393
+ * @attribute
394
+ */
395
+ createdAt;
396
+ /**
397
+ * The last updated timestamp of the code interpreter
398
+ * @attribute
399
+ */
400
+ lastUpdatedAt;
401
+ /**
402
+ * The failure reason of the code interpreter
403
+ * @attribute
404
+ */
405
+ failureReason;
406
+ /**
407
+ * The IAM role that provides permissions for the code interpreter to access AWS services.
408
+ */
409
+ executionRole;
410
+ /**
411
+ * The principal to grant permissions to
412
+ */
413
+ grantPrincipal;
414
+ /**
415
+ * Tags applied to this code interpreter resource
416
+ * A map of key-value pairs for resource tagging
417
+ * @default - No tags applied
418
+ */
419
+ tags;
420
+ // ------------------------------------------------------
421
+ // Internal Only
422
+ // ------------------------------------------------------
423
+ __resource;
424
+ constructor(scope, id, props) {
425
+ super(scope, id);
426
+ try {
427
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_CodeInterpreterCustomProps(props);
428
+ }
429
+ catch (error) {
430
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
431
+ Error.captureStackTrace(error, CodeInterpreterCustom);
432
+ }
433
+ throw error;
434
+ }
435
+ // Enhanced CDK Analytics Telemetry
436
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
437
+ // ------------------------------------------------------
438
+ // Set properties and defaults
439
+ // ------------------------------------------------------
440
+ this.name = props.codeInterpreterCustomName;
441
+ this.description = props.description;
442
+ this.networkConfiguration = props.networkConfiguration ?? network_configuration_1.CodeInterpreterNetworkConfiguration.usingPublicNetwork();
443
+ this.executionRole = props.executionRole ?? this._createCodeInterpreterRole();
444
+ this.grantPrincipal = this.executionRole;
445
+ this.tags = props.tags;
446
+ // Validate code interpreter name
447
+ (0, validation_helpers_1.throwIfInvalid)(this._validateCodeInterpreterName, this.name);
448
+ // Validate code interpreter tags
449
+ (0, validation_helpers_1.throwIfInvalid)(this._validateCodeInterpreterTags, this.tags);
450
+ // Network configuration and validation is done in the network configuration class
451
+ // So we don't need to validate it here
452
+ // Set connections - create a shared connections object
453
+ if (this.networkConfiguration.connections) {
454
+ // Use the network configuration's connections as the shared object
455
+ this._connections = this.networkConfiguration.connections;
456
+ }
457
+ // ------------------------------------------------------
458
+ // CFN Props - With Lazy support
459
+ // ------------------------------------------------------
460
+ const cfnProps = {
461
+ name: this.name,
462
+ description: this.description,
463
+ networkConfiguration: aws_cdk_lib_1.Lazy.any({ produce: () => this.networkConfiguration._render(this._connections) }),
464
+ executionRoleArn: this.executionRole?.roleArn,
465
+ tags: this.tags,
466
+ };
467
+ // L1 instantiation
468
+ this.__resource = new agent_core.CfnCodeInterpreterCustom(this, 'Resource', cfnProps);
469
+ // Get attributes directly from the CloudFormation resource
470
+ this.codeInterpreterId = this.__resource.attrCodeInterpreterId;
471
+ this.codeInterpreterArn = this.__resource.attrCodeInterpreterArn;
472
+ this.status = this.__resource.attrStatus;
473
+ this.createdAt = this.__resource.attrCreatedAt;
474
+ this.lastUpdatedAt = this.__resource.attrLastUpdatedAt;
475
+ this.failureReason = this.__resource.attrFailureReason;
476
+ }
477
+ // ------------------------------------------------------
478
+ // Validators
479
+ // ------------------------------------------------------
480
+ /**
481
+ * Validates the code interpreter name format
482
+ * @param name The code interpreter name to validate
483
+ * @returns Array of validation error messages, empty if valid
484
+ * @internal This is an internal core function and should not be called directly.
485
+ */
486
+ _validateCodeInterpreterName = (name) => {
487
+ let errors = [];
488
+ errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
489
+ value: name,
490
+ fieldName: 'Code interpreter name',
491
+ minLength: CODE_INTERPRETER_NAME_MIN_LENGTH,
492
+ maxLength: CODE_INTERPRETER_NAME_MAX_LENGTH,
493
+ }));
494
+ // Check if name matches the AWS API pattern: [a-zA-Z][a-zA-Z0-9_]{0,47}
495
+ // Must start with a letter, followed by up to 47 letters, numbers, or underscores
496
+ const validNamePattern = /^[a-zA-Z][a-zA-Z0-9_]{0,47}$/;
497
+ errors.push(...(0, validation_helpers_1.validateFieldPattern)(name, 'Code interpreter name', validNamePattern));
498
+ return errors;
499
+ };
500
+ /**
501
+ * Validates the code interpreter tags format
502
+ * @param tags The tags object to validate
503
+ * @returns Array of validation error messages, empty if valid
504
+ * @internal This is an internal core function and should not be called directly.
505
+ */
506
+ _validateCodeInterpreterTags = (tags) => {
507
+ let errors = [];
508
+ if (!tags) {
509
+ return errors; // Tags are optional
510
+ }
511
+ // Validate each tag key and value
512
+ for (const [key, value] of Object.entries(tags)) {
513
+ errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
514
+ value: key,
515
+ fieldName: 'Tag key',
516
+ minLength: CODE_INTERPRETER_TAG_MIN_LENGTH,
517
+ maxLength: CODE_INTERPRETER_TAG_MAX_LENGTH,
518
+ }));
519
+ // Validate tag key pattern: ^[a-zA-Z0-9\s._:/=+@-]*$
520
+ const validKeyPattern = /^[a-zA-Z0-9\s._:/=+@-]*$/;
521
+ errors.push(...(0, validation_helpers_1.validateFieldPattern)(key, 'Tag key', validKeyPattern));
522
+ // Validate tag value
523
+ errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
524
+ value: value,
525
+ fieldName: 'Tag value',
526
+ minLength: CODE_INTERPRETER_TAG_MIN_LENGTH,
527
+ maxLength: CODE_INTERPRETER_TAG_MAX_LENGTH,
528
+ }));
529
+ // Validate tag value pattern: ^[a-zA-Z0-9\s._:/=+@-]*$
530
+ const validValuePattern = /^[a-zA-Z0-9\s._:/=+@-]*$/;
531
+ errors.push(...(0, validation_helpers_1.validateFieldPattern)(value, 'Tag value', validValuePattern));
532
+ }
533
+ return errors;
534
+ };
535
+ /**
536
+ * Creates execution role needed for the code interpreter to access AWS services
537
+ * @returns The created role
538
+ * @internal This is an internal core function and should not be called directly.
539
+ */
540
+ _createCodeInterpreterRole() {
541
+ const role = new iam.Role(this, 'ServiceRole', {
542
+ assumedBy: new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com'),
543
+ });
544
+ return role;
545
+ }
546
+ static {
547
+ __runInitializers(_classThis, _classExtraInitializers);
548
+ }
549
+ };
550
+ return CodeInterpreterCustom = _classThis;
551
+ })();
552
+ exports.CodeInterpreterCustom = CodeInterpreterCustom;
553
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1pbnRlcnByZXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvZGUtaW50ZXJwcmV0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBTXFCO0FBQ3JCLCtEQU1vQztBQUNwQywyQ0FBMkM7QUFDM0MsMkNBQTJDO0FBQzNDLCtEQUErRDtBQUUvRCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBQzFFLGdCQUFnQjtBQUNoQixpQ0FBaUM7QUFDakMsNkRBQXVHO0FBQ3ZHLDRFQUF1RjtBQUV2Rjs7K0VBRStFO0FBRS9FOzs7R0FHRztBQUNILE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQyxDQUFDO0FBRTNDOzs7R0FHRztBQUNILE1BQU0sZ0NBQWdDLEdBQUcsRUFBRSxDQUFDO0FBRTVDOzs7R0FHRztBQUNILE1BQU0sK0JBQStCLEdBQUcsQ0FBQyxDQUFDO0FBRTFDOzs7R0FHRztBQUNILE1BQU0sK0JBQStCLEdBQUcsR0FBRyxDQUFDO0FBNEc1Qzs7K0VBRStFO0FBQy9FOzs7R0FHRztBQUNILE1BQXNCLHlCQUEwQixTQUFRLHNCQUFROztJQVk5RDs7O09BR0c7SUFDSCxJQUFXLFdBQVc7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztLQUMxQjtJQUNEOzs7O09BSUc7SUFDTyxZQUFZLENBQThCO0lBRXBELFlBQVksS0FBZ0IsRUFBRSxFQUFVO1FBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDbEI7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxPQUF1QixFQUFFLEdBQUcsT0FBaUI7UUFDeEQsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FB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QUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtnQkFDN0MsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLGlDQUFpQyxDQUFDO2FBQ3ZFLENBQUMsQ0FBQztZQUVILE9BQU8sSUFBSSxDQUFDO1NBQ2I7O1lBN09VLHVEQUFxQjs7Ozs7QUFBckIsc0RBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXJuLFxuICBBcm5Gb3JtYXQsXG4gIElSZXNvdXJjZSxcbiAgTGF6eSxcbiAgUmVzb3VyY2UsXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7XG4gIERpbWVuc2lvbnNNYXAsXG4gIE1ldHJpYyxcbiAgTWV0cmljT3B0aW9ucyxcbiAgTWV0cmljUHJvcHMsXG4gIFN0YXRzLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBhZ2VudF9jb3JlIGZyb20gJ2F3cy1jZGstbGliL2F3cy1iZWRyb2NrYWdlbnRjb3JlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuLy8gSW50ZXJuYWwgTGlic1xuaW1wb3J0ICogYXMgcGVybXMgZnJvbSAnLi9wZXJtcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUZpZWxkUGF0dGVybiwgdmFsaWRhdGVTdHJpbmdGaWVsZExlbmd0aCwgdGhyb3dJZkludmFsaWQgfSBmcm9tICcuL3ZhbGlkYXRpb24taGVscGVycyc7XG5pbXBvcnQgeyBDb2RlSW50ZXJwcmV0ZXJOZXR3b3JrQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL25ldHdvcmsvbmV0d29yay1jb25maWd1cmF0aW9uJztcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVEFOVFNcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBNaW5pbXVtIGxlbmd0aCBmb3IgY29kZSBpbnRlcnByZXRlciBuYW1lXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgQ09ERV9JTlRFUlBSRVRFUl9OQU1FX01JTl9MRU5HVEggPSAxO1xuXG4vKipcbiAqIE1heGltdW0gbGVuZ3RoIGZvciBjb2RlIGludGVycHJldGVyIG5hbWVcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBDT0RFX0lOVEVSUFJFVEVSX05BTUVfTUFYX0xFTkdUSCA9IDQ4O1xuXG4vKipcbiAqIE1pbmltdW0gbGVuZ3RoIGZvciBjb2RlIGludGVycHJldGVyIHRhZ1xuICogQGludGVybmFsXG4gKi9cbmNvbnN0IENPREVfSU5URVJQUkVURVJfVEFHX01JTl9MRU5HVEggPSAxO1xuXG4vKipcbiAqIE1heGltdW0gbGVuZ3RoIGZvciBjb2RlIGludGVycHJldGVyIHRhZ1xuICogQGludGVybmFsXG4gKi9cbmNvbnN0IENPREVfSU5URVJQUkVURVJfVEFHX01BWF9MRU5HVEggPSAyNTY7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogSW50ZXJmYWNlIGZvciBDb2RlSW50ZXJwcmV0ZXJDdXN0b20gcmVzb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvZGVJbnRlcnByZXRlckN1c3RvbSBleHRlbmRzIElSZXNvdXJjZSwgaWFtLklHcmFudGFibGUsIGVjMi5JQ29ubmVjdGFibGUge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgY29kZSBpbnRlcnByZXRlciByZXNvdXJjZVxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjb2RlSW50ZXJwcmV0ZXJBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBjb2RlIGludGVycHJldGVyXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNvZGVJbnRlcnByZXRlcklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIGNvZGUgaW50ZXJwcmV0ZXJcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgY29kZSBpbnRlcnByZXRlciB3YXMgY3JlYXRlZFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCB3aGVuIHRoZSBjb2RlIGludGVycHJldGVyIHdhcyBsYXN0IHVwZGF0ZWRcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIHRoYXQgcHJvdmlkZXMgcGVybWlzc2lvbnMgZm9yIHRoZSBjb2RlIGludGVycHJldGVyIHRvIGFjY2VzcyBBV1Mgc2VydmljZXMuXG4gICAqL1xuICByZWFkb25seSBleGVjdXRpb25Sb2xlOiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqICBHcmFudHMgSUFNIGFjdGlvbnMgdG8gdGhlIElBTSBQcmluY2lwYWxcbiAgICovXG4gIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIGBHZXRgIGFuZCBgTGlzdGAgYWN0aW9ucyBvbiB0aGUgQ29kZSBJbnRlcnByZXRlclxuICAgKi9cbiAgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudHMgYEludm9rZWAsIGBTdGFydGAsIGFuZCBgU3RvcGAgYWN0aW9ucyBvbiB0aGUgQ29kZSBJbnRlcnByZXRlclxuICAgKi9cbiAgZ3JhbnRVc2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIE1ldHJpY3NcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGdpdmVuIG5hbWVkIG1ldHJpYyBmb3IgdGhpcyBjb2RlIGludGVycHJldGVyLlxuICAgKi9cbiAgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgZGltZW5zaW9uczogRGltZW5zaW9uc01hcCwgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGdpdmVuIG5hbWVkIG1ldHJpYyByZWxhdGVkIHRvIHRoZSBBUEkgb3BlcmF0aW9uIHBlcmZvcm1lZCBvbiB0aGlzIGNvZGUgaW50ZXJwcmV0ZXIuXG4gICAqL1xuICBtZXRyaWNGb3JBcGlPcGVyYXRpb24obWV0cmljTmFtZTogc3RyaW5nLCBvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgbWVhc3VyaW5nIHRoZSBsYXRlbmN5IG9mIGEgc3BlY2lmaWMgQVBJIG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhpcyBjb2RlIGludGVycHJldGVyLlxuICAgKi9cbiAgbWV0cmljTGF0ZW5jeUZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgdG90YWwgbnVtYmVyIG9mIEFQSSByZXF1ZXN0cyBtYWRlIGZvciBhIHNwZWNpZmljIGNvZGUgaW50ZXJwcmV0ZXIgb3BlcmF0aW9uLlxuICAgKi9cbiAgbWV0cmljSW52b2NhdGlvbnNGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBlcnJvcnMgZm9yIGEgc3BlY2lmaWMgQVBJIG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhpcyBjb2RlIGludGVycHJldGVyLlxuICAgKi9cbiAgbWV0cmljRXJyb3JzRm9yQXBpT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgdGhyb3R0bGVkIHJlcXVlc3RzIGZvciBhIHNwZWNpZmljIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgY29kZSBpbnRlcnByZXRlci5cbiAgICovXG4gIG1ldHJpY1Rocm90dGxlc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHN5c3RlbSBlcnJvcnMgZm9yIGEgc3BlY2lmaWMgQVBJIG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhpcyBjb2RlIGludGVycHJldGVyLlxuICAgKi9cbiAgbWV0cmljU3lzdGVtRXJyb3JzRm9yQXBpT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgdXNlciBlcnJvcnMgZm9yIGEgc3BlY2lmaWMgQVBJIG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhpcyBjb2RlIGludGVycHJldGVyLlxuICAgKi9cbiAgbWV0cmljVXNlckVycm9yc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgbWVhc3VyaW5nIHRoZSBkdXJhdGlvbiBvZiBjb2RlIGludGVycHJldGVyIHNlc3Npb25zLlxuICAgKi9cbiAgbWV0cmljU2Vzc2lvbkR1cmF0aW9uKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICBBQlNUUkFDVCBCQVNFIENMQVNTXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGEgQ29kZSBJbnRlcnByZXRlci5cbiAqIENvbnRhaW5zIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXMgdmFsaWQgZm9yIENvZGUgSW50ZXJwcmV0ZXJzIGVpdGhlciBjcmVhdGVkIHdpdGggQ0RLIG9yIGltcG9ydGVkLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29kZUludGVycHJldGVyQ3VzdG9tQmFzZSBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSUNvZGVJbnRlcnByZXRlckN1c3RvbSB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjb2RlSW50ZXJwcmV0ZXJBcm46IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGNvZGVJbnRlcnByZXRlcklkOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBzdGF0dXM/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBsYXN0VXBkYXRlZEF0Pzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZXhlY3V0aW9uUm9sZTogaWFtLklSb2xlO1xuICAvKipcbiAgICogVGhlIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogQW4gYWNjZXNzb3IgZm9yIHRoZSBDb25uZWN0aW9ucyBvYmplY3QgdGhhdCB3aWxsIGZhaWwgaWYgdGhpcyBCcm93c2VyIGRvZXMgbm90IGhhdmUgYSBWUENcbiAgICogY29uZmlndXJlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbnMoKTogZWMyLkNvbm5lY3Rpb25zIHtcbiAgICBpZiAoIXRoaXMuX2Nvbm5lY3Rpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBtYW5hZ2UgbmV0d29yayBhY2Nlc3Mgd2l0aG91dCBjb25maWd1cmluZyBhIFZQQycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbnM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBhY3R1YWwgQ29ubmVjdGlvbnMgb2JqZWN0IGZvciB0aGlzIEJyb3dzZXIuIFRoaXMgbWF5IGJlIHVuc2V0IGluIHRoZSBldmVudCB0aGF0IGEgVlBDIGhhcyBub3RcbiAgICogYmVlbiBjb25maWd1cmVkLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfY29ubmVjdGlvbnM6IGVjMi5Db25uZWN0aW9ucyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgSUFNIGFjdGlvbnMgdG8gdGhlIElBTSBQcmluY2lwYWxcbiAgICogQHBhcmFtIGdyYW50ZWUgLSBUaGUgSUFNIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0b1xuICAgKiBAcGFyYW0gYWN0aW9ucyAtIFRoZSBhY3Rpb25zIHRvIGdyYW50XG4gICAqIEByZXR1cm5zIEFuIElBTSBHcmFudCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAqL1xuICBwdWJsaWMgZ3JhbnQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUsIC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWU6IGdyYW50ZWUsXG4gICAgICByZXNvdXJjZUFybnM6IFt0aGlzLmNvZGVJbnRlcnByZXRlckFybl0sXG4gICAgICBhY3Rpb25zOiBhY3Rpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgb24gdGhpcyBjb2RlIGludGVycHJldGVyIHRvIGFuIElBTSBwcmluY2lwYWwuXG4gICAqIFRoaXMgaW5jbHVkZXMgYm90aCByZWFkIHBlcm1pc3Npb25zIG9uIHRoZSBzcGVjaWZpYyBjb2RlIGludGVycHJldGVyIGFuZCBsaXN0IHBlcm1pc3Npb25zIG9uIGFsbCBjb2RlIGludGVycHJldGVycy5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgLSBUaGUgSUFNIHByaW5jaXBhbCB0byBncmFudCByZWFkIHBlcm1pc3Npb25zIHRvXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBncmFudCBjb25maWd1cmF0aW9uOlxuICAgKiAtIGFjdGlvbnM6IFsnYmVkcm9jay1hZ2VudGNvcmU6R2V0Q29kZUludGVycHJldGVyJywgJ2JlZHJvY2stYWdlbnRjb3JlOkdldENvZGVJbnRlcnByZXRlclNlc3Npb24nXSBvbiB0aGlzLmNvZGVJbnRlcnByZXRlckFyblxuICAgKiAtIGFjdGlvbnM6IFsnYmVkcm9jay1hZ2VudGNvcmU6TGlzdENvZGVJbnRlcnByZXRlcnMnLCAnYmVkcm9jay1hZ2VudGNvcmU6TGlzdENvZGVJbnRlcnByZXRlclNlc3Npb25zJ10gb24gYWxsIHJlc291cmNlcyAoKilcbiAgICogQHJldHVybnMgQW4gSUFNIEdyYW50IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdyYW50ZWQgcGVybWlzc2lvbnNcbiAgICovXG4gIHB1YmxpYyBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIGNvbnN0IHJlc291cmNlU3BlY2lmaWNHcmFudCA9IHRoaXMuZ3JhbnQoXG4gICAgICBncmFudGVlLFxuICAgICAgLi4ucGVybXMuQ09ERV9JTlRFUlBSRVRFUl9SRUFEX1BFUk1TLFxuICAgICk7XG5cbiAgICBjb25zdCBhbGxSZXNvdXJjZUdyYW50ID0gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWU6IGdyYW50ZWUsXG4gICAgICByZXNvdXJjZUFybnM6IFsnKiddLFxuICAgICAgYWN0aW9uczogcGVybXMuQ09ERV9JTlRFUlBSRVRFUl9MSVNUX1BFUk1TLFxuICAgIH0pO1xuICAgIC8vIFJldHVybiBjb21iaW5lZCBncmFudFxuICAgIHJldHVybiByZXNvdXJjZVNwZWNpZmljR3JhbnQuY29tYmluZShhbGxSZXNvdXJjZUdyYW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBpbnZva2UgcGVybWlzc2lvbnMgb24gdGhpcyBjb2RlIGludGVycHJldGVyIHRvIGFuIElBTSBwcmluY2lwYWwuXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIC0gVGhlIElBTSBwcmluY2lwYWwgdG8gZ3JhbnQgaW52b2tlIHBlcm1pc3Npb25zIHRvXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBncmFudCBjb25maWd1cmF0aW9uOlxuICAgKiAtIGFjdGlvbnM6IFsnYmVkcm9jay1hZ2VudGNvcmU6U3RhcnRDb2RlSW50ZXJwcmV0ZXJTZXNzaW9uJywgJ2JlZHJvY2stYWdlbnRjb3JlOkludm9rZUNvZGVJbnRlcnByZXRlcicsICdiZWRyb2NrLWFnZW50Y29yZTpTdG9wQ29kZUludGVycHJldGVyU2Vzc2lvbiddXG4gICAqIC0gcmVzb3VyY2VBcm5zOiBbdGhpcy5jb2RlSW50ZXJwcmV0ZXJBcm5dXG4gICAqIEByZXR1cm5zIEFuIElBTSBHcmFudCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRVc2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgZ3JhbnRlZSxcbiAgICAgIC4uLnBlcm1zLkNPREVfSU5URVJQUkVURVJfVVNFX1BFUk1TLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgaW52b2tlIHBlcm1pc3Npb25zIG9uIHRoaXMgY29kZSBpbnRlcnByZXRlciB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSAtIFRoZSBJQU0gcHJpbmNpcGFsIHRvIGdyYW50IGludm9rZSBwZXJtaXNzaW9ucyB0b1xuICAgKiBAcmV0dXJucyBBbiBJQU0gR3JhbnQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ3JhbnRlZCBwZXJtaXNzaW9uc1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgZ3JhbnQgY29uZmlndXJhdGlvbjpcbiAgICogLSBhY3Rpb25zOiBbJ2JlZHJvY2stYWdlbnRjb3JlOkludm9rZUNvZGVJbnRlcnByZXRlciddXG4gICAqIC0gcmVzb3VyY2VBcm5zOiBbdGhpcy5jb2RlSW50ZXJwcmV0ZXJBcm5dXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50KGdyYW50ZWUsIC4uLnBlcm1zLkNPREVfSU5URVJQUkVURVJfSU5WT0tFX1BFUk1TKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBNZXRyaWNzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBnaXZlbiBuYW1lZCBtZXRyaWMgZm9yIHRoaXMgY29kZSBpbnRlcnByZXRlci5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhlIG1ldHJpYyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMgYSBzdW0gb3ZlciBhIHBlcmlvZCBvZiA1IG1pbnV0ZXMuXG4gICAqIFlvdSBjYW4gY3VzdG9taXplIHRoaXMgYnkgdXNpbmcgdGhlIGBzdGF0aXN0aWNgIGFuZCBgcGVyaW9kYCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHVibGljIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIGRpbWVuc2lvbnM6IERpbWVuc2lvbnNNYXAsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgY29uc3QgbWV0cmljUHJvcHM6IE1ldHJpY1Byb3BzID0ge1xuICAgICAgbmFtZXNwYWNlOiAnQVdTL0JlZHJvY2stQWdlbnRDb3JlJyxcbiAgICAgIG1ldHJpY05hbWUsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7IC4uLmRpbWVuc2lvbnMsIFJlc291cmNlOiB0aGlzLmNvZGVJbnRlcnByZXRlckFybiB9LFxuICAgICAgLi4ucHJvcHMsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5jb25maWd1cmVNZXRyaWMobWV0cmljUHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdHJhY2tpbmcgY29kZSBpbnRlcnByZXRlciBhcGkgb3BlcmF0aW9ucy4uXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG1ldHJpY1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgbWV0cmljIGNvbmZpZ3VyYXRpb246XG4gICAqIC0gbmFtZXNwYWNlOiAnQVdTL0JlZHJvY2stQWdlbnRDb3JlJ1xuICAgKiAtIG1ldHJpY05hbWU6IG1ldHJpY05hbWVcbiAgICogLSBkaW1lbnNpb25zTWFwOiB7IENvZGVJbnRlcnByZXRlcklkOiB0aGlzLmNvZGVJbnRlcnByZXRlcklkIH1cbiAgICogQHJldHVybnMgQSBDbG91ZFdhdGNoIE1ldHJpYyBjb25maWd1cmVkIGZvciBjb2RlIGludGVycHJldGVyIGFwaSBvcGVyYXRpb25zXG4gICAqL1xuICBwdWJsaWMgbWV0cmljRm9yQXBpT3BlcmF0aW9uKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBwcm9wcz86IE1ldHJpY09wdGlvbnMsXG4gICk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKG1ldHJpY05hbWUsIHsgT3BlcmF0aW9uOiBvcGVyYXRpb24gfSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdHJhY2tpbmcgY29kZSBpbnRlcnByZXRlciBsYXRlbmNpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG1ldHJpY1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgbWV0cmljIGNvbmZpZ3VyYXRpb246XG4gICAqIC0gbmFtZXNwYWNlOiAnQVdTL0JlZHJvY2stQWdlbnRDb3JlJ1xuICAgKiAtIG1ldHJpY05hbWU6IExhdGVuY3lcbiAgICogQHJldHVybnMgQSBDbG91ZFdhdGNoIE1ldHJpYyBjb25maWd1cmVkIGZvciBjb2RlIGludGVycHJldGVyIGxhdGVuY2llc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0xhdGVuY3lGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljRm9yQXBpT3BlcmF0aW9uKCdMYXRlbmN5Jywgb3BlcmF0aW9uLCB7IHN0YXRpc3RpYzogU3RhdHMuQVZFUkFHRSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkV2F0Y2ggbWV0cmljIGZvciB0cmFja2luZyBjb2RlIGludGVycHJldGVyIGludm9jYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBtZXRyaWNcbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IG1ldHJpYyBjb25maWd1cmF0aW9uOlxuICAgKiAtIG5hbWVzcGFjZTogJ0FXUy9CZWRyb2NrLUFnZW50Q29yZSdcbiAgICogLSBtZXRyaWNOYW1lOiBJbnZvY2F0aW9uc1xuICAgKiBAcmV0dXJucyBBIENsb3VkV2F0Y2ggTWV0cmljIGNvbmZpZ3VyZWQgZm9yIGNvZGUgaW50ZXJwcmV0ZXIgaW52b2NhdGlvbnNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNJbnZvY2F0aW9uc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGb3JBcGlPcGVyYXRpb24oJ0ludm9jYXRpb25zJywgb3BlcmF0aW9uLCB7XG4gICAgICBzdGF0aXN0aWM6IFN0YXRzLlNVTSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdHJhY2tpbmcgY29kZSBpbnRlcnByZXRlciBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG1ldHJpY1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgbWV0cmljIGNvbmZpZ3VyYXRpb246XG4gICAqIC0gbmFtZXNwYWNlOiAnQVdTL0JlZHJvY2stQWdlbnRDb3JlJ1xuICAgKiAtIG1ldHJpY05hbWU6IEVycm9yc1xuICAgKiBAcmV0dXJucyBBIENsb3VkV2F0Y2ggTWV0cmljIGNvbmZpZ3VyZWQgZm9yIGNvZGUgaW50ZXJwcmV0ZXIgZXJyb3JzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljRXJyb3JzRm9yQXBpT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY0ZvckFwaU9wZXJhdGlvbignRXJyb3JzJywgb3BlcmF0aW9uLCB7IHN0YXRpc3RpYzogU3RhdHMuU1VNLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ2xvdWRXYXRjaCBtZXRyaWMgZm9yIHRyYWNraW5nIGNvZGUgaW50ZXJwcmV0ZXIgdGhyb3R0bGVzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBtZXRyaWNcbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IG1ldHJpYyBjb25maWd1cmF0aW9uOlxuICAgKiAtIG5hbWVzcGFjZTogJ0FXUy9CZWRyb2NrLUFnZW50Q29yZSdcbiAgICogLSBtZXRyaWNOYW1lOiBUaHJvdHRsZXNcbiAgICogQHJldHVybnMgQSBDbG91ZFdhdGNoIE1ldHJpYyBjb25maWd1cmVkIGZvciBjb2RlIGludGVycHJldGVyIHRocm90dGxlc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1Rocm90dGxlc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGb3JBcGlPcGVyYXRpb24oJ1Rocm90dGxlcycsIG9wZXJhdGlvbiwgeyBzdGF0aXN0aWM6IFN0YXRzLlNVTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkV2F0Y2ggbWV0cmljIGZvciB0cmFja2luZyBjb2RlIGludGVycHJldGVyIHN5c3RlbSBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG1ldHJpY1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgbWV0cmljIGNvbmZpZ3VyYXRpb246XG4gICAqIC0gbmFtZXNwYWNlOiAnQVdTL0JlZHJvY2stQWdlbnRDb3JlJ1xuICAgKiAtIG1ldHJpY05hbWU6IFN5c3RlbUVycm9yc1xuICAgKiBAcmV0dXJucyBBIENsb3VkV2F0Y2ggTWV0cmljIGNvbmZpZ3VyZWQgZm9yIGNvZGUgaW50ZXJwcmV0ZXIgc3lzdGVtIGVycm9yc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1N5c3RlbUVycm9yc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGb3JBcGlPcGVyYXRpb24oJ1N5c3RlbUVycm9ycycsIG9wZXJhdGlvbiwgeyBzdGF0aXN0aWM6IFN0YXRzLlNVTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkV2F0Y2ggbWV0cmljIGZvciB0cmFja2luZyBjb2RlIGludGVycHJldGVyIHVzZXIgZXJyb3JzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBtZXRyaWNcbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IG1ldHJpYyBjb25maWd1cmF0aW9uOlxuICAgKiAtIG5hbWVzcGFjZTogJ0FXUy9CZWRyb2NrLUFnZW50Q29yZSdcbiAgICogLSBtZXRyaWNOYW1lOiBVc2VyRXJyb3JzXG4gICAqIEByZXR1cm5zIEEgQ2xvdWRXYXRjaCBNZXRyaWMgY29uZmlndXJlZCBmb3IgY29kZSBpbnRlcnByZXRlciB1c2VyIGVycm9yc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1VzZXJFcnJvcnNGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljRm9yQXBpT3BlcmF0aW9uKCdVc2VyRXJyb3JzJywgb3BlcmF0aW9uLCB7IHN0YXRpc3RpYzogU3RhdHMuU1VNLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ2xvdWRXYXRjaCBtZXRyaWMgZm9yIHRyYWNraW5nIGNvZGUgaW50ZXJwcmV0ZXIgc2Vzc2lvbiBkdXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBtZXRyaWMgY29uZmlndXJhdGlvbjpcbiAgICogLSBuYW1lc3BhY2U6ICdBV1MvQmVkcm9jay1BZ2VudENvcmUnXG4gICAqIC0gbWV0cmljTmFtZTogRHVyYXRpb25cbiAgICogQHJldHVybnMgQSBDbG91ZFdhdGNoIE1ldHJpYyBjb25maWd1cmVkIGZvciBjb2RlIGludGVycHJldGVyIHNlc3Npb24gZHVyYXRpb25cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNTZXNzaW9uRHVyYXRpb24ocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0R1cmF0aW9uJywgeyBPcGVyYXRpb246ICdDb2RlSW50ZXJwcmV0ZXJTZXNzaW9uJyB9LCB7IHN0YXRpc3RpYzogU3RhdHMuQVZFUkFHRSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGNyZWF0ZSBhIG1ldHJpYy5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqIEByZXR1cm5zIEEgQ2xvdWRXYXRjaCBNZXRyaWMgY29uZmlndXJlZCBmb3IgY29kZSBpbnRlcnByZXRlciBhcGkgb3BlcmF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBjb25maWd1cmVNZXRyaWMocHJvcHM6IE1ldHJpY1Byb3BzKSB7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICByZWdpb246IHByb3BzPy5yZWdpb24gPz8gdGhpcy5zdGFjay5yZWdpb24sXG4gICAgICBhY2NvdW50OiBwcm9wcz8uYWNjb3VudCA/PyB0aGlzLnN0YWNrLmFjY291bnQsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICBQUk9QUyBGT1IgTkVXIENPTlNUUlVDVFxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIENvZGVJbnRlcnByZXRlciByZXNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlckN1c3RvbVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjb2RlIGludGVycHJldGVyXG4gICAqIFZhbGlkIGNoYXJhY3RlcnMgYXJlIGEteiwgQS1aLCAwLTksIF8gKHVuZGVyc2NvcmUpXG4gICAqIFRoZSBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBhbmQgY2FuIGJlIHVwIHRvIDQ4IGNoYXJhY3RlcnMgbG9uZ1xuICAgKiBQYXR0ZXJuOiBbYS16QS1aXVthLXpBLVowLTlfXXswLDQ3fVxuICAgKiBAcmVxdWlyZWQgLSBZZXNcbiAgICovXG4gIHJlYWRvbmx5IGNvZGVJbnRlcnByZXRlckN1c3RvbU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBjb2RlIGludGVycHJldGVyXG4gICAqIFZhbGlkIGNoYXJhY3RlcnMgYXJlIGEteiwgQS1aLCAwLTksIF8gKHVuZGVyc2NvcmUpLCAtIChoeXBoZW4pIGFuZCBzcGFjZXNcbiAgICogVGhlIGRlc2NyaXB0aW9uIGNhbiBoYXZlIHVwIHRvIDIwMCBjaGFyYWN0ZXJzXG4gICAqIEBkZWZhdWx0IC0gTm8gZGVzY3JpcHRpb25cbiAgICogQHJlcXVpcmVkIC0gTm9cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgdGhhdCBwcm92aWRlcyBwZXJtaXNzaW9ucyBmb3IgdGhlIGNvZGUgaW50ZXJwcmV0ZXIgdG8gYWNjZXNzIEFXUyBzZXJ2aWNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBIG5ldyByb2xlIHdpbGwgYmUgY3JlYXRlZC5cbiAgICogQHJlcXVpcmVkIC0gTm9cbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIE5ldHdvcmsgY29uZmlndXJhdGlvbiBmb3IgY29kZSBpbnRlcnByZXRlclxuICAgKiBAcmVxdWlyZWQgLSBOb1xuICAgKiBAZGVmYXVsdCAtIFBVQkxJQyBuZXR3b3JrIG1vZGVcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtDb25maWd1cmF0aW9uPzogQ29kZUludGVycHJldGVyTmV0d29ya0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRhZ3MgKG9wdGlvbmFsKVxuICAgKiBBIGxpc3Qgb2Yga2V5OnZhbHVlIHBhaXJzIG9mIHRhZ3MgdG8gYXBwbHkgdG8gdGhpcyBDb2RlIEludGVycHJldGVyIHJlc291cmNlXG4gICAqXG4gICAqIEBkZWZhdWx0IHt9IC0gbm8gdGFnc1xuICAgKiBAcmVxdWlyZWQgLSBOb1xuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgIEFUVFJTIEZPUiBJTVBPUlRFRCBDT05TVFJVQ1RcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogQXR0cmlidXRlcyBmb3Igc3BlY2lmeWluZyBhbiBpbXBvcnRlZCBDb2RlIEludGVycHJldGVyIEN1c3RvbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXJDdXN0b21BdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGFnZW50LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjb2RlSW50ZXJwcmV0ZXJBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIElBTSByb2xlIGFzc29jaWF0ZWQgdG8gdGhlIGNvZGUgaW50ZXJwcmV0ZXIuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyBjb2RlIGludGVycHJldGVyIHdhcyBsYXN0IHVwZGF0ZWQuXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIE5vIGxhc3QgdXBkYXRlZCB0aW1lc3RhbXAgaXMgcHJvdmlkZWRcbiAgICovXG4gIHJlYWRvbmx5IGxhc3RVcGRhdGVkQXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBjb2RlIGludGVycHJldGVyLlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgLSBObyBzdGF0dXMgaXMgcHJvdmlkZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjcmVhdGVkIHRpbWVzdGFtcCBvZiB0aGUgY29kZSBpbnRlcnByZXRlci5cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIC0gTm8gY3JlYXRlZCB0aW1lc3RhbXAgaXMgcHJvdmlkZWRcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZWRBdD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzZWN1cml0eSBncm91cHMgZm9yIHRoaXMgY29kZSBpbnRlcnByZXRlciwgaWYgaW4gYSBWUEMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQnkgZGVmYXVsdCwgdGhlIGNvZGUgaW50ZXJwcmV0ZXIgaXMgbm90IGluIGEgVlBDLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBlYzIuSVNlY3VyaXR5R3JvdXBbXTtcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIEN1c3RvbSBjb2RlIGludGVycHJldGVyIHJlc291cmNlIGZvciBBV1MgQmVkcm9jayBBZ2VudCBDb3JlLlxuICogUHJvdmlkZXMgYSBzYW5kYm94ZWQgZW52aXJvbm1lbnQgZm9yIGNvZGUgZXhlY3V0aW9uIHdpdGggY29uZmlndXJhYmxlIG5ldHdvcmsgYWNjZXNzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlL2xhdGVzdC9kZXZndWlkZS9jb2RlLWludGVycHJldGVyLmh0bWxcbiAqIEByZXNvdXJjZSBBV1M6OkJlZHJvY2tBZ2VudENvcmU6OkNvZGVJbnRlcnByZXRlckN1c3RvbVxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgQ29kZUludGVycHJldGVyQ3VzdG9tIGV4dGVuZHMgQ29kZUludGVycHJldGVyQ3VzdG9tQmFzZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWJlZHJvY2stYWdlbnRjb3JlLWFscGhhLkNvZGVJbnRlcnByZXRlckN1c3RvbSc7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBNZXRob2QgZm9yIGltcG9ydGluZyBhbiBleGlzdGluZyBCZWRyb2NrIEFnZW50Q29yZSBDb2RlIEludGVycHJldGVyIEN1c3RvbS5cbiAgICovXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIENvZGUgSW50ZXJwcmV0ZXIgQ3VzdG9tIHJlZmVyZW5jZSBmcm9tIGFuIGV4aXN0aW5nIGNvZGUgaW50ZXJwcmV0ZXIncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCAtIElkZW50aWZpZXIgb2YgdGhlIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gYXR0cnMgLSBBdHRyaWJ1dGVzIG9mIHRoZSBleGlzdGluZyBjb2RlIGludGVycHJldGVyIGN1c3RvbVxuICAgKiBAcmV0dXJucyBBbiBJQ29kZUludGVycHJldGVyQ3VzdG9tIHJlZmVyZW5jZSB0byB0aGUgZXhpc3RpbmcgY29kZSBpbnRlcnByZXRlclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29kZUludGVycHJldGVyQ3VzdG9tQXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogQ29kZUludGVycHJldGVyQ3VzdG9tQXR0cmlidXRlcyk6IElDb2RlSW50ZXJwcmV0ZXJDdXN0b20ge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIENvZGVJbnRlcnByZXRlckN1c3RvbUJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNvZGVJbnRlcnByZXRlckFybiA9IGF0dHJzLmNvZGVJbnRlcnByZXRlckFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjb2RlSW50ZXJwcmV0ZXJJZCA9IEFybi5zcGxpdChhdHRycy5jb2RlSW50ZXJwcmV0ZXJBcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKS5yZXNvdXJjZU5hbWUhO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGUgPSBpYW0uUm9sZS5mcm9tUm9sZUFybihzY29wZSwgYCR7aWR9Um9sZWAsIGF0dHJzLnJvbGVBcm4pO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGxhc3RVcGRhdGVkQXQgPSBhdHRycy5sYXN0VXBkYXRlZEF0O1xuICAgICAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsID0gdGhpcy5leGVjdXRpb25Sb2xlO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXR1cyA9IGF0dHJzLnN0YXR1cztcbiAgICAgIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQgPSBhdHRycy5jcmVhdGVkQXQ7XG5cbiAgICAgIGNvbnN0cnVjdG9yKHM6IENvbnN0cnVjdCwgaTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHMsIGkpO1xuXG4gICAgICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSB0aGlzLmV4ZWN1dGlvblJvbGUgfHwgbmV3IGlhbS5Vbmtub3duUHJpbmNpcGFsKHsgcmVzb3VyY2U6IHRoaXMgfSk7XG4gICAgICAgIGlmIChhdHRycy5zZWN1cml0eUdyb3Vwcykge1xuICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zID0gbmV3IGVjMi5Db25uZWN0aW9ucyh7XG4gICAgICAgICAgICBzZWN1cml0eUdyb3VwczogYXR0cnMuc2VjdXJpdHlHcm91cHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gbmV3IENvZGUgSW50ZXJwcmV0ZXIgQ3VzdG9tXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQXR0cmlidXRlc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGNvZGUgaW50ZXJwcmV0ZXIgcmVzb3VyY2VcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvZGVJbnRlcnByZXRlckFybjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBjb2RlIGludGVycHJldGVyXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb2RlSW50ZXJwcmV0ZXJJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvZGUgaW50ZXJwcmV0ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvZGUgaW50ZXJwcmV0ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvZGUgaW50ZXJwcmV0ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuZXR3b3JrQ29uZmlndXJhdGlvbjogQ29kZUludGVycHJldGVyTmV0d29ya0NvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBjb2RlIGludGVycHJldGVyXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdGF0dXM/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY3JlYXRlZCB0aW1lc3RhbXAgb2YgdGhlIGNvZGUgaW50ZXJwcmV0ZXJcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBsYXN0IHVwZGF0ZWQgdGltZXN0YW1wIG9mIHRoZSBjb2RlIGludGVycHJldGVyXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsYXN0VXBkYXRlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGZhaWx1cmUgcmVhc29uIG9mIHRoZSBjb2RlIGludGVycHJldGVyXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmYWlsdXJlUmVhc29uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIElBTSByb2xlIHRoYXQgcHJvdmlkZXMgcGVybWlzc2lvbnMgZm9yIHRoZSBjb2RlIGludGVycHJldGVyIHRvIGFjY2VzcyBBV1Mgc2VydmljZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXhlY3V0aW9uUm9sZTogaWFtLklSb2xlO1xuICAvKipcbiAgICogVGhlIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcbiAgLyoqXG4gICAqIFRhZ3MgYXBwbGllZCB0byB0aGlzIGNvZGUgaW50ZXJwcmV0ZXIgcmVzb3VyY2VcbiAgICogQSBtYXAgb2Yga2V5LXZhbHVlIHBhaXJzIGZvciByZXNvdXJjZSB0YWdnaW5nXG4gICAqIEBkZWZhdWx0IC0gTm8gdGFncyBhcHBsaWVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEludGVybmFsIE9ubHlcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHByaXZhdGUgcmVhZG9ubHkgX19yZXNvdXJjZTogYWdlbnRfY29yZS5DZm5Db2RlSW50ZXJwcmV0ZXJDdXN0b207XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IENvZGVJbnRlcnByZXRlckN1c3RvbVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFNldCBwcm9wZXJ0aWVzIGFuZCBkZWZhdWx0c1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHRoaXMubmFtZSA9IHByb3BzLmNvZGVJbnRlcnByZXRlckN1c3RvbU5hbWU7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uO1xuICAgIHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24gPSBwcm9wcy5uZXR3b3JrQ29uZmlndXJhdGlvbiA/PyBDb2RlSW50ZXJwcmV0ZXJOZXR3b3JrQ29uZmlndXJhdGlvbi51c2luZ1B1YmxpY05ldHdvcmsoKTtcbiAgICB0aGlzLmV4ZWN1dGlvblJvbGUgPSBwcm9wcy5leGVjdXRpb25Sb2xlID8/IHRoaXMuX2NyZWF0ZUNvZGVJbnRlcnByZXRlclJvbGUoKTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5leGVjdXRpb25Sb2xlO1xuICAgIHRoaXMudGFncyA9IHByb3BzLnRhZ3M7XG5cbiAgICAvLyBWYWxpZGF0ZSBjb2RlIGludGVycHJldGVyIG5hbWVcbiAgICB0aHJvd0lmSW52YWxpZCh0aGlzLl92YWxpZGF0ZUNvZGVJbnRlcnByZXRlck5hbWUsIHRoaXMubmFtZSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBjb2RlIGludGVycHJldGVyIHRhZ3NcbiAgICB0aHJvd0lmSW52YWxpZCh0aGlzLl92YWxpZGF0ZUNvZGVJbnRlcnByZXRlclRhZ3MsIHRoaXMudGFncyk7XG5cbiAgICAvLyBOZXR3b3JrIGNvbmZpZ3VyYXRpb24gYW5kIHZhbGlkYXRpb24gaXMgZG9uZSBpbiB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uIGNsYXNzXG4gICAgLy8gU28gd2UgZG9uJ3QgbmVlZCB0byB2YWxpZGF0ZSBpdCBoZXJlXG5cbiAgICAvLyBTZXQgY29ubmVjdGlvbnMgLSBjcmVhdGUgYSBzaGFyZWQgY29ubmVjdGlvbnMgb2JqZWN0XG4gICAgaWYgKHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24uY29ubmVjdGlvbnMpIHtcbiAgICAgIC8vIFVzZSB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uJ3MgY29ubmVjdGlvbnMgYXMgdGhlIHNoYXJlZCBvYmplY3RcbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zID0gdGhpcy5uZXR3b3JrQ29uZmlndXJhdGlvbi5jb25uZWN0aW9ucztcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDRk4gUHJvcHMgLSBXaXRoIExhenkgc3VwcG9ydFxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IGNmblByb3BzOiBhZ2VudF9jb3JlLkNmbkNvZGVJbnRlcnByZXRlckN1c3RvbVByb3BzID0ge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBuZXR3b3JrQ29uZmlndXJhdGlvbjogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLm5ldHdvcmtDb25maWd1cmF0aW9uLl9yZW5kZXIodGhpcy5fY29ubmVjdGlvbnMpIH0pLFxuICAgICAgZXhlY3V0aW9uUm9sZUFybjogdGhpcy5leGVjdXRpb25Sb2xlPy5yb2xlQXJuLFxuICAgICAgdGFnczogdGhpcy50YWdzLFxuICAgIH07XG5cbiAgICAvLyBMMSBpbnN0YW50aWF0aW9uXG4gICAgdGhpcy5fX3Jlc291cmNlID0gbmV3IGFnZW50X2NvcmUuQ2ZuQ29kZUludGVycHJldGVyQ3VzdG9tKHRoaXMsICdSZXNvdXJjZScsIGNmblByb3BzKTtcblxuICAgIC8vIEdldCBhdHRyaWJ1dGVzIGRpcmVjdGx5IGZyb20gdGhlIENsb3VkRm9ybWF0aW9uIHJlc291cmNlXG4gICAgdGhpcy5jb2RlSW50ZXJwcmV0ZXJJZCA9IHRoaXMuX19yZXNvdXJjZS5hdHRyQ29kZUludGVycHJldGVySWQ7XG4gICAgdGhpcy5jb2RlSW50ZXJwcmV0ZXJBcm4gPSB0aGlzLl9fcmVzb3VyY2UuYXR0ckNvZGVJbnRlcnByZXRlckFybjtcbiAgICB0aGlzLnN0YXR1cyA9IHRoaXMuX19yZXNvdXJjZS5hdHRyU3RhdHVzO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gdGhpcy5fX3Jlc291cmNlLmF0dHJDcmVhdGVkQXQ7XG4gICAgdGhpcy5sYXN0VXBkYXRlZEF0ID0gdGhpcy5fX3Jlc291cmNlLmF0dHJMYXN0VXBkYXRlZEF0O1xuICAgIHRoaXMuZmFpbHVyZVJlYXNvbiA9IHRoaXMuX19yZXNvdXJjZS5hdHRyRmFpbHVyZVJlYXNvbjtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBWYWxpZGF0b3JzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBjb2RlIGludGVycHJldGVyIG5hbWUgZm9ybWF0XG4gICAqIEBwYXJhbSBuYW1lIFRoZSBjb2RlIGludGVycHJldGVyIG5hbWUgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcywgZW1wdHkgaWYgdmFsaWRcbiAgICogQGludGVybmFsIFRoaXMgaXMgYW4gaW50ZXJuYWwgY29yZSBmdW5jdGlvbiBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG4gICAqL1xuICBwcml2YXRlIF92YWxpZGF0ZUNvZGVJbnRlcnByZXRlck5hbWUgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVN0cmluZ0ZpZWxkTGVuZ3RoKHtcbiAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgZmllbGROYW1lOiAnQ29kZSBpbnRlcnByZXRlciBuYW1lJyxcbiAgICAgIG1pbkxlbmd0aDogQ09ERV9JTlRFUlBSRVRFUl9OQU1FX01JTl9MRU5HVEgsXG4gICAgICBtYXhMZW5ndGg6IENPREVfSU5URVJQUkVURVJfTkFNRV9NQVhfTEVOR1RILFxuICAgIH0pKTtcblxuICAgIC8vIENoZWNrIGlmIG5hbWUgbWF0Y2hlcyB0aGUgQVdTIEFQSSBwYXR0ZXJuOiBbYS16QS1aXVthLXpBLVowLTlfXXswLDQ3fVxuICAgIC8vIE11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciwgZm9sbG93ZWQgYnkgdXAgdG8gNDcgbGV0dGVycywgbnVtYmVycywgb3IgdW5kZXJzY29yZXNcbiAgICBjb25zdCB2YWxpZE5hbWVQYXR0ZXJuID0gL15bYS16QS1aXVthLXpBLVowLTlfXXswLDQ3fSQvO1xuICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlRmllbGRQYXR0ZXJuKG5hbWUsICdDb2RlIGludGVycHJldGVyIG5hbWUnLCB2YWxpZE5hbWVQYXR0ZXJuKSk7XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGNvZGUgaW50ZXJwcmV0ZXIgdGFncyBmb3JtYXRcbiAgICogQHBhcmFtIHRhZ3MgVGhlIHRhZ3Mgb2JqZWN0IHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMsIGVtcHR5IGlmIHZhbGlkXG4gICAqIEBpbnRlcm5hbCBUaGlzIGlzIGFuIGludGVybmFsIGNvcmUgZnVuY3Rpb24gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsaWRhdGVDb2RlSW50ZXJwcmV0ZXJUYWdzID0gKHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogc3RyaW5nW10gPT4ge1xuICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKCF0YWdzKSB7XG4gICAgICByZXR1cm4gZXJyb3JzOyAvLyBUYWdzIGFyZSBvcHRpb25hbFxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggdGFnIGtleSBhbmQgdmFsdWVcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0YWdzKSkge1xuICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVTdHJpbmdGaWVsZExlbmd0aCh7XG4gICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgIGZpZWxkTmFtZTogJ1RhZyBrZXknLFxuICAgICAgICBtaW5MZW5ndGg6IENPREVfSU5URVJQUkVURVJfVEFHX01JTl9MRU5HVEgsXG4gICAgICAgIG1heExlbmd0aDogQ09ERV9JTlRFUlBSRVRFUl9UQUdfTUFYX0xFTkdUSCxcbiAgICAgIH0pKTtcblxuICAgICAgLy8gVmFsaWRhdGUgdGFnIGtleSBwYXR0ZXJuOiBeW2EtekEtWjAtOVxccy5fOi89K0AtXSokXG4gICAgICBjb25zdCB2YWxpZEtleVBhdHRlcm4gPSAvXlthLXpBLVowLTlcXHMuXzovPStALV0qJC87XG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZUZpZWxkUGF0dGVybihrZXksICdUYWcga2V5JywgdmFsaWRLZXlQYXR0ZXJuKSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRhZyB2YWx1ZVxuICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVTdHJpbmdGaWVsZExlbmd0aCh7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgZmllbGROYW1lOiAnVGFnIHZhbHVlJyxcbiAgICAgICAgbWluTGVuZ3RoOiBDT0RFX0lOVEVSUFJFVEVSX1RBR19NSU5fTEVOR1RILFxuICAgICAgICBtYXhMZW5ndGg6IENPREVfSU5URVJQUkVURVJfVEFHX01BWF9MRU5HVEgsXG4gICAgICB9KSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRhZyB2YWx1ZSBwYXR0ZXJuOiBeW2EtekEtWjAtOVxccy5fOi89K0AtXSokXG4gICAgICBjb25zdCB2YWxpZFZhbHVlUGF0dGVybiA9IC9eW2EtekEtWjAtOVxccy5fOi89K0AtXSokLztcbiAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlRmllbGRQYXR0ZXJuKHZhbHVlLCAnVGFnIHZhbHVlJywgdmFsaWRWYWx1ZVBhdHRlcm4pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGV4ZWN1dGlvbiByb2xlIG5lZWRlZCBmb3IgdGhlIGNvZGUgaW50ZXJwcmV0ZXIgdG8gYWNjZXNzIEFXUyBzZXJ2aWNlc1xuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCByb2xlXG4gICAqIEBpbnRlcm5hbCBUaGlzIGlzIGFuIGludGVybmFsIGNvcmUgZnVuY3Rpb24gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlQ29kZUludGVycHJldGVyUm9sZSgpOiBpYW0uSVJvbGUge1xuICAgIGNvbnN0IHJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgJ1NlcnZpY2VSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2JlZHJvY2stYWdlbnRjb3JlLmFtYXpvbmF3cy5jb20nKSxcbiAgICB9KTtcblxuICAgIHJldHVybiByb2xlO1xuICB9XG59XG4iXX0=