@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
114 lines (112 loc) • 20 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ts_utils_1 = require("@neo-one/ts-utils");
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const Context_1 = require("./Context");
const utils_1 = require("./utils");
function createContext(sourceFiles, program, typeChecker, languageService, host) {
return new Context_1.Context(sourceFiles, program, typeChecker, languageService, host);
}
function updateContext(context, files) {
const { program, typeChecker, languageService } = createProgram(Object.keys(files), context.host, {
modifyHost: createModifyHostFiles(files),
withTestHarness: context.program.__withTestHarness,
});
const sourceFiles = utils_1.getAllSourceFiles(Object.keys(files).map((rootName) => ts_utils_1.tsUtils.file.getSourceFileOrThrow(program, rootName)), typeChecker);
return context.update(sourceFiles, program, typeChecker, languageService);
}
exports.updateContext = updateContext;
const CREATE_CONTEXT_OPTIONS_DEFAULT = {
withTestHarness: false,
};
const defaultModifyHost = () => {
};
const DEFAULT_MAKE_CONTEXT_OPTIONS = Object.assign({}, CREATE_CONTEXT_OPTIONS_DEFAULT, { modifyHost: defaultModifyHost });
exports.COMPILER_OPTIONS = {
target: typescript_1.default.ScriptTarget.ESNext,
module: typescript_1.default.ModuleKind.ESNext,
moduleResolution: typescript_1.default.ModuleResolutionKind.NodeJs,
noLib: true,
typeRoots: [],
pretty: true,
noEmit: true,
declaration: false,
allowSyntheticDefaultImports: true,
resolveJsonModule: false,
experimentalDecorators: true,
jsx: typescript_1.default.JsxEmit.React,
alwaysStrict: true,
strict: true,
skipLibCheck: true,
noUnusedLocals: true,
noImplicitReturns: true,
allowUnusedLabels: false,
noUnusedParameters: false,
allowUnreachableCode: false,
noFallthroughCasesInSwitch: true,
forceConsistentCasingInFileNames: true,
};
const makeContext = (rootNames, host, options = DEFAULT_MAKE_CONTEXT_OPTIONS) => {
const { program, typeChecker, languageService } = createProgram(rootNames, host, options);
const sourceFiles = utils_1.getAllSourceFiles(rootNames.map((rootName) => ts_utils_1.tsUtils.file.getSourceFileOrThrow(program, rootName)), typeChecker);
return createContext(sourceFiles, program, typeChecker, languageService, host);
};
const createModifyHostFiles = (files) => (host) => {
const originalFileExists = host.fileExists === undefined ? undefined : host.fileExists.bind(host);
host.fileExists = (file) => {
if (files[file] !== undefined) {
return true;
}
return originalFileExists === undefined ? false : originalFileExists(file);
};
const originalReadFile = host.readFile === undefined ? undefined : host.readFile.bind(host);
host.readFile = (file, ...args) => {
const foundFile = files[file];
if (foundFile !== undefined) {
return foundFile;
}
return originalReadFile === undefined ? undefined : originalReadFile(file, ...args);
};
};
const createProgram = (rootNames, host, { modifyHost = defaultModifyHost, withTestHarness = false } = DEFAULT_MAKE_CONTEXT_OPTIONS) => {
const servicesHost = host.createLanguageServiceHost(rootNames, exports.COMPILER_OPTIONS, withTestHarness);
modifyHost(servicesHost);
const languageService = typescript_1.default.createLanguageService(servicesHost);
const program = languageService.getProgram();
if (program === undefined) {
throw new Error('Something went wrong');
}
program.__withTestHarness = withTestHarness;
return {
program,
typeChecker: program.getTypeChecker(),
languageService,
};
};
exports.createContextForDir = async (dir, host, options = CREATE_CONTEXT_OPTIONS_DEFAULT) => {
const files = await host.getAllTypescriptFilesInDir(dir);
return makeContext(files, host, options);
};
exports.createContextForPath = (filePath, host, options = CREATE_CONTEXT_OPTIONS_DEFAULT) => makeContext([filePath], host, options);
exports.createContextForSnippet = (code, host, _a = CREATE_CONTEXT_OPTIONS_DEFAULT) => {
var { fileName: fileNameIn } = _a, rest = tslib_1.__rest(_a, ["fileName"]);
const fileName = host.createSnippetFile(fileNameIn);
const context = makeContext([fileName], host, Object.assign({}, rest, { modifyHost: createModifyHostFiles({ [fileName]: code }) }));
const sourceFile = ts_utils_1.tsUtils.file.getSourceFileOrThrow(context.program, fileName);
return {
context,
sourceFile,
};
};
exports.createContextForLanguageService = (filePath, languageService, host) => {
const program = languageService.getProgram();
if (program === undefined) {
throw new Error('Something went wrong');
}
const sourceFile = ts_utils_1.tsUtils.file.getSourceFileOrThrow(program, filePath);
const typeChecker = program.getTypeChecker();
const sourceFiles = utils_1.getAllSourceFiles([sourceFile], typeChecker);
return createContext(sourceFiles, program, typeChecker, languageService, host);
};
//# sourceMappingURL=data:application/json;charset=utf8;base64,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T0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzdDLE1BQU0sV0FBVyxHQUFHLHlCQUFpQixDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFakUsT0FBTyxhQUFhLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2pGLENBQUMsQ0FBQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jcmVhdGVDb250ZXh0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHNVdGlscyB9IGZyb20gJ0BuZW8tb25lL3RzLXV0aWxzJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICcuL0NvbnRleHQnO1xuaW1wb3J0IHsgQ29tcGlsZXJIb3N0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRBbGxTb3VyY2VGaWxlcyB9IGZyb20gJy4vdXRpbHMnO1xuXG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KFxuICBzb3VyY2VGaWxlczogU2V0PHRzLlNvdXJjZUZpbGU+LFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gIGxhbmd1YWdlU2VydmljZTogdHMuTGFuZ3VhZ2VTZXJ2aWNlLFxuICBob3N0OiBDb21waWxlckhvc3QsXG4pOiBDb250ZXh0IHtcbiAgcmV0dXJuIG5ldyBDb250ZXh0KHNvdXJjZUZpbGVzLCBwcm9ncmFtLCB0eXBlQ2hlY2tlciwgbGFuZ3VhZ2VTZXJ2aWNlLCBob3N0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNvbnRleHQoY29udGV4dDogQ29udGV4dCwgZmlsZXM6IHsgcmVhZG9ubHkgW2ZpbGVOYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfSk6IENvbnRleHQge1xuICBjb25zdCB7IHByb2dyYW0sIHR5cGVDaGVja2VyLCBsYW5ndWFnZVNlcnZpY2UgfSA9IGNyZWF0ZVByb2dyYW0oT2JqZWN0LmtleXMoZmlsZXMpLCBjb250ZXh0Lmhvc3QsIHtcbiAgICBtb2RpZnlIb3N0OiBjcmVhdGVNb2RpZnlIb3N0RmlsZXMoZmlsZXMpLFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgICB3aXRoVGVzdEhhcm5lc3M6IChjb250ZXh0LnByb2dyYW0gYXMgYW55KS5fX3dpdGhUZXN0SGFybmVzcyxcbiAgfSk7XG5cbiAgY29uc3Qgc291cmNlRmlsZXMgPSBnZXRBbGxTb3VyY2VGaWxlcyhcbiAgICBPYmplY3Qua2V5cyhmaWxlcykubWFwKChyb290TmFtZSkgPT4gdHNVdGlscy5maWxlLmdldFNvdXJjZUZpbGVPclRocm93KHByb2dyYW0sIHJvb3ROYW1lKSksXG4gICAgdHlwZUNoZWNrZXIsXG4gICk7XG5cbiAgcmV0dXJuIGNvbnRleHQudXBkYXRlKHNvdXJjZUZpbGVzLCBwcm9ncmFtLCB0eXBlQ2hlY2tlciwgbGFuZ3VhZ2VTZXJ2aWNlKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVDb250ZXh0T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHdpdGhUZXN0SGFybmVzcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQ29udGV4dFNuaXBwZXRPcHRpb25zIGV4dGVuZHMgQ3JlYXRlQ29udGV4dE9wdGlvbnMge1xuICByZWFkb25seSBmaWxlTmFtZT86IHN0cmluZztcbn1cblxuY29uc3QgQ1JFQVRFX0NPTlRFWFRfT1BUSU9OU19ERUZBVUxUID0ge1xuICB3aXRoVGVzdEhhcm5lc3M6IGZhbHNlLFxufTtcblxuY29uc3QgZGVmYXVsdE1vZGlmeUhvc3QgPSAoKSA9PiB7XG4gIC8vIGRvIG5vdGhpbmdcbn07XG5cbmludGVyZmFjZSBNYWtlQ29udGV4dE9wdGlvbnMgZXh0ZW5kcyBDcmVhdGVDb250ZXh0T3B0aW9ucyB7XG4gIHJlYWRvbmx5IG1vZGlmeUhvc3Q/OiAoaG9zdDogdHMuTGFuZ3VhZ2VTZXJ2aWNlSG9zdCkgPT4gdm9pZDtcbn1cblxuY29uc3QgREVGQVVMVF9NQUtFX0NPTlRFWFRfT1BUSU9OUyA9IHtcbiAgLi4uQ1JFQVRFX0NPTlRFWFRfT1BUSU9OU19ERUZBVUxULFxuICBtb2RpZnlIb3N0OiBkZWZhdWx0TW9kaWZ5SG9zdCxcbn07XG5cbmV4cG9ydCBjb25zdCBDT01QSUxFUl9PUFRJT05TOiB0cy5Db21waWxlck9wdGlvbnMgPSB7XG4gIHRhcmdldDogdHMuU2NyaXB0VGFyZ2V0LkVTTmV4dCxcbiAgbW9kdWxlOiB0cy5Nb2R1bGVLaW5kLkVTTmV4dCxcbiAgbW9kdWxlUmVzb2x1dGlvbjogdHMuTW9kdWxlUmVzb2x1dGlvbktpbmQuTm9kZUpzLFxuXG4gIG5vTGliOiB0cnVlLFxuICB0eXBlUm9vdHM6IFtdLFxuXG4gIHByZXR0eTogdHJ1ZSxcblxuICBub0VtaXQ6IHRydWUsXG4gIGRlY2xhcmF0aW9uOiBmYWxzZSxcblxuICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLFxuICByZXNvbHZlSnNvbk1vZHVsZTogZmFsc2UsXG4gIGV4cGVyaW1lbnRhbERlY29yYXRvcnM6IHRydWUsXG4gIGpzeDogdHMuSnN4RW1pdC5SZWFjdCxcblxuICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gIHN0cmljdDogdHJ1ZSxcbiAgc2tpcExpYkNoZWNrOiB0cnVlLFxuICBub1VudXNlZExvY2FsczogdHJ1ZSxcbiAgbm9JbXBsaWNpdFJldHVybnM6IHRydWUsXG4gIGFsbG93VW51c2VkTGFiZWxzOiBmYWxzZSxcbiAgbm9VbnVzZWRQYXJhbWV0ZXJzOiBmYWxzZSxcbiAgYWxsb3dVbnJlYWNoYWJsZUNvZGU6IGZhbHNlLFxuICBub0ZhbGx0aHJvdWdoQ2FzZXNJblN3aXRjaDogdHJ1ZSxcbiAgZm9yY2VDb25zaXN0ZW50Q2FzaW5nSW5GaWxlTmFtZXM6IHRydWUsXG59O1xuXG5jb25zdCBtYWtlQ29udGV4dCA9IChcbiAgcm9vdE5hbWVzOiBSZWFkb25seUFycmF5PHN0cmluZz4sXG4gIGhvc3Q6IENvbXBpbGVySG9zdCxcbiAgb3B0aW9uczogTWFrZUNvbnRleHRPcHRpb25zID0gREVGQVVMVF9NQUtFX0NPTlRFWFRfT1BUSU9OUyxcbik6IENvbnRleHQgPT4ge1xuICBjb25zdCB7IHByb2dyYW0sIHR5cGVDaGVja2VyLCBsYW5ndWFnZVNlcnZpY2UgfSA9IGNyZWF0ZVByb2dyYW0ocm9vdE5hbWVzLCBob3N0LCBvcHRpb25zKTtcblxuICBjb25zdCBzb3VyY2VGaWxlcyA9IGdldEFsbFNvdXJjZUZpbGVzKFxuICAgIHJvb3ROYW1lcy5tYXAoKHJvb3ROYW1lKSA9PiB0c1V0aWxzLmZpbGUuZ2V0U291cmNlRmlsZU9yVGhyb3cocHJvZ3JhbSwgcm9vdE5hbWUpKSxcbiAgICB0eXBlQ2hlY2tlcixcbiAgKTtcblxuICByZXR1cm4gY3JlYXRlQ29udGV4dChzb3VyY2VGaWxlcywgcHJvZ3JhbSwgdHlwZUNoZWNrZXIsIGxhbmd1YWdlU2VydmljZSwgaG9zdCk7XG59O1xuXG5jb25zdCBjcmVhdGVNb2RpZnlIb3N0RmlsZXMgPSAoZmlsZXM6IHsgcmVhZG9ubHkgW2ZpbGVOYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfSkgPT4gKFxuICBob3N0OiB0cy5MYW5ndWFnZVNlcnZpY2VIb3N0LFxuKSA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsRmlsZUV4aXN0cyA9IGhvc3QuZmlsZUV4aXN0cyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogaG9zdC5maWxlRXhpc3RzLmJpbmQoaG9zdCk7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1vYmplY3QtbXV0YXRpb24gbm8tYW55XG4gIGhvc3QuZmlsZUV4aXN0cyA9IChmaWxlKSA9PiB7XG4gICAgaWYgKGZpbGVzW2ZpbGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBvcmlnaW5hbEZpbGVFeGlzdHMgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3JpZ2luYWxGaWxlRXhpc3RzKGZpbGUpO1xuICB9O1xuXG4gIGNvbnN0IG9yaWdpbmFsUmVhZEZpbGUgPSBob3N0LnJlYWRGaWxlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBob3N0LnJlYWRGaWxlLmJpbmQoaG9zdCk7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1vYmplY3QtbXV0YXRpb24gbm8tYW55XG4gIGhvc3QucmVhZEZpbGUgPSAoZmlsZSwgLi4uYXJnczogYW55W10pID0+IHtcbiAgICBjb25zdCBmb3VuZEZpbGUgPSBmaWxlc1tmaWxlXTtcbiAgICBpZiAoZm91bmRGaWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmb3VuZEZpbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yaWdpbmFsUmVhZEZpbGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9yaWdpbmFsUmVhZEZpbGUoZmlsZSwgLi4uYXJncyk7XG4gIH07XG59O1xuXG5jb25zdCBjcmVhdGVQcm9ncmFtID0gKFxuICByb290TmFtZXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgaG9zdDogQ29tcGlsZXJIb3N0LFxuICB7IG1vZGlmeUhvc3QgPSBkZWZhdWx0TW9kaWZ5SG9zdCwgd2l0aFRlc3RIYXJuZXNzID0gZmFsc2UgfTogTWFrZUNvbnRleHRPcHRpb25zID0gREVGQVVMVF9NQUtFX0NPTlRFWFRfT1BUSU9OUyxcbikgPT4ge1xuICBjb25zdCBzZXJ2aWNlc0hvc3QgPSBob3N0LmNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3Qocm9vdE5hbWVzLCBDT01QSUxFUl9PUFRJT05TLCB3aXRoVGVzdEhhcm5lc3MpO1xuICBtb2RpZnlIb3N0KHNlcnZpY2VzSG9zdCk7XG5cbiAgY29uc3QgbGFuZ3VhZ2VTZXJ2aWNlID0gdHMuY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlKHNlcnZpY2VzSG9zdCk7XG4gIGNvbnN0IHByb2dyYW0gPSBsYW5ndWFnZVNlcnZpY2UuZ2V0UHJvZ3JhbSgpO1xuICBpZiAocHJvZ3JhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTb21ldGhpbmcgd2VudCB3cm9uZycpO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueSBuby1vYmplY3QtbXV0YXRpb25cbiAgKHByb2dyYW0gYXMgYW55KS5fX3dpdGhUZXN0SGFybmVzcyA9IHdpdGhUZXN0SGFybmVzcztcblxuICByZXR1cm4ge1xuICAgIHByb2dyYW0sXG4gICAgdHlwZUNoZWNrZXI6IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKSxcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ29udGV4dEZvckRpciA9IGFzeW5jIChcbiAgZGlyOiBzdHJpbmcsXG4gIGhvc3Q6IENvbXBpbGVySG9zdCxcbiAgb3B0aW9uczogQ3JlYXRlQ29udGV4dE9wdGlvbnMgPSBDUkVBVEVfQ09OVEVYVF9PUFRJT05TX0RFRkFVTFQsXG4pOiBQcm9taXNlPENvbnRleHQ+ID0+IHtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBob3N0LmdldEFsbFR5cGVzY3JpcHRGaWxlc0luRGlyKGRpcik7XG5cbiAgcmV0dXJuIG1ha2VDb250ZXh0KGZpbGVzLCBob3N0LCBvcHRpb25zKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVDb250ZXh0Rm9yUGF0aCA9IChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgaG9zdDogQ29tcGlsZXJIb3N0LFxuICBvcHRpb25zOiBDcmVhdGVDb250ZXh0T3B0aW9ucyA9IENSRUFURV9DT05URVhUX09QVElPTlNfREVGQVVMVCxcbik6IENvbnRleHQgPT4gbWFrZUNvbnRleHQoW2ZpbGVQYXRoXSwgaG9zdCwgb3B0aW9ucyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU25pcHBldFJlc3VsdCB7XG4gIHJlYWRvbmx5IGNvbnRleHQ6IENvbnRleHQ7XG4gIHJlYWRvbmx5IHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGU7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVDb250ZXh0Rm9yU25pcHBldCA9IChcbiAgY29kZTogc3RyaW5nLFxuICBob3N0OiBDb21waWxlckhvc3QsXG4gIHsgZmlsZU5hbWU6IGZpbGVOYW1lSW4sIC4uLnJlc3QgfTogQ3JlYXRlQ29udGV4dFNuaXBwZXRPcHRpb25zID0gQ1JFQVRFX0NPTlRFWFRfT1BUSU9OU19ERUZBVUxULFxuKTogU25pcHBldFJlc3VsdCA9PiB7XG4gIGNvbnN0IGZpbGVOYW1lID0gaG9zdC5jcmVhdGVTbmlwcGV0RmlsZShmaWxlTmFtZUluKTtcblxuICBjb25zdCBjb250ZXh0ID0gbWFrZUNvbnRleHQoW2ZpbGVOYW1lXSwgaG9zdCwge1xuICAgIC4uLnJlc3QsXG4gICAgbW9kaWZ5SG9zdDogY3JlYXRlTW9kaWZ5SG9zdEZpbGVzKHsgW2ZpbGVOYW1lXTogY29kZSB9KSxcbiAgfSk7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0c1V0aWxzLmZpbGUuZ2V0U291cmNlRmlsZU9yVGhyb3coY29udGV4dC5wcm9ncmFtLCBmaWxlTmFtZSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZXh0LFxuICAgIHNvdXJjZUZpbGUsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ29udGV4dEZvckxhbmd1YWdlU2VydmljZSA9IChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbGFuZ3VhZ2VTZXJ2aWNlOiB0cy5MYW5ndWFnZVNlcnZpY2UsXG4gIGhvc3Q6IENvbXBpbGVySG9zdCxcbik6IENvbnRleHQgPT4ge1xuICBjb25zdCBwcm9ncmFtID0gbGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKTtcbiAgaWYgKHByb2dyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU29tZXRoaW5nIHdlbnQgd3JvbmcnKTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0c1V0aWxzLmZpbGUuZ2V0U291cmNlRmlsZU9yVGhyb3cocHJvZ3JhbSwgZmlsZVBhdGgpO1xuICBjb25zdCB0eXBlQ2hlY2tlciA9IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3Qgc291cmNlRmlsZXMgPSBnZXRBbGxTb3VyY2VGaWxlcyhbc291cmNlRmlsZV0sIHR5cGVDaGVja2VyKTtcblxuICByZXR1cm4gY3JlYXRlQ29udGV4dChzb3VyY2VGaWxlcywgcHJvZ3JhbSwgdHlwZUNoZWNrZXIsIGxhbmd1YWdlU2VydmljZSwgaG9zdCk7XG59O1xuIl19