@aws-cdk/aws-bedrock-agentcore-alpha
Version:
The CDK Construct Library for Amazon Bedrock
521 lines • 65.7 kB
JavaScript
"use strict";
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
var useValue = arguments.length > 2;
for (var i = 0; i < initializers.length; i++) {
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
}
return useValue ? value : void 0;
};
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
var _, done = false;
for (var i = decorators.length - 1; i >= 0; i--) {
var context = {};
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
if (kind === "accessor") {
if (result === void 0) continue;
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
if (_ = accept(result.get)) descriptor.get = _;
if (_ = accept(result.set)) descriptor.set = _;
if (_ = accept(result.init)) initializers.unshift(_);
}
else if (_ = accept(result)) {
if (kind === "field") initializers.unshift(_);
else descriptor[key] = _;
}
}
if (target) Object.defineProperty(target, contextIn.name, descriptor);
done = true;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Gateway = void 0;
const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const bedrockagentcore = require("aws-cdk-lib/aws-bedrockagentcore");
const cognito = require("aws-cdk-lib/aws-cognito");
const iam = require("aws-cdk-lib/aws-iam");
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
// Internal imports
const gateway_base_1 = require("./gateway-base");
const authorizer_1 = require("./inbound-auth/authorizer");
const perms_1 = require("./perms");
const protocol_1 = require("./protocol");
const target_1 = require("./targets/target");
const validation_helpers_1 = require("./validation-helpers");
/******************************************************************************
* Class
*****************************************************************************/
/**
* Gateway resource for AWS Bedrock Agent Core.
* Serves as an integration point between your agent and external services.
*
* @resource AWS::BedrockAgentCore::Gateway
* @see https://docs.aws.amazon.com/bedrock-agentcore-control/latest/APIReference/API_CreateGateway.html
*/
let Gateway = (() => {
let _classDecorators = [prop_injectable_1.propertyInjectable];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
let _classSuper = gateway_base_1.GatewayBase;
let _instanceExtraInitializers = [];
let _addLambdaTarget_decorators;
let _addOpenApiTarget_decorators;
let _addSmithyTarget_decorators;
let _addMcpServerTarget_decorators;
var Gateway = class extends _classSuper {
static { _classThis = this; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
_addLambdaTarget_decorators = [(0, metadata_resource_1.MethodMetadata)()];
_addOpenApiTarget_decorators = [(0, metadata_resource_1.MethodMetadata)()];
_addSmithyTarget_decorators = [(0, metadata_resource_1.MethodMetadata)()];
_addMcpServerTarget_decorators = [(0, metadata_resource_1.MethodMetadata)()];
__esDecorate(this, null, _addLambdaTarget_decorators, { kind: "method", name: "addLambdaTarget", static: false, private: false, access: { has: obj => "addLambdaTarget" in obj, get: obj => obj.addLambdaTarget }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(this, null, _addOpenApiTarget_decorators, { kind: "method", name: "addOpenApiTarget", static: false, private: false, access: { has: obj => "addOpenApiTarget" in obj, get: obj => obj.addOpenApiTarget }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(this, null, _addSmithyTarget_decorators, { kind: "method", name: "addSmithyTarget", static: false, private: false, access: { has: obj => "addSmithyTarget" in obj, get: obj => obj.addSmithyTarget }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(this, null, _addMcpServerTarget_decorators, { kind: "method", name: "addMcpServerTarget", static: false, private: false, access: { has: obj => "addMcpServerTarget" in obj, get: obj => obj.addMcpServerTarget }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
Gateway = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
}
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.Gateway", version: "2.227.0-alpha.0" };
/** Uniquely identifies this class. */
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.Gateway';
/**
* Import an existing Gateway using its attributes
*
* @param scope The construct scope
* @param id The construct id
* @param attrs The attributes of the existing Gateway
* @returns An IGateway instance representing the imported gateway
*/
static fromGatewayAttributes(scope, id, attrs) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_GatewayAttributes(attrs);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.fromGatewayAttributes);
}
throw error;
}
class ImportedGateway extends gateway_base_1.GatewayBase {
gatewayArn = attrs.gatewayArn;
gatewayId = attrs.gatewayId;
name = attrs.gatewayName;
description = undefined;
protocolConfiguration;
authorizerConfiguration;
exceptionLevel = undefined;
kmsKey = undefined;
role = attrs.role;
gatewayUrl = undefined;
status = undefined;
statusReason = undefined;
createdAt = undefined;
updatedAt = undefined;
constructor(s, i) {
super(s, i);
// Create placeholder protocol and authorizer configurations
this.protocolConfiguration = new protocol_1.McpProtocolConfiguration({
supportedVersions: [protocol_1.MCPProtocolVersion.MCP_2025_03_26],
searchType: protocol_1.McpGatewaySearchType.SEMANTIC,
instructions: 'Imported gateway',
});
this.authorizerConfiguration = authorizer_1.GatewayAuthorizer.usingAwsIam();
}
}
return new ImportedGateway(scope, id);
}
/**
* The ARN of the gateway
* @attribute
*/
gatewayArn = __runInitializers(this, _instanceExtraInitializers);
/**
* The unique identifier of the gateway
* @attribute
*/
gatewayId;
/**
* The name of the gateway
*/
name;
/**
* The description of the gateway
*/
description;
/**
* The protocol configuration for the gateway
*/
protocolConfiguration;
/**
* The authorizer configuration for the gateway
*/
authorizerConfiguration;
/**
* The exception level for the gateway
*/
exceptionLevel;
/**
* The KMS key used for encryption
*/
kmsKey;
/**
* The IAM role for the gateway
*/
role;
/**
* The URL endpoint for the gateway
* @attribute
*/
gatewayUrl;
/**
* The status of the gateway
* @attribute
*/
status;
/**
* The status reasons for the gateway
* @attribute
*/
statusReason;
/**
* Timestamp when the gateway was created
* @attribute
*/
createdAt;
/**
* Timestamp when the gateway was last updated
* @attribute
*/
updatedAt;
/**
* Tags applied to the gateway
*/
tags;
/**
* The Cognito User Pool created for the gateway (if using default Cognito authorizer)
*/
userPool;
/**
* The Cognito User Pool Client created for the gateway (if using default Cognito authorizer)
*/
userPoolClient;
constructor(scope, id, props) {
super(scope, id);
try {
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_GatewayProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, Gateway);
}
throw error;
}
// Enhanced CDK Analytics Telemetry
(0, metadata_resource_1.addConstructMetadata)(this, props);
// ------------------------------------------------------
// Assignments
// ------------------------------------------------------
this.name = props.gatewayName;
this.validateGatewayName(this.name);
this.description = props.description;
if (this.description) {
this.validateDescription(this.description);
}
this.kmsKey = props.kmsKey;
this.role = props.role ?? this.createGatewayRole();
if (this.kmsKey && this.role) {
this.kmsKey.grantEncryptDecrypt(this.role);
}
this.protocolConfiguration = props.protocolConfiguration ?? this.createDefaultMcpProtocolConfiguration();
this.authorizerConfiguration = props.authorizerConfiguration ?? this.createDefaultCognitoAuthorizerConfig();
this.exceptionLevel = props.exceptionLevel;
this.tags = props.tags ?? {};
// ------------------------------------------------------
// L1 Instantiation
// ------------------------------------------------------
const _resource = new bedrockagentcore.CfnGateway(this, 'Resource', {
authorizerConfiguration: this.authorizerConfiguration._render(),
authorizerType: this.authorizerConfiguration.authorizerType,
description: this.description,
exceptionLevel: this.exceptionLevel,
kmsKeyArn: this.kmsKey?.keyArn,
name: this.name,
protocolConfiguration: this.protocolConfiguration._render(),
protocolType: this.protocolConfiguration.protocolType,
roleArn: this.role?.roleArn,
tags: this.tags,
});
this.gatewayId = _resource.attrGatewayIdentifier;
this.gatewayArn = _resource.attrGatewayArn;
this.gatewayUrl = _resource.attrGatewayUrl;
this.status = _resource.attrStatus;
this.createdAt = _resource.attrCreatedAt;
this.updatedAt = _resource.attrUpdatedAt;
this.statusReason = _resource.attrStatusReasons;
}
/**
* Add a Lambda target to this gateway
* This is a convenience method that creates a GatewayTarget associated with this gateway
*
* @param id The construct id for the target
* @param props Properties for the Lambda target
* @returns The created GatewayTarget
*/
addLambdaTarget(id, props) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AddLambdaTargetOptions(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.addLambdaTarget);
}
throw error;
}
// Lambda invoke permissions are automatically granted in LambdaTargetConfiguration.bind()
// Build target props, conditionally including credentials if array has items
const targetProps = {
gatewayTargetName: props.gatewayTargetName,
description: props.description,
gateway: this,
lambdaFunction: props.lambdaFunction,
toolSchema: props.toolSchema,
...(props.credentialProviderConfigurations && props.credentialProviderConfigurations.length > 0
? { credentialProviderConfigurations: props.credentialProviderConfigurations }
: {}),
};
const target = target_1.GatewayTarget.forLambda(this, id, targetProps);
return target;
}
/**
* Add an OpenAPI target to this gateway
* This is a convenience method that creates a GatewayTarget associated with this gateway
*
* @param id The construct id for the target
* @param props Properties for the OpenAPI target
* @returns The created GatewayTarget
*/
addOpenApiTarget(id, props) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AddOpenApiTargetOptions(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.addOpenApiTarget);
}
throw error;
}
const target = target_1.GatewayTarget.forOpenApi(this, id, {
gatewayTargetName: props.gatewayTargetName,
description: props.description,
gateway: this,
apiSchema: props.apiSchema,
validateOpenApiSchema: props.validateOpenApiSchema,
credentialProviderConfigurations: props.credentialProviderConfigurations,
});
return target;
}
/**
* Add a Smithy target to this gateway
* This is a convenience method that creates a GatewayTarget associated with this gateway
*
* @param id The construct id for the target
* @param props Properties for the Smithy target
* @returns The created GatewayTarget
*/
addSmithyTarget(id, props) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AddSmithyTargetOptions(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.addSmithyTarget);
}
throw error;
}
// Build target props, conditionally including credentials if array has items
const targetProps = {
gatewayTargetName: props.gatewayTargetName,
description: props.description,
gateway: this,
smithyModel: props.smithyModel,
...(props.credentialProviderConfigurations && props.credentialProviderConfigurations.length > 0
? { credentialProviderConfigurations: props.credentialProviderConfigurations }
: {}),
};
const target = target_1.GatewayTarget.forSmithy(this, id, targetProps);
return target;
}
/**
* Add an MCP server target to this gateway
* This is a convenience method that creates a GatewayTarget associated with this gateway
*
* @param id The construct id for the target
* @param props Properties for the MCP server target
* @returns The created GatewayTarget
* @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-MCPservers.html
*/
addMcpServerTarget(id, props) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AddMcpServerTargetOptions(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.addMcpServerTarget);
}
throw error;
}
// Build target props, conditionally including credentials if array has items
const targetProps = {
gatewayTargetName: props.gatewayTargetName,
description: props.description,
gateway: this,
endpoint: props.endpoint,
...(props.credentialProviderConfigurations && props.credentialProviderConfigurations.length > 0
? { credentialProviderConfigurations: props.credentialProviderConfigurations }
: {}),
};
const target = target_1.GatewayTarget.forMcpServer(this, id, targetProps);
return target;
}
/**
* Creates the service role for the gateway to assume
*
* The service role starts with minimal permissions. Additional permissions
* are added automatically when targets are configured:
* - KMS encryption: Automatically grants encrypt/decrypt permissions
*
* For other target types, manually grant permissions using standard CDK grant methods:
* @internal
*/
createGatewayRole() {
const role = new iam.Role(this, 'ServiceRole', {
assumedBy: new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com'),
description: `Service role for Bedrock AgentCore Gateway ${this.name}`,
});
const region = aws_cdk_lib_1.Stack.of(this).region;
const account = aws_cdk_lib_1.Stack.of(this).account;
const partition = aws_cdk_lib_1.Stack.of(this).partition;
// This restricts role assumption to the specific gateway resource only in this account,
// preventing other accounts from assuming this role.
// See:https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-prerequisites-permissions.html#gateway-service-role-permissions
role.assumeRolePolicy?.addStatements(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
principals: [new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com')],
actions: perms_1.GatewayPerms.ASSUME_ROLE,
conditions: {
StringEquals: {
'aws:SourceAccount': account,
},
ArnLike: {
'aws:SourceArn': `arn:${partition}:bedrock-agentcore:${region}:${account}:gateway/${this.name}*`,
},
},
}));
if (this.kmsKey) {
role.addToPolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: perms_1.GatewayPerms.KMS_KEY_PERMS,
resources: [this.kmsKey.keyArn],
}));
}
return role;
}
/**
* Validates the gateway name format
* Pattern: ^([0-9a-zA-Z][-]?){1,100}$
* Max length: 48 characters
* @param name The gateway name to validate
* @throws Error if the name is invalid
* @internal
*/
validateGatewayName(name) {
if (aws_cdk_lib_1.Token.isUnresolved(name)) {
return;
}
const lengthErrors = (0, validation_helpers_1.validateStringField)({
value: name,
minLength: 1,
maxLength: 48,
fieldName: 'Gateway name',
});
if (lengthErrors.length > 0) {
throw new validation_helpers_1.ValidationError(lengthErrors.join('\n'));
}
const patternErrors = (0, validation_helpers_1.validateFieldPattern)(name, 'Gateway name', /^([0-9a-zA-Z][-]?){1,100}$/, 'Gateway name must contain only alphanumeric characters and hyphens, with hyphens only between characters');
if (patternErrors.length > 0) {
throw new validation_helpers_1.ValidationError(patternErrors.join('\n'));
}
}
/**
* Validates the description format
* Max length: 200 characters
* @param description The description to validate
* @throws Error if validation fails
* @internal
*/
validateDescription(description) {
if (aws_cdk_lib_1.Token.isUnresolved(description)) {
return;
}
const errors = (0, validation_helpers_1.validateStringField)({
value: description,
minLength: 1,
maxLength: 200,
fieldName: 'Description',
});
if (errors.length > 0) {
throw new validation_helpers_1.ValidationError(errors.join('\n'));
}
}
/**
* Creates a default Cognito authorizer for the gateway
* Provisions a Cognito User Pool and configures JWT authentication
* @internal
*/
createDefaultCognitoAuthorizerConfig() {
const userPool = new cognito.UserPool(this, 'UserPool', {
userPoolName: `${this.name}-gw-userpool`,
signInCaseSensitive: false,
});
const userPoolClient = userPool.addClient('DefaultClient', {
userPoolClientName: `${this.name}-gw-client`,
});
this.userPool = userPool;
this.userPoolClient = userPoolClient;
return authorizer_1.GatewayAuthorizer.usingCognito({
userPool: userPool,
allowedClients: [userPoolClient],
});
}
/**
* Creates a default MCP protocol configuration for the gateway
* Provides sensible defaults for MCP protocol settings
* @internal
*/
createDefaultMcpProtocolConfiguration() {
return new protocol_1.McpProtocolConfiguration({
supportedVersions: [protocol_1.MCPProtocolVersion.MCP_2025_03_26],
searchType: protocol_1.McpGatewaySearchType.SEMANTIC,
instructions: 'Default gateway to connect to external MCP tools',
});
}
static {
__runInitializers(_classThis, _classExtraInitializers);
}
};
return Gateway = _classThis;
})();
exports.Gateway = Gateway;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdhdGV3YXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQTJDO0FBQzNDLHFFQUFxRTtBQUNyRSxtREFBbUQ7QUFDbkQsMkNBQTJDO0FBRzNDLDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFFMUUsbUJBQW1CO0FBQ25CLGlEQUE4RTtBQUM5RSwwREFBd0Y7QUFFeEYsbUNBQXVDO0FBQ3ZDLHlDQUF3SDtBQUd4SCw2Q0FBaUQ7QUFDakQsNkRBQWtHO0FBZ09sRzs7K0VBRStFO0FBQy9FOzs7Ozs7R0FNRztJQUVVLE9BQU87NEJBRG5CLG9DQUFrQjs7OztzQkFDVSwwQkFBVzs7Ozs7O3VCQUFuQixTQUFRLFdBQVc7Ozs7MkNBd01yQyxJQUFBLGtDQUFjLEdBQUU7NENBK0JoQixJQUFBLGtDQUFjLEdBQUU7MkNBeUJoQixJQUFBLGtDQUFjLEdBQUU7OENBOEJoQixJQUFBLGtDQUFjLEdBQUU7WUFyRmpCLGdNQUFPLGVBQWUsNkRBb0JyQjtZQVdELG1NQUFPLGdCQUFnQiw2REFjdEI7WUFXRCxnTUFBTyxlQUFlLDZEQWtCckI7WUFZRCx5TUFBTyxrQkFBa0IsNkRBa0J4QjtZQWpUSCw2S0FpY0M7Ozs7O1FBaGNDLHNDQUFzQztRQUMvQixNQUFNLENBQVUscUJBQXFCLEdBQVcsOENBQThDLENBQUM7UUFDdEc7Ozs7Ozs7V0FPRztRQUNJLE1BQU0sQ0FBQyxxQkFBcUIsQ0FDakMsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQXdCOzs7Ozs7Ozs7O1lBRXhCLE1BQU0sZUFBZ0IsU0FBUSwwQkFBVztnQkFDdkIsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7Z0JBQzlCLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO2dCQUM1QixJQUFJLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztnQkFDekIsV0FBVyxH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QztZQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztZQUNyQyxPQUFPLDhCQUFpQixDQUFDLFlBQVksQ0FBQztnQkFDcEMsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLGNBQWMsRUFBRSxDQUFDLGNBQWMsQ0FBQzthQUNqQyxDQUFDLENBQUM7U0FDSjtRQUVEOzs7O1dBSUc7UUFDSyxxQ0FBcUM7WUFDM0MsT0FBTyxJQUFJLG1DQUF3QixDQUFDO2dCQUNsQyxpQkFBaUIsRUFBRSxDQUFDLDZCQUFrQixDQUFDLGNBQWMsQ0FBQztnQkFDdEQsVUFBVSxFQUFFLCtCQUFvQixDQUFDLFFBQVE7Z0JBQ3pDLFlBQVksRUFBRSxrREFBa0Q7YUFDakUsQ0FBQyxDQUFDO1NBQ0o7O1lBaGNVLHVEQUFPOzs7OztBQUFQLDBCQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgYmVkcm9ja2FnZW50Y29yZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYmVkcm9ja2FnZW50Y29yZSc7XG5pbXBvcnQgKiBhcyBjb2duaXRvIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2duaXRvJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IElGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEsIE1ldGhvZE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuLy8gSW50ZXJuYWwgaW1wb3J0c1xuaW1wb3J0IHsgR2F0ZXdheUJhc2UsIEdhdGV3YXlFeGNlcHRpb25MZXZlbCwgSUdhdGV3YXkgfSBmcm9tICcuL2dhdGV3YXktYmFzZSc7XG5pbXBvcnQgeyBHYXRld2F5QXV0aG9yaXplciwgSUdhdGV3YXlBdXRob3JpemVyQ29uZmlnIH0gZnJvbSAnLi9pbmJvdW5kLWF1dGgvYXV0aG9yaXplcic7XG5pbXBvcnQgeyBJQ3JlZGVudGlhbFByb3ZpZGVyQ29uZmlnIH0gZnJvbSAnLi9vdXRib3VuZC1hdXRoL2NyZWRlbnRpYWwtcHJvdmlkZXInO1xuaW1wb3J0IHsgR2F0ZXdheVBlcm1zIH0gZnJvbSAnLi9wZXJtcyc7XG5pbXBvcnQgeyBJR2F0ZXdheVByb3RvY29sQ29uZmlnLCBNY3BHYXRld2F5U2VhcmNoVHlwZSwgTWNwUHJvdG9jb2xDb25maWd1cmF0aW9uLCBNQ1BQcm90b2NvbFZlcnNpb24gfSBmcm9tICcuL3Byb3RvY29sJztcbmltcG9ydCB7IEFwaVNjaGVtYSB9IGZyb20gJy4vdGFyZ2V0cy9zY2hlbWEvYXBpLXNjaGVtYSc7XG5pbXBvcnQgeyBUb29sU2NoZW1hIH0gZnJvbSAnLi90YXJnZXRzL3NjaGVtYS90b29sLXNjaGVtYSc7XG5pbXBvcnQgeyBHYXRld2F5VGFyZ2V0IH0gZnJvbSAnLi90YXJnZXRzL3RhcmdldCc7XG5pbXBvcnQgeyB2YWxpZGF0ZVN0cmluZ0ZpZWxkLCB2YWxpZGF0ZUZpZWxkUGF0dGVybiwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi92YWxpZGF0aW9uLWhlbHBlcnMnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcHNcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhZGRpbmcgYSBMYW1iZGEgdGFyZ2V0IHRvIGEgZ2F0ZXdheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZExhbWJkYVRhcmdldE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGdhdGV3YXkgdGFyZ2V0XG4gICAqIFZhbGlkIGNoYXJhY3RlcnMgYXJlIGEteiwgQS1aLCAwLTksIF8gKHVuZGVyc2NvcmUpIGFuZCAtIChoeXBoZW4pXG4gICAqL1xuICByZWFkb25seSBnYXRld2F5VGFyZ2V0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGdhdGV3YXkgdGFyZ2V0XG4gICAqIEBkZWZhdWx0IC0gTm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgdGFyZ2V0XG4gICAqL1xuICByZWFkb25seSBsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdG9vbCBzY2hlbWEgZGVmaW5pbmcgdGhlIGF2YWlsYWJsZSB0b29sc1xuICAgKi9cbiAgcmVhZG9ubHkgdG9vbFNjaGVtYTogVG9vbFNjaGVtYTtcblxuICAvKipcbiAgICogQ3JlZGVudGlhbCBwcm92aWRlcnMgZm9yIGF1dGhlbnRpY2F0aW9uXG4gICAqIEBkZWZhdWx0IC0gW0dhdGV3YXlDcmVkZW50aWFsUHJvdmlkZXIuaWFtUm9sZSgpXVxuICAgKi9cbiAgcmVhZG9ubHkgY3JlZGVudGlhbFByb3ZpZGVyQ29uZmlndXJhdGlvbnM/OiBJQ3JlZGVudGlhbFByb3ZpZGVyQ29uZmlnW107XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYWRkaW5nIGFuIE9wZW5BUEkgdGFyZ2V0IHRvIGEgZ2F0ZXdheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZE9wZW5BcGlUYXJnZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBnYXRld2F5IHRhcmdldFxuICAgKiBWYWxpZCBjaGFyYWN0ZXJzIGFyZSBhLXosIEEtWiwgMC05LCBfICh1bmRlcnNjb3JlKSBhbmQgLSAoaHlwaGVuKVxuICAgKi9cbiAgcmVhZG9ubHkgZ2F0ZXdheVRhcmdldE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBnYXRld2F5IHRhcmdldFxuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIE9wZW5BUEkgc2NoZW1hIGRlZmluaW5nIHRoZSBBUElcbiAgICovXG4gIHJlYWRvbmx5IGFwaVNjaGVtYTogQXBpU2NoZW1hO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHZhbGlkYXRlIHRoZSBPcGVuQVBJIHNjaGVtYSBvciBub3RcbiAgICogTm90ZTogVmFsaWRhdGlvbiBpcyBvbmx5IHBlcmZvcm1lZCBmb3IgaW5saW5lIGFuZCBhc3NldC1iYXNlZCBzY2hlbWEgYW5kICBkdXJpbmcgQ0RLIHN5bnRoZXNpcy5cbiAgICogUzMgc2NoZW1hcyBjYW5ub3QgYmUgdmFsaWRhdGVkIGF0IHN5bnRoZXNpcyB0aW1lLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSB2YWxpZGF0ZU9wZW5BcGlTY2hlbWE/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVkZW50aWFsIHByb3ZpZGVycyBmb3IgYXV0aGVudGljYXRpb25cbiAgICogQGRlZmF1bHQgLSBbR2F0ZXdheUNyZWRlbnRpYWxQcm92aWRlci5pYW1Sb2xlKCldXG4gICAqL1xuICByZWFkb25seSBjcmVkZW50aWFsUHJvdmlkZXJDb25maWd1cmF0aW9ucz86IElDcmVkZW50aWFsUHJvdmlkZXJDb25maWdbXTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhZGRpbmcgYSBTbWl0aHkgdGFyZ2V0IHRvIGEgZ2F0ZXdheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZFNtaXRoeVRhcmdldE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGdhdGV3YXkgdGFyZ2V0XG4gICAqIFZhbGlkIGNoYXJhY3RlcnMgYXJlIGEteiwgQS1aLCAwLTksIF8gKHVuZGVyc2NvcmUpIGFuZCAtIChoeXBoZW4pXG4gICAqL1xuICByZWFkb25seSBnYXRld2F5VGFyZ2V0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGdhdGV3YXkgdGFyZ2V0XG4gICAqIEBkZWZhdWx0IC0gTm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgU21pdGh5IG1vZGVsIGRlZmluaW5nIHRoZSBBUElcbiAgICovXG4gIHJlYWRvbmx5IHNtaXRoeU1vZGVsOiBBcGlTY2hlbWE7XG5cbiAgLyoqXG4gICAqIENyZWRlbnRpYWwgcHJvdmlkZXJzIGZvciBhdXRoZW50aWNhdGlvblxuICAgKiBAZGVmYXVsdCAtIFtHYXRld2F5Q3JlZGVudGlhbFByb3ZpZGVyLmlhbVJvbGUoKV1cbiAgICovXG4gIHJlYWRvbmx5IGNyZWRlbnRpYWxQcm92aWRlckNvbmZpZ3VyYXRpb25zPzogSUNyZWRlbnRpYWxQcm92aWRlckNvbmZpZ1tdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGFkZGluZyBhbiBNQ1AgU2VydmVyIHRhcmdldCB0byBhIGdhdGV3YXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRNY3BTZXJ2ZXJUYXJnZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBnYXRld2F5IHRhcmdldFxuICAgKiBWYWxpZCBjaGFyYWN0ZXJzIGFyZSBhLXosIEEtWiwgMC05LCBfICh1bmRlcnNjb3JlKSBhbmQgLSAoaHlwaGVuKVxuICAgKi9cbiAgcmVhZG9ubHkgZ2F0ZXdheVRhcmdldE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBnYXRld2F5IHRhcmdldFxuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEhUVFBTIGVuZHBvaW50IFVSTCBvZiB0aGUgTUNQIHNlcnZlclxuICAgKlxuICAgKiBUaGUgZW5kcG9pbnQgbXVzdDpcbiAgICogLSBVc2UgSFRUUFMgcHJvdG9jb2xcbiAgICogLSBCZSBwcm9wZXJseSBVUkwtZW5jb2RlZFxuICAgKiAtIFBvaW50IHRvIGFuIE1DUCBzZXJ2ZXIgdGhhdCBpbXBsZW1lbnRzIHRvb2wgY2FwYWJpbGl0aWVzXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVkZW50aWFsIHByb3ZpZGVycyBmb3IgYXV0aGVudGljYXRpb25cbiAgICpcbiAgICogTUNQIHNlcnZlcnMgcmVxdWlyZSBleHBsaWNpdCBhdXRoZW50aWNhdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKiBPQXV0aDIgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgb3ZlciBOb0F1dGguXG4gICAqL1xuICByZWFkb25seSBjcmVkZW50aWFsUHJvdmlkZXJDb25maWd1cmF0aW9uczogSUNyZWRlbnRpYWxQcm92aWRlckNvbmZpZ1tdO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGRlZmluaW5nIGEgR2F0ZXdheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdhdGV3YXlQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZ2F0ZXdheVxuICAgKiBWYWxpZCBjaGFyYWN0ZXJzIGFyZSBhLXosIEEtWiwgMC05LCBfICh1bmRlcnNjb3JlKSBhbmQgLSAoaHlwaGVuKVxuICAgKiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4geW91ciBhY2NvdW50XG4gICAqL1xuICByZWFkb25seSBnYXRld2F5TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGdhdGV3YXlcbiAgICogVmFsaWQgY2hhcmFjdGVycyBhcmUgYS16LCBBLVosIDAtOSwgXyAodW5kZXJzY29yZSksIC0gKGh5cGhlbikgYW5kIHNwYWNlc1xuICAgKiBUaGUgZGVzY3JpcHRpb24gY2FuIGhhdmUgdXAgdG8gMjAwIGNoYXJhY3RlcnNcbiAgICogQGRlZmF1bHQgLSBObyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm90b2NvbCBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2F0ZXdheVxuICAgKiBAZGVmYXVsdCAtIEEgZGVmYXVsdCBwcm90b2NvbCBjb25maWd1cmF0aW9uIHdpbGwgYmUgY3JlYXRlZCB1c2luZyBNQ1Agd2l0aCBmb2xsb3dpbmcgcGFyYW1zXG4gICAqICBzdXBwb3J0ZWRWZXJzaW9uczogW01DUFByb3RvY29sVmVyc2lvbi5NQ1BfMjAyNV8wM18yNl0sXG4gICAqICBzZWFyY2hUeXBlOiBNY3BHYXRld2F5U2VhcmNoVHlwZS5TRU1BTlRJQyxcbiAgICogIGluc3RydWN0aW9uczogXCJEZWZhdWx0IGdhdGV3YXkgdG8gY29ubmVjdCB0byBleHRlcm5hbCBNQ1AgdG9vbHNcIixcbiAgICovXG4gIHJlYWRvbmx5IHByb3RvY29sQ29uZmlndXJhdGlvbj86IElHYXRld2F5UHJvdG9jb2xDb25maWc7XG5cbiAgLyoqXG4gICAqIFRoZSBhdXRob3JpemVyIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBnYXRld2F5XG4gICAqIEBkZWZhdWx0IC0gQSBkZWZhdWx0IGF1dGhvcml6ZXIgd2lsbCBiZSBjcmVhdGVkIHVzaW5nIENvZ25pdG9cbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcml6ZXJDb25maWd1cmF0aW9uPzogSUdhdGV3YXlBdXRob3JpemVyQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyYm9zaXR5IG9mIGV4Y2VwdGlvbiBtZXNzYWdlc1xuICAgKiBVc2UgREVCVUcgbW9kZSB0byBzZWUgZ3JhbnVsYXIgZXhjZXB0aW9uIG1lc3NhZ2VzIGZyb20gYSBHYXRld2F5XG4gICAqIEBkZWZhdWx0IC0gRXhjZXB0aW9uIG1lc3NhZ2VzIGFyZSBzYW5pdGl6ZWQgZm9yIHByZXNlbnRhdGlvbiB0byBlbmQgdXNlcnNcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2VwdGlvbkxldmVsPzogR2F0ZXdheUV4Y2VwdGlvbkxldmVsO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIEtNUyBrZXkgdXNlZCB0byBlbmNyeXB0IGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnYXRld2F5XG4gICAqIEBkZWZhdWx0IC0gTm8gZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkga21zS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSB0aGF0IHByb3ZpZGVzIHBlcm1pc3Npb25zIGZvciB0aGUgZ2F0ZXdheSB0byBhY2Nlc3MgQVdTIHNlcnZpY2VzXG4gICAqIEBkZWZhdWx0IC0gQSBuZXcgcm9sZSB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRhZ3MgZm9yIHRoZSBnYXRld2F5XG4gICAqIEEgbGlzdCBvZiBrZXk6dmFsdWUgcGFpcnMgb2YgdGFncyB0byBhcHBseSB0byB0aGlzIEdhdGV3YXkgcmVzb3VyY2VcbiAgICogQGRlZmF1bHQgLSBObyB0YWdzXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGVzIGZvciBpbXBvcnRpbmcgYW4gZXhpc3RpbmcgR2F0ZXdheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdhdGV3YXlBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGdhdGV3YXlcbiAgICovXG4gIHJlYWRvbmx5IGdhdGV3YXlBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBnYXRld2F5XG4gICAqL1xuICByZWFkb25seSBnYXRld2F5SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGdhdGV3YXlcbiAgICovXG4gIHJlYWRvbmx5IGdhdGV3YXlOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSB0aGF0IHByb3ZpZGVzIHBlcm1pc3Npb25zIGZvciB0aGUgZ2F0ZXdheVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogR2F0ZXdheSByZXNvdXJjZSBmb3IgQVdTIEJlZHJvY2sgQWdlbnQgQ29yZS5cbiAqIFNlcnZlcyBhcyBhbiBpbnRlZ3JhdGlvbiBwb2ludCBiZXR3ZWVuIHlvdXIgYWdlbnQgYW5kIGV4dGVybmFsIHNlcnZpY2VzLlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkJlZHJvY2tBZ2VudENvcmU6OkdhdGV3YXlcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlLWNvbnRyb2wvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlR2F0ZXdheS5odG1sXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBHYXRld2F5IGV4dGVuZHMgR2F0ZXdheUJhc2Uge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1iZWRyb2NrLWFnZW50Y29yZS1hbHBoYS5HYXRld2F5JztcbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBHYXRld2F5IHVzaW5nIGl0cyBhdHRyaWJ1dGVzXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0IGlkXG4gICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBvZiB0aGUgZXhpc3RpbmcgR2F0ZXdheVxuICAgKiBAcmV0dXJucyBBbiBJR2F0ZXdheSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIGltcG9ydGVkIGdhdGV3YXlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUdhdGV3YXlBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogR2F0ZXdheUF0dHJpYnV0ZXMsXG4gICk6IElHYXRld2F5IHtcbiAgICBjbGFzcyBJbXBvcnRlZEdhdGV3YXkgZXh0ZW5kcyBHYXRld2F5QmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ2F0ZXdheUFybiA9IGF0dHJzLmdhdGV3YXlBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ2F0ZXdheUlkID0gYXR0cnMuZ2F0ZXdheUlkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IG5hbWUgPSBhdHRycy5nYXRld2F5TmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwcm90b2NvbENvbmZpZ3VyYXRpb246IElHYXRld2F5UHJvdG9jb2xDb25maWc7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYXV0aG9yaXplckNvbmZpZ3VyYXRpb246IElHYXRld2F5QXV0aG9yaXplckNvbmZpZztcbiAgICAgIHB1YmxpYyByZWFkb25seSBleGNlcHRpb25MZXZlbCA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBrbXNLZXkgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcm9sZSA9IGF0dHJzLnJvbGU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ2F0ZXdheVVybCA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXMgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzUmVhc29uID0gdW5kZWZpbmVkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSB1cGRhdGVkQXQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0cnVjdG9yKHM6IENvbnN0cnVjdCwgaTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHMsIGkpO1xuICAgICAgICAvLyBDcmVhdGUgcGxhY2Vob2xkZXIgcHJvdG9jb2wgYW5kIGF1dGhvcml6ZXIgY29uZmlndXJhdGlvbnNcbiAgICAgICAgdGhpcy5wcm90b2NvbENvbmZpZ3VyYXRpb24gPSBuZXcgTWNwUHJvdG9jb2xDb25maWd1cmF0aW9uKHtcbiAgICAgICAgICBzdXBwb3J0ZWRWZXJzaW9uczogW01DUFByb3RvY29sVmVyc2lvbi5NQ1BfMjAyNV8wM18yNl0sXG4gICAgICAgICAgc2VhcmNoVHlwZTogTWNwR2F0ZXdheVNlYXJjaFR5cGUuU0VNQU5USUMsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiAnSW1wb3J0ZWQgZ2F0ZXdheScsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmF1dGhvcml6ZXJDb25maWd1cmF0aW9uID0gR2F0ZXdheUF1dGhvcml6ZXIudXNpbmdBd3NJYW0oKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZEdhdGV3YXkoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBnYXRld2F5XG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBnYXRld2F5QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZ2F0ZXdheVxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ2F0ZXdheUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBnYXRld2F5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGdhdGV3YXlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb3RvY29sIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBnYXRld2F5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvdG9jb2xDb25maWd1cmF0aW9uOiBJR2F0ZXdheVByb3RvY29sQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgYXV0aG9yaXplciBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2F0ZXdheVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF1dGhvcml6ZXJDb25maWd1cmF0aW9uOiBJR2F0ZXdheUF1dGhvcml6ZXJDb25maWc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGNlcHRpb24gbGV2ZWwgZm9yIHRoZSBnYXRld2F5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXhjZXB0aW9uTGV2ZWw/OiBHYXRld2F5RXhjZXB0aW9uTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFRoZSBLTVMga2V5IHVzZWQgZm9yIGVuY3J5cHRpb25cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBrbXNLZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIGZvciB0aGUgZ2F0ZXdheVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcblxuICAvK