@gammarers/aws-sns-slack-message-lambda-subscription
Version:
This AWS CDK Construct is designed to post messages sent from an SNS topic to a Slack Webhook via a Lambda function.
87 lines • 13.3 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SNSSlackMessageLambdaSubscription = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_resource_naming_1 = require("@gammarers/aws-resource-naming");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const iam = require("aws-cdk-lib/aws-iam");
const lambda = require("aws-cdk-lib/aws-lambda");
const logs = require("aws-cdk-lib/aws-logs");
const sns = require("aws-cdk-lib/aws-sns");
const constructs_1 = require("constructs");
const send_slack_message_function_1 = require("./funcs/send-slack-message-function");
class SNSSlackMessageLambdaSubscription extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
// 👇 Get account & region
const account = aws_cdk_lib_1.Stack.of(scope).account;
const region = aws_cdk_lib_1.Stack.of(scope).region;
// 👇 Create random 8 length string
const random = aws_resource_naming_1.ResourceNaming.createRandomString(`${aws_cdk_lib_1.Names.uniqueId(scope)}.${aws_cdk_lib_1.Names.uniqueId(this)}`);
const autoNaming = {
functionName: `send-slack-message-${random}-func`,
functionRoleName: `send-slack-message-lambda-func-exec-${random}-role`,
};
const names = aws_resource_naming_1.ResourceNaming.naming(autoNaming, props.resourceNamingOption);
// Lambda function
const sendMessageFunction = new send_slack_message_function_1.SendSlackMessageFunction(this, 'SendSlackMessageFunction', {
functionName: names.functionName,
description: 'Send Slack message function',
architecture: lambda.Architecture.ARM_64,
role: new iam.Role(this, 'LambdaExecutionRole', {
roleName: names.functionRoleName,
description: '',
assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
managedPolicies: [
iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole'),
],
inlinePolicies: {
'get-secret-policy': new iam.PolicyDocument({
statements: [
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: [
'secretsmanager:GetSecretValue',
],
resources: [
`arn:aws:secretsmanager:${region}:${account}:secret:${props.slackWebhookSecretName}*`,
],
}),
],
}),
},
}),
timeout: aws_cdk_lib_1.Duration.seconds(10),
paramsAndSecrets: lambda.ParamsAndSecretsLayerVersion.fromVersion(lambda.ParamsAndSecretsVersions.V1_0_103, {
cacheSize: 500,
logLevel: lambda.ParamsAndSecretsLogLevel.INFO,
}),
environment: {
SLACK_WEBOOK_SECRET_NAME: props.slackWebhookSecretName,
},
logFormat: lambda.LogFormat.JSON,
systemLogLevel: lambda.SystemLogLevel.INFO,
applicationLogLevel: lambda.ApplicationLogLevel.INFO,
logGroup: new logs.LogGroup(this, 'SendSlackMessageFunctionLogGroup', {
logGroupName: names.functionName ? `/aws/lambda/${names.functionName}` : undefined,
retention: logs.RetentionDays.THREE_MONTHS,
removalPolicy: aws_cdk_lib_1.RemovalPolicy.RETAIN_ON_UPDATE_OR_DELETE,
}),
});
sendMessageFunction.addPermission('InvokeFunctionFromSNS', {
principal: new iam.ServicePrincipal('sns.amazonaws.com'),
action: 'lambda:InvokeFunction',
sourceArn: props.topic.topicArn,
});
new sns.Subscription(this, 'LambdaSubscription', {
topic: props.topic,
protocol: sns.SubscriptionProtocol.LAMBDA,
endpoint: sendMessageFunction.functionArn,
});
}
}
exports.SNSSlackMessageLambdaSubscription = SNSSlackMessageLambdaSubscription;
_a = JSII_RTTI_SYMBOL_1;
SNSSlackMessageLambdaSubscription[_a] = { fqn: "@gammarers/aws-sns-slack-message-lambda-subscription.SNSSlackMessageLambdaSubscription", version: "1.0.11" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFBMkc7QUFDM0csNkNBQW9FO0FBQ3BFLDJDQUEyQztBQUMzQyxpREFBaUQ7QUFDakQsNkNBQTZDO0FBQzdDLDJDQUEyQztBQUMzQywyQ0FBdUM7QUFDdkMscUZBQStFO0FBZ0IvRSxNQUFhLGlDQUFrQyxTQUFRLHNCQUFTO0lBQzlELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNkM7UUFDckYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQiwwQkFBMEI7UUFDMUIsTUFBTSxPQUFPLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUV0QyxtQ0FBbUM7UUFDbkMsTUFBTSxNQUFNLEdBQUcsb0NBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLG1CQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLG1CQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRyxNQUFNLFVBQVUsR0FBRztZQUNqQixZQUFZLEVBQUUsc0JBQXNCLE1BQU0sT0FBTztZQUNqRCxnQkFBZ0IsRUFBRSx1Q0FBdUMsTUFBTSxPQUFPO1NBQ3ZFLENBQUM7UUFDRixNQUFNLEtBQUssR0FBRyxvQ0FBYyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLG9CQUEyRCxDQUFDLENBQUM7UUFFbkgsa0JBQWtCO1FBQ2xCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxzREFBd0IsQ0FBQyxJQUFJLEVBQUUsMEJBQTBCLEVBQUU7WUFDekYsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLFdBQVcsRUFBRSw2QkFBNkI7WUFDMUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTTtZQUN4QyxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRTtnQkFDOUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7Z0JBQ2hDLFdBQVcsRUFBRSxFQUFFO2dCQUNmLFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQztnQkFDM0QsZUFBZSxFQUFFO29CQUNmLEdBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsMENBQTBDLENBQUM7aUJBQ3ZGO2dCQUNELGNBQWMsRUFBRTtvQkFDZCxtQkFBbUIsRUFBRSxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUM7d0JBQzFDLFVBQVUsRUFBRTs0QkFDVixJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7Z0NBQ3RCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7Z0NBQ3hCLE9BQU8sRUFBRTtvQ0FDUCwrQkFBK0I7aUNBQ2hDO2dDQUNELFNBQVMsRUFBRTtvQ0FDVCwwQkFBMEIsTUFBTSxJQUFJLE9BQU8sV0FBVyxLQUFLLENBQUMsc0JBQXNCLEdBQUc7aUNBQ3RGOzZCQUNGLENBQUM7eUJBQ0g7cUJBQ0YsQ0FBQztpQkFDSDthQUNGLENBQUM7WUFDRixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzdCLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsRUFBRTtnQkFDMUcsU0FBUyxFQUFFLEdBQUc7Z0JBQ2QsUUFBUSxFQUFFLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJO2FBQy9DLENBQUM7WUFDRixXQUFXLEVBQUU7Z0JBQ1gsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLHNCQUFzQjthQUN2RDtZQUNELFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUk7WUFDaEMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSTtZQUMxQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSTtZQUNwRCxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRTtnQkFDcEUsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGVBQWUsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUNsRixTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZO2dCQUMxQyxhQUFhLEVBQUUsMkJBQWEsQ0FBQywwQkFBMEI7YUFDeEQsQ0FBQztTQUNILENBQUMsQ0FBQztRQUNILG1CQUFtQixDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsRUFBRTtZQUN6RCxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUM7WUFDeEQsTUFBTSxFQUFFLHVCQUF1QjtZQUMvQixTQUFTLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRO1NBQ2hDLENBQUMsQ0FBQztRQUVILElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7WUFDL0MsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1lBQ2xCLFFBQVEsRUFBRSxHQUFHLENBQUMsb0JBQW9CLENBQUMsTUFBTTtZQUN6QyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsV0FBVztTQUMxQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQXhFSCw4RUF5RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXNvdXJjZURlZmF1bHROYW1pbmcsIFJlc291cmNlTmFtaW5nLCBSZXNvdXJjZU5hbWluZ1R5cGUgfSBmcm9tICdAZ2FtbWFyZXJzL2F3cy1yZXNvdXJjZS1uYW1pbmcnO1xuaW1wb3J0IHsgRHVyYXRpb24sIE5hbWVzLCBSZW1vdmFsUG9saWN5LCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0ICogYXMgc25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBTZW5kU2xhY2tNZXNzYWdlRnVuY3Rpb24gfSBmcm9tICcuL2Z1bmNzL3NlbmQtc2xhY2stbWVzc2FnZS1mdW5jdGlvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VDdXN0b21OYW1pbmcge1xuICByZWFkb25seSB0eXBlOiBSZXNvdXJjZU5hbWluZ1R5cGUuQ1VTVE9NO1xuICByZWFkb25seSBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZnVuY3Rpb25Sb2xlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSZXNvdXJjZU5hbWluZ09wdGlvbiA9IFJlc291cmNlRGVmYXVsdE5hbWluZyB8IFJlc291cmNlQ3VzdG9tTmFtaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNOU1NsYWNrTWVzc2FnZUxhbWJkYVN1YnNjcmlwdGlvblByb3BzIHtcbiAgcmVhZG9ubHkgdG9waWM6IHNucy5JVG9waWM7XG4gIHJlYWRvbmx5IHNsYWNrV2ViaG9va1NlY3JldE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVzb3VyY2VOYW1pbmdPcHRpb24/OiBSZXNvdXJjZU5hbWluZ09wdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFNOU1NsYWNrTWVzc2FnZUxhbWJkYVN1YnNjcmlwdGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTTlNTbGFja01lc3NhZ2VMYW1iZGFTdWJzY3JpcHRpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyDwn5GHIEdldCBhY2NvdW50ICYgcmVnaW9uXG4gICAgY29uc3QgYWNjb3VudCA9IFN0YWNrLm9mKHNjb3BlKS5hY2NvdW50O1xuICAgIGNvbnN0IHJlZ2lvbiA9IFN0YWNrLm9mKHNjb3BlKS5yZWdpb247XG5cbiAgICAvLyDwn5GHIENyZWF0ZSByYW5kb20gOCBsZW5ndGggc3RyaW5nXG4gICAgY29uc3QgcmFuZG9tID0gUmVzb3VyY2VOYW1pbmcuY3JlYXRlUmFuZG9tU3RyaW5nKGAke05hbWVzLnVuaXF1ZUlkKHNjb3BlKX0uJHtOYW1lcy51bmlxdWVJZCh0aGlzKX1gKTtcbiAgICBjb25zdCBhdXRvTmFtaW5nID0ge1xuICAgICAgZnVuY3Rpb25OYW1lOiBgc2VuZC1zbGFjay1tZXNzYWdlLSR7cmFuZG9tfS1mdW5jYCxcbiAgICAgIGZ1bmN0aW9uUm9sZU5hbWU6IGBzZW5kLXNsYWNrLW1lc3NhZ2UtbGFtYmRhLWZ1bmMtZXhlYy0ke3JhbmRvbX0tcm9sZWAsXG4gICAgfTtcbiAgICBjb25zdCBuYW1lcyA9IFJlc291cmNlTmFtaW5nLm5hbWluZyhhdXRvTmFtaW5nLCBwcm9wcy5yZXNvdXJjZU5hbWluZ09wdGlvbiBhcyBSZXNvdXJjZU5hbWluZy5SZXNvdXJjZU5hbWluZ09wdGlvbik7XG5cbiAgICAvLyBMYW1iZGEgZnVuY3Rpb25cbiAgICBjb25zdCBzZW5kTWVzc2FnZUZ1bmN0aW9uID0gbmV3IFNlbmRTbGFja01lc3NhZ2VGdW5jdGlvbih0aGlzLCAnU2VuZFNsYWNrTWVzc2FnZUZ1bmN0aW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBuYW1lcy5mdW5jdGlvbk5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NlbmQgU2xhY2sgbWVzc2FnZSBmdW5jdGlvbicsXG4gICAgICBhcmNoaXRlY3R1cmU6IGxhbWJkYS5BcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgcm9sZTogbmV3IGlhbS5Sb2xlKHRoaXMsICdMYW1iZGFFeGVjdXRpb25Sb2xlJywge1xuICAgICAgICByb2xlTmFtZTogbmFtZXMuZnVuY3Rpb25Sb2xlTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgbWFuYWdlZFBvbGljaWVzOiBbXG4gICAgICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlJyksXG4gICAgICAgIF0sXG4gICAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgICAgJ2dldC1zZWNyZXQtcG9saWN5JzogbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgJ3NlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgICAgYGFybjphd3M6c2VjcmV0c21hbmFnZXI6JHtyZWdpb259OiR7YWNjb3VudH06c2VjcmV0OiR7cHJvcHMuc2xhY2tXZWJob29rU2VjcmV0TmFtZX0qYCxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgcGFyYW1zQW5kU2VjcmV0czogbGFtYmRhLlBhcmFtc0FuZFNlY3JldHNMYXllclZlcnNpb24uZnJvbVZlcnNpb24obGFtYmRhLlBhcmFtc0FuZFNlY3JldHNWZXJzaW9ucy5WMV8wXzEwMywge1xuICAgICAgICBjYWNoZVNpemU6IDUwMCxcbiAgICAgICAgbG9nTGV2ZWw6IGxhbWJkYS5QYXJhbXNBbmRTZWNyZXRzTG9nTGV2ZWwuSU5GTyxcbiAgICAgIH0pLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgU0xBQ0tfV0VCT09LX1NFQ1JFVF9OQU1FOiBwcm9wcy5zbGFja1dlYmhvb2tTZWNyZXROYW1lLFxuICAgICAgfSxcbiAgICAgIGxvZ0Zvcm1hdDogbGFtYmRhLkxvZ0Zvcm1hdC5KU09OLFxuICAgICAgc3lzdGVtTG9nTGV2ZWw6IGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5JTkZPLFxuICAgICAgYXBwbGljYXRpb25Mb2dMZXZlbDogbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWwuSU5GTyxcbiAgICAgIGxvZ0dyb3VwOiBuZXcgbG9ncy5Mb2dHcm91cCh0aGlzLCAnU2VuZFNsYWNrTWVzc2FnZUZ1bmN0aW9uTG9nR3JvdXAnLCB7XG4gICAgICAgIGxvZ0dyb3VwTmFtZTogbmFtZXMuZnVuY3Rpb25OYW1lID8gYC9hd3MvbGFtYmRhLyR7bmFtZXMuZnVuY3Rpb25OYW1lfWAgOiB1bmRlZmluZWQsXG4gICAgICAgIHJldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLlRIUkVFX01PTlRIUyxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU5fT05fVVBEQVRFX09SX0RFTEVURSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIHNlbmRNZXNzYWdlRnVuY3Rpb24uYWRkUGVybWlzc2lvbignSW52b2tlRnVuY3Rpb25Gcm9tU05TJywge1xuICAgICAgcHJpbmNpcGFsOiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ3Nucy5hbWF6b25hd3MuY29tJyksXG4gICAgICBhY3Rpb246ICdsYW1iZGE6SW52b2tlRnVuY3Rpb24nLFxuICAgICAgc291cmNlQXJuOiBwcm9wcy50b3BpYy50b3BpY0FybixcbiAgICB9KTtcblxuICAgIG5ldyBzbnMuU3Vic2NyaXB0aW9uKHRoaXMsICdMYW1iZGFTdWJzY3JpcHRpb24nLCB7XG4gICAgICB0b3BpYzogcHJvcHMudG9waWMsXG4gICAgICBwcm90b2NvbDogc25zLlN1YnNjcmlwdGlvblByb3RvY29sLkxBTUJEQSxcbiAgICAgIGVuZHBvaW50OiBzZW5kTWVzc2FnZUZ1bmN0aW9uLmZ1bmN0aW9uQXJuLFxuICAgIH0pO1xuICB9XG59XG4iXX0=