@aws-cdk/aws-bedrock-agentcore-alpha
Version:
The CDK Construct Library for Amazon Bedrock
553 lines • 73.2 kB
JavaScript
"use strict";
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;
};
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;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CodeInterpreterCustom = exports.CodeInterpreterCustomBase = 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 aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
const iam = require("aws-cdk-lib/aws-iam");
const ec2 = require("aws-cdk-lib/aws-ec2");
const agent_core = require("aws-cdk-lib/aws-bedrockagentcore");
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 Libs
const perms = require("./perms");
const validation_helpers_1 = require("./validation-helpers");
const network_configuration_1 = require("../network/network-configuration");
/******************************************************************************
* CONSTANTS
*****************************************************************************/
/**
* Minimum length for code interpreter name
* @internal
*/
const CODE_INTERPRETER_NAME_MIN_LENGTH = 1;
/**
* Maximum length for code interpreter name
* @internal
*/
const CODE_INTERPRETER_NAME_MAX_LENGTH = 48;
/**
* Minimum length for code interpreter tag
* @internal
*/
const CODE_INTERPRETER_TAG_MIN_LENGTH = 1;
/**
* Maximum length for code interpreter tag
* @internal
*/
const CODE_INTERPRETER_TAG_MAX_LENGTH = 256;
/******************************************************************************
* ABSTRACT BASE CLASS
*****************************************************************************/
/**
* Abstract base class for a Code Interpreter.
* Contains methods and attributes valid for Code Interpreters either created with CDK or imported.
*/
class CodeInterpreterCustomBase extends aws_cdk_lib_1.Resource {
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.CodeInterpreterCustomBase", version: "2.227.0-alpha.0" };
/**
* An accessor for the Connections object that will fail if this Browser does not have a VPC
* configured.
*/
get connections() {
if (!this._connections) {
throw new aws_cdk_lib_1.ValidationError('Cannot manage network access without configuring a VPC', this);
}
return this._connections;
}
/**
* The actual Connections object for this Browser. This may be unset in the event that a VPC has not
* been configured.
* @internal
*/
_connections;
constructor(scope, id) {
super(scope, id);
}
/**
* Grants IAM actions to the IAM Principal
* @param grantee - The IAM principal to grant permissions to
* @param actions - The actions to grant
* @returns An IAM Grant object representing the granted permissions
*/
grant(grantee, ...actions) {
return iam.Grant.addToPrincipal({
grantee: grantee,
resourceArns: [this.codeInterpreterArn],
actions: actions,
});
}
/**
* Grant read permissions on this code interpreter to an IAM principal.
* This includes both read permissions on the specific code interpreter and list permissions on all code interpreters.
*
* @param grantee - The IAM principal to grant read permissions to
* @default - Default grant configuration:
* - actions: ['bedrock-agentcore:GetCodeInterpreter', 'bedrock-agentcore:GetCodeInterpreterSession'] on this.codeInterpreterArn
* - actions: ['bedrock-agentcore:ListCodeInterpreters', 'bedrock-agentcore:ListCodeInterpreterSessions'] on all resources (*)
* @returns An IAM Grant object representing the granted permissions
*/
grantRead(grantee) {
const resourceSpecificGrant = this.grant(grantee, ...perms.CODE_INTERPRETER_READ_PERMS);
const allResourceGrant = iam.Grant.addToPrincipal({
grantee: grantee,
resourceArns: ['*'],
actions: perms.CODE_INTERPRETER_LIST_PERMS,
});
// Return combined grant
return resourceSpecificGrant.combine(allResourceGrant);
}
/**
* Grant invoke permissions on this code interpreter to an IAM principal.
*
* @param grantee - The IAM principal to grant invoke permissions to
* @default - Default grant configuration:
* - actions: ['bedrock-agentcore:StartCodeInterpreterSession', 'bedrock-agentcore:InvokeCodeInterpreter', 'bedrock-agentcore:StopCodeInterpreterSession']
* - resourceArns: [this.codeInterpreterArn]
* @returns An IAM Grant object representing the granted permissions
*/
grantUse(grantee) {
return this.grant(grantee, ...perms.CODE_INTERPRETER_USE_PERMS);
}
/**
* Grant invoke permissions on this code interpreter to an IAM principal.
*
* @param grantee - The IAM principal to grant invoke permissions to
* @returns An IAM Grant object representing the granted permissions
* @default - Default grant configuration:
* - actions: ['bedrock-agentcore:InvokeCodeInterpreter']
* - resourceArns: [this.codeInterpreterArn]
*/
grantInvoke(grantee) {
return this.grant(grantee, ...perms.CODE_INTERPRETER_INVOKE_PERMS);
}
// ------------------------------------------------------
// Metrics
// ------------------------------------------------------
/**
* Return the given named metric for this code interpreter.
*
* By default, the metric will be calculated as a sum over a period of 5 minutes.
* You can customize this by using the `statistic` and `period` properties.
*/
metric(metricName, dimensions, props) {
const metricProps = {
namespace: 'AWS/Bedrock-AgentCore',
metricName,
dimensionsMap: { ...dimensions, Resource: this.codeInterpreterArn },
...props,
};
return this.configureMetric(metricProps);
}
/**
* Creates a CloudWatch metric for tracking code interpreter api operations..
*
* @param props - Configuration options for the metric
* @default - Default metric configuration:
* - namespace: 'AWS/Bedrock-AgentCore'
* - metricName: metricName
* - dimensionsMap: { CodeInterpreterId: this.codeInterpreterId }
* @returns A CloudWatch Metric configured for code interpreter api operations
*/
metricForApiOperation(metricName, operation, props) {
return this.metric(metricName, { Operation: operation }, props);
}
/**
* Creates a CloudWatch metric for tracking code interpreter latencies.
*
* @param props - Configuration options for the metric
* @default - Default metric configuration:
* - namespace: 'AWS/Bedrock-AgentCore'
* - metricName: Latency
* @returns A CloudWatch Metric configured for code interpreter latencies
*/
metricLatencyForApiOperation(operation, props) {
return this.metricForApiOperation('Latency', operation, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
}
/**
* Creates a CloudWatch metric for tracking code interpreter invocations.
*
* @param props - Configuration options for the metric
* @default - Default metric configuration:
* - namespace: 'AWS/Bedrock-AgentCore'
* - metricName: Invocations
* @returns A CloudWatch Metric configured for code interpreter invocations
*/
metricInvocationsForApiOperation(operation, props) {
return this.metricForApiOperation('Invocations', operation, {
statistic: aws_cloudwatch_1.Stats.SUM,
...props,
});
}
/**
* Creates a CloudWatch metric for tracking code interpreter errors.
*
* @param props - Configuration options for the metric
* @default - Default metric configuration:
* - namespace: 'AWS/Bedrock-AgentCore'
* - metricName: Errors
* @returns A CloudWatch Metric configured for code interpreter errors
*/
metricErrorsForApiOperation(operation, props) {
return this.metricForApiOperation('Errors', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
}
/**
* Creates a CloudWatch metric for tracking code interpreter throttles.
*
* @param props - Configuration options for the metric
* @default - Default metric configuration:
* - namespace: 'AWS/Bedrock-AgentCore'
* - metricName: Throttles
* @returns A CloudWatch Metric configured for code interpreter throttles
*/
metricThrottlesForApiOperation(operation, props) {
return this.metricForApiOperation('Throttles', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
}
/**
* Creates a CloudWatch metric for tracking code interpreter system errors.
*
* @param props - Configuration options for the metric
* @default - Default metric configuration:
* - namespace: 'AWS/Bedrock-AgentCore'
* - metricName: SystemErrors
* @returns A CloudWatch Metric configured for code interpreter system errors
*/
metricSystemErrorsForApiOperation(operation, props) {
return this.metricForApiOperation('SystemErrors', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
}
/**
* Creates a CloudWatch metric for tracking code interpreter user errors.
*
* @param props - Configuration options for the metric
* @default - Default metric configuration:
* - namespace: 'AWS/Bedrock-AgentCore'
* - metricName: UserErrors
* @returns A CloudWatch Metric configured for code interpreter user errors
*/
metricUserErrorsForApiOperation(operation, props) {
return this.metricForApiOperation('UserErrors', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
}
/**
* Creates a CloudWatch metric for tracking code interpreter session duration.
*
* @param props - Configuration options for the metric
* @default - Default metric configuration:
* - namespace: 'AWS/Bedrock-AgentCore'
* - metricName: Duration
* @returns A CloudWatch Metric configured for code interpreter session duration
*/
metricSessionDuration(props) {
return this.metric('Duration', { Operation: 'CodeInterpreterSession' }, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
}
/**
* Internal method to create a metric.
*
* @param props - Configuration options for the metric
* @returns A CloudWatch Metric configured for code interpreter api operations
*/
configureMetric(props) {
return new aws_cloudwatch_1.Metric({
...props,
region: props?.region ?? this.stack.region,
account: props?.account ?? this.stack.account,
});
}
}
exports.CodeInterpreterCustomBase = CodeInterpreterCustomBase;
/******************************************************************************
* Class
*****************************************************************************/
/**
* Custom code interpreter resource for AWS Bedrock Agent Core.
* Provides a sandboxed environment for code execution with configurable network access.
*
* @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/code-interpreter.html
* @resource AWS::BedrockAgentCore::CodeInterpreterCustom
*/
let CodeInterpreterCustom = (() => {
let _classDecorators = [prop_injectable_1.propertyInjectable];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
let _classSuper = CodeInterpreterCustomBase;
var CodeInterpreterCustom = class extends _classSuper {
static { _classThis = this; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
CodeInterpreterCustom = _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.CodeInterpreterCustom", version: "2.227.0-alpha.0" };
/** Uniquely identifies this class. */
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.CodeInterpreterCustom';
/**
* Static Method for importing an existing Bedrock AgentCore Code Interpreter Custom.
*/
/**
* Creates an Code Interpreter Custom reference from an existing code interpreter's attributes.
*
* @param scope - The construct scope
* @param id - Identifier of the construct
* @param attrs - Attributes of the existing code interpreter custom
* @returns An ICodeInterpreterCustom reference to the existing code interpreter
*/
static fromCodeInterpreterCustomAttributes(scope, id, attrs) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_CodeInterpreterCustomAttributes(attrs);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.fromCodeInterpreterCustomAttributes);
}
throw error;
}
class Import extends CodeInterpreterCustomBase {
codeInterpreterArn = attrs.codeInterpreterArn;
codeInterpreterId = aws_cdk_lib_1.Arn.split(attrs.codeInterpreterArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
executionRole = iam.Role.fromRoleArn(scope, `${id}Role`, attrs.roleArn);
lastUpdatedAt = attrs.lastUpdatedAt;
grantPrincipal = this.executionRole;
status = attrs.status;
createdAt = attrs.createdAt;
constructor(s, i) {
super(s, i);
this.grantPrincipal = this.executionRole || new iam.UnknownPrincipal({ resource: this });
if (attrs.securityGroups) {
this._connections = new ec2.Connections({
securityGroups: attrs.securityGroups,
});
}
}
}
// Return new Code Interpreter Custom
return new Import(scope, id);
}
// ------------------------------------------------------
// Attributes
// ------------------------------------------------------
/**
* The ARN of the code interpreter resource
* @attribute
*/
codeInterpreterArn;
/**
* The id of the code interpreter
* @attribute
*/
codeInterpreterId;
/**
* The name of the code interpreter
*/
name;
/**
* The description of the code interpreter
*/
description;
/**
* The network configuration of the code interpreter
*/
networkConfiguration;
/**
* The status of the code interpreter
* @attribute
*/
status;
/**
* The created timestamp of the code interpreter
* @attribute
*/
createdAt;
/**
* The last updated timestamp of the code interpreter
* @attribute
*/
lastUpdatedAt;
/**
* The failure reason of the code interpreter
* @attribute
*/
failureReason;
/**
* The IAM role that provides permissions for the code interpreter to access AWS services.
*/
executionRole;
/**
* The principal to grant permissions to
*/
grantPrincipal;
/**
* Tags applied to this code interpreter resource
* A map of key-value pairs for resource tagging
* @default - No tags applied
*/
tags;
// ------------------------------------------------------
// Internal Only
// ------------------------------------------------------
__resource;
constructor(scope, id, props) {
super(scope, id);
try {
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_CodeInterpreterCustomProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, CodeInterpreterCustom);
}
throw error;
}
// Enhanced CDK Analytics Telemetry
(0, metadata_resource_1.addConstructMetadata)(this, props);
// ------------------------------------------------------
// Set properties and defaults
// ------------------------------------------------------
this.name = props.codeInterpreterCustomName;
this.description = props.description;
this.networkConfiguration = props.networkConfiguration ?? network_configuration_1.CodeInterpreterNetworkConfiguration.usingPublicNetwork();
this.executionRole = props.executionRole ?? this._createCodeInterpreterRole();
this.grantPrincipal = this.executionRole;
this.tags = props.tags;
// Validate code interpreter name
(0, validation_helpers_1.throwIfInvalid)(this._validateCodeInterpreterName, this.name);
// Validate code interpreter tags
(0, validation_helpers_1.throwIfInvalid)(this._validateCodeInterpreterTags, this.tags);
// Network configuration and validation is done in the network configuration class
// So we don't need to validate it here
// Set connections - create a shared connections object
if (this.networkConfiguration.connections) {
// Use the network configuration's connections as the shared object
this._connections = this.networkConfiguration.connections;
}
// ------------------------------------------------------
// CFN Props - With Lazy support
// ------------------------------------------------------
const cfnProps = {
name: this.name,
description: this.description,
networkConfiguration: aws_cdk_lib_1.Lazy.any({ produce: () => this.networkConfiguration._render(this._connections) }),
executionRoleArn: this.executionRole?.roleArn,
tags: this.tags,
};
// L1 instantiation
this.__resource = new agent_core.CfnCodeInterpreterCustom(this, 'Resource', cfnProps);
// Get attributes directly from the CloudFormation resource
this.codeInterpreterId = this.__resource.attrCodeInterpreterId;
this.codeInterpreterArn = this.__resource.attrCodeInterpreterArn;
this.status = this.__resource.attrStatus;
this.createdAt = this.__resource.attrCreatedAt;
this.lastUpdatedAt = this.__resource.attrLastUpdatedAt;
this.failureReason = this.__resource.attrFailureReason;
}
// ------------------------------------------------------
// Validators
// ------------------------------------------------------
/**
* Validates the code interpreter name format
* @param name The code interpreter name to validate
* @returns Array of validation error messages, empty if valid
* @internal This is an internal core function and should not be called directly.
*/
_validateCodeInterpreterName = (name) => {
let errors = [];
errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
value: name,
fieldName: 'Code interpreter name',
minLength: CODE_INTERPRETER_NAME_MIN_LENGTH,
maxLength: CODE_INTERPRETER_NAME_MAX_LENGTH,
}));
// Check if name matches the AWS API pattern: [a-zA-Z][a-zA-Z0-9_]{0,47}
// Must start with a letter, followed by up to 47 letters, numbers, or underscores
const validNamePattern = /^[a-zA-Z][a-zA-Z0-9_]{0,47}$/;
errors.push(...(0, validation_helpers_1.validateFieldPattern)(name, 'Code interpreter name', validNamePattern));
return errors;
};
/**
* Validates the code interpreter tags format
* @param tags The tags object to validate
* @returns Array of validation error messages, empty if valid
* @internal This is an internal core function and should not be called directly.
*/
_validateCodeInterpreterTags = (tags) => {
let errors = [];
if (!tags) {
return errors; // Tags are optional
}
// Validate each tag key and value
for (const [key, value] of Object.entries(tags)) {
errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
value: key,
fieldName: 'Tag key',
minLength: CODE_INTERPRETER_TAG_MIN_LENGTH,
maxLength: CODE_INTERPRETER_TAG_MAX_LENGTH,
}));
// Validate tag key pattern: ^[a-zA-Z0-9\s._:/=+@-]*$
const validKeyPattern = /^[a-zA-Z0-9\s._:/=+@-]*$/;
errors.push(...(0, validation_helpers_1.validateFieldPattern)(key, 'Tag key', validKeyPattern));
// Validate tag value
errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
value: value,
fieldName: 'Tag value',
minLength: CODE_INTERPRETER_TAG_MIN_LENGTH,
maxLength: CODE_INTERPRETER_TAG_MAX_LENGTH,
}));
// Validate tag value pattern: ^[a-zA-Z0-9\s._:/=+@-]*$
const validValuePattern = /^[a-zA-Z0-9\s._:/=+@-]*$/;
errors.push(...(0, validation_helpers_1.validateFieldPattern)(value, 'Tag value', validValuePattern));
}
return errors;
};
/**
* Creates execution role needed for the code interpreter to access AWS services
* @returns The created role
* @internal This is an internal core function and should not be called directly.
*/
_createCodeInterpreterRole() {
const role = new iam.Role(this, 'ServiceRole', {
assumedBy: new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com'),
});
return role;
}
static {
__runInitializers(_classThis, _classExtraInitializers);
}
};
return CodeInterpreterCustom = _classThis;
})();
exports.CodeInterpreterCustom = CodeInterpreterCustom;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1pbnRlcnByZXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvZGUtaW50ZXJwcmV0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBT3FCO0FBQ3JCLCtEQU1vQztBQUNwQywyQ0FBMkM7QUFDM0MsMkNBQTJDO0FBQzNDLCtEQUErRDtBQUUvRCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBQzFFLGdCQUFnQjtBQUNoQixpQ0FBaUM7QUFDakMsNkRBQXVHO0FBQ3ZHLDRFQUF1RjtBQUV2Rjs7K0VBRStFO0FBRS9FOzs7R0FHRztBQUNILE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQyxDQUFDO0FBRTNDOzs7R0FHRztBQUNILE1BQU0sZ0NBQWdDLEdBQUcsRUFBRSxDQUFDO0FBRTVDOzs7R0FHRztBQUNILE1BQU0sK0JBQStCLEdBQUcsQ0FBQyxDQUFDO0FBRTFDOzs7R0FHRztBQUNILE1BQU0sK0JBQStCLEdBQUcsR0FBRyxDQUFDO0FBNEc1Qzs7K0VBRStFO0FBQy9FOzs7R0FHRztBQUNILE1BQXNCLHlCQUEwQixTQUFRLHNCQUFROztJQVk5RDs7O09BR0c7SUFDSCxJQUFXLFdBQVc7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksNkJBQWUsQ0FBQyx3REFBd0QsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0tBQzFCO0lBQ0Q7Ozs7T0FJRztJQUNPLFlBQVksQ0FBOEI7SUFFcEQsWUFBWSxLQUFnQixFQUFFLEVBQVU7UUFDdEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztLQUNsQjtJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLE9BQXVCLEVBQUUsR0FBRyxPQUFpQjtRQUN4RCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENB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QTBCO1lBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO2dCQUM3QyxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsaUNBQWlDLENBQUM7YUFDdkUsQ0FBQyxDQUFDO1lBRUgsT0FBTyxJQUFJLENBQUM7U0FDYjs7WUE3T1UsdURBQXFCOzs7OztBQUFyQixzREFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBcm4sXG4gIEFybkZvcm1hdCxcbiAgSVJlc291cmNlLFxuICBMYXp5LFxuICBSZXNvdXJjZSxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBEaW1lbnNpb25zTWFwLFxuICBNZXRyaWMsXG4gIE1ldHJpY09wdGlvbnMsXG4gIE1ldHJpY1Byb3BzLFxuICBTdGF0cyxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgZWMyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0ICogYXMgYWdlbnRfY29yZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYmVkcm9ja2FnZW50Y29yZSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbi8vIEludGVybmFsIExpYnNcbmltcG9ydCAqIGFzIHBlcm1zIGZyb20gJy4vcGVybXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVGaWVsZFBhdHRlcm4sIHZhbGlkYXRlU3RyaW5nRmllbGRMZW5ndGgsIHRocm93SWZJbnZhbGlkIH0gZnJvbSAnLi92YWxpZGF0aW9uLWhlbHBlcnMnO1xuaW1wb3J0IHsgQ29kZUludGVycHJldGVyTmV0d29ya0NvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9uZXR3b3JrL25ldHdvcmstY29uZmlndXJhdGlvbic7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RBTlRTXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogTWluaW11bSBsZW5ndGggZm9yIGNvZGUgaW50ZXJwcmV0ZXIgbmFtZVxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IENPREVfSU5URVJQUkVURVJfTkFNRV9NSU5fTEVOR1RIID0gMTtcblxuLyoqXG4gKiBNYXhpbXVtIGxlbmd0aCBmb3IgY29kZSBpbnRlcnByZXRlciBuYW1lXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgQ09ERV9JTlRFUlBSRVRFUl9OQU1FX01BWF9MRU5HVEggPSA0ODtcblxuLyoqXG4gKiBNaW5pbXVtIGxlbmd0aCBmb3IgY29kZSBpbnRlcnByZXRlciB0YWdcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBDT0RFX0lOVEVSUFJFVEVSX1RBR19NSU5fTEVOR1RIID0gMTtcblxuLyoqXG4gKiBNYXhpbXVtIGxlbmd0aCBmb3IgY29kZSBpbnRlcnByZXRlciB0YWdcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBDT0RFX0lOVEVSUFJFVEVSX1RBR19NQVhfTEVOR1RIID0gMjU2O1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIEludGVyZmFjZSBmb3IgQ29kZUludGVycHJldGVyQ3VzdG9tIHJlc291cmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlSW50ZXJwcmV0ZXJDdXN0b20gZXh0ZW5kcyBJUmVzb3VyY2UsIGlhbS5JR3JhbnRhYmxlLCBlYzIuSUNvbm5lY3RhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGNvZGUgaW50ZXJwcmV0ZXIgcmVzb3VyY2VcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29kZUludGVycHJldGVyQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgY29kZSBpbnRlcnByZXRlclxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjb2RlSW50ZXJwcmV0ZXJJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBjb2RlIGludGVycHJldGVyXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZXN0YW1wIHdoZW4gdGhlIGNvZGUgaW50ZXJwcmV0ZXIgd2FzIGNyZWF0ZWRcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgY29kZSBpbnRlcnByZXRlciB3YXMgbGFzdCB1cGRhdGVkXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGxhc3RVcGRhdGVkQXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSB0aGF0IHByb3ZpZGVzIHBlcm1pc3Npb25zIGZvciB0aGUgY29kZSBpbnRlcnByZXRlciB0byBhY2Nlc3MgQVdTIHNlcnZpY2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uUm9sZTogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiAgR3JhbnRzIElBTSBhY3Rpb25zIHRvIHRoZSBJQU0gUHJpbmNpcGFsXG4gICAqL1xuICBncmFudChncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgLi4uYWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBgR2V0YCBhbmQgYExpc3RgIGFjdGlvbnMgb24gdGhlIENvZGUgSW50ZXJwcmV0ZXJcbiAgICovXG4gIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIGBJbnZva2VgLCBgU3RhcnRgLCBhbmQgYFN0b3BgIGFjdGlvbnMgb24gdGhlIENvZGUgSW50ZXJwcmV0ZXJcbiAgICovXG4gIGdyYW50VXNlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBNZXRyaWNzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBnaXZlbiBuYW1lZCBtZXRyaWMgZm9yIHRoaXMgY29kZSBpbnRlcnByZXRlci5cbiAgICovXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIGRpbWVuc2lvbnM6IERpbWVuc2lvbnNNYXAsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBnaXZlbiBuYW1lZCBtZXRyaWMgcmVsYXRlZCB0byB0aGUgQVBJIG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhpcyBjb2RlIGludGVycHJldGVyLlxuICAgKi9cbiAgbWV0cmljRm9yQXBpT3BlcmF0aW9uKG1ldHJpY05hbWU6IHN0cmluZywgb3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIG1lYXN1cmluZyB0aGUgbGF0ZW5jeSBvZiBhIHNwZWNpZmljIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgY29kZSBpbnRlcnByZXRlci5cbiAgICovXG4gIG1ldHJpY0xhdGVuY3lGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIHRvdGFsIG51bWJlciBvZiBBUEkgcmVxdWVzdHMgbWFkZSBmb3IgYSBzcGVjaWZpYyBjb2RlIGludGVycHJldGVyIG9wZXJhdGlvbi5cbiAgICovXG4gIG1ldHJpY0ludm9jYXRpb25zRm9yQXBpT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgZXJyb3JzIGZvciBhIHNwZWNpZmljIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgY29kZSBpbnRlcnByZXRlci5cbiAgICovXG4gIG1ldHJpY0Vycm9yc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHRocm90dGxlZCByZXF1ZXN0cyBmb3IgYSBzcGVjaWZpYyBBUEkgb3BlcmF0aW9uIHBlcmZvcm1lZCBvbiB0aGlzIGNvZGUgaW50ZXJwcmV0ZXIuXG4gICAqL1xuICBtZXRyaWNUaHJvdHRsZXNGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBzeXN0ZW0gZXJyb3JzIGZvciBhIHNwZWNpZmljIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgY29kZSBpbnRlcnByZXRlci5cbiAgICovXG4gIG1ldHJpY1N5c3RlbUVycm9yc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHVzZXIgZXJyb3JzIGZvciBhIHNwZWNpZmljIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgY29kZSBpbnRlcnByZXRlci5cbiAgICovXG4gIG1ldHJpY1VzZXJFcnJvcnNGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIG1lYXN1cmluZyB0aGUgZHVyYXRpb24gb2YgY29kZSBpbnRlcnByZXRlciBzZXNzaW9ucy5cbiAgICovXG4gIG1ldHJpY1Nlc3Npb25EdXJhdGlvbihwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgQUJTVFJBQ1QgQkFTRSBDTEFTU1xuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhIENvZGUgSW50ZXJwcmV0ZXIuXG4gKiBDb250YWlucyBtZXRob2RzIGFuZCBhdHRyaWJ1dGVzIHZhbGlkIGZvciBDb2RlIEludGVycHJldGVycyBlaXRoZXIgY3JlYXRlZCB3aXRoIENESyBvciBpbXBvcnRlZC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvZGVJbnRlcnByZXRlckN1c3RvbUJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElDb2RlSW50ZXJwcmV0ZXJDdXN0b20ge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY29kZUludGVycHJldGVyQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjb2RlSW50ZXJwcmV0ZXJJZDogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgc3RhdHVzPzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdD86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGV4ZWN1dGlvblJvbGU6IGlhbS5JUm9sZTtcbiAgLyoqXG4gICAqIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgcGVybWlzc2lvbnMgdG9cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIEFuIGFjY2Vzc29yIGZvciB0aGUgQ29ubmVjdGlvbnMgb2JqZWN0IHRoYXQgd2lsbCBmYWlsIGlmIHRoaXMgQnJvd3NlciBkb2VzIG5vdCBoYXZlIGEgVlBDXG4gICAqIGNvbmZpZ3VyZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25zKCk6IGVjMi5Db25uZWN0aW9ucyB7XG4gICAgaWYgKCF0aGlzLl9jb25uZWN0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignQ2Fubm90IG1hbmFnZSBuZXR3b3JrIGFjY2VzcyB3aXRob3V0IGNvbmZpZ3VyaW5nIGEgVlBDJywgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9ucztcbiAgfVxuICAvKipcbiAgICogVGhlIGFjdHVhbCBDb25uZWN0aW9ucyBvYmplY3QgZm9yIHRoaXMgQnJvd3Nlci4gVGhpcyBtYXkgYmUgdW5zZXQgaW4gdGhlIGV2ZW50IHRoYXQgYSBWUEMgaGFzIG5vdFxuICAgKiBiZWVuIGNvbmZpZ3VyZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9jb25uZWN0aW9uczogZWMyLkNvbm5lY3Rpb25zIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBJQU0gYWN0aW9ucyB0byB0aGUgSUFNIFByaW5jaXBhbFxuICAgKiBAcGFyYW0gZ3JhbnRlZSAtIFRoZSBJQU0gcHJpbmNpcGFsIHRvIGdyYW50IHBlcm1pc3Npb25zIHRvXG4gICAqIEBwYXJhbSBhY3Rpb25zIC0gVGhlIGFjdGlvbnMgdG8gZ3JhbnRcbiAgICogQHJldHVybnMgQW4gSUFNIEdyYW50IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdyYW50ZWQgcGVybWlzc2lvbnNcbiAgICovXG4gIHB1YmxpYyBncmFudChncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgLi4uYWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZTogZ3JhbnRlZSxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMuY29kZUludGVycHJldGVyQXJuXSxcbiAgICAgIGFjdGlvbnM6IGFjdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBwZXJtaXNzaW9ucyBvbiB0aGlzIGNvZGUgaW50ZXJwcmV0ZXIgdG8gYW4gSUFNIHByaW5jaXBhbC5cbiAgICogVGhpcyBpbmNsdWRlcyBib3RoIHJlYWQgcGVybWlzc2lvbnMgb24gdGhlIHNwZWNpZmljIGNvZGUgaW50ZXJwcmV0ZXIgYW5kIGxpc3QgcGVybWlzc2lvbnMgb24gYWxsIGNvZGUgaW50ZXJwcmV0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSAtIFRoZSBJQU0gcHJpbmNpcGFsIHRvIGdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG9cbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IGdyYW50IGNvbmZpZ3VyYXRpb246XG4gICAqIC0gYWN0aW9uczogWydiZWRyb2NrLWFnZW50Y29yZTpHZXRDb2RlSW50ZXJwcmV0ZXInLCAnYmVkcm9jay1hZ2VudGNvcmU6R2V0Q29kZUludGVycHJldGVyU2Vzc2lvbiddIG9uIHRoaXMuY29kZUludGVycHJldGVyQXJuXG4gICAqIC0gYWN0aW9uczogWydiZWRyb2NrLWFnZW50Y29yZTpMaXN0Q29kZUludGVycHJldGVycycsICdiZWRyb2NrLWFnZW50Y29yZTpMaXN0Q29kZUludGVycHJldGVyU2Vzc2lvbnMnXSBvbiBhbGwgcmVzb3VyY2VzICgqKVxuICAgKiBAcmV0dXJucyBBbiBJQU0gR3JhbnQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ3JhbnRlZCBwZXJtaXNzaW9uc1xuICAgKi9cbiAgcHVibGljIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3QgcmVzb3VyY2VTcGVjaWZpY0dyYW50ID0gdGhpcy5ncmFudChcbiAgICAgIGdyYW50ZWUsXG4gICAgICAuLi5wZXJtcy5DT0RFX0lOVEVSUFJFVEVSX1JFQURfUEVSTVMsXG4gICAgKTtcblxuICAgIGNvbnN0IGFsbFJlc291cmNlR3JhbnQgPSBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZTogZ3JhbnRlZSxcbiAgICAgIHJlc291cmNlQXJuczogWycqJ10sXG4gICAgICBhY3Rpb25zOiBwZXJtcy5DT0RFX0lOVEVSUFJFVEVSX0xJU1RfUEVSTVMsXG4gICAgfSk7XG4gICAgLy8gUmV0dXJuIGNvbWJpbmVkIGdyYW50XG4gICAgcmV0dXJuIHJlc291cmNlU3BlY2lmaWNHcmFudC5jb21iaW5lKGFsbFJlc291cmNlR3JhbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IGludm9rZSBwZXJtaXNzaW9ucyBvbiB0aGlzIGNvZGUgaW50ZXJwcmV0ZXIgdG8gYW4gSUFNIHByaW5jaXBhbC5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgLSBUaGUgSUFNIHByaW5jaXBhbCB0byBncmFudCBpbnZva2UgcGVybWlzc2lvbnMgdG9cbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IGdyYW50IGNvbmZpZ3VyYXRpb246XG4gICAqIC0gYWN0aW9uczogWydiZWRyb2NrLWFnZW50Y29yZTpTdGFydENvZGVJbnRlcnByZXRlclNlc3Npb24nLCAnYmVkcm9jay1hZ2VudGNvcmU6SW52b2tlQ29kZUludGVycHJldGVyJywgJ2JlZHJvY2stYWdlbnRjb3JlOlN0b3BDb2RlSW50ZXJwcmV0ZXJTZXNzaW9uJ11cbiAgICogLSByZXNvdXJjZUFybnM6IFt0aGlzLmNvZGVJbnRlcnByZXRlckFybl1cbiAgICogQHJldHVybnMgQW4gSUFNIEdyYW50IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdyYW50ZWQgcGVybWlzc2lvbnNcbiAgICovXG4gIHB1YmxpYyBncmFudFVzZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBncmFudGVlLFxuICAgICAgLi4ucGVybXMuQ09ERV9JTlRFUlBSRVRFUl9VU0VfUEVSTVMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBpbnZva2UgcGVybWlzc2lvbnMgb24gdGhpcyBjb2RlIGludGVycHJldGVyIHRvIGFuIElBTSBwcmluY2lwYWwuXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIC0gVGhlIElBTSBwcmluY2lwYWwgdG8gZ3JhbnQgaW52b2tlIHBlcm1pc3Npb25zIHRvXG4gICAqIEByZXR1cm5zIEFuIElBTSBHcmFudCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBncmFudCBjb25maWd1cmF0aW9uOlxuICAgKiAtIGFjdGlvbnM6IFsnYmVkcm9jay1hZ2VudGNvcmU6SW52b2tlQ29kZUludGVycHJldGVyJ11cbiAgICogLSByZXNvdXJjZUFybnM6IFt0aGlzLmNvZGVJbnRlcnByZXRlckFybl1cbiAgICovXG4gIHB1YmxpYyBncmFudEludm9rZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoZ3JhbnRlZSwgLi4ucGVybXMuQ09ERV9JTlRFUlBSRVRFUl9JTlZPS0VfUEVSTVMpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIE1ldHJpY3NcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGdpdmVuIG5hbWVkIG1ldHJpYyBmb3IgdGhpcyBjb2RlIGludGVycHJldGVyLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgbWV0cmljIHdpbGwgYmUgY2FsY3VsYXRlZCBhcyBhIHN1bSBvdmVyIGEgcGVyaW9kIG9mIDUgbWludXRlcy5cbiAgICogWW91IGNhbiBjdXN0b21pemUgdGhpcyBieSB1c2luZyB0aGUgYHN0YXRpc3RpY2AgYW5kIGBwZXJpb2RgIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgZGltZW5zaW9uczogRGltZW5zaW9uc01hcCwgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICBjb25zdCBtZXRyaWNQcm9wczogTWV0cmljUHJvcHMgPSB7XG4gICAgICBuYW1lc3BhY2U6ICdBV1MvQmVkcm9jay1BZ2VudENvcmUnLFxuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHsgLi4uZGltZW5zaW9ucywgUmVzb3VyY2U6IHRoaXMuY29kZUludGVycHJldGVyQXJuIH0sXG4gICAgICAuLi5wcm9wcyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmNvb