testcafe
Version:
Automated browser testing for the modern web development stack.
116 lines • 18.1 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_1 = require("lodash");
const correct_file_path_1 = __importDefault(require("../utils/correct-file-path"));
const escape_user_agent_1 = __importDefault(require("../utils/escape-user-agent"));
const events_1 = __importDefault(require("events"));
const DATE_FORMAT = 'YYYY-MM-DD';
const TIME_FORMAT = 'HH-mm-ss';
const ERRORS_FOLDER = 'errors';
const PROBLEMATIC_PLACEHOLDER_VALUE = '';
const PLACEHOLDERS = {
DATE: '${DATE}',
TIME: '${TIME}',
TEST_INDEX: '${TEST_INDEX}',
FILE_INDEX: '${FILE_INDEX}',
QUARANTINE_ATTEMPT: '${QUARANTINE_ATTEMPT}',
FIXTURE: '${FIXTURE}',
TEST: '${TEST}',
USERAGENT: '${USERAGENT}',
BROWSER: '${BROWSER}',
BROWSER_VERSION: '${BROWSER_VERSION}',
OS: '${OS}',
OS_VERSION: '${OS_VERSION}',
TEST_ID: '${TEST_ID}',
RUN_ID: '${RUN_ID}'
};
const DEFAULT_PATH_PATTERN_FOR_REPORT = `${PLACEHOLDERS.DATE}_${PLACEHOLDERS.TIME}\\${PLACEHOLDERS.TEST_ID}\\` +
`${PLACEHOLDERS.RUN_ID}\\${PLACEHOLDERS.USERAGENT}\\${PLACEHOLDERS.FILE_INDEX}`;
const TEST_ID_TEMPLATE = data => data.testIndex ? `test-${data.testIndex}` : '';
const RUN_ID_TEMPLATE = data => data.quarantineAttempt ? `run-${data.quarantineAttempt}` : '';
class PathPattern extends events_1.default {
constructor(pattern, fileExtension, data) {
super();
this.pattern = this._ensurePattern(pattern);
this.data = this._addDefaultFields(data);
this.placeholderToDataMap = this._createPlaceholderToDataMap();
this.fileExtension = fileExtension;
}
_ensurePattern(pattern) {
if (pattern)
return pattern;
return DEFAULT_PATH_PATTERN_FOR_REPORT;
}
_addDefaultFields(data) {
const defaultFields = {
testId: TEST_ID_TEMPLATE(data),
runId: RUN_ID_TEMPLATE(data),
formattedDate: data.now.format(DATE_FORMAT),
formattedTime: data.now.format(TIME_FORMAT),
fileIndex: 1,
errorFileIndex: 1
};
return Object.assign({}, defaultFields, data);
}
_createPlaceholderToDataMap() {
return {
[PLACEHOLDERS.TEST_ID]: this.data.testId,
[PLACEHOLDERS.RUN_ID]: this.data.runId,
[PLACEHOLDERS.DATE]: this.data.formattedDate,
[PLACEHOLDERS.TIME]: this.data.formattedTime,
[PLACEHOLDERS.TEST_INDEX]: this.data.testIndex,
[PLACEHOLDERS.QUARANTINE_ATTEMPT]: this.data.quarantineAttempt || 1,
[PLACEHOLDERS.FIXTURE]: this.data.fixture,
[PLACEHOLDERS.TEST]: this.data.test,
[PLACEHOLDERS.FILE_INDEX]: forError => forError ? this.data.errorFileIndex : this.data.fileIndex,
[PLACEHOLDERS.USERAGENT]: this.data.parsedUserAgent.toString(),
[PLACEHOLDERS.BROWSER]: this.data.parsedUserAgent.family,
[PLACEHOLDERS.BROWSER_VERSION]: this.data.parsedUserAgent.toVersion(),
[PLACEHOLDERS.OS]: this.data.parsedUserAgent.os.family,
[PLACEHOLDERS.OS_VERSION]: this.data.parsedUserAgent.os.toVersion()
};
}
_buildPath(pattern, placeholderToDataMap, forError) {
let resultFilePath = pattern;
const problematicPlaceholders = [];
for (const placeholder in placeholderToDataMap) {
const findPlaceholderRegExp = new RegExp(lodash_1.escapeRegExp(placeholder), 'g');
resultFilePath = resultFilePath.replace(findPlaceholderRegExp, () => {
if (placeholder === PLACEHOLDERS.FILE_INDEX) {
const getFileIndexFn = placeholderToDataMap[placeholder];
let result = getFileIndexFn(forError);
if (forError)
result = `${ERRORS_FOLDER}\\${result}`;
return result;
}
else if (placeholder === PLACEHOLDERS.USERAGENT) {
const userAgent = placeholderToDataMap[placeholder];
return escape_user_agent_1.default(userAgent);
}
let calculatedValue = placeholderToDataMap[placeholder];
if (calculatedValue === null || calculatedValue === void 0) {
problematicPlaceholders.push(placeholder);
calculatedValue = PROBLEMATIC_PLACEHOLDER_VALUE;
}
return calculatedValue;
});
}
if (problematicPlaceholders.length)
this.emit('problematic-placeholders-found', { placeholders: problematicPlaceholders });
return resultFilePath;
}
getPath(forError) {
const path = this._buildPath(this.pattern, this.placeholderToDataMap, forError);
return correct_file_path_1.default(path, this.fileExtension);
}
// For testing purposes
static get PLACEHOLDERS() {
return PLACEHOLDERS;
}
}
exports.default = PathPattern;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC1wYXR0ZXJuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BhdGgtcGF0dGVybi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFrRDtBQUNsRCxtRkFBeUQ7QUFDekQsbUZBQXlEO0FBQ3pELG9EQUFrQztBQUVsQyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUM7QUFDakMsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDO0FBRS9CLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQztBQUUvQixNQUFNLDZCQUE2QixHQUFHLEVBQUUsQ0FBQztBQUV6QyxNQUFNLFlBQVksR0FBRztJQUNqQixJQUFJLEVBQWdCLFNBQVM7SUFDN0IsSUFBSSxFQUFnQixTQUFTO0lBQzdCLFVBQVUsRUFBVSxlQUFlO0lBQ25DLFVBQVUsRUFBVSxlQUFlO0lBQ25DLGtCQUFrQixFQUFFLHVCQUF1QjtJQUMzQyxPQUFPLEVBQWEsWUFBWTtJQUNoQyxJQUFJLEVBQWdCLFNBQVM7SUFDN0IsU0FBUyxFQUFXLGNBQWM7SUFDbEMsT0FBTyxFQUFhLFlBQVk7SUFDaEMsZUFBZSxFQUFLLG9CQUFvQjtJQUN4QyxFQUFFLEVBQWtCLE9BQU87SUFDM0IsVUFBVSxFQUFVLGVBQWU7SUFDbkMsT0FBTyxFQUFhLFlBQVk7SUFDaEMsTUFBTSxFQUFjLFdBQVc7Q0FDbEMsQ0FBQztBQUVGLE1BQU0sK0JBQStCLEdBQUcsR0FBRyxZQUFZLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSTtJQUN0RSxHQUFHLFlBQVksQ0FBQyxNQUFNLEtBQUssWUFBWSxDQUFDLFNBQVMsS0FBSyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7QUFFeEgsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFB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QWUsS0FBSyxJQUFJLElBQUksZUFBZSxLQUFLLEtBQUssQ0FBQyxFQUFFO29CQUN4RCx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBRTFDLGVBQWUsR0FBRyw2QkFBNkIsQ0FBQztpQkFDbkQ7Z0JBRUQsT0FBTyxlQUFlLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUVELElBQUksdUJBQXVCLENBQUMsTUFBTTtZQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLEVBQUUsWUFBWSxFQUFFLHVCQUF1QixFQUFFLENBQUMsQ0FBQztRQUUzRixPQUFPLGNBQWMsQ0FBQztJQUMxQixDQUFDO0lBRUQsT0FBTyxDQUFFLFFBQVE7UUFDYixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWhGLE9BQU8sMkJBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsTUFBTSxLQUFLLFlBQVk7UUFDbkIsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztDQUNKO0FBckdELDhCQXFHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVzY2FwZVJlZ0V4cCBhcyBlc2NhcGVSZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgY29ycmVjdEZpbGVQYXRoIGZyb20gJy4uL3V0aWxzL2NvcnJlY3QtZmlsZS1wYXRoJztcbmltcG9ydCBlc2NhcGVVc2VyQWdlbnQgZnJvbSAnLi4vdXRpbHMvZXNjYXBlLXVzZXItYWdlbnQnO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnO1xuXG5jb25zdCBEQVRFX0ZPUk1BVCA9ICdZWVlZLU1NLUREJztcbmNvbnN0IFRJTUVfRk9STUFUID0gJ0hILW1tLXNzJztcblxuY29uc3QgRVJST1JTX0ZPTERFUiA9ICdlcnJvcnMnO1xuXG5jb25zdCBQUk9CTEVNQVRJQ19QTEFDRUhPTERFUl9WQUxVRSA9ICcnO1xuXG5jb25zdCBQTEFDRUhPTERFUlMgPSB7XG4gICAgREFURTogICAgICAgICAgICAgICAnJHtEQVRFfScsXG4gICAgVElNRTogICAgICAgICAgICAgICAnJHtUSU1FfScsXG4gICAgVEVTVF9JTkRFWDogICAgICAgICAnJHtURVNUX0lOREVYfScsXG4gICAgRklMRV9JTkRFWDogICAgICAgICAnJHtGSUxFX0lOREVYfScsXG4gICAgUVVBUkFOVElORV9BVFRFTVBUOiAnJHtRVUFSQU5USU5FX0FUVEVNUFR9JyxcbiAgICBGSVhUVVJFOiAgICAgICAgICAgICcke0ZJWFRVUkV9JyxcbiAgICBURVNUOiAgICAgICAgICAgICAgICcke1RFU1R9JyxcbiAgICBVU0VSQUdFTlQ6ICAgICAgICAgICcke1VTRVJBR0VOVH0nLFxuICAgIEJST1dTRVI6ICAgICAgICAgICAgJyR7QlJPV1NFUn0nLFxuICAgIEJST1dTRVJfVkVSU0lPTjogICAgJyR7QlJPV1NFUl9WRVJTSU9OfScsXG4gICAgT1M6ICAgICAgICAgICAgICAgICAnJHtPU30nLFxuICAgIE9TX1ZFUlNJT046ICAgICAgICAgJyR7T1NfVkVSU0lPTn0nLFxuICAgIFRFU1RfSUQ6ICAgICAgICAgICAgJyR7VEVTVF9JRH0nLFxuICAgIFJVTl9JRDogICAgICAgICAgICAgJyR7UlVOX0lEfSdcbn07XG5cbmNvbnN0IERFRkFVTFRfUEFUSF9QQVRURVJOX0ZPUl9SRVBPUlQgPSBgJHtQTEFDRUhPTERFUlMuREFURX1fJHtQTEFDRUhPTERFUlMuVElNRX1cXFxcJHtQTEFDRUhPTERFUlMuVEVTVF9JRH1cXFxcYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7UExBQ0VIT0xERVJTLlJVTl9JRH1cXFxcJHtQTEFDRUhPTERFUlMuVVNFUkFHRU5UfVxcXFwke1BMQUNFSE9MREVSUy5GSUxFX0lOREVYfWA7XG5cbmNvbnN0IFRFU1RfSURfVEVNUExBVEUgPSBkYXRhID0+IGRhdGEudGVzdEluZGV4ID8gYHRlc3QtJHtkYXRhLnRlc3RJbmRleH1gIDogJyc7XG5jb25zdCBSVU5fSURfVEVNUExBVEUgID0gZGF0YSA9PiBkYXRhLnF1YXJhbnRpbmVBdHRlbXB0ID8gYHJ1bi0ke2RhdGEucXVhcmFudGluZUF0dGVtcHR9YCA6ICcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXRoUGF0dGVybiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IgKHBhdHRlcm4sIGZpbGVFeHRlbnNpb24sIGRhdGEpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLnBhdHRlcm4gICAgICAgICAgICAgID0gdGhpcy5fZW5zdXJlUGF0dGVybihwYXR0ZXJuKTtcbiAgICAgICAgdGhpcy5kYXRhICAgICAgICAgICAgICAgICA9IHRoaXMuX2FkZERlZmF1bHRGaWVsZHMoZGF0YSk7XG4gICAgICAgIHRoaXMucGxhY2Vob2xkZXJUb0RhdGFNYXAgPSB0aGlzLl9jcmVhdGVQbGFjZWhvbGRlclRvRGF0YU1hcCgpO1xuICAgICAgICB0aGlzLmZpbGVFeHRlbnNpb24gICAgICAgID0gZmlsZUV4dGVuc2lvbjtcbiAgICB9XG5cbiAgICBfZW5zdXJlUGF0dGVybiAocGF0dGVybikge1xuICAgICAgICBpZiAocGF0dGVybilcbiAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuO1xuXG4gICAgICAgIHJldHVybiBERUZBVUxUX1BBVEhfUEFUVEVSTl9GT1JfUkVQT1JUO1xuICAgIH1cblxuICAgIF9hZGREZWZhdWx0RmllbGRzIChkYXRhKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRGaWVsZHMgPSB7XG4gICAgICAgICAgICB0ZXN0SWQ6ICAgICAgICAgVEVTVF9JRF9URU1QTEFURShkYXRhKSxcbiAgICAgICAgICAgIHJ1bklkOiAgICAgICAgICBSVU5fSURfVEVNUExBVEUoZGF0YSksXG4gICAgICAgICAgICBmb3JtYXR0ZWREYXRlOiAgZGF0YS5ub3cuZm9ybWF0KERBVEVfRk9STUFUKSxcbiAgICAgICAgICAgIGZvcm1hdHRlZFRpbWU6ICBkYXRhLm5vdy5mb3JtYXQoVElNRV9GT1JNQVQpLFxuICAgICAgICAgICAgZmlsZUluZGV4OiAgICAgIDEsXG4gICAgICAgICAgICBlcnJvckZpbGVJbmRleDogMVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0RmllbGRzLCBkYXRhKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlUGxhY2Vob2xkZXJUb0RhdGFNYXAgKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5URVNUX0lEXTogICAgICAgICAgICB0aGlzLmRhdGEudGVzdElkLFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5SVU5fSURdOiAgICAgICAgICAgICB0aGlzLmRhdGEucnVuSWQsXG4gICAgICAgICAgICBbUExBQ0VIT0xERVJTLkRBVEVdOiAgICAgICAgICAgICAgIHRoaXMuZGF0YS5mb3JtYXR0ZWREYXRlLFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5USU1FXTogICAgICAgICAgICAgICB0aGlzLmRhdGEuZm9ybWF0dGVkVGltZSxcbiAgICAgICAgICAgIFtQTEFDRUhPTERFUlMuVEVTVF9JTkRFWF06ICAgICAgICAgdGhpcy5kYXRhLnRlc3RJbmRleCxcbiAgICAgICAgICAgIFtQTEFDRUhPTERFUlMuUVVBUkFOVElORV9BVFRFTVBUXTogdGhpcy5kYXRhLnF1YXJhbnRpbmVBdHRlbXB0IHx8IDEsXG4gICAgICAgICAgICBbUExBQ0VIT0xERVJTLkZJWFRVUkVdOiAgICAgICAgICAgIHRoaXMuZGF0YS5maXh0dXJlLFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5URVNUXTogICAgICAgICAgICAgICB0aGlzLmRhdGEudGVzdCxcbiAgICAgICAgICAgIFtQTEFDRUhPTERFUlMuRklMRV9JTkRFWF06ICAgICAgICAgZm9yRXJyb3IgPT4gZm9yRXJyb3IgPyB0aGlzLmRhdGEuZXJyb3JGaWxlSW5kZXggOiB0aGlzLmRhdGEuZmlsZUluZGV4LFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5VU0VSQUdFTlRdOiAgICAgICAgICB0aGlzLmRhdGEucGFyc2VkVXNlckFnZW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBbUExBQ0VIT0xERVJTLkJST1dTRVJdOiAgICAgICAgICAgIHRoaXMuZGF0YS5wYXJzZWRVc2VyQWdlbnQuZmFtaWx5LFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5CUk9XU0VSX1ZFUlNJT05dOiAgICB0aGlzLmRhdGEucGFyc2VkVXNlckFnZW50LnRvVmVyc2lvbigpLFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5PU106ICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucGFyc2VkVXNlckFnZW50Lm9zLmZhbWlseSxcbiAgICAgICAgICAgIFtQTEFDRUhPTERFUlMuT1NfVkVSU0lPTl06ICAgICAgICAgdGhpcy5kYXRhLnBhcnNlZFVzZXJBZ2VudC5vcy50b1ZlcnNpb24oKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIF9idWlsZFBhdGggKHBhdHRlcm4sIHBsYWNlaG9sZGVyVG9EYXRhTWFwLCBmb3JFcnJvcikge1xuICAgICAgICBsZXQgcmVzdWx0RmlsZVBhdGggICAgICAgICAgICA9IHBhdHRlcm47XG4gICAgICAgIGNvbnN0IHByb2JsZW1hdGljUGxhY2Vob2xkZXJzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBwbGFjZWhvbGRlciBpbiBwbGFjZWhvbGRlclRvRGF0YU1hcCkge1xuICAgICAgICAgICAgY29uc3QgZmluZFBsYWNlaG9sZGVyUmVnRXhwID0gbmV3IFJlZ0V4cChlc2NhcGVSZShwbGFjZWhvbGRlciksICdnJyk7XG5cbiAgICAgICAgICAgIHJlc3VsdEZpbGVQYXRoID0gcmVzdWx0RmlsZVBhdGgucmVwbGFjZShmaW5kUGxhY2Vob2xkZXJSZWdFeHAsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGxhY2Vob2xkZXIgPT09IFBMQUNFSE9MREVSUy5GSUxFX0lOREVYKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdldEZpbGVJbmRleEZuID0gcGxhY2Vob2xkZXJUb0RhdGFNYXBbcGxhY2Vob2xkZXJdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ICAgICAgICAgICA9IGdldEZpbGVJbmRleEZuKGZvckVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9yRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBgJHtFUlJPUlNfRk9MREVSfVxcXFwke3Jlc3VsdH1gO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGxhY2Vob2xkZXIgPT09IFBMQUNFSE9MREVSUy5VU0VSQUdFTlQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckFnZW50ID0gcGxhY2Vob2xkZXJUb0RhdGFNYXBbcGxhY2Vob2xkZXJdO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVVc2VyQWdlbnQodXNlckFnZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgY2FsY3VsYXRlZFZhbHVlID0gcGxhY2Vob2xkZXJUb0RhdGFNYXBbcGxhY2Vob2xkZXJdO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNhbGN1bGF0ZWRWYWx1ZSA9PT0gbnVsbCB8fCBjYWxjdWxhdGVkVmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgICAgICBwcm9ibGVtYXRpY1BsYWNlaG9sZGVycy5wdXNoKHBsYWNlaG9sZGVyKTtcblxuICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkVmFsdWUgPSBQUk9CTEVNQVRJQ19QTEFDRUhPTERFUl9WQUxVRTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsY3VsYXRlZFZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvYmxlbWF0aWNQbGFjZWhvbGRlcnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdwcm9ibGVtYXRpYy1wbGFjZWhvbGRlcnMtZm91bmQnLCB7IHBsYWNlaG9sZGVyczogcHJvYmxlbWF0aWNQbGFjZWhvbGRlcnMgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdEZpbGVQYXRoO1xuICAgIH1cblxuICAgIGdldFBhdGggKGZvckVycm9yKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLl9idWlsZFBhdGgodGhpcy5wYXR0ZXJuLCB0aGlzLnBsYWNlaG9sZGVyVG9EYXRhTWFwLCBmb3JFcnJvcik7XG5cbiAgICAgICAgcmV0dXJuIGNvcnJlY3RGaWxlUGF0aChwYXRoLCB0aGlzLmZpbGVFeHRlbnNpb24pO1xuICAgIH1cblxuICAgIC8vIEZvciB0ZXN0aW5nIHB1cnBvc2VzXG4gICAgc3RhdGljIGdldCBQTEFDRUhPTERFUlMgKCkge1xuICAgICAgICByZXR1cm4gUExBQ0VIT0xERVJTO1xuICAgIH1cbn1cbiJdfQ==