site-metadata-extractor
Version:
web(site) resource metadata extractor
302 lines • 35.9 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.sanitizeJsonLdString = void 0;
const cheerio = __importStar(require("cheerio"));
function getTagName(node) {
const element = node.get(0);
return (element === null || element === void 0 ? void 0 : element.tagName) || "";
}
function cleanArticleTags(doc) {
const articles = doc("article");
articles.each((_index, element) => {
doc(element).removeAttr("id");
doc(element).removeAttr("name");
doc(element).removeAttr("class");
});
return doc;
}
function cleanBadTags(doc) {
const removeNodesRe = "^side$|combx|retweet|mediaarticlerelated|menucontainer|navbar|partner-gravity-ad|video-full-transcript|storytopbar-bucket|utility-bar|inline-share-tools|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|cnn_html_slideshow|cnn_strylftcntnt|links|meta$|shoutbox|sponsor|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers|communitypromo|runaroundLeft|subscribe|vcard|articleheadings|date|^print$|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text|legende|ajoutVideo|timestamp|js_replies";
const regex = new RegExp(removeNodesRe, "i");
const toRemove = doc("*").filter((_index, el) => {
const idEl = doc(el).attr("id");
const classEl = doc(el).attr("class");
const nameEl = doc(el).attr("name");
if (idEl) {
return idEl.match(regex) !== null;
}
else if (classEl) {
return classEl.match(regex) !== null;
}
else if (nameEl) {
return nameEl.match(regex) !== null;
}
return false;
});
doc(toRemove).remove();
return doc;
}
function cleanCodeBlocks(doc) {
const nodes = doc("[class*='highlight-'], pre code, code, pre, ul.task-list");
nodes.each((_index, element) => {
doc(element).replaceWith(doc(element).text());
});
return doc;
}
function cleanEmTags(doc) {
const ems = doc("em");
ems.each((_index, element) => {
const images = ems.find("img");
if (images.length === 0) {
const htmlEl = doc(element).html();
if (htmlEl) {
doc(element).replaceWith(htmlEl);
}
}
});
return doc;
}
function cleanErrantLineBreaks(doc) {
doc("p").each((_index, element) => {
const node = doc(element);
const contents = node.contents();
doc(contents).each((_cindex, cElement) => {
const contentsNode = doc(cElement);
if (contentsNode && contentsNode[0] && contentsNode[0].type === "text") {
contentsNode.replaceWith(contentsNode.text().replace(/([^\n])\n([^\n])/g, "$1 $2"));
}
});
});
return doc;
}
function cleanParaSpans(doc) {
const nodes = doc("p span");
nodes.each((_index, element) => {
const htmlEl = doc(element).html();
if (htmlEl) {
doc(element).replaceWith(htmlEl);
}
});
return doc;
}
function cleanUnderlines(doc) {
const nodes = doc("u");
nodes.each((_index, element) => {
const htmlEl = doc(element).html();
if (htmlEl) {
doc(element).replaceWith(htmlEl);
}
});
return doc;
}
function divToPara(doc, domType) {
const divs = doc(domType);
const tags = [
"a",
"blockquote",
"dl",
"div",
"img",
"ol",
"p",
"pre",
"table",
"ul",
];
divs.each((_index, element) => {
const div = doc(element);
const items = div.find(tags.join(", "));
if (items.length === 0) {
replaceWithPara(doc, element);
}
else {
const replaceNodes = getReplacementNodes(doc, div);
let html = "";
replaceNodes.forEach((node) => {
if (node.text() !== "") {
html += `<p>${node}</p>`;
}
});
div.empty();
doc(div).replaceWith(`${html}`);
}
});
return doc;
}
function getReplacementNodes(doc, div) {
let replacementText = [];
const nodesToReturn = [];
const nodesToRemove = [];
const children = div.contents();
children.each((_index, element) => {
var _a;
const child = doc(element);
if (getTagName(child) === "p" &&
replacementText.length > 0) {
const text = replacementText.join("");
const textNodeLoad = cheerio.load(`<p>${text}</p>`);
const textNode = textNodeLoad("p");
// create a node out of text and push
nodesToReturn.push(textNode);
replacementText = [];
const childEl = doc(element);
if (childEl) {
nodesToReturn.push(childEl);
}
}
else if (((_a = child.get(0)) === null || _a === void 0 ? void 0 : _a.type) === "text") {
const childTextNode = child;
const childText = child.text();
const replaceText = childText
.replace(/\n/g, "\n\n")
.replace(/\t/g, "")
.replace(/^\s+$/g, "");
if (replaceText.length > 1) {
let previousSiblingNode = childTextNode.prev();
while (getTagName(previousSiblingNode) === "a" &&
previousSiblingNode.attr("grv-usedalready") !== "yes") {
const outer = " " + doc.html(previousSiblingNode) + " ";
replacementText.push(outer);
nodesToRemove.push(previousSiblingNode);
previousSiblingNode.attr("grv-usedalready", "yes");
previousSiblingNode = previousSiblingNode.prev();
}
replacementText.push(replaceText);
const nextSiblingNode = childTextNode.next();
while (getTagName(nextSiblingNode) === "a" &&
nextSiblingNode.attr("grv-usedalready") !== "yes") {
const outer = " " + doc.html(nextSiblingNode) + " ";
replacementText.push(outer);
nodesToRemove.push(nextSiblingNode);
nextSiblingNode.attr("grv-usedalready", "yes");
previousSiblingNode = nextSiblingNode.next();
}
}
// otherwise
}
else {
const childEl = doc(child);
if (childEl) {
nodesToReturn.push(childEl);
}
}
});
// flush out anything still remaining
if (replacementText.length > 0) {
const text = replacementText.join("");
const textNodeLoad = cheerio.load(`<p>${text}</p>`);
const textNode = textNodeLoad("p");
nodesToReturn.push(textNode);
replacementText = [];
}
nodesToRemove.forEach((node) => {
doc(node).remove();
});
return nodesToReturn;
}
function removeBodyClasses(doc) {
doc("body").removeClass();
return doc;
}
function removeDropCaps(doc) {
const nodes = doc("span[class~=dropcap], span[class~=drop_cap]");
nodes.each((_index, element) => {
const htmlEl = doc(element).html();
if (htmlEl) {
doc(element).replaceWith(htmlEl);
}
});
return doc;
}
function removeNodesRegex(doc, pattern) {
const toRemove = doc("div").filter((_index, element) => {
const idEl = doc(element).attr("id");
const classEl = doc(element).attr("class");
if (idEl) {
return idEl.match(pattern) !== null;
}
else if (classEl) {
return classEl.match(pattern) !== null;
}
return false;
});
doc(toRemove).remove();
return doc;
}
function removeScriptsStyles(doc) {
doc("script").remove();
doc("style").remove();
const comments = doc("*")
.contents()
.filter((_index, element) => {
return element.type === "comment";
});
return doc(comments).remove();
}
function replaceWithPara(doc, div) {
const divContent = doc(div).html();
doc(div).replaceWith(`<p>${divContent}</p>`);
return doc;
}
const cleaner = (doc) => {
removeBodyClasses(doc);
cleanArticleTags(doc);
cleanEmTags(doc);
cleanCodeBlocks(doc);
removeDropCaps(doc);
removeScriptsStyles(doc);
cleanBadTags(doc);
removeNodesRegex(doc, /^caption$/);
removeNodesRegex(doc, / google /);
removeNodesRegex(doc, /^[^entry-]more.*$/);
removeNodesRegex(doc, /[^-]facebook/);
removeNodesRegex(doc, /facebook-broadcasting/);
removeNodesRegex(doc, /[^-]twitter/);
cleanParaSpans(doc);
cleanUnderlines(doc);
cleanErrantLineBreaks(doc);
divToPara(doc, "div");
divToPara(doc, "span");
return doc;
};
// Sanitization function to remove HTML/XML tags
const sanitizeJsonLdString = (jsonLdString) => {
// Remove anything that looks like an HTML/XML tag (this is a basic example, might need adjustments)
return jsonLdString.replace(/<\/?[^>]+(>|$)/g, "").trim();
};
exports.sanitizeJsonLdString = sanitizeJsonLdString;
exports.default = cleaner;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGVhbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUFtQztBQUluQyxTQUFTLFVBQVUsQ0FBQyxJQUFzQjtJQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBd0IsQ0FBQztJQUNuRCxPQUFPLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE9BQU8sS0FBSSxFQUFFLENBQUM7QUFDaEMsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsR0FBZTtJQUN2QyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQWMsRUFBRSxPQUFnQixFQUFFLEVBQUU7UUFDakQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxHQUFlO0lBQ25DLE1BQU0sYUFBYSxHQUNqQixpcEJBQWlwQixDQUFDO0lBQ3BwQixNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFN0MsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUM5QyxNQUFNLElBQUksR0FBRyxHQUFHLENB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QkFBZ0IsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDckMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQixxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixTQUFTLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDLENBQUM7QUFFRixnREFBZ0Q7QUFDekMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFlBQW9CLEVBQVUsRUFBRTtJQUNuRSxvR0FBb0c7SUFDcEcsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzVELENBQUMsQ0FBQztBQUhXLFFBQUEsb0JBQW9CLHdCQUcvQjtBQUVGLGtCQUFlLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSBcImNoZWVyaW9cIjtcbmltcG9ydCB0eXBlIHsgQ2hlZXJpbywgQ2hlZXJpb0FQSSB9IGZyb20gXCJjaGVlcmlvXCI7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUsIEVsZW1lbnQgfSBmcm9tIFwiZG9taGFuZGxlclwiO1xuXG5mdW5jdGlvbiBnZXRUYWdOYW1lKG5vZGU6IENoZWVyaW88QW55Tm9kZT4pOiBzdHJpbmcge1xuICBjb25zdCBlbGVtZW50ID0gbm9kZS5nZXQoMCkgYXMgRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGVsZW1lbnQ/LnRhZ05hbWUgfHwgXCJcIjtcbn1cblxuZnVuY3Rpb24gY2xlYW5BcnRpY2xlVGFncyhkb2M6IENoZWVyaW9BUEkpIHtcbiAgY29uc3QgYXJ0aWNsZXMgPSBkb2MoXCJhcnRpY2xlXCIpO1xuICBhcnRpY2xlcy5lYWNoKChfaW5kZXg6IG51bWJlciwgZWxlbWVudDogQW55Tm9kZSkgPT4ge1xuICAgIGRvYyhlbGVtZW50KS5yZW1vdmVBdHRyKFwiaWRcIik7XG4gICAgZG9jKGVsZW1lbnQpLnJlbW92ZUF0dHIoXCJuYW1lXCIpO1xuICAgIGRvYyhlbGVtZW50KS5yZW1vdmVBdHRyKFwiY2xhc3NcIik7XG4gIH0pO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiBjbGVhbkJhZFRhZ3MoZG9jOiBDaGVlcmlvQVBJKSB7XG4gIGNvbnN0IHJlbW92ZU5vZGVzUmUgPVxuICAgIFwiXnNpZGUkfGNvbWJ4fHJldHdlZXR8bWVkaWFhcnRpY2xlcmVsYXRlZHxtZW51Y29udGFpbmVyfG5hdmJhcnxwYXJ0bmVyLWdyYXZpdHktYWR8dmlkZW8tZnVsbC10cmFuc2NyaXB0fHN0b3J5dG9wYmFyLWJ1Y2tldHx1dGlsaXR5LWJhcnxpbmxpbmUtc2hhcmUtdG9vbHN8Y29tbWVudHxQb3B1bGFyUXVlc3Rpb25zfGNvbnRhY3R8Zm9vdHxmb290ZXJ8Rm9vdGVyfGZvb3Rub3RlfGNubl9zdHJ5Y2FwdGlvbnR4dHxjbm5faHRtbF9zbGlkZXNob3d8Y25uX3N0cnlsZnRjbnRudHxsaW5rc3xtZXRhJHxzaG91dGJveHxzcG9uc29yfHRhZ3N8c29jaWFsbmV0d29ya2luZ3xzb2NpYWxOZXR3b3JraW5nfGNublN0cnlIZ2hMZ2h0fGNubl9zdHJ5c3BjdmJ4fF5pbnNldCR8cGFnZXRvb2xzfHBvc3QtYXR0cmlidXRlc3x3ZWxjb21lX2Zvcm18Y29udGVudFRvb2xzMnx0aGVfYW5zd2Vyc3xjb21tdW5pdHlwcm9tb3xydW5hcm91bmRMZWZ0fHN1YnNjcmliZXx2Y2FyZHxhcnRpY2xlaGVhZGluZ3N8ZGF0ZXxecHJpbnQkfHBvcHVwfGF1dGhvci1kcm9wZG93bnx0b29sc3xzb2NpYWx0b29sc3xieWxpbmV8a29uYWZpbHRlcnxLb25hRmlsdGVyfGJyZWFkY3J1bWJzfF5mbiR8d3AtY2FwdGlvbi10ZXh0fGxlZ2VuZGV8YWpvdXRWaWRlb3x0aW1lc3RhbXB8anNfcmVwbGllc1wiO1xuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocmVtb3ZlTm9kZXNSZSwgXCJpXCIpO1xuXG4gIGNvbnN0IHRvUmVtb3ZlID0gZG9jKFwiKlwiKS5maWx0ZXIoKF9pbmRleCwgZWwpID0+IHtcbiAgICBjb25zdCBpZEVsID0gZG9jKGVsKS5hdHRyKFwiaWRcIik7XG4gICAgY29uc3QgY2xhc3NFbCA9IGRvYyhlbCkuYXR0cihcImNsYXNzXCIpO1xuICAgIGNvbnN0IG5hbWVFbCA9IGRvYyhlbCkuYXR0cihcIm5hbWVcIik7XG4gICAgaWYgKGlkRWwpIHtcbiAgICAgIHJldHVybiBpZEVsLm1hdGNoKHJlZ2V4KSAhPT0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGNsYXNzRWwpIHtcbiAgICAgIHJldHVybiBjbGFzc0VsLm1hdGNoKHJlZ2V4KSAhPT0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKG5hbWVFbCkge1xuICAgICAgcmV0dXJuIG5hbWVFbC5tYXRjaChyZWdleCkgIT09IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG5cbiAgZG9jKHRvUmVtb3ZlKS5yZW1vdmUoKTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gY2xlYW5Db2RlQmxvY2tzKGRvYzogQ2hlZXJpb0FQSSkge1xuICBjb25zdCBub2RlcyA9IGRvYyhcIltjbGFzcyo9J2hpZ2hsaWdodC0nXSwgcHJlIGNvZGUsIGNvZGUsIHByZSwgdWwudGFzay1saXN0XCIpO1xuICBub2Rlcy5lYWNoKChfaW5kZXg6IG51bWJlciwgZWxlbWVudDogQW55Tm9kZSkgPT4ge1xuICAgIGRvYyhlbGVtZW50KS5yZXBsYWNlV2l0aChkb2MoZWxlbWVudCkudGV4dCgpKTtcbiAgfSk7XG4gIHJldHVybiBkb2M7XG59XG5cbmZ1bmN0aW9uIGNsZWFuRW1UYWdzKGRvYzogQ2hlZXJpb0FQSSkge1xuICBjb25zdCBlbXMgPSBkb2MoXCJlbVwiKTtcbiAgZW1zLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBBbnlOb2RlKSA9PiB7XG4gICAgY29uc3QgaW1hZ2VzID0gZW1zLmZpbmQoXCJpbWdcIik7XG4gICAgaWYgKGltYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IGh0bWxFbCA9IGRvYyhlbGVtZW50KS5odG1sKCk7XG4gICAgICBpZiAoaHRtbEVsKSB7XG4gICAgICAgIGRvYyhlbGVtZW50KS5yZXBsYWNlV2l0aChodG1sRWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkb2M7XG59XG5cbmZ1bmN0aW9uIGNsZWFuRXJyYW50TGluZUJyZWFrcyhkb2M6IENoZWVyaW9BUEkpIHtcbiAgZG9jKFwicFwiKS5lYWNoKChfaW5kZXg6IG51bWJlciwgZWxlbWVudDogQW55Tm9kZSkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBkb2MoZWxlbWVudCk7XG4gICAgY29uc3QgY29udGVudHMgPSBub2RlLmNvbnRlbnRzKCk7XG5cbiAgICBkb2MoY29udGVudHMpLmVhY2goKF9jaW5kZXg6IG51bWJlciwgY0VsZW1lbnQ6IEFueU5vZGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnRzTm9kZSA9IGRvYyhjRWxlbWVudCk7XG4gICAgICBpZiAoY29udGVudHNOb2RlICYmIGNvbnRlbnRzTm9kZVswXSAmJiBjb250ZW50c05vZGVbMF0udHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgY29udGVudHNOb2RlLnJlcGxhY2VXaXRoKFxuICAgICAgICAgIGNvbnRlbnRzTm9kZS50ZXh0KCkucmVwbGFjZSgvKFteXFxuXSlcXG4oW15cXG5dKS9nLCBcIiQxICQyXCIpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gY2xlYW5QYXJhU3BhbnMoZG9jOiBDaGVlcmlvQVBJKSB7XG4gIGNvbnN0IG5vZGVzID0gZG9jKFwicCBzcGFuXCIpO1xuICBub2Rlcy5lYWNoKChfaW5kZXg6IG51bWJlciwgZWxlbWVudDogQW55Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGh0bWxFbCA9IGRvYyhlbGVtZW50KS5odG1sKCk7XG4gICAgaWYgKGh0bWxFbCkge1xuICAgICAgZG9jKGVsZW1lbnQpLnJlcGxhY2VXaXRoKGh0bWxFbCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gY2xlYW5VbmRlcmxpbmVzKGRvYzogQ2hlZXJpb0FQSSkge1xuICBjb25zdCBub2RlcyA9IGRvYyhcInVcIik7XG4gIG5vZGVzLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBBbnlOb2RlKSA9PiB7XG4gICAgY29uc3QgaHRtbEVsID0gZG9jKGVsZW1lbnQpLmh0bWwoKTtcbiAgICBpZiAoaHRtbEVsKSB7XG4gICAgICBkb2MoZWxlbWVudCkucmVwbGFjZVdpdGgoaHRtbEVsKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiBkaXZUb1BhcmEoZG9jOiBDaGVlcmlvQVBJLCBkb21UeXBlOiBzdHJpbmcpIHtcbiAgY29uc3QgZGl2cyA9IGRvYyhkb21UeXBlKTtcblxuICBjb25zdCB0YWdzID0gW1xuICAgIFwiYVwiLFxuICAgIFwiYmxvY2txdW90ZVwiLFxuICAgIFwiZGxcIixcbiAgICBcImRpdlwiLFxuICAgIFwiaW1nXCIsXG4gICAgXCJvbFwiLFxuICAgIFwicFwiLFxuICAgIFwicHJlXCIsXG4gICAgXCJ0YWJsZVwiLFxuICAgIFwidWxcIixcbiAgXTtcblxuICBkaXZzLmVhY2goKF9pbmRleDogbnVtYmVyLCBlbGVtZW50OiBBbnlOb2RlKSA9PiB7XG4gICAgY29uc3QgZGl2ID0gZG9jKGVsZW1lbnQpO1xuICAgIGNvbnN0IGl0ZW1zID0gZGl2LmZpbmQodGFncy5qb2luKFwiLCBcIikpO1xuXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmVwbGFjZVdpdGhQYXJhKGRvYywgZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlcGxhY2VOb2RlcyA9IGdldFJlcGxhY2VtZW50Tm9kZXMoZG9jLCBkaXYpO1xuXG4gICAgICBsZXQgaHRtbCA9IFwiXCI7XG4gICAgICByZXBsYWNlTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBpZiAobm9kZS50ZXh0KCkgIT09IFwiXCIpIHtcbiAgICAgICAgICBodG1sICs9IGA8cD4ke25vZGV9PC9wPmA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBkaXYuZW1wdHkoKTtcbiAgICAgIGRvYyhkaXYpLnJlcGxhY2VXaXRoKGAke2h0bWx9YCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gZ2V0UmVwbGFjZW1lbnROb2RlcyhcbiAgZG9jOiBDaGVlcmlvQVBJLFxuICBkaXY6IENoZWVyaW88QW55Tm9kZT4sXG4pOiBDaGVlcmlvPEFueU5vZGU+W10ge1xuICBsZXQgcmVwbGFjZW1lbnRUZXh0OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBub2Rlc1RvUmV0dXJuOiBDaGVlcmlvPEFueU5vZGU+W10gPSBbXTtcbiAgY29uc3Qgbm9kZXNUb1JlbW92ZTogQ2hlZXJpbzxBbnlOb2RlPltdID0gW107XG4gIGNvbnN0IGNoaWxkcmVuID0gZGl2LmNvbnRlbnRzKCk7XG5cbiAgY2hpbGRyZW4uZWFjaCgoX2luZGV4OiBudW1iZXIsIGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IGRvYyhlbGVtZW50KTtcblxuICAgIGlmIChcbiAgICAgIGdldFRhZ05hbWUoY2hpbGQpID09PSBcInBcIiAmJlxuICAgICAgcmVwbGFjZW1lbnRUZXh0Lmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IHRleHQgPSByZXBsYWNlbWVudFRleHQuam9pbihcIlwiKTtcbiAgICAgIGNvbnN0IHRleHROb2RlTG9hZCA9IGNoZWVyaW8ubG9hZChgPHA+JHt0ZXh0fTwvcD5gKTtcbiAgICAgIGNvbnN0IHRleHROb2RlID0gdGV4dE5vZGVMb2FkKFwicFwiKTtcbiAgICAgIC8vIGNyZWF0ZSBhIG5vZGUgb3V0IG9mIHRleHQgYW5kIHB1c2hcbiAgICAgIG5vZGVzVG9SZXR1cm4ucHVzaCh0ZXh0Tm9kZSk7XG4gICAgICByZXBsYWNlbWVudFRleHQgPSBbXTtcbiAgICAgIGNvbnN0IGNoaWxkRWwgPSBkb2MoZWxlbWVudCk7XG4gICAgICBpZiAoY2hpbGRFbCkge1xuICAgICAgICBub2Rlc1RvUmV0dXJuLnB1c2goY2hpbGRFbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGlsZC5nZXQoMCk/LnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICBjb25zdCBjaGlsZFRleHROb2RlID0gY2hpbGQ7XG4gICAgICBjb25zdCBjaGlsZFRleHQgPSBjaGlsZC50ZXh0KCk7XG4gICAgICBjb25zdCByZXBsYWNlVGV4dCA9IGNoaWxkVGV4dFxuICAgICAgICAucmVwbGFjZSgvXFxuL2csIFwiXFxuXFxuXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCJcIilcbiAgICAgICAgLnJlcGxhY2UoL15cXHMrJC9nLCBcIlwiKTtcblxuICAgICAgaWYgKHJlcGxhY2VUZXh0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGV0IHByZXZpb3VzU2libGluZ05vZGUgPSBjaGlsZFRleHROb2RlLnByZXYoKTtcblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgZ2V0VGFnTmFtZShwcmV2aW91c1NpYmxpbmdOb2RlKSA9PT0gXCJhXCIgJiZcbiAgICAgICAgICBwcmV2aW91c1NpYmxpbmdOb2RlLmF0dHIoXCJncnYtdXNlZGFscmVhZHlcIikgIT09IFwieWVzXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3Qgb3V0ZXIgPSBcIiBcIiArIGRvYy5odG1sKHByZXZpb3VzU2libGluZ05vZGUpICsgXCIgXCI7XG4gICAgICAgICAgcmVwbGFjZW1lbnRUZXh0LnB1c2gob3V0ZXIpO1xuICAgICAgICAgIG5vZGVzVG9SZW1vdmUucHVzaChwcmV2aW91c1NpYmxpbmdOb2RlKTtcbiAgICAgICAgICBwcmV2aW91c1NpYmxpbmdOb2RlLmF0dHIoXCJncnYtdXNlZGFscmVhZHlcIiwgXCJ5ZXNcIik7XG4gICAgICAgICAgcHJldmlvdXNTaWJsaW5nTm9kZSA9IHByZXZpb3VzU2libGluZ05vZGUucHJldigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVwbGFjZW1lbnRUZXh0LnB1c2gocmVwbGFjZVRleHQpO1xuICAgICAgICBjb25zdCBuZXh0U2libGluZ05vZGUgPSBjaGlsZFRleHROb2RlLm5leHQoKTtcblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgZ2V0VGFnTmFtZShuZXh0U2libGluZ05vZGUpID09PSBcImFcIiAmJlxuICAgICAgICAgIG5leHRTaWJsaW5nTm9kZS5hdHRyKFwiZ3J2LXVzZWRhbHJlYWR5XCIpICE9PSBcInllc1wiXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG91dGVyID0gXCIgXCIgKyBkb2MuaHRtbChuZXh0U2libGluZ05vZGUpICsgXCIgXCI7XG4gICAgICAgICAgcmVwbGFjZW1lbnRUZXh0LnB1c2gob3V0ZXIpO1xuICAgICAgICAgIG5vZGVzVG9SZW1vdmUucHVzaChuZXh0U2libGluZ05vZGUpO1xuICAgICAgICAgIG5leHRTaWJsaW5nTm9kZS5hdHRyKFwiZ3J2LXVzZWRhbHJlYWR5XCIsIFwieWVzXCIpO1xuICAgICAgICAgIHByZXZpb3VzU2libGluZ05vZGUgPSBuZXh0U2libGluZ05vZGUubmV4dCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvdGhlcndpc2VcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2hpbGRFbCA9IGRvYyhjaGlsZCk7XG4gICAgICBpZiAoY2hpbGRFbCkge1xuICAgICAgICBub2Rlc1RvUmV0dXJuLnB1c2goY2hpbGRFbCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyBmbHVzaCBvdXQgYW55dGhpbmcgc3RpbGwgcmVtYWluaW5nXG4gIGlmIChyZXBsYWNlbWVudFRleHQubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHRleHQgPSByZXBsYWNlbWVudFRleHQuam9pbihcIlwiKTtcbiAgICBjb25zdCB0ZXh0Tm9kZUxvYWQgPSBjaGVlcmlvLmxvYWQoYDxwPiR7dGV4dH08L3A+YCk7XG4gICAgY29uc3QgdGV4dE5vZGUgPSB0ZXh0Tm9kZUxvYWQoXCJwXCIpO1xuICAgIG5vZGVzVG9SZXR1cm4ucHVzaCh0ZXh0Tm9kZSk7XG4gICAgcmVwbGFjZW1lbnRUZXh0ID0gW107XG4gIH1cblxuICBub2Rlc1RvUmVtb3ZlLmZvckVhY2goKG5vZGU6IENoZWVyaW88QW55Tm9kZT4pID0+IHtcbiAgICBkb2Mobm9kZSkucmVtb3ZlKCk7XG4gIH0pO1xuXG4gIHJldHVybiBub2Rlc1RvUmV0dXJuO1xufVxuXG5mdW5jdGlvbiByZW1vdmVCb2R5Q2xhc3Nlcyhkb2M6IENoZWVyaW9BUEkpOiBDaGVlcmlvQVBJIHtcbiAgZG9jKFwiYm9keVwiKS5yZW1vdmVDbGFzcygpO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiByZW1vdmVEcm9wQ2Fwcyhkb2M6IENoZWVyaW9BUEkpOiBDaGVlcmlvQVBJIHtcbiAgY29uc3Qgbm9kZXMgPSBkb2MoXCJzcGFuW2NsYXNzfj1kcm9wY2FwXSwgc3BhbltjbGFzc349ZHJvcF9jYXBdXCIpO1xuICBub2Rlcy5lYWNoKChfaW5kZXg6IG51bWJlciwgZWxlbWVudDogQW55Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGh0bWxFbCA9IGRvYyhlbGVtZW50KS5odG1sKCk7XG4gICAgaWYgKGh0bWxFbCkge1xuICAgICAgZG9jKGVsZW1lbnQpLnJlcGxhY2VXaXRoKGh0bWxFbCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZXNSZWdleChkb2M6IENoZWVyaW9BUEksIHBhdHRlcm46IFJlZ0V4cCkge1xuICBjb25zdCB0b1JlbW92ZSA9IGRvYyhcImRpdlwiKS5maWx0ZXIoKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGlkRWwgPSBkb2MoZWxlbWVudCkuYXR0cihcImlkXCIpO1xuICAgIGNvbnN0IGNsYXNzRWwgPSBkb2MoZWxlbWVudCkuYXR0cihcImNsYXNzXCIpO1xuICAgIGlmIChpZEVsKSB7XG4gICAgICByZXR1cm4gaWRFbC5tYXRjaChwYXR0ZXJuKSAhPT0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGNsYXNzRWwpIHtcbiAgICAgIHJldHVybiBjbGFzc0VsLm1hdGNoKHBhdHRlcm4pICE9PSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xuICBkb2ModG9SZW1vdmUpLnJlbW92ZSgpO1xuICByZXR1cm4gZG9jO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTY3JpcHRzU3R5bGVzKGRvYzogQ2hlZXJpb0FQSSk6IENoZWVyaW88QW55Tm9kZT4ge1xuICBkb2MoXCJzY3JpcHRcIikucmVtb3ZlKCk7XG4gIGRvYyhcInN0eWxlXCIpLnJlbW92ZSgpO1xuXG4gIGNvbnN0IGNvbW1lbnRzID0gZG9jKFwiKlwiKVxuICAgIC5jb250ZW50cygpXG4gICAgLmZpbHRlcigoX2luZGV4OiBudW1iZXIsIGVsZW1lbnQ6IEFueU5vZGUpID0+IHtcbiAgICAgIHJldHVybiBlbGVtZW50LnR5cGUgPT09IFwiY29tbWVudFwiO1xuICAgIH0pO1xuXG4gIHJldHVybiBkb2MoY29tbWVudHMpLnJlbW92ZSgpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aFBhcmEoXG4gIGRvYzogQ2hlZXJpb0FQSSxcbiAgZGl2OiBBbnlOb2RlLFxuKTogQ2hlZXJpb0FQSSB7XG4gIGNvbnN0IGRpdkNvbnRlbnQgPSBkb2MoZGl2KS5odG1sKCk7XG4gIGRvYyhkaXYpLnJlcGxhY2VXaXRoKGA8cD4ke2RpdkNvbnRlbnR9PC9wPmApO1xuICByZXR1cm4gZG9jO1xufVxuXG5jb25zdCBjbGVhbmVyID0gKGRvYzogQ2hlZXJpb0FQSSk6IENoZWVyaW9BUEkgPT4ge1xuICByZW1vdmVCb2R5Q2xhc3Nlcyhkb2MpO1xuICBjbGVhbkFydGljbGVUYWdzKGRvYyk7XG4gIGNsZWFuRW1UYWdzKGRvYyk7XG4gIGNsZWFuQ29kZUJsb2Nrcyhkb2MpO1xuICByZW1vdmVEcm9wQ2Fwcyhkb2MpO1xuICByZW1vdmVTY3JpcHRzU3R5bGVzKGRvYyk7XG4gIGNsZWFuQmFkVGFncyhkb2MpO1xuICByZW1vdmVOb2Rlc1JlZ2V4KGRvYywgL15jYXB0aW9uJC8pO1xuICByZW1vdmVOb2Rlc1JlZ2V4KGRvYywgLyBnb29nbGUgLyk7XG4gIHJlbW92ZU5vZGVzUmVnZXgoZG9jLCAvXlteZW50cnktXW1vcmUuKiQvKTtcbiAgcmVtb3ZlTm9kZXNSZWdleChkb2MsIC9bXi1dZmFjZWJvb2svKTtcbiAgcmVtb3ZlTm9kZXNSZWdleChkb2MsIC9mYWNlYm9vay1icm9hZGNhc3RpbmcvKTtcbiAgcmVtb3ZlTm9kZXNSZWdleChkb2MsIC9bXi1ddHdpdHRlci8pO1xuICBjbGVhblBhcmFTcGFucyhkb2MpO1xuICBjbGVhblVuZGVybGluZXMoZG9jKTtcbiAgY2xlYW5FcnJhbnRMaW5lQnJlYWtzKGRvYyk7XG4gIGRpdlRvUGFyYShkb2MsIFwiZGl2XCIpO1xuICBkaXZUb1BhcmEoZG9jLCBcInNwYW5cIik7XG4gIHJldHVybiBkb2M7XG59O1xuXG4vLyBTYW5pdGl6YXRpb24gZnVuY3Rpb24gdG8gcmVtb3ZlIEhUTUwvWE1MIHRhZ3NcbmV4cG9ydCBjb25zdCBzYW5pdGl6ZUpzb25MZFN0cmluZyA9IChqc29uTGRTdHJpbmc6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIC8vIFJlbW92ZSBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYW4gSFRNTC9YTUwgdGFnICh0aGlzIGlzIGEgYmFzaWMgZXhhbXBsZSwgbWlnaHQgbmVlZCBhZGp1c3RtZW50cylcbiAgcmV0dXJuIGpzb25MZFN0cmluZy5yZXBsYWNlKC88XFwvP1tePl0rKD58JCkvZywgXCJcIikudHJpbSgpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xlYW5lcjtcbiJdfQ==