testcafe
Version:
Automated browser testing for the modern web development stack.
98 lines • 16 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.renderDiff = exports.markup = exports.removePreventModuleCachingSuffix = exports.shouldSkipCallsite = exports.replaceLeadingSpacesWithNbsp = exports.formatExpressionMessage = exports.formatSelectorCallstack = exports.formatUrl = exports.renderForbiddenCharsList = exports.SUBTITLES = void 0;
const dedent_1 = __importDefault(require("dedent"));
const lodash_1 = require("lodash");
const prevent_module_caching_suffix_1 = __importDefault(require("../../compiler/prevent-module-caching-suffix"));
const phase_1 = __importDefault(require("../../test-run/phase"));
const types_1 = require("../types");
exports.SUBTITLES = {
[phase_1.default.initial]: '',
[phase_1.default.inTestRunBeforeHook]: '<span class="subtitle">Error in testRun.before hook</span>\n',
[phase_1.default.inFixtureBeforeHook]: '<span class="subtitle">Error in fixture.before hook</span>\n',
[phase_1.default.inFixtureBeforeEachHook]: '<span class="subtitle">Error in fixture.beforeEach hook</span>\n',
[phase_1.default.inTestBeforeHook]: '<span class="subtitle">Error in test.before hook</span>\n',
[phase_1.default.inTest]: '',
[phase_1.default.inTestAfterHook]: '<span class="subtitle">Error in test.after hook</span>\n',
[phase_1.default.inFixtureAfterEachHook]: '<span class="subtitle">Error in fixture.afterEach hook</span>\n',
[phase_1.default.inFixtureAfterHook]: '<span class="subtitle">Error in fixture.after hook</span>\n',
[phase_1.default.inTestRunAfterHook]: '<span class="subtitle">Error in testRun.after hook</span>\n',
[phase_1.default.inRoleInitializer]: '<span class="subtitle">Error in Role initializer</span>\n',
[phase_1.default.inBookmarkRestore]: '<span class="subtitle">Error while restoring configuration after Role switch</span>\n',
[phase_1.default.pendingFinalization]: '',
};
function renderForbiddenCharsList(forbiddenCharsList) {
return forbiddenCharsList.map(charInfo => `\t"${charInfo.chars}" at index ${charInfo.index}\n`).join('');
}
exports.renderForbiddenCharsList = renderForbiddenCharsList;
function formatUrl(url) {
return `<a href="${url}">${url}</a>`;
}
exports.formatUrl = formatUrl;
function formatSelectorCallstack(apiFnChain, apiFnIndex, viewportWidth) {
if (typeof apiFnIndex === 'undefined')
return '';
const emptySpaces = 10;
const ellipsis = '...)';
const availableWidth = viewportWidth - emptySpaces;
return apiFnChain.map((apiFn, index) => {
let formattedApiFn = String.fromCharCode(160);
formattedApiFn += index === apiFnIndex ? '>' : ' ';
formattedApiFn += ' | ';
formattedApiFn += index !== 0 ? ' ' : '';
formattedApiFn += apiFn;
if (formattedApiFn.length > availableWidth)
return formattedApiFn.substr(0, availableWidth - emptySpaces) + ellipsis;
return formattedApiFn;
}).join('\n');
}
exports.formatSelectorCallstack = formatSelectorCallstack;
function formatExpressionMessage(expression, line, column) {
const expressionStr = (0, lodash_1.escape)(expression);
if (line === void 0 || column === void 0)
return expressionStr;
return `${expressionStr}\nat ${line}:${column}`;
}
exports.formatExpressionMessage = formatExpressionMessage;
function replaceLeadingSpacesWithNbsp(str) {
return str.replace(/^ +/mg, match => {
return (0, lodash_1.repeat)(' ', match.length);
});
}
exports.replaceLeadingSpacesWithNbsp = replaceLeadingSpacesWithNbsp;
function shouldSkipCallsite(err) {
return err.code === types_1.TEST_RUN_ERRORS.uncaughtNonErrorObjectInTestCode ||
err.code === types_1.TEST_RUN_ERRORS.unhandledPromiseRejection ||
err.code === types_1.TEST_RUN_ERRORS.uncaughtException;
}
exports.shouldSkipCallsite = shouldSkipCallsite;
function removePreventModuleCachingSuffix(err) {
return err.replace(new RegExp(`\\?${prevent_module_caching_suffix_1.default}=\\d*`, 'g'), '');
}
exports.removePreventModuleCachingSuffix = removePreventModuleCachingSuffix;
function markup(err, msgMarkup, errCallsite = '') {
msgMarkup = (0, dedent_1.default)(`${exports.SUBTITLES[err.testRunPhase]}<div class="message">${(0, dedent_1.default)(msgMarkup)}</div>`);
const browserStr = `\n\n<strong>Browser:</strong> <span class="user-agent">${err.userAgent}</span>`;
if (errCallsite)
msgMarkup += `${browserStr}\n\n${errCallsite}\n`;
else
msgMarkup += browserStr;
if (err.screenshotPath)
msgMarkup += `\n<div class="screenshot-info"><strong>Screenshot:</strong> <a class="screenshot-path">${(0, lodash_1.escape)(err.screenshotPath)}</a></div>`;
if (!shouldSkipCallsite(err)) {
const callsiteMarkup = err.getCallsiteMarkup();
if (callsiteMarkup)
msgMarkup += `\n\n${callsiteMarkup}`;
}
return removePreventModuleCachingSuffix(msgMarkup.replace(/\t/g, ' '.repeat(4)));
}
exports.markup = markup;
function renderDiff(diff) {
return diff ?
`<span class="diff-added">+ expected</span> <span class="diff-removed">- actual</span>\n\n${diff}` : ``;
}
exports.renderDiff = renderDiff;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXJyb3JzL3Rlc3QtcnVuL3V0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtQ0FBc0Q7QUFDdEQsaUhBQXlGO0FBQ3pGLGlFQUFrRDtBQUNsRCxvQ0FBMkM7QUFFOUIsUUFBQSxTQUFTLEdBQUc7SUFDckIsQ0FBQyxlQUFjLENBQUMsT0FBTyxDQUFDLEVBQWtCLEVBQUU7SUFDNUMsQ0FBQyxlQUFjLENBQUMsbUJBQW1CLENBQUMsRUFBTSw4REFBOEQ7SUFDeEcsQ0FBQyxlQUFjLENBQUMsbUJBQW1CLENBQUMsRUFBTSw4REFBOEQ7SUFDeEcsQ0FBQyxlQUFjLENBQUMsdUJBQXVCLENBQUMsRUFBRSxrRUFBa0U7SUFDNUcsQ0FBQyxlQUFjLENBQUMsZ0JBQWdCLENBQUMsRUFBUywyREFBMkQ7SUFDckcsQ0FBQyxlQUFjLENBQUMsTUFBTSxDQUFDLEVBQW1CLEVBQUU7SUFDNUMsQ0FBQyxlQUFjLENBQUMsZUFBZSxDQUFDLEVBQVUsMERBQTBEO0lBQ3BHLENBQUMsZUFBYyxDQUFDLHNCQUFzQixDQUFDLEVBQUcsaUVBQWlFO0lBQzNHLENBQUMsZUFBYyxDQUFDLGtCQUFrQixDQUFDLEVBQU8sNkRBQTZEO0lBQ3ZHLENBQUMsZUFBYyxDQUFDLGtCQUFrQixDQUFDLEVBQU8sNkRBQTZEO0lBQ3ZHLENBQUMsZUFBYyxDQUFDLGlCQUFpQixDQUFDLEVBQVEsMkRBQTJEO0lBQ3JHLENBQUMsZUFBYyxDQUFDLGlCQUFpQixDQUFDLEVBQVEsdUZBQXVGO0lBQ2pJLENBQUMsZUFBYyxDQUFDLG1CQUFtQixDQUFDLEVBQU0sRUFBRTtDQUMvQyxDQUFDO0FBRUYsU0FBZ0Isd0JBQXdCLENBQUUsa0JBQWtCO0lBQ3hELE9BQU8sa0JBQWtCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxRQUFRLENBQUMsS0FB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QkFBd0IsSUFBQSxnQkFBTSxFQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVwRyxNQUFNLFVBQVUsR0FBRywwREFBMEQsR0FBRyxDQUFDLFNBQVMsU0FBUyxDQUFDO0lBRXBHLElBQUksV0FBVztRQUNYLFNBQVMsSUFBSSxHQUFHLFVBQVUsT0FBTyxXQUFXLElBQUksQ0FBQzs7UUFFakQsU0FBUyxJQUFJLFVBQVUsQ0FBQztJQUU1QixJQUFJLEdBQUcsQ0FBQyxjQUFjO1FBQ2xCLFNBQVMsSUFBSSwwRkFBMEYsSUFBQSxlQUFVLEVBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUM7SUFFdEosSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQzFCLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRS9DLElBQUksY0FBYztZQUNkLFNBQVMsSUFBSSxPQUFPLGNBQWMsRUFBRSxDQUFDO0tBQzVDO0lBRUQsT0FBTyxnQ0FBZ0MsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRixDQUFDO0FBckJELHdCQXFCQztBQUVELFNBQWdCLFVBQVUsQ0FBRSxJQUFJO0lBQzVCLE9BQU8sSUFBSSxDQUFDLENBQUM7UUFDVCw0RkFBNEYsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNoSCxDQUFDO0FBSEQsZ0NBR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZGVkZW50IGZyb20gJ2RlZGVudCc7XG5pbXBvcnQgeyBlc2NhcGUgYXMgZXNjYXBlSHRtbCwgcmVwZWF0IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBQUkVWRU5UX01PRFVMRV9DQUNISU5HX1NVRkZJWCBmcm9tICcuLi8uLi9jb21waWxlci9wcmV2ZW50LW1vZHVsZS1jYWNoaW5nLXN1ZmZpeCc7XG5pbXBvcnQgVEVTVF9SVU5fUEhBU0UgZnJvbSAnLi4vLi4vdGVzdC1ydW4vcGhhc2UnO1xuaW1wb3J0IHsgVEVTVF9SVU5fRVJST1JTIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgU1VCVElUTEVTID0ge1xuICAgIFtURVNUX1JVTl9QSEFTRS5pbml0aWFsXTogICAgICAgICAgICAgICAgICcnLFxuICAgIFtURVNUX1JVTl9QSEFTRS5pblRlc3RSdW5CZWZvcmVIb29rXTogICAgICc8c3BhbiBjbGFzcz1cInN1YnRpdGxlXCI+RXJyb3IgaW4gdGVzdFJ1bi5iZWZvcmUgaG9vazwvc3Bhbj5cXG4nLFxuICAgIFtURVNUX1JVTl9QSEFTRS5pbkZpeHR1cmVCZWZvcmVIb29rXTogICAgICc8c3BhbiBjbGFzcz1cInN1YnRpdGxlXCI+RXJyb3IgaW4gZml4dHVyZS5iZWZvcmUgaG9vazwvc3Bhbj5cXG4nLFxuICAgIFtURVNUX1JVTl9QSEFTRS5pbkZpeHR1cmVCZWZvcmVFYWNoSG9va106ICc8c3BhbiBjbGFzcz1cInN1YnRpdGxlXCI+RXJyb3IgaW4gZml4dHVyZS5iZWZvcmVFYWNoIGhvb2s8L3NwYW4+XFxuJyxcbiAgICBbVEVTVF9SVU5fUEhBU0UuaW5UZXN0QmVmb3JlSG9va106ICAgICAgICAnPHNwYW4gY2xhc3M9XCJzdWJ0aXRsZVwiPkVycm9yIGluIHRlc3QuYmVmb3JlIGhvb2s8L3NwYW4+XFxuJyxcbiAgICBbVEVTVF9SVU5fUEhBU0UuaW5UZXN0XTogICAgICAgICAgICAgICAgICAnJyxcbiAgICBbVEVTVF9SVU5fUEhBU0UuaW5UZXN0QWZ0ZXJIb29rXTogICAgICAgICAnPHNwYW4gY2xhc3M9XCJzdWJ0aXRsZVwiPkVycm9yIGluIHRlc3QuYWZ0ZXIgaG9vazwvc3Bhbj5cXG4nLFxuICAgIFtURVNUX1JVTl9QSEFTRS5pbkZpeHR1cmVBZnRlckVhY2hIb29rXTogICc8c3BhbiBjbGFzcz1cInN1YnRpdGxlXCI+RXJyb3IgaW4gZml4dHVyZS5hZnRlckVhY2ggaG9vazwvc3Bhbj5cXG4nLFxuICAgIFtURVNUX1JVTl9QSEFTRS5pbkZpeHR1cmVBZnRlckhvb2tdOiAgICAgICc8c3BhbiBjbGFzcz1cInN1YnRpdGxlXCI+RXJyb3IgaW4gZml4dHVyZS5hZnRlciBob29rPC9zcGFuPlxcbicsXG4gICAgW1RFU1RfUlVOX1BIQVNFLmluVGVzdFJ1bkFmdGVySG9va106ICAgICAgJzxzcGFuIGNsYXNzPVwic3VidGl0bGVcIj5FcnJvciBpbiB0ZXN0UnVuLmFmdGVyIGhvb2s8L3NwYW4+XFxuJyxcbiAgICBbVEVTVF9SVU5fUEhBU0UuaW5Sb2xlSW5pdGlhbGl6ZXJdOiAgICAgICAnPHNwYW4gY2xhc3M9XCJzdWJ0aXRsZVwiPkVycm9yIGluIFJvbGUgaW5pdGlhbGl6ZXI8L3NwYW4+XFxuJyxcbiAgICBbVEVTVF9SVU5fUEhBU0UuaW5Cb29rbWFya1Jlc3RvcmVdOiAgICAgICAnPHNwYW4gY2xhc3M9XCJzdWJ0aXRsZVwiPkVycm9yIHdoaWxlIHJlc3RvcmluZyBjb25maWd1cmF0aW9uIGFmdGVyIFJvbGUgc3dpdGNoPC9zcGFuPlxcbicsXG4gICAgW1RFU1RfUlVOX1BIQVNFLnBlbmRpbmdGaW5hbGl6YXRpb25dOiAgICAgJycsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRm9yYmlkZGVuQ2hhcnNMaXN0IChmb3JiaWRkZW5DaGFyc0xpc3QpIHtcbiAgICByZXR1cm4gZm9yYmlkZGVuQ2hhcnNMaXN0Lm1hcChjaGFySW5mbyA9PiBgXFx0XCIke2NoYXJJbmZvLmNoYXJzfVwiIGF0IGluZGV4ICR7Y2hhckluZm8uaW5kZXh9XFxuYCkuam9pbignJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRVcmwgKHVybCkge1xuICAgIHJldHVybiBgPGEgaHJlZj1cIiR7dXJsfVwiPiR7dXJsfTwvYT5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0U2VsZWN0b3JDYWxsc3RhY2sgKGFwaUZuQ2hhaW4sIGFwaUZuSW5kZXgsIHZpZXdwb3J0V2lkdGgpIHtcbiAgICBpZiAodHlwZW9mIGFwaUZuSW5kZXggPT09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBlbXB0eVNwYWNlcyAgICA9IDEwO1xuICAgIGNvbnN0IGVsbGlwc2lzICAgICAgID0gJy4uLiknO1xuICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gdmlld3BvcnRXaWR0aCAtIGVtcHR5U3BhY2VzO1xuXG4gICAgcmV0dXJuIGFwaUZuQ2hhaW4ubWFwKChhcGlGbiwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IGZvcm1hdHRlZEFwaUZuID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApO1xuXG4gICAgICAgIGZvcm1hdHRlZEFwaUZuICs9IGluZGV4ID09PSBhcGlGbkluZGV4ID8gJz4nIDogJyAnO1xuICAgICAgICBmb3JtYXR0ZWRBcGlGbiArPSAnIHwgJztcbiAgICAgICAgZm9ybWF0dGVkQXBpRm4gKz0gaW5kZXggIT09IDAgPyAnICAnIDogJyc7XG4gICAgICAgIGZvcm1hdHRlZEFwaUZuICs9IGFwaUZuO1xuXG4gICAgICAgIGlmIChmb3JtYXR0ZWRBcGlGbi5sZW5ndGggPiBhdmFpbGFibGVXaWR0aClcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZWRBcGlGbi5zdWJzdHIoMCwgYXZhaWxhYmxlV2lkdGggLSBlbXB0eVNwYWNlcykgKyBlbGxpcHNpcztcblxuICAgICAgICByZXR1cm4gZm9ybWF0dGVkQXBpRm47XG4gICAgfSkuam9pbignXFxuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRFeHByZXNzaW9uTWVzc2FnZSAoZXhwcmVzc2lvbiwgbGluZSwgY29sdW1uKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvblN0ciA9IGVzY2FwZUh0bWwoZXhwcmVzc2lvbik7XG5cbiAgICBpZiAobGluZSA9PT0gdm9pZCAwIHx8IGNvbHVtbiA9PT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gZXhwcmVzc2lvblN0cjtcblxuICAgIHJldHVybiBgJHtleHByZXNzaW9uU3RyfVxcbmF0ICR7bGluZX06JHtjb2x1bW59YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VMZWFkaW5nU3BhY2VzV2l0aE5ic3AgKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvXiArL21nLCBtYXRjaCA9PiB7XG4gICAgICAgIHJldHVybiByZXBlYXQoJyZuYnNwOycsIG1hdGNoLmxlbmd0aCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTa2lwQ2FsbHNpdGUgKGVycikge1xuICAgIHJldHVybiBlcnIuY29kZSA9PT0gVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0Tm9uRXJyb3JPYmplY3RJblRlc3RDb2RlIHx8XG4gICAgICAgICAgIGVyci5jb2RlID09PSBURVNUX1JVTl9FUlJPUlMudW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbiB8fFxuICAgICAgICAgICBlcnIuY29kZSA9PT0gVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXhjZXB0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlUHJldmVudE1vZHVsZUNhY2hpbmdTdWZmaXggKGVycikge1xuICAgIHJldHVybiBlcnIucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxcPyR7UFJFVkVOVF9NT0RVTEVfQ0FDSElOR19TVUZGSVh9PVxcXFxkKmAsICdnJyksICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcmt1cCAoZXJyLCBtc2dNYXJrdXAsIGVyckNhbGxzaXRlID0gJycpIHtcbiAgICBtc2dNYXJrdXAgPSBkZWRlbnQoYCR7U1VCVElUTEVTW2Vyci50ZXN0UnVuUGhhc2VdfTxkaXYgY2xhc3M9XCJtZXNzYWdlXCI+JHtkZWRlbnQobXNnTWFya3VwKX08L2Rpdj5gKTtcblxuICAgIGNvbnN0IGJyb3dzZXJTdHIgPSBgXFxuXFxuPHN0cm9uZz5Ccm93c2VyOjwvc3Ryb25nPiA8c3BhbiBjbGFzcz1cInVzZXItYWdlbnRcIj4ke2Vyci51c2VyQWdlbnR9PC9zcGFuPmA7XG5cbiAgICBpZiAoZXJyQ2FsbHNpdGUpXG4gICAgICAgIG1zZ01hcmt1cCArPSBgJHticm93c2VyU3RyfVxcblxcbiR7ZXJyQ2FsbHNpdGV9XFxuYDtcbiAgICBlbHNlXG4gICAgICAgIG1zZ01hcmt1cCArPSBicm93c2VyU3RyO1xuXG4gICAgaWYgKGVyci5zY3JlZW5zaG90UGF0aClcbiAgICAgICAgbXNnTWFya3VwICs9IGBcXG48ZGl2IGNsYXNzPVwic2NyZWVuc2hvdC1pbmZvXCI+PHN0cm9uZz5TY3JlZW5zaG90Ojwvc3Ryb25nPiA8YSBjbGFzcz1cInNjcmVlbnNob3QtcGF0aFwiPiR7ZXNjYXBlSHRtbChlcnIuc2NyZWVuc2hvdFBhdGgpfTwvYT48L2Rpdj5gO1xuXG4gICAgaWYgKCFzaG91bGRTa2lwQ2FsbHNpdGUoZXJyKSkge1xuICAgICAgICBjb25zdCBjYWxsc2l0ZU1hcmt1cCA9IGVyci5nZXRDYWxsc2l0ZU1hcmt1cCgpO1xuXG4gICAgICAgIGlmIChjYWxsc2l0ZU1hcmt1cClcbiAgICAgICAgICAgIG1zZ01hcmt1cCArPSBgXFxuXFxuJHtjYWxsc2l0ZU1hcmt1cH1gO1xuICAgIH1cblxuICAgIHJldHVybiByZW1vdmVQcmV2ZW50TW9kdWxlQ2FjaGluZ1N1ZmZpeChtc2dNYXJrdXAucmVwbGFjZSgvXFx0L2csICcmbmJzcDsnLnJlcGVhdCg0KSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRGlmZiAoZGlmZikge1xuICAgIHJldHVybiBkaWZmID9cbiAgICAgICAgYDxzcGFuIGNsYXNzPVwiZGlmZi1hZGRlZFwiPisgZXhwZWN0ZWQ8L3NwYW4+IDxzcGFuIGNsYXNzPVwiZGlmZi1yZW1vdmVkXCI+LSBhY3R1YWw8L3NwYW4+XFxuXFxuJHtkaWZmfWAgOiBgYDtcbn1cbiJdfQ==