@zodiac-ui/editor
Version:
A rich text editor for Angular based on `@atlaskit/editor-core`.
125 lines • 17.9 kB
JavaScript
import * as LinkifyItNs from 'linkify-it';
import { mapSlice } from "../../lib/utils/map-slice";
const LinkifyIt = LinkifyItNs;
export const LINK_REGEXP = /(https?|ftp):\/\/[^\s]+/;
const linkify = LinkifyIt();
linkify.add('sourcetree:', 'http:');
const tlds = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|');
const tlds2Char = 'a[cdefgilmnoqrtuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrtuvwxyz]|n[acefgilopruz]|om|p[aefghkmnrtw]|qa|r[eosuw]|s[abcdegijklmnrtuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]';
tlds.push(tlds2Char);
linkify.tlds(tlds, false);
export function getLinkMatch(str) {
if (!str) {
return null;
}
let match = linkifyMatch(str);
if (!match.length) {
match = linkify.match(str);
}
return match && match[0];
}
const endsWithSpace = new RegExp("\\s$");
/**
* Instance of class LinkMatcher are used in autoformatting in place of Regex.
* Hence it has been made similar to regex with an exec method.
* Extending it directly from class Regex was introducing some issues, thus that has been avoided.
*/
export class LinkMatcher {
exec(str) {
if (endsWithSpace.test(str)) {
const chunks = str.slice(0, str.length - 1).split(' ');
const lastChunk = chunks[chunks.length - 1];
const links = linkify.match(lastChunk);
if (links && links.length > 0) {
const lastLink = links[links.length - 1];
lastLink.input = lastChunk;
lastLink.length = lastLink.lastIndex - lastLink.index + 1;
return [lastLink];
}
}
return null;
}
}
/**
* Adds protocol to url if needed.
*/
export function normalizeUrl(url) {
if (LINK_REGEXP.test(url)) {
return url;
}
const match = getLinkMatch(url);
return (match && match.url) || url;
}
export function linkifyContent(schema) {
return (slice) => mapSlice(slice, (node, parent) => {
const isAllowedInParent = !parent || parent.type !== schema.nodes.codeBlock;
if (isAllowedInParent && node.isText) {
const linkified = [];
const link = node.type.schema.marks['link'];
const text = node.text;
const matches = findLinkMatches(text);
let pos = 0;
matches.forEach(match => {
if (match.start > 0) {
linkified.push(node.cut(pos, match.start));
}
linkified.push(node
.cut(match.start, match.end)
.mark(link
.create({ href: normalizeUrl(match.href) })
.addToSet(node.marks)));
pos = match.end;
});
if (pos < text.length) {
linkified.push(node.cut(pos));
}
return linkified;
}
return node;
});
}
function findLinkMatches(text) {
const matches = [];
const linkMatches = text && linkify.match(text);
if (linkMatches && linkMatches.length > 0) {
linkMatches.forEach(match => {
matches.push({
start: match.index,
end: match.lastIndex,
title: match.raw,
href: match.url,
});
});
}
return matches;
}
export const linkifyMatch = (text) => {
const matches = [];
if (!LINK_REGEXP.test(text)) {
return matches;
}
let startpos = 0;
let substr;
while ((substr = text.substr(startpos))) {
const link = (substr.match(LINK_REGEXP) || [''])[0];
if (link) {
const index = substr.search(LINK_REGEXP);
const start = index >= 0 ? index + startpos : index;
const end = start + link.length;
matches.push({
index: start,
lastIndex: end,
raw: link,
url: link,
text: link,
schema: '',
});
startpos += end;
}
else {
break;
}
}
return matches;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aem9kaWFjLXVpL2VkaXRvci8iLCJzb3VyY2VzIjpbInBsdWdpbnMvbGluay91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssV0FBVyxNQUFNLFlBQVksQ0FBQztBQUMxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFcEQsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFBO0FBRTdCLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyx5QkFBeUIsQ0FBQztBQWFyRCxNQUFNLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztBQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUVwQyxNQUFNLElBQUksR0FBRyw2RUFBNkUsQ0FBQyxLQUFLLENBQzVGLEdBQUcsQ0FDTixDQUFDO0FBQ0YsTUFBTSxTQUFTLEdBQ1gsa1ZBQWtWLENBQUM7QUFDdlYsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUUxQixNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQVc7SUFDcEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNOLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFDRCxJQUFJLEtBQUssR0FBMEIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1FBQ2YsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDOUI7SUFDRCxPQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELE1BQU0sYUFBYSxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBRXhDOzs7O0dBSUc7QUFDSCxNQUFN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UUFDckMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRCxJQUFJLElBQUksRUFBRTtZQUNOLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekMsTUFBTSxLQUFLLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3BELE1BQU0sR0FBRyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osU0FBUyxFQUFFLEdBQUc7Z0JBQ2QsR0FBRyxFQUFFLElBQUk7Z0JBQ1QsR0FBRyxFQUFFLElBQUk7Z0JBQ1QsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsTUFBTSxFQUFFLEVBQUU7YUFDYixDQUFDLENBQUM7WUFDSCxRQUFRLElBQUksR0FBRyxDQUFDO1NBQ25CO2FBQU07WUFDSCxNQUFNO1NBQ1Q7S0FDSjtJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNsaWNlLCBOb2RlLCBTY2hlbWEgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XHJcbmltcG9ydCAqIGFzIExpbmtpZnlJdE5zIGZyb20gJ2xpbmtpZnktaXQnO1xyXG5pbXBvcnQgeyBtYXBTbGljZSB9IGZyb20gXCIuLi8uLi9saWIvdXRpbHMvbWFwLXNsaWNlXCJcclxuXHJcbmNvbnN0IExpbmtpZnlJdCA9IExpbmtpZnlJdE5zXHJcblxyXG5leHBvcnQgY29uc3QgTElOS19SRUdFWFAgPSAvKGh0dHBzP3xmdHApOlxcL1xcL1teXFxzXSsvO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNYXRjaCB7XHJcbiAgICBzY2hlbWE6IGFueTtcclxuICAgIGluZGV4OiBudW1iZXI7XHJcbiAgICBsYXN0SW5kZXg6IG51bWJlcjtcclxuICAgIHJhdzogc3RyaW5nO1xyXG4gICAgdGV4dDogc3RyaW5nO1xyXG4gICAgdXJsOiBzdHJpbmc7XHJcbiAgICBsZW5ndGg/OiBudW1iZXI7XHJcbiAgICBpbnB1dD86IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgbGlua2lmeSA9IExpbmtpZnlJdCgpO1xyXG5saW5raWZ5LmFkZCgnc291cmNldHJlZTonLCAnaHR0cDonKTtcclxuXHJcbmNvbnN0IHRsZHMgPSAnYml6fGNvbXxlZHV8Z292fG5ldHxvcmd8cHJvfHdlYnx4eHh8YWVyb3xhc2lhfGNvb3B8aW5mb3xtdXNldW18bmFtZXxzaG9wfNGA0YQnLnNwbGl0KFxyXG4gICAgJ3wnLFxyXG4pO1xyXG5jb25zdCB0bGRzMkNoYXIgPVxyXG4gICAgJ2FbY2RlZmdpbG1ub3FydHV3eHpdfGJbYWJkZWZnaGlqbW5vcnN0dnd5el18Y1thY2RmZ2hpa2xtbm9ydXZ3eHl6XXxkW2Vqa21vel18ZVtjZWdyc3R1XXxmW2lqa21vcl18Z1thYmRlZmdoaWxtbnBxcnN0dXd5XXxoW2ttbnJ0dV18aVtkZWxtbm9xcnN0XXxqW2Vtb3BdfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfG1bYWNkZWdoa2xtbm9wcXJ0dXZ3eHl6XXxuW2FjZWZnaWxvcHJ1el18b218cFthZWZnaGttbnJ0d118cWF8cltlb3N1d118c1thYmNkZWdpamtsbW5ydHV2eHl6XXx0W2NkZmdoamtsbW5vcnR2d3pdfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfHlbZXRdfHpbYW13XSc7XHJcbnRsZHMucHVzaCh0bGRzMkNoYXIpO1xyXG5saW5raWZ5LnRsZHModGxkcywgZmFsc2UpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmtNYXRjaChzdHI6IHN0cmluZyk6IE1hdGNoIHwgTGlua2lmeU1hdGNoIHwgbnVsbCB7XHJcbiAgICBpZiAoIXN0cikge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgbGV0IG1hdGNoOiBudWxsIHwgTGlua2lmeU1hdGNoW10gPSBsaW5raWZ5TWF0Y2goc3RyKTtcclxuICAgIGlmICghbWF0Y2gubGVuZ3RoKSB7XHJcbiAgICAgICAgbWF0Y2ggPSBsaW5raWZ5Lm1hdGNoKHN0cik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMF07XHJcbn1cclxuXHJcbmNvbnN0IGVuZHNXaXRoU3BhY2UgPSBuZXcgUmVnRXhwKFwiXFxcXHMkXCIpXHJcblxyXG4vKipcclxuICogSW5zdGFuY2Ugb2YgY2xhc3MgTGlua01hdGNoZXIgYXJlIHVzZWQgaW4gYXV0b2Zvcm1hdHRpbmcgaW4gcGxhY2Ugb2YgUmVnZXguXHJcbiAqIEhlbmNlIGl0IGhhcyBiZWVuIG1hZGUgc2ltaWxhciB0byByZWdleCB3aXRoIGFuIGV4ZWMgbWV0aG9kLlxyXG4gKiBFeHRlbmRpbmcgaXQgZGlyZWN0bHkgZnJvbSBjbGFzcyBSZWdleCB3YXMgaW50cm9kdWNpbmcgc29tZSBpc3N1ZXMsIHRodXMgdGhhdCBoYXMgYmVlbiBhdm9pZGVkLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExpbmtNYXRjaGVyIHtcclxuICAgIGV4ZWMoc3RyOiBzdHJpbmcpOiBNYXRjaFtdIHwgbnVsbCB7XHJcbiAgICAgICAgaWYgKGVuZHNXaXRoU3BhY2UudGVzdChzdHIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNodW5rcyA9IHN0ci5zbGljZSgwLCBzdHIubGVuZ3RoIC0gMSkuc3BsaXQoJyAnKTtcclxuICAgICAgICAgICAgY29uc3QgbGFzdENodW5rID0gY2h1bmtzW2NodW5rcy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgY29uc3QgbGlua3M6IG51bGwgfCBNYXRjaFtdID0gbGlua2lmeS5tYXRjaChsYXN0Q2h1bmspO1xyXG4gICAgICAgICAgICBpZiAobGlua3MgJiYgbGlua3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdExpbms6IE1hdGNoID0gbGlua3NbbGlua3MubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICBsYXN0TGluay5pbnB1dCA9IGxhc3RDaHVuaztcclxuICAgICAgICAgICAgICAgIGxhc3RMaW5rLmxlbmd0aCA9IGxhc3RMaW5rLmxhc3RJbmRleCAtIGxhc3RMaW5rLmluZGV4ICsgMTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbbGFzdExpbmtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQWRkcyBwcm90b2NvbCB0byB1cmwgaWYgbmVlZGVkLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVVybCh1cmw6IHN0cmluZykge1xyXG4gICAgaWYgKExJTktfUkVHRVhQLnRlc3QodXJsKSkge1xyXG4gICAgICAgIHJldHVybiB1cmw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtYXRjaCA9IGdldExpbmtNYXRjaCh1cmwpO1xyXG4gICAgcmV0dXJuIChtYXRjaCAmJiBtYXRjaC51cmwpIHx8IHVybDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtpZnlDb250ZW50KHNjaGVtYTogU2NoZW1hKTogKHNsaWNlOiBTbGljZSkgPT4gU2xpY2Uge1xyXG4gICAgcmV0dXJuIChzbGljZTogU2xpY2UpOiBTbGljZSA9PlxyXG4gICAgICAgIG1hcFNsaWNlKHNsaWNlLCAobm9kZSwgcGFyZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQWxsb3dlZEluUGFyZW50ID1cclxuICAgICAgICAgICAgICAgICFwYXJlbnQgfHwgcGFyZW50LnR5cGUgIT09IHNjaGVtYS5ub2Rlcy5jb2RlQmxvY2s7XHJcbiAgICAgICAgICAgIGlmIChpc0FsbG93ZWRJblBhcmVudCAmJiBub2RlLmlzVGV4dCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGlua2lmaWVkID0gW10gYXMgTm9kZVtdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGluayA9IG5vZGUudHlwZS5zY2hlbWEubWFya3NbJ2xpbmsnXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBub2RlLnRleHQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVzOiBhbnlbXSA9IGZpbmRMaW5rTWF0Y2hlcyh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIGxldCBwb3MgPSAwO1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hlcy5mb3JFYWNoKG1hdGNoID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2guc3RhcnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtpZmllZC5wdXNoKG5vZGUuY3V0KHBvcywgbWF0Y2guc3RhcnQpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGlua2lmaWVkLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jdXQobWF0Y2guc3RhcnQsIG1hdGNoLmVuZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXJrKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSh7IGhyZWY6IG5vcm1hbGl6ZVVybChtYXRjaC5ocmVmKSB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkVG9TZXQobm9kZS5tYXJrcyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gbWF0Y2guZW5kO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zIDwgdGV4dC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBsaW5raWZpZWQucHVzaChub2RlLmN1dChwb3MpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBsaW5raWZpZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgfSk7XHJcbn1cclxuXHJcbmludGVyZmFjZSBMaW5rTWF0Y2gge1xyXG4gICAgc3RhcnQ6IG51bWJlcjtcclxuICAgIGVuZDogbnVtYmVyO1xyXG4gICAgdGl0bGU6IHN0cmluZztcclxuICAgIGhyZWY6IHN0cmluZztcclxufVxyXG5cclxuZnVuY3Rpb24gZmluZExpbmtNYXRjaGVzKHRleHQ6IHN0cmluZyk6IExpbmtNYXRjaFtdIHtcclxuICAgIGNvbnN0IG1hdGNoZXM6IExpbmtNYXRjaFtdID0gW107XHJcbiAgICBjb25zdCBsaW5rTWF0Y2hlczogJycgfCBudWxsIHwgTWF0Y2hbXSA9IHRleHQgJiYgbGlua2lmeS5tYXRjaCh0ZXh0KTtcclxuICAgIGlmIChsaW5rTWF0Y2hlcyAmJiBsaW5rTWF0Y2hlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGlua01hdGNoZXMuZm9yRWFjaChtYXRjaCA9PiB7XHJcbiAgICAgICAgICAgIG1hdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogbWF0Y2guaW5kZXgsXHJcbiAgICAgICAgICAgICAgICBlbmQ6IG1hdGNoLmxhc3RJbmRleCxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBtYXRjaC5yYXcsXHJcbiAgICAgICAgICAgICAgICBocmVmOiBtYXRjaC51cmwsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1hdGNoZXM7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGlua2lmeU1hdGNoIHtcclxuICAgIGluZGV4OiBudW1iZXI7XHJcbiAgICBsYXN0SW5kZXg6IG51bWJlcjtcclxuICAgIHJhdzogc3RyaW5nO1xyXG4gICAgdXJsOiBzdHJpbmc7XHJcbiAgICB0ZXh0OiBzdHJpbmc7XHJcbiAgICBzY2hlbWE6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGxpbmtpZnlNYXRjaCA9ICh0ZXh0OiBzdHJpbmcpOiBMaW5raWZ5TWF0Y2hbXSA9PiB7XHJcbiAgICBjb25zdCBtYXRjaGVzOiBMaW5raWZ5TWF0Y2hbXSA9IFtdO1xyXG5cclxuICAgIGlmICghTElOS19SRUdFWFAudGVzdCh0ZXh0KSkge1xyXG4gICAgICAgIHJldHVybiBtYXRjaGVzO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBzdGFydHBvcyA9IDA7XHJcbiAgICBsZXQgc3Vic3RyO1xyXG5cclxuICAgIHdoaWxlICgoc3Vic3RyID0gdGV4dC5zdWJzdHIoc3RhcnRwb3MpKSkge1xyXG4gICAgICAgIGNvbnN0IGxpbmsgPSAoc3Vic3RyLm1hdGNoKExJTktfUkVHRVhQKSB8fCBbJyddKVswXTtcclxuICAgICAgICBpZiAobGluaykge1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN1YnN0ci5zZWFyY2goTElOS19SRUdFWFApO1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IGluZGV4ID49IDAgPyBpbmRleCArIHN0YXJ0cG9zIDogaW5kZXg7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgbGluay5sZW5ndGg7XHJcbiAgICAgICAgICAgIG1hdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBpbmRleDogc3RhcnQsXHJcbiAgICAgICAgICAgICAgICBsYXN0SW5kZXg6IGVuZCxcclxuICAgICAgICAgICAgICAgIHJhdzogbGluayxcclxuICAgICAgICAgICAgICAgIHVybDogbGluayxcclxuICAgICAgICAgICAgICAgIHRleHQ6IGxpbmssXHJcbiAgICAgICAgICAgICAgICBzY2hlbWE6ICcnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc3RhcnRwb3MgKz0gZW5kO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWF0Y2hlcztcclxufTtcclxuIl19