UNPKG

22.1 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6const path_1 = require("path");
7const debug_1 = __importDefault(require("debug"));
8const json5_1 = __importDefault(require("json5"));
9const lodash_1 = require("lodash");
10const promisified_functions_1 = require("../utils/promisified-functions");
11const option_1 = __importDefault(require("./option"));
12const option_source_1 = __importDefault(require("./option-source"));
13const resolve_path_relatively_cwd_1 = __importDefault(require("../utils/resolve-path-relatively-cwd"));
14const render_template_1 = __importDefault(require("../utils/render-template"));
15const warning_message_1 = __importDefault(require("../notifications/warning-message"));
16const log_1 = __importDefault(require("../cli/log"));
17const DEBUG_LOGGER = debug_1.default('testcafe:configuration');
18class Configuration {
19 constructor(configurationFileName) {
20 this._options = {};
21 this._filePath = Configuration._resolveFilePath(configurationFileName);
22 this._overriddenOptions = [];
23 }
24 static _fromObj(obj) {
25 const result = Object.create(null);
26 Object.entries(obj).forEach(([key, value]) => {
27 const option = new option_1.default(key, value);
28 result[key] = option;
29 });
30 return result;
31 }
32 static _showConsoleWarning(message) {
33 log_1.default.write(message);
34 }
35 static _showWarningForError(error, warningTemplate, ...args) {
36 const message = render_template_1.default(warningTemplate, ...args);
37 Configuration._showConsoleWarning(message);
38 DEBUG_LOGGER(message);
39 DEBUG_LOGGER(error);
40 }
41 static _resolveFilePath(path) {
42 if (!path)
43 return null;
44 return path_1.isAbsolute(path) ? path : resolve_path_relatively_cwd_1.default(path);
45 }
46 async init() {
47 this._overriddenOptions = [];
48 }
49 mergeOptions(options) {
50 Object.entries(options).map(([key, value]) => {
51 const option = this._ensureOption(key, value, option_source_1.default.Input);
52 if (value === void 0)
53 return;
54 this._setOptionValue(option, value);
55 });
56 }
57 mergeDeep(option, source) {
58 lodash_1.mergeWith(option.value, source, (targetValue, sourceValue, property) => {
59 this._addOverriddenOptionIfNecessary(targetValue, sourceValue, option.source, `${option.name}.${property}`);
60 return sourceValue !== void 0 ? sourceValue : targetValue;
61 });
62 }
63 getOption(key) {
64 if (!key)
65 return void 0;
66 const option = this._options[key];
67 if (!option)
68 return void 0;
69 return option.value;
70 }
71 getOptions() {
72 const result = Object.create(null);
73 Object.entries(this._options).forEach(([name, option]) => {
74 result[name] = option.value;
75 });
76 return result;
77 }
78 clone() {
79 return lodash_1.cloneDeep(this);
80 }
81 get filePath() {
82 return this._filePath;
83 }
84 async _load() {
85 if (!this.filePath)
86 return null;
87 if (!await this._isConfigurationFileExists())
88 return null;
89 const configurationFileContent = await this._readConfigurationFileContent();
90 if (!configurationFileContent)
91 return null;
92 return this._parseConfigurationFileContent(configurationFileContent);
93 }
94 async _isConfigurationFileExists() {
95 try {
96 await promisified_functions_1.stat(this.filePath);
97 return true;
98 }
99 catch (error) {
100 DEBUG_LOGGER(render_template_1.default(warning_message_1.default.cannotFindConfigurationFile, this.filePath, error.stack));
101 return false;
102 }
103 }
104 async _readConfigurationFileContent() {
105 try {
106 return await promisified_functions_1.readFile(this.filePath);
107 }
108 catch (error) {
109 Configuration._showWarningForError(error, warning_message_1.default.cannotReadConfigFile);
110 }
111 return null;
112 }
113 _parseConfigurationFileContent(configurationFileContent) {
114 try {
115 return json5_1.default.parse(configurationFileContent.toString());
116 }
117 catch (error) {
118 Configuration._showWarningForError(error, warning_message_1.default.cannotParseConfigFile, this._filePath);
119 }
120 return null;
121 }
122 _ensureArrayOption(name) {
123 const options = this._options[name];
124 if (!options)
125 return;
126 // NOTE: a hack to fix lodash type definitions
127 // @ts-ignore
128 options.value = lodash_1.castArray(options.value);
129 }
130 _ensureOption(name, value, source) {
131 let option = null;
132 if (name in this._options)
133 option = this._options[name];
134 else {
135 option = new option_1.default(name, value, source);
136 this._options[name] = option;
137 }
138 return option;
139 }
140 _ensureOptionWithValue(name, defaultValue, source) {
141 const option = this._ensureOption(name, defaultValue, source);
142 if (option.value !== void 0)
143 return;
144 option.value = defaultValue;
145 option.source = source;
146 }
147 _addOverriddenOptionIfNecessary(value1, value2, source, optionName) {
148 if (value1 === void 0 || value2 === void 0 || value1 === value2 || source !== option_source_1.default.Configuration)
149 return;
150 this._overriddenOptions.push(optionName);
151 }
152 _setOptionValue(option, value) {
153 if (lodash_1.isPlainObject(option.value) && lodash_1.isPlainObject(value))
154 this.mergeDeep(option, value);
155 else {
156 this._addOverriddenOptionIfNecessary(option.value, value, option.source, option.name);
157 option.value = value;
158 }
159 option.source = option_source_1.default.Input;
160 }
161}
162exports.default = Configuration;
163module.exports = exports.default;
164//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQWtDO0FBQ2xDLGtEQUEwQjtBQUMxQixrREFBMEI7QUFDMUIsbUNBQXdFO0FBQ3hFLDBFQUFnRTtBQUNoRSxzREFBOEI7QUFDOUIsb0VBQTJDO0FBQzNDLHVHQUE0RTtBQUM1RSwrRUFBc0Q7QUFDdEQsdUZBQWdFO0FBQ2hFLHFEQUE2QjtBQUc3QixNQUFNLFlBQVksR0FBRyxlQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUVyRCxNQUFxQixhQUFhO0lBSzlCLFlBQW9CLHFCQUFvQztRQUNwRCxJQUFJLENBQUMsUUFBUSxHQUFJLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRXZFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVTLE1BQU0sQ0FBQyxRQUFRLENBQUUsR0FBVztRQUNsQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRW5DLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLGdCQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXRDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRVMsTUFBTSxDQUFDLG1CQUFtQixDQUFFLE9BQWU7UUFDakQsYUFBRyxD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QUFtQixFQUFFLE1BQW9CLEVBQUUsVUFBa0I7UUFDekgsSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDLElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQyxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLHVCQUFZLENBQUMsYUFBYTtZQUNwRyxPQUFPO1FBRVgsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRVMsZUFBZSxDQUFFLE1BQWMsRUFBRSxLQUFrQjtRQUN6RCxJQUFJLHNCQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLHNCQUFhLENBQUMsS0FBSyxDQUFDO1lBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQWUsQ0FBQyxDQUFDO2FBQ3ZDO1lBQ0QsSUFBSSxDQUFDLCtCQUErQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXRGLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3hCO1FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyx1QkFBWSxDQUFDLEtBQUssQ0FBQztJQUN2QyxDQUFDO0NBQ0o7QUF4TUQsZ0NBd01DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNBYnNvbHV0ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBKU09ONSBmcm9tICdqc29uNSc7XG5pbXBvcnQgeyBjYXN0QXJyYXksIGNsb25lRGVlcCwgaXNQbGFpbk9iamVjdCwgbWVyZ2VXaXRoIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHN0YXQsIHJlYWRGaWxlIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzaWZpZWQtZnVuY3Rpb25zJztcbmltcG9ydCBPcHRpb24gZnJvbSAnLi9vcHRpb24nO1xuaW1wb3J0IE9wdGlvblNvdXJjZSBmcm9tICcuL29wdGlvbi1zb3VyY2UnO1xuaW1wb3J0IHJlc29sdmVQYXRoUmVsYXRpdmVseUN3ZCBmcm9tICcuLi91dGlscy9yZXNvbHZlLXBhdGgtcmVsYXRpdmVseS1jd2QnO1xuaW1wb3J0IHJlbmRlclRlbXBsYXRlIGZyb20gJy4uL3V0aWxzL3JlbmRlci10ZW1wbGF0ZSc7XG5pbXBvcnQgV0FSTklOR19NRVNTQUdFUyBmcm9tICcuLi9ub3RpZmljYXRpb25zL3dhcm5pbmctbWVzc2FnZSc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2NsaS9sb2cnO1xuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmNvbnN0IERFQlVHX0xPR0dFUiA9IGRlYnVnKCd0ZXN0Y2FmZTpjb25maWd1cmF0aW9uJyk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ3VyYXRpb24ge1xuICAgIHByb3RlY3RlZCBfb3B0aW9uczogRGljdGlvbmFyeTxPcHRpb24+O1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZmlsZVBhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgcHJvdGVjdGVkIF9vdmVycmlkZGVuT3B0aW9uczogc3RyaW5nW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGNvbmZpZ3VyYXRpb25GaWxlTmFtZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9vcHRpb25zICA9IHt9O1xuICAgICAgICB0aGlzLl9maWxlUGF0aCA9IENvbmZpZ3VyYXRpb24uX3Jlc29sdmVGaWxlUGF0aChjb25maWd1cmF0aW9uRmlsZU5hbWUpO1xuXG4gICAgICAgIHRoaXMuX292ZXJyaWRkZW5PcHRpb25zID0gW107XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfZnJvbU9iaiAob2JqOiBvYmplY3QpOiBEaWN0aW9uYXJ5PE9wdGlvbj4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9iaikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSBuZXcgT3B0aW9uKGtleSwgdmFsdWUpO1xuXG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IG9wdGlvbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9zaG93Q29uc29sZVdhcm5pbmcgKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBsb2cud3JpdGUobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3Nob3dXYXJuaW5nRm9yRXJyb3IgKGVycm9yOiBFcnJvciwgd2FybmluZ1RlbXBsYXRlOiBzdHJpbmcsIC4uLmFyZ3M6IFRlbXBsYXRlQXJndW1lbnRzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZW5kZXJUZW1wbGF0ZSh3YXJuaW5nVGVtcGxhdGUsIC4uLmFyZ3MpO1xuXG4gICAgICAgIENvbmZpZ3VyYXRpb24uX3Nob3dDb25zb2xlV2FybmluZyhtZXNzYWdlKTtcblxuICAgICAgICBERUJVR19MT0dHRVIobWVzc2FnZSk7XG4gICAgICAgIERFQlVHX0xPR0dFUihlcnJvcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3Jlc29sdmVGaWxlUGF0aCAocGF0aDogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAoIXBhdGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gaXNBYnNvbHV0ZShwYXRoKSA/IHBhdGggOiByZXNvbHZlUGF0aFJlbGF0aXZlbHlDd2QocGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGluaXQgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLl9vdmVycmlkZGVuT3B0aW9ucyA9IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBtZXJnZU9wdGlvbnMgKG9wdGlvbnM6IG9iamVjdCk6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhvcHRpb25zKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZW5zdXJlT3B0aW9uKGtleSwgdmFsdWUsIE9wdGlvblNvdXJjZS5JbnB1dCk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgdGhpcy5fc2V0T3B0aW9uVmFsdWUob3B0aW9uLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBtZXJnZURlZXAgKG9wdGlvbjogT3B0aW9uLCBzb3VyY2U6IG9iamVjdCk6IHZvaWQge1xuICAgICAgICBtZXJnZVdpdGgob3B0aW9uLnZhbHVlLCBzb3VyY2UsICh0YXJnZXRWYWx1ZTogT3B0aW9uVmFsdWUsIHNvdXJjZVZhbHVlOiBPcHRpb25WYWx1ZSwgcHJvcGVydHk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fYWRkT3ZlcnJpZGRlbk9wdGlvbklmTmVjZXNzYXJ5KHRhcmdldFZhbHVlLCBzb3VyY2VWYWx1ZSwgb3B0aW9uLnNvdXJjZSwgYCR7b3B0aW9uLm5hbWV9LiR7cHJvcGVydHl9YCk7XG5cbiAgICAgICAgICAgIHJldHVybiBzb3VyY2VWYWx1ZSAhPT0gdm9pZCAwID8gc291cmNlVmFsdWUgOiB0YXJnZXRWYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9wdGlvbiAoa2V5OiBzdHJpbmcpOiBPcHRpb25WYWx1ZSB7XG4gICAgICAgIGlmICgha2V5KVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcblxuICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9vcHRpb25zW2tleV07XG5cbiAgICAgICAgaWYgKCFvcHRpb24pXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuXG4gICAgICAgIHJldHVybiBvcHRpb24udmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9wdGlvbnMgKCk6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLl9vcHRpb25zKS5mb3JFYWNoKChbbmFtZSwgb3B0aW9uXSkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gb3B0aW9uLnZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBjbG9uZSAoKTogQ29uZmlndXJhdGlvbiB7XG4gICAgICAgIHJldHVybiBjbG9uZURlZXAodGhpcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWxlUGF0aCAoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWxlUGF0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2xvYWQgKCk6IFByb21pc2U8bnVsbCB8IG9iamVjdD4ge1xuICAgICAgICBpZiAoIXRoaXMuZmlsZVBhdGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuX2lzQ29uZmlndXJhdGlvbkZpbGVFeGlzdHMoKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25GaWxlQ29udGVudCA9IGF3YWl0IHRoaXMuX3JlYWRDb25maWd1cmF0aW9uRmlsZUNvbnRlbnQoKTtcblxuICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb25GaWxlQ29udGVudClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJzZUNvbmZpZ3VyYXRpb25GaWxlQ29udGVudChjb25maWd1cmF0aW9uRmlsZUNvbnRlbnQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBfaXNDb25maWd1cmF0aW9uRmlsZUV4aXN0cyAoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBzdGF0KHRoaXMuZmlsZVBhdGgpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIERFQlVHX0xPR0dFUihyZW5kZXJUZW1wbGF0ZShXQVJOSU5HX01FU1NBR0VTLmNhbm5vdEZpbmRDb25maWd1cmF0aW9uRmlsZSwgdGhpcy5maWxlUGF0aCwgZXJyb3Iuc3RhY2spKTtcblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9yZWFkQ29uZmlndXJhdGlvbkZpbGVDb250ZW50ICgpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWFkRmlsZSh0aGlzLmZpbGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uX3Nob3dXYXJuaW5nRm9yRXJyb3IoZXJyb3IsIFdBUk5JTkdfTUVTU0FHRVMuY2Fubm90UmVhZENvbmZpZ0ZpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VDb25maWd1cmF0aW9uRmlsZUNvbnRlbnQgKGNvbmZpZ3VyYXRpb25GaWxlQ29udGVudDogQnVmZmVyKTogb2JqZWN0IHwgbnVsbCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTjUucGFyc2UoY29uZmlndXJhdGlvbkZpbGVDb250ZW50LnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5fc2hvd1dhcm5pbmdGb3JFcnJvcihlcnJvciwgV0FSTklOR19NRVNTQUdFUy5jYW5ub3RQYXJzZUNvbmZpZ0ZpbGUsIHRoaXMuX2ZpbGVQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZW5zdXJlQXJyYXlPcHRpb24gKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fb3B0aW9uc1tuYW1lXTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gTk9URTogYSBoYWNrIHRvIGZpeCBsb2Rhc2ggdHlwZSBkZWZpbml0aW9uc1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG9wdGlvbnMudmFsdWUgPSBjYXN0QXJyYXkob3B0aW9ucy52YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9lbnN1cmVPcHRpb24gKG5hbWU6IHN0cmluZywgdmFsdWU6IE9wdGlvblZhbHVlLCBzb3VyY2U6IE9wdGlvblNvdXJjZSk6IE9wdGlvbiB7XG4gICAgICAgIGxldCBvcHRpb24gPSBudWxsO1xuXG4gICAgICAgIGlmIChuYW1lIGluIHRoaXMuX29wdGlvbnMpXG4gICAgICAgICAgICBvcHRpb24gPSB0aGlzLl9vcHRpb25zW25hbWVdO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbiA9IG5ldyBPcHRpb24obmFtZSwgdmFsdWUsIHNvdXJjZSk7XG5cbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnNbbmFtZV0gPSBvcHRpb247XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZW5zdXJlT3B0aW9uV2l0aFZhbHVlIChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogT3B0aW9uVmFsdWUsIHNvdXJjZTogT3B0aW9uU291cmNlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2Vuc3VyZU9wdGlvbihuYW1lLCBkZWZhdWx0VmFsdWUsIHNvdXJjZSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbi52YWx1ZSAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIG9wdGlvbi52YWx1ZSAgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIG9wdGlvbi5zb3VyY2UgPSBzb3VyY2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9hZGRPdmVycmlkZGVuT3B0aW9uSWZOZWNlc3NhcnkgKHZhbHVlMTogT3B0aW9uVmFsdWUsIHZhbHVlMjogT3B0aW9uVmFsdWUsIHNvdXJjZTogT3B0aW9uU291cmNlLCBvcHRpb25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlMSA9PT0gdm9pZCAwIHx8IHZhbHVlMiA9PT0gdm9pZCAwIHx8IHZhbHVlMSA9PT0gdmFsdWUyIHx8IHNvdXJjZSAhPT0gT3B0aW9uU291cmNlLkNvbmZpZ3VyYXRpb24pXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fb3ZlcnJpZGRlbk9wdGlvbnMucHVzaChvcHRpb25OYW1lKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3NldE9wdGlvblZhbHVlIChvcHRpb246IE9wdGlvbiwgdmFsdWU6IE9wdGlvblZhbHVlKTogdm9pZCB7XG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KG9wdGlvbi52YWx1ZSkgJiYgaXNQbGFpbk9iamVjdCh2YWx1ZSkpXG4gICAgICAgICAgICB0aGlzLm1lcmdlRGVlcChvcHRpb24sIHZhbHVlIGFzIG9iamVjdCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWRkT3ZlcnJpZGRlbk9wdGlvbklmTmVjZXNzYXJ5KG9wdGlvbi52YWx1ZSwgdmFsdWUsIG9wdGlvbi5zb3VyY2UsIG9wdGlvbi5uYW1lKTtcblxuICAgICAgICAgICAgb3B0aW9uLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24uc291cmNlID0gT3B0aW9uU291cmNlLklucHV0O1xuICAgIH1cbn1cbiJdfQ==
\No newline at end of file