cdk-emrserverless-with-delta-lake
Version:
A construct for the quick demo of EMR Serverless.
177 lines • 20.7 kB
JavaScript
;
var _a, _b;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ServerlessJobRole = exports.EmrServerless = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const cdk = require("aws-cdk-lib");
const emrserverlss = require("aws-cdk-lib/aws-emrserverless");
const iam = require("aws-cdk-lib/aws-iam");
const constructs_1 = require("constructs");
const buckets_1 = require("./buckets");
const emr_studio_1 = require("./emr-studio");
/**
* Creates an EMR Studio, an EMR cluster template for the studio, and an EMR Serverless application.
*
* ```ts
* // the quickiest deployment
* new EmrServerless(this, 'EmrServerless');
*
* // custom deployment references
* new EmrServerless(this, 'EmrServerless', {
* vpcId: 'vpc-idididid',
* });
*
* new EmrServerless(this, 'EmrServerless', {
* vpcId: 'vpc-idididid',
* subnetIds: ['subnet-eeeee', 'subnet-fffff']
* });
*
* const myRole = new iam.Role.fromRoleName('MyRole');
* new EmrServerless(this, 'EmrServerless', {
* serviceCatalogProps: {
* role: myRole
* }
* });
*
* const myUser = new iam.Role.fromUserName('MyUser');
* new EmrServerless(this, 'EmrServerless', {
* vpcId: 'vpc-idididid',
* subnetIds: ['subnet-eeeee', 'subnet-fffff'],
* serviceCatalogProps: {
* user: myUser
* }
* });
*
* const myGroup = new iam.Group.fromGroupName('MyGroup');
* new EmrServerless(this, 'EmrServerless', {
* serviceCatalogProps: {
* group: myGroup
* }
* });
* ```
*/
class EmrServerless extends constructs_1.Construct {
constructor(scope, name, props) {
super(scope, name);
const workspaceBucket = new buckets_1.WorkSpaceBucket(this, 'EmrStudio');
const emrServerlessBucket = new buckets_1.EmrServerlessBucket(this, 'EmrServerless');
new emr_studio_1.EmrStudio(this, 'QuickDemo', {
workSpaceBucket: workspaceBucket,
subnetIds: props?.subnetIds,
serviceCatalogProps: props?.serviceCatalogProps,
});
new ServerlessJobRole(this, 'ExecutionJob', { emrServerlessBucket: emrServerlessBucket.bucketEntity });
const serverlessApplication = new emrserverlss.CfnApplication(this, 'application', {
name: 'Emr-Serverless-Quick-Launch-Application',
releaseLabel: 'emr-7.1.0',
type: 'Spark',
initialCapacity: [
{
key: 'Driver',
value: {
workerCount: 1,
workerConfiguration: {
cpu: '2 vCPU',
memory: '4 GB',
disk: '20 GB',
},
},
},
{
key: 'Executor',
value: {
workerCount: 2,
workerConfiguration: {
cpu: '4 vCPU',
memory: '8 GB',
disk: '20 GB',
},
},
},
],
maximumCapacity: {
cpu: '12 vCPU',
memory: '60 GB',
disk: '1024 GB',
},
autoStartConfiguration: {
enabled: true,
},
autoStopConfiguration: {
enabled: true,
idleTimeoutMinutes: 1,
},
});
new cdk.CfnOutput(this, 'OEmrServerlessApplictionId', { value: serverlessApplication.attrApplicationId, description: 'The ID of the EMR Serverless application' });
}
}
exports.EmrServerless = EmrServerless;
_a = JSII_RTTI_SYMBOL_1;
EmrServerless[_a] = { fqn: "cdk-emrserverless-with-delta-lake.EmrServerless", version: "2.0.831" };
/**
* Creates an execution job role for EMR Serverless.
*
* For detail, please refer to [Create a job runtime role](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/getting-started.html#gs-runtime-role).
*
* ```ts
* const emrServerlessBucket = new EmrServerlessBucket(this, 'EmrServerlessStorage');
* const emrServerlessJobRole = new ServerlessJobRole(this, 'EmrServerlessJob', {emrServerlessBucket: emrServerlessBucket});
* ```
*/
class ServerlessJobRole extends constructs_1.Construct {
constructor(scope, name, props) {
super(scope, name);
this.entity = new iam.Role(this, 'JobRole', {
roleName: 'Emr-Serverless-Job-Role',
assumedBy: new iam.ServicePrincipal('emr-serverless.amazonaws.com'),
inlinePolicies: {
['emr-serverless-job-policy']: new iam.PolicyDocument({
assignSids: true,
statements: [new iam.PolicyStatement({
sid: 'ReadAccessForEMRSamples',
effect: iam.Effect.ALLOW,
actions: ['s3:GetObject', 's3:ListBucket'],
resources: [`arn:${cdk.Aws.PARTITION}:s3:::*.elasticmapreduce`, 'arn:aws:s3:::*.elasticmapreduce/*'],
}), new iam.PolicyStatement({
sid: 'FullAccessToOutputBucket',
effect: iam.Effect.ALLOW,
actions: [
's3:PutObject',
's3:GetObject',
's3:ListBucket',
's3:DeleteObject',
],
resources: [
`${props.emrServerlessBucket.bucketArn}`,
`${props.emrServerlessBucket.bucketArn}/*`,
],
}), new iam.PolicyStatement({
sid: 'GlueCreateAndReadDataCatalog',
effect: iam.Effect.ALLOW,
actions: [
'glue:GetDatabase',
'glue:CreateDatabase',
'glue:GetDataBases',
'glue:CreateTable',
'glue:GetTable',
'glue:UpdateTable',
'glue:DeleteTable',
'glue:GetTables',
'glue:GetPartition',
'glue:GetPartitions',
'glue:CreatePartition',
'glue:BatchCreatePartition',
'glue:GetUserDefinedFunctions',
],
resources: ['*'],
})],
}),
},
});
new cdk.CfnOutput(this, 'OEmrServerlessJobRoleArn', { value: this.entity.roleArn, description: 'The ARN of the EMR Serverless job role.' });
}
}
exports.ServerlessJobRole = ServerlessJobRole;
_b = JSII_RTTI_SYMBOL_1;
ServerlessJobRole[_b] = { fqn: "cdk-emrserverless-with-delta-lake.ServerlessJobRole", version: "2.0.831" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1yc2VydmVybGVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbXJzZXJ2ZXJsZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQW1DO0FBQ25DLDhEQUE4RDtBQUM5RCwyQ0FBMkM7QUFFM0MsMkNBQXVDO0FBQ3ZDLHVDQUFpRTtBQUNqRSw2Q0FBeUM7QUF3QnpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsTUFBYSxhQUFjLFNBQVEsc0JBQVM7SUFDMUMsWUFBWSxLQUFnQixFQUFFLElBQVksRUFBRSxLQUEwQjtRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25CLE1BQU0sZUFBZSxHQUFHLElBQUkseUJBQWUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDL0QsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLDZCQUFtQixDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztRQUMzRSxJQUFJLHNCQUFTLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUMvQixlQUFlLEVBQUUsZUFBZTtZQUNoQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVM7WUFDM0IsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLG1CQUFtQjtTQUNoRCxDQUFDLENBQUM7UUFDSCxJQUFJLGlCQUFpQixDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDakYsSUFBSSxFQUFFLHlDQUF5QztZQUMvQyxZQUFZLEVBQUUsV0FBVztZQUN6QixJQUFJLEVBQUUsT0FBTztZQUNiLGVBQWUsRUFBRTtnQkFDZjtvQkFDRSxHQUFHLEVBQUUsUUFBUTtvQkFDYixL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QW9CO2dDQUNwQixzQkFBc0I7Z0NBQ3RCLDJCQUEyQjtnQ0FDM0IsOEJBQThCOzZCQUMvQjs0QkFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7eUJBQ2pCLENBQ0YsQ0FBQztpQkFDSCxDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLDBCQUEwQixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSx5Q0FBeUMsRUFBRSxDQUFDLENBQUM7SUFDOUksQ0FBQzs7QUF6REgsOENBMERDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVtcnNlcnZlcmxzcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZW1yc2VydmVybGVzcyc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBFbXJTZXJ2ZXJsZXNzQnVja2V0LCBXb3JrU3BhY2VCdWNrZXQgfSBmcm9tICcuL2J1Y2tldHMnO1xuaW1wb3J0IHsgRW1yU3R1ZGlvIH0gZnJvbSAnLi9lbXItc3R1ZGlvJztcbmltcG9ydCB7IEVtclN0dWRpb0RldmVsb3BlclN0YWNrUHJvcHMgfSBmcm9tICcuL2Vtci1zdHVkaW8tY2x1c3Rlci10ZW1wbGF0ZXMnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1yU2VydmVybGVzc1Byb3BzIHtcbiAgLyoqXG4gICAqIFVzZWQgYnkgdGhlIEVNUiBTdHVkaW8uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gJ1RoZSBkZWZhdWx0IFZQQyB3aWxsIGJlIHVzZWQuJ1xuICAgKi9cbiAgcmVhZG9ubHkgdnBjSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgICAqIFRoZSBzdWJuZXQgSURzIGZvciB0aGUgRU1SIHN0dWRpby5cbiAgICAgKiBZb3UgY2FuIHNlbGVjdCB0aGUgc3VibmV0cyBmcm9tIHRoZSBkZWZhdWx0IFZQQyBpbiB5b3VyIEFXUyBhY2NvdW50LlxuICAgICAqL1xuICByZWFkb25seSBzdWJuZXRJZHM/OiBBcnJheTxzdHJpbmc+O1xuICAvKipcbiAgICogT3B0aW9ucyBmb3Igd2hpY2gga2luZCBvZiBpZGVudGl0eSB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgUHJvZHVjdCBvZiB0aGUgUG9yZm9saW8gaW4gQVdTIFNlcnZpY2UgQ2F0YWxvZyBmb3IgRU1SIGNsdXN0ZXIgdGVtcGxhdGVzLlxuICAgKlxuICAgKiBZb3UgY2FuIGNob29zZSBlaXRoZXIgYW4gSUFNIGdyb3VwLCBJQU0gcm9sZSwgb3IgSUFNIHVzZXIuIElmIHlvdSBsZWF2ZSBpdCBlbXB0eSwgYW4gSUFNIHVzZXIgbmFtZWQgYEFkbWluaXN0cmF0b3JgIHdpdGggdGhlIGBBZG1pbmlzdHJhdG9yQWNjZXNzYCBwb3dlciBuZWVkcyB0byBiZSBjcmVhdGVkIGZpcnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZUNhdGFsb2dQcm9wcz86IEVtclN0dWRpb0RldmVsb3BlclN0YWNrUHJvcHM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBFTVIgU3R1ZGlvLCBhbiBFTVIgY2x1c3RlciB0ZW1wbGF0ZSBmb3IgdGhlIHN0dWRpbywgYW5kIGFuIEVNUiBTZXJ2ZXJsZXNzIGFwcGxpY2F0aW9uLlxuICpcbiAqIGBgYHRzXG4gKiAvLyB0aGUgcXVpY2tpZXN0IGRlcGxveW1lbnRcbiAqIG5ldyBFbXJTZXJ2ZXJsZXNzKHRoaXMsICdFbXJTZXJ2ZXJsZXNzJyk7XG4gKlxuICogLy8gY3VzdG9tIGRlcGxveW1lbnQgcmVmZXJlbmNlc1xuICogbmV3IEVtclNlcnZlcmxlc3ModGhpcywgJ0VtclNlcnZlcmxlc3MnLCB7XG4gKiAgICB2cGNJZDogJ3ZwYy1pZGlkaWRpZCcsXG4gKiB9KTtcbiAqXG4gKiBuZXcgRW1yU2VydmVybGVzcyh0aGlzLCAnRW1yU2VydmVybGVzcycsIHtcbiAqICAgIHZwY0lkOiAndnBjLWlkaWRpZGlkJyxcbiAqICAgIHN1Ym5ldElkczogWydzdWJuZXQtZWVlZWUnLCAnc3VibmV0LWZmZmZmJ11cbiAqIH0pO1xuICpcbiAqIGNvbnN0IG15Um9sZSA9IG5ldyBpYW0uUm9sZS5mcm9tUm9sZU5hbWUoJ015Um9sZScpO1xuICogbmV3IEVtclNlcnZlcmxlc3ModGhpcywgJ0VtclNlcnZlcmxlc3MnLCB7XG4gKiAgICBzZXJ2aWNlQ2F0YWxvZ1Byb3BzOiB7XG4gKiAgICAgICAgcm9sZTogbXlSb2xlXG4gKiAgICB9XG4gKiB9KTtcbiAqXG4gKiBjb25zdCBteVVzZXIgPSBuZXcgaWFtLlJvbGUuZnJvbVVzZXJOYW1lKCdNeVVzZXInKTtcbiAqIG5ldyBFbXJTZXJ2ZXJsZXNzKHRoaXMsICdFbXJTZXJ2ZXJsZXNzJywge1xuICogICAgdnBjSWQ6ICd2cGMtaWRpZGlkaWQnLFxuICogICAgc3VibmV0SWRzOiBbJ3N1Ym5ldC1lZWVlZScsICdzdWJuZXQtZmZmZmYnXSxcbiAqICAgIHNlcnZpY2VDYXRhbG9nUHJvcHM6IHtcbiAqICAgICAgICB1c2VyOiBteVVzZXJcbiAqICAgIH1cbiAqIH0pO1xuICpcbiAqIGNvbnN0IG15R3JvdXAgPSBuZXcgaWFtLkdyb3VwLmZyb21Hcm91cE5hbWUoJ015R3JvdXAnKTtcbiAqIG5ldyBFbXJTZXJ2ZXJsZXNzKHRoaXMsICdFbXJTZXJ2ZXJsZXNzJywge1xuICogICAgc2VydmljZUNhdGFsb2dQcm9wczoge1xuICogICAgICAgIGdyb3VwOiBteUdyb3VwXG4gKiAgICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRW1yU2VydmVybGVzcyBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIG5hbWU6IHN0cmluZywgcHJvcHM/OiBFbXJTZXJ2ZXJsZXNzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgbmFtZSk7XG4gICAgY29uc3Qgd29ya3NwYWNlQnVja2V0ID0gbmV3IFdvcmtTcGFjZUJ1Y2tldCh0aGlzLCAnRW1yU3R1ZGlvJyk7XG4gICAgY29uc3QgZW1yU2VydmVybGVzc0J1Y2tldCA9IG5ldyBFbXJTZXJ2ZXJsZXNzQnVja2V0KHRoaXMsICdFbXJTZXJ2ZXJsZXNzJyk7XG4gICAgbmV3IEVtclN0dWRpbyh0aGlzLCAnUXVpY2tEZW1vJywge1xuICAgICAgd29ya1NwYWNlQnVja2V0OiB3b3Jrc3BhY2VCdWNrZXQsXG4gICAgICBzdWJuZXRJZHM6IHByb3BzPy5zdWJuZXRJZHMsXG4gICAgICBzZXJ2aWNlQ2F0YWxvZ1Byb3BzOiBwcm9wcz8uc2VydmljZUNhdGFsb2dQcm9wcyxcbiAgICB9KTtcbiAgICBuZXcgU2VydmVybGVzc0pvYlJvbGUodGhpcywgJ0V4ZWN1dGlvbkpvYicsIHsgZW1yU2VydmVybGVzc0J1Y2tldDogZW1yU2VydmVybGVzc0J1Y2tldC5idWNrZXRFbnRpdHkgfSk7XG4gICAgY29uc3Qgc2VydmVybGVzc0FwcGxpY2F0aW9uID0gbmV3IGVtcnNlcnZlcmxzcy5DZm5BcHBsaWNhdGlvbih0aGlzLCAnYXBwbGljYXRpb24nLCB7XG4gICAgICBuYW1lOiAnRW1yLVNlcnZlcmxlc3MtUXVpY2stTGF1bmNoLUFwcGxpY2F0aW9uJyxcbiAgICAgIHJlbGVhc2VMYWJlbDogJ2Vtci03LjEuMCcsXG4gICAgICB0eXBlOiAnU3BhcmsnLFxuICAgICAgaW5pdGlhbENhcGFjaXR5OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdEcml2ZXInLFxuICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICB3b3JrZXJDb3VudDogMSxcbiAgICAgICAgICAgIHdvcmtlckNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgY3B1OiAnMiB2Q1BVJyxcbiAgICAgICAgICAgICAgbWVtb3J5OiAnNCBHQicsXG4gICAgICAgICAgICAgIGRpc2s6ICcyMCBHQicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdFeGVjdXRvcicsXG4gICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgIHdvcmtlckNvdW50OiAyLFxuICAgICAgICAgICAgd29ya2VyQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICBjcHU6ICc0IHZDUFUnLFxuICAgICAgICAgICAgICBtZW1vcnk6ICc4IEdCJyxcbiAgICAgICAgICAgICAgZGlzazogJzIwIEdCJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBtYXhpbXVtQ2FwYWNpdHk6IHtcbiAgICAgICAgY3B1OiAnMTIgdkNQVScsXG4gICAgICAgIG1lbW9yeTogJzYwIEdCJyxcbiAgICAgICAgZGlzazogJzEwMjQgR0InLFxuICAgICAgfSxcbiAgICAgIGF1dG9TdGFydENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBhdXRvU3RvcENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgaWRsZVRpbWVvdXRNaW51dGVzOiAxLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnT0VtclNlcnZlcmxlc3NBcHBsaWN0aW9uSWQnLCB7IHZhbHVlOiBzZXJ2ZXJsZXNzQXBwbGljYXRpb24uYXR0ckFwcGxpY2F0aW9uSWQsIGRlc2NyaXB0aW9uOiAnVGhlIElEIG9mIHRoZSBFTVIgU2VydmVybGVzcyBhcHBsaWNhdGlvbicgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uIGpvYiByb2xlIG9mIEVNUiBTZXJ2ZXJsZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZlcmxlc3NKb2JSb2xlUHJvcHMge1xuICAvKipcbiAgICAgICAgICogVGhlIEVNUiBTZXJ2ZXJsZXNzIGJ1Y2tldC5cbiAgICAgICAgICovXG4gIHJlYWRvbmx5IGVtclNlcnZlcmxlc3NCdWNrZXQ6IHMzLkJ1Y2tldDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGV4ZWN1dGlvbiBqb2Igcm9sZSBmb3IgRU1SIFNlcnZlcmxlc3MuXG4gKlxuICogRm9yIGRldGFpbCwgcGxlYXNlIHJlZmVyIHRvIFtDcmVhdGUgYSBqb2IgcnVudGltZSByb2xlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZW1yL2xhdGVzdC9FTVItU2VydmVybGVzcy1Vc2VyR3VpZGUvZ2V0dGluZy1zdGFydGVkLmh0bWwjZ3MtcnVudGltZS1yb2xlKS5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgZW1yU2VydmVybGVzc0J1Y2tldCA9IG5ldyBFbXJTZXJ2ZXJsZXNzQnVja2V0KHRoaXMsICdFbXJTZXJ2ZXJsZXNzU3RvcmFnZScpO1xuICogY29uc3QgZW1yU2VydmVybGVzc0pvYlJvbGUgPSBuZXcgU2VydmVybGVzc0pvYlJvbGUodGhpcywgJ0VtclNlcnZlcmxlc3NKb2InLCB7ZW1yU2VydmVybGVzc0J1Y2tldDogZW1yU2VydmVybGVzc0J1Y2tldH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJsZXNzSm9iUm9sZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgICAgICAgKiBUaGUgcmVwcmVzZW50YXRpdmUgb2YgdGhlIGV4ZWN1dGlvbiByb2xlIGZvciBFTVIgU2VydmVybGVzcy5cbiAgICAgICAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdHk6IGlhbS5Sb2xlO1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBuYW1lOiBzdHJpbmcsIHByb3BzOiBTZXJ2ZXJsZXNzSm9iUm9sZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIG5hbWUpO1xuICAgIHRoaXMuZW50aXR5ID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdKb2JSb2xlJywge1xuICAgICAgcm9sZU5hbWU6ICdFbXItU2VydmVybGVzcy1Kb2ItUm9sZScsXG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZW1yLXNlcnZlcmxlc3MuYW1hem9uYXdzLmNvbScpLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgWydlbXItc2VydmVybGVzcy1qb2ItcG9saWN5J106IG5ldyBpYW0uUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIGFzc2lnblNpZHM6IHRydWUsXG4gICAgICAgICAgc3RhdGVtZW50czogW25ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIHNpZDogJ1JlYWRBY2Nlc3NGb3JFTVJTYW1wbGVzJyxcbiAgICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgIGFjdGlvbnM6IFsnczM6R2V0T2JqZWN0JywgJ3MzOkxpc3RCdWNrZXQnXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW2Bhcm46JHtjZGsuQXdzLlBBUlRJVElPTn06czM6OjoqLmVsYXN0aWNtYXByZWR1Y2VgLCAnYXJuOmF3czpzMzo6OiouZWxhc3RpY21hcHJlZHVjZS8qJ10sXG4gICAgICAgICAgfSksIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIHNpZDogJ0Z1bGxBY2Nlc3NUb091dHB1dEJ1Y2tldCcsXG4gICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICdzMzpQdXRPYmplY3QnLFxuICAgICAgICAgICAgICAnczM6R2V0T2JqZWN0JyxcbiAgICAgICAgICAgICAgJ3MzOkxpc3RCdWNrZXQnLFxuICAgICAgICAgICAgICAnczM6RGVsZXRlT2JqZWN0JyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgYCR7cHJvcHMuZW1yU2VydmVybGVzc0J1Y2tldC5idWNrZXRBcm59YCxcbiAgICAgICAgICAgICAgYCR7cHJvcHMuZW1yU2VydmVybGVzc0J1Y2tldC5idWNrZXRBcm59LypgLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KSwgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNpZDogJ0dsdWVDcmVhdGVBbmRSZWFkRGF0YUNhdGFsb2cnLFxuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAnZ2x1ZTpHZXREYXRhYmFzZScsXG4gICAgICAgICAgICAgICAgJ2dsdWU6Q3JlYXRlRGF0YWJhc2UnLFxuICAgICAgICAgICAgICAgICdnbHVlOkdldERhdGFCYXNlcycsXG4gICAgICAgICAgICAgICAgJ2dsdWU6Q3JlYXRlVGFibGUnLFxuICAgICAgICAgICAgICAgICdnbHVlOkdldFRhYmxlJyxcbiAgICAgICAgICAgICAgICAnZ2x1ZTpVcGRhdGVUYWJsZScsXG4gICAgICAgICAgICAgICAgJ2dsdWU6RGVsZXRlVGFibGUnLFxuICAgICAgICAgICAgICAgICdnbHVlOkdldFRhYmxlcycsXG4gICAgICAgICAgICAgICAgJ2dsdWU6R2V0UGFydGl0aW9uJyxcbiAgICAgICAgICAgICAgICAnZ2x1ZTpHZXRQYXJ0aXRpb25zJyxcbiAgICAgICAgICAgICAgICAnZ2x1ZTpDcmVhdGVQYXJ0aXRpb24nLFxuICAgICAgICAgICAgICAgICdnbHVlOkJhdGNoQ3JlYXRlUGFydGl0aW9uJyxcbiAgICAgICAgICAgICAgICAnZ2x1ZTpHZXRVc2VyRGVmaW5lZEZ1bmN0aW9ucycsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICldLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ09FbXJTZXJ2ZXJsZXNzSm9iUm9sZUFybicsIHsgdmFsdWU6IHRoaXMuZW50aXR5LnJvbGVBcm4sIGRlc2NyaXB0aW9uOiAnVGhlIEFSTiBvZiB0aGUgRU1SIFNlcnZlcmxlc3Mgam9iIHJvbGUuJyB9KTtcbiAgfVxufSJdfQ==