UNPKG

17.7 kBJavaScriptView Raw
1/**
2 * @license
3 * Copyright Google LLC All Rights Reserved.
4 *
5 * Use of this source code is governed by an MIT-style license that can be
6 * found in the LICENSE file at https://angular.io/license
7 */
8(function (factory) {
9 if (typeof module === "object" && typeof module.exports === "object") {
10 var v = factory(require, exports);
11 if (v !== undefined) module.exports = v;
12 }
13 else if (typeof define === "function" && define.amd) {
14 define("@angular/language-service/src/reflector_host", ["require", "exports", "@angular/compiler-cli/src/language_services", "path", "typescript"], factory);
15 }
16})(function (require, exports) {
17 "use strict";
18 Object.defineProperty(exports, "__esModule", { value: true });
19 exports.ReflectorHost = void 0;
20 var language_services_1 = require("@angular/compiler-cli/src/language_services");
21 var path = require("path");
22 var ts = require("typescript");
23 var ReflectorModuleModuleResolutionHost = /** @class */ (function () {
24 function ReflectorModuleModuleResolutionHost(tsLSHost, getProgram) {
25 this.tsLSHost = tsLSHost;
26 this.getProgram = getProgram;
27 this.metadataCollector = new language_services_1.MetadataCollector({
28 // Note: verboseInvalidExpressions is important so that
29 // the collector will collect errors instead of throwing
30 verboseInvalidExpression: true,
31 });
32 if (tsLSHost.directoryExists) {
33 this.directoryExists = function (directoryName) { return tsLSHost.directoryExists(directoryName); };
34 }
35 if (tsLSHost.realpath) {
36 this.realpath = function (path) { return tsLSHost.realpath(path); };
37 }
38 }
39 ReflectorModuleModuleResolutionHost.prototype.fileExists = function (fileName) {
40 // TypeScript resolution logic walks through the following sequence in order:
41 // package.json (read "types" field) -> .ts -> .tsx -> .d.ts
42 // For more info, see
43 // https://www.typescriptlang.org/docs/handbook/module-resolution.html
44 // For Angular specifically, we can skip .tsx lookup
45 if (fileName.endsWith('.tsx')) {
46 return false;
47 }
48 if (this.tsLSHost.fileExists) {
49 return this.tsLSHost.fileExists(fileName);
50 }
51 return !!this.tsLSHost.getScriptSnapshot(fileName);
52 };
53 ReflectorModuleModuleResolutionHost.prototype.readFile = function (fileName) {
54 // readFile() is used by TypeScript to read package.json during module
55 // resolution, and it's used by Angular to read metadata.json during
56 // metadata resolution.
57 if (this.tsLSHost.readFile) {
58 return this.tsLSHost.readFile(fileName);
59 }
60 // As a fallback, read the JSON files from the editor snapshot.
61 var snapshot = this.tsLSHost.getScriptSnapshot(fileName);
62 if (!snapshot) {
63 // MetadataReaderHost readFile() declaration should be
64 // `readFile(fileName: string): string | undefined`
65 return undefined;
66 }
67 return snapshot.getText(0, snapshot.getLength());
68 };
69 ReflectorModuleModuleResolutionHost.prototype.getSourceFileMetadata = function (fileName) {
70 var sf = this.getProgram().getSourceFile(fileName);
71 return sf ? this.metadataCollector.getMetadata(sf) : undefined;
72 };
73 ReflectorModuleModuleResolutionHost.prototype.cacheMetadata = function (fileName) {
74 // Don't cache the metadata for .ts files as they might change in the editor!
75 return fileName.endsWith('.d.ts');
76 };
77 return ReflectorModuleModuleResolutionHost;
78 }());
79 var ReflectorHost = /** @class */ (function () {
80 function ReflectorHost(getProgram, tsLSHost) {
81 this.tsLSHost = tsLSHost;
82 this.metadataReaderCache = language_services_1.createMetadataReaderCache();
83 // tsLSHost.getCurrentDirectory() returns the directory where tsconfig.json
84 // is located. This is not the same as process.cwd() because the language
85 // service host sets the "project root path" as its current directory.
86 var currentDir = tsLSHost.getCurrentDirectory();
87 this.fakeContainingPath = currentDir ? path.join(currentDir, 'fakeContainingFile.ts') : '';
88 this.hostAdapter = new ReflectorModuleModuleResolutionHost(tsLSHost, getProgram);
89 this.moduleResolutionCache = ts.createModuleResolutionCache(currentDir, function (s) { return s; }, // getCanonicalFileName
90 tsLSHost.getCompilationSettings());
91 }
92 ReflectorHost.prototype.getMetadataFor = function (modulePath) {
93 return language_services_1.readMetadata(modulePath, this.hostAdapter, this.metadataReaderCache);
94 };
95 ReflectorHost.prototype.moduleNameToFileName = function (moduleName, containingFile) {
96 if (!containingFile) {
97 if (moduleName.startsWith('.')) {
98 throw new Error('Resolution of relative paths requires a containing file.');
99 }
100 if (!this.fakeContainingPath) {
101 // If current directory is empty then the file must belong to an inferred
102 // project (no tsconfig.json), in which case it's not possible to resolve
103 // the module without the caller explicitly providing a containing file.
104 throw new Error("Could not resolve '" + moduleName + "' without a containing file.");
105 }
106 containingFile = this.fakeContainingPath;
107 }
108 var compilerOptions = this.tsLSHost.getCompilationSettings();
109 var resolved = ts.resolveModuleName(moduleName, containingFile, compilerOptions, this.hostAdapter, this.moduleResolutionCache)
110 .resolvedModule;
111 return resolved ? resolved.resolvedFileName : null;
112 };
113 ReflectorHost.prototype.getOutputName = function (filePath) {
114 return filePath;
115 };
116 return ReflectorHost;
117 }());
118 exports.ReflectorHost = ReflectorHost;
119});
120//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmbGVjdG9yX2hvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9sYW5ndWFnZS1zZXJ2aWNlL3NyYy9yZWZsZWN0b3JfaG9zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7SUFHSCxpRkFBMkk7SUFDM0ksMkJBQTZCO0lBQzdCLCtCQUFpQztJQUVqQztRQVdFLDZDQUNxQixRQUFnQyxFQUNoQyxVQUE0QjtZQUQ1QixhQUFRLEdBQVIsUUFBUSxDQUF3QjtZQUNoQyxlQUFVLEdBQVYsVUFBVSxDQUFrQjtZQVpoQyxzQkFBaUIsR0FBRyxJQUFJLHFDQUFpQixDQUFDO2dCQUN6RCx1REFBdUQ7Z0JBQ3ZELHdEQUF3RDtnQkFDeEQsd0JBQXdCLEVBQUUsSUFBSTthQUMvQixDQUFDLENBQUM7WUFTRCxJQUFJLFFBQVEsQ0FBQyxlQUFlLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBQSxhQUFhLElBQUksT0FBQSxRQUFRLENBQUMsZUFBZ0IsQ0FBQyxhQUFhLENBQUMsRUFBeEMsQ0FBd0MsQ0FBQzthQUNsRjtZQUNELElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRTtnQkFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFBLElBQUksSUFBSSxPQUFBLFFBQVEsQ0FBQyxRQUFTLENBQUMsSUFBSSxDQUFDLEVBQXhCLENBQXdCLENBQUM7YUFDbEQ7UUFDSCxDQUFDO1FBRUQsd0RBQVUsR0FBVixVQUFXLFFBQWdCO1lBQ3pCLDZFQUE2RTtZQUM3RSw0REFBNEQ7WUFDNUQscUJBQXFCO1lBQ3JCLHNFQUFzRTtZQUN0RSxvREFBb0Q7WUFDcEQsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUM3QixPQUFPLEtBQUssQ0FBQzthQUNkO1lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRTtnQkFDNUIs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QUFzQixVQUFVLGlDQUE4QixDQUFDLENBQUM7aUJBQ2pGO2dCQUNELGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7YUFDMUM7WUFDRCxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDL0QsSUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUNkLFVBQVUsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQzdELElBQUksQ0FBQyxxQkFBcUIsQ0FBQztpQkFDNUIsY0FBYyxDQUFDO1lBQ3JDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNyRCxDQUFDO1FBRUQscUNBQWEsR0FBYixVQUFjLFFBQWdCO1lBQzVCLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFDSCxvQkFBQztJQUFELENBQUMsQUEvQ0QsSUErQ0M7SUEvQ1ksc0NBQWEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtTdGF0aWNTeW1ib2xSZXNvbHZlckhvc3R9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyJztcbmltcG9ydCB7Y3JlYXRlTWV0YWRhdGFSZWFkZXJDYWNoZSwgTWV0YWRhdGFDb2xsZWN0b3IsIE1ldGFkYXRhUmVhZGVySG9zdCwgcmVhZE1ldGFkYXRhfSBmcm9tICdAYW5ndWxhci9jb21waWxlci1jbGkvc3JjL2xhbmd1YWdlX3NlcnZpY2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuY2xhc3MgUmVmbGVjdG9yTW9kdWxlTW9kdWxlUmVzb2x1dGlvbkhvc3QgaW1wbGVtZW50cyB0cy5Nb2R1bGVSZXNvbHV0aW9uSG9zdCwgTWV0YWRhdGFSZWFkZXJIb3N0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YUNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3Rvcih7XG4gICAgLy8gTm90ZTogdmVyYm9zZUludmFsaWRFeHByZXNzaW9ucyBpcyBpbXBvcnRhbnQgc28gdGhhdFxuICAgIC8vIHRoZSBjb2xsZWN0b3Igd2lsbCBjb2xsZWN0IGVycm9ycyBpbnN0ZWFkIG9mIHRocm93aW5nXG4gICAgdmVyYm9zZUludmFsaWRFeHByZXNzaW9uOiB0cnVlLFxuICB9KTtcblxuICByZWFkb25seSBkaXJlY3RvcnlFeGlzdHM/OiAoZGlyZWN0b3J5TmFtZTogc3RyaW5nKSA9PiBib29sZWFuO1xuICAvLyBSZXNvbHZlIGEgc3ltYm9saWMgbGluay5cbiAgcmVhbHBhdGg/OiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHRzTFNIb3N0OiB0cy5MYW5ndWFnZVNlcnZpY2VIb3N0LFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBnZXRQcm9ncmFtOiAoKSA9PiB0cy5Qcm9ncmFtKSB7XG4gICAgaWYgKHRzTFNIb3N0LmRpcmVjdG9yeUV4aXN0cykge1xuICAgICAgdGhpcy5kaXJlY3RvcnlFeGlzdHMgPSBkaXJlY3RvcnlOYW1lID0+IHRzTFNIb3N0LmRpcmVjdG9yeUV4aXN0cyEoZGlyZWN0b3J5TmFtZSk7XG4gICAgfVxuICAgIGlmICh0c0xTSG9zdC5yZWFscGF0aCkge1xuICAgICAgdGhpcy5yZWFscGF0aCA9IHBhdGggPT4gdHNMU0hvc3QucmVhbHBhdGghKHBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZpbGVFeGlzdHMoZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIFR5cGVTY3JpcHQgcmVzb2x1dGlvbiBsb2dpYyB3YWxrcyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgaW4gb3JkZXI6XG4gICAgLy8gcGFja2FnZS5qc29uIChyZWFkIFwidHlwZXNcIiBmaWVsZCkgLT4gLnRzIC0+IC50c3ggLT4gLmQudHNcbiAgICAvLyBGb3IgbW9yZSBpbmZvLCBzZWVcbiAgICAvLyBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9tb2R1bGUtcmVzb2x1dGlvbi5odG1sXG4gICAgLy8gRm9yIEFuZ3VsYXIgc3BlY2lmaWNhbGx5LCB3ZSBjYW4gc2tpcCAudHN4IGxvb2t1cFxuICAgIGlmIChmaWxlTmFtZS5lbmRzV2l0aCgnLnRzeCcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLnRzTFNIb3N0LmZpbGVFeGlzdHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnRzTFNIb3N0LmZpbGVFeGlzdHMoZmlsZU5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gISF0aGlzLnRzTFNIb3N0LmdldFNjcmlwdFNuYXBzaG90KGZpbGVOYW1lKTtcbiAgfVxuXG4gIHJlYWRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIHJlYWRGaWxlKCkgaXMgdXNlZCBieSBUeXBlU2NyaXB0IHRvIHJlYWQgcGFja2FnZS5qc29uIGR1cmluZyBtb2R1bGVcbiAgICAvLyByZXNvbHV0aW9uLCBhbmQgaXQncyB1c2VkIGJ5IEFuZ3VsYXIgdG8gcmVhZCBtZXRhZGF0YS5qc29uIGR1cmluZ1xuICAgIC8vIG1ldGFkYXRhIHJlc29sdXRpb24uXG4gICAgaWYgKHRoaXMudHNMU0hvc3QucmVhZEZpbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRzTFNIb3N0LnJlYWRGaWxlKGZpbGVOYW1lKSE7XG4gICAgfVxuICAgIC8vIEFzIGEgZmFsbGJhY2ssIHJlYWQgdGhlIEpTT04gZmlsZXMgZnJvbSB0aGUgZWRpdG9yIHNuYXBzaG90LlxuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy50c0xTSG9zdC5nZXRTY3JpcHRTbmFwc2hvdChmaWxlTmFtZSk7XG4gICAgaWYgKCFzbmFwc2hvdCkge1xuICAgICAgLy8gTWV0YWRhdGFSZWFkZXJIb3N0IHJlYWRGaWxlKCkgZGVjbGFyYXRpb24gc2hvdWxkIGJlXG4gICAgICAvLyBgcmVhZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZGBcbiAgICAgIHJldHVybiB1bmRlZmluZWQhO1xuICAgIH1cbiAgICByZXR1cm4gc25hcHNob3QuZ2V0VGV4dCgwLCBzbmFwc2hvdC5nZXRMZW5ndGgoKSk7XG4gIH1cblxuICBnZXRTb3VyY2VGaWxlTWV0YWRhdGEoZmlsZU5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHNmID0gdGhpcy5nZXRQcm9ncmFtKCkuZ2V0U291cmNlRmlsZShmaWxlTmFtZSk7XG4gICAgcmV0dXJuIHNmID8gdGhpcy5tZXRhZGF0YUNvbGxlY3Rvci5nZXRNZXRhZGF0YShzZikgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBjYWNoZU1ldGFkYXRhKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICAvLyBEb24ndCBjYWNoZSB0aGUgbWV0YWRhdGEgZm9yIC50cyBmaWxlcyBhcyB0aGV5IG1pZ2h0IGNoYW5nZSBpbiB0aGUgZWRpdG9yIVxuICAgIHJldHVybiBmaWxlTmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVmbGVjdG9ySG9zdCBpbXBsZW1lbnRzIFN0YXRpY1N5bWJvbFJlc29sdmVySG9zdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdEFkYXB0ZXI6IFJlZmxlY3Rvck1vZHVsZU1vZHVsZVJlc29sdXRpb25Ib3N0O1xuICBwcml2YXRlIHJlYWRvbmx5IG1ldGFkYXRhUmVhZGVyQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YVJlYWRlckNhY2hlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlUmVzb2x1dGlvbkNhY2hlOiB0cy5Nb2R1bGVSZXNvbHV0aW9uQ2FjaGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFrZUNvbnRhaW5pbmdQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZ2V0UHJvZ3JhbTogKCkgPT4gdHMuUHJvZ3JhbSwgcHJpdmF0ZSByZWFkb25seSB0c0xTSG9zdDogdHMuTGFuZ3VhZ2VTZXJ2aWNlSG9zdCkge1xuICAgIC8vIHRzTFNIb3N0LmdldEN1cnJlbnREaXJlY3RvcnkoKSByZXR1cm5zIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdHNjb25maWcuanNvblxuICAgIC8vIGlzIGxvY2F0ZWQuIFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHByb2Nlc3MuY3dkKCkgYmVjYXVzZSB0aGUgbGFuZ3VhZ2VcbiAgICAvLyBzZXJ2aWNlIGhvc3Qgc2V0cyB0aGUgXCJwcm9qZWN0IHJvb3QgcGF0aFwiIGFzIGl0cyBjdXJyZW50IGRpcmVjdG9yeS5cbiAgICBjb25zdCBjdXJyZW50RGlyID0gdHNMU0hvc3QuZ2V0Q3VycmVudERpcmVjdG9yeSgpO1xuICAgIHRoaXMuZmFrZUNvbnRhaW5pbmdQYXRoID0gY3VycmVudERpciA/IHBhdGguam9pbihjdXJyZW50RGlyLCAnZmFrZUNvbnRhaW5pbmdGaWxlLnRzJykgOiAnJztcbiAgICB0aGlzLmhvc3RBZGFwdGVyID0gbmV3IFJlZmxlY3Rvck1vZHVsZU1vZHVsZVJlc29sdXRpb25Ib3N0KHRzTFNIb3N0LCBnZXRQcm9ncmFtKTtcbiAgICB0aGlzLm1vZHVsZVJlc29sdXRpb25DYWNoZSA9IHRzLmNyZWF0ZU1vZHVsZVJlc29sdXRpb25DYWNoZShcbiAgICAgICAgY3VycmVudERpcixcbiAgICAgICAgcyA9PiBzLCAgLy8gZ2V0Q2Fub25pY2FsRmlsZU5hbWVcbiAgICAgICAgdHNMU0hvc3QuZ2V0Q29tcGlsYXRpb25TZXR0aW5ncygpKTtcbiAgfVxuXG4gIGdldE1ldGFkYXRhRm9yKG1vZHVsZVBhdGg6IHN0cmluZyk6IHtba2V5OiBzdHJpbmddOiBhbnl9W118dW5kZWZpbmVkIHtcbiAgICByZXR1cm4gcmVhZE1ldGFkYXRhKG1vZHVsZVBhdGgsIHRoaXMuaG9zdEFkYXB0ZXIsIHRoaXMubWV0YWRhdGFSZWFkZXJDYWNoZSk7XG4gIH1cblxuICBtb2R1bGVOYW1lVG9GaWxlTmFtZShtb2R1bGVOYW1lOiBzdHJpbmcsIGNvbnRhaW5pbmdGaWxlPzogc3RyaW5nKTogc3RyaW5nfG51bGwge1xuICAgIGlmICghY29udGFpbmluZ0ZpbGUpIHtcbiAgICAgIGlmIChtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc29sdXRpb24gb2YgcmVsYXRpdmUgcGF0aHMgcmVxdWlyZXMgYSBjb250YWluaW5nIGZpbGUuJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuZmFrZUNvbnRhaW5pbmdQYXRoKSB7XG4gICAgICAgIC8vIElmIGN1cnJlbnQgZGlyZWN0b3J5IGlzIGVtcHR5IHRoZW4gdGhlIGZpbGUgbXVzdCBiZWxvbmcgdG8gYW4gaW5mZXJyZWRcbiAgICAgICAgLy8gcHJvamVjdCAobm8gdHNjb25maWcuanNvbiksIGluIHdoaWNoIGNhc2UgaXQncyBub3QgcG9zc2libGUgdG8gcmVzb2x2ZVxuICAgICAgICAvLyB0aGUgbW9kdWxlIHdpdGhvdXQgdGhlIGNhbGxlciBleHBsaWNpdGx5IHByb3ZpZGluZyBhIGNvbnRhaW5pbmcgZmlsZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVzb2x2ZSAnJHttb2R1bGVOYW1lfScgd2l0aG91dCBhIGNvbnRhaW5pbmcgZmlsZS5gKTtcbiAgICAgIH1cbiAgICAgIGNvbnRhaW5pbmdGaWxlID0gdGhpcy5mYWtlQ29udGFpbmluZ1BhdGg7XG4gICAgfVxuICAgIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHRoaXMudHNMU0hvc3QuZ2V0Q29tcGlsYXRpb25TZXR0aW5ncygpO1xuICAgIGNvbnN0IHJlc29sdmVkID0gdHMucmVzb2x2ZU1vZHVsZU5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lLCBjb250YWluaW5nRmlsZSwgY29tcGlsZXJPcHRpb25zLCB0aGlzLmhvc3RBZGFwdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVSZXNvbHV0aW9uQ2FjaGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLnJlc29sdmVkTW9kdWxlO1xuICAgIHJldHVybiByZXNvbHZlZCA/IHJlc29sdmVkLnJlc29sdmVkRmlsZU5hbWUgOiBudWxsO1xuICB9XG5cbiAgZ2V0T3V0cHV0TmFtZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG59XG4iXX0=
\No newline at end of file