@aws-cdk/aws-bedrock-agentcore-alpha 2.227.0-alpha.0 → 2.229.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 (92) hide show
  1. package/.jsii +1385 -1080
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +15 -1
  4. package/README.md +119 -15
  5. package/lib/gateway/gateway-base.js +171 -0
  6. package/{agentcore → lib}/gateway/gateway.js +4 -4
  7. package/{agentcore → lib}/gateway/inbound-auth/authorizer.js +3 -3
  8. package/lib/gateway/outbound-auth/api-key.js +141 -0
  9. package/{agentcore → lib}/gateway/outbound-auth/credential-provider.js +1 -1
  10. package/lib/gateway/outbound-auth/oauth.js +76 -0
  11. package/lib/gateway/perms.d.ts +73 -0
  12. package/lib/gateway/perms.js +109 -0
  13. package/{agentcore → lib}/gateway/protocol.js +2 -2
  14. package/{agentcore → lib}/gateway/targets/schema/api-schema.js +4 -4
  15. package/{agentcore → lib}/gateway/targets/schema/tool-schema.js +4 -4
  16. package/{agentcore → lib}/gateway/targets/target-base.js +1 -1
  17. package/{agentcore → lib}/gateway/targets/target-configuration.js +5 -5
  18. package/lib/gateway/targets/target.js +444 -0
  19. package/lib/index.d.ts +30 -1
  20. package/lib/index.js +55 -6
  21. package/{agentcore → lib}/memory/memory-strategy.js +1 -1
  22. package/{agentcore → lib}/memory/memory.js +2 -2
  23. package/{agentcore → lib}/memory/strategies/managed-strategy.js +1 -1
  24. package/{agentcore → lib}/memory/strategies/self-managed-strategy.js +1 -1
  25. package/{agentcore → lib}/network/network-configuration.js +4 -4
  26. package/{agentcore → lib}/runtime/runtime-artifact.d.ts +30 -0
  27. package/lib/runtime/runtime-artifact.js +174 -0
  28. package/{agentcore → lib}/runtime/runtime-authorizer-configuration.js +1 -1
  29. package/{agentcore → lib}/runtime/runtime-base.js +1 -1
  30. package/{agentcore → lib}/runtime/runtime-endpoint-base.js +1 -1
  31. package/{agentcore → lib}/runtime/runtime-endpoint.js +1 -1
  32. package/{agentcore → lib}/runtime/runtime.d.ts +32 -1
  33. package/lib/runtime/runtime.js +694 -0
  34. package/lib/runtime/types.d.ts +50 -0
  35. package/lib/runtime/types.js +25 -0
  36. package/{agentcore → lib}/tools/browser.d.ts +37 -0
  37. package/lib/tools/browser.js +680 -0
  38. package/{agentcore → lib}/tools/code-interpreter.js +2 -2
  39. package/package.json +10 -10
  40. package/agentcore/gateway/gateway-base.js +0 -171
  41. package/agentcore/gateway/outbound-auth/api-key.js +0 -141
  42. package/agentcore/gateway/outbound-auth/oauth.js +0 -76
  43. package/agentcore/gateway/perms.d.ts +0 -75
  44. package/agentcore/gateway/perms.js +0 -112
  45. package/agentcore/gateway/targets/target.js +0 -444
  46. package/agentcore/index.d.ts +0 -30
  47. package/agentcore/index.js +0 -71
  48. package/agentcore/runtime/runtime-artifact.js +0 -90
  49. package/agentcore/runtime/runtime.js +0 -589
  50. package/agentcore/runtime/types.d.ts +0 -20
  51. package/agentcore/runtime/types.js +0 -25
  52. package/agentcore/tools/browser.js +0 -641
  53. /package/{agentcore → lib}/gateway/gateway-base.d.ts +0 -0
  54. /package/{agentcore → lib}/gateway/gateway.d.ts +0 -0
  55. /package/{agentcore → lib}/gateway/inbound-auth/authorizer.d.ts +0 -0
  56. /package/{agentcore → lib}/gateway/outbound-auth/api-key.d.ts +0 -0
  57. /package/{agentcore → lib}/gateway/outbound-auth/credential-provider.d.ts +0 -0
  58. /package/{agentcore → lib}/gateway/outbound-auth/iam-role.d.ts +0 -0
  59. /package/{agentcore → lib}/gateway/outbound-auth/iam-role.js +0 -0
  60. /package/{agentcore → lib}/gateway/outbound-auth/oauth.d.ts +0 -0
  61. /package/{agentcore → lib}/gateway/protocol.d.ts +0 -0
  62. /package/{agentcore → lib}/gateway/targets/schema/api-schema.d.ts +0 -0
  63. /package/{agentcore → lib}/gateway/targets/schema/base-schema.d.ts +0 -0
  64. /package/{agentcore → lib}/gateway/targets/schema/base-schema.js +0 -0
  65. /package/{agentcore → lib}/gateway/targets/schema/tool-schema.d.ts +0 -0
  66. /package/{agentcore → lib}/gateway/targets/target-base.d.ts +0 -0
  67. /package/{agentcore → lib}/gateway/targets/target-configuration.d.ts +0 -0
  68. /package/{agentcore → lib}/gateway/targets/target.d.ts +0 -0
  69. /package/{agentcore → lib}/gateway/validation-helpers.d.ts +0 -0
  70. /package/{agentcore → lib}/gateway/validation-helpers.js +0 -0
  71. /package/{agentcore → lib}/memory/memory-strategy.d.ts +0 -0
  72. /package/{agentcore → lib}/memory/memory.d.ts +0 -0
  73. /package/{agentcore → lib}/memory/perms.d.ts +0 -0
  74. /package/{agentcore → lib}/memory/perms.js +0 -0
  75. /package/{agentcore → lib}/memory/strategies/managed-strategy.d.ts +0 -0
  76. /package/{agentcore → lib}/memory/strategies/self-managed-strategy.d.ts +0 -0
  77. /package/{agentcore → lib}/memory/validation-helpers.d.ts +0 -0
  78. /package/{agentcore → lib}/memory/validation-helpers.js +0 -0
  79. /package/{agentcore → lib}/network/network-configuration.d.ts +0 -0
  80. /package/{agentcore → lib}/runtime/perms.d.ts +0 -0
  81. /package/{agentcore → lib}/runtime/perms.js +0 -0
  82. /package/{agentcore → lib}/runtime/runtime-authorizer-configuration.d.ts +0 -0
  83. /package/{agentcore → lib}/runtime/runtime-base.d.ts +0 -0
  84. /package/{agentcore → lib}/runtime/runtime-endpoint-base.d.ts +0 -0
  85. /package/{agentcore → lib}/runtime/runtime-endpoint.d.ts +0 -0
  86. /package/{agentcore → lib}/runtime/validation-helpers.d.ts +0 -0
  87. /package/{agentcore → lib}/runtime/validation-helpers.js +0 -0
  88. /package/{agentcore → lib}/tools/code-interpreter.d.ts +0 -0
  89. /package/{agentcore → lib}/tools/perms.d.ts +0 -0
  90. /package/{agentcore → lib}/tools/perms.js +0 -0
  91. /package/{agentcore → lib}/tools/validation-helpers.d.ts +0 -0
  92. /package/{agentcore → lib}/tools/validation-helpers.js +0 -0
