UNPKG

@aws-cdk/integ-tests-alpha

Version:

CDK Integration Testing Constructs

157 lines 18.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WaiterStateMachine = void 0; const jsiiDeprecationWarnings = require("../../.warnings.jsii.js"); const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); /* eslint-disable @cdklabs/no-throw-default-error */ const core_1 = require("aws-cdk-lib/core"); const constructs_1 = require("constructs"); const providers_1 = require("./providers"); /** * A very simple StateMachine construct highly customized to the provider framework. * This is so that this package does not need to depend on aws-stepfunctions module. * * The state machine continuously calls the isCompleteHandler, until it succeeds or times out. * The handler is called `maxAttempts` times with an `interval` duration and a `backoffRate` rate. * * For example with: * - maxAttempts = 360 (30 minutes) * - interval = 5 * - backoffRate = 1 (no backoff) * * it will make the API Call every 5 seconds and fail after 360 failures. * * If the backoff rate is changed to 2 (for example), it will * - make the first call * - wait 5 seconds * - make the second call * - wait 15 seconds * - etc. */ class WaiterStateMachine extends constructs_1.Construct { static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/integ-tests-alpha.WaiterStateMachine", version: "2.260.0-alpha.0" }; /** * The ARN of the statemachine */ stateMachineArn; /** * The IAM Role ARN of the role used by the state machine */ roleArn; /** * The AssertionsProvide that handles async requests */ isCompleteProvider; constructor(scope, id, props = {}) { super(scope, id); try { jsiiDeprecationWarnings._aws_cdk_integ_tests_alpha_WaiterStateMachineProps(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, WaiterStateMachine); } throw error; } const interval = props.interval || core_1.Duration.seconds(5); const totalTimeout = props.totalTimeout || core_1.Duration.minutes(30); const maxAttempts = calculateMaxRetries(totalTimeout.toSeconds(), interval.toSeconds(), props.backoffRate ?? 1); if (Math.round(maxAttempts) !== maxAttempts) { throw new Error(`Cannot determine retry count since totalTimeout=${totalTimeout.toSeconds()}s is not integrally dividable by queryInterval=${interval.toSeconds()}s`); } this.isCompleteProvider = new providers_1.AssertionsProvider(this, 'IsCompleteProvider', { handler: 'index.isComplete', uuid: '76b3e830-a873-425f-8453-eddd85c86925', providerLogLevel: props.providerLogLevel, }); const timeoutProvider = new providers_1.AssertionsProvider(this, 'TimeoutProvider', { handler: 'index.onTimeout', uuid: '5c1898e0-96fb-4e3e-95d5-f6c67f3ce41a', providerLogLevel: props.providerLogLevel, }); const role = new core_1.CfnResource(this, 'Role', { type: 'AWS::IAM::Role', properties: { AssumeRolePolicyDocument: { Version: '2012-10-17', Statement: [{ Action: 'sts:AssumeRole', Effect: 'Allow', Principal: { Service: 'states.amazonaws.com' } }], }, Policies: [ { PolicyName: 'InlineInvokeFunctions', PolicyDocument: { Version: '2012-10-17', Statement: [{ Action: 'lambda:InvokeFunction', Effect: 'Allow', Resource: [ this.isCompleteProvider.serviceToken, timeoutProvider.serviceToken, ], }], }, }, ], }, }); const definition = core_1.Stack.of(this).toJsonString({ StartAt: 'framework-isComplete-task', States: { 'framework-isComplete-task': { End: true, Retry: [{ ErrorEquals: ['States.ALL'], IntervalSeconds: interval.toSeconds(), MaxAttempts: maxAttempts, BackoffRate: props.backoffRate ?? 1, }], Catch: [{ ErrorEquals: ['States.ALL'], Next: 'framework-onTimeout-task', }], Type: 'Task', Resource: this.isCompleteProvider.serviceToken, }, 'framework-onTimeout-task': { End: true, Type: 'Task', Resource: timeoutProvider.serviceToken, }, }, }); const resource = new core_1.CfnResource(this, 'Resource', { type: 'AWS::StepFunctions::StateMachine', properties: { DefinitionString: definition, RoleArn: role.getAtt('Arn'), }, }); resource.node.addDependency(role); this.stateMachineArn = resource.ref; this.roleArn = role.getAtt('Arn').toString(); this.isCompleteProvider.grantInvoke(this.roleArn); timeoutProvider.grantInvoke(this.roleArn); } } exports.WaiterStateMachine = WaiterStateMachine; /** * Calculate the max number of retries */ function calculateMaxRetries(maxSeconds, intervalSeconds, backoff) { // if backoff === 1 then we aren't really using backoff if (backoff === 1) { return Math.floor(maxSeconds / intervalSeconds); } let retries = 1; let nextInterval = intervalSeconds; let i = 0; while (i < maxSeconds) { nextInterval = nextInterval + nextInterval * backoff; i += nextInterval; if (i >= maxSeconds) break; retries++; } return retries; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdGVyLXN0YXRlLW1hY2hpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3YWl0ZXItc3RhdGUtbWFjaGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUFvRDtBQUNwRCwyQ0FBZ0U7QUFDaEUsMkNBQXVDO0FBQ3ZDLDJDQUFpRDtBQXlDakQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxzQkFBUzs7SUFDL0M7O09BRUc7SUFDYSxlQUFlLENBQVM7SUFFeEM7O09BRUc7SUFDYSxPQUFPLENBQVM7SUFFaEM7O09BRUc7SUFDYSxrQkFBa0IsQ0FBcUI7SUFFdkQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxRQUFpQyxFQUFFO1FBQzNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Ozs7OzsrQ0FqQlIsa0JBQWtCOzs7O1FBa0IzQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLGVBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSxlQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sV0FBVyxHQUFHLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVoSCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsWUFBWSxDQUFDLFNBQVMsRUFBRSxrREFBa0QsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4SyxDQUFDO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUks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Q0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEQsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDM0M7O0FBdkdILGdEQXdHQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxVQUFrQixFQUFFLGVBQXVCLEVBQUUsT0FBZTtJQUN2Rix1REFBdUQ7SUFDdkQsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLElBQUksWUFBWSxHQUFHLGVBQWUsQ0FBQztJQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixPQUFPLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUN0QixZQUFZLEdBQUcsWUFBWSxHQUFDLFlBQVksR0FBQyxPQUFPLENBQUM7UUFDakQsQ0FBQyxJQUFFLFlBQVksQ0FBQztRQUNoQixJQUFJLENBQUMsSUFBSSxVQUFVO1lBQUUsTUFBTTtRQUMzQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQGNka2xhYnMvbm8tdGhyb3ctZGVmYXVsdC1lcnJvciAqL1xuaW1wb3J0IHsgQ2ZuUmVzb3VyY2UsIER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBBc3NlcnRpb25zUHJvdmlkZXIgfSBmcm9tICcuL3Byb3ZpZGVycyc7XG5pbXBvcnQgdHlwZSB7IFByb3ZpZGVyT3B0aW9ucyB9IGZyb20gJy4vcHJvdmlkZXJzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjcmVhdGluZyBhIFdhaXRlclN0YXRlTWFjaGluZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhaXRlclN0YXRlTWFjaGluZU9wdGlvbnMgZXh0ZW5kcyBQcm92aWRlck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHRvdGFsIHRpbWUgdGhhdCB0aGUgc3RhdGUgbWFjaGluZSB3aWxsIHdhaXRcbiAgICogZm9yIGEgc3VjY2Vzc2Z1bCByZXNwb25zZVxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDMwKVxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcnZhbCAobnVtYmVyIG9mIHNlY29uZHMpIHRvIHdhaXQgYmV0d2VlbiBhdHRlbXB0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcyg1KVxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQmFja29mZiBiZXR3ZWVuIGF0dGVtcHRzLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBtdWx0aXBsaWVyIGJ5IHdoaWNoIHRoZSByZXRyeSBpbnRlcnZhbCBpbmNyZWFzZXNcbiAgICogYWZ0ZXIgZWFjaCByZXRyeSBhdHRlbXB0LlxuICAgKlxuICAgKiBCeSBkZWZhdWx0IHRoZXJlIGlzIG5vIGJhY2tvZmYuIEVhY2ggcmV0cnkgd2lsbCB3YWl0IHRoZSBhbW91bnQgb2YgdGltZVxuICAgKiBzcGVjaWZpZWQgYnkgYGludGVydmFsYC5cbiAgICpcbiAgICogQGRlZmF1bHQgMSAobm8gYmFja29mZilcbiAgICovXG4gIHJlYWRvbmx5IGJhY2tvZmZSYXRlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciBjcmVhdGluZyBhIFdhaXRlclN0YXRlTWFjaGluZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhaXRlclN0YXRlTWFjaGluZVByb3BzIGV4dGVuZHMgV2FpdGVyU3RhdGVNYWNoaW5lT3B0aW9ucyB7fVxuXG4vKipcbiAqIEEgdmVyeSBzaW1wbGUgU3RhdGVNYWNoaW5lIGNvbnN0cnVjdCBoaWdobHkgY3VzdG9taXplZCB0byB0aGUgcHJvdmlkZXIgZnJhbWV3b3JrLlxuICogVGhpcyBpcyBzbyB0aGF0IHRoaXMgcGFja2FnZSBkb2VzIG5vdCBuZWVkIHRvIGRlcGVuZCBvbiBhd3Mtc3RlcGZ1bmN0aW9ucyBtb2R1bGUuXG4gKlxuICogVGhlIHN0YXRlIG1hY2hpbmUgY29udGludW91c2x5IGNhbGxzIHRoZSBpc0NvbXBsZXRlSGFuZGxlciwgdW50aWwgaXQgc3VjY2VlZHMgb3IgdGltZXMgb3V0LlxuICogVGhlIGhhbmRsZXIgaXMgY2FsbGVkIGBtYXhBdHRlbXB0c2AgdGltZXMgd2l0aCBhbiBgaW50ZXJ2YWxgIGR1cmF0aW9uIGFuZCBhIGBiYWNrb2ZmUmF0ZWAgcmF0ZS5cbiAqXG4gKiBGb3IgZXhhbXBsZSB3aXRoOlxuICogLSBtYXhBdHRlbXB0cyA9IDM2MCAoMzAgbWludXRlcylcbiAqIC0gaW50ZXJ2YWwgPSA1XG4gKiAtIGJhY2tvZmZSYXRlID0gMSAobm8gYmFja29mZilcbiAqXG4gKiBpdCB3aWxsIG1ha2UgdGhlIEFQSSBDYWxsIGV2ZXJ5IDUgc2Vjb25kcyBhbmQgZmFpbCBhZnRlciAzNjAgZmFpbHVyZXMuXG4gKlxuICogSWYgdGhlIGJhY2tvZmYgcmF0ZSBpcyBjaGFuZ2VkIHRvIDIgKGZvciBleGFtcGxlKSwgaXQgd2lsbFxuICogLSBtYWtlIHRoZSBmaXJzdCBjYWxsXG4gKiAtIHdhaXQgNSBzZWNvbmRzXG4gKiAtIG1ha2UgdGhlIHNlY29uZCBjYWxsXG4gKiAtIHdhaXQgMTUgc2Vjb25kc1xuICogLSBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXYWl0ZXJTdGF0ZU1hY2hpbmUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgc3RhdGVtYWNoaW5lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGVNYWNoaW5lQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gUm9sZSBBUk4gb2YgdGhlIHJvbGUgdXNlZCBieSB0aGUgc3RhdGUgbWFjaGluZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFzc2VydGlvbnNQcm92aWRlIHRoYXQgaGFuZGxlcyBhc3luYyByZXF1ZXN0c1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzQ29tcGxldGVQcm92aWRlcjogQXNzZXJ0aW9uc1Byb3ZpZGVyO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXYWl0ZXJTdGF0ZU1hY2hpbmVQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICBjb25zdCBpbnRlcnZhbCA9IHByb3BzLmludGVydmFsIHx8IER1cmF0aW9uLnNlY29uZHMoNSk7XG4gICAgY29uc3QgdG90YWxUaW1lb3V0ID0gcHJvcHMudG90YWxUaW1lb3V0IHx8IER1cmF0aW9uLm1pbnV0ZXMoMzApO1xuICAgIGNvbnN0IG1heEF0dGVtcHRzID0gY2FsY3VsYXRlTWF4UmV0cmllcyh0b3RhbFRpbWVvdXQudG9TZWNvbmRzKCksIGludGVydmFsLnRvU2Vjb25kcygpLCBwcm9wcy5iYWNrb2ZmUmF0ZSA/PyAxKTtcblxuICAgIGlmIChNYXRoLnJvdW5kKG1heEF0dGVtcHRzKSAhPT0gbWF4QXR0ZW1wdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRldGVybWluZSByZXRyeSBjb3VudCBzaW5jZSB0b3RhbFRpbWVvdXQ9JHt0b3RhbFRpbWVvdXQudG9TZWNvbmRzKCl9cyBpcyBub3QgaW50ZWdyYWxseSBkaXZpZGFibGUgYnkgcXVlcnlJbnRlcnZhbD0ke2ludGVydmFsLnRvU2Vjb25kcygpfXNgKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzQ29tcGxldGVQcm92aWRlciA9IG5ldyBBc3NlcnRpb25zUHJvdmlkZXIodGhpcywgJ0lzQ29tcGxldGVQcm92aWRlcicsIHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5pc0NvbXBsZXRlJyxcbiAgICAgIHV1aWQ6ICc3NmIzZTgzMC1hODczLTQyNWYtODQ1My1lZGRkODVjODY5MjUnLFxuICAgICAgcHJvdmlkZXJMb2dMZXZlbDogcHJvcHMucHJvdmlkZXJMb2dMZXZlbCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRpbWVvdXRQcm92aWRlciA9IG5ldyBBc3NlcnRpb25zUHJvdmlkZXIodGhpcywgJ1RpbWVvdXRQcm92aWRlcicsIHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5vblRpbWVvdXQnLFxuICAgICAgdXVpZDogJzVjMTg5OGUwLTk2ZmItNGUzZS05NWQ1LWY2YzY3ZjNjZTQxYScsXG4gICAgICBwcm92aWRlckxvZ0xldmVsOiBwcm9wcy5wcm92aWRlckxvZ0xldmVsLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgcm9sZSA9IG5ldyBDZm5SZXNvdXJjZSh0aGlzLCAnUm9sZScsIHtcbiAgICAgIHR5cGU6ICdBV1M6OklBTTo6Um9sZScsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcbiAgICAgICAgICBTdGF0ZW1lbnQ6IFt7IEFjdGlvbjogJ3N0czpBc3N1bWVSb2xlJywgRWZmZWN0OiAnQWxsb3cnLCBQcmluY2lwYWw6IHsgU2VydmljZTogJ3N0YXRlcy5hbWF6b25hd3MuY29tJyB9IH1dLFxuICAgICAgICB9LFxuICAgICAgICBQb2xpY2llczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFBvbGljeU5hbWU6ICdJbmxpbmVJbnZva2VGdW5jdGlvbnMnLFxuICAgICAgICAgICAgUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxuICAgICAgICAgICAgICBTdGF0ZW1lbnQ6IFt7XG4gICAgICAgICAgICAgICAgQWN0aW9uOiAnbGFtYmRhOkludm9rZUZ1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6IFtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaXNDb21wbGV0ZVByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgICAgICAgICAgICAgIHRpbWVvdXRQcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IFN0YWNrLm9mKHRoaXMpLnRvSnNvblN0cmluZyh7XG4gICAgICBTdGFydEF0OiAnZnJhbWV3b3JrLWlzQ29tcGxldGUtdGFzaycsXG4gICAgICBTdGF0ZXM6IHtcbiAgICAgICAgJ2ZyYW1ld29yay1pc0NvbXBsZXRlLXRhc2snOiB7XG4gICAgICAgICAgRW5kOiB0cnVlLFxuICAgICAgICAgIFJldHJ5OiBbe1xuICAgICAgICAgICAgRXJyb3JFcXVhbHM6IFsnU3RhdGVzLkFMTCddLFxuICAgICAgICAgICAgSW50ZXJ2YWxTZWNvbmRzOiBpbnRlcnZhbC50b1NlY29uZHMoKSxcbiAgICAgICAgICAgIE1heEF0dGVtcHRzOiBtYXhBdHRlbXB0cyxcbiAgICAgICAgICAgIEJhY2tvZmZSYXRlOiBwcm9wcy5iYWNrb2ZmUmF0ZSA/PyAxLFxuICAgICAgICAgIH1dLFxuICAgICAgICAgIENhdGNoOiBbe1xuICAgICAgICAgICAgRXJyb3JFcXVhbHM6IFsnU3RhdGVzLkFMTCddLFxuICAgICAgICAgICAgTmV4dDogJ2ZyYW1ld29yay1vblRpbWVvdXQtdGFzaycsXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgVHlwZTogJ1Rhc2snLFxuICAgICAgICAgIFJlc291cmNlOiB0aGlzLmlzQ29tcGxldGVQcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICAgIH0sXG4gICAgICAgICdmcmFtZXdvcmstb25UaW1lb3V0LXRhc2snOiB7XG4gICAgICAgICAgRW5kOiB0cnVlLFxuICAgICAgICAgIFR5cGU6ICdUYXNrJyxcbiAgICAgICAgICBSZXNvdXJjZTogdGltZW91dFByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBDZm5SZXNvdXJjZSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICB0eXBlOiAnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBEZWZpbml0aW9uU3RyaW5nOiBkZWZpbml0aW9uLFxuICAgICAgICBSb2xlQXJuOiByb2xlLmdldEF0dCgnQXJuJyksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShyb2xlKTtcblxuICAgIHRoaXMuc3RhdGVNYWNoaW5lQXJuID0gcmVzb3VyY2UucmVmO1xuICAgIHRoaXMucm9sZUFybiA9IHJvbGUuZ2V0QXR0KCdBcm4nKS50b1N0cmluZygpO1xuICAgIHRoaXMuaXNDb21wbGV0ZVByb3ZpZGVyLmdyYW50SW52b2tlKHRoaXMucm9sZUFybik7XG4gICAgdGltZW91dFByb3ZpZGVyLmdyYW50SW52b2tlKHRoaXMucm9sZUFybik7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG1heCBudW1iZXIgb2YgcmV0cmllc1xuICovXG5mdW5jdGlvbiBjYWxjdWxhdGVNYXhSZXRyaWVzKG1heFNlY29uZHM6IG51bWJlciwgaW50ZXJ2YWxTZWNvbmRzOiBudW1iZXIsIGJhY2tvZmY6IG51bWJlcik6IG51bWJlciB7XG4gIC8vIGlmIGJhY2tvZmYgPT09IDEgdGhlbiB3ZSBhcmVuJ3QgcmVhbGx5IHVzaW5nIGJhY2tvZmZcbiAgaWYgKGJhY2tvZmYgPT09IDEpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihtYXhTZWNvbmRzIC8gaW50ZXJ2YWxTZWNvbmRzKTtcbiAgfVxuICBsZXQgcmV0cmllcyA9IDE7XG4gIGxldCBuZXh0SW50ZXJ2YWwgPSBpbnRlcnZhbFNlY29uZHM7XG4gIGxldCBpID0gMDtcbiAgd2hpbGUgKGkgPCBtYXhTZWNvbmRzKSB7XG4gICAgbmV4dEludGVydmFsID0gbmV4dEludGVydmFsK25leHRJbnRlcnZhbCpiYWNrb2ZmO1xuICAgIGkrPW5leHRJbnRlcnZhbDtcbiAgICBpZiAoaSA+PSBtYXhTZWNvbmRzKSBicmVhaztcbiAgICByZXRyaWVzKys7XG4gIH1cbiAgcmV0dXJuIHJldHJpZXM7XG59XG4iXX0=