UNPKG

@aws-cdk/aws-bedrock-agentcore-alpha

Version:

The CDK Construct Library for Amazon Bedrock

553 lines 73.2 kB
"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