@aws-cdk/aws-bedrock-agentcore-alpha
Version:
The CDK Construct Library for Amazon Bedrock
254 lines • 33.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SelfManagedMemoryStrategy = void 0;
const jsiiDeprecationWarnings = require("../../../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const cdk = require("aws-cdk-lib");
const iam = require("aws-cdk-lib/aws-iam");
const memory_strategy_1 = require("../memory-strategy");
const validation_helpers_1 = require("../validation-helpers");
/******************************************************************************
* CONSTANTS
*****************************************************************************/
/**
* Minimum value for time-based trigger in seconds
* @internal
*/
const TIME_BASED_TRIGGER_MIN = 10;
/**
* Maximum value for time-based trigger in seconds
* @internal
*/
const TIME_BASED_TRIGGER_MAX = 3000;
/**
* Minimum value for token-based trigger
* @internal
*/
const TOKEN_BASED_TRIGGER_MIN = 100;
/**
* Maximum value for token-based trigger
* @internal
*/
const TOKEN_BASED_TRIGGER_MAX = 500000;
/**
* Minimum value for message-based trigger
* @internal
*/
const MESSAGE_BASED_TRIGGER_MIN = 1;
/**
* Maximum value for message-based trigger
* @internal
*/
const MESSAGE_BASED_TRIGGER_MAX = 50;
/**
* Minimum value for historical context window size
* @internal
*/
const HISTORICAL_CONTEXT_WINDOW_SIZE_MIN = 0;
/**
* Maximum value for historical context window size
* @internal
*/
const HISTORICAL_CONTEXT_WINDOW_SIZE_MAX = 50;
/**
* Default value for historical context window size
* @internal
*/
const DEFAULT_HISTORICAL_CONTEXT_WINDOW_SIZE = 4;
/**
* Default value for message-based trigger
* @internal
*/
const DEFAULT_MESSAGE_BASED_TRIGGER = 1;
/**
* Default value for time-based trigger
* @internal
*/
const DEFAULT_TIME_BASED_TRIGGER = cdk.Duration.seconds(10);
/**
* Default value for token-based trigger
* @internal
*/
const DEFAULT_TOKEN_BASED_TRIGGER = 100;
/**
* Use AgentCore memory for event storage with custom triggers. Define memory processing logic in your own environment.
*/
class SelfManagedMemoryStrategy {
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.SelfManagedMemoryStrategy", version: "2.227.0-alpha.0" };
name;
description;
strategyType;
/**
* Invocation configuration for self managed memory strategy
*/
invocationConfiguration;
/**
* Trigger conditions for self managed memory strategy
*/
triggerConditions;
/**
* Historical context window size for self managed memory strategy
*/
historicalContextWindowSize;
constructor(strategyType, props) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_MemoryStrategyType(strategyType);
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_SelfManagedStrategyProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, SelfManagedMemoryStrategy);
}
throw error;
}
this.name = props.name;
this.description = props.description;
this.strategyType = strategyType;
this.invocationConfiguration = props.invocationConfiguration;
this.triggerConditions = {
messageBasedTrigger: props.triggerConditions?.messageBasedTrigger ?? DEFAULT_MESSAGE_BASED_TRIGGER,
timeBasedTrigger: props.triggerConditions?.timeBasedTrigger ?? DEFAULT_TIME_BASED_TRIGGER,
tokenBasedTrigger: props.triggerConditions?.tokenBasedTrigger ?? DEFAULT_TOKEN_BASED_TRIGGER,
};
this.historicalContextWindowSize = props.historicalContextWindowSize ?? DEFAULT_HISTORICAL_CONTEXT_WINDOW_SIZE;
// ------------------------------------------------------
// Validations
// ------------------------------------------------------
(0, validation_helpers_1.throwIfInvalid)(this._validateMemoryStrategyName, this.name);
(0, validation_helpers_1.throwIfInvalid)(this._validateHistoricalContextWindowSize, this.historicalContextWindowSize);
(0, validation_helpers_1.throwIfInvalid)(this._validateTriggerConditions, this.triggerConditions);
}
render() {
return {
customMemoryStrategy: {
name: this.name,
description: this.description,
type: this.strategyType,
configuration: {
selfManagedConfiguration: {
historicalContextWindowSize: this.historicalContextWindowSize,
invocationConfiguration: {
topicArn: this.invocationConfiguration.topic.topicArn,
payloadDeliveryBucketName: this.invocationConfiguration.s3Location.bucketName,
},
triggerConditions: [
{
messageBasedTrigger: {
messageCount: this.triggerConditions.messageBasedTrigger,
},
},
{
timeBasedTrigger: {
idleSessionTimeout: this.triggerConditions.timeBasedTrigger?.toSeconds(),
},
},
{
tokenBasedTrigger: {
tokenCount: this.triggerConditions.tokenBasedTrigger,
},
},
],
},
},
},
}; // Type assertion to work around CloudFormation type limitations
}
/**
* Grants the necessary permissions to the role
* @param grantee - The grantee to grant permissions to
* @returns The Grant object for chaining
*/
grant(grantee) {
// no existing grant method that provides both required sns actions
const grant1 = iam.Grant.addToPrincipal({
grantee: grantee,
actions: ['sns:GetTopicAttributes', 'sns:Publish'],
resourceArns: [
this.invocationConfiguration.topic.topicArn,
],
});
let grant2;
// we don't have the scope here, so we add manually the permissions to the role policy
if (this.invocationConfiguration?.s3Location) {
// Grant S3 permissions for the specified location
grant2 = iam.Grant.addToPrincipal({
grantee: grantee,
actions: [
's3:GetBucketLocation',
's3:PutObject',
],
resourceArns: [
`arn:${cdk.Aws.PARTITION}:s3:::${this.invocationConfiguration.s3Location.bucketName}`,
`arn:${cdk.Aws.PARTITION}:s3:::${this.invocationConfiguration.s3Location.bucketName}/*`,
],
});
}
return grant1 && grant2 ? grant1.combine(grant2) : grant1 || grant2;
}
// ------------------------------------------------------
// VALIDATORS
// ------------------------------------------------------
/**
* Validates the memory strategy name
* @param name - The name to validate
* @returns Array of validation error messages, empty if valid
*/
_validateMemoryStrategyName = (name, scope) => {
let errors = [];
errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
value: name,
fieldName: 'Memory name',
minLength: memory_strategy_1.MEMORY_NAME_MIN_LENGTH,
maxLength: memory_strategy_1.MEMORY_NAME_MAX_LENGTH,
}, scope));
// 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, 'Memory name', validNamePattern, undefined, scope));
return errors;
};
/**
* Validates the historical context window size
* @param historicalContextWindowSize - The historical context window size to validate
* @returns Array of validation error messages, empty if valid
*/
_validateHistoricalContextWindowSize = (historicalContextWindowSize) => {
let errors = [];
if (historicalContextWindowSize < HISTORICAL_CONTEXT_WINDOW_SIZE_MIN
|| historicalContextWindowSize > HISTORICAL_CONTEXT_WINDOW_SIZE_MAX) {
errors.push(`Historical context window size must be between ${HISTORICAL_CONTEXT_WINDOW_SIZE_MIN} and ${HISTORICAL_CONTEXT_WINDOW_SIZE_MAX}, got ${historicalContextWindowSize}`);
}
return errors;
};
/**
* Validates the trigger conditions
* @param triggerConditions - The trigger conditions to validate
* @returns Array of validation error messages, empty if valid
*/
_validateTriggerConditions = (triggerConditions) => {
let errors = [];
// Validate message-based trigger
if (triggerConditions.messageBasedTrigger !== undefined) {
if (triggerConditions.messageBasedTrigger < MESSAGE_BASED_TRIGGER_MIN
|| triggerConditions.messageBasedTrigger > MESSAGE_BASED_TRIGGER_MAX) {
errors.push(`Message-based trigger must be between ${MESSAGE_BASED_TRIGGER_MIN} and ${MESSAGE_BASED_TRIGGER_MAX}, got ${triggerConditions.messageBasedTrigger}`);
}
}
// Validate time-based trigger
if (triggerConditions.timeBasedTrigger !== undefined) {
const seconds = triggerConditions.timeBasedTrigger.toSeconds();
if (seconds < TIME_BASED_TRIGGER_MIN || seconds > TIME_BASED_TRIGGER_MAX) {
errors.push(`Time-based trigger must be between ${TIME_BASED_TRIGGER_MIN} and ${TIME_BASED_TRIGGER_MAX} seconds, got ${seconds}`);
}
}
// Validate token-based trigger
if (triggerConditions.tokenBasedTrigger !== undefined) {
if (triggerConditions.tokenBasedTrigger < TOKEN_BASED_TRIGGER_MIN || triggerConditions.tokenBasedTrigger > TOKEN_BASED_TRIGGER_MAX) {
errors.push(`Token-based trigger must be between ${TOKEN_BASED_TRIGGER_MIN} and ${TOKEN_BASED_TRIGGER_MAX}, got ${triggerConditions.tokenBasedTrigger}`);
}
}
return errors;
};
}
exports.SelfManagedMemoryStrategy = SelfManagedMemoryStrategy;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZi1tYW5hZ2VkLXN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VsZi1tYW5hZ2VkLXN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBY0EsbUNBQW1DO0FBR25DLDJDQUEyQztBQUUzQyx3REFBb0o7QUFDcEosOERBQXdHO0FBRXhHOzsrRUFFK0U7QUFDL0U7OztHQUdHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFDbEM7OztHQUdHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUM7QUFDcEM7OztHQUdHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFDcEM7OztHQUdHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUM7QUFDdkM7OztHQUdHO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLENBQUM7QUFDcEM7OztHQUdHO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLENBQUM7QUFDckM7OztHQUdHO0FBQ0gsTUFBTSxrQ0FBa0MsR0FBRyxDQUFDLENBQUM7QUFDN0M7OztHQUdHO0FBQ0gsTUFBTSxrQ0FBa0MsR0FBRyxFQUFFLENBQUM7QUFDOUM7OztHQUdHO0FBQ0gsTUFBTSxzQ0FBc0MsR0FBRyxDQUFDLENBQUM7QUFDakQ7OztHQUdHO0FBQ0gsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUM7QUFDeEM7OztHQUdHO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1RDs7O0dBR0c7QUFDSCxNQUFNLDJCQUEyQixHQUFHLEdBQUcsQ0FBQztBQTREeEM7O0dBRUc7QUFDSCxNQUFhLHlCQUF5Qjs7SUFDcEIsSUFBSSxDQUFTO0lBQ2IsV0FBVyxDQUFVO0lBQ3JCLFlBQVksQ0FBcUI7SUFDakQ7O09BRUc7SUFDYSx1QkFBdUIsQ0FBMEI7SUFDakU7O09BRUc7SUFDYSxpQkFB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UUFBUSxzQkFBc0IsaUJBQWlCLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDcEksQ0FBQztRQUNILENBQUM7UUFFRCwrQkFBK0I7UUFDL0IsSUFBSSxpQkFBaUIsQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0RCxJQUFJLGlCQUFpQixDQUFDLGlCQUFpQixHQUFHLHVCQUF1QixJQUFJLGlCQUFpQixDQUFDLGlCQUFpQixHQUFHLHVCQUF1QixFQUFFLENBQUM7Z0JBQ25JLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLHVCQUF1QixRQUFRLHVCQUF1QixTQUFTLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUMzSixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQzs7QUF2TEosOERBd0xDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIikuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqICB3aXRoIHRoZSBMaWNlbnNlLiBBIGNvcHkgb2YgdGhlIExpY2Vuc2UgaXMgbG9jYXRlZCBhdFxuICpcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIG9yIGluIHRoZSAnbGljZW5zZScgZmlsZSBhY2NvbXBhbnlpbmcgdGhpcyBmaWxlLiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTXG4gKiAgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbiAqICBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0ICogYXMgc25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGJlZHJvY2thZ2VudGNvcmUgZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2thZ2VudGNvcmUnO1xuaW1wb3J0IHsgSU1lbW9yeVN0cmF0ZWd5LCBNZW1vcnlTdHJhdGVneUNvbW1vblByb3BzLCBNZW1vcnlTdHJhdGVneVR5cGUsIE1FTU9SWV9OQU1FX01JTl9MRU5HVEgsIE1FTU9SWV9OQU1FX01BWF9MRU5HVEggfSBmcm9tICcuLi9tZW1vcnktc3RyYXRlZ3knO1xuaW1wb3J0IHsgdmFsaWRhdGVTdHJpbmdGaWVsZExlbmd0aCwgdGhyb3dJZkludmFsaWQsIHZhbGlkYXRlRmllbGRQYXR0ZXJuIH0gZnJvbSAnLi4vdmFsaWRhdGlvbi1oZWxwZXJzJztcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVEFOVFNcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogTWluaW11bSB2YWx1ZSBmb3IgdGltZS1iYXNlZCB0cmlnZ2VyIGluIHNlY29uZHNcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBUSU1FX0JBU0VEX1RSSUdHRVJfTUlOID0gMTA7XG4vKipcbiAqIE1heGltdW0gdmFsdWUgZm9yIHRpbWUtYmFzZWQgdHJpZ2dlciBpbiBzZWNvbmRzXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgVElNRV9CQVNFRF9UUklHR0VSX01BWCA9IDMwMDA7XG4vKipcbiAqIE1pbmltdW0gdmFsdWUgZm9yIHRva2VuLWJhc2VkIHRyaWdnZXJcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBUT0tFTl9CQVNFRF9UUklHR0VSX01JTiA9IDEwMDtcbi8qKlxuICogTWF4aW11bSB2YWx1ZSBmb3IgdG9rZW4tYmFzZWQgdHJpZ2dlclxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IFRPS0VOX0JBU0VEX1RSSUdHRVJfTUFYID0gNTAwMDAwO1xuLyoqXG4gKiBNaW5pbXVtIHZhbHVlIGZvciBtZXNzYWdlLWJhc2VkIHRyaWdnZXJcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBNRVNTQUdFX0JBU0VEX1RSSUdHRVJfTUlOID0gMTtcbi8qKlxuICogTWF4aW11bSB2YWx1ZSBmb3IgbWVzc2FnZS1iYXNlZCB0cmlnZ2VyXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgTUVTU0FHRV9CQVNFRF9UUklHR0VSX01BWCA9IDUwO1xuLyoqXG4gKiBNaW5pbXVtIHZhbHVlIGZvciBoaXN0b3JpY2FsIGNvbnRleHQgd2luZG93IHNpemVcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBISVNUT1JJQ0FMX0NPTlRFWFRfV0lORE9XX1NJWkVfTUlOID0gMDtcbi8qKlxuICogTWF4aW11bSB2YWx1ZSBmb3IgaGlzdG9yaWNhbCBjb250ZXh0IHdpbmRvdyBzaXplXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgSElTVE9SSUNBTF9DT05URVhUX1dJTkRPV19TSVpFX01BWCA9IDUwO1xuLyoqXG4gKiBEZWZhdWx0IHZhbHVlIGZvciBoaXN0b3JpY2FsIGNvbnRleHQgd2luZG93IHNpemVcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBERUZBVUxUX0hJU1RPUklDQUxfQ09OVEVYVF9XSU5ET1dfU0laRSA9IDQ7XG4vKipcbiAqIERlZmF1bHQgdmFsdWUgZm9yIG1lc3NhZ2UtYmFzZWQgdHJpZ2dlclxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IERFRkFVTFRfTUVTU0FHRV9CQVNFRF9UUklHR0VSID0gMTtcbi8qKlxuICogRGVmYXVsdCB2YWx1ZSBmb3IgdGltZS1iYXNlZCB0cmlnZ2VyXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgREVGQVVMVF9USU1FX0JBU0VEX1RSSUdHRVIgPSBjZGsuRHVyYXRpb24uc2Vjb25kcygxMCk7XG4vKipcbiAqIERlZmF1bHQgdmFsdWUgZm9yIHRva2VuLWJhc2VkIHRyaWdnZXJcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBERUZBVUxUX1RPS0VOX0JBU0VEX1RSSUdHRVIgPSAxMDA7XG5cbi8qKlxuICogVHJpZ2dlciBjb25kaXRpb25zIGZvciBzZWxmIG1hbmFnZWQgbWVtb3J5IHN0cmF0ZWd5XG4gKiBXaGVuIGZpcnN0IGNvbmRpdGlvbiBpcyBtZXQsIGJhdGNoZWQgcGF5bG9hZHMgYXJlIHNlbnQgdG8gc3BlY2lmaWVkIFMzIGJ1Y2tldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmlnZ2VyQ29uZGl0aW9ucyB7XG4gIC8qKlxuICAgKiBUcmlnZ2VycyBtZW1vcnkgcHJvY2Vzc2luZyB3aGVuIHNwZWNpZmllZCBudW1iZXIgb2YgbmV3IG1lc3NhZ2VzIGlzIHJlYWNoZWRcbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZUJhc2VkVHJpZ2dlcj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRyaWdnZXJzIG1lbW9yeSBwcm9jZXNzaW5nIHdoZW4gdGhlIHNlc3Npb24gaGFzIGJlZW4gaWRsZSBmb3IgdGhlIHNwZWNpZmllZCBkdXJhdGlvbi5cbiAgICogVmFsdWUgaW4gc2Vjb25kcy5cbiAgICogQGRlZmF1bHQgLSAxMCBzZWNvbmRzXG4gICAqL1xuICByZWFkb25seSB0aW1lQmFzZWRUcmlnZ2VyPzogY2RrLkR1cmF0aW9uO1xuICAvKipcbiAgICogVHJpZ2dlcnMgbWVtb3J5IHByb2Nlc3Npbmcgd2hlbiB0aGUgdG9rZW4gc2l6ZSByZWFjaGVzIHRoZSBzcGVjaWZpZWQgdGhyZXNob2xkLlxuICAgKiBAZGVmYXVsdCAxMDBcbiAgICovXG4gIHJlYWRvbmx5IHRva2VuQmFzZWRUcmlnZ2VyPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEludm9jYXRpb24gY29uZmlndXJhdGlvbiBmb3Igc2VsZiBtYW5hZ2VkIG1lbW9yeSBzdHJhdGVneVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludm9jYXRpb25Db25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFNOUyBUb3BpYyBDb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSB0b3BpYzogc25zLklUb3BpYztcbiAgLyoqXG4gICAqIFMzIExvY2F0aW9uIENvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHMzTG9jYXRpb246IExvY2F0aW9uO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgYSBzZWxmIG1hbmFnZWQgbWVtb3J5IHN0cmF0ZWd5XG4gKiBleGlzdGluZyBidWlsdC1pbiBkZWZhdWx0IHByb21wdHMvbW9kZWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZk1hbmFnZWRTdHJhdGVneVByb3BzIGV4dGVuZHMgTWVtb3J5U3RyYXRlZ3lDb21tb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBEZWZpbmUgdGhlIG51bWJlciBvZiBwcmV2aW91cyBldmVudHMgdG8gYmUgaW5jbHVkZWQgd2hlbiBwcm9jZXNzaW5nIG1lbW9yeS4gQSBsYXJnZXIgaGlzdG9yeSB3aW5kb3cgcHJvdmlkZXMgbW9yZSBjb250ZXh0IGZyb20gcGFzdCBjb252ZXJzYXRpb25zLlxuICAgKiBAZGVmYXVsdCA0XG4gICAqL1xuICByZWFkb25seSBoaXN0b3JpY2FsQ29udGV4dFdpbmRvd1NpemU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJbnZvY2F0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHNlbGYgbWFuYWdlZCBtZW1vcnkgc3RyYXRlZ3lcbiAgICovXG4gIHJlYWRvbmx5IGludm9jYXRpb25Db25maWd1cmF0aW9uOiBJbnZvY2F0aW9uQ29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICAqIFRyaWdnZXIgY29uZGl0aW9ucyBmb3Igc2VsZiBtYW5hZ2VkIG1lbW9yeSBzdHJhdGVneVxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgdHJpZ2dlckNvbmRpdGlvbnM/OiBUcmlnZ2VyQ29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBVc2UgQWdlbnRDb3JlIG1lbW9yeSBmb3IgZXZlbnQgc3RvcmFnZSB3aXRoIGN1c3RvbSB0cmlnZ2Vycy4gRGVmaW5lIG1lbW9yeSBwcm9jZXNzaW5nIGxvZ2ljIGluIHlvdXIgb3duIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgY2xhc3MgU2VsZk1hbmFnZWRNZW1vcnlTdHJhdGVneSBpbXBsZW1lbnRzIElNZW1vcnlTdHJhdGVneSB7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHN0cmF0ZWd5VHlwZTogTWVtb3J5U3RyYXRlZ3lUeXBlO1xuICAvKipcbiAgICogSW52b2NhdGlvbiBjb25maWd1cmF0aW9uIGZvciBzZWxmIG1hbmFnZWQgbWVtb3J5IHN0cmF0ZWd5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW52b2NhdGlvbkNvbmZpZ3VyYXRpb246IEludm9jYXRpb25Db25maWd1cmF0aW9uO1xuICAvKipcbiAgICogVHJpZ2dlciBjb25kaXRpb25zIGZvciBzZWxmIG1hbmFnZWQgbWVtb3J5IHN0cmF0ZWd5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJpZ2dlckNvbmRpdGlvbnM6IFRyaWdnZXJDb25kaXRpb25zO1xuICAvKipcbiAgICogSGlzdG9yaWNhbCBjb250ZXh0IHdpbmRvdyBzaXplIGZvciBzZWxmIG1hbmFnZWQgbWVtb3J5IHN0cmF0ZWd5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGlzdG9yaWNhbENvbnRleHRXaW5kb3dTaXplOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Ioc3RyYXRlZ3lUeXBlOiBNZW1vcnlTdHJhdGVneVR5cGUsIHByb3BzOiBTZWxmTWFuYWdlZFN0cmF0ZWd5UHJvcHMpIHtcbiAgICB0aGlzLm5hbWUgPSBwcm9wcy5uYW1lO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBwcm9wcy5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLnN0cmF0ZWd5VHlwZSA9IHN0cmF0ZWd5VHlwZTtcbiAgICB0aGlzLmludm9jYXRpb25Db25maWd1cmF0aW9uID0gcHJvcHMuaW52b2NhdGlvbkNvbmZpZ3VyYXRpb247XG4gICAgdGhpcy50cmlnZ2VyQ29uZGl0aW9ucyA9IHtcbiAgICAgIG1lc3NhZ2VCYXNlZFRyaWdnZXI6IHByb3BzLnRyaWdnZXJDb25kaXRpb25zPy5tZXNzYWdlQmFzZWRUcmlnZ2VyID8/IERFRkFVTFRfTUVTU0FHRV9CQVNFRF9UUklHR0VSLFxuICAgICAgdGltZUJhc2VkVHJpZ2dlcjogcHJvcHMudHJpZ2dlckNvbmRpdGlvbnM/LnRpbWVCYXNlZFRyaWdnZXIgPz8gREVGQVVMVF9USU1FX0JBU0VEX1RSSUdHRVIsXG4gICAgICB0b2tlbkJhc2VkVHJpZ2dlcjogcHJvcHMudHJpZ2dlckNvbmRpdGlvbnM/LnRva2VuQmFzZWRUcmlnZ2VyID8/IERFRkFVTFRfVE9LRU5fQkFTRURfVFJJR0dFUixcbiAgICB9O1xuICAgIHRoaXMuaGlzdG9yaWNhbENvbnRleHRXaW5kb3dTaXplID0gcHJvcHMuaGlzdG9yaWNhbENvbnRleHRXaW5kb3dTaXplID8/IERFRkFVTFRfSElTVE9SSUNBTF9DT05URVhUX1dJTkRPV19TSVpFO1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gVmFsaWRhdGlvbnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICB0aHJvd0lmSW52YWxpZCh0aGlzLl92YWxpZGF0ZU1lbW9yeVN0cmF0ZWd5TmFtZSwgdGhpcy5uYW1lKTtcbiAgICB0aHJvd0lmSW52YWxpZCh0aGlzLl92YWxpZGF0ZUhpc3RvcmljYWxDb250ZXh0V2luZG93U2l6ZSwgdGhpcy5oaXN0b3JpY2FsQ29udGV4dFdpbmRvd1NpemUpO1xuICAgIHRocm93SWZJbnZhbGlkKHRoaXMuX3ZhbGlkYXRlVHJpZ2dlckNvbmRpdGlvbnMsIHRoaXMudHJpZ2dlckNvbmRpdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHJlbmRlcigpOiBiZWRyb2NrYWdlbnRjb3JlLkNmbk1lbW9yeS5NZW1vcnlTdHJhdGVneVByb3BlcnR5IHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VzdG9tTWVtb3J5U3RyYXRlZ3k6IHtcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgdHlwZTogdGhpcy5zdHJhdGVneVR5cGUsXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBzZWxmTWFuYWdlZENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgIGhpc3RvcmljYWxDb250ZXh0V2luZG93U2l6ZTogdGhpcy5oaXN0b3JpY2FsQ29udGV4dFdpbmRvd1NpemUsXG4gICAgICAgICAgICBpbnZvY2F0aW9uQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICB0b3BpY0FybjogdGhpcy5pbnZvY2F0aW9uQ29uZmlndXJhdGlvbi50b3BpYy50b3BpY0FybixcbiAgICAgICAgICAgICAgcGF5bG9hZERlbGl2ZXJ5QnVja2V0TmFtZTogdGhpcy5pbnZvY2F0aW9uQ29uZmlndXJhdGlvbi5zM0xvY2F0aW9uLmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJpZ2dlckNvbmRpdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VCYXNlZFRyaWdnZXI6IHtcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb3VudDogdGhpcy50cmlnZ2VyQ29uZGl0aW9ucy5tZXNzYWdlQmFzZWRUcmlnZ2VyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aW1lQmFzZWRUcmlnZ2VyOiB7XG4gICAgICAgICAgICAgICAgICBpZGxlU2Vzc2lvblRpbWVvdXQ6IHRoaXMudHJpZ2dlckNvbmRpdGlvbnMudGltZUJhc2VkVHJpZ2dlcj8udG9TZWNvbmRzKCksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRva2VuQmFzZWRUcmlnZ2VyOiB7XG4gICAgICAgICAgICAgICAgICB0b2tlbkNvdW50OiB0aGlzLnRyaWdnZXJDb25kaXRpb25zLnRva2VuQmFzZWRUcmlnZ2VyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0gYXMgYW55OyAvLyBUeXBlIGFzc2VydGlvbiB0byB3b3JrIGFyb3VuZCBDbG91ZEZvcm1hdGlvbiB0eXBlIGxpbWl0YXRpb25zXG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHRoZSBuZWNlc3NhcnkgcGVybWlzc2lvbnMgdG8gdGhlIHJvbGVcbiAgICogQHBhcmFtIGdyYW50ZWUgLSBUaGUgZ3JhbnRlZSB0byBncmFudCBwZXJtaXNzaW9ucyB0b1xuICAgKiBAcmV0dXJucyBUaGUgR3JhbnQgb2JqZWN0IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHwgdW5kZWZpbmVkIHtcbiAgICAvLyBubyBleGlzdGluZyBncmFudCBtZXRob2QgdGhhdCBwcm92aWRlcyBib3RoIHJlcXVpcmVkIHNucyBhY3Rpb25zXG4gICAgY29uc3QgZ3JhbnQxID0gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWU6IGdyYW50ZWUsXG4gICAgICBhY3Rpb25zOiBbJ3NuczpHZXRUb3BpY0F0dHJpYnV0ZXMnLCAnc25zOlB1Ymxpc2gnXSxcbiAgICAgIHJlc291cmNlQXJuczogW1xuICAgICAgICB0aGlzLmludm9jYXRpb25Db25maWd1cmF0aW9uLnRvcGljLnRvcGljQXJuLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGxldCBncmFudDI6IGlhbS5HcmFudCB8IHVuZGVmaW5lZDtcblxuICAgIC8vIHdlIGRvbid0IGhhdmUgdGhlIHNjb3BlIGhlcmUsIHNvIHdlIGFkZCBtYW51YWxseSB0aGUgcGVybWlzc2lvbnMgdG8gdGhlIHJvbGUgcG9saWN5XG4gICAgaWYgKHRoaXMuaW52b2NhdGlvbkNvbmZpZ3VyYXRpb24/LnMzTG9jYXRpb24pIHtcbiAgICAgIC8vIEdyYW50IFMzIHBlcm1pc3Npb25zIGZvciB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uXG4gICAgICBncmFudDIgPSBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgICBncmFudGVlOiBncmFudGVlLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ3MzOkdldEJ1Y2tldExvY2F0aW9uJyxcbiAgICAgICAgICAnczM6UHV0T2JqZWN0JyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VBcm5zOiBbXG4gICAgICAgICAgYGFybjoke2Nkay5Bd3MuUEFSVElUSU9OfTpzMzo6OiR7dGhpcy5pbnZvY2F0aW9uQ29uZmlndXJhdGlvbi5zM0xvY2F0aW9uLmJ1Y2tldE5hbWV9YCxcbiAgICAgICAgICBgYXJuOiR7Y2RrLkF3cy5QQVJUSVRJT059OnMzOjo6JHt0aGlzLmludm9jYXRpb25Db25maWd1cmF0aW9uLnMzTG9jYXRpb24uYnVja2V0TmFtZX0vKmAsXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JhbnQxICYmIGdyYW50MiA/IGdyYW50MS5jb21iaW5lKGdyYW50MikgOiBncmFudDEgfHwgZ3JhbnQyO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFZBTElEQVRPUlNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIG1lbW9yeSBzdHJhdGVneSBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcywgZW1wdHkgaWYgdmFsaWRcbiAgICovXG4gIHByaXZhdGUgX3ZhbGlkYXRlTWVtb3J5U3RyYXRlZ3lOYW1lID0gKG5hbWU6IHN0cmluZywgc2NvcGU/OiBJQ29uc3RydWN0KTogc3RyaW5nW10gPT4ge1xuICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVN0cmluZ0ZpZWxkTGVuZ3RoKHtcbiAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgZmllbGROYW1lOiAnTWVtb3J5IG5hbWUnLFxuICAgICAgbWluTGVuZ3RoOiBNRU1PUllfTkFNRV9NSU5fTEVOR1RILFxuICAgICAgbWF4TGVuZ3RoOiBNRU1PUllfTkFNRV9NQVhfTEVOR1RILFxuICAgIH0sIHNjb3BlKSk7XG5cbiAgICAvLyBDaGVjayBpZiBuYW1lIG1hdGNoZXMgdGhlIEFXUyBBUEkgcGF0dGVybjogW2EtekEtWl1bYS16QS1aMC05X117MCw0N31cbiAgICAvLyBNdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIsIGZvbGxvd2VkIGJ5IHVwIHRvIDQ3IGxldHRlcnMsIG51bWJlcnMsIG9yIHVuZGVyc2NvcmVzXG4gICAgY29uc3QgdmFsaWROYW1lUGF0dGVybiA9IC9eW2EtekEtWl1bYS16QS1aMC05X117MCw0N30kLztcbiAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZUZpZWxkUGF0dGVybihuYW1lLCAnTWVtb3J5IG5hbWUnLCB2YWxpZE5hbWVQYXR0ZXJuLCB1bmRlZmluZWQsIHNjb3BlKSk7XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGhpc3RvcmljYWwgY29udGV4dCB3aW5kb3cgc2l6ZVxuICAgKiBAcGFyYW0gaGlzdG9yaWNhbENvbnRleHRXaW5kb3dTaXplIC0gVGhlIGhpc3RvcmljYWwgY29udGV4dCB3aW5kb3cgc2l6ZSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzLCBlbXB0eSBpZiB2YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsaWRhdGVIaXN0b3JpY2FsQ29udGV4dFdpbmRvd1NpemUgPSAoaGlzdG9yaWNhbENvbnRleHRXaW5kb3dTaXplOiBudW1iZXIpOiBzdHJpbmdbXSA9PiB7XG4gICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChoaXN0b3JpY2FsQ29udGV4dFdpbmRvd1NpemUgPCBISVNUT1JJQ0FMX0NPTlRFWFRfV0lORE9XX1NJWkVfTUlOXG4gICAgICAgIHx8IGhpc3RvcmljYWxDb250ZXh0V2luZG93U2l6ZSA+IEhJU1RPUklDQUxfQ09OVEVYVF9XSU5ET1dfU0laRV9NQVgpIHtcbiAgICAgIGVycm9ycy5wdXNoKGBIaXN0b3JpY2FsIGNvbnRleHQgd2luZG93IHNpemUgbXVzdCBiZSBiZXR3ZWVuICR7SElTVE9SSUNBTF9DT05URVhUX1dJTkRPV19TSVpFX01JTn0gYW5kICR7SElTVE9SSUNBTF9DT05URVhUX1dJTkRPV19TSVpFX01BWH0sIGdvdCAke2hpc3RvcmljYWxDb250ZXh0V2luZG93U2l6ZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHRyaWdnZXIgY29uZGl0aW9uc1xuICAgKiBAcGFyYW0gdHJpZ2dlckNvbmRpdGlvbnMgLSBUaGUgdHJpZ2dlciBjb25kaXRpb25zIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMsIGVtcHR5IGlmIHZhbGlkXG4gICAqL1xuICBwcml2YXRlIF92YWxpZGF0ZVRyaWdnZXJDb25kaXRpb25zID0gKHRyaWdnZXJDb25kaXRpb25zOiBUcmlnZ2VyQ29uZGl0aW9ucyk6IHN0cmluZ1tdID0+IHtcbiAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gVmFsaWRhdGUgbWVzc2FnZS1iYXNlZCB0cmlnZ2VyXG4gICAgaWYgKHRyaWdnZXJDb25kaXRpb25zLm1lc3NhZ2VCYXNlZFRyaWdnZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRyaWdnZXJDb25kaXRpb25zLm1lc3NhZ2VCYXNlZFRyaWdnZXIgPCBNRVNTQUdFX0JBU0VEX1RSSUdHRVJfTUlOXG4gICAgICAgIHx8IHRyaWdnZXJDb25kaXRpb25zLm1lc3NhZ2VCYXNlZFRyaWdnZXIgPiBNRVNTQUdFX0JBU0VEX1RSSUdHRVJfTUFYKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBNZXNzYWdlLWJhc2VkIHRyaWdnZXIgbXVzdCBiZSBiZXR3ZWVuICR7TUVTU0FHRV9CQVNFRF9UUklHR0VSX01JTn0gYW5kICR7TUVTU0FHRV9CQVNFRF9UUklHR0VSX01BWH0sIGdvdCAke3RyaWdnZXJDb25kaXRpb25zLm1lc3NhZ2VCYXNlZFRyaWdnZXJ9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGltZS1iYXNlZCB0cmlnZ2VyXG4gICAgaWYgKHRyaWdnZXJDb25kaXRpb25zLnRpbWVCYXNlZFRyaWdnZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc2Vjb25kcyA9IHRyaWdnZXJDb25kaXRpb25zLnRpbWVCYXNlZFRyaWdnZXIudG9TZWNvbmRzKCk7XG4gICAgICBpZiAoc2Vjb25kcyA8IFRJTUVfQkFTRURfVFJJR0dFUl9NSU4gfHwgc2Vjb25kcyA+IFRJTUVfQkFTRURfVFJJR0dFUl9NQVgpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYFRpbWUtYmFzZWQgdHJpZ2dlciBtdXN0IGJlIGJldHdlZW4gJHtUSU1FX0JBU0VEX1RSSUdHRVJfTUlOfSBhbmQgJHtUSU1FX0JBU0VEX1RSSUdHRVJfTUFYfSBzZWNvbmRzLCBnb3QgJHtzZWNvbmRzfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRva2VuLWJhc2VkIHRyaWdnZXJcbiAgICBpZiAodHJpZ2dlckNvbmRpdGlvbnMudG9rZW5CYXNlZFRyaWdnZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRyaWdnZXJDb25kaXRpb25zLnRva2VuQmFzZWRUcmlnZ2VyIDwgVE9LRU5fQkFTRURfVFJJR0dFUl9NSU4gfHwgdHJpZ2dlckNvbmRpdGlvbnMudG9rZW5CYXNlZFRyaWdnZXIgPiBUT0tFTl9CQVNFRF9UUklHR0VSX01BWCkge1xuICAgICAgICBlcnJvcnMucHVzaChgVG9rZW4tYmFzZWQgdHJpZ2dlciBtdXN0IGJlIGJldHdlZW4gJHtUT0tFTl9CQVNFRF9UUklHR0VSX01JTn0gYW5kICR7VE9LRU5fQkFTRURfVFJJR0dFUl9NQVh9LCBnb3QgJHt0cmlnZ2VyQ29uZGl0aW9ucy50b2tlbkJhc2VkVHJpZ2dlcn1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9O1xufVxuIl19