@@ -0,0 +1,694 @@
1
+ "use strict";
2
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
3
+ var useValue = arguments.length > 2;
4
+ for (var i = 0; i < initializers.length; i++) {
5
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
6
+ }
7
+ return useValue ? value : void 0;
8
+ };
9
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
10
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
11
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
12
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
13
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
14
+ var _, done = false;
15
+ for (var i = decorators.length - 1; i >= 0; i--) {
16
+ var context = {};
17
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
18
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
19
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
20
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
21
+ if (kind === "accessor") {
22
+ if (result === void 0) continue;
23
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
24
+ if (_ = accept(result.get)) descriptor.get = _;
25
+ if (_ = accept(result.set)) descriptor.set = _;
26
+ if (_ = accept(result.init)) initializers.unshift(_);
27
+ }
28
+ else if (_ = accept(result)) {
29
+ if (kind === "field") initializers.unshift(_);
30
+ else descriptor[key] = _;
31
+ }
32
+ }
33
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
34
+ done = true;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.Runtime = 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 bedrockagentcore = require("aws-cdk-lib/aws-bedrockagentcore");
42
+ const ec2 = require("aws-cdk-lib/aws-ec2");
43
+ const iam = require("aws-cdk-lib/aws-iam");
44
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
45
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
46
+ const perms_1 = require("./perms");
47
+ const runtime_base_1 = require("./runtime-base");
48
+ const runtime_endpoint_1 = require("./runtime-endpoint");
49
+ const network_configuration_1 = require("../network/network-configuration");
50
+ const types_1 = require("./types");
51
+ const validation_helpers_1 = require("./validation-helpers");
52
+ /******************************************************************************
53
+ * Constants
54
+ *****************************************************************************/
55
+ /**
56
+ * Minimum timeout for idle runtime sessions
57
+ * @internal
58
+ */
59
+ const LIFECYCLE_MIN_TIMEOUT = aws_cdk_lib_1.Duration.seconds(60);
60
+ /**
61
+ * Maximum lifetime for the instance
62
+ * @internal
63
+ */
64
+ const LIFECYCLE_MAX_LIFETIME = aws_cdk_lib_1.Duration.seconds(28800);
65
+ /******************************************************************************
66
+ * Class
67
+ *****************************************************************************/
68
+ /**
69
+ * Bedrock Agent Core Runtime
70
+ * Enables running containerized agents with specific network configurations,
71
+ * security settings, and runtime artifacts.
72
+ *
73
+ * @resource AWS::BedrockAgentCore::Runtime
74
+ * @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime.html
75
+ */
76
+ let Runtime = (() => {
77
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
78
+ let _classDescriptor;
79
+ let _classExtraInitializers = [];
80
+ let _classThis;
81
+ let _classSuper = runtime_base_1.RuntimeBase;
82
+ let _instanceExtraInitializers = [];
83
+ let _addEndpoint_decorators;
84
+ var Runtime = class extends _classSuper {
85
+ static { _classThis = this; }
86
+ static {
87
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
88
+ _addEndpoint_decorators = [(0, metadata_resource_1.MethodMetadata)()];
89
+ __esDecorate(this, null, _addEndpoint_decorators, { kind: "method", name: "addEndpoint", static: false, private: false, access: { has: obj => "addEndpoint" in obj, get: obj => obj.addEndpoint }, metadata: _metadata }, null, _instanceExtraInitializers);
90
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
91
+ Runtime = _classThis = _classDescriptor.value;
92
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
93
+ }
94
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.Runtime", version: "2.229.0-alpha.0" };
95
+ /** Uniquely identifies this class. */
96
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.Runtime';
97
+ /**
98
+ * Import an existing Agent Runtime using attributes
99
+ * This allows you to reference an Agent Runtime that was created outside of CDK
100
+ *
101
+ * @param scope The construct scope
102
+ * @param id The construct id
103
+ * @param attrs The attributes of the existing Agent Runtime
104
+ * @returns An IBedrockAgentRuntime instance representing the imported runtime
105
+ */
106
+ static fromAgentRuntimeAttributes(scope, id, attrs) {
107
+ try {
108
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AgentRuntimeAttributes(attrs);
109
+ }
110
+ catch (error) {
111
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
112
+ Error.captureStackTrace(error, this.fromAgentRuntimeAttributes);
113
+ }
114
+ throw error;
115
+ }
116
+ class ImportedBedrockAgentRuntime extends runtime_base_1.RuntimeBase {
117
+ agentRuntimeArn = attrs.agentRuntimeArn;
118
+ agentRuntimeId = attrs.agentRuntimeId;
119
+ agentRuntimeName = attrs.agentRuntimeName;
120
+ agentRuntimeVersion = attrs.agentRuntimeVersion;
121
+ agentStatus = attrs.agentStatus;
122
+ description = attrs.description;
123
+ createdAt = attrs.createdAt;
124
+ lastUpdatedAt = attrs.lastUpdatedAt;
125
+ role;
126
+ grantPrincipal;
127
+ constructor(s, i) {
128
+ super(s, i);
129
+ this.role = iam.Role.fromRoleArn(this, 'Role', attrs.roleArn);
130
+ this.grantPrincipal = this.role;
131
+ if (attrs.securityGroups) {
132
+ this._connections = new ec2.Connections({
133
+ securityGroups: attrs.securityGroups,
134
+ });
135
+ }
136
+ }
137
+ }
138
+ return new ImportedBedrockAgentRuntime(scope, id);
139
+ }
140
+ /**
141
+ * The ARN of the agent runtime
142
+ * @attribute
143
+ * @returns a token representing the ARN of this agent runtime
144
+ */
145
+ agentRuntimeArn = __runInitializers(this, _instanceExtraInitializers);
146
+ /**
147
+ * The unique identifier of the agent runtime
148
+ * @attribute
149
+ * @returns a token representing the ID of this agent runtime
150
+ */
151
+ agentRuntimeId;
152
+ /**
153
+ * The name of the agent runtime
154
+ * @attribute
155
+ * @returns a token representing the name of this agent runtime
156
+ */
157
+ agentRuntimeName;
158
+ role;
159
+ /**
160
+ * The version of the agent runtime
161
+ * @attribute
162
+ * @returns a token representing the version of this agent runtime
163
+ */
164
+ agentRuntimeVersion;
165
+ /**
166
+ * The status of the agent runtime
167
+ * @attribute
168
+ * @returns a token representing the status of this agent runtime
169
+ */
170
+ agentStatus;
171
+ /**
172
+ * Optional description for the agent runtime
173
+ */
174
+ description;
175
+ /**
176
+ * The timestamp when the agent runtime was created
177
+ * @attribute
178
+ * @returns a token representing the creation timestamp of this agent runtime
179
+ */
180
+ createdAt;
181
+ /**
182
+ * The timestamp when the agent runtime was last updated
183
+ * @attribute
184
+ * @returns a token representing the last update timestamp of this agent runtime
185
+ */
186
+ lastUpdatedAt;
187
+ grantPrincipal;
188
+ runtimeResource;
189
+ /**
190
+ * The artifact configuration for the agent runtime
191
+ */
192
+ agentRuntimeArtifact;
193
+ networkConfiguration;
194
+ protocolConfiguration;
195
+ authorizerConfiguration;
196
+ lifecycleConfiguration;
197
+ constructor(scope, id, props) {
198
+ super(scope, id);
199
+ try {
200
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_RuntimeProps(props);
201
+ }
202
+ catch (error) {
203
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
204
+ Error.captureStackTrace(error, Runtime);
205
+ }
206
+ throw error;
207
+ }
208
+ // CDK Analytics Telemetry
209
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
210
+ this.agentRuntimeName = props.runtimeName;
211
+ this.validateRuntimeName();
212
+ this.description = props.description;
213
+ if (this.description) {
214
+ this.validateDescription();
215
+ }
216
+ if (props.environmentVariables) {
217
+ this.validateEnvironmentVariables(props.environmentVariables);
218
+ }
219
+ if (props.tags) {
220
+ this.validateTags(props.tags);
221
+ }
222
+ if (props.requestHeaderConfiguration) {
223
+ this.validateRequestHeaderConfiguration(props.requestHeaderConfiguration);
224
+ }
225
+ this.lifecycleConfiguration = {
226
+ idleRuntimeSessionTimeout: props.lifecycleConfiguration?.idleRuntimeSessionTimeout ?? LIFECYCLE_MIN_TIMEOUT,
227
+ maxLifetime: props.lifecycleConfiguration?.maxLifetime ?? LIFECYCLE_MAX_LIFETIME,
228
+ };
229
+ this.validateLifecycleConfiguration(this.lifecycleConfiguration);
230
+ if (props.executionRole) {
231
+ this.role = props.executionRole;
232
+ if (!aws_cdk_lib_1.Token.isUnresolved(props.executionRole.roleArn)) {
233
+ this.validateRoleArn(props.executionRole.roleArn);
234
+ }
235
+ }
236
+ else {
237
+ this.role = new iam.Role(this, 'ExecutionRole', {
238
+ assumedBy: new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com'),
239
+ description: 'Execution role for Bedrock Agent Core Runtime',
240
+ maxSessionDuration: aws_cdk_lib_1.Duration.hours(8),
241
+ });
242
+ }
243
+ this.addExecutionRolePermissions();
244
+ this.grantPrincipal = this.role;
245
+ this.agentRuntimeArtifact = props.agentRuntimeArtifact;
246
+ // Set up network configuration with VPC support
247
+ this.networkConfiguration = props.networkConfiguration ?? network_configuration_1.RuntimeNetworkConfiguration.usingPublicNetwork();
248
+ // Set connections - create a shared connections object
249
+ if (this.networkConfiguration.connections) {
250
+ // Use the network configuration's connections as the shared object
251
+ this._connections = this.networkConfiguration.connections;
252
+ }
253
+ this.protocolConfiguration = props.protocolConfiguration ?? types_1.ProtocolType.HTTP;
254
+ this.authorizerConfiguration = props.authorizerConfiguration;
255
+ const cfnProps = {
256
+ agentRuntimeName: this.agentRuntimeName,
257
+ roleArn: this.role.roleArn,
258
+ agentRuntimeArtifact: aws_cdk_lib_1.Lazy.any({
259
+ produce: () => this.renderAgentRuntimeArtifact(),
260
+ }),
261
+ networkConfiguration: aws_cdk_lib_1.Lazy.any({
262
+ produce: () => this.networkConfiguration._render(this._connections),
263
+ }),
264
+ protocolConfiguration: aws_cdk_lib_1.Lazy.string({
265
+ produce: () => this.protocolConfiguration,
266
+ }),
267
+ description: props.description,
268
+ environmentVariables: aws_cdk_lib_1.Lazy.any({
269
+ produce: () => this.renderEnvironmentVariables(props.environmentVariables),
270
+ }),
271
+ tags: props.tags ?? {},
272
+ lifecycleConfiguration: this.renderLifecycleConfiguration(),
273
+ };
274
+ if (props.requestHeaderConfiguration) {
275
+ cfnProps.requestHeaderConfiguration = this.renderRequestHeaderConfiguration(props.requestHeaderConfiguration);
276
+ }
277
+ if (props.authorizerConfiguration) {
278
+ cfnProps.authorizerConfiguration = aws_cdk_lib_1.Lazy.any({
279
+ produce: () => this.authorizerConfiguration._render(),
280
+ });
281
+ }
282
+ this.runtimeResource = new bedrockagentcore.CfnRuntime(this, 'Resource', cfnProps);
283
+ // Add dependency on the role (for both custom and auto-created roles)
284
+ // This ensures the Runtime waits for the role and all its policies (including ECR permissions) to be created
285
+ this.runtimeResource.node.addDependency(this.role);
286
+ this.agentRuntimeId = this.runtimeResource.attrAgentRuntimeId;
287
+ this.agentRuntimeArn = this.runtimeResource.attrAgentRuntimeArn;
288
+ this.agentStatus = this.runtimeResource.attrStatus;
289
+ this.agentRuntimeVersion = this.runtimeResource.attrAgentRuntimeVersion;
290
+ this.createdAt = this.runtimeResource.attrCreatedAt;
291
+ this.lastUpdatedAt = this.runtimeResource.attrLastUpdatedAt;
292
+ }
293
+ /**
294
+ * Renders the environment variables for CloudFormation
295
+ * @internal
296
+ */
297
+ renderEnvironmentVariables(envVars) {
298
+ if (!envVars || Object.keys(envVars).length === 0) {
299
+ return undefined;
300
+ }
301
+ return envVars;
302
+ }
303
+ /**
304
+ * Adds proper permissions to the execution role for the agent runtime
305
+ * Based on: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-permissions.html
306
+ */
307
+ addExecutionRolePermissions() {
308
+ const region = aws_cdk_lib_1.Stack.of(this).region;
309
+ const account = aws_cdk_lib_1.Stack.of(this).account;
310
+ // CloudWatch Logs - Log Group operations
311
+ this.role.addToPrincipalPolicy(new iam.PolicyStatement({
312
+ sid: 'LogGroupAccess',
313
+ effect: iam.Effect.ALLOW,
314
+ actions: perms_1.RUNTIME_LOGS_GROUP_ACTIONS,
315
+ resources: [`arn:${aws_cdk_lib_1.Stack.of(this).partition}:logs:${region}:${account}:log-group:/aws/bedrock-agentcore/runtimes/*`],
316
+ }));
317
+ // CloudWatch Logs - Describe all log groups
318
+ this.role.addToPrincipalPolicy(new iam.PolicyStatement({
319
+ sid: 'DescribeLogGroups',
320
+ effect: iam.Effect.ALLOW,
321
+ actions: perms_1.RUNTIME_LOGS_DESCRIBE_ACTIONS,
322
+ resources: [`arn:${aws_cdk_lib_1.Stack.of(this).partition}:logs:${region}:${account}:log-group:*`],
323
+ }));
324
+ // CloudWatch Logs - Log Stream operations
325
+ this.role.addToPrincipalPolicy(new iam.PolicyStatement({
326
+ sid: 'LogStreamAccess',
327
+ effect: iam.Effect.ALLOW,
328
+ actions: perms_1.RUNTIME_LOGS_STREAM_ACTIONS,
329
+ resources: [`arn:${aws_cdk_lib_1.Stack.of(this).partition}:logs:${region}:${account}:log-group:/aws/bedrock-agentcore/runtimes/*:log-stream:*`],
330
+ }));
331
+ // X-Ray Tracing - must be * for tracing
332
+ this.role.addToPrincipalPolicy(new iam.PolicyStatement({
333
+ sid: 'XRayAccess',
334
+ effect: iam.Effect.ALLOW,
335
+ actions: perms_1.RUNTIME_XRAY_ACTIONS,
336
+ resources: ['*'],
337
+ }));
338
+ // CloudWatch Metrics - scoped to bedrock-agentcore namespace
339
+ this.role.addToPrincipalPolicy(new iam.PolicyStatement({
340
+ sid: 'CloudWatchMetrics',
341
+ effect: iam.Effect.ALLOW,
342
+ actions: perms_1.RUNTIME_CLOUDWATCH_METRICS_ACTIONS,
343
+ resources: ['*'],
344
+ conditions: {
345
+ StringEquals: {
346
+ 'cloudwatch:namespace': perms_1.RUNTIME_CLOUDWATCH_NAMESPACE,
347
+ },
348
+ },
349
+ }));
350
+ // Bedrock AgentCore Workload Identity Access
351
+ // Note: The agent name will be determined at runtime, so we use a wildcard pattern
352
+ this.role.addToPrincipalPolicy(new iam.PolicyStatement({
353
+ sid: 'GetAgentAccessToken',
354
+ effect: iam.Effect.ALLOW,
355
+ actions: perms_1.RUNTIME_WORKLOAD_IDENTITY_ACTIONS,
356
+ resources: [
357
+ `arn:${aws_cdk_lib_1.Stack.of(this).partition}:bedrock-agentcore:${region}:${account}:workload-identity-directory/default`,
358
+ `arn:${aws_cdk_lib_1.Stack.of(this).partition}:bedrock-agentcore:${region}:${account}:workload-identity-directory/default/workload-identity/*`,
359
+ ],
360
+ }));
361
+ }
362
+ /**
363
+ * Renders the artifact configuration for CloudFormation
364
+ * @internal
365
+ */
366
+ renderAgentRuntimeArtifact() {
367
+ // set permission with bind
368
+ this.agentRuntimeArtifact.bind(this, this);
369
+ const config = this.agentRuntimeArtifact._render();
370
+ if (config.code) { // S3Image
371
+ return {
372
+ codeConfiguration: {
373
+ code: config.code,
374
+ runtime: config.runtime,
375
+ entryPoint: config.entryPoint,
376
+ },
377
+ };
378
+ }
379
+ else {
380
+ // EcrImage or AssetImage
381
+ const containerUri = config.containerUri;
382
+ if (containerUri) {
383
+ this.validateContainerUri(containerUri);
384
+ }
385
+ return {
386
+ containerConfiguration: {
387
+ containerUri: containerUri,
388
+ },
389
+ };
390
+ }
391
+ }
392
+ /**
393
+ * Renders the request header configuration for CloudFormation
394
+ * @internal
395
+ */
396
+ renderRequestHeaderConfiguration(requestHeaderConfiguration) {
397
+ if (!requestHeaderConfiguration?.allowlistedHeaders) {
398
+ return undefined;
399
+ }
400
+ return {
401
+ requestHeaderAllowlist: requestHeaderConfiguration.allowlistedHeaders,
402
+ };
403
+ }
404
+ /**
405
+ * Renders the lifecycle configuration for CloudFormation
406
+ * @internal
407
+ */
408
+ renderLifecycleConfiguration() {
409
+ return {
410
+ idleRuntimeSessionTimeout: this.lifecycleConfiguration?.idleRuntimeSessionTimeout?.toSeconds(),
411
+ maxLifetime: this.lifecycleConfiguration?.maxLifetime?.toSeconds(),
412
+ };
413
+ }
414
+ /**
415
+ * Validates the request header configuration
416
+ * @throws Error if validation fails
417
+ */
418
+ validateRequestHeaderConfiguration(requestHeaderConfiguration) {
419
+ const allErrors = [];
420
+ if (requestHeaderConfiguration.allowlistedHeaders) {
421
+ if (requestHeaderConfiguration.allowlistedHeaders.length < 1 || requestHeaderConfiguration.allowlistedHeaders.length > 20) {
422
+ allErrors.push('Request header allow list contain between 1 and 20 headers');
423
+ }
424
+ for (const header of requestHeaderConfiguration.allowlistedHeaders) {
425
+ // Validate length
426
+ const lengthErrors = (0, validation_helpers_1.validateStringField)({
427
+ value: header,
428
+ fieldName: 'Request header',
429
+ minLength: 1,
430
+ maxLength: 256,
431
+ });
432
+ allErrors.push(...lengthErrors);
433
+ const patternErrors = (0, validation_helpers_1.validateFieldPattern)(header, 'Request header', /(Authorization|X-Amzn-Bedrock-AgentCore-Runtime-Custom-[a-zA-Z0-9-]+)/, 'Request header must contain only letters, numbers, and hyphens');
434
+ allErrors.push(...patternErrors);
435
+ }
436
+ }
437
+ if (allErrors.length > 0) {
438
+ throw new validation_helpers_1.ValidationError(allErrors.join('\n'));
439
+ }
440
+ }
441
+ /**
442
+ * Validates the lifecycle configuration
443
+ * @throws Error if validation fails
444
+ */
445
+ validateLifecycleConfiguration(lifecycleConfiguration) {
446
+ if (lifecycleConfiguration.idleRuntimeSessionTimeout && !lifecycleConfiguration.idleRuntimeSessionTimeout.isUnresolved()) {
447
+ if (lifecycleConfiguration.idleRuntimeSessionTimeout.toSeconds() < LIFECYCLE_MIN_TIMEOUT.toSeconds()
448
+ || lifecycleConfiguration.idleRuntimeSessionTimeout.toSeconds() > LIFECYCLE_MAX_LIFETIME.toSeconds()) {
449
+ throw new validation_helpers_1.ValidationError(`Idle runtime session timeout must be between ${LIFECYCLE_MIN_TIMEOUT.toSeconds()} seconds and ${LIFECYCLE_MAX_LIFETIME.toSeconds()} seconds`);
450
+ }
451
+ }
452
+ if (lifecycleConfiguration.maxLifetime && !lifecycleConfiguration.maxLifetime.isUnresolved()) {
453
+ if (lifecycleConfiguration.maxLifetime.toSeconds() < LIFECYCLE_MIN_TIMEOUT.toSeconds()
454
+ || lifecycleConfiguration.maxLifetime.toSeconds() > LIFECYCLE_MAX_LIFETIME.toSeconds()) {
455
+ throw new validation_helpers_1.ValidationError(`Maximum lifetime must be between ${LIFECYCLE_MIN_TIMEOUT.toSeconds()} seconds and ${LIFECYCLE_MAX_LIFETIME.toSeconds()} seconds`);
456
+ }
457
+ }
458
+ }
459
+ /**
460
+ * Validates the runtime name format
461
+ * Pattern: ^[a-zA-Z][a-zA-Z0-9_]{0,47}$
462
+ * @throws Error if validation fails
463
+ */
464
+ validateRuntimeName() {
465
+ // Skip validation if the name contains CDK tokens (unresolved values)
466
+ if (aws_cdk_lib_1.Token.isUnresolved(this.agentRuntimeName)) {
467
+ return;
468
+ }
469
+ // Validate length
470
+ const lengthErrors = (0, validation_helpers_1.validateStringField)({
471
+ value: this.agentRuntimeName,
472
+ fieldName: 'Runtime name',
473
+ minLength: 1,
474
+ maxLength: 48,
475
+ });
476
+ // Validate pattern
477
+ const patternErrors = (0, validation_helpers_1.validateFieldPattern)(this.agentRuntimeName, 'Runtime name', /^[a-zA-Z][a-zA-Z0-9_]{0,47}$/, 'Runtime name must start with a letter and contain only letters, numbers, and underscores');
478
+ // Combine and throw if any errors
479
+ const allErrors = [...lengthErrors, ...patternErrors];
480
+ if (allErrors.length > 0) {
481
+ throw new validation_helpers_1.ValidationError(allErrors.join('\n'));
482
+ }
483
+ }
484
+ /**
485
+ * Validates the description format
486
+ * Must be between 1 and 1200 characters (per CloudFormation specification)
487
+ * @throws Error if validation fails
488
+ */
489
+ validateDescription() {
490
+ // Skip validation if the description contains CDK tokens (unresolved values)
491
+ if (aws_cdk_lib_1.Token.isUnresolved(this.description)) {
492
+ return;
493
+ }
494
+ if (this.description) {
495
+ const errors = (0, validation_helpers_1.validateStringField)({
496
+ value: this.description,
497
+ fieldName: 'Description',
498
+ minLength: 1,
499
+ maxLength: 1200,
500
+ });
501
+ if (errors.length > 0) {
502
+ throw new validation_helpers_1.ValidationError(errors.join('\n'));
503
+ }
504
+ }
505
+ }
506
+ /**
507
+ * Validates environment variables
508
+ * - Maximum 50 entries
509
+ * - Key: 1-100 characters
510
+ * - Value: 0-2048 characters (per CloudFormation specification)
511
+ * @throws Error if validation fails
512
+ */
513
+ validateEnvironmentVariables(envVars) {
514
+ const entries = Object.entries(envVars);
515
+ // Validate number of entries (0-50)
516
+ if (entries.length > 50) {
517
+ throw new validation_helpers_1.ValidationError(`Too many environment variables: ${entries.length}. Maximum allowed is 50`);
518
+ }
519
+ for (const [key, value] of entries) {
520
+ // Skip validation if key or value contains CDK tokens
521
+ if (aws_cdk_lib_1.Token.isUnresolved(key) || aws_cdk_lib_1.Token.isUnresolved(value)) {
522
+ continue;
523
+ }
524
+ // Validate key length
525
+ const lengthErrors = (0, validation_helpers_1.validateStringField)({
526
+ value: key,
527
+ fieldName: `Environment variable key '${key}'`,
528
+ minLength: 1,
529
+ maxLength: 100,
530
+ });
531
+ // Validate key pattern
532
+ const patternErrors = (0, validation_helpers_1.validateFieldPattern)(key, `Environment variable key '${key}'`, /^[a-zA-Z_][a-zA-Z0-9_]*$/, `Environment variable key '${key}' must start with a letter or underscore and contain only letters, numbers, and underscores`);
533
+ // Combine and throw if any errors
534
+ const allErrors = [...lengthErrors, ...patternErrors];
535
+ if (allErrors.length > 0) {
536
+ throw new validation_helpers_1.ValidationError(allErrors.join('\n'));
537
+ }
538
+ // Validate value length (0-2048 characters per CloudFormation)
539
+ if (value.length > 2048) {
540
+ throw new validation_helpers_1.ValidationError(`Invalid environment variable value length for key '${key}': ${value.length} characters. ` +
541
+ 'Values must not exceed 2048 characters');
542
+ }
543
+ }
544
+ }
545
+ /**
546
+ * Validates the tags format
547
+ * @param tags The tags object to validate
548
+ * @throws Error if validation fails
549
+ */
550
+ validateTags(tags) {
551
+ // Validate each tag key and value
552
+ for (const [key, value] of Object.entries(tags)) {
553
+ // Skip validation if key or value contains CDK tokens
554
+ if (aws_cdk_lib_1.Token.isUnresolved(key) || aws_cdk_lib_1.Token.isUnresolved(value)) {
555
+ continue;
556
+ }
557
+ // Validate tag key length
558
+ const keyLengthErrors = (0, validation_helpers_1.validateStringField)({
559
+ value: key,
560
+ fieldName: `Tag key "${key}"`,
561
+ minLength: 1,
562
+ maxLength: 256,
563
+ });
564
+ // Validate tag key pattern
565
+ const keyPatternErrors = (0, validation_helpers_1.validateFieldPattern)(key, `Tag key "${key}"`, /^[a-zA-Z0-9\s._:/=+@-]*$/, `Tag key "${key}" can only contain letters (a-z, A-Z), numbers (0-9), spaces, and special characters (._:/=+@-)`);
566
+ // Combine key errors and throw if any
567
+ const keyErrors = [...keyLengthErrors, ...keyPatternErrors];
568
+ if (keyErrors.length > 0) {
569
+ throw new validation_helpers_1.ValidationError(keyErrors.join('\n'));
570
+ }
571
+ if (value === undefined || value === null) {
572
+ throw new validation_helpers_1.ValidationError(`Tag value for key "${key}" cannot be null or undefined`);
573
+ }
574
+ // Validate tag value length
575
+ const valueLengthErrors = (0, validation_helpers_1.validateStringField)({
576
+ value: value,
577
+ fieldName: `Tag value for key "${key}"`,
578
+ minLength: 0,
579
+ maxLength: 256,
580
+ });
581
+ // Validate tag value pattern
582
+ const valuePatternErrors = (0, validation_helpers_1.validateFieldPattern)(value, `Tag value for key "${key}"`, /^[a-zA-Z0-9\s._:/=+@-]*$/, `Tag value for key "${key}" can only contain letters (a-z, A-Z), numbers (0-9), spaces, and special characters (._:/=+@-)`);
583
+ // Combine value errors and throw if any
584
+ const valueErrors = [...valueLengthErrors, ...valuePatternErrors];
585
+ if (valueErrors.length > 0) {
586
+ throw new validation_helpers_1.ValidationError(valueErrors.join('\n'));
587
+ }
588
+ }
589
+ }
590
+ /**
591
+ * Validates the container URI format
592
+ */
593
+ validateContainerUri(uri) {
594
+ // Skip validation if the URI contains CDK tokens (unresolved values)
595
+ if (aws_cdk_lib_1.Token.isUnresolved(uri)) {
596
+ // Add a warning that validation will be skipped for token-based URIs
597
+ aws_cdk_lib_1.Annotations.of(this).addInfo('Container URI validation skipped as it contains unresolved CDK tokens. ' +
598
+ 'The URI will be validated at deployment time.');
599
+ return;
600
+ }
601
+ // Only validate if the URI is a concrete string (not a token)
602
+ const pattern = /^\d{12}\.dkr\.ecr\.([a-z0-9-]+)\.amazonaws\.com\/((?:[a-z0-9]+(?:[._-][a-z0-9]+)*\/)*[a-z0-9]+(?:[._-][a-z0-9]+)*)([:@]\S+)$/;
603
+ if (!pattern.test(uri)) {
604
+ throw new validation_helpers_1.ValidationError(`Invalid container URI format: ${uri}. Must be a valid ECR URI (e.g., 123456789012.dkr.ecr.us-west-2.amazonaws.com/my-agent:latest)`);
605
+ }
606
+ }
607
+ /**
608
+ * Validates the IAM role ARN format and structure
609
+ * @throws Error if validation fails
610
+ */
611
+ validateRoleArn(roleArn) {
612
+ // Validate basic ARN format for IAM roles
613
+ const arnPattern = /^arn:[a-z\-]+:iam::\d{12}:role\/[a-zA-Z0-9+=,.@\-_\/]+$/;
614
+ if (!arnPattern.test(roleArn)) {
615
+ throw new validation_helpers_1.ValidationError(`Invalid IAM role ARN format: ${roleArn}. ` +
616
+ 'Expected format: arn:<partition>:iam::<account-id>:role/<role-name> or arn:<partition>:iam::<account-id>:role/<path>/<role-name>');
617
+ }
618
+ // Parse the ARN components using CDK's Arn.split()
619
+ // Use SLASH_RESOURCE_NAME format for IAM roles (which use format: role/role-name or role/path/to/role-name)
620
+ const arnComponents = aws_cdk_lib_1.Arn.split(roleArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME);
621
+ if (arnComponents.service !== 'iam') {
622
+ throw new validation_helpers_1.ValidationError(`Invalid service in ARN: ${arnComponents.service}. Expected 'iam' for IAM role ARN.`);
623
+ }
624
+ const accountId = arnComponents.account;
625
+ if (!accountId || !/^\d{12}$/.test(accountId)) {
626
+ throw new validation_helpers_1.ValidationError(`Invalid AWS account ID in role ARN: ${accountId}. Must be a 12-digit number.`);
627
+ }
628
+ // Extract role name from resource
629
+ // For IAM roles, resource will be "role" and resourceName will be the role name (with optional path)
630
+ const resource = arnComponents.resource;
631
+ const resourceName = arnComponents.resourceName;
632
+ if (resource !== 'role') {
633
+ throw new validation_helpers_1.ValidationError(`Invalid resource type in ARN: ${resource}. Expected 'role' for IAM role ARN.`);
634
+ }
635
+ if (!resourceName) {
636
+ throw new validation_helpers_1.ValidationError('Role name is missing in the ARN');
637
+ }
638
+ else {
639
+ const rolePathParts = resourceName.split('/');
640
+ const roleName = rolePathParts[rolePathParts.length - 1];
641
+ if (roleName.length > 64) {
642
+ throw new validation_helpers_1.ValidationError(`Role name exceeds maximum length of 64 characters: ${roleName}`);
643
+ }
644
+ }
645
+ const stackAccount = aws_cdk_lib_1.Stack.of(this).account;
646
+ if (!aws_cdk_lib_1.Token.isUnresolved(stackAccount) && accountId !== stackAccount) {
647
+ aws_cdk_lib_1.Annotations.of(this).addWarning(`IAM role is from a different account (${accountId}) than the stack account (${stackAccount}). ` +
648
+ 'Ensure cross-account permissions are properly configured.');
649
+ }
650
+ // Validate the region (IAM is global, so region should be empty)
651
+ const region = arnComponents.region;
652
+ const stackRegion = aws_cdk_lib_1.Stack.of(this).region;
653
+ if (region && region !== '' && region !== stackRegion && !aws_cdk_lib_1.Token.isUnresolved(stackRegion)) {
654
+ aws_cdk_lib_1.Annotations.of(this).addWarning(`IAM role ARN contains a region (${region}) that doesn't match the stack region (${stackRegion}). ` +
655
+ 'IAM is a global service, so this might be intentional.');
656
+ }
657
+ }
658
+ /**
659
+ * Add an endpoint to this runtime
660
+ * This is a convenience method that creates a RuntimeEndpoint associated with this runtime
661
+ *
662
+ * @param endpointName The name of the endpoint
663
+ * @param options Optional configuration for the endpoint
664
+ * @returns The created RuntimeEndpoint
665
+ */
666
+ addEndpoint(endpointName, options) {
667
+ try {
668
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AddEndpointOptions(options);
669
+ }
670
+ catch (error) {
671
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
672
+ Error.captureStackTrace(error, this.addEndpoint);
673
+ }
674
+ throw error;
675
+ }
676
+ // Create the endpoint (security configuration is no longer supported)
677
+ const endpoint = new runtime_endpoint_1.RuntimeEndpoint(this, `Endpoint${endpointName}`, {
678
+ endpointName: endpointName,
679
+ agentRuntimeId: this.agentRuntimeId,
680
+ agentRuntimeVersion: options?.version ?? this.agentRuntimeVersion ?? '1',
681
+ description: options?.description,
682
+ });
683
+ // Add dependency: endpoint must wait for runtime to be created
684
+ endpoint.node.addDependency(this.runtimeResource);
685
+ return endpoint;
686
+ }
687
+ static {
688
+ __runInitializers(_classThis, _classExtraInitializers);
689
+ }
690
+ };
691
+ return Runtime = _classThis;
692
+ })();
693
+ exports.Runtime = Runtime;
694
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsNkNBQXdGO0FBQ3hGLHFFQUFxRTtBQUNyRSwyQ0FBMkM7QUFDM0MsMkNBQTJDO0FBQzNDLDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFFMUUsbUNBUWlCO0FBR2pCLGlEQUEyRjtBQUMzRix5REFBcUQ7QUFDckQsNEVBQStFO0FBQy9FLG1DQUEyRjtBQUMzRiw2REFBa0c7QUFFbEc7OytFQUUrRTtBQUMvRTs7O0dBR0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRW5EOzs7R0FHRztBQUNILE1BQU0sc0JBQXNCLEdBQUcsc0JBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFzR3ZEOzsrRUFFK0U7QUFFL0U7Ozs7Ozs7R0FPRztJQUVVLE9BQU87NEJBRG5CLG9DQUFrQjs7OztzQkFDVSwwQkFBVzs7O3VCQUFuQixTQUFRLFdBQVc7Ozs7dUNBcXBCckMsSUFBQSxrQ0FBYyxHQUFFO1lBQ2pCLG9MQUFPLFdBQVcsNkRBZ0JqQjtZQXRxQkgsNktBdXFCQzs7Ozs7UUF0cUJDLHNDQUFzQztRQUMvQixNQUFNLENBQVUscUJBQXFCLEdBQVcsOENBQThDLENBQUM7UUFFdEc7Ozs7Ozs7O1dBUUc7UUFDSSxNQUFNLENBQUMsMEJBQTBCLENBQ3RDLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUE2Qjs7Ozs7Ozs7OztZQUU3QixNQUFNLDJCQUE0QixTQUFRLDBCQUFXO2dCQUNuQyxlQUFlLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztnQkFDeEMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7Z0JBQ3RDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDMUMsbUJB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Q0FBQztZQUNKLENBQUM7WUFFRCxpRUFBaUU7WUFDakUsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUNwQyxNQUFNLFdBQVcsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDMUMsSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLEVBQUUsSUFBSSxNQUFNLEtBQUssV0FBVyxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDMUYseUJBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUM3QixtQ0FBbUMsTUFBTSwwQ0FBMEMsV0FBVyxLQUFLO29CQUNuRyx3REFBd0QsQ0FDekQsQ0FBQztZQUNKLENBQUM7U0FDRjtRQUVEOzs7Ozs7O1dBT0c7UUFFSSxXQUFXLENBQ2hCLFlBQW9CLEVBQ3BCLE9BQTRCOzs7Ozs7Ozs7O1lBRTVCLHNFQUFzRTtZQUN0RSxNQUFNLFFBQVEsR0FBRyxJQUFJLGtDQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsWUFBWSxFQUFFLEVBQUU7Z0JBQ3BFLFlBQVksRUFBRSxZQUFZO2dCQUMxQixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0JBQ25DLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLEdBQUc7Z0JBQ3hFLFdBQVcsRUFBRSxPQUFPLEVBQUUsV0FBVzthQUNsQyxDQUFDLENBQUM7WUFFSCwrREFBK0Q7WUFDL0QsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRWxELE9BQU8sUUFBUSxDQUFDO1NBQ2pCOztZQXRxQlUsdURBQU87Ozs7O0FBQVAsMEJBQU8iLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjaywgQW5ub3RhdGlvbnMsIFRva2VuLCBBcm4sIEFybkZvcm1hdCwgTGF6eSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGJlZHJvY2thZ2VudGNvcmUgZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2thZ2VudGNvcmUnO1xuaW1wb3J0ICogYXMgZWMyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEsIE1ldGhvZE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgUlVOVElNRV9MT0dTX0dST1VQX0FDVElPTlMsXG4gIFJVTlRJTUVfTE9HU19ERVNDUklCRV9BQ1RJT05TLFxuICBSVU5USU1FX0xPR1NfU1RSRUFNX0FDVElPTlMsXG4gIFJVTlRJTUVfWFJBWV9BQ1RJT05TLFxuICBSVU5USU1FX0NMT1VEV0FUQ0hfTUVUUklDU19BQ1RJT05TLFxuICBSVU5USU1FX0NMT1VEV0FUQ0hfTkFNRVNQQUNFLFxuICBSVU5USU1FX1dPUktMT0FEX0lERU5USVRZX0FDVElPTlMsXG59IGZyb20gJy4vcGVybXMnO1xuaW1wb3J0IHsgQWdlbnRSdW50aW1lQXJ0aWZhY3QgfSBmcm9tICcuL3J1bnRpbWUtYXJ0aWZhY3QnO1xuaW1wb3J0IHsgUnVudGltZUF1dGhvcml6ZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9ydW50aW1lLWF1dGhvcml6ZXItY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBSdW50aW1lQmFzZSwgSUJlZHJvY2tBZ2VudFJ1bnRpbWUsIEFnZW50UnVudGltZUF0dHJpYnV0ZXMgfSBmcm9tICcuL3J1bnRpbWUtYmFzZSc7XG5pbXBvcnQgeyBSdW50aW1lRW5kcG9pbnQgfSBmcm9tICcuL3J1bnRpbWUtZW5kcG9pbnQnO1xuaW1wb3J0IHsgUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vbmV0d29yay9uZXR3b3JrLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgTGlmZWN5Y2xlQ29uZmlndXJhdGlvbiwgUHJvdG9jb2xUeXBlLCBSZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVTdHJpbmdGaWVsZCwgVmFsaWRhdGlvbkVycm9yLCB2YWxpZGF0ZUZpZWxkUGF0dGVybiB9IGZyb20gJy4vdmFsaWRhdGlvbi1oZWxwZXJzJztcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50c1xuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBNaW5pbXVtIHRpbWVvdXQgZm9yIGlkbGUgcnVudGltZSBzZXNzaW9uc1xuICogQGludGVybmFsXG4gKi9cbmNvbnN0IExJRkVDWUNMRV9NSU5fVElNRU9VVCA9IER1cmF0aW9uLnNlY29uZHMoNjApO1xuXG4vKipcbiAqIE1heGltdW0gbGlmZXRpbWUgZm9yIHRoZSBpbnN0YW5jZVxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IExJRkVDWUNMRV9NQVhfTElGRVRJTUUgPSBEdXJhdGlvbi5zZWNvbmRzKDI4ODAwKTtcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BzXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBCZWRyb2NrIEFnZW50IENvcmUgUnVudGltZSByZXNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBWYWxpZCBjaGFyYWN0ZXJzIGFyZSBhLXosIEEtWiwgMC05LCBfICh1bmRlcnNjb3JlKVxuICAgKiBNdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgYW5kIGNhbiBiZSB1cCB0byA0OCBjaGFyYWN0ZXJzIGxvbmdcbiAgICogUGF0dGVybjogXlthLXpBLVpdW2EtekEtWjAtOV9dezAsNDd9JFxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFydGlmYWN0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIENvbnRhaW5zIHRoZSBjb250YWluZXIgY29uZmlndXJhdGlvbiB3aXRoIEVDUiBVUklcbiAgICovXG4gIHJlYWRvbmx5IGFnZW50UnVudGltZUFydGlmYWN0OiBBZ2VudFJ1bnRpbWVBcnRpZmFjdDtcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIHRoYXQgcHJvdmlkZXMgcGVybWlzc2lvbnMgZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIElmIG5vdCBwcm92aWRlZCwgYSByb2xlIHdpbGwgYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5XG4gICAqIEBkZWZhdWx0IC0gQSBuZXcgcm9sZSB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIE5ldHdvcmsgY29uZmlndXJhdGlvbiBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQGRlZmF1bHQgLSBSdW50aW1lTmV0d29ya0NvbmZpZ3VyYXRpb24udXNpbmdQdWJsaWNOZXR3b3JrKClcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtDb25maWd1cmF0aW9uPzogUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQGRlZmF1bHQgLSBObyBkZXNjcmlwdGlvblxuICAgKiBMZW5ndGggTWluaW11bTogMSAsIE1heGltdW06IDEyMDBcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcm90b2NvbCBjb25maWd1cmF0aW9uIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAZGVmYXVsdCAtIFByb3RvY29sVHlwZS5IVFRQXG4gICAqL1xuICByZWFkb25seSBwcm90b2NvbENvbmZpZ3VyYXRpb24/OiBQcm90b2NvbFR5cGU7XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogLSBNYXhpbXVtIDUwIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKiAtIEtleTogTXVzdCBiZSAxLTEwMCBjaGFyYWN0ZXJzLCBzdGFydCB3aXRoIGxldHRlciBvciB1bmRlcnNjb3JlLCBjb250YWluIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIHVuZGVyc2NvcmVzXG4gICAqIC0gVmFsdWU6IE11c3QgYmUgMC0yMDQ4IGNoYXJhY3RlcnMgKHBlciBDbG91ZEZvcm1hdGlvbiBzcGVjaWZpY2F0aW9uKVxuICAgKiBAZGVmYXVsdCAtIE5vIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnRWYXJpYWJsZXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBBdXRob3JpemVyIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIFVzZSBSdW50aW1lQXV0aG9yaXplckNvbmZpZ3VyYXRpb24gc3RhdGljIG1ldGhvZHMgdG8gY3JlYXRlIHRoZSBjb25maWd1cmF0aW9uXG4gICAqIEBkZWZhdWx0IC0gUnVudGltZUF1dGhvcml6ZXJDb25maWd1cmF0aW9uLmlhbSgpIChJQU0gYXV0aGVudGljYXRpb24pXG4gICAqL1xuICByZWFkb25seSBhdXRob3JpemVyQ29uZmlndXJhdGlvbj86IFJ1bnRpbWVBdXRob3JpemVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogVGFncyBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQSBsaXN0IG9mIGtleTp2YWx1ZSBwYWlycyBvZiB0YWdzIHRvIGFwcGx5IHRvIHRoaXMgUnVudGltZSByZXNvdXJjZVxuICAgKiBAZGVmYXVsdCB7fSAtIG5vIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIGZvciBIVFRQIHJlcXVlc3QgaGVhZGVycyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHJ1bnRpbWUuXG4gICAqIEBkZWZhdWx0IC0gTm8gcmVxdWVzdCBoZWFkZXJzIGNvbmZpZ3VyZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uPzogUmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBsaWZlIGN5Y2xlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBBZ2VudENvcmUgUnVudGltZS5cbiAgICogQGRlZmF1bHQgLSBObyBsaWZlY3ljbGUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbGlmZWN5Y2xlQ29uZmlndXJhdGlvbj86IExpZmVjeWNsZUNvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYWRkaW5nIGFuIGVuZHBvaW50IHRvIHRoZSBydW50aW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIGZvciB0aGUgZW5kcG9pbnQsIE11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMjAwIGNoYXJhY3RlcnNcbiAgICogQGRlZmF1bHQgLSBObyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgcnVudGltZSB2ZXJzaW9uIGZvciB0aGlzIGVuZHBvaW50XG4gICAqIEBkZWZhdWx0ICAxXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBCZWRyb2NrIEFnZW50IENvcmUgUnVudGltZVxuICogRW5hYmxlcyBydW5uaW5nIGNvbnRhaW5lcml6ZWQgYWdlbnRzIHdpdGggc3BlY2lmaWMgbmV0d29yayBjb25maWd1cmF0aW9ucyxcbiAqIHNlY3VyaXR5IHNldHRpbmdzLCBhbmQgcnVudGltZSBhcnRpZmFjdHMuXG4gKlxuICogQHJlc291cmNlIEFXUzo6QmVkcm9ja0FnZW50Q29yZTo6UnVudGltZVxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay1hZ2VudGNvcmUvbGF0ZXN0L2Rldmd1aWRlL3J1bnRpbWUuaHRtbFxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgUnVudGltZSBleHRlbmRzIFJ1bnRpbWVCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtYmVkcm9jay1hZ2VudGNvcmUtYWxwaGEuUnVudGltZSc7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBBZ2VudCBSdW50aW1lIHVzaW5nIGF0dHJpYnV0ZXNcbiAgICogVGhpcyBhbGxvd3MgeW91IHRvIHJlZmVyZW5jZSBhbiBBZ2VudCBSdW50aW1lIHRoYXQgd2FzIGNyZWF0ZWQgb3V0c2lkZSBvZiBDREtcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QgaWRcbiAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBleGlzdGluZyBBZ2VudCBSdW50aW1lXG4gICAqIEByZXR1cm5zIEFuIElCZWRyb2NrQWdlbnRSdW50aW1lIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgaW1wb3J0ZWQgcnVudGltZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQWdlbnRSdW50aW1lQXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IEFnZW50UnVudGltZUF0dHJpYnV0ZXMsXG4gICk6IElCZWRyb2NrQWdlbnRSdW50aW1lIHtcbiAgICBjbGFzcyBJbXBvcnRlZEJlZHJvY2tBZ2VudFJ1bnRpbWUgZXh0ZW5kcyBSdW50aW1lQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lQXJuID0gYXR0cnMuYWdlbnRSdW50aW1lQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZUlkID0gYXR0cnMuYWdlbnRSdW50aW1lSWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lTmFtZSA9IGF0dHJzLmFnZW50UnVudGltZU5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lVmVyc2lvbiA9IGF0dHJzLmFnZW50UnVudGltZVZlcnNpb247XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRTdGF0dXMgPSBhdHRycy5hZ2VudFN0YXR1cztcbiAgICAgIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbiA9IGF0dHJzLmRlc2NyaXB0aW9uO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdCA9IGF0dHJzLmNyZWF0ZWRBdDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBsYXN0VXBkYXRlZEF0ID0gYXR0cnMubGFzdFVwZGF0ZWRBdDtcblxuICAgICAgcHVibGljIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgICAgIGNvbnN0cnVjdG9yKHM6IENvbnN0cnVjdCwgaTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHMsIGkpO1xuICAgICAgICB0aGlzLnJvbGUgPSBpYW0uUm9sZS5mcm9tUm9sZUFybih0aGlzLCAnUm9sZScsIGF0dHJzLnJvbGVBcm4pO1xuICAgICAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuICAgICAgICBpZiAoYXR0cnMuc2VjdXJpdHlHcm91cHMpIHtcbiAgICAgICAgICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBlYzIuQ29ubmVjdGlvbnMoe1xuICAgICAgICAgICAgc2VjdXJpdHlHcm91cHM6IGF0dHJzLnNlY3VyaXR5R3JvdXBzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZEJlZHJvY2tBZ2VudFJ1bnRpbWUoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIEFSTiBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBJRCBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIG9mIHRoaXMgYWdlbnQgcnVudGltZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZVZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFN0YXR1cz86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBhZ2VudCBydW50aW1lIHdhcyBjcmVhdGVkXG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGNyZWF0aW9uIHRpbWVzdGFtcCBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGFnZW50IHJ1bnRpbWUgd2FzIGxhc3QgdXBkYXRlZFxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBsYXN0IHVwZGF0ZSB0aW1lc3RhbXAgb2YgdGhpcyBhZ2VudCBydW50aW1lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdD86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcbiAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lUmVzb3VyY2U6IGJlZHJvY2thZ2VudGNvcmUuQ2ZuUnVudGltZTtcbiAgLyoqXG4gICAqIFRoZSBhcnRpZmFjdCBjb25maWd1cmF0aW9uIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZUFydGlmYWN0OiBBZ2VudFJ1bnRpbWVBcnRpZmFjdDtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXR3b3JrQ29uZmlndXJhdGlvbjogUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uIDtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm90b2NvbENvbmZpZ3VyYXRpb246IFByb3RvY29sVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRob3JpemVyQ29uZmlndXJhdGlvbj86IFJ1bnRpbWVBdXRob3JpemVyQ29uZmlndXJhdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBsaWZlY3ljbGVDb25maWd1cmF0aW9uPzogTGlmZWN5Y2xlQ29uZmlndXJhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUnVudGltZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVOYW1lID0gcHJvcHMucnVudGltZU5hbWU7XG4gICAgdGhpcy52YWxpZGF0ZVJ1bnRpbWVOYW1lKCk7XG5cbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb247XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudmFsaWRhdGVEZXNjcmlwdGlvbigpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcykge1xuICAgICAgdGhpcy52YWxpZGF0ZUVudmlyb25tZW50VmFyaWFibGVzKHByb3BzLmVudmlyb25tZW50VmFyaWFibGVzKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMudGFncykge1xuICAgICAgdGhpcy52YWxpZGF0ZVRhZ3MocHJvcHMudGFncyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlUmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24ocHJvcHMucmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24pO1xuICAgIH1cblxuICAgIHRoaXMubGlmZWN5Y2xlQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgIGlkbGVSdW50aW1lU2Vzc2lvblRpbWVvdXQ6IHByb3BzLmxpZmVjeWNsZUNvbmZpZ3VyYXRpb24/LmlkbGVSdW50aW1lU2Vzc2lvblRpbWVvdXQgPz8gTElGRUNZQ0xFX01JTl9USU1FT1VULFxuICAgICAgbWF4TGlmZXRpbWU6IHByb3BzLmxpZmVjeWNsZUNvbmZpZ3VyYXRpb24/Lm1heExpZmV0aW1lID8/IExJRkVDWUNMRV9NQVhfTElGRVRJTUUsXG4gICAgfTtcbiAgICB0aGlzLnZhbGlkYXRlTGlmZWN5Y2xlQ29uZmlndXJhdGlvbih0aGlzLmxpZmVjeWNsZUNvbmZpZ3VyYXRpb24pO1xuXG4gICAgaWYgKHByb3BzLmV4ZWN1dGlvblJvbGUpIHtcbiAgICAgIHRoaXMucm9sZSA9IHByb3BzLmV4ZWN1dGlvblJvbGU7XG4gICAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5leGVjdXRpb25Sb2xlLnJvbGVBcm4pKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVSb2xlQXJuKHByb3BzLmV4ZWN1dGlvblJvbGUucm9sZUFybik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnRXhlY3V0aW9uUm9sZScsIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2JlZHJvY2stYWdlbnRjb3JlLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdFeGVjdXRpb24gcm9sZSBmb3IgQmVkcm9jayBBZ2VudCBDb3JlIFJ1bnRpbWUnLFxuICAgICAgICBtYXhTZXNzaW9uRHVyYXRpb246IER1cmF0aW9uLmhvdXJzKDgpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuYWRkRXhlY3V0aW9uUm9sZVBlcm1pc3Npb25zKCk7XG5cbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuICAgIHRoaXMuYWdlbnRSdW50aW1lQXJ0aWZhY3QgPSBwcm9wcy5hZ2VudFJ1bnRpbWVBcnRpZmFjdDtcbiAgICAvLyBTZXQgdXAgbmV0d29yayBjb25maWd1cmF0aW9uIHdpdGggVlBDIHN1cHBvcnRcbiAgICB0aGlzLm5ldHdvcmtDb25maWd1cmF0aW9uID0gcHJvcHMubmV0d29ya0NvbmZpZ3VyYXRpb24gPz8gUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uLnVzaW5nUHVibGljTmV0d29yaygpO1xuICAgIC8vIFNldCBjb25uZWN0aW9ucyAtIGNyZWF0ZSBhIHNoYXJlZCBjb25uZWN0aW9ucyBvYmplY3RcbiAgICBpZiAodGhpcy5uZXR3b3JrQ29uZmlndXJhdGlvbi5jb25uZWN0aW9ucykge1xuICAgICAgLy8gVXNlIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24ncyBjb25uZWN0aW9ucyBhcyB0aGUgc2hhcmVkIG9iamVjdFxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMgPSB0aGlzLm5ldHdvcmtDb25maWd1cmF0aW9uLmNvbm5lY3Rpb25zO1xuICAgIH1cbiAgICB0aGlzLnByb3RvY29sQ29uZmlndXJhdGlvbiA9IHByb3BzLnByb3RvY29sQ29uZmlndXJhdGlvbiA/PyBQcm90b2NvbFR5cGUuSFRUUDtcbiAgICB0aGlzLmF1dGhvcml6ZXJDb25maWd1cmF0aW9uID0gcHJvcHMuYXV0aG9yaXplckNvbmZpZ3VyYXRpb247XG5cbiAgICBjb25zdCBjZm5Qcm9wczogYW55ID0ge1xuICAgICAgYWdlbnRSdW50aW1lTmFtZTogdGhpcy5hZ2VudFJ1bnRpbWVOYW1lLFxuICAgICAgcm9sZUFybjogdGhpcy5yb2xlLnJvbGVBcm4sXG4gICAgICBhZ2VudFJ1bnRpbWVBcnRpZmFjdDogTGF6eS5hbnkoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLnJlbmRlckFnZW50UnVudGltZUFydGlmYWN0KCksXG4gICAgICB9KSxcbiAgICAgIG5ldHdvcmtDb25maWd1cmF0aW9uOiBMYXp5LmFueSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24uX3JlbmRlcih0aGlzLl9jb25uZWN0aW9ucyksXG4gICAgICB9KSxcbiAgICAgIHByb3RvY29sQ29uZmlndXJhdGlvbjogTGF6eS5zdHJpbmcoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLnByb3RvY29sQ29uZmlndXJhdGlvbixcbiAgICAgIH0pLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IExhenkuYW55KHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gdGhpcy5yZW5kZXJFbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcyksXG4gICAgICB9KSxcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3MgPz8ge30sXG4gICAgICBsaWZlY3ljbGVDb25maWd1cmF0aW9uOiB0aGlzLnJlbmRlckxpZmVjeWNsZUNvbmZpZ3VyYXRpb24oKSxcbiAgICB9O1xuICAgIGlmIChwcm9wcy5yZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbikge1xuICAgICAgY2ZuUHJvcHMucmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24gPSB0aGlzLnJlbmRlclJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKHByb3BzLnJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmF1dGhvcml6ZXJDb25maWd1cmF0aW9uKSB7XG4gICAgICBjZm5Qcm9wcy5hdXRob3JpemVyQ29uZmlndXJhdGlvbiA9IExhenkuYW55KHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gdGhpcy5hdXRob3JpemVyQ29uZmlndXJhdGlvbiEuX3JlbmRlcigpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5ydW50aW1lUmVzb3VyY2UgPSBuZXcgYmVkcm9ja2FnZW50Y29yZS5DZm5SdW50aW1lKHRoaXMsICdSZXNvdXJjZScsIGNmblByb3BzIGFzIGJlZHJvY2thZ2VudGNvcmUuQ2ZuUnVudGltZVByb3BzKTtcblxuICAgIC8vIEFkZCBkZXBlbmRlbmN5IG9uIHRoZSByb2xlIChmb3IgYm90aCBjdXN0b20gYW5kIGF1dG8tY3JlYXRlZCByb2xlcylcbiAgICAvLyBUaGlzIGVuc3VyZXMgdGhlIFJ1bnRpbWUgd2FpdHMgZm9yIHRoZSByb2xlIGFuZCBhbGwgaXRzIHBvbGljaWVzIChpbmNsdWRpbmcgRUNSIHBlcm1pc3Npb25zKSB0byBiZSBjcmVhdGVkXG4gICAgdGhpcy5ydW50aW1lUmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMucm9sZSk7XG5cbiAgICB0aGlzLmFnZW50UnVudGltZUlkID0gdGhpcy5ydW50aW1lUmVzb3VyY2UuYXR0ckFnZW50UnVudGltZUlkO1xuICAgIHRoaXMuYWdlbnRSdW50aW1lQXJuID0gdGhpcy5ydW50aW1lUmVzb3VyY2UuYXR0ckFnZW50UnVudGltZUFybjtcbiAgICB0aGlzLmFnZW50U3RhdHVzID0gdGhpcy5ydW50aW1lUmVzb3VyY2UuYXR0clN0YXR1cztcbiAgICB0aGlzLmFnZW50UnVudGltZVZlcnNpb24gPSB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5hdHRyQWdlbnRSdW50aW1lVmVyc2lvbjtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IHRoaXMucnVudGltZVJlc291cmNlLmF0dHJDcmVhdGVkQXQ7XG4gICAgdGhpcy5sYXN0VXBkYXRlZEF0ID0gdGhpcy5ydW50aW1lUmVzb3VyY2UuYXR0ckxhc3RVcGRhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBDbG91ZEZvcm1hdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiBhbnkge1xuICAgIGlmICghZW52VmFycyB8fCBPYmplY3Qua2V5cyhlbnZWYXJzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBlbnZWYXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcHJvcGVyIHBlcm1pc3Npb25zIHRvIHRoZSBleGVjdXRpb24gcm9sZSBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQmFzZWQgb246IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS9sYXRlc3QvZGV2Z3VpZGUvcnVudGltZS1wZXJtaXNzaW9ucy5odG1sXG4gICAqL1xuICBwcml2YXRlIGFkZEV4ZWN1dGlvblJvbGVQZXJtaXNzaW9ucygpIHtcbiAgICBjb25zdCByZWdpb24gPSBTdGFjay5vZih0aGlzKS5yZWdpb247XG4gICAgY29uc3QgYWNjb3VudCA9IFN0YWNrLm9mKHRoaXMpLmFjY291bnQ7XG5cbiAgICAvLyBDbG91ZFdhdGNoIExvZ3MgLSBMb2cgR3JvdXAgb3BlcmF0aW9uc1xuICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdMb2dHcm91cEFjY2VzcycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBSVU5USU1FX0xPR1NfR1JPVVBfQUNUSU9OUyxcbiAgICAgIHJlc291cmNlczogW2Bhcm46JHtTdGFjay5vZih0aGlzKS5wYXJ0aXRpb259OmxvZ3M6JHtyZWdpb259OiR7YWNjb3VudH06bG9nLWdyb3VwOi9hd3MvYmVkcm9jay1hZ2VudGNvcmUvcnVudGltZXMvKmBdLFxuICAgIH0pKTtcblxuICAgIC8vIENsb3VkV2F0Y2ggTG9ncyAtIERlc2NyaWJlIGFsbCBsb2cgZ3JvdXBzXG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ0Rlc2NyaWJlTG9nR3JvdXBzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfTE9HU19ERVNDUklCRV9BQ1RJT05TLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke1N0YWNrLm9mKHRoaXMpLnBhcnRpdGlvbn06bG9nczoke3JlZ2lvbn06JHthY2NvdW50fTpsb2ctZ3JvdXA6KmBdLFxuICAgIH0pKTtcblxuICAgIC8vIENsb3VkV2F0Y2ggTG9ncyAtIExvZyBTdHJlYW0gb3BlcmF0aW9uc1xuICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdMb2dTdHJlYW1BY2Nlc3MnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogUlVOVElNRV9MT0dTX1NUUkVBTV9BQ1RJT05TLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke1N0YWNrLm9mKHRoaXMpLnBhcnRpdGlvbn06bG9nczoke3JlZ2lvbn06JHthY2NvdW50fTpsb2ctZ3JvdXA6L2F3cy9iZWRyb2NrLWFnZW50Y29yZS9ydW50aW1lcy8qOmxvZy1zdHJlYW06KmBdLFxuICAgIH0pKTtcblxuICAgIC8vIFgtUmF5IFRyYWNpbmcgLSBtdXN0IGJlICogZm9yIHRyYWNpbmdcbiAgICB0aGlzLnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnWFJheUFjY2VzcycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBSVU5USU1FX1hSQVlfQUNUSU9OUyxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuXG4gICAgLy8gQ2xvdWRXYXRjaCBNZXRyaWNzIC0gc2NvcGVkIHRvIGJlZHJvY2stYWdlbnRjb3JlIG5hbWVzcGFjZVxuICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdDbG91ZFdhdGNoTWV0cmljcycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBSVU5USU1FX0NMT1VEV0FUQ0hfTUVUUklDU19BQ1RJT05TLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgJ2Nsb3Vkd2F0Y2g6bmFtZXNwYWNlJzogUlVOVElNRV9DTE9VRFdBVENIX05BTUVTUEFDRSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSkpO1xuXG4gICAgLy8gQmVkcm9jayBBZ2VudENvcmUgV29ya2xvYWQgSWRlbnRpdHkgQWNjZXNzXG4gICAgLy8gTm90ZTogVGhlIGFnZW50IG5hbWUgd2lsbCBiZSBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUsIHNvIHdlIHVzZSBhIHdpbGRjYXJkIHBhdHRlcm5cbiAgICB0aGlzLnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnR2V0QWdlbnRBY2Nlc3NUb2tlbicsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBSVU5USU1FX1dPUktMT0FEX0lERU5USVRZX0FDVElPTlMsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgYGFybjoke1N0YWNrLm9mKHRoaXMpLnBhcnRpdGlvbn06YmVkcm9jay1hZ2VudGNvcmU6JHtyZWdpb259OiR7YWNjb3VudH06d29ya2xvYWQtaWRlbnRpdHktZGlyZWN0b3J5L2RlZmF1bHRgLFxuICAgICAgICBgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpiZWRyb2NrLWFnZW50Y29yZToke3JlZ2lvbn06JHthY2NvdW50fTp3b3JrbG9hZC1pZGVudGl0eS1kaXJlY3RvcnkvZGVmYXVsdC93b3JrbG9hZC1pZGVudGl0eS8qYCxcbiAgICAgIF0sXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGFydGlmYWN0IGNvbmZpZ3VyYXRpb24gZm9yIENsb3VkRm9ybWF0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJBZ2VudFJ1bnRpbWVBcnRpZmFjdCgpOiBhbnkge1xuICAgIC8vIHNldCBwZXJtaXNzaW9uIHdpdGggYmluZFxuICAgIHRoaXMuYWdlbnRSdW50aW1lQXJ0aWZhY3QuYmluZCh0aGlzLCB0aGlzKTtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmFnZW50UnVudGltZUFydGlmYWN0Ll9yZW5kZXIoKTtcbiAgICBpZiAoKGNvbmZpZyBhcyBhbnkpLmNvZGUpIHsgLy8gUzNJbWFnZVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZUNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBjb2RlOiAoY29uZmlnIGFzIGFueSkuY29kZSxcbiAgICAgICAgICBydW50aW1lOiAoY29uZmlnIGFzIGFueSkucnVudGltZSxcbiAgICAgICAgICBlbnRyeVBvaW50OiAoY29uZmlnIGFzIGFueSkuZW50cnlQb2ludCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEVjckltYWdlIG9yIEFzc2V0SW1hZ2VcbiAgICAgIGNvbnN0IGNvbnRhaW5lclVyaSA9IChjb25maWcgYXMgYW55KS5jb250YWluZXJVcmk7XG4gICAgICBpZiAoY29udGFpbmVyVXJpKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVDb250YWluZXJVcmkoY29udGFpbmVyVXJpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRhaW5lckNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBjb250YWluZXJVcmk6IGNvbnRhaW5lclVyaSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHJlcXVlc3QgaGVhZGVyIGNvbmZpZ3VyYXRpb24gZm9yIENsb3VkRm9ybWF0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJSZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbihyZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbj86IFJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKTogYW55IHtcbiAgICBpZiAoIXJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uPy5hbGxvd2xpc3RlZEhlYWRlcnMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZXF1ZXN0SGVhZGVyQWxsb3dsaXN0OiByZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbi5hbGxvd2xpc3RlZEhlYWRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBsaWZlY3ljbGUgY29uZmlndXJhdGlvbiBmb3IgQ2xvdWRGb3JtYXRpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckxpZmVjeWNsZUNvbmZpZ3VyYXRpb24oKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWRsZVJ1bnRpbWVTZXNzaW9uVGltZW91dDogdGhpcy5saWZlY3ljbGVDb25maWd1cmF0aW9uPy5pZGxlUnVudGltZVNlc3Npb25UaW1lb3V0Py50b1NlY29uZHMoKSxcbiAgICAgIG1heExpZmV0aW1lOiB0aGlzLmxpZmVjeWNsZUNvbmZpZ3VyYXRpb24/Lm1heExpZmV0aW1lPy50b1NlY29uZHMoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgcmVxdWVzdCBoZWFkZXIgY29uZmlndXJhdGlvblxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbihyZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbjogUmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBhbGxFcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uLmFsbG93bGlzdGVkSGVhZGVycykge1xuICAgICAgaWYgKHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uLmFsbG93bGlzdGVkSGVhZGVycy5sZW5ndGggPCAxIHx8IHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uLmFsbG93bGlzdGVkSGVhZGVycy5sZW5ndGggPiAyMCkge1xuICAgICAgICBhbGxFcnJvcnMucHVzaCgnUmVxdWVzdCBoZWFkZXIgYWxsb3cgbGlzdCBjb250YWluIGJldHdlZW4gMSBhbmQgMjAgaGVhZGVycycpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBvZiByZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbi5hbGxvd2xpc3RlZEhlYWRlcnMpIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgbGVuZ3RoXG4gICAgICAgIGNvbnN0IGxlbmd0aEVycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgICAgIHZhbHVlOiBoZWFkZXIsXG4gICAgICAgICAgZmllbGROYW1lOiAnUmVxdWVzdCBoZWFkZXInLFxuICAgICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgICBtYXhMZW5ndGg6IDI1NixcbiAgICAgICAgfSk7XG4gICAgICAgIGFsbEVycm9ycy5wdXNoKC4uLmxlbmd0aEVycm9ycyk7XG5cbiAgICAgICAgY29uc3QgcGF0dGVybkVycm9ycyA9IHZhbGlkYXRlRmllbGRQYXR0ZXJuKFxuICAgICAgICAgIGhlYWRlcixcbiAgICAgICAgICAnUmVxdWVzdCBoZWFkZXInLFxuICAgICAgICAgIC8oQXV0aG9yaXphdGlvbnxYLUFtem4tQmVkcm9jay1BZ2VudENvcmUtUnVudGltZS1DdXN0b20tW2EtekEtWjAtOS1dKykvLFxuICAgICAgICAgICdSZXF1ZXN0IGhlYWRlciBtdXN0IGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgaHlwaGVucycsXG4gICAgICAgICk7XG4gICAgICAgIGFsbEVycm9ycy5wdXNoKC4uLnBhdHRlcm5FcnJvcnMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWxsRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYWxsRXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBsaWZlY3ljbGUgY29uZmlndXJhdGlvblxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVMaWZlY3ljbGVDb25maWd1cmF0aW9uKGxpZmVjeWNsZUNvbmZpZ3VyYXRpb246IExpZmVjeWNsZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcbiAgICBpZiAobGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5pZGxlUnVudGltZVNlc3Npb25UaW1lb3V0ICYmICFsaWZlY3ljbGVDb25maWd1cmF0aW9uLmlkbGVSdW50aW1lU2Vzc2lvblRpbWVvdXQuaXNVbnJlc29sdmVkKCkpIHtcbiAgICAgIGlmIChsaWZlY3ljbGVDb25maWd1cmF0aW9uLmlkbGVSdW50aW1lU2Vzc2lvblRpbWVvdXQudG9TZWNvbmRzKCkgPCBMSUZFQ1lDTEVfTUlOX1RJTUVPVVQudG9TZWNvbmRzKClcbiAgICAgICAgfHwgbGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5pZGxlUnVudGltZVNlc3Npb25UaW1lb3V0LnRvU2Vjb25kcygpID4gTElGRUNZQ0xFX01BWF9MSUZFVElNRS50b1NlY29uZHMoKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBJZGxlIHJ1bnRpbWUgc2Vzc2lvbiB0aW1lb3V0IG11c3QgYmUgYmV0d2VlbiAke0xJRkVDWUNMRV9NSU5fVElNRU9VVC50b1NlY29uZHMoKX0gc2Vjb25kcyBhbmQgJHtMSUZFQ1lDTEVfTUFYX0xJRkVUSU1FLnRvU2Vjb25kcygpfSBzZWNvbmRzYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChsaWZlY3ljbGVDb25maWd1cmF0aW9uLm1heExpZmV0aW1lICYmICFsaWZlY3ljbGVDb25maWd1cmF0aW9uLm1heExpZmV0aW1lLmlzVW5yZXNvbHZlZCgpKSB7XG4gICAgICBpZiAobGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5tYXhMaWZldGltZS50b1NlY29uZHMoKSA8IExJRkVDWUNMRV9NSU5fVElNRU9VVC50b1NlY29uZHMoKVxuICAgICAgICB8fCBsaWZlY3ljbGVDb25maWd1cmF0aW9uLm1heExpZmV0aW1lLnRvU2Vjb25kcygpID4gTElGRUNZQ0xFX01BWF9MSUZFVElNRS50b1NlY29uZHMoKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBNYXhpbXVtIGxpZmV0aW1lIG11c3QgYmUgYmV0d2VlbiAke0xJRkVDWUNMRV9NSU5fVElNRU9VVC50b1NlY29uZHMoKX0gc2Vjb25kcyBhbmQgJHtMSUZFQ1lDTEVfTUFYX0xJRkVUSU1FLnRvU2Vjb25kcygpfSBzZWNvbmRzYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgcnVudGltZSBuYW1lIGZvcm1hdFxuICAgKiBQYXR0ZXJuOiBeW2EtekEtWl1bYS16QS1aMC05X117MCw0N30kXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJ1bnRpbWVOYW1lKCk6IHZvaWQge1xuICAgIC8vIFNraXAgdmFsaWRhdGlvbiBpZiB0aGUgbmFtZSBjb250YWlucyBDREsgdG9rZW5zICh1bnJlc29sdmVkIHZhbHVlcylcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHRoaXMuYWdlbnRSdW50aW1lTmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsZW5ndGhcbiAgICBjb25zdCBsZW5ndGhFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgIHZhbHVlOiB0aGlzLmFnZW50UnVudGltZU5hbWUsXG4gICAgICBmaWVsZE5hbWU6ICdSdW50aW1lIG5hbWUnLFxuICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgbWF4TGVuZ3RoOiA0OCxcbiAgICB9KTtcblxuICAgIC8vIFZhbGlkYXRlIHBhdHRlcm5cbiAgICBjb25zdCBwYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICB0aGlzLmFnZW50UnVudGltZU5hbWUsXG4gICAgICAnUnVudGltZSBuYW1lJyxcbiAgICAgIC9eW2EtekEtWl1bYS16QS1aMC05X117MCw0N30kLyxcbiAgICAgICdSdW50aW1lIG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIGFuZCBjb250YWluIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIHVuZGVyc2NvcmVzJyxcbiAgICApO1xuXG4gICAgLy8gQ29tYmluZSBhbmQgdGhyb3cgaWYgYW55IGVycm9yc1xuICAgIGNvbnN0IGFsbEVycm9ycyA9IFsuLi5sZW5ndGhFcnJvcnMsIC4uLnBhdHRlcm5FcnJvcnNdO1xuICAgIGlmIChhbGxFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihhbGxFcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGRlc2NyaXB0aW9uIGZvcm1hdFxuICAgKiBNdXN0IGJlIGJldHdlZW4gMSBhbmQgMTIwMCBjaGFyYWN0ZXJzIChwZXIgQ2xvdWRGb3JtYXRpb24gc3BlY2lmaWNhdGlvbilcbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRGVzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgLy8gU2tpcCB2YWxpZGF0aW9uIGlmIHRoZSBkZXNjcmlwdGlvbiBjb250YWlucyBDREsgdG9rZW5zICh1bnJlc29sdmVkIHZhbHVlcylcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHRoaXMuZGVzY3JpcHRpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgICB2YWx1ZTogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgZmllbGROYW1lOiAnRGVzY3JpcHRpb24nLFxuICAgICAgICBtaW5MZW5ndGg6IDEsXG4gICAgICAgIG1heExlbmd0aDogMTIwMCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqIC0gTWF4aW11bSA1MCBlbnRyaWVzXG4gICAqIC0gS2V5OiAxLTEwMCBjaGFyYWN0ZXJzXG4gICAqIC0gVmFsdWU6IDAtMjA0OCBjaGFyYWN0ZXJzIChwZXIgQ2xvdWRGb3JtYXRpb24gc3BlY2lmaWNhdGlvbilcbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhlbnZWYXJzKTtcblxuICAgIC8vIFZhbGlkYXRlIG51bWJlciBvZiBlbnRyaWVzICgwLTUwKVxuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDUwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgVG9vIG1hbnkgZW52aXJvbm1lbnQgdmFyaWFibGVzOiAke2VudHJpZXMubGVuZ3RofS4gTWF4aW11bSBhbGxvd2VkIGlzIDUwYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgLy8gU2tpcCB2YWxpZGF0aW9uIGlmIGtleSBvciB2YWx1ZSBjb250YWlucyBDREsgdG9rZW5zXG4gICAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKGtleSkgfHwgVG9rZW4uaXNVbnJlc29sdmVkKHZhbHVlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUga2V5IGxlbmd0aFxuICAgICAgY29uc3QgbGVuZ3RoRXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgIGZpZWxkTmFtZTogYEVudmlyb25tZW50IHZhcmlhYmxlIGtleSAnJHtrZXl9J2AsXG4gICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgbWF4TGVuZ3RoOiAxMDAsXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUga2V5IHBhdHRlcm5cbiAgICAgIGNvbnN0IHBhdHRlcm5FcnJvcnMgPSB2YWxpZGF0ZUZpZWxkUGF0dGVybihcbiAgICAgICAga2V5LFxuICAgICAgICBgRW52aXJvbm1lbnQgdmFyaWFibGUga2V5ICcke2tleX0nYCxcbiAgICAgICAgL15bYS16QS1aX11bYS16QS1aMC05X10qJC8sXG4gICAgICAgIGBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgJyR7a2V5fScgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIG9yIHVuZGVyc2NvcmUgYW5kIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgdW5kZXJzY29yZXNgLFxuICAgICAgKTtcblxuICAgICAgLy8gQ29tYmluZSBhbmQgdGhyb3cgaWYgYW55IGVycm9yc1xuICAgICAgY29uc3QgYWxsRXJyb3JzID0gWy4uLmxlbmd0aEVycm9ycywgLi4ucGF0dGVybkVycm9yc107XG4gICAgICBpZiAoYWxsRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihhbGxFcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB2YWx1ZSBsZW5ndGggKDAtMjA0OCBjaGFyYWN0ZXJzIHBlciBDbG91ZEZvcm1hdGlvbilcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAyMDQ4KSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUgbGVuZ3RoIGZvciBrZXkgJyR7a2V5fSc6ICR7dmFsdWUubGVuZ3RofSBjaGFyYWN0ZXJzLiBgICtcbiAgICAgICAgICAnVmFsdWVzIG11c3Qgbm90IGV4Y2VlZCAyMDQ4IGNoYXJhY3RlcnMnLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHRhZ3MgZm9ybWF0XG4gICAqIEBwYXJhbSB0YWdzIFRoZSB0YWdzIG9iamVjdCB0byB2YWxpZGF0ZVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVUYWdzKHRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSBlYWNoIHRhZyBrZXkgYW5kIHZhbHVlXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGFncykpIHtcbiAgICAgIC8vIFNraXAgdmFsaWRhdGlvbiBpZiBrZXkgb3IgdmFsdWUgY29udGFpbnMgQ0RLIHRva2Vuc1xuICAgICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChrZXkpIHx8IFRva2VuLmlzVW5yZXNvbHZlZCh2YWx1ZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRhZyBrZXkgbGVuZ3RoXG4gICAgICBjb25zdCBrZXlMZW5ndGhFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgZmllbGROYW1lOiBgVGFnIGtleSBcIiR7a2V5fVwiYCxcbiAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICBtYXhMZW5ndGg6IDI1NixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0YWcga2V5IHBhdHRlcm5cbiAgICAgIGNvbnN0IGtleVBhdHRlcm5FcnJvcnMgPSB2YWxpZGF0ZUZpZWxkUGF0dGVybihcbiAgICAgICAga2V5LFxuICAgICAgICBgVGFnIGtleSBcIiR7a2V5fVwiYCxcbiAgICAgICAgL15bYS16QS1aMC05XFxzLl86Lz0rQC1dKiQvLFxuICAgICAgICBgVGFnIGtleSBcIiR7a2V5fVwiIGNhbiBvbmx5IGNvbnRhaW4gbGV0dGVycyAoYS16LCBBLVopLCBudW1iZXJzICgwLTkpLCBzcGFjZXMsIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMgKC5fOi89K0AtKWAsXG4gICAgICApO1xuXG4gICAgICAvLyBDb21iaW5lIGtleSBlcnJvcnMgYW5kIHRocm93IGlmIGFueVxuICAgICAgY29uc3Qga2V5RXJyb3JzID0gWy4uLmtleUxlbmd0aEVycm9ycywgLi4ua2V5UGF0dGVybkVycm9yc107XG4gICAgICBpZiAoa2V5RXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihrZXlFcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBUYWcgdmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZGApO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB0YWcgdmFsdWUgbGVuZ3RoXG4gICAgICBjb25zdCB2YWx1ZUxlbmd0aEVycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZTogYFRhZyB2YWx1ZSBmb3Iga2V5IFwiJHtrZXl9XCJgLFxuICAgICAgICBtaW5MZW5ndGg6IDAsXG4gICAgICAgIG1heExlbmd0aDogMjU2LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRhZyB2YWx1ZSBwYXR0ZXJuXG4gICAgICBjb25zdCB2YWx1ZVBhdHRlcm5FcnJvcnMgPSB2YWxpZGF0ZUZpZWxkUGF0dGVybihcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGBUYWcgdmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiYCxcbiAgICAgICAgL15bYS16QS1aMC05XFxzLl86Lz0rQC1dKiQvLFxuICAgICAgICBgVGFnIHZhbHVlIGZvciBrZXkgXCIke2tleX1cIiBjYW4gb25seSBjb250YWluIGxldHRlcnMgKGEteiwgQS1aKSwgbnVtYmVycyAoMC05KSwgc3BhY2VzLCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzICguXzovPStALSlgLFxuICAgICAgKTtcblxuICAgICAgLy8gQ29tYmluZSB2YWx1ZSBlcnJvcnMgYW5kIHRocm93IGlmIGFueVxuICAgICAgY29uc3QgdmFsdWVFcnJvcnMgPSBbLi4udmFsdWVMZW5ndGhFcnJvcnMsIC4uLnZhbHVlUGF0dGVybkVycm9yc107XG4gICAgICBpZiAodmFsdWVFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHZhbHVlRXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBjb250YWluZXIgVVJJIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbnRhaW5lclVyaSh1cmk6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFNraXAgdmFsaWRhdGlvbiBpZiB0aGUgVVJJIGNvbnRhaW5zIENESyB0b2tlbnMgKHVucmVzb2x2ZWQgdmFsdWVzKVxuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQodXJpKSkge1xuICAgICAgLy8gQWRkIGEgd2FybmluZyB0aGF0IHZhbGlkYXRpb24gd2lsbCBiZSBza2lwcGVkIGZvciB0b2tlbi1iYXNlZCBVUklzXG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRJbmZvKFxuICAgICAgICAnQ29udGFpbmVyIFVSSSB2YWxpZGF0aW9uIHNraXBwZWQgYXMgaXQgY29udGFpbnMgdW5yZXNvbHZlZCBDREsgdG9rZW5zLiAnICtcbiAgICAgICAgJ1RoZSBVUkkgd2lsbCBiZSB2YWxpZGF0ZWQgYXQgZGVwbG95bWVudCB0aW1lLicsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ubHkgdmFsaWRhdGUgaWYgdGhlIFVSSSBpcyBhIGNvbmNyZXRlIHN0cmluZyAobm90IGEgdG9rZW4pXG4gICAgY29uc3QgcGF0dGVybiA9IC9eXFxkezEyfVxcLmRrclxcLmVjclxcLihbYS16MC05LV0rKVxcLmFtYXpvbmF3c1xcLmNvbVxcLygoPzpbYS16MC05XSsoPzpbLl8tXVthLXowLTldKykqXFwvKSpbYS16MC05XSsoPzpbLl8tXVthLXowLTldKykqKShbOkBdXFxTKykkLztcbiAgICBpZiAoIXBhdHRlcm4udGVzdCh1cmkpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBjb250YWluZXIgVVJJIGZvcm1hdDogJHt1cml9LiBNdXN0IGJlIGEgdmFsaWQgRUNSIFVSSSAoZS5nLiwgMTIzNDU2Nzg5MDEyLmRrci5lY3IudXMtd2VzdC0yLmFtYXpvbmF3cy5jb20vbXktYWdlbnQ6bGF0ZXN0KWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIElBTSByb2xlIEFSTiBmb3JtYXQgYW5kIHN0cnVjdHVyZVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSb2xlQXJuKHJvbGVBcm46IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFZhbGlkYXRlIGJhc2ljIEFSTiBmb3JtYXQgZm9yIElBTSByb2xlc1xuICAgIGNvbnN0IGFyblBhdHRlcm4gPSAvXmFybjpbYS16XFwtXSs6aWFtOjpcXGR7MTJ9OnJvbGVcXC9bYS16QS1aMC05Kz0sLkBcXC1fXFwvXSskLztcbiAgICBpZiAoIWFyblBhdHRlcm4udGVzdChyb2xlQXJuKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCBJQU0gcm9sZSBBUk4gZm9ybWF0OiAke3JvbGVBcm59LiBgICtcbiAgJ0V4cGVjdGVkIGZvcm1hdDogYXJuOjxwYXJ0aXRpb24+OmlhbTo6PGFjY291bnQtaWQ+OnJvbGUvPHJvbGUtbmFtZT4gb3IgYXJuOjxwYXJ0aXRpb24+OmlhbTo6PGFjY291bnQtaWQ+OnJvbGUvPHBhdGg+Lzxyb2xlLW5hbWU+Jyk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgdGhlIEFSTiBjb21wb25lbnRzIHVzaW5nIENESydzIEFybi5zcGxpdCgpXG4gICAgLy8gVXNlIFNMQVNIX1JFU09VUkNFX05BTUUgZm9ybWF0IGZvciBJQU0gcm9sZXMgKHdoaWNoIHVzZSBmb3JtYXQ6IHJvbGUvcm9sZS1uYW1lIG9yIHJvbGUvcGF0aC90by9yb2xlLW5hbWUpXG4gICAgY29uc3QgYXJuQ29tcG9uZW50cyA9IEFybi5zcGxpdChyb2xlQXJuLCBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSk7XG5cbiAgICBpZiAoYXJuQ29tcG9uZW50cy5zZXJ2aWNlICE9PSAnaWFtJykge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCBzZXJ2aWNlIGluIEFSTjogJHthcm5Db21wb25lbnRzLnNlcnZpY2V9LiBFeHBlY3RlZCAnaWFtJyBmb3IgSUFNIHJvbGUgQVJOLmApO1xuICAgIH1cblxuICAgIGNvbnN0IGFjY291bnRJZCA9IGFybkNvbXBvbmVudHMuYWNjb3VudDtcbiAgICBpZiAoIWFjY291bnRJZCB8fCAhL15cXGR7MTJ9JC8udGVzdChhY2NvdW50SWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIEFXUyBhY2NvdW50IElEIGluIHJvbGUgQVJOOiAke2FjY291bnRJZH0uIE11c3QgYmUgYSAxMi1kaWdpdCBudW1iZXIuYCk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCByb2xlIG5hbWUgZnJvbSByZXNvdXJjZVxuICAgIC8vIEZvciBJQU0gcm9sZXMsIHJlc291cmNlIHdpbGwgYmUgXCJyb2xlXCIgYW5kIHJlc291cmNlTmFtZSB3aWxsIGJlIHRoZSByb2xlIG5hbWUgKHdpdGggb3B0aW9uYWwgcGF0aClcbiAgICBjb25zdCByZXNvdXJjZSA9IGFybkNvbXBvbmVudHMucmVzb3VyY2U7XG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gYXJuQ29tcG9uZW50cy5yZXNvdXJjZU5hbWU7XG5cbiAgICBpZiAocmVzb3VyY2UgIT09ICdyb2xlJykge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCByZXNvdXJjZSB0eXBlIGluIEFSTjogJHtyZXNvdXJjZX0uIEV4cGVjdGVkICdyb2xlJyBmb3IgSUFNIHJvbGUgQVJOLmApO1xuICAgIH1cblxuICAgIGlmICghcmVzb3VyY2VOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdSb2xlIG5hbWUgaXMgbWlzc2luZyBpbiB0aGUgQVJOJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJvbGVQYXRoUGFydHMgPSByZXNvdXJjZU5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IHJvbGVOYW1lID0gcm9sZVBhdGhQYXJ0c1tyb2xlUGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAocm9sZU5hbWUubGVuZ3RoID4gNjQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgUm9sZSBuYW1lIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgNjQgY2hhcmFjdGVyczogJHtyb2xlTmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdGFja0FjY291bnQgPSBTdGFjay5vZih0aGlzKS5hY2NvdW50O1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHN0YWNrQWNjb3VudCkgJiYgYWNjb3VudElkICE9PSBzdGFja0FjY291bnQpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmcoXG4gICAgICAgIGBJQU0gcm9sZSBpcyBmcm9tIGEgZGlmZmVyZW50IGFjY291bnQgKCR7YWNjb3VudElkfSkgdGhhbiB0aGUgc3RhY2sgYWNjb3VudCAoJHtzdGFja0FjY291bnR9KS4gYCArXG4gICAgICAgICdFbnN1cmUgY3Jvc3MtYWNjb3VudCBwZXJtaXNzaW9ucyBhcmUgcHJvcGVybHkgY29uZmlndXJlZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgcmVnaW9uIChJQU0gaXMgZ2xvYmFsLCBzbyByZWdpb24gc2hvdWxkIGJlIGVtcHR5KVxuICAgIGNvbnN0IHJlZ2lvbiA9IGFybkNvbXBvbmVudHMucmVnaW9uO1xuICAgIGNvbnN0IHN0YWNrUmVnaW9uID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIGlmIChyZWdpb24gJiYgcmVnaW9uICE9PSAnJyAmJiByZWdpb24gIT09IHN0YWNrUmVnaW9uICYmICFUb2tlbi5pc1VucmVzb2x2ZWQoc3RhY2tSZWdpb24pKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nKFxuICAgICAgICBgSUFNIHJvbGUgQVJOIGNvbnRhaW5zIGEgcmVnaW9uICgke3JlZ2lvbn0pIHRoYXQgZG9lc24ndCBtYXRjaCB0aGUgc3RhY2sgcmVnaW9uICgke3N0YWNrUmVnaW9ufSkuIGAgK1xuICAgICAgICAnSUFNIGlzIGEgZ2xvYmFsIHNlcnZpY2UsIHNvIHRoaXMgbWlnaHQgYmUgaW50ZW50aW9uYWwuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBlbmRwb2ludCB0byB0aGlzIHJ1bnRpbWVcbiAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBSdW50aW1lRW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVudGltZVxuICAgKlxuICAgKiBAcGFyYW0gZW5kcG9pbnROYW1lIFRoZSBuYW1lIG9mIHRoZSBlbmRwb2ludFxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgZW5kcG9pbnRcbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgUnVudGltZUVuZHBvaW50XG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkRW5kcG9pbnQoXG4gICAgZW5kcG9pbnROYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEFkZEVuZHBvaW50T3B0aW9ucyxcbiAgKTogUnVudGltZUVuZHBvaW50IHtcbiAgICAvLyBDcmVhdGUgdGhlIGVuZHBvaW50IChzZWN1cml0eSBjb25maWd1cmF0aW9uIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQpXG4gICAgY29uc3QgZW5kcG9pbnQgPSBuZXcgUnVudGltZUVuZHBvaW50KHRoaXMsIGBFbmRwb2ludCR7ZW5kcG9pbnROYW1lfWAsIHtcbiAgICAgIGVuZHBvaW50TmFtZTogZW5kcG9pbnROYW1lLFxuICAgICAgYWdlbnRSdW50aW1lSWQ6IHRoaXMuYWdlbnRSdW50aW1lSWQsXG4gICAgICBhZ2VudFJ1bnRpbWVWZXJzaW9uOiBvcHRpb25zPy52ZXJzaW9uID8/IHRoaXMuYWdlbnRSdW50aW1lVmVyc2lvbiA/PyAnMScsXG4gICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucz8uZGVzY3JpcHRpb24sXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgZGVwZW5kZW5jeTogZW5kcG9pbnQgbXVzdCB3YWl0IGZvciBydW50aW1lIHRvIGJlIGNyZWF0ZWRcbiAgICBlbmRwb2ludC5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5ydW50aW1lUmVzb3VyY2UpO1xuXG4gICAgcmV0dXJuIGVuZHBvaW50O1xuICB9XG59XG4iXX0=