deploy-time-build
Version:
Build during CDK deployment.
118 lines • 16.8 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SociIndexBuild = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const path_1 = require("path");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const aws_codebuild_1 = require("aws-cdk-lib/aws-codebuild");
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
const constructs_1 = require("constructs");
const singleton_project_1 = require("./singleton-project");
/**
* Build and publish a SOCI index for a container image.
* A SOCI index helps start Fargate tasks faster in some cases.
* Please read the following document for more details: https://docs.aws.amazon.com/AmazonECS/latest/userguide/container-considerations.html
*
* @deprecated Use {@link SociIndexV2Build} instead. Customers new to SOCI on AWS Fargate can only use SOCI index manifest v2.
* See [this article](https://aws.amazon.com/blogs/containers/improving-amazon-ecs-deployment-consistency-with-soci-index-manifest-v2/) for more details.
*/
class SociIndexBuild extends constructs_1.Construct {
/**
* A utility method to create a SociIndexBuild construct from a DockerImageAsset instance.
*/
static fromDockerImageAsset(scope, id, imageAsset) {
return new SociIndexBuild(scope, id, {
repository: imageAsset.repository,
imageTag: imageAsset.assetHash,
});
}
constructor(scope, id, props) {
super(scope, id);
const sociWrapperVersion = 'v0.2.8';
const binaryUrl = `https://github.com/tmokmss/soci-wrapper/releases/download/${sociWrapperVersion}/soci-wrapper-${sociWrapperVersion}-linux-amd64.tar.gz`;
const handler = new aws_lambda_1.SingletonFunction(this, 'CustomResourceHandler', {
// Use raw string to avoid from tightening CDK version requirement
runtime: new aws_lambda_1.Runtime('nodejs22.x', aws_lambda_1.RuntimeFamily.NODEJS),
code: aws_lambda_1.Code.fromAsset((0, path_1.join)(__dirname, '..', 'lambda', 'trigger-codebuild', 'dist')),
handler: 'index.handler',
uuid: 'db740fd5-5436-4a84-8a09-e6dfcd01f4f3', // generated for this construct
lambdaPurpose: 'DeployTimeBuildCustomResourceHandler',
timeout: aws_cdk_lib_1.Duration.minutes(5),
});
const project = new singleton_project_1.SingletonProject(this, 'Project', {
uuid: '024cf76a-1003-4aa4-aa4b-12c32c09ca3c', // generated for this construct
projectPurpose: 'SociIndexBuild',
environment: { buildImage: aws_codebuild_1.LinuxBuildImage.fromCodeBuildImageId('aws/codebuild/standard:7.0') },
buildSpec: aws_codebuild_1.BuildSpec.fromObject({
version: '0.2',
phases: {
build: {
commands: [
'current_dir=$(pwd)',
`wget --quiet -O soci-wrapper.tar.gz ${binaryUrl}`,
'tar -xvzf soci-wrapper.tar.gz',
'',
'export AWS_ACCOUNT=$(aws sts get-caller-identity --query "Account" --output text)',
'export REGISTRY_USER=AWS',
'export REGISTRY_PASSWORD=$(aws ecr get-login-password --region $AWS_REGION)',
'export REGISTRY=$AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com',
'aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $REGISTRY',
'REPO_NAME=$repositoryName',
'IMAGE_TAG=$imageTag',
'DIGEST=$(aws ecr describe-images --repository-name $REPO_NAME --image-ids imageTag=$IMAGE_TAG --query imageDetails[0].imageDigest --output text)',
'./soci-wrapper --repo $REPO_NAME --digest $DIGEST --region $AWS_REGION --account $AWS_ACCOUNT',
],
},
post_build: {
commands: [
'echo Build completed on `date`',
`
STATUS='SUCCESS'
if [ $CODEBUILD_BUILD_SUCCEEDING -ne 1 ] # Test if the build is failing
then
STATUS='FAILED'
REASON="deploy-time-build failed. See CloudWatch Log stream for the detailed reason:
https://$AWS_REGION.console.aws.amazon.com/cloudwatch/home?region=$AWS_REGION#logsV2:log-groups/log-group/\\$252Faws\\$252Fcodebuild\\$252F$projectName/log-events/$CODEBUILD_LOG_PATH"
fi
cat <<EOF > payload.json
{
"StackId": "$stackId",
"RequestId": "$requestId",
"LogicalResourceId":"$logicalResourceId",
"PhysicalResourceId": "$imageTag",
"Status": "$STATUS",
"Reason": "$REASON"
}
EOF
curl -i -X PUT -H 'Content-Type:' -d "@payload.json" "$responseURL"
`,
],
},
},
}),
}).project;
handler.addToRolePolicy(new aws_iam_1.PolicyStatement({
actions: ['codebuild:StartBuild'],
resources: [project.projectArn],
}));
props.repository.grantPullPush(project);
props.repository.grant(project, 'ecr:DescribeImages');
const properties = {
type: 'SociIndexBuild',
imageTag: props.imageTag,
repositoryName: props.repository.repositoryName,
codeBuildProjectName: project.projectName,
};
new aws_cdk_lib_1.CustomResource(this, 'Resource', {
serviceToken: handler.functionArn,
resourceType: 'Custom::CDKSociIndexBuild',
properties,
});
}
}
exports.SociIndexBuild = SociIndexBuild;
_a = JSII_RTTI_SYMBOL_1;
SociIndexBuild[_a] = { fqn: "deploy-time-build.SociIndexBuild", version: "0.4.5" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29jaS1pbmRleC1idWlsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zb2NpLWluZGV4LWJ1aWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQTRCO0FBQzVCLDZDQUF1RDtBQUN2RCw2REFBdUU7QUFHdkUsaURBQXNEO0FBQ3RELHVEQUF5RjtBQUN6RiwyQ0FBdUM7QUFDdkMsMkRBQXVEO0FBa0J2RDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSxjQUFlLFNBQVEsc0JBQVM7SUFDM0M7O09BRUc7SUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsVUFBNEI7UUFDM0YsT0FBTyxJQUFJLGNBQWMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ25DLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVTtZQUNqQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVM7U0FDL0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQztRQUVwQyxNQUFNLFNBQVMsR0FBRyw2REFBNkQsa0JBQWtCLGlCQUFpQixrQkFBa0IscUJBQXFCLENBQUM7UUFFMUosTUFBTSxPQUFPLEdBQUcsSUFBSSw4QkFBaUIsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUU7WUFDbkUsa0VBQWtFO1lBQ2xFLE9BQU8sRUFBRSxJQUFJLG9CQUFPLENBQUMsWUFBWSxFQUFFLDBCQUFhLENBQUMsTUFBTSxDQUFDO1lBQ3hELElBQUksRUFBRSxpQkFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNsRixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsc0NBQXNDLEVBQUUsK0JBQStCO1lBQzdFLGFBQWEsRUFBRSxzQ0FBc0M7WUFDckQsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUM3QixDQUFDLENBQUM7UUFFSCxNQUFNLE9BQU8sR0FBRyxJQUFJLG9DQUFnQixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDcEQsSUFBSSxFQUFFLHNDQUFzQyxFQUFFLCtCQUErQjtZQUM3RSxjQUFjLEVBQUUsZ0JBQWdCO1lBQ2hDLFdBQVcsRUFBRSxFQUFFLFVBQVUsRUFBRSwrQkFBZSxDQUFDLG9CQUFvQixDQUFDLDRCQUE0QixDQUFDLEVBQUU7WUFDL0YsU0FBUyxFQUFFLHlCQUFTLENBQUMsVUFBVSxDQUFDO2dCQUM5QixPQUFPLEVBQUUsS0FBSztnQkFDZCxNQUFNLEVBQUU7b0JBQ04sS0FBSyxFQUFFO3dCQUNMLFFBQVEsRUFBRTs0QkFDUixvQkFBb0I7NEJBQ3BCLHVDQUF1QyxTQUFTLEVBQUU7NEJBQ2xELCtCQUErQjs0QkFDL0IsRUFBRTs0QkFDRixtRkFBbUY7NEJBQ25GLDBCQUEwQjs0QkFDMUIsNkVBQTZFOzRCQUM3RSxnRUFBZ0U7NEJBQ2hFLDBHQUEwRzs0QkFDMUcsMkJBQTJCOzRCQUMzQixxQkFBcUI7NEJBQ3JCLGtKQUFrSjs0QkFDbEosK0ZBQStGO3lCQUNoRztxQkFDRjtvQkFDRCxVQUFVLEVBQUU7d0JBQ1YsUUFBUSxFQUFFOzRCQUNSLGdDQUFnQzs0QkFDaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7ZUFtQkM7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDO1NBQ0gsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUVYLE9BQU8sQ0FBQyxlQUFlLENBQ3JCLElBQUkseUJBQWUsQ0FBQztZQUNsQixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztZQUNqQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1NBQ2hDLENBQUMsQ0FDSCxDQUFDO1FBRUYsS0FBSyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFFdEQsTUFBTSxVQUFVLEdBQWdDO1lBQzlDLElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLGNBQWMsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLGNBQWM7WUFDL0Msb0JBQW9CLEVBQUUsT0FBTyxDQUFDLFdBQVc7U0FDMUMsQ0FBQztRQUVGLElBQUksNEJBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ25DLFlBQVksRUFBRSxPQUFPLENBQUMsV0FBVztZQUNqQyxZQUFZLEVBQUUsMkJBQTJCO1lBQ3pDLFVBQVU7U0FDWCxDQUFDLENBQUM7SUFDTCxDQUFDOztBQXZHSCx3Q0F3R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBCdWlsZFNwZWMsIExpbnV4QnVpbGRJbWFnZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyJztcbmltcG9ydCB7IERvY2tlckltYWdlQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyLWFzc2V0cyc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IENvZGUsIFJ1bnRpbWUsIFJ1bnRpbWVGYW1pbHksIFNpbmdsZXRvbkZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFNpbmdsZXRvblByb2plY3QgfSBmcm9tICcuL3NpbmdsZXRvbi1wcm9qZWN0JztcbmltcG9ydCB7IFNvY2lJbmRleEJ1aWxkUmVzb3VyY2VQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgU29jaUluZGV4VjJCdWlsZCB9IGZyb20gJy4vc29jaS1pbmRleC12Mi1idWlsZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29jaUluZGV4QnVpbGRQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgRUNSIHJlcG9zaXRvcnkgeW91ciBjb250YWluZXIgaW1hZ2UgaXMgc3RvcmVkLlxuICAgKiBZb3UgY2FuIG9ubHkgc3BlY2lmeSBhIHJlcG9zaXRvcnkgaW4gdGhlIHNhbWUgZW52aXJvbm1lbnQgKGFjY291bnQvcmVnaW9uKS5cbiAgICogVGhlIGluZGV4IGFydGlmYWN0IHdpbGwgYmUgdXBsb2FkZWQgdG8gdGhpcyByZXBvc2l0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeTogSVJlcG9zaXRvcnk7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWcgb2YgdGhlIGNvbnRhaW5lciBpbWFnZSB5b3Ugd2FudCB0byBidWlsZCBpbmRleCBmb3IuXG4gICAqL1xuICByZWFkb25seSBpbWFnZVRhZzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEJ1aWxkIGFuZCBwdWJsaXNoIGEgU09DSSBpbmRleCBmb3IgYSBjb250YWluZXIgaW1hZ2UuXG4gKiBBIFNPQ0kgaW5kZXggaGVscHMgc3RhcnQgRmFyZ2F0ZSB0YXNrcyBmYXN0ZXIgaW4gc29tZSBjYXNlcy5cbiAqIFBsZWFzZSByZWFkIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnQgZm9yIG1vcmUgZGV0YWlsczogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvdXNlcmd1aWRlL2NvbnRhaW5lci1jb25zaWRlcmF0aW9ucy5odG1sXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBTb2NpSW5kZXhWMkJ1aWxkfSBpbnN0ZWFkLiBDdXN0b21lcnMgbmV3IHRvIFNPQ0kgb24gQVdTIEZhcmdhdGUgY2FuIG9ubHkgdXNlIFNPQ0kgaW5kZXggbWFuaWZlc3QgdjIuXG4gKiBTZWUgW3RoaXMgYXJ0aWNsZV0oaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9ibG9ncy9jb250YWluZXJzL2ltcHJvdmluZy1hbWF6b24tZWNzLWRlcGxveW1lbnQtY29uc2lzdGVuY3ktd2l0aC1zb2NpLWluZGV4LW1hbmlmZXN0LXYyLykgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvY2lJbmRleEJ1aWxkIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIEEgdXRpbGl0eSBtZXRob2QgdG8gY3JlYXRlIGEgU29jaUluZGV4QnVpbGQgY29uc3RydWN0IGZyb20gYSBEb2NrZXJJbWFnZUFzc2V0IGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRG9ja2VySW1hZ2VBc3NldChzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBpbWFnZUFzc2V0OiBEb2NrZXJJbWFnZUFzc2V0KSB7XG4gICAgcmV0dXJuIG5ldyBTb2NpSW5kZXhCdWlsZChzY29wZSwgaWQsIHtcbiAgICAgIHJlcG9zaXRvcnk6IGltYWdlQXNzZXQucmVwb3NpdG9yeSxcbiAgICAgIGltYWdlVGFnOiBpbWFnZUFzc2V0LmFzc2V0SGFzaCxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTb2NpSW5kZXhCdWlsZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHNvY2lXcmFwcGVyVmVyc2lvbiA9ICd2MC4yLjgnO1xuXG4gICAgY29uc3QgYmluYXJ5VXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS90bW9rbXNzL3NvY2ktd3JhcHBlci9yZWxlYXNlcy9kb3dubG9hZC8ke3NvY2lXcmFwcGVyVmVyc2lvbn0vc29jaS13cmFwcGVyLSR7c29jaVdyYXBwZXJWZXJzaW9ufS1saW51eC1hbWQ2NC50YXIuZ3pgO1xuXG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBTaW5nbGV0b25GdW5jdGlvbih0aGlzLCAnQ3VzdG9tUmVzb3VyY2VIYW5kbGVyJywge1xuICAgICAgLy8gVXNlIHJhdyBzdHJpbmcgdG8gYXZvaWQgZnJvbSB0aWdodGVuaW5nIENESyB2ZXJzaW9uIHJlcXVpcmVtZW50XG4gICAgICBydW50aW1lOiBuZXcgUnVudGltZSgnbm9kZWpzMjIueCcsIFJ1bnRpbWVGYW1pbHkuTk9ERUpTKSxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KGpvaW4oX19kaXJuYW1lLCAnLi4nLCAnbGFtYmRhJywgJ3RyaWdnZXItY29kZWJ1aWxkJywgJ2Rpc3QnKSksXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICB1dWlkOiAnZGI3NDBmZDUtNTQzNi00YTg0LThhMDktZTZkZmNkMDFmNGYzJywgLy8gZ2VuZXJhdGVkIGZvciB0aGlzIGNvbnN0cnVjdFxuICAgICAgbGFtYmRhUHVycG9zZTogJ0RlcGxveVRpbWVCdWlsZEN1c3RvbVJlc291cmNlSGFuZGxlcicsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvamVjdCA9IG5ldyBTaW5nbGV0b25Qcm9qZWN0KHRoaXMsICdQcm9qZWN0Jywge1xuICAgICAgdXVpZDogJzAyNGNmNzZhLTEwMDMtNGFhNC1hYTRiLTEyYzMyYzA5Y2EzYycsIC8vIGdlbmVyYXRlZCBmb3IgdGhpcyBjb25zdHJ1Y3RcbiAgICAgIHByb2plY3RQdXJwb3NlOiAnU29jaUluZGV4QnVpbGQnLFxuICAgICAgZW52aXJvbm1lbnQ6IHsgYnVpbGRJbWFnZTogTGludXhCdWlsZEltYWdlLmZyb21Db2RlQnVpbGRJbWFnZUlkKCdhd3MvY29kZWJ1aWxkL3N0YW5kYXJkOjcuMCcpIH0sXG4gICAgICBidWlsZFNwZWM6IEJ1aWxkU3BlYy5mcm9tT2JqZWN0KHtcbiAgICAgICAgdmVyc2lvbjogJzAuMicsXG4gICAgICAgIHBoYXNlczoge1xuICAgICAgICAgIGJ1aWxkOiB7XG4gICAgICAgICAgICBjb21tYW5kczogW1xuICAgICAgICAgICAgICAnY3VycmVudF9kaXI9JChwd2QpJyxcbiAgICAgICAgICAgICAgYHdnZXQgLS1xdWlldCAtTyBzb2NpLXdyYXBwZXIudGFyLmd6ICR7YmluYXJ5VXJsfWAsXG4gICAgICAgICAgICAgICd0YXIgLXh2emYgc29jaS13cmFwcGVyLnRhci5neicsXG4gICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAnZXhwb3J0IEFXU19BQ0NPVU5UPSQoYXdzIHN0cyBnZXQtY2FsbGVyLWlkZW50aXR5IC0tcXVlcnkgXCJBY2NvdW50XCIgLS1vdXRwdXQgdGV4dCknLFxuICAgICAgICAgICAgICAnZXhwb3J0IFJFR0lTVFJZX1VTRVI9QVdTJyxcbiAgICAgICAgICAgICAgJ2V4cG9ydCBSRUdJU1RSWV9QQVNTV09SRD0kKGF3cyBlY3IgZ2V0LWxvZ2luLXBhc3N3b3JkIC0tcmVnaW9uICRBV1NfUkVHSU9OKScsXG4gICAgICAgICAgICAgICdleHBvcnQgUkVHSVNUUlk9JEFXU19BQ0NPVU5ULmRrci5lY3IuJEFXU19SRUdJT04uYW1hem9uYXdzLmNvbScsXG4gICAgICAgICAgICAgICdhd3MgZWNyIGdldC1sb2dpbi1wYXNzd29yZCAtLXJlZ2lvbiAkQVdTX1JFR0lPTiB8IGRvY2tlciBsb2dpbiAtLXVzZXJuYW1lIEFXUyAtLXBhc3N3b3JkLXN0ZGluICRSRUdJU1RSWScsXG4gICAgICAgICAgICAgICdSRVBPX05BTUU9JHJlcG9zaXRvcnlOYW1lJyxcbiAgICAgICAgICAgICAgJ0lNQUdFX1RBRz0kaW1hZ2VUYWcnLFxuICAgICAgICAgICAgICAnRElHRVNUPSQoYXdzIGVjciBkZXNjcmliZS1pbWFnZXMgLS1yZXBvc2l0b3J5LW5hbWUgJFJFUE9fTkFNRSAtLWltYWdlLWlkcyBpbWFnZVRhZz0kSU1BR0VfVEFHIC0tcXVlcnkgaW1hZ2VEZXRhaWxzWzBdLmltYWdlRGlnZXN0IC0tb3V0cHV0IHRleHQpJyxcbiAgICAgICAgICAgICAgJy4vc29jaS13cmFwcGVyIC0tcmVwbyAkUkVQT19OQU1FIC0tZGlnZXN0ICRESUdFU1QgLS1yZWdpb24gJEFXU19SRUdJT04gLS1hY2NvdW50ICRBV1NfQUNDT1VOVCcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcG9zdF9idWlsZDoge1xuICAgICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICAgJ2VjaG8gQnVpbGQgY29tcGxldGVkIG9uIGBkYXRlYCcsXG4gICAgICAgICAgICAgIGBcblNUQVRVUz0nU1VDQ0VTUydcbmlmIFsgJENPREVCVUlMRF9CVUlMRF9TVUNDRUVESU5HIC1uZSAxIF0gIyBUZXN0IGlmIHRoZSBidWlsZCBpcyBmYWlsaW5nXG50aGVuXG5TVEFUVVM9J0ZBSUxFRCdcblJFQVNPTj1cImRlcGxveS10aW1lLWJ1aWxkIGZhaWxlZC4gU2VlIENsb3VkV2F0Y2ggTG9nIHN0cmVhbSBmb3IgdGhlIGRldGFpbGVkIHJlYXNvbjogXG5odHRwczovLyRBV1NfUkVHSU9OLmNvbnNvbGUuYXdzLmFtYXpvbi5jb20vY2xvdWR3YXRjaC9ob21lP3JlZ2lvbj0kQVdTX1JFR0lPTiNsb2dzVjI6bG9nLWdyb3Vwcy9sb2ctZ3JvdXAvXFxcXCQyNTJGYXdzXFxcXCQyNTJGY29kZWJ1aWxkXFxcXCQyNTJGJHByb2plY3ROYW1lL2xvZy1ldmVudHMvJENPREVCVUlMRF9MT0dfUEFUSFwiXG5maVxuY2F0IDw8RU9GID4gcGF5bG9hZC5qc29uXG57XG4gIFwiU3RhY2tJZFwiOiBcIiRzdGFja0lkXCIsXG4gIFwiUmVxdWVzdElkXCI6IFwiJHJlcXVlc3RJZFwiLFxuICBcIkxvZ2ljYWxSZXNvdXJjZUlkXCI6XCIkbG9naWNhbFJlc291cmNlSWRcIixcbiAgXCJQaHlzaWNhbFJlc291cmNlSWRcIjogXCIkaW1hZ2VUYWdcIixcbiAgXCJTdGF0dXNcIjogXCIkU1RBVFVTXCIsXG4gIFwiUmVhc29uXCI6IFwiJFJFQVNPTlwiXG59XG5FT0ZcbmN1cmwgLWkgLVggUFVUIC1IICdDb250ZW50LVR5cGU6JyAtZCBcIkBwYXlsb2FkLmpzb25cIiBcIiRyZXNwb25zZVVSTFwiXG4gICAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9KS5wcm9qZWN0O1xuXG4gICAgaGFuZGxlci5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogWydjb2RlYnVpbGQ6U3RhcnRCdWlsZCddLFxuICAgICAgICByZXNvdXJjZXM6IFtwcm9qZWN0LnByb2plY3RBcm5dLFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgcHJvcHMucmVwb3NpdG9yeS5ncmFudFB1bGxQdXNoKHByb2plY3QpO1xuICAgIHByb3BzLnJlcG9zaXRvcnkuZ3JhbnQocHJvamVjdCwgJ2VjcjpEZXNjcmliZUltYWdlcycpO1xuXG4gICAgY29uc3QgcHJvcGVydGllczogU29jaUluZGV4QnVpbGRSZXNvdXJjZVByb3BzID0ge1xuICAgICAgdHlwZTogJ1NvY2lJbmRleEJ1aWxkJyxcbiAgICAgIGltYWdlVGFnOiBwcm9wcy5pbWFnZVRhZyxcbiAgICAgIHJlcG9zaXRvcnlOYW1lOiBwcm9wcy5yZXBvc2l0b3J5LnJlcG9zaXRvcnlOYW1lLFxuICAgICAgY29kZUJ1aWxkUHJvamVjdE5hbWU6IHByb2plY3QucHJvamVjdE5hbWUsXG4gICAgfTtcblxuICAgIG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IGhhbmRsZXIuZnVuY3Rpb25Bcm4sXG4gICAgICByZXNvdXJjZVR5cGU6ICdDdXN0b206OkNES1NvY2lJbmRleEJ1aWxkJyxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==