UNPKG

@selfage/generator_cli

Version:

Code generation for message, service, and database.

128 lines 20 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TsContentBuilder = exports.SimpleContentBuilder = void 0; const path = require("path"); const io_helper_1 = require("./io_helper"); const util_1 = require("./util"); // Holds arbitrary generated content. class SimpleContentBuilder { static get(contentMap, suffix, outputModulePath) { outputModulePath = (0, util_1.normalizeRelativePathForNode)(outputModulePath); let outputContentBuilder = contentMap.get(outputModulePath); if (!outputContentBuilder) { outputContentBuilder = new SimpleContentBuilder(outputModulePath, suffix); contentMap.set(outputModulePath, outputContentBuilder); } return outputContentBuilder; } constructor(outputModulePath, suffix) { this.outputModulePath = outputModulePath; this.suffix = suffix; this.contentList = new Array(); } push(...newContent) { this.contentList.push(...newContent); } build() { return this.contentList.join(""); } writeSync(dryRun) { (0, io_helper_1.writeFileSync)(this.outputModulePath + this.suffix, this.build(), dryRun); } } exports.SimpleContentBuilder = SimpleContentBuilder; // Holds generated TypeScript code content. class TsContentBuilder { static get(contentMap, definitionModulePath, outputModulePath) { outputModulePath = (0, util_1.normalizeRelativePathForNode)(outputModulePath ?? definitionModulePath); let outputContentBuilder = contentMap.get(outputModulePath); if (!outputContentBuilder) { outputContentBuilder = new TsContentBuilder(definitionModulePath, outputModulePath); contentMap.set(outputModulePath, outputContentBuilder); } return outputContentBuilder; } constructor(baseDefinitionModulePath, outputModulePath) { this.baseDefinitionModulePath = baseDefinitionModulePath; this.outputModulePath = outputModulePath; this.pathToNamedImports = new Map(); this.namedImportToPaths = new Map(); this.contentList = new Array(); this.outputModuleDirPath = path.posix.resolve(path.posix.dirname(outputModulePath)); this.sameModuleImportPath = (0, util_1.normalizeRelativePathForNode)(path.posix.basename(outputModulePath)); } push(...newContent) { this.contentList.push(...newContent); } importFromDatastoreModelDescriptor(...namedImports) { this.importFrom("@selfage/datastore_client/model_descriptor", ...namedImports); } importFromMessageDescriptor(...namedImports) { this.importFrom("@selfage/message/descriptor", ...namedImports); } importFromMessageSerializer(...namedImports) { this.importFrom("@selfage/message/serializer", ...namedImports); } importFromObservableDescriptor(...namedImports) { this.importFrom("@selfage/observable/descriptor", ...namedImports); } importFromServiceDescriptor(...namedImports) { this.importFrom("@selfage/service_descriptor", ...namedImports); } importFromServiceClientRequestInterface(...namedImports) { this.importFrom("@selfage/service_descriptor/client_request_interface", ...namedImports); } importFromServiceRemoteCallHandlerInterface(...namedImports) { this.importFrom("@selfage/service_descriptor/remote_call_handler_interface", ...namedImports); } importFromObservableArray(...namedImports) { this.importFrom("@selfage/observable_array", ...namedImports); } importFromSpanner(...namedImports) { this.importFrom("@google-cloud/spanner", ...namedImports); } importFromSpannerTransaction(...namedImports) { this.importFrom("@google-cloud/spanner/build/src/transaction", ...namedImports); } importFromStream(...namedImports) { this.importFrom("stream", ...namedImports); } importFromDefinition(definitionModulePath, ...namedImports) { if (!definitionModulePath) { definitionModulePath = this.baseDefinitionModulePath; } if ((0, util_1.isRelativePath)(definitionModulePath)) { definitionModulePath = (0, util_1.normalizeRelativePathForNode)(path.posix.relative(this.outputModuleDirPath, definitionModulePath)); } if (definitionModulePath === this.sameModuleImportPath) { return; } this.importFrom(definitionModulePath, ...namedImports); } importFrom(path, ...namedImports) { let namedImportsInMap = this.pathToNamedImports.get(path); if (!namedImportsInMap) { namedImportsInMap = new Set(); this.pathToNamedImports.set(path, namedImportsInMap); } for (let namedImport of namedImports) { namedImportsInMap.add(namedImport); this.namedImportToPaths.set(namedImport, path); } } build() { let resultContent = new Array(); for (let entry of this.pathToNamedImports.entries()) { let importPath = entry[0]; let namedImports = Array.from(entry[1]).join(", "); resultContent.push(`import { ${namedImports} } from '${importPath}';\n`); } resultContent.push(...this.contentList); return resultContent.join(""); } writeSync(dryRun) { (0, io_helper_1.writeFileSync)(this.outputModulePath + ".ts", this.build(), dryRun); } } exports.TsContentBuilder = TsContentBuilder; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0X2NvbnRlbnRfYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm91dHB1dF9jb250ZW50X2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQThCO0FBQzlCLDJDQUE0QztBQUM1QyxpQ0FBc0U7QUFPdEUscUNBQXFDO0FBQ3JDLE1BQWEsb0JBQW9CO0lBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQ2YsVUFBNkMsRUFDN0MsTUFBYyxFQUNkLGdCQUF3QjtRQUV4QixnQkFBZ0IsR0FBRyxJQUFBLG1DQUE0QixFQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEUsSUFBSSxvQkFBb0IsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUN2QyxnQkFBZ0IsQ0FDTyxDQUFDO1FBQzFCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzFCLG9CQUFvQixHQUFHLElBQUksb0JBQW9CLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDMUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFDRCxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFJRCxZQUNVLGdCQUF3QixFQUN4QixNQUFjO1FBRGQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFRO1FBQ3hCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFKaEIsZ0JBQVcsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBS3ZDLENBQUM7SUFFRyxJQUFJLENBQUMsR0FBRyxVQUF5QjtRQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxLQUFLO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQWU7UUFDOUIsSUFBQSx5QkFBYSxF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aXJlKFwicGF0aFwiKTtcbmltcG9ydCB7IHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwiLi9pb19oZWxwZXJcIjtcbmltcG9ydCB7IGlzUmVsYXRpdmVQYXRoLCBub3JtYWxpemVSZWxhdGl2ZVBhdGhGb3JOb2RlIH0gZnJvbSBcIi4vdXRpbFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE91dHB1dENvbnRlbnRCdWlsZGVyIHtcbiAgYnVpbGQ6ICgpID0+IHN0cmluZztcbiAgd3JpdGVTeW5jOiAoZHJ5UnVuOiBib29sZWFuKSA9PiB2b2lkO1xufVxuXG4vLyBIb2xkcyBhcmJpdHJhcnkgZ2VuZXJhdGVkIGNvbnRlbnQuXG5leHBvcnQgY2xhc3MgU2ltcGxlQ29udGVudEJ1aWxkZXIgaW1wbGVtZW50cyBPdXRwdXRDb250ZW50QnVpbGRlciB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0KFxuICAgIGNvbnRlbnRNYXA6IE1hcDxzdHJpbmcsIE91dHB1dENvbnRlbnRCdWlsZGVyPixcbiAgICBzdWZmaXg6IHN0cmluZyxcbiAgICBvdXRwdXRNb2R1bGVQYXRoOiBzdHJpbmcsXG4gICk6IFNpbXBsZUNvbnRlbnRCdWlsZGVyIHtcbiAgICBvdXRwdXRNb2R1bGVQYXRoID0gbm9ybWFsaXplUmVsYXRpdmVQYXRoRm9yTm9kZShvdXRwdXRNb2R1bGVQYXRoKTtcbiAgICBsZXQgb3V0cHV0Q29udGVudEJ1aWxkZXIgPSBjb250ZW50TWFwLmdldChcbiAgICAgIG91dHB1dE1vZHVsZVBhdGgsXG4gICAgKSBhcyBTaW1wbGVDb250ZW50QnVpbGRlcjtcbiAgICBpZiAoIW91dHB1dENvbnRlbnRCdWlsZGVyKSB7XG4gICAgICBvdXRwdXRDb250ZW50QnVpbGRlciA9IG5ldyBTaW1wbGVDb250ZW50QnVpbGRlcihvdXRwdXRNb2R1bGVQYXRoLCBzdWZmaXgpO1xuICAgICAgY29udGVudE1hcC5zZXQob3V0cHV0TW9kdWxlUGF0aCwgb3V0cHV0Q29udGVudEJ1aWxkZXIpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0Q29udGVudEJ1aWxkZXI7XG4gIH1cblxuICBwcml2YXRlIGNvbnRlbnRMaXN0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBvdXRwdXRNb2R1bGVQYXRoOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBzdWZmaXg6IHN0cmluZyxcbiAgKSB7fVxuXG4gIHB1YmxpYyBwdXNoKC4uLm5ld0NvbnRlbnQ6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRlbnRMaXN0LnB1c2goLi4ubmV3Q29udGVudCk7XG4gIH1cblxuICBwdWJsaWMgYnVpbGQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50TGlzdC5qb2luKFwiXCIpO1xuICB9XG5cbiAgcHVibGljIHdyaXRlU3luYyhkcnlSdW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB3cml0ZUZpbGVTeW5jKHRoaXMub3V0cHV0TW9kdWxlUGF0aCArIHRoaXMuc3VmZml4LCB0aGlzLmJ1aWxkKCksIGRyeVJ1bik7XG4gIH1cbn1cblxuLy8gSG9sZHMgZ2VuZXJhdGVkIFR5cGVTY3JpcHQgY29kZSBjb250ZW50LlxuZXhwb3J0IGNsYXNzIFRzQ29udGVudEJ1aWxkZXIgaW1wbGVtZW50cyBPdXRwdXRDb250ZW50QnVpbGRlciB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0KFxuICAgIGNvbnRlbnRNYXA6IE1hcDxzdHJpbmcsIE91dHB1dENvbnRlbnRCdWlsZGVyPixcbiAgICBkZWZpbml0aW9uTW9kdWxlUGF0aDogc3RyaW5nLFxuICAgIG91dHB1dE1vZHVsZVBhdGg/OiBzdHJpbmcsXG4gICk6IFRzQ29udGVudEJ1aWxkZXIge1xuICAgIG91dHB1dE1vZHVsZVBhdGggPSBub3JtYWxpemVSZWxhdGl2ZVBhdGhGb3JOb2RlKFxuICAgICAgb3V0cHV0TW9kdWxlUGF0aCA/PyBkZWZpbml0aW9uTW9kdWxlUGF0aCxcbiAgICApO1xuICAgIGxldCBvdXRwdXRDb250ZW50QnVpbGRlciA9IGNvbnRlbnRNYXAuZ2V0KFxuICAgICAgb3V0cHV0TW9kdWxlUGF0aCxcbiAgICApIGFzIFRzQ29udGVudEJ1aWxkZXI7XG4gICAgaWYgKCFvdXRwdXRDb250ZW50QnVpbGRlcikge1xuICAgICAgb3V0cHV0Q29udGVudEJ1aWxkZXIgPSBuZXcgVHNDb250ZW50QnVpbGRlcihcbiAgICAgICAgZGVmaW5pdGlvbk1vZHVsZVBhdGgsXG4gICAgICAgIG91dHB1dE1vZHVsZVBhdGgsXG4gICAgICApO1xuICAgICAgY29udGVudE1hcC5zZXQob3V0cHV0TW9kdWxlUGF0aCwgb3V0cHV0Q29udGVudEJ1aWxkZXIpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0Q29udGVudEJ1aWxkZXI7XG4gIH1cblxuICBwcml2YXRlIHBhdGhUb05hbWVkSW1wb3J0cyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgcHJpdmF0ZSBuYW1lZEltcG9ydFRvUGF0aHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIGNvbnRlbnRMaXN0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBvdXRwdXRNb2R1bGVEaXJQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgc2FtZU1vZHVsZUltcG9ydFBhdGg6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiYXNlRGVmaW5pdGlvbk1vZHVsZVBhdGg6IHN0cmluZyxcbiAgICBwcml2YXRlIG91dHB1dE1vZHVsZVBhdGg6IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5vdXRwdXRNb2R1bGVEaXJQYXRoID0gcGF0aC5wb3NpeC5yZXNvbHZlKFxuICAgICAgcGF0aC5wb3NpeC5kaXJuYW1lKG91dHB1dE1vZHVsZVBhdGgpLFxuICAgICk7XG4gICAgdGhpcy5zYW1lTW9kdWxlSW1wb3J0UGF0aCA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aEZvck5vZGUoXG4gICAgICBwYXRoLnBvc2l4LmJhc2VuYW1lKG91dHB1dE1vZHVsZVBhdGgpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcHVzaCguLi5uZXdDb250ZW50OiBBcnJheTxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5jb250ZW50TGlzdC5wdXNoKC4uLm5ld0NvbnRlbnQpO1xuICB9XG5cbiAgcHVibGljIGltcG9ydEZyb21EYXRhc3RvcmVNb2RlbERlc2NyaXB0b3IoXG4gICAgLi4ubmFtZWRJbXBvcnRzOiBBcnJheTxzdHJpbmc+XG4gICk6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0RnJvbShcbiAgICAgIFwiQHNlbGZhZ2UvZGF0YXN0b3JlX2NsaWVudC9tb2RlbF9kZXNjcmlwdG9yXCIsXG4gICAgICAuLi5uYW1lZEltcG9ydHMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpbXBvcnRGcm9tTWVzc2FnZURlc2NyaXB0b3IoLi4ubmFtZWRJbXBvcnRzOiBBcnJheTxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRGcm9tKFwiQHNlbGZhZ2UvbWVzc2FnZS9kZXNjcmlwdG9yXCIsIC4uLm5hbWVkSW1wb3J0cyk7XG4gIH1cblxuICBwdWJsaWMgaW1wb3J0RnJvbU1lc3NhZ2VTZXJpYWxpemVyKC4uLm5hbWVkSW1wb3J0czogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0RnJvbShcIkBzZWxmYWdlL21lc3NhZ2Uvc2VyaWFsaXplclwiLCAuLi5uYW1lZEltcG9ydHMpO1xuICB9XG5cbiAgcHVibGljIGltcG9ydEZyb21PYnNlcnZhYmxlRGVzY3JpcHRvciguLi5uYW1lZEltcG9ydHM6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydEZyb20oXCJAc2VsZmFnZS9vYnNlcnZhYmxlL2Rlc2NyaXB0b3JcIiwgLi4ubmFtZWRJbXBvcnRzKTtcbiAgfVxuXG4gIHB1YmxpYyBpbXBvcnRGcm9tU2VydmljZURlc2NyaXB0b3IoLi4ubmFtZWRJbXBvcnRzOiBBcnJheTxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRGcm9tKFwiQHNlbGZhZ2Uvc2VydmljZV9kZXNjcmlwdG9yXCIsIC4uLm5hbWVkSW1wb3J0cyk7XG4gIH1cblxuICBwdWJsaWMgaW1wb3J0RnJvbVNlcnZpY2VDbGllbnRSZXF1ZXN0SW50ZXJmYWNlKFxuICAgIC4uLm5hbWVkSW1wb3J0czogQXJyYXk8c3RyaW5nPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydEZyb20oXG4gICAgICBcIkBzZWxmYWdlL3NlcnZpY2VfZGVzY3JpcHRvci9jbGllbnRfcmVxdWVzdF9pbnRlcmZhY2VcIixcbiAgICAgIC4uLm5hbWVkSW1wb3J0cyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGltcG9ydEZyb21TZXJ2aWNlUmVtb3RlQ2FsbEhhbmRsZXJJbnRlcmZhY2UoXG4gICAgLi4ubmFtZWRJbXBvcnRzOiBBcnJheTxzdHJpbmc+XG4gICk6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0RnJvbShcbiAgICAgIFwiQHNlbGZhZ2Uvc2VydmljZV9kZXNjcmlwdG9yL3JlbW90ZV9jYWxsX2hhbmRsZXJfaW50ZXJmYWNlXCIsXG4gICAgICAuLi5uYW1lZEltcG9ydHMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpbXBvcnRGcm9tT2JzZXJ2YWJsZUFycmF5KC4uLm5hbWVkSW1wb3J0czogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0RnJvbShcIkBzZWxmYWdlL29ic2VydmFibGVfYXJyYXlcIiwgLi4ubmFtZWRJbXBvcnRzKTtcbiAgfVxuXG4gIHB1YmxpYyBpbXBvcnRGcm9tU3Bhbm5lciguLi5uYW1lZEltcG9ydHM6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydEZyb20oXCJAZ29vZ2xlLWNsb3VkL3NwYW5uZXJcIiwgLi4ubmFtZWRJbXBvcnRzKTtcbiAgfVxuXG4gIHB1YmxpYyBpbXBvcnRGcm9tU3Bhbm5lclRyYW5zYWN0aW9uKC4uLm5hbWVkSW1wb3J0czogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0RnJvbShcbiAgICAgIFwiQGdvb2dsZS1jbG91ZC9zcGFubmVyL2J1aWxkL3NyYy90cmFuc2FjdGlvblwiLFxuICAgICAgLi4ubmFtZWRJbXBvcnRzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaW1wb3J0RnJvbVN0cmVhbSguLi5uYW1lZEltcG9ydHM6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydEZyb20oXCJzdHJlYW1cIiwgLi4ubmFtZWRJbXBvcnRzKTtcbiAgfVxuXG4gIHB1YmxpYyBpbXBvcnRGcm9tRGVmaW5pdGlvbihcbiAgICBkZWZpbml0aW9uTW9kdWxlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIC4uLm5hbWVkSW1wb3J0czogQXJyYXk8c3RyaW5nPlxuICApOiB2b2lkIHtcbiAgICBpZiAoIWRlZmluaXRpb25Nb2R1bGVQYXRoKSB7XG4gICAgICBkZWZpbml0aW9uTW9kdWxlUGF0aCA9IHRoaXMuYmFzZURlZmluaXRpb25Nb2R1bGVQYXRoO1xuICAgIH1cbiAgICBpZiAoaXNSZWxhdGl2ZVBhdGgoZGVmaW5pdGlvbk1vZHVsZVBhdGgpKSB7XG4gICAgICBkZWZpbml0aW9uTW9kdWxlUGF0aCA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aEZvck5vZGUoXG4gICAgICAgIHBhdGgucG9zaXgucmVsYXRpdmUodGhpcy5vdXRwdXRNb2R1bGVEaXJQYXRoLCBkZWZpbml0aW9uTW9kdWxlUGF0aCksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbk1vZHVsZVBhdGggPT09IHRoaXMuc2FtZU1vZHVsZUltcG9ydFBhdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbXBvcnRGcm9tKGRlZmluaXRpb25Nb2R1bGVQYXRoLCAuLi5uYW1lZEltcG9ydHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbXBvcnRGcm9tKFxuICAgIHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAuLi5uYW1lZEltcG9ydHM6IEFycmF5PHN0cmluZz5cbiAgKTogdm9pZCB7XG4gICAgbGV0IG5hbWVkSW1wb3J0c0luTWFwID0gdGhpcy5wYXRoVG9OYW1lZEltcG9ydHMuZ2V0KHBhdGgpO1xuICAgIGlmICghbmFtZWRJbXBvcnRzSW5NYXApIHtcbiAgICAgIG5hbWVkSW1wb3J0c0luTWFwID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICB0aGlzLnBhdGhUb05hbWVkSW1wb3J0cy5zZXQocGF0aCwgbmFtZWRJbXBvcnRzSW5NYXApO1xuICAgIH1cbiAgICBmb3IgKGxldCBuYW1lZEltcG9ydCBvZiBuYW1lZEltcG9ydHMpIHtcbiAgICAgIG5hbWVkSW1wb3J0c0luTWFwLmFkZChuYW1lZEltcG9ydCk7XG4gICAgICB0aGlzLm5hbWVkSW1wb3J0VG9QYXRocy5zZXQobmFtZWRJbXBvcnQsIHBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBidWlsZCgpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHRDb250ZW50ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCBlbnRyeSBvZiB0aGlzLnBhdGhUb05hbWVkSW1wb3J0cy5lbnRyaWVzKCkpIHtcbiAgICAgIGxldCBpbXBvcnRQYXRoID0gZW50cnlbMF07XG4gICAgICBsZXQgbmFtZWRJbXBvcnRzID0gQXJyYXkuZnJvbShlbnRyeVsxXSkuam9pbihcIiwgXCIpO1xuICAgICAgcmVzdWx0Q29udGVudC5wdXNoKGBpbXBvcnQgeyAke25hbWVkSW1wb3J0c30gfSBmcm9tICcke2ltcG9ydFBhdGh9JztcXG5gKTtcbiAgICB9XG4gICAgcmVzdWx0Q29udGVudC5wdXNoKC4uLnRoaXMuY29udGVudExpc3QpO1xuICAgIHJldHVybiByZXN1bHRDb250ZW50LmpvaW4oXCJcIik7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVTeW5jKGRyeVJ1bjogYm9vbGVhbik6IHZvaWQge1xuICAgIHdyaXRlRmlsZVN5bmModGhpcy5vdXRwdXRNb2R1bGVQYXRoICsgXCIudHNcIiwgdGhpcy5idWlsZCgpLCBkcnlSdW4pO1xuICB9XG59XG4iXX0=