UNPKG

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

Version:

The CDK Construct Library for Amazon Bedrock

213 lines 25.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.S3ToolSchema = exports.InlineToolSchema = exports.AssetToolSchema = exports.ToolSchema = exports.SchemaDefinitionType = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const aws_iam_1 = require("aws-cdk-lib/aws-iam"); const s3_assets = require("aws-cdk-lib/aws-s3-assets"); const base_schema_1 = require("./base-schema"); /** * Schema definition types */ var SchemaDefinitionType; (function (SchemaDefinitionType) { /** String type */ SchemaDefinitionType["STRING"] = "string"; /** Number type */ SchemaDefinitionType["NUMBER"] = "number"; /** Object type */ SchemaDefinitionType["OBJECT"] = "object"; /** Array type */ SchemaDefinitionType["ARRAY"] = "array"; /** Boolean type */ SchemaDefinitionType["BOOLEAN"] = "boolean"; /** Integer type */ SchemaDefinitionType["INTEGER"] = "integer"; })(SchemaDefinitionType || (exports.SchemaDefinitionType = SchemaDefinitionType = {})); /** * Error thrown when a ToolSchema is not properly initialized. */ class ToolSchemaError extends Error { cause; constructor(message, cause) { super(message); this.cause = cause; this.name = 'ToolSchemaError'; } } /****************************************************************************** * TOOL SCHEMA CLASS *****************************************************************************/ class ToolSchema extends base_schema_1.TargetSchema { static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.ToolSchema", version: "2.227.0-alpha.0" }; /** * Creates a tool Schema from a local file. * @param path - the path to the local file containing the function schema for the tool */ static fromLocalAsset(path) { return new AssetToolSchema(path); } /** * Creates a Tool Schema from an inline string. * @param schema - the JSON or YAML payload defining the OpenAPI schema for the action group */ static fromInline(schema) { return new InlineToolSchema(schema); } /** * Creates a Tool Schema from an S3 File * @param bucket - the bucket containing the local file containing the OpenAPI schema for the action group * @param objectKey - object key in the bucket * @param bucketOwnerAccountId - optional The account ID of the Amazon S3 bucket owner. This ID is used for cross-account access to the bucket. */ static fromS3File(bucket, objectKey, bucketOwnerAccountId) { return new S3ToolSchema({ bucketName: bucket.bucketName, objectKey: objectKey, }, bucketOwnerAccountId); } /** * The S3 location of the tool schema file, if using an S3-based schema. * Contains the bucket name and object key information. */ s3File; /** * The inline tool schema definition as a string, if using an inline schema. * Can be in JSON or YAML format. */ inlineSchema; /** * The account ID of the S3 bucket owner for cross-account access */ bucketOwnerAccountId; constructor(s3File, bucketOwnerAccountId, inlineSchema) { super(); this.s3File = s3File; this.inlineSchema = inlineSchema; this.bucketOwnerAccountId = bucketOwnerAccountId; } } exports.ToolSchema = ToolSchema; /** * Tool Schema from a local asset. * * The asset is uploaded to an S3 staging bucket, then moved to its final location * by CloudFormation during deployment. */ class AssetToolSchema extends ToolSchema { path; options; static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.AssetToolSchema", version: "2.227.0-alpha.0" }; asset; constructor(path, options = {}) { super(); this.path = path; this.options = options; } /** * Binds this tool schema to a construct scope. * This method initializes the S3 asset if it hasn't been initialized yet. * Must be called before rendering the schema as CFN properties. * * @param scope - The construct scope to bind to */ bind(scope) { // If the same AssetToolSchema is used multiple times, retain only the first instantiation if (!this.asset) { this.asset = new s3_assets.Asset(scope, 'Schema', { path: this.path, ...this.options, }); // Note: Permissions will be granted by the Gateway target construct when adding the target } } /** * Format as CFN properties * @internal This is an internal core function and should not be called directly. */ _render() { if (!this.asset) { throw new ToolSchemaError('ToolSchema must be bound to a scope before rendering. Call bind() first.', 'Asset not initialized'); } return { s3: { uri: `s3://${this.asset.s3BucketName}/${this.asset.s3ObjectKey}`, }, }; } grantPermissionsToRole(role) { if (!this.asset) { throw new ToolSchemaError('ToolSchema must be bound to a scope before rendering. Call bind() first.', 'Asset not initialized'); } this.asset.grantRead(role); } } exports.AssetToolSchema = AssetToolSchema; // ------------------------------------------------------ /** * Class to define a Tool Schema from an inline string. * The schema can be provided directly as a string in either JSON or YAML format. */ class InlineToolSchema extends ToolSchema { schema; static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.InlineToolSchema", version: "2.227.0-alpha.0" }; constructor(schema) { super(undefined, undefined, schema); this.schema = schema; } /** * @internal This is an internal core function and should not be called directly. */ _render() { return { inlinePayload: this.schema, }; } bind(scope) { if (scope) { } } grantPermissionsToRole(_role) { } } exports.InlineToolSchema = InlineToolSchema; // ------------------------------------------------------ // S3 File // ------------------------------------------------------ /** * Class to define a Tool Schema from an S3 object. */ class S3ToolSchema extends ToolSchema { location; bucketOwnerAccountId; static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.S3ToolSchema", version: "2.227.0-alpha.0" }; constructor(location, bucketOwnerAccountId) { super(location, bucketOwnerAccountId, undefined); this.location = location; this.bucketOwnerAccountId = bucketOwnerAccountId; } /** * @internal This is an internal core function and should not be called directly. */ _render() { return { s3: { uri: `s3://${this.location.bucketName}/${this.location.objectKey}`, ...(this.bucketOwnerAccountId && { bucketOwnerAccountId: this.bucketOwnerAccountId }), }, }; } bind(scope) { if (scope) { } } grantPermissionsToRole(role) { aws_iam_1.Grant.addToPrincipal({ grantee: role, actions: ['s3:GetObject'], resourceArns: [`arn:${aws_cdk_lib_1.Aws.PARTITION}:s3:::${this.location.bucketName}/${this.location.objectKey}`], }); } } exports.S3ToolSchema = S3ToolSchema; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0b29sLXNjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsNkNBQWtDO0FBQ2xDLGlEQUFtRDtBQUVuRCx1REFBdUQ7QUFFdkQsK0NBQTZDO0FBc0I3Qzs7R0FFRztBQUNILElBQVksb0JBYVg7QUFiRCxXQUFZLG9CQUFvQjtJQUM5QixrQkFBa0I7SUFDbEIseUNBQWlCLENBQUE7SUFDakIsa0JBQWtCO0lBQ2xCLHlDQUFpQixDQUFBO0lBQ2pCLGtCQUFrQjtJQUNsQix5Q0FBaUIsQ0FBQTtJQUNqQixpQkFBaUI7SUFDakIsdUNBQWUsQ0FBQTtJQUNmLG1CQUFtQjtJQUNuQiwyQ0FBbUIsQ0FBQTtJQUNuQixtQkFBbUI7SUFDbkIsMkNBQW1CLENBQUE7QUFDckIsQ0FBQyxFQWJXLG9CQUFvQixvQ0FBcEIsb0JBQW9CLFFBYS9CO0FBMEVEOztHQUVHO0FBQ0gsTUFBTSxlQUFnQixTQUFRLEtBQUs7SUFDWTtJQUE3QyxZQUFZLE9BQWUsRUFBa0IsS0FBYztRQUN6RCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFENEIsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUV6RCxJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO0tBQy9CO0NBQ0Y7QUFFRDs7K0VBRStFO0FBQy9FLE1BQXNCLFVBQVcsU0FBUSwwQkFBWTs7SUFDbkQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFZO1FBQ3ZDLE9BQU8sSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQXdCO1FBQy9DLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNyQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFlLEVBQUUsU0FBaUIsRUFBRSxvQkFBNkI7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QUFDO1FBRHRCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFBa0IseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFTO0tBRTdGO0lBQ0Q7O09BRUc7SUFDSSxPQUFPO1FBQ1osT0FBTztZQUNMLEVBQUUsRUFBRTtnQkFDRixHQUFHLEVBQUUsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDbEUsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLG9CQUFvQixFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2FBQ3RGO1NBQ0YsQ0FBQztLQUNIO0lBRU0sSUFBSSxDQUFDLEtBQWdCO1FBQzFCLElBQUksS0FBSyxFQUFFLENBQUM7UUFDWixDQUFDO0tBRUY7SUFFTSxzQkFBc0IsQ0FBQyxJQUFXO1FBQ3ZDLGVBQUssQ0FBQyxjQUFjLENBQUM7WUFDbkIsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUM7WUFDekIsWUFBWSxFQUFFLENBQUMsT0FBTyxpQkFBRyxDQUFDLFNBQVMsU0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ25HLENBQUMsQ0FBQztLQUNKOztBQTVCSCxvQ0E2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBd3MgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBHcmFudCwgSVJvbGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IElCdWNrZXQsIExvY2F0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHMzX2Fzc2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgVGFyZ2V0U2NoZW1hIH0gZnJvbSAnLi9iYXNlLXNjaGVtYSc7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb29sIFNjaGVtYSBDb25maWd1cmF0aW9uXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQWJzdHJhY3QgaW50ZXJmYWNlIGZvciB0b29sIHNjaGVtYSBjb25maWd1cmF0aW9uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVG9vbFNjaGVtYUNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIHRvb2wgc2NoZW1hIGNvbmZpZ3VyYXRpb24gdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdG9vbFNjaGVtYVR5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRvb2wgc2NoZW1hIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAqL1xuICByZWFkb25seSBjb25maWd1cmF0aW9uOiBhbnk7XG59XG5cbi8qKlxuICogU2NoZW1hIGRlZmluaXRpb24gdHlwZXNcbiAqL1xuZXhwb3J0IGVudW0gU2NoZW1hRGVmaW5pdGlvblR5cGUge1xuICAvKiogU3RyaW5nIHR5cGUgKi9cbiAgU1RSSU5HID0gJ3N0cmluZycsXG4gIC8qKiBOdW1iZXIgdHlwZSAqL1xuICBOVU1CRVIgPSAnbnVtYmVyJyxcbiAgLyoqIE9iamVjdCB0eXBlICovXG4gIE9CSkVDVCA9ICdvYmplY3QnLFxuICAvKiogQXJyYXkgdHlwZSAqL1xuICBBUlJBWSA9ICdhcnJheScsXG4gIC8qKiBCb29sZWFuIHR5cGUgKi9cbiAgQk9PTEVBTiA9ICdib29sZWFuJyxcbiAgLyoqIEludGVnZXIgdHlwZSAqL1xuICBJTlRFR0VSID0gJ2ludGVnZXInLFxufVxuXG4vKipcbiAqIFNjaGVtYSBkZWZpbml0aW9uIGZvciB0b29sIGlucHV0L291dHB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYURlZmluaXRpb24ge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHNjaGVtYSBkZWZpbml0aW9uLiBUaGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSBzY2hlbWEuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBTY2hlbWFEZWZpbml0aW9uVHlwZTtcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzY2hlbWEgZGVmaW5pdGlvbi4gVGhpcyBkZXNjcmlwdGlvbiBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHVycG9zZSBhbmQgdXNhZ2Ugb2YgdGhlIHNjaGVtYS5cbiAgICovXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHNjaGVtYSBkZWZpbml0aW9uLiBUaGlzIGRlc2NyaXB0aW9uIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwdXJwb3NlIGFuZCB1c2FnZSBvZiB0aGUgc2NoZW1hLlxuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGl0ZW1zIGluIHRoZSBzY2hlbWEgZGVmaW5pdGlvbi4gVGhpcyBmaWVsZCBpcyB1c2VkIGZvciBhcnJheSB0eXBlcyB0byBkZWZpbmUgdGhlIHN0cnVjdHVyZSBvZiB0aGUgYXJyYXkgZWxlbWVudHMuXG4gICAqL1xuICAvKipcbiAgICogVGhlIGl0ZW1zIGluIHRoZSBzY2hlbWEgZGVmaW5pdGlvbi4gVGhpcyBmaWVsZCBpcyB1c2VkIGZvciBhcnJheSB0eXBlcyB0byBkZWZpbmUgdGhlIHN0cnVjdHVyZSBvZiB0aGUgYXJyYXkgZWxlbWVudHMuXG4gICAqIEBkZWZhdWx0IC0gTm8gaXRlbXMgZGVmaW5pdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgaXRlbXM/OiBTY2hlbWFEZWZpbml0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBvZiB0aGUgc2NoZW1hIGRlZmluaXRpb24uIFRoZXNlIHByb3BlcnRpZXMgZGVmaW5lIHRoZSBmaWVsZHMgaW4gdGhlIHNjaGVtYS5cbiAgICovXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBvZiB0aGUgc2NoZW1hIGRlZmluaXRpb24uIFRoZXNlIHByb3BlcnRpZXMgZGVmaW5lIHRoZSBmaWVsZHMgaW4gdGhlIHNjaGVtYS5cbiAgICogQGRlZmF1bHQgLSBObyBwcm9wZXJ0aWVzXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgU2NoZW1hRGVmaW5pdGlvbj47XG5cbiAgLyoqXG4gICAqIFRoZSByZXF1aXJlZCBmaWVsZHMgaW4gdGhlIHNjaGVtYSBkZWZpbml0aW9uLiBUaGVzZSBmaWVsZHMgbXVzdCBiZSBwcm92aWRlZCB3aGVuIHVzaW5nIHRoZSBzY2hlbWEuXG4gICAqIEBkZWZhdWx0IC0gTm8gcmVxdWlyZWQgZmllbGRzXG4gICAqL1xuICByZWFkb25seSByZXF1aXJlZD86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRvb2wgZGVmaW5pdGlvbiBmb3IgaW5saW5lIHBheWxvYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sRGVmaW5pdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdG9vbC4gVGhpcyBuYW1lIGlkZW50aWZpZXMgdGhlIHRvb2wgaW4gdGhlIE1vZGVsIENvbnRleHQgUHJvdG9jb2wuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdG9vbC4gVGhpcyBkZXNjcmlwdGlvbiBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHVycG9zZSBhbmQgdXNhZ2Ugb2YgdGhlIHRvb2wuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgc2NoZW1hIGZvciB0aGUgdG9vbC4gVGhpcyBzY2hlbWEgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBpbnB1dCB0aGF0IHRoZSB0b29sIGFjY2VwdHMuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFNjaGVtYTogU2NoZW1hRGVmaW5pdGlvbjtcblxuICAvKipcbiAgICogVGhlIG91dHB1dCBzY2hlbWEgZm9yIHRoZSB0b29sLiBUaGlzIHNjaGVtYSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG91dHB1dCB0aGF0IHRoZSB0b29sIHByb2R1Y2VzLlxuICAgKi9cbiAgLyoqXG4gICAqIFRoZSBvdXRwdXQgc2NoZW1hIGZvciB0aGUgdG9vbC4gVGhpcyBzY2hlbWEgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBvdXRwdXQgdGhhdCB0aGUgdG9vbCBwcm9kdWNlcy5cbiAgICogQGRlZmF1bHQgLSBObyBvdXRwdXQgc2NoZW1hXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRTY2hlbWE/OiBTY2hlbWFEZWZpbml0aW9uO1xufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgVG9vbFNjaGVtYSBpcyBub3QgcHJvcGVybHkgaW5pdGlhbGl6ZWQuXG4gKi9cbmNsYXNzIFRvb2xTY2hlbWFFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBwdWJsaWMgcmVhZG9ubHkgY2F1c2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnVG9vbFNjaGVtYUVycm9yJztcbiAgfVxufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgVE9PTCBTQ0hFTUEgQ0xBU1NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUb29sU2NoZW1hIGV4dGVuZHMgVGFyZ2V0U2NoZW1hIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0b29sIFNjaGVtYSBmcm9tIGEgbG9jYWwgZmlsZS5cbiAgICogQHBhcmFtIHBhdGggLSB0aGUgcGF0aCB0byB0aGUgbG9jYWwgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBzY2hlbWEgZm9yIHRoZSB0b29sXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Mb2NhbEFzc2V0KHBhdGg6IHN0cmluZyk6IFRvb2xTY2hlbWEge1xuICAgIHJldHVybiBuZXcgQXNzZXRUb29sU2NoZW1hKHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBUb29sIFNjaGVtYSBmcm9tIGFuIGlubGluZSBzdHJpbmcuXG4gICAqIEBwYXJhbSBzY2hlbWEgLSB0aGUgSlNPTiBvciBZQU1MIHBheWxvYWQgZGVmaW5pbmcgdGhlIE9wZW5BUEkgc2NoZW1hIGZvciB0aGUgYWN0aW9uIGdyb3VwXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21JbmxpbmUoc2NoZW1hOiBUb29sRGVmaW5pdGlvbltdKTogSW5saW5lVG9vbFNjaGVtYSB7XG4gICAgcmV0dXJuIG5ldyBJbmxpbmVUb29sU2NoZW1hKHNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIFRvb2wgU2NoZW1hIGZyb20gYW4gUzMgRmlsZVxuICAgKiBAcGFyYW0gYnVja2V0IC0gdGhlIGJ1Y2tldCBjb250YWluaW5nIHRoZSBsb2NhbCBmaWxlIGNvbnRhaW5pbmcgdGhlIE9wZW5BUEkgc2NoZW1hIGZvciB0aGUgYWN0aW9uIGdyb3VwXG4gICAqIEBwYXJhbSBvYmplY3RLZXkgLSBvYmplY3Qga2V5IGluIHRoZSBidWNrZXRcbiAgICogQHBhcmFtIGJ1Y2tldE93bmVyQWNjb3VudElkIC0gb3B0aW9uYWwgVGhlIGFjY291bnQgSUQgb2YgdGhlIEFtYXpvbiBTMyBidWNrZXQgb3duZXIuIFRoaXMgSUQgaXMgdXNlZCBmb3IgY3Jvc3MtYWNjb3VudCBhY2Nlc3MgdG8gdGhlIGJ1Y2tldC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVMzRmlsZShidWNrZXQ6IElCdWNrZXQsIG9iamVjdEtleTogc3RyaW5nLCBidWNrZXRPd25lckFjY291bnRJZD86IHN0cmluZyk6IFMzVG9vbFNjaGVtYSB7XG4gICAgcmV0dXJuIG5ldyBTM1Rvb2xTY2hlbWEoXG4gICAgICB7XG4gICAgICAgIGJ1Y2tldE5hbWU6IGJ1Y2tldC5idWNrZXROYW1lLFxuICAgICAgICBvYmplY3RLZXk6IG9iamVjdEtleSxcbiAgICAgIH0sXG4gICAgICBidWNrZXRPd25lckFjY291bnRJZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBTMyBsb2NhdGlvbiBvZiB0aGUgdG9vbCBzY2hlbWEgZmlsZSwgaWYgdXNpbmcgYW4gUzMtYmFzZWQgc2NoZW1hLlxuICAgKiBDb250YWlucyB0aGUgYnVja2V0IG5hbWUgYW5kIG9iamVjdCBrZXkgaW5mb3JtYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgczNGaWxlPzogTG9jYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBpbmxpbmUgdG9vbCBzY2hlbWEgZGVmaW5pdGlvbiBhcyBhIHN0cmluZywgaWYgdXNpbmcgYW4gaW5saW5lIHNjaGVtYS5cbiAgICogQ2FuIGJlIGluIEpTT04gb3IgWUFNTCBmb3JtYXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW5saW5lU2NoZW1hPzogVG9vbERlZmluaXRpb25bXTtcblxuICAvKipcbiAgICogVGhlIGFjY291bnQgSUQgb2YgdGhlIFMzIGJ1Y2tldCBvd25lciBmb3IgY3Jvc3MtYWNjb3VudCBhY2Nlc3NcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBidWNrZXRPd25lckFjY291bnRJZD86IHN0cmluZztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoczNGaWxlPzogTG9jYXRpb24sIGJ1Y2tldE93bmVyQWNjb3VudElkPzogc3RyaW5nLCBpbmxpbmVTY2hlbWE/OiBUb29sRGVmaW5pdGlvbltdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnMzRmlsZSA9IHMzRmlsZTtcbiAgICB0aGlzLmlubGluZVNjaGVtYSA9IGlubGluZVNjaGVtYTtcbiAgICB0aGlzLmJ1Y2tldE93bmVyQWNjb3VudElkID0gYnVja2V0T3duZXJBY2NvdW50SWQ7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGFzIENGTiBwcm9wZXJ0aWVzXG4gICAqIEBpbnRlcm5hbCBUaGlzIGlzIGFuIGludGVybmFsIGNvcmUgZnVuY3Rpb24gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IF9yZW5kZXIoKTogYW55O1xufVxuXG4vKipcbiAqIFRvb2wgU2NoZW1hIGZyb20gYSBsb2NhbCBhc3NldC5cbiAqXG4gKiBUaGUgYXNzZXQgaXMgdXBsb2FkZWQgdG8gYW4gUzMgc3RhZ2luZyBidWNrZXQsIHRoZW4gbW92ZWQgdG8gaXRzIGZpbmFsIGxvY2F0aW9uXG4gKiBieSBDbG91ZEZvcm1hdGlvbiBkdXJpbmcgZGVwbG95bWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFzc2V0VG9vbFNjaGVtYSBleHRlbmRzIFRvb2xTY2hlbWEge1xuICBwcml2YXRlIGFzc2V0PzogczNfYXNzZXRzLkFzc2V0O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcGF0aDogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IHMzX2Fzc2V0cy5Bc3NldE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgdGhpcyB0b29sIHNjaGVtYSB0byBhIGNvbnN0cnVjdCBzY29wZS5cbiAgICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIFMzIGFzc2V0IGlmIGl0IGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldC5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJlbmRlcmluZyB0aGUgc2NoZW1hIGFzIENGTiBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgY29uc3RydWN0IHNjb3BlIHRvIGJpbmQgdG9cbiAgICovXG4gIHB1YmxpYyBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICAvLyBJZiB0aGUgc2FtZSBBc3NldFRvb2xTY2hlbWEgaXMgdXNlZCBtdWx0aXBsZSB0aW1lcywgcmV0YWluIG9ubHkgdGhlIGZpcnN0IGluc3RhbnRpYXRpb25cbiAgICBpZiAoIXRoaXMuYXNzZXQpIHtcbiAgICAgIHRoaXMuYXNzZXQgPSBuZXcgczNfYXNzZXRzLkFzc2V0KHNjb3BlLCAnU2NoZW1hJywge1xuICAgICAgICBwYXRoOiB0aGlzLnBhdGgsXG4gICAgICAgIC4uLnRoaXMub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgICAgLy8gTm90ZTogUGVybWlzc2lvbnMgd2lsbCBiZSBncmFudGVkIGJ5IHRoZSBHYXRld2F5IHRhcmdldCBjb25zdHJ1Y3Qgd2hlbiBhZGRpbmcgdGhlIHRhcmdldFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYXMgQ0ZOIHByb3BlcnRpZXNcbiAgICogQGludGVybmFsIFRoaXMgaXMgYW4gaW50ZXJuYWwgY29yZSBmdW5jdGlvbiBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG4gICAqL1xuICBwdWJsaWMgX3JlbmRlcigpOiBhbnkge1xuICAgIGlmICghdGhpcy5hc3NldCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xTY2hlbWFFcnJvcihcbiAgICAgICAgJ1Rvb2xTY2hlbWEgbXVzdCBiZSBib3VuZCB0byBhIHNjb3BlIGJlZm9yZSByZW5kZXJpbmcuIENhbGwgYmluZCgpIGZpcnN0LicsXG4gICAgICAgICdBc3NldCBub3QgaW5pdGlhbGl6ZWQnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgczM6IHtcbiAgICAgICAgdXJpOiBgczM6Ly8ke3RoaXMuYXNzZXQuczNCdWNrZXROYW1lfS8ke3RoaXMuYXNzZXQuczNPYmplY3RLZXl9YCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBncmFudFBlcm1pc3Npb25zVG9Sb2xlKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFzc2V0KSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbFNjaGVtYUVycm9yKFxuICAgICAgICAnVG9vbFNjaGVtYSBtdXN0IGJlIGJvdW5kIHRvIGEgc2NvcGUgYmVmb3JlIHJlbmRlcmluZy4gQ2FsbCBiaW5kKCkgZmlyc3QuJyxcbiAgICAgICAgJ0Fzc2V0IG5vdCBpbml0aWFsaXplZCcsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFzc2V0LmdyYW50UmVhZChyb2xlKTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qKlxuICogQ2xhc3MgdG8gZGVmaW5lIGEgVG9vbCBTY2hlbWEgZnJvbSBhbiBpbmxpbmUgc3RyaW5nLlxuICogVGhlIHNjaGVtYSBjYW4gYmUgcHJvdmlkZWQgZGlyZWN0bHkgYXMgYSBzdHJpbmcgaW4gZWl0aGVyIEpTT04gb3IgWUFNTCBmb3JtYXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmxpbmVUb29sU2NoZW1hIGV4dGVuZHMgVG9vbFNjaGVtYSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hOiBUb29sRGVmaW5pdGlvbltdKSB7XG4gICAgc3VwZXIodW5kZWZpbmVkLCB1bmRlZmluZWQsIHNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsIFRoaXMgaXMgYW4gaW50ZXJuYWwgY29yZSBmdW5jdGlvbiBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG4gICAqL1xuICBwdWJsaWMgX3JlbmRlcigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBpbmxpbmVQYXlsb2FkOiB0aGlzLnNjaGVtYSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGJpbmQoc2NvcGU6IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIGlmIChzY29wZSkge1xuICAgIH1cbiAgICAvLyBOby1vcFxuICB9XG5cbiAgcHVibGljIGdyYW50UGVybWlzc2lvbnNUb1JvbGUoX3JvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgLy8gTm8tb3AgLSBJbmxpbmVUb29sU2NoZW1hIGRvZXNuJ3QgbmVlZCBwZXJtaXNzaW9uc1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUzMgRmlsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKipcbiAqIENsYXNzIHRvIGRlZmluZSBhIFRvb2wgU2NoZW1hIGZyb20gYW4gUzMgb2JqZWN0LlxuICovXG5leHBvcnQgY2xhc3MgUzNUb29sU2NoZW1hIGV4dGVuZHMgVG9vbFNjaGVtYSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbG9jYXRpb246IExvY2F0aW9uLCBwdWJsaWMgcmVhZG9ubHkgYnVja2V0T3duZXJBY2NvdW50SWQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihsb2NhdGlvbiwgYnVja2V0T3duZXJBY2NvdW50SWQsIHVuZGVmaW5lZCk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBUaGlzIGlzIGFuIGludGVybmFsIGNvcmUgZnVuY3Rpb24gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIF9yZW5kZXIoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgczM6IHtcbiAgICAgICAgdXJpOiBgczM6Ly8ke3RoaXMubG9jYXRpb24uYnVja2V0TmFtZX0vJHt0aGlzLmxvY2F0aW9uLm9iamVjdEtleX1gLFxuICAgICAgICAuLi4odGhpcy5idWNrZXRPd25lckFjY291bnRJZCAmJiB7IGJ1Y2tldE93bmVyQWNjb3VudElkOiB0aGlzLmJ1Y2tldE93bmVyQWNjb3VudElkIH0pLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGJpbmQoc2NvcGU6IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIGlmIChzY29wZSkge1xuICAgIH1cbiAgICAvLyBOby1vcFxuICB9XG5cbiAgcHVibGljIGdyYW50UGVybWlzc2lvbnNUb1JvbGUocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICBHcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlOiByb2xlLFxuICAgICAgYWN0aW9uczogWydzMzpHZXRPYmplY3QnXSxcbiAgICAgIHJlc291cmNlQXJuczogW2Bhcm46JHtBd3MuUEFSVElUSU9OfTpzMzo6OiR7dGhpcy5sb2NhdGlvbi5idWNrZXROYW1lfS8ke3RoaXMubG9jYXRpb24ub2JqZWN0S2V5fWBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=