UNPKG

@amazon-codecatalyst/blueprints.sam-serverless-application

Version:

This blueprint creates a project that leverages a serverless application model (SAM) to quickly create and deploy an API. You can choose Java, TypeScript, or Python as the programming language

616 lines 86.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.runtimeMappings = void 0; const path_1 = __importDefault(require("path")); const blueprint_component_source_repositories_1 = require("@amazon-codecatalyst/blueprint-component.source-repositories"); const blueprint_component_workflows_1 = require("@amazon-codecatalyst/blueprint-component.workflows"); const templateContents_1 = require("./templateContents"); exports.runtimeMappings = { 'Java 11 Maven': { runtime: 'java11', codeUri: 'HelloWorldFunction', srcCodePath: 'HelloWorldFunction/src/main', testPath: 'HelloWorldFunction/src/test', handler: 'helloworld.App::handleRequest', templateProps: templateContents_1.java11, cacheDir: 'java11maven', gitSrcPath: 'hello-maven', dependenciesFilePath: 'pom.xml', installInstructions: 'Install [Python 3](https://www.python.org/downloads/)\n * Install [Java 11](https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html) and [Maven](https://maven.apache.org/download.cgi)', stepsToRunUnitTests: ['. ./.codecatalyst/scripts/run-tests.sh'], filesToCreate: [ { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.codecatalyst', 'scripts', 'run-tests.sh'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('maven/run-tests.sh').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'run_tests.xml'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('maven/.idea/runConfigurations/run_tests.xml').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'sam_build.xml'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('maven/.idea/runConfigurations/sam_build.xml').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'sam_local_invoke.xml'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('maven/.idea/runConfigurations/sam_local_invoke.xml').subsitite({ lambdaFunctionName: context.lambdaFunctionName, }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'sam_start_local_api.xml'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('maven/.idea/runConfigurations/sam_start_local_api.xml').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'externalDependencies.xml'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('maven/.idea/externalDependencies.xml').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.vscode', 'launch.json'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('maven/.vscode/launch.json').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.vscode', 'tasks.json'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('maven/.vscode/tasks.json').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.vscode', 'extensions.json'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('maven/.vscode/extensions.json').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.cloud9', 'runners', 'SAM Project Builder.run'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('maven/.cloud9/runners/SAM Project Builder.run').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.cloud9', 'runners', 'SAM Project Test Runner.run'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('maven/.cloud9/runners/SAM Project Test Runner.run').toString(); }, }, ], filesToOverride: [ { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, 'HelloWorldFunction', 'pom.xml'); }, // @ts-ignore resolveContent(context) { return new blueprint_component_source_repositories_1.StaticAsset('maven/pom.xml').toString(); }, }, ], filesToChangePermissionsFor: [], computeOptions: { Type: blueprint_component_workflows_1.ComputeType.LAMBDA, Fleet: blueprint_component_workflows_1.ComputeFleet.LINUX_X86_64_LARGE, }, devEnvironmentPostStartEvents: [ { eventName: 'bootstrap-and-build', command: '. ./.codecatalyst/scripts/run-tests.sh && sam build --template-file template.yaml', }, //TODO: uncomment and separate onmi command once dev environments supports multiple postStart events // { // eventName: 'sam-build', // command: 'sam build --template-file template.yaml', // }, ], }, 'Java 11 Gradle': { runtime: 'java11', codeUri: 'HelloWorldFunction', srcCodePath: 'HelloWorldFunction/src/main', testPath: 'HelloWorldFunction/src/test', handler: 'helloworld.App::handleRequest', templateProps: templateContents_1.java11, cacheDir: 'java11gradle', gitSrcPath: 'hello-gradle', dependenciesFilePath: 'build.gradle', installInstructions: 'Install [Python 3](https://www.python.org/downloads/)\n * Install [Java 11](https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html) and [Gradle](https://gradle.org/install/)', stepsToRunUnitTests: ['. ./.codecatalyst/scripts/run-tests.sh'], filesToCreate: [ { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.codecatalyst', 'scripts', 'run-tests.sh'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('gradle/run-tests.sh').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'run_tests.xml'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('gradle/.idea/runConfigurations/run_tests.xml').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'sam_build.xml'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('gradle/.idea/runConfigurations/sam_build.xml').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'sam_local_invoke.xml'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('gradle/.idea/runConfigurations/sam_local_invoke.xml').subsitite({ lambdaFunctionName: context.lambdaFunctionName, }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'sam_start_local_api.xml'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('gradle/.idea/runConfigurations/sam_start_local_api.xml').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'externalDependencies.xml'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('gradle/.idea/externalDependencies.xml').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.vscode', 'launch.json'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('gradle/.vscode/launch.json').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.vscode', 'tasks.json'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('gradle/.vscode/tasks.json').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.vscode', 'extensions.json'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('gradle/.vscode/extensions.json').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.cloud9', 'runners', 'SAM Project Builder.run'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('gradle/.cloud9/runners/SAM Project Builder.run').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.cloud9', 'runners', 'SAM Project Test Runner.run'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('gradle/.cloud9/runners/SAM Project Test Runner.run').toString(); }, }, ], filesToOverride: [ { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, 'HelloWorldFunction', 'build.gradle'); }, // @ts-ignore resolveContent(context) { return new blueprint_component_source_repositories_1.StaticAsset('gradle/build.gradle').toString(); }, }, ], filesToChangePermissionsFor: [ { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, context.lambdaFunctionName, 'HelloWorldFunction', 'gradlew'); }, newPermissions: { executable: true }, }, ], computeOptions: { Type: blueprint_component_workflows_1.ComputeType.LAMBDA, Fleet: blueprint_component_workflows_1.ComputeFleet.LINUX_X86_64_LARGE, }, devEnvironmentPostStartEvents: [ { eventName: 'bootstrap-and-build', command: '. ./.codecatalyst/scripts/run-tests.sh && sam build --template-file template.yaml', }, //TODO: uncomment and separate onmi command once dev environments supports multiple postStart events // { // eventName: 'sam-build', // command: 'sam build --template-file template.yaml', // }, ], }, 'Node.js 14': { runtime: 'nodejs14.x', codeUri: 'hello-world/', srcCodePath: 'hello-world', testPath: 'hello-world/tests', handler: 'app.lambdaHandler', templateProps: templateContents_1.nodejs14, templateMetadata: ` Metadata: # Manage esbuild properties BuildMethod: esbuild BuildProperties: Minify: true Target: "es2020" # Sourcemap: true # Enabling source maps will create the required NODE_OPTIONS environment variables on your lambda function during sam build EntryPoints: - app.ts `, cacheDir: 'nodejs14', gitSrcPath: 'hello-ts', dependenciesFilePath: 'package.json', installInstructions: 'Install [Python 3](https://www.python.org/downloads/)\n * Install [Node.js 14 and npm](https://nodejs.org/en/download/releases/)', stepsToRunUnitTests: ['. ./.codecatalyst/scripts/run-tests.sh'], filesToCreate: [ { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.codecatalyst', 'scripts', 'run-tests.sh'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('nodejs/run-tests.sh').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'all_tests_coverage.xml'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('nodejs/.idea/runConfigurations/all_tests_coverage.xml').subsitite({ lambdaFunctionName: context.lambdaFunctionName, }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'sam_build.xml'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('nodejs/.idea/runConfigurations/sam_build.xml').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'sam_local_invoke.xml'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('nodejs/.idea/runConfigurations/sam_local_invoke.xml').subsitite({ lambdaFunctionName: context.lambdaFunctionName, }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'sam_start_local_api.xml'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('nodejs/.idea/runConfigurations/sam_start_local_api.xml').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'externalDependencies.xml'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('nodejs/.idea/externalDependencies.xml').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.vscode', 'launch.json'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('nodejs/.vscode/launch.json').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.vscode', 'tasks.json'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('nodejs/.vscode/tasks.json').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.vscode', 'extensions.json'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('nodejs/.vscode/extensions.json').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.cloud9', 'runners', 'SAM Project Builder.run'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('nodejs/.cloud9/runners/SAM Project Builder.run').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.cloud9', 'runners', 'SAM Project Test Runner.run'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('nodejs/.cloud9/runners/SAM Project Test Runner.run').toString(); }, }, ], filesToOverride: [ { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, 'hello-world', 'package.json'); }, // @ts-ignore resolveContent(context) { return new blueprint_component_source_repositories_1.StaticAsset('nodejs/package.json').toString(); }, }, ], filesToChangePermissionsFor: [], autoDiscoveryOverride: { ReportNamePrefix: 'AutoDiscovered', IncludePaths: ['**/*'], ExcludePaths: ['.aws-sam/**/*'], Enabled: true, SuccessCriteria: { PassRate: 100, LineCoverage: 65, BranchCoverage: 50, }, }, computeOptions: { Type: blueprint_component_workflows_1.ComputeType.LAMBDA, Fleet: blueprint_component_workflows_1.ComputeFleet.LINUX_X86_64_LARGE, }, devEnvironmentPostStartEvents: [ { eventName: 'bootstrap-and-build', command: '. ./.codecatalyst/scripts/run-tests.sh && sam build --template-file template.yaml', }, //TODO: uncomment and separate onmi command once dev environments supports multiple postStart events // { // eventName: 'sam-build', // command: 'sam build --template-file template.yaml', // }, ], }, 'Python 3.9': { runtime: 'python3.9', codeUri: 'hello_world/', srcCodePath: 'hello_world', testPath: 'tests', handler: 'app.lambda_handler', templateProps: templateContents_1.python39, cacheDir: 'python39', gitSrcPath: 'hello', dependenciesFilePath: 'requirements.txt', installInstructions: 'Install [Python3.9](https://www.python.org/downloads/)', stepsToRunUnitTests: ['. ./.codecatalyst/scripts/bootstrap.sh', '. ./.codecatalyst/scripts/run-tests.sh'], filesToCreate: [ { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.codecatalyst', 'scripts', 'bootstrap.sh'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('python/bootstrap.sh').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.codecatalyst', 'scripts', 'run-tests.sh'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('python/run-tests.sh').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.coveragerc'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('python/.coveragerc').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'application_integration_tests.xml'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('python/.idea/runConfigurations/application_integration_tests.xml').subsitite({ lambdaFunctionName: context.lambdaFunctionName, }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'application_unit_tests.xml'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('python/.idea/runConfigurations/application_unit_tests.xml').subsitite({ lambdaFunctionName: context.lambdaFunctionName, }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'sam_build.xml'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('python/.idea/runConfigurations/sam_build.xml').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'sam_local_invoke.xml'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('python/.idea/runConfigurations/sam_local_invoke.xml').subsitite({ lambdaFunctionName: context.lambdaFunctionName, }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'runConfigurations', 'sam_start_local_api.xml'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('python/.idea/runConfigurations/sam_start_local_api.xml').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.idea', 'externalDependencies.xml'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('python/.idea/externalDependencies.xml').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.vscode', 'launch.json'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('python/.vscode/launch.json').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.vscode', 'tasks.json'); }, resolveContent(context) { return new blueprint_component_source_repositories_1.SubstitionAsset('python/.vscode/tasks.json').subsitite({ lambdaFunctionName: context.lambdaFunctionName }); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.vscode', 'extensions.json'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('python/.vscode/extensions.json').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.vscode', 'settings.json'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('python/.vscode/settings.json').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.cloud9', 'runners', 'SAM Project Builder.run'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('python/.cloud9/runners/SAM Project Builder.run').toString(); }, }, { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, '.cloud9', 'runners', 'SAM Project Test Runner.run'); }, resolveContent() { return new blueprint_component_source_repositories_1.StaticAsset('python/.cloud9/runners/SAM Project Test Runner.run').toString(); }, }, ], filesToOverride: [ { resolvePath(context) { return path_1.default.join(context.repositoryRelativePath, 'tests/requirements.txt'); }, // @ts-ignore resolveContent(context) { return new blueprint_component_source_repositories_1.StaticAsset('python/requirements-dev.txt').toString(); }, }, ], filesToChangePermissionsFor: [], samBuildImage: 'public.ecr.aws/sam/build-python3.9:$(sam --version | sed "s/.* //")', computeOptions: { Type: blueprint_component_workflows_1.ComputeType.EC2, Fleet: blueprint_component_workflows_1.ComputeFleet.LINUX_X86_64_LARGE, }, devEnvironmentPostStartEvents: [ { eventName: 'bootstrap-and-build', command: '. ./.codecatalyst/scripts/bootstrap.sh && . ./.codecatalyst/scripts/run-tests.sh && sam build --template-file template.yaml --use-container --build-image public.ecr.aws/sam/build-python3.9:$(sam --version | sed "s/.* //")', }, //TODO: uncomment and separate onmi command once dev environments supports multiple postStart events // { // eventName: 'bootstrap', // command: '. ./.codecatalyst/scripts/bootstrap.sh', // }, // { // eventName: 'run-tests', // command: '. ./.codecatalyst/scripts/run-tests.sh', // }, // { // eventName: 'sam-build', // command: 'sam build --template-file template.yaml --use-container --build-image public.ecr.aws/sam/build-python3.9:$(sam --version | sed "s/.* //")', // }, ], }, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZU1hcHBpbmdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3J1bnRpbWVNYXBwaW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxnREFBd0I7QUFDeEIsMEhBQTRHO0FBQzVHLHNHQUErRjtBQUcvRix5REFBZ0U7QUFXbkQsUUFBQSxlQUFlLEdBQWU7SUFDekMsZUFBZSxFQUFFO1FBQ2YsT0FBTyxFQUFFLFFBQVE7UUFDakIsT0FBTyxFQUFFLG9CQUFvQjtRQUM3QixXQUFXLEVBQUUsNkJBQTZCO1FBQzFDLFFBQVEsRUFBRSw2QkFBNkI7UUFDdkMsT0FBTyxFQUFFLCtCQUErQjtRQUN4QyxhQUFhLEVBQUUseUJBQU07UUFDckIsUUFBUSxFQUFFLGFBQWE7UUFDdkIsVUFBVSxFQUFFLGFBQWE7UUFDekIsb0JBQW9CLEVBQUUsU0FBUztRQUMvQixtQkFBbUIsRUFDakIsZ05BQWdOO1FBQ2xOLG1CQUFtQixFQUFFLENBQUMsd0NBQXdDLENBQUM7UUFDL0QsYUFBYSxFQUFFO1lBQ2I7Z0JBQ0UsV0FBVyxDQUFDLE9BQTRCO29CQUN0QyxPQUFPLGNBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQy9GLENBQUM7Z0JBQ0QsY0FBYyxDQUFDLE9BQTRCO29CQUN6QyxPQUFPLElBQUkseURBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7Z0JBQ2pILENBQUM7YUFDRjtZQUNEO2dCQUNFLFdBQVcsQ0FBQyxPQUE0QjtvQkFDdEMsT0FBTyxjQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQ2xHLENBQUM7Z0JBQ0QsY0FB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