awscdk-construct-live-channel-from-mp4-file
Version:
CDK Construct for setting up a simple live channel for testing
163 lines • 24.9 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.HarvestJobLambda = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const crypto = require("crypto");
const fs = require("fs");
const path = require("path");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const cloudfront = require("aws-cdk-lib/aws-cloudfront");
const cloudfront_origins = require("aws-cdk-lib/aws-cloudfront-origins");
const iam = require("aws-cdk-lib/aws-iam");
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
const s3 = require("aws-cdk-lib/aws-s3");
const custom_resources_1 = require("aws-cdk-lib/custom-resources");
const constructs_1 = require("constructs");
class HarvestJobLambda extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
const { channelId, endpointId, startTime, endTime, destination, publish = false, retain = false, } = props;
let bucket;
if (destination) {
bucket = s3.Bucket.fromBucketName(this, 'Bucket', destination.bucketName);
this.destination = destination;
}
else {
// Create S3 bucket
const bucketName = `${crypto.randomUUID()}`;
bucket = new s3.Bucket(this, bucketName, {
bucketName,
removalPolicy: retain ? aws_cdk_lib_1.RemovalPolicy.RETAIN : aws_cdk_lib_1.RemovalPolicy.DESTROY,
autoDeleteObjects: retain ? false : true,
});
bucket.addToResourcePolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: ['s3:*'],
resources: [bucket.bucketArn, `${bucket.bucketArn}/*`],
principals: [new iam.ServicePrincipal('mediapackage.amazonaws.com')],
}));
this.destination = {
bucketName,
manifestKey: 'index.m3u8',
};
}
//Create an IAM Role for MediaPackage to access S3
const role = new iam.Role(this, 'IamRoleForMediaPackage', {
inlinePolicies: {
policy: new iam.PolicyDocument({
statements: [
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: ['s3:*'],
resources: [bucket.bucketArn, `${bucket.bucketArn}/*`],
}),
],
}),
},
assumedBy: new iam.ServicePrincipal('mediapackage.amazonaws.com'),
});
const roleArn = role.roleArn;
const TS_ENTRY = path.resolve(__dirname, 'code', 'index.ts');
const JS_ENTRY = path.resolve(__dirname, 'code', 'index.js');
this.func = new aws_lambda_nodejs_1.NodejsFunction(scope, 'HarvestJobFunction', {
runtime: aws_lambda_1.Runtime.NODEJS_18_X,
entry: fs.existsSync(TS_ENTRY) ? TS_ENTRY : JS_ENTRY,
// projectRoot: path.resolve(__dirname, '..'),
// depsLockFilePath: path.resolve(__dirname, '..', 'yarn.lock'),
handler: 'handler',
timeout: aws_cdk_lib_1.Duration.seconds(30),
environment: {
NODE_ENV: process.env.NODE_ENV,
REGION: process.env.CDK_DEFAULT_REGION,
CHANNEL_ID: channelId,
ORIGIN_ENDPOINT_ID: endpointId,
START_TIME: startTime.toISOString(),
END_TIME: endTime ? endTime.toISOString() : '',
S3_BUCKET_NAME: this.destination.bucketName,
MANIFEST_KEY: this.destination.manifestKey,
S3_ROLE_ARN: roleArn,
},
logRetention: aws_cdk_lib_1.aws_logs.RetentionDays.TWO_WEEKS,
});
// Add a statement to call MediaLive schedule API
this.func.addToRolePolicy(iam.PolicyStatement.fromJson({
Effect: 'Allow',
Action: 'medialive:*',
Resource: '*',
}));
// Add a statement to call MediaPackage harvest job API
this.func.addToRolePolicy(iam.PolicyStatement.fromJson({
Effect: 'Allow',
Action: 'mediapackage:*',
Resource: '*',
}));
// Add a statement to pass the IAM role to MediaPackage
this.func.addToRolePolicy(iam.PolicyStatement.fromJson({
Effect: 'Allow',
Action: 'iam:PassRole',
Resource: roleArn,
}));
if (publish) {
// Create an Origin Access Identity (OAI)
const oai = new cloudfront.OriginAccessIdentity(this, 'OAI', {
comment: 'OAI for CloudFront to access private S3 bucket',
});
// Create a CloudFront distribution
const distribution = new cloudfront.Distribution(this, 'Distribution', {
defaultBehavior: {
origin: new cloudfront_origins.S3Origin(bucket, { originAccessIdentity: oai }),
viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.ALLOW_ALL,
allowedMethods: cloudfront.AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
cachedMethods: cloudfront.CachedMethods.CACHE_GET_HEAD_OPTIONS,
cachePolicy: cloudfront.CachePolicy.ELEMENTAL_MEDIA_PACKAGE,
},
enabled: true,
});
// Grant the OAI access to the private S3 bucket
const statement = new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: ['s3:GetObject'],
resources: [`${bucket.bucketArn}/*`],
principals: [new iam.CanonicalUserPrincipal(oai.cloudFrontOriginAccessIdentityS3CanonicalUserId)],
});
bucket.addToResourcePolicy(statement);
if (retain) {
oai.applyRemovalPolicy(aws_cdk_lib_1.RemovalPolicy.RETAIN);
distribution.applyRemovalPolicy(aws_cdk_lib_1.RemovalPolicy.RETAIN);
// Need to manually retain the resource policy due to the known issue:
// https://github.com/aws/aws-cdk/issues/27125
const documentString = JSON.stringify(new iam.PolicyDocument({
assignSids: true,
statements: [statement],
}));
new aws_cdk_lib_1.CfnOutput(this, 'PutBucketPolicyCLI', {
value: `aws s3api put-bucket-policy --bucket ${this.destination.bucketName} --policy '${documentString}'`,
exportName: `${aws_cdk_lib_1.Aws.STACK_NAME}-PutBucketPolicyCLI`,
description: 'Run this command when cdk destroy shows error.',
});
new custom_resources_1.AwsCustomResource(this, 'PutBucketPolicy', {
onDelete: {
service: 'S3',
action: 'PutBucketPolicy',
parameters: {
Bucket: this.destination.bucketName,
PolicyDocument: documentString,
},
physicalResourceId: custom_resources_1.PhysicalResourceId.of(`${crypto.randomUUID()}`),
},
//Will ignore any resource and use the assumedRoleArn as resource and 'sts:AssumeRole' for service:action
policy: custom_resources_1.AwsCustomResourcePolicy.fromSdkCalls({
resources: custom_resources_1.AwsCustomResourcePolicy.ANY_RESOURCE,
}),
});
}
this.publishedUrl = `https://${distribution.distributionDomainName}/${this.destination.manifestKey}`;
}
}
}
exports.HarvestJobLambda = HarvestJobLambda;
_a = JSII_RTTI_SYMBOL_1;
HarvestJobLambda[_a] = { fqn: "awscdk-construct-live-channel-from-mp4-file.HarvestJobLambda", version: "1.2.27" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGFydmVzdEpvYkxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9IYXJ2ZXN0Sm9iTGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaUNBQWlDO0FBQ2pDLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsNkNBQXdGO0FBQ3hGLHlEQUF5RDtBQUN6RCx5RUFBeUU7QUFDekUsMkNBQTJDO0FBQzNDLHVEQUFpRDtBQUNqRCxxRUFBK0Q7QUFDL0QseUNBQXlDO0FBQ3pDLG1FQUE4RztBQUM5RywyQ0FBdUM7QUFpQnZDLE1BQWEsZ0JBQWlCLFNBQVEsc0JBQVM7SUFLN0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE0QjtRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sRUFDSixTQUFTLEVBQ1QsVUFBVSxFQUNWLFNBQVMsRUFDVCxPQUFPLEVBQ1AsV0FBVyxFQUNYLE9BQU8sR0FBRyxLQUFLLEVBQ2YsTUFBTSxHQUFHLEtBQUssR0FDZixHQUFHLEtBQUssQ0FBQztRQUVWLElBQUksTUFBa0IsQ0FBQztRQUN2QixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUNqQyxDQUFDO2FBQU0sQ0FBQztZQUNOLG1CQUFtQjtZQUNuQixNQUFNLFVBQVUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQzVDLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDdkMsVUFBVTtnQkFDVixhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQywyQkFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsMkJBQWEsQ0FBQyxPQUFPO2dCQUNwRSxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSTthQUN6QyxDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLO2dCQUN4QixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ2pCLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsR0FBRyxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUM7Z0JBQ3RELFVBQVUsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLDRCQUE0QixDQUFDLENBQUM7YUFDckUsQ0FBQyxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsV0FBVyxHQUFHO2dCQUNqQixVQUFVO2dCQUNWLFdBQVcsRUFBRSxZQUFZO2FBQzFCLENBQUM7UUFDSixDQUFDO1FBQ0Qsa0RBQWtEO1FBQ2xELE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUU7WUFDeEQsY0FBYyxFQUFFO2dCQUNkLE1BQU0sRUFBRSxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUM7b0JBQzdCLFVBQVUsRUFBRTt3QkFDVixJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7NEJBQ3RCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7NEJBQ3hCLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQzs0QkFDakIsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQzt5QkFDdkQsQ0FBQztxQkFDSDtpQkFDRixDQUFDO2FBQ0g7WUFDRCxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsNEJBQTRCLENBQUM7U0FDbEUsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUU3QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDN0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTdELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxrQ0FBYyxDQUFDLEtBQUssRUFBRSxvQkFBb0IsRUFBRTtZQUMxRCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVE7WUFDcEQsOENBQThDO1lBQzlDLGdFQUFnRTtZQUNoRSxPQUFPLEVBQUUsU0FBUztZQUNsQixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzdCLFdBQVcsRUFBRTtnQkFDWCxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFrQjtnQkFDeEMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQTRCO2dCQUNoRCxVQUFVLEVBQUUsU0FBUztnQkFDckIsa0JBQWtCLEVBQUUsVUFBVTtnQkFDOUIsVUFBVSxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUU7Z0JBQ25DLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDOUMsY0FBYyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVTtnQkFDM0MsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVztnQkFDMUMsV0FBVyxFQUFFLE9BQU87YUFDckI7WUFDRCxZQUFZLEVBQUUsc0JBQUksQ0FBQyxhQUFhLENBQUMsU0FBUztTQUMzQyxDQUFDLENBQUM7UUFDSCxpREFBaUQ7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQ3ZCLEdBQUcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO1lBQzNCLE1BQU0sRUFBRSxPQUFPO1lBQ2YsTUFBTSxFQUFFLGFBQWE7WUFDckIsUUFBUSxFQUFFLEdBQUc7U0FDZCxDQUFDLENBQ0gsQ0FBQztRQUNGLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FDdkIsR0FBRyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUM7WUFDM0IsTUFBTSxFQUFFLE9BQU87WUFDZixNQUFNLEVBQUUsZ0JBQWdCO1lBQ3hCLFFBQVEsRUFBRSxHQUFHO1NBQ2QsQ0FBQyxDQUNILENBQUM7UUFDRix1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQ3ZCLEdBQUcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO1lBQzNCLE1BQU0sRUFBRSxPQUFPO1lBQ2YsTUFBTSxFQUFFLGNBQWM7WUFDdEIsUUFBUSxFQUFFLE9BQU87U0FDbEIsQ0FBQyxDQUNILENBQUM7UUFFRixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1oseUNBQXlDO1lBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUksVUFBVSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7Z0JBQzNELE9BQU8sRUFBRSxnREFBZ0Q7YUFDMUQsQ0FBQyxDQUFDO1lBRUgsbUNBQW1DO1lBQ25DLE1BQU0sWUFBWSxHQUFHLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO2dCQUNyRSxlQUFlLEVBQUU7b0JBQ2YsTUFBTSxFQUFFLElBQUksa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxDQUFDO29CQUM5RSxvQkFBb0IsRUFBRSxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUztvQkFDL0QsY0FBYyxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsc0JBQXNCO29CQUNoRSxhQUFhLEVBQUUsVUFBVSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0I7b0JBQzlELFdBQVcsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLHVCQUF1QjtpQkFDNUQ7Z0JBQ0QsT0FBTyxFQUFFLElBQUk7YUFDZCxDQUFDLENBQUM7WUFFSCxnREFBZ0Q7WUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO2dCQUN4QyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLO2dCQUN4QixPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUM7Z0JBQ3pCLFNBQVMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDO2dCQUNwQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsK0NBQStDLENBQUMsQ0FBQzthQUNsRyxDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFdEMsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxHQUFHLENBQUMsa0JBQWtCLENBQUMsMkJBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0MsWUFBWSxDQUFDLGtCQUFrQixDQUFDLDJCQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3RELHNFQUFzRTtnQkFDdEUsOENBQThDO2dCQUM5QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQztvQkFDM0QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQztpQkFDeEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0osSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtvQkFDeEMsS0FBSyxFQUFFLHdDQUF3QyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsY0FBYyxjQUFjLEdBQUc7b0JBQ3pHLFVBQVUsRUFBRSxHQUFHLGlCQUFHLENBQUMsVUFBVSxxQkFBcUI7b0JBQ2xELFdBQVcsRUFBRSxnREFBZ0Q7aUJBQzlELENBQUMsQ0FBQztnQkFDSCxJQUFJLG9DQUFpQixDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRTtvQkFDN0MsUUFBUSxFQUFFO3dCQUNSLE9BQU8sRUFBRSxJQUFJO3dCQUNiLE1BQU0sRUFBRSxpQkFBaUI7d0JBQ3pCLFVBQVUsRUFBRTs0QkFDVixNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVOzRCQUNuQyxjQUFjLEVBQUUsY0FBYzt5QkFDL0I7d0JBQ0Qsa0JBQWtCLEVBQUUscUNBQWtCLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7cUJBQ3BFO29CQUNELHlHQUF5RztvQkFDekcsTUFBTSxFQUFFLDBDQUF1QixDQUFDLFlBQVksQ0FBQzt3QkFDM0MsU0FBUyxFQUFFLDBDQUF1QixDQUFDLFlBQVk7cUJBQ2hELENBQUM7aUJBQ0gsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxZQUFZLENBQUMsc0JBQXNCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2RyxDQUFDO0lBQ0gsQ0FBQzs7QUF0S0gsNENBdUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIEF3cywgQ2ZuT3V0cHV0LCBhd3NfbG9ncyBhcyBsb2dzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY2xvdWRmcm9udCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgKiBhcyBjbG91ZGZyb250X29yaWdpbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQtb3JpZ2lucyc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBSdW50aW1lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBOb2RlanNGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSwgQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3ksIFBoeXNpY2FsUmVzb3VyY2VJZCB9IGZyb20gJ2F3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFydmVzdEpvYkxhbWJkYVByb3BzIHtcbiAgcmVhZG9ubHkgY2hhbm5lbElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVuZHBvaW50SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhcnRUaW1lOiBEYXRlO1xuICByZWFkb25seSBlbmRUaW1lPzogRGF0ZTtcbiAgcmVhZG9ubHkgZGVzdGluYXRpb24/OiBIYXJ2ZXN0Sm9iRGVzdGluYXRpb25Qcm9wcztcbiAgcmVhZG9ubHkgcHVibGlzaD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJldGFpbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFydmVzdEpvYkRlc3RpbmF0aW9uUHJvcHMge1xuICByZWFkb25seSBidWNrZXROYW1lOiBzdHJpbmc7IC8vIFRoZSBuYW1lIG9mIHRoZSBTMyBidWNrZXQuXG4gIHJlYWRvbmx5IG1hbmlmZXN0S2V5OiBzdHJpbmc7IC8vIFRoZSBTMyBidWNrZXQga2V5IG9mIHRoZSBtYW5pZmVzdCBmaWxlLlxufVxuXG5leHBvcnQgY2xhc3MgSGFydmVzdEpvYkxhbWJkYSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBmdW5jOiBOb2RlanNGdW5jdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBIYXJ2ZXN0Sm9iRGVzdGluYXRpb25Qcm9wcztcbiAgcHVibGljIHJlYWRvbmx5IHB1Ymxpc2hlZFVybD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSGFydmVzdEpvYkxhbWJkYVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIGVuZHBvaW50SWQsXG4gICAgICBzdGFydFRpbWUsXG4gICAgICBlbmRUaW1lLFxuICAgICAgZGVzdGluYXRpb24sXG4gICAgICBwdWJsaXNoID0gZmFsc2UsXG4gICAgICByZXRhaW4gPSBmYWxzZSxcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBsZXQgYnVja2V0OiBzMy5JQnVja2V0O1xuICAgIGlmIChkZXN0aW5hdGlvbikge1xuICAgICAgYnVja2V0ID0gczMuQnVja2V0LmZyb21CdWNrZXROYW1lKHRoaXMsICdCdWNrZXQnLCBkZXN0aW5hdGlvbi5idWNrZXROYW1lKTtcbiAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIFMzIGJ1Y2tldFxuICAgICAgY29uc3QgYnVja2V0TmFtZSA9IGAke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcbiAgICAgIGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgYnVja2V0TmFtZSwge1xuICAgICAgICBidWNrZXROYW1lLFxuICAgICAgICByZW1vdmFsUG9saWN5OiByZXRhaW4gPyBSZW1vdmFsUG9saWN5LlJFVEFJTiA6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHJldGFpbiA/IGZhbHNlIDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgYnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFsnczM6KiddLFxuICAgICAgICByZXNvdXJjZXM6IFtidWNrZXQuYnVja2V0QXJuLCBgJHtidWNrZXQuYnVja2V0QXJufS8qYF0sXG4gICAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ21lZGlhcGFja2FnZS5hbWF6b25hd3MuY29tJyldLFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IHtcbiAgICAgICAgYnVja2V0TmFtZSxcbiAgICAgICAgbWFuaWZlc3RLZXk6ICdpbmRleC5tM3U4JyxcbiAgICAgIH07XG4gICAgfVxuICAgIC8vQ3JlYXRlIGFuIElBTSBSb2xlIGZvciBNZWRpYVBhY2thZ2UgdG8gYWNjZXNzIFMzXG4gICAgY29uc3Qgcm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnSWFtUm9sZUZvck1lZGlhUGFja2FnZScsIHtcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIHBvbGljeTogbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsnczM6KiddLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtidWNrZXQuYnVja2V0QXJuLCBgJHtidWNrZXQuYnVja2V0QXJufS8qYF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnbWVkaWFwYWNrYWdlLmFtYXpvbmF3cy5jb20nKSxcbiAgICB9KTtcbiAgICBjb25zdCByb2xlQXJuID0gcm9sZS5yb2xlQXJuO1xuXG4gICAgY29uc3QgVFNfRU5UUlkgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnY29kZScsICdpbmRleC50cycpO1xuICAgIGNvbnN0IEpTX0VOVFJZID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ2NvZGUnLCAnaW5kZXguanMnKTtcblxuICAgIHRoaXMuZnVuYyA9IG5ldyBOb2RlanNGdW5jdGlvbihzY29wZSwgJ0hhcnZlc3RKb2JGdW5jdGlvbicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICBlbnRyeTogZnMuZXhpc3RzU3luYyhUU19FTlRSWSkgPyBUU19FTlRSWSA6IEpTX0VOVFJZLFxuICAgICAgLy8gcHJvamVjdFJvb3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLicpLFxuICAgICAgLy8gZGVwc0xvY2tGaWxlUGF0aDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJywgJ3lhcm4ubG9jaycpLFxuICAgICAgaGFuZGxlcjogJ2hhbmRsZXInLFxuICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzMCksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBOT0RFX0VOVjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgYXMgc3RyaW5nLFxuICAgICAgICBSRUdJT046IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTiBhcyBzdHJpbmcsXG4gICAgICAgIENIQU5ORUxfSUQ6IGNoYW5uZWxJZCxcbiAgICAgICAgT1JJR0lOX0VORFBPSU5UX0lEOiBlbmRwb2ludElkLFxuICAgICAgICBTVEFSVF9USU1FOiBzdGFydFRpbWUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgRU5EX1RJTUU6IGVuZFRpbWUgPyBlbmRUaW1lLnRvSVNPU3RyaW5nKCkgOiAnJyxcbiAgICAgICAgUzNfQlVDS0VUX05BTUU6IHRoaXMuZGVzdGluYXRpb24uYnVja2V0TmFtZSxcbiAgICAgICAgTUFOSUZFU1RfS0VZOiB0aGlzLmRlc3RpbmF0aW9uLm1hbmlmZXN0S2V5LFxuICAgICAgICBTM19ST0xFX0FSTjogcm9sZUFybixcbiAgICAgIH0sXG4gICAgICBsb2dSZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5UV09fV0VFS1MsXG4gICAgfSk7XG4gICAgLy8gQWRkIGEgc3RhdGVtZW50IHRvIGNhbGwgTWVkaWFMaXZlIHNjaGVkdWxlIEFQSVxuICAgIHRoaXMuZnVuYy5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBpYW0uUG9saWN5U3RhdGVtZW50LmZyb21Kc29uKHtcbiAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICBBY3Rpb246ICdtZWRpYWxpdmU6KicsXG4gICAgICAgIFJlc291cmNlOiAnKicsXG4gICAgICB9KSxcbiAgICApO1xuICAgIC8vIEFkZCBhIHN0YXRlbWVudCB0byBjYWxsIE1lZGlhUGFja2FnZSBoYXJ2ZXN0IGpvYiBBUElcbiAgICB0aGlzLmZ1bmMuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgaWFtLlBvbGljeVN0YXRlbWVudC5mcm9tSnNvbih7XG4gICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgQWN0aW9uOiAnbWVkaWFwYWNrYWdlOionLFxuICAgICAgICBSZXNvdXJjZTogJyonLFxuICAgICAgfSksXG4gICAgKTtcbiAgICAvLyBBZGQgYSBzdGF0ZW1lbnQgdG8gcGFzcyB0aGUgSUFNIHJvbGUgdG8gTWVkaWFQYWNrYWdlXG4gICAgdGhpcy5mdW5jLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIGlhbS5Qb2xpY3lTdGF0ZW1lbnQuZnJvbUpzb24oe1xuICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgIEFjdGlvbjogJ2lhbTpQYXNzUm9sZScsXG4gICAgICAgIFJlc291cmNlOiByb2xlQXJuLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGlmIChwdWJsaXNoKSB7XG4gICAgICAvLyBDcmVhdGUgYW4gT3JpZ2luIEFjY2VzcyBJZGVudGl0eSAoT0FJKVxuICAgICAgY29uc3Qgb2FpID0gbmV3IGNsb3VkZnJvbnQuT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcywgJ09BSScsIHtcbiAgICAgICAgY29tbWVudDogJ09BSSBmb3IgQ2xvdWRGcm9udCB0byBhY2Nlc3MgcHJpdmF0ZSBTMyBidWNrZXQnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uXG4gICAgICBjb25zdCBkaXN0cmlidXRpb24gPSBuZXcgY2xvdWRmcm9udC5EaXN0cmlidXRpb24odGhpcywgJ0Rpc3RyaWJ1dGlvbicsIHtcbiAgICAgICAgZGVmYXVsdEJlaGF2aW9yOiB7XG4gICAgICAgICAgb3JpZ2luOiBuZXcgY2xvdWRmcm9udF9vcmlnaW5zLlMzT3JpZ2luKGJ1Y2tldCwgeyBvcmlnaW5BY2Nlc3NJZGVudGl0eTogb2FpIH0pLFxuICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBjbG91ZGZyb250LlZpZXdlclByb3RvY29sUG9saWN5LkFMTE9XX0FMTCxcbiAgICAgICAgICBhbGxvd2VkTWV0aG9kczogY2xvdWRmcm9udC5BbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IGNsb3VkZnJvbnQuQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgIGNhY2hlUG9saWN5OiBjbG91ZGZyb250LkNhY2hlUG9saWN5LkVMRU1FTlRBTF9NRURJQV9QQUNLQUdFLFxuICAgICAgICB9LFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEdyYW50IHRoZSBPQUkgYWNjZXNzIHRvIHRoZSBwcml2YXRlIFMzIGJ1Y2tldFxuICAgICAgY29uc3Qgc3RhdGVtZW50ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFsnczM6R2V0T2JqZWN0J10sXG4gICAgICAgIHJlc291cmNlczogW2Ake2J1Y2tldC5idWNrZXRBcm59LypgXSxcbiAgICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uQ2Fub25pY2FsVXNlclByaW5jaXBhbChvYWkuY2xvdWRGcm9udE9yaWdpbkFjY2Vzc0lkZW50aXR5UzNDYW5vbmljYWxVc2VySWQpXSxcbiAgICAgIH0pO1xuICAgICAgYnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3koc3RhdGVtZW50KTtcblxuICAgICAgaWYgKHJldGFpbikge1xuICAgICAgICBvYWkuYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuUkVUQUlOKTtcbiAgICAgICAgZGlzdHJpYnV0aW9uLmFwcGx5UmVtb3ZhbFBvbGljeShSZW1vdmFsUG9saWN5LlJFVEFJTik7XG4gICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgcmV0YWluIHRoZSByZXNvdXJjZSBwb2xpY3kgZHVlIHRvIHRoZSBrbm93biBpc3N1ZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy8yNzEyNVxuICAgICAgICBjb25zdCBkb2N1bWVudFN0cmluZyA9IEpTT04uc3RyaW5naWZ5KG5ldyBpYW0uUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIGFzc2lnblNpZHM6IHRydWUsXG4gICAgICAgICAgc3RhdGVtZW50czogW3N0YXRlbWVudF0sXG4gICAgICAgIH0pKTtcbiAgICAgICAgbmV3IENmbk91dHB1dCh0aGlzLCAnUHV0QnVja2V0UG9saWN5Q0xJJywge1xuICAgICAgICAgIHZhbHVlOiBgYXdzIHMzYXBpIHB1dC1idWNrZXQtcG9saWN5IC0tYnVja2V0ICR7dGhpcy5kZXN0aW5hdGlvbi5idWNrZXROYW1lfSAtLXBvbGljeSAnJHtkb2N1bWVudFN0cmluZ30nYCxcbiAgICAgICAgICBleHBvcnROYW1lOiBgJHtBd3MuU1RBQ0tfTkFNRX0tUHV0QnVja2V0UG9saWN5Q0xJYCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1J1biB0aGlzIGNvbW1hbmQgd2hlbiBjZGsgZGVzdHJveSBzaG93cyBlcnJvci4nLFxuICAgICAgICB9KTtcbiAgICAgICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsICdQdXRCdWNrZXRQb2xpY3knLCB7XG4gICAgICAgICAgb25EZWxldGU6IHtcbiAgICAgICAgICAgIHNlcnZpY2U6ICdTMycsXG4gICAgICAgICAgICBhY3Rpb246ICdQdXRCdWNrZXRQb2xpY3knLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBCdWNrZXQ6IHRoaXMuZGVzdGluYXRpb24uYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgUG9saWN5RG9jdW1lbnQ6IGRvY3VtZW50U3RyaW5nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogUGh5c2ljYWxSZXNvdXJjZUlkLm9mKGAke2NyeXB0by5yYW5kb21VVUlEKCl9YCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvL1dpbGwgaWdub3JlIGFueSByZXNvdXJjZSBhbmQgdXNlIHRoZSBhc3N1bWVkUm9sZUFybiBhcyByZXNvdXJjZSBhbmQgJ3N0czpBc3N1bWVSb2xlJyBmb3Igc2VydmljZTphY3Rpb25cbiAgICAgICAgICBwb2xpY3k6IEF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TZGtDYWxscyh7XG4gICAgICAgICAgICByZXNvdXJjZXM6IEF3c0N1c3RvbVJlc291cmNlUG9saWN5LkFOWV9SRVNPVVJDRSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHVibGlzaGVkVXJsID0gYGh0dHBzOi8vJHtkaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uRG9tYWluTmFtZX0vJHt0aGlzLmRlc3RpbmF0aW9uLm1hbmlmZXN0S2V5fWA7XG4gICAgfVxuICB9XG59Il19