@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.
- package/.jsii +1385 -1080
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +15 -1
- package/README.md +119 -15
- package/lib/gateway/gateway-base.js +171 -0
- package/{agentcore → lib}/gateway/gateway.js +4 -4
- package/{agentcore → lib}/gateway/inbound-auth/authorizer.js +3 -3
- package/lib/gateway/outbound-auth/api-key.js +141 -0
- package/{agentcore → lib}/gateway/outbound-auth/credential-provider.js +1 -1
- package/lib/gateway/outbound-auth/oauth.js +76 -0
- package/lib/gateway/perms.d.ts +73 -0
- package/lib/gateway/perms.js +109 -0
- package/{agentcore → lib}/gateway/protocol.js +2 -2
- package/{agentcore → lib}/gateway/targets/schema/api-schema.js +4 -4
- package/{agentcore → lib}/gateway/targets/schema/tool-schema.js +4 -4
- package/{agentcore → lib}/gateway/targets/target-base.js +1 -1
- package/{agentcore → lib}/gateway/targets/target-configuration.js +5 -5
- package/lib/gateway/targets/target.js +444 -0
- package/lib/index.d.ts +30 -1
- package/lib/index.js +55 -6
- package/{agentcore → lib}/memory/memory-strategy.js +1 -1
- package/{agentcore → lib}/memory/memory.js +2 -2
- package/{agentcore → lib}/memory/strategies/managed-strategy.js +1 -1
- package/{agentcore → lib}/memory/strategies/self-managed-strategy.js +1 -1
- package/{agentcore → lib}/network/network-configuration.js +4 -4
- package/{agentcore → lib}/runtime/runtime-artifact.d.ts +30 -0
- package/lib/runtime/runtime-artifact.js +174 -0
- package/{agentcore → lib}/runtime/runtime-authorizer-configuration.js +1 -1
- package/{agentcore → lib}/runtime/runtime-base.js +1 -1
- package/{agentcore → lib}/runtime/runtime-endpoint-base.js +1 -1
- package/{agentcore → lib}/runtime/runtime-endpoint.js +1 -1
- package/{agentcore → lib}/runtime/runtime.d.ts +32 -1
- package/lib/runtime/runtime.js +694 -0
- package/lib/runtime/types.d.ts +50 -0
- package/lib/runtime/types.js +25 -0
- package/{agentcore → lib}/tools/browser.d.ts +37 -0
- package/lib/tools/browser.js +680 -0
- package/{agentcore → lib}/tools/code-interpreter.js +2 -2
- package/package.json +10 -10
- package/agentcore/gateway/gateway-base.js +0 -171
- package/agentcore/gateway/outbound-auth/api-key.js +0 -141
- package/agentcore/gateway/outbound-auth/oauth.js +0 -76
- package/agentcore/gateway/perms.d.ts +0 -75
- package/agentcore/gateway/perms.js +0 -112
- package/agentcore/gateway/targets/target.js +0 -444
- package/agentcore/index.d.ts +0 -30
- package/agentcore/index.js +0 -71
- package/agentcore/runtime/runtime-artifact.js +0 -90
- package/agentcore/runtime/runtime.js +0 -589
- package/agentcore/runtime/types.d.ts +0 -20
- package/agentcore/runtime/types.js +0 -25
- package/agentcore/tools/browser.js +0 -641
- /package/{agentcore → lib}/gateway/gateway-base.d.ts +0 -0
- /package/{agentcore → lib}/gateway/gateway.d.ts +0 -0
- /package/{agentcore → lib}/gateway/inbound-auth/authorizer.d.ts +0 -0
- /package/{agentcore → lib}/gateway/outbound-auth/api-key.d.ts +0 -0
- /package/{agentcore → lib}/gateway/outbound-auth/credential-provider.d.ts +0 -0
- /package/{agentcore → lib}/gateway/outbound-auth/iam-role.d.ts +0 -0
- /package/{agentcore → lib}/gateway/outbound-auth/iam-role.js +0 -0
- /package/{agentcore → lib}/gateway/outbound-auth/oauth.d.ts +0 -0
- /package/{agentcore → lib}/gateway/protocol.d.ts +0 -0
- /package/{agentcore → lib}/gateway/targets/schema/api-schema.d.ts +0 -0
- /package/{agentcore → lib}/gateway/targets/schema/base-schema.d.ts +0 -0
- /package/{agentcore → lib}/gateway/targets/schema/base-schema.js +0 -0
- /package/{agentcore → lib}/gateway/targets/schema/tool-schema.d.ts +0 -0
- /package/{agentcore → lib}/gateway/targets/target-base.d.ts +0 -0
- /package/{agentcore → lib}/gateway/targets/target-configuration.d.ts +0 -0
- /package/{agentcore → lib}/gateway/targets/target.d.ts +0 -0
- /package/{agentcore → lib}/gateway/validation-helpers.d.ts +0 -0
- /package/{agentcore → lib}/gateway/validation-helpers.js +0 -0
- /package/{agentcore → lib}/memory/memory-strategy.d.ts +0 -0
- /package/{agentcore → lib}/memory/memory.d.ts +0 -0
- /package/{agentcore → lib}/memory/perms.d.ts +0 -0
- /package/{agentcore → lib}/memory/perms.js +0 -0
- /package/{agentcore → lib}/memory/strategies/managed-strategy.d.ts +0 -0
- /package/{agentcore → lib}/memory/strategies/self-managed-strategy.d.ts +0 -0
- /package/{agentcore → lib}/memory/validation-helpers.d.ts +0 -0
- /package/{agentcore → lib}/memory/validation-helpers.js +0 -0
- /package/{agentcore → lib}/network/network-configuration.d.ts +0 -0
- /package/{agentcore → lib}/runtime/perms.d.ts +0 -0
- /package/{agentcore → lib}/runtime/perms.js +0 -0
- /package/{agentcore → lib}/runtime/runtime-authorizer-configuration.d.ts +0 -0
- /package/{agentcore → lib}/runtime/runtime-base.d.ts +0 -0
- /package/{agentcore → lib}/runtime/runtime-endpoint-base.d.ts +0 -0
- /package/{agentcore → lib}/runtime/runtime-endpoint.d.ts +0 -0
- /package/{agentcore → lib}/runtime/validation-helpers.d.ts +0 -0
- /package/{agentcore → lib}/runtime/validation-helpers.js +0 -0
- /package/{agentcore → lib}/tools/code-interpreter.d.ts +0 -0
- /package/{agentcore → lib}/tools/perms.d.ts +0 -0
- /package/{agentcore → lib}/tools/perms.js +0 -0
- /package/{agentcore → lib}/tools/validation-helpers.d.ts +0 -0
- /package/{agentcore → lib}/tools/validation-helpers.js +0 -0
|
@@ -1,589 +0,0 @@
|
|
|
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
|
-
* Class
|
|
54
|
-
*****************************************************************************/
|
|
55
|
-
/**
|
|
56
|
-
* Bedrock Agent Core Runtime
|
|
57
|
-
* Enables running containerized agents with specific network configurations,
|
|
58
|
-
* security settings, and runtime artifacts.
|
|
59
|
-
*
|
|
60
|
-
* @resource AWS::BedrockAgentCore::Runtime
|
|
61
|
-
* @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime.html
|
|
62
|
-
*/
|
|
63
|
-
let Runtime = (() => {
|
|
64
|
-
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
65
|
-
let _classDescriptor;
|
|
66
|
-
let _classExtraInitializers = [];
|
|
67
|
-
let _classThis;
|
|
68
|
-
let _classSuper = runtime_base_1.RuntimeBase;
|
|
69
|
-
let _instanceExtraInitializers = [];
|
|
70
|
-
let _addEndpoint_decorators;
|
|
71
|
-
var Runtime = class extends _classSuper {
|
|
72
|
-
static { _classThis = this; }
|
|
73
|
-
static {
|
|
74
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
75
|
-
_addEndpoint_decorators = [(0, metadata_resource_1.MethodMetadata)()];
|
|
76
|
-
__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);
|
|
77
|
-
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
78
|
-
Runtime = _classThis = _classDescriptor.value;
|
|
79
|
-
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
80
|
-
}
|
|
81
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.Runtime", version: "2.227.0-alpha.0" };
|
|
82
|
-
/** Uniquely identifies this class. */
|
|
83
|
-
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.Runtime';
|
|
84
|
-
/**
|
|
85
|
-
* Import an existing Agent Runtime using attributes
|
|
86
|
-
* This allows you to reference an Agent Runtime that was created outside of CDK
|
|
87
|
-
*
|
|
88
|
-
* @param scope The construct scope
|
|
89
|
-
* @param id The construct id
|
|
90
|
-
* @param attrs The attributes of the existing Agent Runtime
|
|
91
|
-
* @returns An IBedrockAgentRuntime instance representing the imported runtime
|
|
92
|
-
*/
|
|
93
|
-
static fromAgentRuntimeAttributes(scope, id, attrs) {
|
|
94
|
-
try {
|
|
95
|
-
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AgentRuntimeAttributes(attrs);
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
99
|
-
Error.captureStackTrace(error, this.fromAgentRuntimeAttributes);
|
|
100
|
-
}
|
|
101
|
-
throw error;
|
|
102
|
-
}
|
|
103
|
-
class ImportedBedrockAgentRuntime extends runtime_base_1.RuntimeBase {
|
|
104
|
-
agentRuntimeArn = attrs.agentRuntimeArn;
|
|
105
|
-
agentRuntimeId = attrs.agentRuntimeId;
|
|
106
|
-
agentRuntimeName = attrs.agentRuntimeName;
|
|
107
|
-
agentRuntimeVersion = attrs.agentRuntimeVersion;
|
|
108
|
-
agentStatus = attrs.agentStatus;
|
|
109
|
-
description = attrs.description;
|
|
110
|
-
createdAt = attrs.createdAt;
|
|
111
|
-
lastUpdatedAt = attrs.lastUpdatedAt;
|
|
112
|
-
role;
|
|
113
|
-
grantPrincipal;
|
|
114
|
-
constructor(s, i) {
|
|
115
|
-
super(s, i);
|
|
116
|
-
this.role = iam.Role.fromRoleArn(this, 'Role', attrs.roleArn);
|
|
117
|
-
this.grantPrincipal = this.role;
|
|
118
|
-
if (attrs.securityGroups) {
|
|
119
|
-
this._connections = new ec2.Connections({
|
|
120
|
-
securityGroups: attrs.securityGroups,
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
return new ImportedBedrockAgentRuntime(scope, id);
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* The ARN of the agent runtime
|
|
129
|
-
* @attribute
|
|
130
|
-
* @returns a token representing the ARN of this agent runtime
|
|
131
|
-
*/
|
|
132
|
-
agentRuntimeArn = __runInitializers(this, _instanceExtraInitializers);
|
|
133
|
-
/**
|
|
134
|
-
* The unique identifier of the agent runtime
|
|
135
|
-
* @attribute
|
|
136
|
-
* @returns a token representing the ID of this agent runtime
|
|
137
|
-
*/
|
|
138
|
-
agentRuntimeId;
|
|
139
|
-
/**
|
|
140
|
-
* The name of the agent runtime
|
|
141
|
-
* @attribute
|
|
142
|
-
* @returns a token representing the name of this agent runtime
|
|
143
|
-
*/
|
|
144
|
-
agentRuntimeName;
|
|
145
|
-
role;
|
|
146
|
-
/**
|
|
147
|
-
* The version of the agent runtime
|
|
148
|
-
* @attribute
|
|
149
|
-
* @returns a token representing the version of this agent runtime
|
|
150
|
-
*/
|
|
151
|
-
agentRuntimeVersion;
|
|
152
|
-
/**
|
|
153
|
-
* The status of the agent runtime
|
|
154
|
-
* @attribute
|
|
155
|
-
* @returns a token representing the status of this agent runtime
|
|
156
|
-
*/
|
|
157
|
-
agentStatus;
|
|
158
|
-
/**
|
|
159
|
-
* Optional description for the agent runtime
|
|
160
|
-
*/
|
|
161
|
-
description;
|
|
162
|
-
/**
|
|
163
|
-
* The timestamp when the agent runtime was created
|
|
164
|
-
* @attribute
|
|
165
|
-
* @returns a token representing the creation timestamp of this agent runtime
|
|
166
|
-
*/
|
|
167
|
-
createdAt;
|
|
168
|
-
/**
|
|
169
|
-
* The timestamp when the agent runtime was last updated
|
|
170
|
-
* @attribute
|
|
171
|
-
* @returns a token representing the last update timestamp of this agent runtime
|
|
172
|
-
*/
|
|
173
|
-
lastUpdatedAt;
|
|
174
|
-
grantPrincipal;
|
|
175
|
-
runtimeResource;
|
|
176
|
-
/**
|
|
177
|
-
* The artifact configuration for the agent runtime
|
|
178
|
-
*/
|
|
179
|
-
agentRuntimeArtifact;
|
|
180
|
-
networkConfiguration;
|
|
181
|
-
protocolConfiguration;
|
|
182
|
-
authorizerConfiguration;
|
|
183
|
-
constructor(scope, id, props) {
|
|
184
|
-
super(scope, id);
|
|
185
|
-
try {
|
|
186
|
-
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_RuntimeProps(props);
|
|
187
|
-
}
|
|
188
|
-
catch (error) {
|
|
189
|
-
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
190
|
-
Error.captureStackTrace(error, Runtime);
|
|
191
|
-
}
|
|
192
|
-
throw error;
|
|
193
|
-
}
|
|
194
|
-
// CDK Analytics Telemetry
|
|
195
|
-
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
196
|
-
this.agentRuntimeName = props.runtimeName;
|
|
197
|
-
this.validateRuntimeName();
|
|
198
|
-
this.description = props.description;
|
|
199
|
-
if (this.description) {
|
|
200
|
-
this.validateDescription();
|
|
201
|
-
}
|
|
202
|
-
if (props.environmentVariables) {
|
|
203
|
-
this.validateEnvironmentVariables(props.environmentVariables);
|
|
204
|
-
}
|
|
205
|
-
if (props.tags) {
|
|
206
|
-
this.validateTags(props.tags);
|
|
207
|
-
}
|
|
208
|
-
if (props.executionRole) {
|
|
209
|
-
this.role = props.executionRole;
|
|
210
|
-
if (!aws_cdk_lib_1.Token.isUnresolved(props.executionRole.roleArn)) {
|
|
211
|
-
this.validateRoleArn(props.executionRole.roleArn);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
this.role = new iam.Role(this, 'ExecutionRole', {
|
|
216
|
-
assumedBy: new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com'),
|
|
217
|
-
description: 'Execution role for Bedrock Agent Core Runtime',
|
|
218
|
-
maxSessionDuration: aws_cdk_lib_1.Duration.hours(8),
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
this.addExecutionRolePermissions();
|
|
222
|
-
this.grantPrincipal = this.role;
|
|
223
|
-
this.agentRuntimeArtifact = props.agentRuntimeArtifact;
|
|
224
|
-
// Set up network configuration with VPC support
|
|
225
|
-
this.networkConfiguration = props.networkConfiguration ?? network_configuration_1.RuntimeNetworkConfiguration.usingPublicNetwork();
|
|
226
|
-
// Set connections - create a shared connections object
|
|
227
|
-
if (this.networkConfiguration.connections) {
|
|
228
|
-
// Use the network configuration's connections as the shared object
|
|
229
|
-
this._connections = this.networkConfiguration.connections;
|
|
230
|
-
}
|
|
231
|
-
this.protocolConfiguration = props.protocolConfiguration ?? types_1.ProtocolType.HTTP;
|
|
232
|
-
this.authorizerConfiguration = props.authorizerConfiguration;
|
|
233
|
-
const cfnProps = {
|
|
234
|
-
agentRuntimeName: this.agentRuntimeName,
|
|
235
|
-
roleArn: this.role.roleArn,
|
|
236
|
-
agentRuntimeArtifact: aws_cdk_lib_1.Lazy.any({
|
|
237
|
-
produce: () => this.renderAgentRuntimeArtifact(),
|
|
238
|
-
}),
|
|
239
|
-
networkConfiguration: aws_cdk_lib_1.Lazy.any({
|
|
240
|
-
produce: () => this.networkConfiguration._render(this._connections),
|
|
241
|
-
}),
|
|
242
|
-
protocolConfiguration: aws_cdk_lib_1.Lazy.string({
|
|
243
|
-
produce: () => this.protocolConfiguration,
|
|
244
|
-
}),
|
|
245
|
-
description: props.description,
|
|
246
|
-
environmentVariables: aws_cdk_lib_1.Lazy.any({
|
|
247
|
-
produce: () => this.renderEnvironmentVariables(props.environmentVariables),
|
|
248
|
-
}),
|
|
249
|
-
tags: props.tags ?? {},
|
|
250
|
-
};
|
|
251
|
-
if (props.authorizerConfiguration) {
|
|
252
|
-
cfnProps.authorizerConfiguration = aws_cdk_lib_1.Lazy.any({
|
|
253
|
-
produce: () => this.authorizerConfiguration._render(),
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
this.runtimeResource = new bedrockagentcore.CfnRuntime(this, 'Resource', cfnProps);
|
|
257
|
-
// Add dependency on the role (for both custom and auto-created roles)
|
|
258
|
-
// This ensures the Runtime waits for the role and all its policies (including ECR permissions) to be created
|
|
259
|
-
this.runtimeResource.node.addDependency(this.role);
|
|
260
|
-
this.agentRuntimeId = this.runtimeResource.attrAgentRuntimeId;
|
|
261
|
-
this.agentRuntimeArn = this.runtimeResource.attrAgentRuntimeArn;
|
|
262
|
-
this.agentStatus = this.runtimeResource.attrStatus;
|
|
263
|
-
this.agentRuntimeVersion = this.runtimeResource.attrAgentRuntimeVersion;
|
|
264
|
-
this.createdAt = this.runtimeResource.attrCreatedAt;
|
|
265
|
-
this.lastUpdatedAt = this.runtimeResource.attrLastUpdatedAt;
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* Renders the environment variables for CloudFormation
|
|
269
|
-
* @internal
|
|
270
|
-
*/
|
|
271
|
-
renderEnvironmentVariables(envVars) {
|
|
272
|
-
if (!envVars || Object.keys(envVars).length === 0) {
|
|
273
|
-
return undefined;
|
|
274
|
-
}
|
|
275
|
-
return envVars;
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Adds proper permissions to the execution role for the agent runtime
|
|
279
|
-
* Based on: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-permissions.html
|
|
280
|
-
*/
|
|
281
|
-
addExecutionRolePermissions() {
|
|
282
|
-
const region = aws_cdk_lib_1.Stack.of(this).region;
|
|
283
|
-
const account = aws_cdk_lib_1.Stack.of(this).account;
|
|
284
|
-
// CloudWatch Logs - Log Group operations
|
|
285
|
-
this.role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
286
|
-
sid: 'LogGroupAccess',
|
|
287
|
-
effect: iam.Effect.ALLOW,
|
|
288
|
-
actions: perms_1.RUNTIME_LOGS_GROUP_ACTIONS,
|
|
289
|
-
resources: [`arn:${aws_cdk_lib_1.Stack.of(this).partition}:logs:${region}:${account}:log-group:/aws/bedrock-agentcore/runtimes/*`],
|
|
290
|
-
}));
|
|
291
|
-
// CloudWatch Logs - Describe all log groups
|
|
292
|
-
this.role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
293
|
-
sid: 'DescribeLogGroups',
|
|
294
|
-
effect: iam.Effect.ALLOW,
|
|
295
|
-
actions: perms_1.RUNTIME_LOGS_DESCRIBE_ACTIONS,
|
|
296
|
-
resources: [`arn:${aws_cdk_lib_1.Stack.of(this).partition}:logs:${region}:${account}:log-group:*`],
|
|
297
|
-
}));
|
|
298
|
-
// CloudWatch Logs - Log Stream operations
|
|
299
|
-
this.role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
300
|
-
sid: 'LogStreamAccess',
|
|
301
|
-
effect: iam.Effect.ALLOW,
|
|
302
|
-
actions: perms_1.RUNTIME_LOGS_STREAM_ACTIONS,
|
|
303
|
-
resources: [`arn:${aws_cdk_lib_1.Stack.of(this).partition}:logs:${region}:${account}:log-group:/aws/bedrock-agentcore/runtimes/*:log-stream:*`],
|
|
304
|
-
}));
|
|
305
|
-
// X-Ray Tracing - must be * for tracing
|
|
306
|
-
this.role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
307
|
-
sid: 'XRayAccess',
|
|
308
|
-
effect: iam.Effect.ALLOW,
|
|
309
|
-
actions: perms_1.RUNTIME_XRAY_ACTIONS,
|
|
310
|
-
resources: ['*'],
|
|
311
|
-
}));
|
|
312
|
-
// CloudWatch Metrics - scoped to bedrock-agentcore namespace
|
|
313
|
-
this.role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
314
|
-
sid: 'CloudWatchMetrics',
|
|
315
|
-
effect: iam.Effect.ALLOW,
|
|
316
|
-
actions: perms_1.RUNTIME_CLOUDWATCH_METRICS_ACTIONS,
|
|
317
|
-
resources: ['*'],
|
|
318
|
-
conditions: {
|
|
319
|
-
StringEquals: {
|
|
320
|
-
'cloudwatch:namespace': perms_1.RUNTIME_CLOUDWATCH_NAMESPACE,
|
|
321
|
-
},
|
|
322
|
-
},
|
|
323
|
-
}));
|
|
324
|
-
// Bedrock AgentCore Workload Identity Access
|
|
325
|
-
// Note: The agent name will be determined at runtime, so we use a wildcard pattern
|
|
326
|
-
this.role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
327
|
-
sid: 'GetAgentAccessToken',
|
|
328
|
-
effect: iam.Effect.ALLOW,
|
|
329
|
-
actions: perms_1.RUNTIME_WORKLOAD_IDENTITY_ACTIONS,
|
|
330
|
-
resources: [
|
|
331
|
-
`arn:${aws_cdk_lib_1.Stack.of(this).partition}:bedrock-agentcore:${region}:${account}:workload-identity-directory/default`,
|
|
332
|
-
`arn:${aws_cdk_lib_1.Stack.of(this).partition}:bedrock-agentcore:${region}:${account}:workload-identity-directory/default/workload-identity/*`,
|
|
333
|
-
],
|
|
334
|
-
}));
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* Renders the artifact configuration for CloudFormation
|
|
338
|
-
* @internal
|
|
339
|
-
*/
|
|
340
|
-
renderAgentRuntimeArtifact() {
|
|
341
|
-
// set permission with bind
|
|
342
|
-
this.agentRuntimeArtifact.bind(this, this);
|
|
343
|
-
const config = this.agentRuntimeArtifact._render();
|
|
344
|
-
const containerUri = config.containerUri;
|
|
345
|
-
if (containerUri) {
|
|
346
|
-
this.validateContainerUri(containerUri);
|
|
347
|
-
}
|
|
348
|
-
return {
|
|
349
|
-
containerConfiguration: {
|
|
350
|
-
containerUri: containerUri,
|
|
351
|
-
},
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
/**
|
|
355
|
-
* Validates the runtime name format
|
|
356
|
-
* Pattern: ^[a-zA-Z][a-zA-Z0-9_]{0,47}$
|
|
357
|
-
* @throws Error if validation fails
|
|
358
|
-
*/
|
|
359
|
-
validateRuntimeName() {
|
|
360
|
-
// Skip validation if the name contains CDK tokens (unresolved values)
|
|
361
|
-
if (aws_cdk_lib_1.Token.isUnresolved(this.agentRuntimeName)) {
|
|
362
|
-
return;
|
|
363
|
-
}
|
|
364
|
-
// Validate length
|
|
365
|
-
const lengthErrors = (0, validation_helpers_1.validateStringField)({
|
|
366
|
-
value: this.agentRuntimeName,
|
|
367
|
-
fieldName: 'Runtime name',
|
|
368
|
-
minLength: 1,
|
|
369
|
-
maxLength: 48,
|
|
370
|
-
});
|
|
371
|
-
// Validate pattern
|
|
372
|
-
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');
|
|
373
|
-
// Combine and throw if any errors
|
|
374
|
-
const allErrors = [...lengthErrors, ...patternErrors];
|
|
375
|
-
if (allErrors.length > 0) {
|
|
376
|
-
throw new validation_helpers_1.ValidationError(allErrors.join('\n'));
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* Validates the description format
|
|
381
|
-
* Must be between 1 and 1200 characters (per CloudFormation specification)
|
|
382
|
-
* @throws Error if validation fails
|
|
383
|
-
*/
|
|
384
|
-
validateDescription() {
|
|
385
|
-
// Skip validation if the description contains CDK tokens (unresolved values)
|
|
386
|
-
if (aws_cdk_lib_1.Token.isUnresolved(this.description)) {
|
|
387
|
-
return;
|
|
388
|
-
}
|
|
389
|
-
if (this.description) {
|
|
390
|
-
const errors = (0, validation_helpers_1.validateStringField)({
|
|
391
|
-
value: this.description,
|
|
392
|
-
fieldName: 'Description',
|
|
393
|
-
minLength: 1,
|
|
394
|
-
maxLength: 1200,
|
|
395
|
-
});
|
|
396
|
-
if (errors.length > 0) {
|
|
397
|
-
throw new validation_helpers_1.ValidationError(errors.join('\n'));
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* Validates environment variables
|
|
403
|
-
* - Maximum 50 entries
|
|
404
|
-
* - Key: 1-100 characters
|
|
405
|
-
* - Value: 0-2048 characters (per CloudFormation specification)
|
|
406
|
-
* @throws Error if validation fails
|
|
407
|
-
*/
|
|
408
|
-
validateEnvironmentVariables(envVars) {
|
|
409
|
-
const entries = Object.entries(envVars);
|
|
410
|
-
// Validate number of entries (0-50)
|
|
411
|
-
if (entries.length > 50) {
|
|
412
|
-
throw new validation_helpers_1.ValidationError(`Too many environment variables: ${entries.length}. Maximum allowed is 50`);
|
|
413
|
-
}
|
|
414
|
-
for (const [key, value] of entries) {
|
|
415
|
-
// Skip validation if key or value contains CDK tokens
|
|
416
|
-
if (aws_cdk_lib_1.Token.isUnresolved(key) || aws_cdk_lib_1.Token.isUnresolved(value)) {
|
|
417
|
-
continue;
|
|
418
|
-
}
|
|
419
|
-
// Validate key length
|
|
420
|
-
const lengthErrors = (0, validation_helpers_1.validateStringField)({
|
|
421
|
-
value: key,
|
|
422
|
-
fieldName: `Environment variable key '${key}'`,
|
|
423
|
-
minLength: 1,
|
|
424
|
-
maxLength: 100,
|
|
425
|
-
});
|
|
426
|
-
// Validate key pattern
|
|
427
|
-
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`);
|
|
428
|
-
// Combine and throw if any errors
|
|
429
|
-
const allErrors = [...lengthErrors, ...patternErrors];
|
|
430
|
-
if (allErrors.length > 0) {
|
|
431
|
-
throw new validation_helpers_1.ValidationError(allErrors.join('\n'));
|
|
432
|
-
}
|
|
433
|
-
// Validate value length (0-2048 characters per CloudFormation)
|
|
434
|
-
if (value.length > 2048) {
|
|
435
|
-
throw new validation_helpers_1.ValidationError(`Invalid environment variable value length for key '${key}': ${value.length} characters. ` +
|
|
436
|
-
'Values must not exceed 2048 characters');
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
/**
|
|
441
|
-
* Validates the tags format
|
|
442
|
-
* @param tags The tags object to validate
|
|
443
|
-
* @throws Error if validation fails
|
|
444
|
-
*/
|
|
445
|
-
validateTags(tags) {
|
|
446
|
-
// Validate each tag key and value
|
|
447
|
-
for (const [key, value] of Object.entries(tags)) {
|
|
448
|
-
// Skip validation if key or value contains CDK tokens
|
|
449
|
-
if (aws_cdk_lib_1.Token.isUnresolved(key) || aws_cdk_lib_1.Token.isUnresolved(value)) {
|
|
450
|
-
continue;
|
|
451
|
-
}
|
|
452
|
-
// Validate tag key length
|
|
453
|
-
const keyLengthErrors = (0, validation_helpers_1.validateStringField)({
|
|
454
|
-
value: key,
|
|
455
|
-
fieldName: `Tag key "${key}"`,
|
|
456
|
-
minLength: 1,
|
|
457
|
-
maxLength: 256,
|
|
458
|
-
});
|
|
459
|
-
// Validate tag key pattern
|
|
460
|
-
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 (._:/=+@-)`);
|
|
461
|
-
// Combine key errors and throw if any
|
|
462
|
-
const keyErrors = [...keyLengthErrors, ...keyPatternErrors];
|
|
463
|
-
if (keyErrors.length > 0) {
|
|
464
|
-
throw new validation_helpers_1.ValidationError(keyErrors.join('\n'));
|
|
465
|
-
}
|
|
466
|
-
if (value === undefined || value === null) {
|
|
467
|
-
throw new validation_helpers_1.ValidationError(`Tag value for key "${key}" cannot be null or undefined`);
|
|
468
|
-
}
|
|
469
|
-
// Validate tag value length
|
|
470
|
-
const valueLengthErrors = (0, validation_helpers_1.validateStringField)({
|
|
471
|
-
value: value,
|
|
472
|
-
fieldName: `Tag value for key "${key}"`,
|
|
473
|
-
minLength: 0,
|
|
474
|
-
maxLength: 256,
|
|
475
|
-
});
|
|
476
|
-
// Validate tag value pattern
|
|
477
|
-
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 (._:/=+@-)`);
|
|
478
|
-
// Combine value errors and throw if any
|
|
479
|
-
const valueErrors = [...valueLengthErrors, ...valuePatternErrors];
|
|
480
|
-
if (valueErrors.length > 0) {
|
|
481
|
-
throw new validation_helpers_1.ValidationError(valueErrors.join('\n'));
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
/**
|
|
486
|
-
* Validates the container URI format
|
|
487
|
-
*/
|
|
488
|
-
validateContainerUri(uri) {
|
|
489
|
-
// Skip validation if the URI contains CDK tokens (unresolved values)
|
|
490
|
-
if (aws_cdk_lib_1.Token.isUnresolved(uri)) {
|
|
491
|
-
// Add a warning that validation will be skipped for token-based URIs
|
|
492
|
-
aws_cdk_lib_1.Annotations.of(this).addInfo('Container URI validation skipped as it contains unresolved CDK tokens. ' +
|
|
493
|
-
'The URI will be validated at deployment time.');
|
|
494
|
-
return;
|
|
495
|
-
}
|
|
496
|
-
// Only validate if the URI is a concrete string (not a token)
|
|
497
|
-
const pattern = /^\d{12}\.dkr\.ecr\.([a-z0-9-]+)\.amazonaws\.com\/((?:[a-z0-9]+(?:[._-][a-z0-9]+)*\/)*[a-z0-9]+(?:[._-][a-z0-9]+)*)([:@]\S+)$/;
|
|
498
|
-
if (!pattern.test(uri)) {
|
|
499
|
-
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)`);
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
/**
|
|
503
|
-
* Validates the IAM role ARN format and structure
|
|
504
|
-
* @throws Error if validation fails
|
|
505
|
-
*/
|
|
506
|
-
validateRoleArn(roleArn) {
|
|
507
|
-
// Validate basic ARN format for IAM roles
|
|
508
|
-
const arnPattern = /^arn:[a-z\-]+:iam::\d{12}:role\/[a-zA-Z0-9+=,.@\-_\/]+$/;
|
|
509
|
-
if (!arnPattern.test(roleArn)) {
|
|
510
|
-
throw new validation_helpers_1.ValidationError(`Invalid IAM role ARN format: ${roleArn}. ` +
|
|
511
|
-
'Expected format: arn:<partition>:iam::<account-id>:role/<role-name> or arn:<partition>:iam::<account-id>:role/<path>/<role-name>');
|
|
512
|
-
}
|
|
513
|
-
// Parse the ARN components using CDK's Arn.split()
|
|
514
|
-
// Use SLASH_RESOURCE_NAME format for IAM roles (which use format: role/role-name or role/path/to/role-name)
|
|
515
|
-
const arnComponents = aws_cdk_lib_1.Arn.split(roleArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME);
|
|
516
|
-
if (arnComponents.service !== 'iam') {
|
|
517
|
-
throw new validation_helpers_1.ValidationError(`Invalid service in ARN: ${arnComponents.service}. Expected 'iam' for IAM role ARN.`);
|
|
518
|
-
}
|
|
519
|
-
const accountId = arnComponents.account;
|
|
520
|
-
if (!accountId || !/^\d{12}$/.test(accountId)) {
|
|
521
|
-
throw new validation_helpers_1.ValidationError(`Invalid AWS account ID in role ARN: ${accountId}. Must be a 12-digit number.`);
|
|
522
|
-
}
|
|
523
|
-
// Extract role name from resource
|
|
524
|
-
// For IAM roles, resource will be "role" and resourceName will be the role name (with optional path)
|
|
525
|
-
const resource = arnComponents.resource;
|
|
526
|
-
const resourceName = arnComponents.resourceName;
|
|
527
|
-
if (resource !== 'role') {
|
|
528
|
-
throw new validation_helpers_1.ValidationError(`Invalid resource type in ARN: ${resource}. Expected 'role' for IAM role ARN.`);
|
|
529
|
-
}
|
|
530
|
-
if (!resourceName) {
|
|
531
|
-
throw new validation_helpers_1.ValidationError('Role name is missing in the ARN');
|
|
532
|
-
}
|
|
533
|
-
else {
|
|
534
|
-
const rolePathParts = resourceName.split('/');
|
|
535
|
-
const roleName = rolePathParts[rolePathParts.length - 1];
|
|
536
|
-
if (roleName.length > 64) {
|
|
537
|
-
throw new validation_helpers_1.ValidationError(`Role name exceeds maximum length of 64 characters: ${roleName}`);
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
const stackAccount = aws_cdk_lib_1.Stack.of(this).account;
|
|
541
|
-
if (!aws_cdk_lib_1.Token.isUnresolved(stackAccount) && accountId !== stackAccount) {
|
|
542
|
-
aws_cdk_lib_1.Annotations.of(this).addWarning(`IAM role is from a different account (${accountId}) than the stack account (${stackAccount}). ` +
|
|
543
|
-
'Ensure cross-account permissions are properly configured.');
|
|
544
|
-
}
|
|
545
|
-
// Validate the region (IAM is global, so region should be empty)
|
|
546
|
-
const region = arnComponents.region;
|
|
547
|
-
const stackRegion = aws_cdk_lib_1.Stack.of(this).region;
|
|
548
|
-
if (region && region !== '' && region !== stackRegion && !aws_cdk_lib_1.Token.isUnresolved(stackRegion)) {
|
|
549
|
-
aws_cdk_lib_1.Annotations.of(this).addWarning(`IAM role ARN contains a region (${region}) that doesn't match the stack region (${stackRegion}). ` +
|
|
550
|
-
'IAM is a global service, so this might be intentional.');
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
/**
|
|
554
|
-
* Add an endpoint to this runtime
|
|
555
|
-
* This is a convenience method that creates a RuntimeEndpoint associated with this runtime
|
|
556
|
-
*
|
|
557
|
-
* @param endpointName The name of the endpoint
|
|
558
|
-
* @param options Optional configuration for the endpoint
|
|
559
|
-
* @returns The created RuntimeEndpoint
|
|
560
|
-
*/
|
|
561
|
-
addEndpoint(endpointName, options) {
|
|
562
|
-
try {
|
|
563
|
-
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AddEndpointOptions(options);
|
|
564
|
-
}
|
|
565
|
-
catch (error) {
|
|
566
|
-
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
567
|
-
Error.captureStackTrace(error, this.addEndpoint);
|
|
568
|
-
}
|
|
569
|
-
throw error;
|
|
570
|
-
}
|
|
571
|
-
// Create the endpoint (security configuration is no longer supported)
|
|
572
|
-
const endpoint = new runtime_endpoint_1.RuntimeEndpoint(this, `Endpoint${endpointName}`, {
|
|
573
|
-
endpointName: endpointName,
|
|
574
|
-
agentRuntimeId: this.agentRuntimeId,
|
|
575
|
-
agentRuntimeVersion: options?.version ?? this.agentRuntimeVersion ?? '1',
|
|
576
|
-
description: options?.description,
|
|
577
|
-
});
|
|
578
|
-
// Add dependency: endpoint must wait for runtime to be created
|
|
579
|
-
endpoint.node.addDependency(this.runtimeResource);
|
|
580
|
-
return endpoint;
|
|
581
|
-
}
|
|
582
|
-
static {
|
|
583
|
-
__runInitializers(_classThis, _classExtraInitializers);
|
|
584
|
-
}
|
|
585
|
-
};
|
|
586
|
-
return Runtime = _classThis;
|
|
587
|
-
})();
|
|
588
|
-
exports.Runtime = Runtime;
|
|
589
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsNkNBQXdGO0FBQ3hGLHFFQUFxRTtBQUNyRSwyQ0FBMkM7QUFDM0MsMkNBQTJDO0FBQzNDLDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFFMUUsbUNBUWlCO0FBR2pCLGlEQUEyRjtBQUMzRix5REFBcUQ7QUFDckQsNEVBQStFO0FBQy9FLG1DQUF1QztBQUN2Qyw2REFBa0c7QUEwRmxHOzsrRUFFK0U7QUFFL0U7Ozs7Ozs7R0FPRztJQUVVLE9BQU87NEJBRG5CLG9DQUFrQjs7OztzQkFDVSwwQkFBVzs7O3VCQUFuQixTQUFRLFdBQVc7Ozs7dUNBNmlCckMsSUFBQSxrQ0FBYyxHQUFFO1lBQ2pCLG9MQUFPLFdBQVcsNkRBZ0JqQjtZQTlqQkgsNktBK2pCQzs7Ozs7UUE5akJDLHNDQUFzQztRQUMvQixNQUFNLENBQVUscUJBQXFCLEdBQVcsOENBQThDLENBQUM7UUFFdEc7Ozs7Ozs7O1dBUUc7UUFDSSxNQUFNLENBQUMsMEJBQTBCLENBQ3RDLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUE2Qjs7Ozs7Ozs7OztZQUU3QixNQUFNLDJCQUE0QixTQUFRLDBCQUFXO2dCQUNuQyxlQUFlLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztnQkFDeEMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7Z0JBQ3RDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDMUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDO2dCQUNoRCxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztnQkFDaEMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7Z0JBQ2hDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO2dCQUM1QixhQUFhLEdB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QyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDMUMsSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLEVBQUUsSUFBSSxNQUFNLEtBQUssV0FBVyxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDMUYseUJBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUM3QixtQ0FBbUMsTUFBTSwwQ0FBMEMsV0FBVyxLQUFLO29CQUNuRyx3REFBd0QsQ0FDekQsQ0FBQztZQUNKLENBQUM7U0FDRjtRQUVEOzs7Ozs7O1dBT0c7UUFFSSxXQUFXLENBQ2hCLFlBQW9CLEVBQ3BCLE9BQTRCOzs7Ozs7Ozs7O1lBRTVCLHNFQUFzRTtZQUN0RSxNQUFNLFFBQVEsR0FBRyxJQUFJLGtDQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsWUFBWSxFQUFFLEVBQUU7Z0JBQ3BFLFlBQVksRUFBRSxZQUFZO2dCQUMxQixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0JBQ25DLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLEdBQUc7Z0JBQ3hFLFdBQVcsRUFBRSxPQUFPLEVBQUUsV0FBVzthQUNsQyxDQUFDLENBQUM7WUFFSCwrREFBK0Q7WUFDL0QsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRWxELE9BQU8sUUFBUSxDQUFDO1NBQ2pCOztZQTlqQlUsdURBQU87Ozs7O0FBQVAsMEJBQU8iLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjaywgQW5ub3RhdGlvbnMsIFRva2VuLCBBcm4sIEFybkZvcm1hdCwgTGF6eSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGJlZHJvY2thZ2VudGNvcmUgZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2thZ2VudGNvcmUnO1xuaW1wb3J0ICogYXMgZWMyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEsIE1ldGhvZE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgUlVOVElNRV9MT0dTX0dST1VQX0FDVElPTlMsXG4gIFJVTlRJTUVfTE9HU19ERVNDUklCRV9BQ1RJT05TLFxuICBSVU5USU1FX0xPR1NfU1RSRUFNX0FDVElPTlMsXG4gIFJVTlRJTUVfWFJBWV9BQ1RJT05TLFxuICBSVU5USU1FX0NMT1VEV0FUQ0hfTUVUUklDU19BQ1RJT05TLFxuICBSVU5USU1FX0NMT1VEV0FUQ0hfTkFNRVNQQUNFLFxuICBSVU5USU1FX1dPUktMT0FEX0lERU5USVRZX0FDVElPTlMsXG59IGZyb20gJy4vcGVybXMnO1xuaW1wb3J0IHsgQWdlbnRSdW50aW1lQXJ0aWZhY3QgfSBmcm9tICcuL3J1bnRpbWUtYXJ0aWZhY3QnO1xuaW1wb3J0IHsgUnVudGltZUF1dGhvcml6ZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9ydW50aW1lLWF1dGhvcml6ZXItY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBSdW50aW1lQmFzZSwgSUJlZHJvY2tBZ2VudFJ1bnRpbWUsIEFnZW50UnVudGltZUF0dHJpYnV0ZXMgfSBmcm9tICcuL3J1bnRpbWUtYmFzZSc7XG5pbXBvcnQgeyBSdW50aW1lRW5kcG9pbnQgfSBmcm9tICcuL3J1bnRpbWUtZW5kcG9pbnQnO1xuaW1wb3J0IHsgUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vbmV0d29yay9uZXR3b3JrLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgUHJvdG9jb2xUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVN0cmluZ0ZpZWxkLCBWYWxpZGF0aW9uRXJyb3IsIHZhbGlkYXRlRmllbGRQYXR0ZXJuIH0gZnJvbSAnLi92YWxpZGF0aW9uLWhlbHBlcnMnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcHNcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIEJlZHJvY2sgQWdlbnQgQ29yZSBSdW50aW1lIHJlc291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIFZhbGlkIGNoYXJhY3RlcnMgYXJlIGEteiwgQS1aLCAwLTksIF8gKHVuZGVyc2NvcmUpXG4gICAqIE11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBhbmQgY2FuIGJlIHVwIHRvIDQ4IGNoYXJhY3RlcnMgbG9uZ1xuICAgKiBQYXR0ZXJuOiBeW2EtekEtWl1bYS16QS1aMC05X117MCw0N30kXG4gICAqL1xuICByZWFkb25seSBydW50aW1lTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJ0aWZhY3QgY29uZmlndXJhdGlvbiBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQ29udGFpbnMgdGhlIGNvbnRhaW5lciBjb25maWd1cmF0aW9uIHdpdGggRUNSIFVSSVxuICAgKi9cbiAgcmVhZG9ubHkgYWdlbnRSdW50aW1lQXJ0aWZhY3Q6IEFnZW50UnVudGltZUFydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgdGhhdCBwcm92aWRlcyBwZXJtaXNzaW9ucyBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogSWYgbm90IHByb3ZpZGVkLCBhIHJvbGUgd2lsbCBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHlcbiAgICogQGRlZmF1bHQgLSBBIG5ldyByb2xlIHdpbGwgYmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uUm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogTmV0d29yayBjb25maWd1cmF0aW9uIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAZGVmYXVsdCAtIFJ1bnRpbWVOZXR3b3JrQ29uZmlndXJhdGlvbi51c2luZ1B1YmxpY05ldHdvcmsoKVxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya0NvbmZpZ3VyYXRpb24/OiBSdW50aW1lTmV0d29ya0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uXG4gICAqIExlbmd0aCBNaW5pbXVtOiAxICwgTWF4aW11bTogMTIwMFxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByb3RvY29sIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBkZWZhdWx0IC0gUHJvdG9jb2xUeXBlLkhUVFBcbiAgICovXG4gIHJlYWRvbmx5IHByb3RvY29sQ29uZmlndXJhdGlvbj86IFByb3RvY29sVHlwZTtcblxuICAvKipcbiAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiAtIE1heGltdW0gNTAgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqIC0gS2V5OiBNdXN0IGJlIDEtMTAwIGNoYXJhY3RlcnMsIHN0YXJ0IHdpdGggbGV0dGVyIG9yIHVuZGVyc2NvcmUsIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgdW5kZXJzY29yZXNcbiAgICogLSBWYWx1ZTogTXVzdCBiZSAwLTIwNDggY2hhcmFjdGVycyAocGVyIENsb3VkRm9ybWF0aW9uIHNwZWNpZmljYXRpb24pXG4gICAqIEBkZWZhdWx0IC0gTm8gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudFZhcmlhYmxlcz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIEF1dGhvcml6ZXIgY29uZmlndXJhdGlvbiBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogVXNlIFJ1bnRpbWVBdXRob3JpemVyQ29uZmlndXJhdGlvbiBzdGF0aWMgbWV0aG9kcyB0byBjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb25cbiAgICogQGRlZmF1bHQgLSBSdW50aW1lQXV0aG9yaXplckNvbmZpZ3VyYXRpb24uaWFtKCkgKElBTSBhdXRoZW50aWNhdGlvbilcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcml6ZXJDb25maWd1cmF0aW9uPzogUnVudGltZUF1dGhvcml6ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUYWdzIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBBIGxpc3Qgb2Yga2V5OnZhbHVlIHBhaXJzIG9mIHRhZ3MgdG8gYXBwbHkgdG8gdGhpcyBSdW50aW1lIHJlc291cmNlXG4gICAqIEBkZWZhdWx0IHt9IC0gbm8gdGFnc1xuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYWRkaW5nIGFuIGVuZHBvaW50IHRvIHRoZSBydW50aW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIGZvciB0aGUgZW5kcG9pbnQsIE11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMjAwIGNoYXJhY3RlcnNcbiAgICogQGRlZmF1bHQgLSBObyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgcnVudGltZSB2ZXJzaW9uIGZvciB0aGlzIGVuZHBvaW50XG4gICAqIEBkZWZhdWx0ICAxXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBCZWRyb2NrIEFnZW50IENvcmUgUnVudGltZVxuICogRW5hYmxlcyBydW5uaW5nIGNvbnRhaW5lcml6ZWQgYWdlbnRzIHdpdGggc3BlY2lmaWMgbmV0d29yayBjb25maWd1cmF0aW9ucyxcbiAqIHNlY3VyaXR5IHNldHRpbmdzLCBhbmQgcnVudGltZSBhcnRpZmFjdHMuXG4gKlxuICogQHJlc291cmNlIEFXUzo6QmVkcm9ja0FnZW50Q29yZTo6UnVudGltZVxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay1hZ2VudGNvcmUvbGF0ZXN0L2Rldmd1aWRlL3J1bnRpbWUuaHRtbFxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgUnVudGltZSBleHRlbmRzIFJ1bnRpbWVCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtYmVkcm9jay1hZ2VudGNvcmUtYWxwaGEuUnVudGltZSc7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBBZ2VudCBSdW50aW1lIHVzaW5nIGF0dHJpYnV0ZXNcbiAgICogVGhpcyBhbGxvd3MgeW91IHRvIHJlZmVyZW5jZSBhbiBBZ2VudCBSdW50aW1lIHRoYXQgd2FzIGNyZWF0ZWQgb3V0c2lkZSBvZiBDREtcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QgaWRcbiAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBleGlzdGluZyBBZ2VudCBSdW50aW1lXG4gICAqIEByZXR1cm5zIEFuIElCZWRyb2NrQWdlbnRSdW50aW1lIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgaW1wb3J0ZWQgcnVudGltZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQWdlbnRSdW50aW1lQXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IEFnZW50UnVudGltZUF0dHJpYnV0ZXMsXG4gICk6IElCZWRyb2NrQWdlbnRSdW50aW1lIHtcbiAgICBjbGFzcyBJbXBvcnRlZEJlZHJvY2tBZ2VudFJ1bnRpbWUgZXh0ZW5kcyBSdW50aW1lQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lQXJuID0gYXR0cnMuYWdlbnRSdW50aW1lQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZUlkID0gYXR0cnMuYWdlbnRSdW50aW1lSWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lTmFtZSA9IGF0dHJzLmFnZW50UnVudGltZU5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lVmVyc2lvbiA9IGF0dHJzLmFnZW50UnVudGltZVZlcnNpb247XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRTdGF0dXMgPSBhdHRycy5hZ2VudFN0YXR1cztcbiAgICAgIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbiA9IGF0dHJzLmRlc2NyaXB0aW9uO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdCA9IGF0dHJzLmNyZWF0ZWRBdDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBsYXN0VXBkYXRlZEF0ID0gYXR0cnMubGFzdFVwZGF0ZWRBdDtcblxuICAgICAgcHVibGljIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgICAgIGNvbnN0cnVjdG9yKHM6IENvbnN0cnVjdCwgaTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHMsIGkpO1xuICAgICAgICB0aGlzLnJvbGUgPSBpYW0uUm9sZS5mcm9tUm9sZUFybih0aGlzLCAnUm9sZScsIGF0dHJzLnJvbGVBcm4pO1xuICAgICAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuICAgICAgICBpZiAoYXR0cnMuc2VjdXJpdHlHcm91cHMpIHtcbiAgICAgICAgICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBlYzIuQ29ubmVjdGlvbnMoe1xuICAgICAgICAgICAgc2VjdXJpdHlHcm91cHM6IGF0dHJzLnNlY3VyaXR5R3JvdXBzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZEJlZHJvY2tBZ2VudFJ1bnRpbWUoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIEFSTiBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBJRCBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIG9mIHRoaXMgYWdlbnQgcnVudGltZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZVZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFN0YXR1cz86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBhZ2VudCBydW50aW1lIHdhcyBjcmVhdGVkXG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGNyZWF0aW9uIHRpbWVzdGFtcCBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGFnZW50IHJ1bnRpbWUgd2FzIGxhc3QgdXBkYXRlZFxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBsYXN0IHVwZGF0ZSB0aW1lc3RhbXAgb2YgdGhpcyBhZ2VudCBydW50aW1lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdD86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcbiAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lUmVzb3VyY2U6IGJlZHJvY2thZ2VudGNvcmUuQ2ZuUnVudGltZTtcbiAgLyoqXG4gICAqIFRoZSBhcnRpZmFjdCBjb25maWd1cmF0aW9uIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZUFydGlmYWN0OiBBZ2VudFJ1bnRpbWVBcnRpZmFjdDtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXR3b3JrQ29uZmlndXJhdGlvbjogUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uIDtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm90b2NvbENvbmZpZ3VyYXRpb246IFByb3RvY29sVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRob3JpemVyQ29uZmlndXJhdGlvbj86IFJ1bnRpbWVBdXRob3JpemVyQ29uZmlndXJhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUnVudGltZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVOYW1lID0gcHJvcHMucnVudGltZU5hbWU7XG4gICAgdGhpcy52YWxpZGF0ZVJ1bnRpbWVOYW1lKCk7XG5cbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb247XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudmFsaWRhdGVEZXNjcmlwdGlvbigpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcykge1xuICAgICAgdGhpcy52YWxpZGF0ZUVudmlyb25tZW50VmFyaWFibGVzKHByb3BzLmVudmlyb25tZW50VmFyaWFibGVzKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMudGFncykge1xuICAgICAgdGhpcy52YWxpZGF0ZVRhZ3MocHJvcHMudGFncyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmV4ZWN1dGlvblJvbGUpIHtcbiAgICAgIHRoaXMucm9sZSA9IHByb3BzLmV4ZWN1dGlvblJvbGU7XG4gICAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5leGVjdXRpb25Sb2xlLnJvbGVBcm4pKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVSb2xlQXJuKHByb3BzLmV4ZWN1dGlvblJvbGUucm9sZUFybik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnRXhlY3V0aW9uUm9sZScsIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2JlZHJvY2stYWdlbnRjb3JlLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdFeGVjdXRpb24gcm9sZSBmb3IgQmVkcm9jayBBZ2VudCBDb3JlIFJ1bnRpbWUnLFxuICAgICAgICBtYXhTZXNzaW9uRHVyYXRpb246IER1cmF0aW9uLmhvdXJzKDgpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuYWRkRXhlY3V0aW9uUm9sZVBlcm1pc3Npb25zKCk7XG5cbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuICAgIHRoaXMuYWdlbnRSdW50aW1lQXJ0aWZhY3QgPSBwcm9wcy5hZ2VudFJ1bnRpbWVBcnRpZmFjdDtcbiAgICAvLyBTZXQgdXAgbmV0d29yayBjb25maWd1cmF0aW9uIHdpdGggVlBDIHN1cHBvcnRcbiAgICB0aGlzLm5ldHdvcmtDb25maWd1cmF0aW9uID0gcHJvcHMubmV0d29ya0NvbmZpZ3VyYXRpb24gPz8gUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uLnVzaW5nUHVibGljTmV0d29yaygpO1xuICAgIC8vIFNldCBjb25uZWN0aW9ucyAtIGNyZWF0ZSBhIHNoYXJlZCBjb25uZWN0aW9ucyBvYmplY3RcbiAgICBpZiAodGhpcy5uZXR3b3JrQ29uZmlndXJhdGlvbi5jb25uZWN0aW9ucykge1xuICAgICAgLy8gVXNlIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24ncyBjb25uZWN0aW9ucyBhcyB0aGUgc2hhcmVkIG9iamVjdFxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMgPSB0aGlzLm5ldHdvcmtDb25maWd1cmF0aW9uLmNvbm5lY3Rpb25zO1xuICAgIH1cbiAgICB0aGlzLnByb3RvY29sQ29uZmlndXJhdGlvbiA9IHByb3BzLnByb3RvY29sQ29uZmlndXJhdGlvbiA/PyBQcm90b2NvbFR5cGUuSFRUUDtcbiAgICB0aGlzLmF1dGhvcml6ZXJDb25maWd1cmF0aW9uID0gcHJvcHMuYXV0aG9yaXplckNvbmZpZ3VyYXRpb247XG5cbiAgICBjb25zdCBjZm5Qcm9wczogYW55ID0ge1xuICAgICAgYWdlbnRSdW50aW1lTmFtZTogdGhpcy5hZ2VudFJ1bnRpbWVOYW1lLFxuICAgICAgcm9sZUFybjogdGhpcy5yb2xlLnJvbGVBcm4sXG4gICAgICBhZ2VudFJ1bnRpbWVBcnRpZmFjdDogTGF6eS5hbnkoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLnJlbmRlckFnZW50UnVudGltZUFydGlmYWN0KCksXG4gICAgICB9KSxcbiAgICAgIG5ldHdvcmtDb25maWd1cmF0aW9uOiBMYXp5LmFueSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24uX3JlbmRlcih0aGlzLl9jb25uZWN0aW9ucyksXG4gICAgICB9KSxcbiAgICAgIHByb3RvY29sQ29uZmlndXJhdGlvbjogTGF6eS5zdHJpbmcoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLnByb3RvY29sQ29uZmlndXJhdGlvbixcbiAgICAgIH0pLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IExhenkuYW55KHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gdGhpcy5yZW5kZXJFbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcyksXG4gICAgICB9KSxcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3MgPz8ge30sXG4gICAgfTtcbiAgICBpZiAocHJvcHMuYXV0aG9yaXplckNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIGNmblByb3BzLmF1dGhvcml6ZXJDb25maWd1cmF0aW9uID0gTGF6eS5hbnkoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLmF1dGhvcml6ZXJDb25maWd1cmF0aW9uIS5fcmVuZGVyKCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bnRpbWVSZXNvdXJjZSA9IG5ldyBiZWRyb2NrYWdlbnRjb3JlLkNmblJ1bnRpbWUodGhpcywgJ1Jlc291cmNlJywgY2ZuUHJvcHMgYXMgYmVkcm9ja2FnZW50Y29yZS5DZm5SdW50aW1lUHJvcHMpO1xuXG4gICAgLy8gQWRkIGRlcGVuZGVuY3kgb24gdGhlIHJvbGUgKGZvciBib3RoIGN1c3RvbSBhbmQgYXV0by1jcmVhdGVkIHJvbGVzKVxuICAgIC8vIFRoaXMgZW5zdXJlcyB0aGUgUnVudGltZSB3YWl0cyBmb3IgdGhlIHJvbGUgYW5kIGFsbCBpdHMgcG9saWNpZXMgKGluY2x1ZGluZyBFQ1IgcGVybWlzc2lvbnMpIHRvIGJlIGNyZWF0ZWRcbiAgICB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5yb2xlKTtcblxuICAgIHRoaXMuYWdlbnRSdW50aW1lSWQgPSB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5hdHRyQWdlbnRSdW50aW1lSWQ7XG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVBcm4gPSB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5hdHRyQWdlbnRSdW50aW1lQXJuO1xuICAgIHRoaXMuYWdlbnRTdGF0dXMgPSB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5hdHRyU3RhdHVzO1xuICAgIHRoaXMuYWdlbnRSdW50aW1lVmVyc2lvbiA9IHRoaXMucnVudGltZVJlc291cmNlLmF0dHJBZ2VudFJ1bnRpbWVWZXJzaW9uO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gdGhpcy5ydW50aW1lUmVzb3VyY2UuYXR0ckNyZWF0ZWRBdDtcbiAgICB0aGlzLmxhc3RVcGRhdGVkQXQgPSB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5hdHRyTGFzdFVwZGF0ZWRBdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIENsb3VkRm9ybWF0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJFbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IGFueSB7XG4gICAgaWYgKCFlbnZWYXJzIHx8IE9iamVjdC5rZXlzKGVudlZhcnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGVudlZhcnM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBwcm9wZXIgcGVybWlzc2lvbnMgdG8gdGhlIGV4ZWN1dGlvbiByb2xlIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBCYXNlZCBvbjogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlL2xhdGVzdC9kZXZndWlkZS9ydW50aW1lLXBlcm1pc3Npb25zLmh0bWxcbiAgICovXG4gIHByaXZhdGUgYWRkRXhlY3V0aW9uUm9sZVBlcm1pc3Npb25zKCkge1xuICAgIGNvbnN0IHJlZ2lvbiA9IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbjtcbiAgICBjb25zdCBhY2NvdW50ID0gU3RhY2sub2YodGhpcykuYWNjb3VudDtcblxuICAgIC8vIENsb3VkV2F0Y2ggTG9ncyAtIExvZyBHcm91cCBvcGVyYXRpb25zXG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ0xvZ0dyb3VwQWNjZXNzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfTE9HU19HUk9VUF9BQ1RJT05TLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke1N0YWNrLm9mKHRoaXMpLnBhcnRpdGlvbn06bG9nczoke3JlZ2lvbn06JHthY2NvdW50fTpsb2ctZ3JvdXA6L2F3cy9iZWRyb2NrLWFnZW50Y29yZS9ydW50aW1lcy8qYF0sXG4gICAgfSkpO1xuXG4gICAgLy8gQ2xvdWRXYXRjaCBMb2dzIC0gRGVzY3JpYmUgYWxsIGxvZyBncm91cHNcbiAgICB0aGlzLnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnRGVzY3JpYmVMb2dHcm91cHMnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogUlVOVElNRV9MT0dTX0RFU0NSSUJFX0FDVElPTlMsXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpsb2dzOiR7cmVnaW9ufToke2FjY291bnR9OmxvZy1ncm91cDoqYF0sXG4gICAgfSkpO1xuXG4gICAgLy8gQ2xvdWRXYXRjaCBMb2dzIC0gTG9nIFN0cmVhbSBvcGVyYXRpb25zXG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ0xvZ1N0cmVhbUFjY2VzcycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBSVU5USU1FX0xPR1NfU1RSRUFNX0FDVElPTlMsXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpsb2dzOiR7cmVnaW9ufToke2FjY291bnR9OmxvZy1ncm91cDovYXdzL2JlZHJvY2stYWdlbnRjb3JlL3J1bnRpbWVzLyo6bG9nLXN0cmVhbToqYF0sXG4gICAgfSkpO1xuXG4gICAgLy8gWC1SYXkgVHJhY2luZyAtIG11c3QgYmUgKiBmb3IgdHJhY2luZ1xuICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdYUmF5QWNjZXNzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfWFJBWV9BQ1RJT05TLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KSk7XG5cbiAgICAvLyBDbG91ZFdhdGNoIE1ldHJpY3MgLSBzY29wZWQgdG8gYmVkcm9jay1hZ2VudGNvcmUgbmFtZXNwYWNlXG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ0Nsb3VkV2F0Y2hNZXRyaWNzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfQ0xPVURXQVRDSF9NRVRSSUNTX0FDVElPTlMsXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAnY2xvdWR3YXRjaDpuYW1lc3BhY2UnOiBSVU5USU1FX0NMT1VEV0FUQ0hfTkFNRVNQQUNFLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSk7XG5cbiAgICAvLyBCZWRyb2NrIEFnZW50Q29yZSBXb3JrbG9hZCBJZGVudGl0eSBBY2Nlc3NcbiAgICAvLyBOb3RlOiBUaGUgYWdlbnQgbmFtZSB3aWxsIGJlIGRldGVybWluZWQgYXQgcnVudGltZSwgc28gd2UgdXNlIGEgd2lsZGNhcmQgcGF0dGVyblxuICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdHZXRBZ2VudEFjY2Vzc1Rva2VuJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfV09SS0xPQURfSURFTlRJVFlfQUNUSU9OUyxcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICBgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpiZWRyb2NrLWFnZW50Y29yZToke3JlZ2lvbn06JHthY2NvdW50fTp3b3JrbG9hZC1pZGVudGl0eS1kaXJlY3RvcnkvZGVmYXVsdGAsXG4gICAgICAgIGBhcm46JHtTdGFjay5vZih0aGlzKS5wYXJ0aXRpb259OmJlZHJvY2stYWdlbnRjb3JlOiR7cmVnaW9ufToke2FjY291bnR9Ondvcmtsb2FkLWlkZW50aXR5LWRpcmVjdG9yeS9kZWZhdWx0L3dvcmtsb2FkLWlkZW50aXR5LypgLFxuICAgICAgXSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYXJ0aWZhY3QgY29uZmlndXJhdGlvbiBmb3IgQ2xvdWRGb3JtYXRpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckFnZW50UnVudGltZUFydGlmYWN0KCk6IGFueSB7XG4gICAgLy8gc2V0IHBlcm1pc3Npb24gd2l0aCBiaW5kXG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVBcnRpZmFjdC5iaW5kKHRoaXMsIHRoaXMpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYWdlbnRSdW50aW1lQXJ0aWZhY3QuX3JlbmRlcigpO1xuICAgIGNvbnN0IGNvbnRhaW5lclVyaSA9IChjb25maWcgYXMgYW55KS5jb250YWluZXJVcmk7XG4gICAgaWYgKGNvbnRhaW5lclVyaSkge1xuICAgICAgdGhpcy52YWxpZGF0ZUNvbnRhaW5lclVyaShjb250YWluZXJVcmkpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29udGFpbmVyQ29uZmlndXJhdGlvbjoge1xuICAgICAgICBjb250YWluZXJVcmk6IGNvbnRhaW5lclVyaSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHJ1bnRpbWUgbmFtZSBmb3JtYXRcbiAgICogUGF0dGVybjogXlthLXpBLVpdW2EtekEtWjAtOV9dezAsNDd9JFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSdW50aW1lTmFtZSgpOiB2b2lkIHtcbiAgICAvLyBTa2lwIHZhbGlkYXRpb24gaWYgdGhlIG5hbWUgY29udGFpbnMgQ0RLIHRva2VucyAodW5yZXNvbHZlZCB2YWx1ZXMpXG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLmFnZW50UnVudGltZU5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbGVuZ3RoXG4gICAgY29uc3QgbGVuZ3RoRXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICB2YWx1ZTogdGhpcy5hZ2VudFJ1bnRpbWVOYW1lLFxuICAgICAgZmllbGROYW1lOiAnUnVudGltZSBuYW1lJyxcbiAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgIG1heExlbmd0aDogNDgsXG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBwYXR0ZXJuXG4gICAgY29uc3QgcGF0dGVybkVycm9ycyA9IHZhbGlkYXRlRmllbGRQYXR0ZXJuKFxuICAgICAgdGhpcy5hZ2VudFJ1bnRpbWVOYW1lLFxuICAgICAgJ1J1bnRpbWUgbmFtZScsXG4gICAgICAvXlthLXpBLVpdW2EtekEtWjAtOV9dezAsNDd9JC8sXG4gICAgICAnUnVudGltZSBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBhbmQgY29udGFpbiBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGFuZCB1bmRlcnNjb3JlcycsXG4gICAgKTtcblxuICAgIC8vIENvbWJpbmUgYW5kIHRocm93IGlmIGFueSBlcnJvcnNcbiAgICBjb25zdCBhbGxFcnJvcnMgPSBbLi4ubGVuZ3RoRXJyb3JzLCAuLi5wYXR0ZXJuRXJyb3JzXTtcbiAgICBpZiAoYWxsRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYWxsRXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBkZXNjcmlwdGlvbiBmb3JtYXRcbiAgICogTXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEyMDAgY2hhcmFjdGVycyAocGVyIENsb3VkRm9ybWF0aW9uIHNwZWNpZmljYXRpb24pXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZURlc2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIC8vIFNraXAgdmFsaWRhdGlvbiBpZiB0aGUgZGVzY3JpcHRpb24gY29udGFpbnMgQ0RLIHRva2VucyAodW5yZXNvbHZlZCB2YWx1ZXMpXG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLmRlc2NyaXB0aW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgICAgdmFsdWU6IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAgIGZpZWxkTmFtZTogJ0Rlc2NyaXB0aW9uJyxcbiAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICBtYXhMZW5ndGg6IDEyMDAsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKiAtIE1heGltdW0gNTAgZW50cmllc1xuICAgKiAtIEtleTogMS0xMDAgY2hhcmFjdGVyc1xuICAgKiAtIFZhbHVlOiAwLTIwNDggY2hhcmFjdGVycyAocGVyIENsb3VkRm9ybWF0aW9uIHNwZWNpZmljYXRpb24pXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUVudmlyb25tZW50VmFyaWFibGVzKGVudlZhcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZW52VmFycyk7XG5cbiAgICAvLyBWYWxpZGF0ZSBudW1iZXIgb2YgZW50cmllcyAoMC01MClcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPiA1MCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYFRvbyBtYW55IGVudmlyb25tZW50IHZhcmlhYmxlczogJHtlbnRyaWVzLmxlbmd0aH0uIE1heGltdW0gYWxsb3dlZCBpcyA1MGAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgIC8vIFNraXAgdmFsaWRhdGlvbiBpZiBrZXkgb3IgdmFsdWUgY29udGFpbnMgQ0RLIHRva2Vuc1xuICAgICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChrZXkpIHx8IFRva2VuLmlzVW5yZXNvbHZlZCh2YWx1ZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGtleSBsZW5ndGhcbiAgICAgIGNvbnN0IGxlbmd0aEVycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgICB2YWx1ZToga2V5LFxuICAgICAgICBmaWVsZE5hbWU6IGBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgJyR7a2V5fSdgLFxuICAgICAgICBtaW5MZW5ndGg6IDEsXG4gICAgICAgIG1heExlbmd0aDogMTAwLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIGtleSBwYXR0ZXJuXG4gICAgICBjb25zdCBwYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICAgIGtleSxcbiAgICAgICAgYEVudmlyb25tZW50IHZhcmlhYmxlIGtleSAnJHtrZXl9J2AsXG4gICAgICAgIC9eW2EtekEtWl9dW2EtekEtWjAtOV9dKiQvLFxuICAgICAgICBgRW52aXJvbm1lbnQgdmFyaWFibGUga2V5ICcke2tleX0nIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBvciB1bmRlcnNjb3JlIGFuZCBjb250YWluIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIHVuZGVyc2NvcmVzYCxcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbWJpbmUgYW5kIHRocm93IGlmIGFueSBlcnJvcnNcbiAgICAgIGNvbnN0IGFsbEVycm9ycyA9IFsuLi5sZW5ndGhFcnJvcnMsIC4uLnBhdHRlcm5FcnJvcnNdO1xuICAgICAgaWYgKGFsbEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYWxsRXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgdmFsdWUgbGVuZ3RoICgwLTIwNDggY2hhcmFjdGVycyBwZXIgQ2xvdWRGb3JtYXRpb24pXG4gICAgICBpZiAodmFsdWUubGVuZ3RoID4gMjA0OCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlIGxlbmd0aCBmb3Iga2V5ICcke2tleX0nOiAke3ZhbHVlLmxlbmd0aH0gY2hhcmFjdGVycy4gYCArXG4gICAgICAgICAgJ1ZhbHVlcyBtdXN0IG5vdCBleGNlZWQgMjA0OCBjaGFyYWN0ZXJzJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSB0YWdzIGZvcm1hdFxuICAgKiBAcGFyYW0gdGFncyBUaGUgdGFncyBvYmplY3QgdG8gdmFsaWRhdGVcbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVGFncyh0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgZWFjaCB0YWcga2V5IGFuZCB2YWx1ZVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ3MpKSB7XG4gICAgICAvLyBTa2lwIHZhbGlkYXRpb24gaWYga2V5IG9yIHZhbHVlIGNvbnRhaW5zIENESyB0b2tlbnNcbiAgICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoa2V5KSB8fCBUb2tlbi5pc1VucmVzb2x2ZWQodmFsdWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB0YWcga2V5IGxlbmd0aFxuICAgICAgY29uc3Qga2V5TGVuZ3RoRXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgIGZpZWxkTmFtZTogYFRhZyBrZXkgXCIke2tleX1cImAsXG4gICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgbWF4TGVuZ3RoOiAyNTYsXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUgdGFnIGtleSBwYXR0ZXJuXG4gICAgICBjb25zdCBrZXlQYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICAgIGtleSxcbiAgICAgICAgYFRhZyBrZXkgXCIke2tleX1cImAsXG4gICAgICAgIC9eW2EtekEtWjAtOVxccy5fOi89K0AtXSokLyxcbiAgICAgICAgYFRhZyBrZXkgXCIke2tleX1cIiBjYW4gb25seSBjb250YWluIGxldHRlcnMgKGEteiwgQS1aKSwgbnVtYmVycyAoMC05KSwgc3BhY2VzLCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzICguXzovPStALSlgLFxuICAgICAgKTtcblxuICAgICAgLy8gQ29tYmluZSBrZXkgZXJyb3JzIGFuZCB0aHJvdyBpZiBhbnlcbiAgICAgIGNvbnN0IGtleUVycm9ycyA9IFsuLi5rZXlMZW5ndGhFcnJvcnMsIC4uLmtleVBhdHRlcm5FcnJvcnNdO1xuICAgICAgaWYgKGtleUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5RXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVGFnIHZhbHVlIGZvciBrZXkgXCIke2tleX1cIiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWRgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgdGFnIHZhbHVlIGxlbmd0aFxuICAgICAgY29uc3QgdmFsdWVMZW5ndGhFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBmaWVsZE5hbWU6IGBUYWcgdmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiYCxcbiAgICAgICAgbWluTGVuZ3RoOiAwLFxuICAgICAgICBtYXhMZW5ndGg6IDI1NixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0YWcgdmFsdWUgcGF0dGVyblxuICAgICAgY29uc3QgdmFsdWVQYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBgVGFnIHZhbHVlIGZvciBrZXkgXCIke2tleX1cImAsXG4gICAgICAgIC9eW2EtekEtWjAtOVxccy5fOi89K0AtXSokLyxcbiAgICAgICAgYFRhZyB2YWx1ZSBmb3Iga2V5IFwiJHtrZXl9XCIgY2FuIG9ubHkgY29udGFpbiBsZXR0ZXJzIChhLXosIEEtWiksIG51bWJlcnMgKDAtOSksIHNwYWNlcywgYW5kIHNwZWNpYWwgY2hhcmFjdGVycyAoLl86Lz0rQC0pYCxcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbWJpbmUgdmFsdWUgZXJyb3JzIGFuZCB0aHJvdyBpZiBhbnlcbiAgICAgIGNvbnN0IHZhbHVlRXJyb3JzID0gWy4uLnZhbHVlTGVuZ3RoRXJyb3JzLCAuLi52YWx1ZVBhdHRlcm5FcnJvcnNdO1xuICAgICAgaWYgKHZhbHVlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcih2YWx1ZUVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgY29udGFpbmVyIFVSSSBmb3JtYXRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVDb250YWluZXJVcmkodXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBTa2lwIHZhbGlkYXRpb24gaWYgdGhlIFVSSSBjb250YWlucyBDREsgdG9rZW5zICh1bnJlc29sdmVkIHZhbHVlcylcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHVyaSkpIHtcbiAgICAgIC8vIEFkZCBhIHdhcm5pbmcgdGhhdCB2YWxpZGF0aW9uIHdpbGwgYmUgc2tpcHBlZCBmb3IgdG9rZW4tYmFzZWQgVVJJc1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkSW5mbyhcbiAgICAgICAgJ0NvbnRhaW5lciBVUkkgdmFsaWRhdGlvbiBza2lwcGVkIGFzIGl0IGNvbnRhaW5zIHVucmVzb2x2ZWQgQ0RLIHRva2Vucy4gJyArXG4gICAgICAgICdUaGUgVVJJIHdpbGwgYmUgdmFsaWRhdGVkIGF0IGRlcGxveW1lbnQgdGltZS4nLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHZhbGlkYXRlIGlmIHRoZSBVUkkgaXMgYSBjb25jcmV0ZSBzdHJpbmcgKG5vdCBhIHRva2VuKVxuICAgIGNvbnN0IHBhdHRlcm4gPSAvXlxcZHsxMn1cXC5ka3JcXC5lY3JcXC4oW2EtejAtOS1dKylcXC5hbWF6b25hd3NcXC5jb21cXC8oKD86W2EtejAtOV0rKD86Wy5fLV1bYS16MC05XSspKlxcLykqW2EtejAtOV0rKD86Wy5fLV1bYS16MC05XSspKikoWzpAXVxcUyspJC87XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QodXJpKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYEludmFsaWQgY29udGFpbmVyIFVSSSBmb3JtYXQ6ICR7dXJpfS4gTXVzdCBiZSBhIHZhbGlkIEVDUiBVUkkgKGUuZy4sIDEyMzQ1Njc4OTAxMi5ka3IuZWNyLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tL215LWFnZW50OmxhdGVzdClgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBJQU0gcm9sZSBBUk4gZm9ybWF0IGFuZCBzdHJ1Y3R1cmVcbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUm9sZUFybihyb2xlQXJuOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSBiYXNpYyBBUk4gZm9ybWF0IGZvciBJQU0gcm9sZXNcbiAgICBjb25zdCBhcm5QYXR0ZXJuID0gL15hcm46W2EtelxcLV0rOmlhbTo6XFxkezEyfTpyb2xlXFwvW2EtekEtWjAtOSs9LC5AXFwtX1xcL10rJC87XG4gICAgaWYgKCFhcm5QYXR0ZXJuLnRlc3Qocm9sZUFybikpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgSUFNIHJvbGUgQVJOIGZvcm1hdDogJHtyb2xlQXJufS4gYCArXG4gICdFeHBlY3RlZCBmb3JtYXQ6IGFybjo8cGFydGl0aW9uPjppYW06OjxhY2NvdW50LWlkPjpyb2xlLzxyb2xlLW5hbWU+IG9yIGFybjo8cGFydGl0aW9uPjppYW06OjxhY2NvdW50LWlkPjpyb2xlLzxwYXRoPi88cm9sZS1uYW1lPicpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIHRoZSBBUk4gY29tcG9uZW50cyB1c2luZyBDREsncyBBcm4uc3BsaXQoKVxuICAgIC8vIFVzZSBTTEFTSF9SRVNPVVJDRV9OQU1FIGZvcm1hdCBmb3IgSUFNIHJvbGVzICh3aGljaCB1c2UgZm9ybWF0OiByb2xlL3JvbGUtbmFtZSBvciByb2xlL3BhdGgvdG8vcm9sZS1uYW1lKVxuICAgIGNvbnN0IGFybkNvbXBvbmVudHMgPSBBcm4uc3BsaXQocm9sZUFybiwgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpO1xuXG4gICAgaWYgKGFybkNvbXBvbmVudHMuc2VydmljZSAhPT0gJ2lhbScpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgc2VydmljZSBpbiBBUk46ICR7YXJuQ29tcG9uZW50cy5zZXJ2aWNlfS4gRXhwZWN0ZWQgJ2lhbScgZm9yIElBTSByb2xlIEFSTi5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY2NvdW50SWQgPSBhcm5Db21wb25lbnRzLmFjY291bnQ7XG4gICAgaWYgKCFhY2NvdW50SWQgfHwgIS9eXFxkezEyfSQvLnRlc3QoYWNjb3VudElkKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCBBV1MgYWNjb3VudCBJRCBpbiByb2xlIEFSTjogJHthY2NvdW50SWR9LiBNdXN0IGJlIGEgMTItZGlnaXQgbnVtYmVyLmApO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3Qgcm9sZSBuYW1lIGZyb20gcmVzb3VyY2VcbiAgICAvLyBGb3IgSUFNIHJvbGVzLCByZXNvdXJjZSB3aWxsIGJlIFwicm9sZVwiIGFuZCByZXNvdXJjZU5hbWUgd2lsbCBiZSB0aGUgcm9sZSBuYW1lICh3aXRoIG9wdGlvbmFsIHBhdGgpXG4gICAgY29uc3QgcmVzb3VyY2UgPSBhcm5Db21wb25lbnRzLnJlc291cmNlO1xuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGFybkNvbXBvbmVudHMucmVzb3VyY2VOYW1lO1xuXG4gICAgaWYgKHJlc291cmNlICE9PSAncm9sZScpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgcmVzb3VyY2UgdHlwZSBpbiBBUk46ICR7cmVzb3VyY2V9LiBFeHBlY3RlZCAncm9sZScgZm9yIElBTSByb2xlIEFSTi5gKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc291cmNlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignUm9sZSBuYW1lIGlzIG1pc3NpbmcgaW4gdGhlIEFSTicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByb2xlUGF0aFBhcnRzID0gcmVzb3VyY2VOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCByb2xlTmFtZSA9IHJvbGVQYXRoUGFydHNbcm9sZVBhdGhQYXJ0cy5sZW5ndGggLSAxXTtcblxuICAgICAgaWYgKHJvbGVOYW1lLmxlbmd0aCA+IDY0KSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYFJvbGUgbmFtZSBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mIDY0IGNoYXJhY3RlcnM6ICR7cm9sZU5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhY2tBY2NvdW50ID0gU3RhY2sub2YodGhpcykuYWNjb3VudDtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChzdGFja0FjY291bnQpICYmIGFjY291bnRJZCAhPT0gc3RhY2tBY2NvdW50KSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nKFxuICAgICAgICBgSUFNIHJvbGUgaXMgZnJvbSBhIGRpZmZlcmVudCBhY2NvdW50ICgke2FjY291bnRJZH0pIHRoYW4gdGhlIHN0YWNrIGFjY291bnQgKCR7c3RhY2tBY2NvdW50fSkuIGAgK1xuICAgICAgICAnRW5zdXJlIGNyb3NzLWFjY291bnQgcGVybWlzc2lvbnMgYXJlIHByb3Blcmx5IGNvbmZpZ3VyZWQuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJlZ2lvbiAoSUFNIGlzIGdsb2JhbCwgc28gcmVnaW9uIHNob3VsZCBiZSBlbXB0eSlcbiAgICBjb25zdCByZWdpb24gPSBhcm5Db21wb25lbnRzLnJlZ2lvbjtcbiAgICBjb25zdCBzdGFja1JlZ2lvbiA9IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbjtcbiAgICBpZiAocmVnaW9uICYmIHJlZ2lvbiAhPT0gJycgJiYgcmVnaW9uICE9PSBzdGFja1JlZ2lvbiAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHN0YWNrUmVnaW9uKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhcbiAgICAgICAgYElBTSByb2xlIEFSTiBjb250YWlucyBhIHJlZ2lvbiAoJHtyZWdpb259KSB0aGF0IGRvZXNuJ3QgbWF0Y2ggdGhlIHN0YWNrIHJlZ2lvbiAoJHtzdGFja1JlZ2lvbn0pLiBgICtcbiAgICAgICAgJ0lBTSBpcyBhIGdsb2JhbCBzZXJ2aWNlLCBzbyB0aGlzIG1pZ2h0IGJlIGludGVudGlvbmFsLicsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZW5kcG9pbnQgdG8gdGhpcyBydW50aW1lXG4gICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgUnVudGltZUVuZHBvaW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJ1bnRpbWVcbiAgICpcbiAgICogQHBhcmFtIGVuZHBvaW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZW5kcG9pbnRcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGVuZHBvaW50XG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIFJ1bnRpbWVFbmRwb2ludFxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGFkZEVuZHBvaW50KFxuICAgIGVuZHBvaW50TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBBZGRFbmRwb2ludE9wdGlvbnMsXG4gICk6IFJ1bnRpbWVFbmRwb2ludCB7XG4gICAgLy8gQ3JlYXRlIHRoZSBlbmRwb2ludCAoc2VjdXJpdHkgY29uZmlndXJhdGlvbiBpcyBubyBsb25nZXIgc3VwcG9ydGVkKVxuICAgIGNvbnN0IGVuZHBvaW50ID0gbmV3IFJ1bnRpbWVFbmRwb2ludCh0aGlzLCBgRW5kcG9pbnQke2VuZHBvaW50TmFtZX1gLCB7XG4gICAgICBlbmRwb2ludE5hbWU6IGVuZHBvaW50TmFtZSxcbiAgICAgIGFnZW50UnVudGltZUlkOiB0aGlzLmFnZW50UnVudGltZUlkLFxuICAgICAgYWdlbnRSdW50aW1lVmVyc2lvbjogb3B0aW9ucz8udmVyc2lvbiA/PyB0aGlzLmFnZW50UnVudGltZVZlcnNpb24gPz8gJzEnLFxuICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnM/LmRlc2NyaXB0aW9uLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIGRlcGVuZGVuY3k6IGVuZHBvaW50IG11c3Qgd2FpdCBmb3IgcnVudGltZSB0byBiZSBjcmVhdGVkXG4gICAgZW5kcG9pbnQubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMucnVudGltZVJlc291cmNlKTtcblxuICAgIHJldHVybiBlbmRwb2ludDtcbiAgfVxufVxuIl19
|