UNPKG

cdkdx

Version:

Zero-config CLI for aws cdk development

143 lines 14.6 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TestCommand = void 0; const clipanion_1 = require("clipanion"); const jest = __importStar(require("jest")); const presets_1 = __importDefault(require("ts-jest/presets")); const base_command_1 = require("../base-command"); const ts_config_1 = require("../ts-config"); class TestCommand extends base_command_1.BaseProjectCommand { async execute() { process.env.NODE_ENV = 'test'; process.env.LAMBDAS = this.projectInfo.lambdasSrcPath; const argv = []; const projects = []; if (this.projectInfo.workspaces) { const infos = await this.projectInfo.getWorkspaceProjectInfos(); // TODO Remove isolatedModules? See https://github.com/kulshekhar/ts-jest/issues/1967 if (infos) { for (const info of infos) { projects.push(this.createCdkProjectConfig(info, true)); if (await info.hasLambdaSrc()) { projects.push(this.createLambdaProjectConfig(info, true)); } } } } else { projects.push(this.createCdkProjectConfig(this.projectInfo)); if (await this.projectInfo.hasLambdaSrc()) { projects.push(this.createLambdaProjectConfig(this.projectInfo)); } } const jestConfig = { collectCoverageFrom: ['src/**/*.ts', '!src/**/*.(spec|test).ts'], watchPlugins: [ require.resolve('jest-watch-typeahead/filename'), require.resolve('jest-watch-typeahead/testname'), require.resolve('jest-watch-select-projects'), ], projects, }; argv.push('--config', JSON.stringify(jestConfig)); argv.push(...this.jestArgv); await jest.run(argv); return 0; } createCdkProjectConfig(info, isolatedModules = false) { return { displayName: { name: `${info.name} [cdk]`, color: 'white' }, rootDir: info.root, transform: { ...presets_1.default.defaults.transform, '.+\\.(css|html)$': require.resolve('jest-transform-stub'), }, moduleFileExtensions: ['ts', 'js', 'json', 'html'], testMatch: [`/**/*.(spec|test).ts`], testPathIgnorePatterns: [info.lambdasSrcPath], testEnvironment: 'node', globals: { 'ts-jest': { tsconfig: ts_config_1.TsConfig.fromJsiiTemplate().getCompilerOptions(), isolatedModules, }, }, }; } createLambdaProjectConfig(info, isolatedModules = false) { return { displayName: { name: `${info.name} [lambda]`, color: 'white' }, rootDir: info.lambdasSrcPath, transform: { ...presets_1.default.defaults.transform, '.+\\.(css|html)$': require.resolve('jest-transform-stub'), }, moduleFileExtensions: ['ts', 'js', 'json', 'html'], testMatch: [`/**/*.(spec|test).ts`], testEnvironment: 'node', globals: { 'ts-jest': { tsconfig: ts_config_1.TsConfig.fromLambdaTemplate().getCompilerOptions(), isolatedModules, }, }, }; } } TestCommand.usage = clipanion_1.Command.Usage({ description: 'Run jest test runner', details: ` All flags are passed through directly to jest. `, examples: [ ['Run jest', 'cdkdx test'], ['Run jest in watch mode', 'cdkdx test --watch'], ], }); __decorate([ clipanion_1.Command.Proxy(), __metadata("design:type", Array) ], TestCommand.prototype, "jestArgv", void 0); __decorate([ clipanion_1.Command.Path('test'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Promise) ], TestCommand.prototype, "execute", null); exports.TestCommand = TestCommand; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jb21tYW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3Rlc3QtY29tbWFuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlDQUFvQztBQUNwQywyQ0FBNkI7QUFDN0IsOERBQXdDO0FBRXhDLGtEQUFxRDtBQUVyRCw0Q0FBd0M7QUFDeEMsTUFBYSxXQUFZLFNBQVEsaUNBQWtCO0lBZ0JqRCxLQUFLLENBQUMsT0FBTztRQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQztRQUV0RCxNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7UUFFMUIsTUFBTSxRQUFRLEdBQThCLEVBQUUsQ0FBQztRQUUvQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFO1lBQy9CLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBRWhFLHFGQUFxRjtZQUNyRixJQUFJLEtBQUssRUFBRTtnQkFDVCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtvQkFDeEIsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBRXZELElBQUksTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUU7d0JBQzdCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO3FCQUMzRDtpQkFDRjthQUNGO1NBQ0Y7YUFBTTtZQUNMLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBRTdELElBQUksTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxFQUFFO2dCQUN6QyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQzthQUNqRTtTQUNGO1FBRUQsTUFBTSxVQUFVLEdBQUc7WUFDakIsbUJBQW1CLEVBQUUsQ0FBQyxhQUFhLEVBQUUsMEJBQTBCLENBQUM7WUFDaEUsWUFBWSxFQUFFO2dCQUNaLE9BQU8sQ0FBQyxPQUFPLENBQUMsK0JBQStCLENBQUM7Z0JBQ2hELE9BQU8sQ0FBQyxPQUFPLENBQUMsK0JBQStCLENBQUM7Z0JBQ2hELE9BQU8sQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUM7YUFDOUM7WUFDRCxRQUFRO1NBQ1QsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyQixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxJQUFpQixFQUFFLGVBQWUsR0FBRyxLQUFLO1FBQ3ZFLE9BQU87WUFDTCxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtZQUMzRCxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDbEIsU0FBUyxFQUFFO2dCQUNULEdBQUcsaUJBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUztnQkFDL0Isa0JBQWtCLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQzthQUMzRDtZQUNELG9CQUFvQixFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO1lBQ2xELFNBQVMsRUFBRSxDQUFDLHNCQUFzQixDQUFDO1lBQ25DLHNCQUFzQixFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUM3QyxlQUFlLEVBQUUsTUFBTTtZQUN2QixPQUFPLEVBQUU7Z0JBQ1AsU0FBUyxFQUFFO29CQUNULFFBQVEsRUFBRSxvQkFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUMsa0JBQWtCLEVBQUU7b0JBQzFELGVBQWU7aUJBQ2hCO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLHlCQUF5QixDQUMvQixJQUFpQixFQUNqQixlQUFlLEdBQUcsS0FBSztRQUV2QixPQUFPO1lBQ0wsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksV0FBVyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7WUFDOUQsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQzVCLFNBQVMsRUFBRTtnQkFDVCxHQUFHLGlCQUFTLENBQUMsUUFBUSxDQUFDLFNBQVM7Z0JBQy9CLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUM7YUFDM0Q7WUFDRCxvQkFBb0IsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztZQUNsRCxTQUFTLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztZQUNuQyxlQUFlLEVBQUUsTUFBTTtZQUN2QixPQUFPLEVBQUU7Z0JBQ1AsU0FBUyxFQUFFO29CQUNULFFBQVEsRUFBRSxvQkFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUMsa0JBQWtCLEVBQUU7b0JBQzVELGVBQWU7aUJBQ2hCO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzs7QUF6R00saUJBQUssR0FBRyxtQkFBTyxDQUFDLEtBQUssQ0FBQztJQUMzQixXQUFXLEVBQUUsc0JBQXNCO0lBQ25DLE9BQU8sRUFBRTs7U0FFSjtJQUNMLFFBQVEsRUFBRTtRQUNSLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQztRQUMxQixDQUFDLHdCQUF3QixFQUFFLG9CQUFvQixDQUFDO0tBQ2pEO0NBQ0YsQ0FBQyxDQUFDO0FBR0g7SUFEQyxtQkFBTyxDQUFDLEtBQUssRUFBRTs7NkNBQ1c7QUFHM0I7SUFEQyxtQkFBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7MENBK0NwQjtBQTlESCxrQ0EyR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY2xpcGFuaW9uJztcbmltcG9ydCAqIGFzIGplc3QgZnJvbSAnamVzdCc7XG5pbXBvcnQgdHNqUHJlc2V0IGZyb20gJ3RzLWplc3QvcHJlc2V0cyc7XG5cbmltcG9ydCB7IEJhc2VQcm9qZWN0Q29tbWFuZCB9IGZyb20gJy4uL2Jhc2UtY29tbWFuZCc7XG5pbXBvcnQgeyBQcm9qZWN0SW5mbyB9IGZyb20gJy4uL3Byb2plY3QtaW5mbyc7XG5pbXBvcnQgeyBUc0NvbmZpZyB9IGZyb20gJy4uL3RzLWNvbmZpZyc7XG5leHBvcnQgY2xhc3MgVGVzdENvbW1hbmQgZXh0ZW5kcyBCYXNlUHJvamVjdENvbW1hbmQge1xuICBzdGF0aWMgdXNhZ2UgPSBDb21tYW5kLlVzYWdlKHtcbiAgICBkZXNjcmlwdGlvbjogJ1J1biBqZXN0IHRlc3QgcnVubmVyJyxcbiAgICBkZXRhaWxzOiBgXG4gICAgICAgICAgICBBbGwgZmxhZ3MgYXJlIHBhc3NlZCB0aHJvdWdoIGRpcmVjdGx5IHRvIGplc3QuXG4gICAgICAgIGAsXG4gICAgZXhhbXBsZXM6IFtcbiAgICAgIFsnUnVuIGplc3QnLCAnY2RrZHggdGVzdCddLFxuICAgICAgWydSdW4gamVzdCBpbiB3YXRjaCBtb2RlJywgJ2Nka2R4IHRlc3QgLS13YXRjaCddLFxuICAgIF0sXG4gIH0pO1xuXG4gIEBDb21tYW5kLlByb3h5KClcbiAgcHVibGljIGplc3RBcmd2ITogc3RyaW5nW107XG5cbiAgQENvbW1hbmQuUGF0aCgndGVzdCcpXG4gIGFzeW5jIGV4ZWN1dGUoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9ICd0ZXN0JztcbiAgICBwcm9jZXNzLmVudi5MQU1CREFTID0gdGhpcy5wcm9qZWN0SW5mby5sYW1iZGFzU3JjUGF0aDtcblxuICAgIGNvbnN0IGFyZ3Y6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCBwcm9qZWN0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXG4gICAgaWYgKHRoaXMucHJvamVjdEluZm8ud29ya3NwYWNlcykge1xuICAgICAgY29uc3QgaW5mb3MgPSBhd2FpdCB0aGlzLnByb2plY3RJbmZvLmdldFdvcmtzcGFjZVByb2plY3RJbmZvcygpO1xuXG4gICAgICAvLyBUT0RPIFJlbW92ZSBpc29sYXRlZE1vZHVsZXM/IFNlZSBodHRwczovL2dpdGh1Yi5jb20va3Vsc2hla2hhci90cy1qZXN0L2lzc3Vlcy8xOTY3XG4gICAgICBpZiAoaW5mb3MpIHtcbiAgICAgICAgZm9yIChjb25zdCBpbmZvIG9mIGluZm9zKSB7XG4gICAgICAgICAgcHJvamVjdHMucHVzaCh0aGlzLmNyZWF0ZUNka1Byb2plY3RDb25maWcoaW5mbywgdHJ1ZSkpO1xuXG4gICAgICAgICAgaWYgKGF3YWl0IGluZm8uaGFzTGFtYmRhU3JjKCkpIHtcbiAgICAgICAgICAgIHByb2plY3RzLnB1c2godGhpcy5jcmVhdGVMYW1iZGFQcm9qZWN0Q29uZmlnKGluZm8sIHRydWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvamVjdHMucHVzaCh0aGlzLmNyZWF0ZUNka1Byb2plY3RDb25maWcodGhpcy5wcm9qZWN0SW5mbykpO1xuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5wcm9qZWN0SW5mby5oYXNMYW1iZGFTcmMoKSkge1xuICAgICAgICBwcm9qZWN0cy5wdXNoKHRoaXMuY3JlYXRlTGFtYmRhUHJvamVjdENvbmZpZyh0aGlzLnByb2plY3RJbmZvKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgamVzdENvbmZpZyA9IHtcbiAgICAgIGNvbGxlY3RDb3ZlcmFnZUZyb206IFsnc3JjLyoqLyoudHMnLCAnIXNyYy8qKi8qLihzcGVjfHRlc3QpLnRzJ10sXG4gICAgICB3YXRjaFBsdWdpbnM6IFtcbiAgICAgICAgcmVxdWlyZS5yZXNvbHZlKCdqZXN0LXdhdGNoLXR5cGVhaGVhZC9maWxlbmFtZScpLFxuICAgICAgICByZXF1aXJlLnJlc29sdmUoJ2plc3Qtd2F0Y2gtdHlwZWFoZWFkL3Rlc3RuYW1lJyksXG4gICAgICAgIHJlcXVpcmUucmVzb2x2ZSgnamVzdC13YXRjaC1zZWxlY3QtcHJvamVjdHMnKSxcbiAgICAgIF0sXG4gICAgICBwcm9qZWN0cyxcbiAgICB9O1xuXG4gICAgYXJndi5wdXNoKCctLWNvbmZpZycsIEpTT04uc3RyaW5naWZ5KGplc3RDb25maWcpKTtcblxuICAgIGFyZ3YucHVzaCguLi50aGlzLmplc3RBcmd2KTtcblxuICAgIGF3YWl0IGplc3QucnVuKGFyZ3YpO1xuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNka1Byb2plY3RDb25maWcoaW5mbzogUHJvamVjdEluZm8sIGlzb2xhdGVkTW9kdWxlcyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlOYW1lOiB7IG5hbWU6IGAke2luZm8ubmFtZX0gW2Nka11gLCBjb2xvcjogJ3doaXRlJyB9LFxuICAgICAgcm9vdERpcjogaW5mby5yb290LFxuICAgICAgdHJhbnNmb3JtOiB7XG4gICAgICAgIC4uLnRzalByZXNldC5kZWZhdWx0cy50cmFuc2Zvcm0sXG4gICAgICAgICcuK1xcXFwuKGNzc3xodG1sKSQnOiByZXF1aXJlLnJlc29sdmUoJ2plc3QtdHJhbnNmb3JtLXN0dWInKSxcbiAgICAgIH0sXG4gICAgICBtb2R1bGVGaWxlRXh0ZW5zaW9uczogWyd0cycsICdqcycsICdqc29uJywgJ2h0bWwnXSxcbiAgICAgIHRlc3RNYXRjaDogW2AvKiovKi4oc3BlY3x0ZXN0KS50c2BdLFxuICAgICAgdGVzdFBhdGhJZ25vcmVQYXR0ZXJuczogW2luZm8ubGFtYmRhc1NyY1BhdGhdLFxuICAgICAgdGVzdEVudmlyb25tZW50OiAnbm9kZScsXG4gICAgICBnbG9iYWxzOiB7XG4gICAgICAgICd0cy1qZXN0Jzoge1xuICAgICAgICAgIHRzY29uZmlnOiBUc0NvbmZpZy5mcm9tSnNpaVRlbXBsYXRlKCkuZ2V0Q29tcGlsZXJPcHRpb25zKCksXG4gICAgICAgICAgaXNvbGF0ZWRNb2R1bGVzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMYW1iZGFQcm9qZWN0Q29uZmlnKFxuICAgIGluZm86IFByb2plY3RJbmZvLFxuICAgIGlzb2xhdGVkTW9kdWxlcyA9IGZhbHNlLFxuICApIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheU5hbWU6IHsgbmFtZTogYCR7aW5mby5uYW1lfSBbbGFtYmRhXWAsIGNvbG9yOiAnd2hpdGUnIH0sXG4gICAgICByb290RGlyOiBpbmZvLmxhbWJkYXNTcmNQYXRoLFxuICAgICAgdHJhbnNmb3JtOiB7XG4gICAgICAgIC4uLnRzalByZXNldC5kZWZhdWx0cy50cmFuc2Zvcm0sXG4gICAgICAgICcuK1xcXFwuKGNzc3xodG1sKSQnOiByZXF1aXJlLnJlc29sdmUoJ2plc3QtdHJhbnNmb3JtLXN0dWInKSxcbiAgICAgIH0sXG4gICAgICBtb2R1bGVGaWxlRXh0ZW5zaW9uczogWyd0cycsICdqcycsICdqc29uJywgJ2h0bWwnXSxcbiAgICAgIHRlc3RNYXRjaDogW2AvKiovKi4oc3BlY3x0ZXN0KS50c2BdLFxuICAgICAgdGVzdEVudmlyb25tZW50OiAnbm9kZScsXG4gICAgICBnbG9iYWxzOiB7XG4gICAgICAgICd0cy1qZXN0Jzoge1xuICAgICAgICAgIHRzY29uZmlnOiBUc0NvbmZpZy5mcm9tTGFtYmRhVGVtcGxhdGUoKS5nZXRDb21waWxlck9wdGlvbnMoKSxcbiAgICAgICAgICBpc29sYXRlZE1vZHVsZXMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==