aws-cdk
Version:
CDK Toolkit, the command line tool for CDK apps
182 lines • 25.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MockSdk = exports.MockSdkProvider = exports.setDefaultSTSMocks = exports.restoreSdkMocksToDefault = exports.mockSTSClient = exports.mockStepFunctionsClient = exports.mockSSMClient = exports.mockSecretsManagerClient = exports.mockS3Client = exports.mockRoute53Client = exports.mockLambdaClient = exports.mockKMSClient = exports.mockIAMClient = exports.mockElasticLoadBalancingV2Client = exports.mockECSClient = exports.mockECRClient = exports.mockEC2Client = exports.mockCodeBuildClient = exports.mockCloudWatchClient = exports.mockCloudFormationClient = exports.mockAppSyncClient = exports.FAKE_CREDENTIAL_CHAIN = exports.FAKE_CREDENTIALS = void 0;
exports.undoAllSdkMocks = undoAllSdkMocks;
exports.mockBootstrapStack = mockBootstrapStack;
exports.mockResolvedEnvironment = mockResolvedEnvironment;
require("aws-sdk-client-mock-jest");
const client_appsync_1 = require("@aws-sdk/client-appsync");
const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
const client_cloudwatch_logs_1 = require("@aws-sdk/client-cloudwatch-logs");
const client_codebuild_1 = require("@aws-sdk/client-codebuild");
const client_ec2_1 = require("@aws-sdk/client-ec2");
const client_ecr_1 = require("@aws-sdk/client-ecr");
const client_ecs_1 = require("@aws-sdk/client-ecs");
const client_elastic_load_balancing_v2_1 = require("@aws-sdk/client-elastic-load-balancing-v2");
const client_iam_1 = require("@aws-sdk/client-iam");
const client_kms_1 = require("@aws-sdk/client-kms");
const client_lambda_1 = require("@aws-sdk/client-lambda");
const client_route_53_1 = require("@aws-sdk/client-route-53");
const client_s3_1 = require("@aws-sdk/client-s3");
const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
const client_sfn_1 = require("@aws-sdk/client-sfn");
const client_ssm_1 = require("@aws-sdk/client-ssm");
const client_sts_1 = require("@aws-sdk/client-sts");
const credential_providers_1 = require("@aws-sdk/credential-providers");
const aws_sdk_client_mock_1 = require("aws-sdk-client-mock");
const aws_auth_1 = require("../../lib/api/aws-auth");
const deployments_1 = require("../../lib/api/deployments");
exports.FAKE_CREDENTIALS = {
accessKeyId: 'ACCESS',
secretAccessKey: 'SECRET',
sessionToken: 'TOKEN ',
};
exports.FAKE_CREDENTIAL_CHAIN = (0, credential_providers_1.createCredentialChain)(() => Promise.resolve(exports.FAKE_CREDENTIALS));
// Default implementations
exports.mockAppSyncClient = (0, aws_sdk_client_mock_1.mockClient)(client_appsync_1.AppSyncClient);
exports.mockCloudFormationClient = (0, aws_sdk_client_mock_1.mockClient)(client_cloudformation_1.CloudFormationClient);
exports.mockCloudWatchClient = (0, aws_sdk_client_mock_1.mockClient)(client_cloudwatch_logs_1.CloudWatchLogsClient);
exports.mockCodeBuildClient = (0, aws_sdk_client_mock_1.mockClient)(client_codebuild_1.CodeBuildClient);
exports.mockEC2Client = (0, aws_sdk_client_mock_1.mockClient)(client_ec2_1.EC2Client);
exports.mockECRClient = (0, aws_sdk_client_mock_1.mockClient)(client_ecr_1.ECRClient);
exports.mockECSClient = (0, aws_sdk_client_mock_1.mockClient)(client_ecs_1.ECSClient);
exports.mockElasticLoadBalancingV2Client = (0, aws_sdk_client_mock_1.mockClient)(client_elastic_load_balancing_v2_1.ElasticLoadBalancingV2Client);
exports.mockIAMClient = (0, aws_sdk_client_mock_1.mockClient)(client_iam_1.IAMClient);
exports.mockKMSClient = (0, aws_sdk_client_mock_1.mockClient)(client_kms_1.KMSClient);
exports.mockLambdaClient = (0, aws_sdk_client_mock_1.mockClient)(client_lambda_1.LambdaClient);
exports.mockRoute53Client = (0, aws_sdk_client_mock_1.mockClient)(client_route_53_1.Route53Client);
exports.mockS3Client = (0, aws_sdk_client_mock_1.mockClient)(client_s3_1.S3Client);
exports.mockSecretsManagerClient = (0, aws_sdk_client_mock_1.mockClient)(client_secrets_manager_1.SecretsManagerClient);
exports.mockSSMClient = (0, aws_sdk_client_mock_1.mockClient)(client_ssm_1.SSMClient);
exports.mockStepFunctionsClient = (0, aws_sdk_client_mock_1.mockClient)(client_sfn_1.SFNClient);
exports.mockSTSClient = (0, aws_sdk_client_mock_1.mockClient)(client_sts_1.STSClient);
/**
* Resets clients back to defaults and resets the history
* of usage of the mock.
*
* NOTE: This is distinct from the terminology of "restore" that is usually used
* for Sinon/Jest mocks; "restore" usually means to discard the mock and restore the
* original implementation. Instead, in this code base we mean "reset +
* default".
*/
const restoreSdkMocksToDefault = () => {
applyToAllMocks('reset');
exports.mockAppSyncClient.onAnyCommand().resolves({});
exports.mockCloudFormationClient.onAnyCommand().resolves({});
exports.mockCloudWatchClient.onAnyCommand().resolves({});
exports.mockCodeBuildClient.onAnyCommand().resolves({});
exports.mockEC2Client.onAnyCommand().resolves({});
exports.mockECRClient.onAnyCommand().resolves({});
exports.mockECSClient.onAnyCommand().resolves({});
exports.mockElasticLoadBalancingV2Client.onAnyCommand().resolves({});
exports.mockIAMClient.onAnyCommand().resolves({});
exports.mockKMSClient.onAnyCommand().resolves({});
exports.mockLambdaClient.onAnyCommand().resolves({});
exports.mockRoute53Client.onAnyCommand().resolves({});
exports.mockS3Client.onAnyCommand().resolves({});
exports.mockSecretsManagerClient.onAnyCommand().resolves({});
exports.mockSSMClient.onAnyCommand().resolves({});
exports.mockSSMClient.onAnyCommand().resolves({});
};
exports.restoreSdkMocksToDefault = restoreSdkMocksToDefault;
/**
* Restore all SDK mocks to their real implementations
*
* This file will mock a bunch of SDK clients as soon as it is imported, and it's
* not really possible to avoid importing it. To run any tests that need real clients
* instead of fake ones, you need to run this function.
*
* This function would usually be called "restore" in Jest/Sinon terminology,
* but "restore" was already being used with a different meaning in this file,
* so I'm introducing the term "undo" as a synonym for "restore" in the context
* of SDK mocks.
*/
function undoAllSdkMocks() {
applyToAllMocks('restore');
}
;
function applyToAllMocks(meth) {
exports.mockAppSyncClient[meth]();
exports.mockCloudFormationClient[meth]();
exports.mockCloudWatchClient[meth]();
exports.mockCodeBuildClient[meth]();
exports.mockEC2Client[meth]();
exports.mockECRClient[meth]();
exports.mockECSClient[meth]();
exports.mockElasticLoadBalancingV2Client[meth]();
exports.mockIAMClient[meth]();
exports.mockKMSClient[meth]();
exports.mockLambdaClient[meth]();
exports.mockRoute53Client[meth]();
exports.mockS3Client[meth]();
exports.mockSecretsManagerClient[meth]();
exports.mockSSMClient[meth]();
exports.mockStepFunctionsClient[meth]();
exports.mockSTSClient[meth]();
}
const setDefaultSTSMocks = () => {
exports.mockSTSClient.on(client_sts_1.GetCallerIdentityCommand).resolves({
Account: '123456789012',
Arn: 'aws:swa:123456789012:some-other-stuff',
});
exports.mockSTSClient.on(client_sts_1.AssumeRoleCommand).resolves({
Credentials: {
AccessKeyId: exports.FAKE_CREDENTIALS.accessKeyId,
SecretAccessKey: exports.FAKE_CREDENTIALS.secretAccessKey,
SessionToken: exports.FAKE_CREDENTIALS.sessionToken,
Expiration: new Date(Date.now() + 3600 * 1000),
},
});
};
exports.setDefaultSTSMocks = setDefaultSTSMocks;
/**
* MockSdkProvider that is mostly SdkProvider but
* with fake credentials and account information.
*
* For mocking the actual clients, the above mocking
* clients may be used.
*/
class MockSdkProvider extends aws_auth_1.SdkProvider {
constructor() {
super(exports.FAKE_CREDENTIAL_CHAIN, 'bermuda-triangle-1337');
}
defaultAccount() {
return Promise.resolve({ accountId: '123456789012', partition: 'aws' });
}
}
exports.MockSdkProvider = MockSdkProvider;
/**
* MockSdk that is mostly just the SDK but with fake
* credentials and a full set of default client mocks.
* These individual functions within those clients can be
* customized in the test file that uses it.
*/
class MockSdk extends aws_auth_1.SDK {
constructor() {
super(exports.FAKE_CREDENTIAL_CHAIN, 'bermuda-triangle-1337', {});
}
}
exports.MockSdk = MockSdk;
function mockBootstrapStack(stack) {
return deployments_1.CloudFormationStack.fromStaticInformation(new MockSdk().cloudFormation(), 'CDKToolkit', {
CreationTime: new Date(),
StackName: 'CDKToolkit',
StackStatus: client_cloudformation_1.StackStatus.CREATE_COMPLETE,
...stack,
Outputs: [
{ OutputKey: 'BucketName', OutputValue: 'BUCKET_NAME' },
{ OutputKey: 'BucketDomainName', OutputValue: 'BUCKET_ENDPOINT' },
{ OutputKey: 'ImageRepositoryName', OutputValue: 'REPO_NAME' },
{ OutputKey: 'BootstrapVersion', OutputValue: '1' },
...(stack?.Outputs ?? []),
],
});
}
function mockResolvedEnvironment() {
return {
account: '123456789',
region: 'bermuda-triangle-1337',
name: 'aws://123456789/bermuda-triangle-1337',
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9jay1zZGsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtb2NrLXNkay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUErRkEsMENBRUM7QUFrRUQsZ0RBY0M7QUFFRCwwREFNQztBQXpMRCxvQ0FBa0M7QUFFbEMsNERBQXdEO0FBQ3hELDBFQUEwRjtBQUMxRiw0RUFBdUU7QUFDdkUsZ0VBQTREO0FBQzVELG9EQUFnRDtBQUNoRCxvREFBZ0Q7QUFDaEQsb0RBQWdEO0FBQ2hELGdHQUF5RjtBQUN6RixvREFBZ0Q7QUFDaEQsb0RBQWdEO0FBQ2hELDBEQUFzRDtBQUN0RCw4REFBeUQ7QUFDekQsa0RBQThDO0FBQzlDLDRFQUF1RTtBQUN2RSxvREFBZ0Q7QUFDaEQsb0RBQWdEO0FBQ2hELG9EQUE2RjtBQUM3Rix3RUFBc0U7QUFFdEUsNkRBQWlEO0FBRWpELHFEQUEwRDtBQUMxRCwyREFBZ0U7QUFFbkQsUUFBQSxnQkFBZ0IsR0FBMEI7SUFDckQsV0FBVyxFQUFFLFFBQVE7SUFDckIsZUFBZSxFQUFFLFFBQVE7SUFDekIsWUFBWSxFQUFFLFFBQVE7Q0FDdkIsQ0FBQztBQUVXLFFBQUEscUJBQXFCLEdBQUcsSUFBQSw0Q0FBcUIsRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHdCQUFnQixDQUFDLENBQUMsQ0FBQztBQUVwRywwQkFBMEI7QUFDYixRQUFBLGlCQUFpQixHQUFHLElBQUEsZ0NBQVUsRUFBQyw4QkFBYSxDQUFDLENBQUM7QUFDOUMsUUFBQSx3QkFBd0IsR0FBRyxJQUFBLGdDQUFVLEVBQUMsNENBQW9CLENBQUMsQ0FBQztBQUM1RCxRQUFBLG9CQUFvQixHQUFHLElBQUEsZ0NBQVUsRUFBQyw2Q0FBb0IsQ0FBQyxDQUFDO0FBQ3hELFFBQUEsbUJBQW1CLEdBQUcsSUFBQSxnQ0FBVSxFQUFDLGtDQUFlLENBQUMsQ0FBQztBQUNsRCxRQUFBLGFBQWEsR0FBRyxJQUFBLGdDQUFVLEVBQUMsc0JBQVMsQ0FBQyxD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QUFTLEVBQUUscUJBQXFCLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRTtZQUM5RCxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFO1lBQ25ELEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztTQUMxQjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFnQix1QkFBdUI7SUFDckMsT0FBTztRQUNMLE9BQU8sRUFBRSxXQUFXO1FBQ3BCLE1BQU0sRUFBRSx1QkFBdUI7UUFDL0IsSUFBSSxFQUFFLHVDQUF1QztLQUM5QyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnYXdzLXNkay1jbGllbnQtbW9jay1qZXN0JztcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB7IEFwcFN5bmNDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtYXBwc3luYyc7XG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvbkNsaWVudCwgU3RhY2ssIFN0YWNrU3RhdHVzIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IENsb3VkV2F0Y2hMb2dzQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3Vkd2F0Y2gtbG9ncyc7XG5pbXBvcnQgeyBDb2RlQnVpbGRDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY29kZWJ1aWxkJztcbmltcG9ydCB7IEVDMkNsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1lYzInO1xuaW1wb3J0IHsgRUNSQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWVjcic7XG5pbXBvcnQgeyBFQ1NDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZWNzJztcbmltcG9ydCB7IEVsYXN0aWNMb2FkQmFsYW5jaW5nVjJDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZWxhc3RpYy1sb2FkLWJhbGFuY2luZy12Mic7XG5pbXBvcnQgeyBJQU1DbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtaWFtJztcbmltcG9ydCB7IEtNU0NsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1rbXMnO1xuaW1wb3J0IHsgTGFtYmRhQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWxhbWJkYSc7XG5pbXBvcnQgeyBSb3V0ZTUzQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXJvdXRlLTUzJztcbmltcG9ydCB7IFMzQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXMzJztcbmltcG9ydCB7IFNlY3JldHNNYW5hZ2VyQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XG5pbXBvcnQgeyBTRk5DbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc2ZuJztcbmltcG9ydCB7IFNTTUNsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zc20nO1xuaW1wb3J0IHsgQXNzdW1lUm9sZUNvbW1hbmQsIEdldENhbGxlcklkZW50aXR5Q29tbWFuZCwgU1RTQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXN0cyc7XG5pbXBvcnQgeyBjcmVhdGVDcmVkZW50aWFsQ2hhaW4gfSBmcm9tICdAYXdzLXNkay9jcmVkZW50aWFsLXByb3ZpZGVycyc7XG5pbXBvcnQgeyBBd3NDcmVkZW50aWFsSWRlbnRpdHkgfSBmcm9tICdAc21pdGh5L3R5cGVzJztcbmltcG9ydCB7IG1vY2tDbGllbnQgfSBmcm9tICdhd3Mtc2RrLWNsaWVudC1tb2NrJztcbmltcG9ydCB7IHR5cGUgQWNjb3VudCB9IGZyb20gJ2Nkay1hc3NldHMnO1xuaW1wb3J0IHsgU0RLLCBTZGtQcm92aWRlciB9IGZyb20gJy4uLy4uL2xpYi9hcGkvYXdzLWF1dGgnO1xuaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25TdGFjayB9IGZyb20gJy4uLy4uL2xpYi9hcGkvZGVwbG95bWVudHMnO1xuXG5leHBvcnQgY29uc3QgRkFLRV9DUkVERU5USUFMUzogQXdzQ3JlZGVudGlhbElkZW50aXR5ID0ge1xuICBhY2Nlc3NLZXlJZDogJ0FDQ0VTUycsXG4gIHNlY3JldEFjY2Vzc0tleTogJ1NFQ1JFVCcsXG4gIHNlc3Npb25Ub2tlbjogJ1RPS0VOICcsXG59O1xuXG5leHBvcnQgY29uc3QgRkFLRV9DUkVERU5USUFMX0NIQUlOID0gY3JlYXRlQ3JlZGVudGlhbENoYWluKCgpID0+IFByb21pc2UucmVzb2x2ZShGQUtFX0NSRURFTlRJQUxTKSk7XG5cbi8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zXG5leHBvcnQgY29uc3QgbW9ja0FwcFN5bmNDbGllbnQgPSBtb2NrQ2xpZW50KEFwcFN5bmNDbGllbnQpO1xuZXhwb3J0IGNvbnN0IG1vY2tDbG91ZEZvcm1hdGlvbkNsaWVudCA9IG1vY2tDbGllbnQoQ2xvdWRGb3JtYXRpb25DbGllbnQpO1xuZXhwb3J0IGNvbnN0IG1vY2tDbG91ZFdhdGNoQ2xpZW50ID0gbW9ja0NsaWVudChDbG91ZFdhdGNoTG9nc0NsaWVudCk7XG5leHBvcnQgY29uc3QgbW9ja0NvZGVCdWlsZENsaWVudCA9IG1vY2tDbGllbnQoQ29kZUJ1aWxkQ2xpZW50KTtcbmV4cG9ydCBjb25zdCBtb2NrRUMyQ2xpZW50ID0gbW9ja0NsaWVudChFQzJDbGllbnQpO1xuZXhwb3J0IGNvbnN0IG1vY2tFQ1JDbGllbnQgPSBtb2NrQ2xpZW50KEVDUkNsaWVudCk7XG5leHBvcnQgY29uc3QgbW9ja0VDU0NsaWVudCA9IG1vY2tDbGllbnQoRUNTQ2xpZW50KTtcbmV4cG9ydCBjb25zdCBtb2NrRWxhc3RpY0xvYWRCYWxhbmNpbmdWMkNsaWVudCA9IG1vY2tDbGllbnQoRWxhc3RpY0xvYWRCYWxhbmNpbmdWMkNsaWVudCk7XG5leHBvcnQgY29uc3QgbW9ja0lBTUNsaWVudCA9IG1vY2tDbGllbnQoSUFNQ2xpZW50KTtcbmV4cG9ydCBjb25zdCBtb2NrS01TQ2xpZW50ID0gbW9ja0NsaWVudChLTVNDbGllbnQpO1xuZXhwb3J0IGNvbnN0IG1vY2tMYW1iZGFDbGllbnQgPSBtb2NrQ2xpZW50KExhbWJkYUNsaWVudCk7XG5leHBvcnQgY29uc3QgbW9ja1JvdXRlNTNDbGllbnQgPSBtb2NrQ2xpZW50KFJvdXRlNTNDbGllbnQpO1xuZXhwb3J0IGNvbnN0IG1vY2tTM0NsaWVudCA9IG1vY2tDbGllbnQoUzNDbGllbnQpO1xuZXhwb3J0IGNvbnN0IG1vY2tTZWNyZXRzTWFuYWdlckNsaWVudCA9IG1vY2tDbGllbnQoU2VjcmV0c01hbmFnZXJDbGllbnQpO1xuZXhwb3J0IGNvbnN0IG1vY2tTU01DbGllbnQgPSBtb2NrQ2xpZW50KFNTTUNsaWVudCk7XG5leHBvcnQgY29uc3QgbW9ja1N0ZXBGdW5jdGlvbnNDbGllbnQgPSBtb2NrQ2xpZW50KFNGTkNsaWVudCk7XG5leHBvcnQgY29uc3QgbW9ja1NUU0NsaWVudCA9IG1vY2tDbGllbnQoU1RTQ2xpZW50KTtcblxuLyoqXG4gKiBSZXNldHMgY2xpZW50cyBiYWNrIHRvIGRlZmF1bHRzIGFuZCByZXNldHMgdGhlIGhpc3RvcnlcbiAqIG9mIHVzYWdlIG9mIHRoZSBtb2NrLlxuICpcbiAqIE5PVEU6IFRoaXMgaXMgZGlzdGluY3QgZnJvbSB0aGUgdGVybWlub2xvZ3kgb2YgXCJyZXN0b3JlXCIgdGhhdCBpcyB1c3VhbGx5IHVzZWRcbiAqIGZvciBTaW5vbi9KZXN0IG1vY2tzOyBcInJlc3RvcmVcIiB1c3VhbGx5IG1lYW5zIHRvIGRpc2NhcmQgdGhlIG1vY2sgYW5kIHJlc3RvcmUgdGhlXG4gKiBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbi4gSW5zdGVhZCwgaW4gdGhpcyBjb2RlIGJhc2Ugd2UgbWVhbiBcInJlc2V0ICtcbiAqIGRlZmF1bHRcIi5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc3RvcmVTZGtNb2Nrc1RvRGVmYXVsdCA9ICgpID0+IHtcbiAgYXBwbHlUb0FsbE1vY2tzKCdyZXNldCcpO1xuXG4gIG1vY2tBcHBTeW5jQ2xpZW50Lm9uQW55Q29tbWFuZCgpLnJlc29sdmVzKHt9KTtcbiAgbW9ja0Nsb3VkRm9ybWF0aW9uQ2xpZW50Lm9uQW55Q29tbWFuZCgpLnJlc29sdmVzKHt9KTtcbiAgbW9ja0Nsb3VkV2F0Y2hDbGllbnQub25BbnlDb21tYW5kKCkucmVzb2x2ZXMoe30pO1xuICBtb2NrQ29kZUJ1aWxkQ2xpZW50Lm9uQW55Q29tbWFuZCgpLnJlc29sdmVzKHt9KTtcbiAgbW9ja0VDMkNsaWVudC5vbkFueUNvbW1hbmQoKS5yZXNvbHZlcyh7fSk7XG4gIG1vY2tFQ1JDbGllbnQub25BbnlDb21tYW5kKCkucmVzb2x2ZXMoe30pO1xuICBtb2NrRUNTQ2xpZW50Lm9uQW55Q29tbWFuZCgpLnJlc29sdmVzKHt9KTtcbiAgbW9ja0VsYXN0aWNMb2FkQmFsYW5jaW5nVjJDbGllbnQub25BbnlDb21tYW5kKCkucmVzb2x2ZXMoe30pO1xuICBtb2NrSUFNQ2xpZW50Lm9uQW55Q29tbWFuZCgpLnJlc29sdmVzKHt9KTtcbiAgbW9ja0tNU0NsaWVudC5vbkFueUNvbW1hbmQoKS5yZXNvbHZlcyh7fSk7XG4gIG1vY2tMYW1iZGFDbGllbnQub25BbnlDb21tYW5kKCkucmVzb2x2ZXMoe30pO1xuICBtb2NrUm91dGU1M0NsaWVudC5vbkFueUNvbW1hbmQoKS5yZXNvbHZlcyh7fSk7XG4gIG1vY2tTM0NsaWVudC5vbkFueUNvbW1hbmQoKS5yZXNvbHZlcyh7fSk7XG4gIG1vY2tTZWNyZXRzTWFuYWdlckNsaWVudC5vbkFueUNvbW1hbmQoKS5yZXNvbHZlcyh7fSk7XG4gIG1vY2tTU01DbGllbnQub25BbnlDb21tYW5kKCkucmVzb2x2ZXMoe30pO1xuICBtb2NrU1NNQ2xpZW50Lm9uQW55Q29tbWFuZCgpLnJlc29sdmVzKHt9KTtcbn07XG5cbi8qKlxuICogUmVzdG9yZSBhbGwgU0RLIG1vY2tzIHRvIHRoZWlyIHJlYWwgaW1wbGVtZW50YXRpb25zXG4gKlxuICogVGhpcyBmaWxlIHdpbGwgbW9jayBhIGJ1bmNoIG9mIFNESyBjbGllbnRzIGFzIHNvb24gYXMgaXQgaXMgaW1wb3J0ZWQsIGFuZCBpdCdzXG4gKiBub3QgcmVhbGx5IHBvc3NpYmxlIHRvIGF2b2lkIGltcG9ydGluZyBpdC4gVG8gcnVuIGFueSB0ZXN0cyB0aGF0IG5lZWQgcmVhbCBjbGllbnRzXG4gKiBpbnN0ZWFkIG9mIGZha2Ugb25lcywgeW91IG5lZWQgdG8gcnVuIHRoaXMgZnVuY3Rpb24uXG4gKlxuICogVGhpcyBmdW5jdGlvbiB3b3VsZCB1c3VhbGx5IGJlIGNhbGxlZCBcInJlc3RvcmVcIiBpbiBKZXN0L1Npbm9uIHRlcm1pbm9sb2d5LFxuICogYnV0IFwicmVzdG9yZVwiIHdhcyBhbHJlYWR5IGJlaW5nIHVzZWQgd2l0aCBhIGRpZmZlcmVudCBtZWFuaW5nIGluIHRoaXMgZmlsZSxcbiAqIHNvIEknbSBpbnRyb2R1Y2luZyB0aGUgdGVybSBcInVuZG9cIiBhcyBhIHN5bm9ueW0gZm9yIFwicmVzdG9yZVwiIGluIHRoZSBjb250ZXh0XG4gKiBvZiBTREsgbW9ja3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmRvQWxsU2RrTW9ja3MoKSB7XG4gIGFwcGx5VG9BbGxNb2NrcygncmVzdG9yZScpO1xufTtcblxuZnVuY3Rpb24gYXBwbHlUb0FsbE1vY2tzKG1ldGg6ICdyZXNldCcgfCAncmVzdG9yZScpIHtcbiAgbW9ja0FwcFN5bmNDbGllbnRbbWV0aF0oKTtcbiAgbW9ja0Nsb3VkRm9ybWF0aW9uQ2xpZW50W21ldGhdKCk7XG4gIG1vY2tDbG91ZFdhdGNoQ2xpZW50W21ldGhdKCk7XG4gIG1vY2tDb2RlQnVpbGRDbGllbnRbbWV0aF0oKTtcbiAgbW9ja0VDMkNsaWVudFttZXRoXSgpO1xuICBtb2NrRUNSQ2xpZW50W21ldGhdKCk7XG4gIG1vY2tFQ1NDbGllbnRbbWV0aF0oKTtcbiAgbW9ja0VsYXN0aWNMb2FkQmFsYW5jaW5nVjJDbGllbnRbbWV0aF0oKTtcbiAgbW9ja0lBTUNsaWVudFttZXRoXSgpO1xuICBtb2NrS01TQ2xpZW50W21ldGhdKCk7XG4gIG1vY2tMYW1iZGFDbGllbnRbbWV0aF0oKTtcbiAgbW9ja1JvdXRlNTNDbGllbnRbbWV0aF0oKTtcbiAgbW9ja1MzQ2xpZW50W21ldGhdKCk7XG4gIG1vY2tTZWNyZXRzTWFuYWdlckNsaWVudFttZXRoXSgpO1xuICBtb2NrU1NNQ2xpZW50W21ldGhdKCk7XG4gIG1vY2tTdGVwRnVuY3Rpb25zQ2xpZW50W21ldGhdKCk7XG4gIG1vY2tTVFNDbGllbnRbbWV0aF0oKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNldERlZmF1bHRTVFNNb2NrcyA9ICgpID0+IHtcbiAgbW9ja1NUU0NsaWVudC5vbihHZXRDYWxsZXJJZGVudGl0eUNvbW1hbmQpLnJlc29sdmVzKHtcbiAgICBBY2NvdW50OiAnMTIzNDU2Nzg5MDEyJyxcbiAgICBBcm46ICdhd3M6c3dhOjEyMzQ1Njc4OTAxMjpzb21lLW90aGVyLXN0dWZmJyxcbiAgfSk7XG4gIG1vY2tTVFNDbGllbnQub24oQXNzdW1lUm9sZUNvbW1hbmQpLnJlc29sdmVzKHtcbiAgICBDcmVkZW50aWFsczoge1xuICAgICAgQWNjZXNzS2V5SWQ6IEZBS0VfQ1JFREVOVElBTFMuYWNjZXNzS2V5SWQsXG4gICAgICBTZWNyZXRBY2Nlc3NLZXk6IEZBS0VfQ1JFREVOVElBTFMuc2VjcmV0QWNjZXNzS2V5LFxuICAgICAgU2Vzc2lvblRva2VuOiBGQUtFX0NSRURFTlRJQUxTLnNlc3Npb25Ub2tlbixcbiAgICAgIEV4cGlyYXRpb246IG5ldyBEYXRlKERhdGUubm93KCkgKyAzNjAwICogMTAwMCksXG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIE1vY2tTZGtQcm92aWRlciB0aGF0IGlzIG1vc3RseSBTZGtQcm92aWRlciBidXRcbiAqIHdpdGggZmFrZSBjcmVkZW50aWFscyBhbmQgYWNjb3VudCBpbmZvcm1hdGlvbi5cbiAqXG4gKiBGb3IgbW9ja2luZyB0aGUgYWN0dWFsIGNsaWVudHMsIHRoZSBhYm92ZSBtb2NraW5nXG4gKiBjbGllbnRzIG1heSBiZSB1c2VkLlxuICovXG5leHBvcnQgY2xhc3MgTW9ja1Nka1Byb3ZpZGVyIGV4dGVuZHMgU2RrUHJvdmlkZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihGQUtFX0NSRURFTlRJQUxfQ0hBSU4sICdiZXJtdWRhLXRyaWFuZ2xlLTEzMzcnKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWZhdWx0QWNjb3VudCgpOiBQcm9taXNlPEFjY291bnQgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgYWNjb3VudElkOiAnMTIzNDU2Nzg5MDEyJywgcGFydGl0aW9uOiAnYXdzJyB9KTtcbiAgfVxufVxuXG4vKipcbiAqIE1vY2tTZGsgdGhhdCBpcyBtb3N0bHkganVzdCB0aGUgU0RLIGJ1dCB3aXRoIGZha2VcbiAqIGNyZWRlbnRpYWxzIGFuZCBhIGZ1bGwgc2V0IG9mIGRlZmF1bHQgY2xpZW50IG1vY2tzLlxuICogVGhlc2UgaW5kaXZpZHVhbCBmdW5jdGlvbnMgd2l0aGluIHRob3NlIGNsaWVudHMgY2FuIGJlXG4gKiBjdXN0b21pemVkIGluIHRoZSB0ZXN0IGZpbGUgdGhhdCB1c2VzIGl0LlxuICovXG5leHBvcnQgY2xhc3MgTW9ja1NkayBleHRlbmRzIFNESyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEZBS0VfQ1JFREVOVElBTF9DSEFJTiwgJ2Jlcm11ZGEtdHJpYW5nbGUtMTMzNycsIHt9KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja0Jvb3RzdHJhcFN0YWNrKHN0YWNrPzogUGFydGlhbDxTdGFjaz4pIHtcbiAgcmV0dXJuIENsb3VkRm9ybWF0aW9uU3RhY2suZnJvbVN0YXRpY0luZm9ybWF0aW9uKG5ldyBNb2NrU2RrKCkuY2xvdWRGb3JtYXRpb24oKSwgJ0NES1Rvb2xraXQnLCB7XG4gICAgQ3JlYXRpb25UaW1lOiBuZXcgRGF0ZSgpLFxuICAgIFN0YWNrTmFtZTogJ0NES1Rvb2xraXQnLFxuICAgIFN0YWNrU3RhdHVzOiBTdGFja1N0YXR1cy5DUkVBVEVfQ09NUExFVEUsXG4gICAgLi4uc3RhY2ssXG4gICAgT3V0cHV0czogW1xuICAgICAgeyBPdXRwdXRLZXk6ICdCdWNrZXROYW1lJywgT3V0cHV0VmFsdWU6ICdCVUNLRVRfTkFNRScgfSxcbiAgICAgIHsgT3V0cHV0S2V5OiAnQnVja2V0RG9tYWluTmFtZScsIE91dHB1dFZhbHVlOiAnQlVDS0VUX0VORFBPSU5UJyB9LFxuICAgICAgeyBPdXRwdXRLZXk6ICdJbWFnZVJlcG9zaXRvcnlOYW1lJywgT3V0cHV0VmFsdWU6ICdSRVBPX05BTUUnIH0sXG4gICAgICB7IE91dHB1dEtleTogJ0Jvb3RzdHJhcFZlcnNpb24nLCBPdXRwdXRWYWx1ZTogJzEnIH0sXG4gICAgICAuLi4oc3RhY2s/Lk91dHB1dHMgPz8gW10pLFxuICAgIF0sXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1Jlc29sdmVkRW52aXJvbm1lbnQoKTogRW52aXJvbm1lbnQge1xuICByZXR1cm4ge1xuICAgIGFjY291bnQ6ICcxMjM0NTY3ODknLFxuICAgIHJlZ2lvbjogJ2Jlcm11ZGEtdHJpYW5nbGUtMTMzNycsXG4gICAgbmFtZTogJ2F3czovLzEyMzQ1Njc4OS9iZXJtdWRhLXRyaWFuZ2xlLTEzMzcnLFxuICB9O1xufVxuIl19