site-metadata-extractor
Version:
web(site) resource metadata extractor
652 lines • 91.4 kB
JavaScript
"use strict";
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;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.lazy = void 0;
exports.extractFromHtml = extractFromHtml;
exports.extractMetadataOnly = extractMetadataOnly;
exports.extractLazy = extractLazy;
exports.getCleanedDoc = getCleanedDoc;
exports.getParsedDoc = getParsedDoc;
exports.getParsedDocForText = getParsedDocForText;
exports.getTopNode = getTopNode;
/* eslint-disable no-unused-vars */
/* eslint-disable @typescript-eslint/no-unused-vars */
const cheerio = __importStar(require("cheerio"));
const url_1 = require("url");
const cleaner_1 = __importDefault(require("./cleaner"));
const extractor_1 = __importDefault(require("./extractor"));
const STRATEGY_VERSION = "2026-05-26.cheerio-v1";
const DEFAULT_MAX_STRING_LENGTH = 4096;
const DEFAULT_MAX_CANDIDATES = 25;
const DEFAULT_MAX_READABLE_TEXT_LENGTH = 200000;
const packageVersion = require("../package.json").version;
function getTagName(node) {
const element = node.get(0);
return (element === null || element === void 0 ? void 0 : element.tagName) || "";
}
function getBaseUrl(options) {
return options.finalUrl || options.inputUrl || "";
}
function getUrlParts(url) {
if (!url) {
return { normalizedUrl: "", domain: "" };
}
try {
const urlObj = new url_1.URL(url);
urlObj.hash = "";
return {
domain: urlObj.hostname,
normalizedUrl: urlObj.href,
};
}
catch (_error) {
return { normalizedUrl: url, domain: "" };
}
}
function resolveHttpUrl(value, baseUrl) {
const trimmed = (value || "").trim();
if (!trimmed) {
return "";
}
try {
const resolved = baseUrl ? new url_1.URL(trimmed, baseUrl) : new url_1.URL(trimmed);
if (resolved.protocol === "http:" || resolved.protocol === "https:") {
return resolved.href;
}
}
catch (_error) {
return "";
}
return "";
}
function toNumber(value) {
if (!value) {
return undefined;
}
const parsed = parseInt(value, 10);
return Number.isFinite(parsed) ? parsed : undefined;
}
function cleanBounded(value, field, warnings, maxLength) {
const cleaned = (value || "")
.replace(/[\r\n\t]/g, " ")
.replace(/\s\s+/g, " ")
.trim();
if (cleaned.length > maxLength) {
warnings.push(`${field} exceeded ${maxLength} characters and was truncated`);
return cleaned.slice(0, maxLength);
}
return cleaned;
}
function pushUniqueCandidate(candidates, candidate, maxCandidates) {
if (candidate.url &&
candidates.length < maxCandidates &&
!candidates.some((existing) => existing.url === candidate.url)) {
candidates.push(candidate);
}
}
function getRawMeta(doc, warnings, maxLength) {
const rawMeta = {};
doc("meta").each((_index, element) => {
const meta = doc(element);
const key = meta.attr("property") ||
meta.attr("name") ||
meta.attr("itemprop") ||
meta.attr("http-equiv");
const content = meta.attr("content");
if (!key || content === undefined) {
return;
}
const normalizedKey = key.trim().toLowerCase();
const bounded = cleanBounded(content, `rawMeta.${normalizedKey}`, warnings, maxLength);
if (!rawMeta[normalizedKey]) {
rawMeta[normalizedKey] = [];
}
rawMeta[normalizedKey].push(bounded);
});
return rawMeta;
}
function firstMetaValue(rawMeta, keys) {
var _a;
for (const key of keys) {
const value = (_a = rawMeta[key]) === null || _a === void 0 ? void 0 : _a[0];
if (value) {
return value;
}
}
return "";
}
function getDateValue(doc, rawMeta, keys) {
const metaValue = firstMetaValue(rawMeta, keys.map((key) => key.toLowerCase()));
if (metaValue) {
return metaValue;
}
for (const key of keys) {
const itemprop = key.replace(/^article:/, "");
const dateElement = doc(`[itemprop='${itemprop}'], [property='${itemprop}']`)
.first();
const datetime = dateElement.attr("datetime");
const content = dateElement.attr("content");
const text = dateElement.text();
const value = cleanBounded(content || datetime || text, key, [], 256);
if (value) {
return value;
}
}
return "";
}
function getFaviconCandidates(doc, baseUrl, maxCandidates) {
const candidates = [];
doc("link").each((_index, element) => {
const link = doc(element);
const rel = (link.attr("rel") || "").toLowerCase();
if (!/\b(icon|apple-touch-icon|mask-icon)\b/.test(rel)) {
return;
}
const url = resolveHttpUrl(link.attr("href"), baseUrl);
pushUniqueCandidate(candidates, {
rel,
sizes: link.attr("sizes"),
source: "link",
type: link.attr("type"),
url,
}, maxCandidates);
});
if (candidates.length === 0) {
const fallback = resolveHttpUrl("/favicon.ico", baseUrl);
pushUniqueCandidate(candidates, { rel: "icon", source: "default", url: fallback }, maxCandidates);
}
return candidates;
}
function getImageCandidates(doc, baseUrl, maxCandidates) {
const candidates = [];
const metaSelectors = [
"meta[property='og:image']",
"meta[property='og:image:url']",
"meta[property='og:image:secure_url']",
"meta[name='twitter:image']",
"meta[name='twitter:image:src']",
"meta[itemprop='image']",
];
metaSelectors.forEach((selector) => {
doc(selector).each((_index, element) => {
const meta = doc(element);
const url = resolveHttpUrl(meta.attr("content"), baseUrl);
pushUniqueCandidate(candidates, {
source: meta.attr("property") || meta.attr("name") || meta.attr("itemprop") || "meta",
url,
}, maxCandidates);
});
});
doc("link[rel='image_src']").each((_index, element) => {
const link = doc(element);
const url = resolveHttpUrl(link.attr("href"), baseUrl);
pushUniqueCandidate(candidates, { rel: "image_src", source: "link", url }, maxCandidates);
});
doc("img").each((_index, element) => {
const img = doc(element);
const url = resolveHttpUrl(img.attr("src") || img.attr("data-src") || img.attr("data-original"), baseUrl);
pushUniqueCandidate(candidates, {
alt: img.attr("alt"),
height: toNumber(img.attr("height")),
source: "img",
url,
width: toNumber(img.attr("width")),
}, maxCandidates);
});
return candidates;
}
function parseJsonLd(doc, warnings) {
const jsonld = [];
doc('script[type="application/ld+json"]').each((index, element) => {
const raw = doc(element).html() || "";
const trimmed = raw.trim();
if (!trimmed) {
return;
}
try {
const parsed = JSON.parse(trimmed);
if (Array.isArray(parsed)) {
jsonld.push(...parsed);
}
else {
jsonld.push(parsed);
}
}
catch (_error) {
warnings.push(`jsonld block ${index} could not be parsed`);
}
});
return jsonld;
}
function getTextStats(text, truncated) {
const words = text.match(/\S+/g) || [];
const sentences = text.match(/[.!?](\s|$)/g) || [];
return {
charCount: text.length,
sentenceCount: sentences.length,
truncated,
wordCount: words.length,
};
}
function protectEscapedTagText(html) {
const replacements = [];
const protectedHtml = html.replace(/<([^<>]{1,1000}?)>/gi, (_match, inner) => {
const placeholder = `SME_ESCAPED_TEXT_${replacements.length}_`;
replacements.push(`<${inner}>`);
return placeholder;
});
return {
html: protectedHtml,
restore: (text) => replacements.reduce((restored, replacement, index) => restored.replace(new RegExp(`SME_ESCAPED_TEXT_${index}_`, "g"), replacement), text),
};
}
function getReadableParts(html, lang, baseUrl, maxReadableTextLength, warnings) {
try {
const protectedText = protectEscapedTagText(html);
const doc = cheerio.load(protectedText.html, { xmlMode: false });
(0, cleaner_1.default)(doc);
const topNode = extractor_1.default.calculateBestNode(doc, lang);
if (!topNode || topNode.length === 0) {
return {
links: [],
readableText: "",
textStats: getTextStats("", false),
videos: [],
};
}
const links = getLinks(doc, topNode, baseUrl);
const videos = getVideos(doc, topNode, baseUrl);
let readableText = protectedText.restore(extractor_1.default.text(doc, topNode, lang));
let truncated = false;
if (readableText.length > maxReadableTextLength) {
readableText = readableText.slice(0, maxReadableTextLength);
truncated = true;
warnings.push(`readableText exceeded ${maxReadableTextLength} characters and was truncated`);
}
return {
links,
readableText,
textStats: getTextStats(readableText, truncated),
videos,
};
}
catch (_error) {
warnings.push("readable text extraction failed");
return {
links: [],
readableText: "",
textStats: getTextStats("", false),
videos: [],
};
}
}
function getLinks(doc, topNode, baseUrl) {
const links = [];
topNode.find("a").each((_index, element) => {
const anchor = doc(element);
const url = resolveHttpUrl(anchor.attr("href"), baseUrl);
const text = anchor.text().replace(/\s\s+/g, " ").trim();
if (url && text && !links.some((link) => link.url === url)) {
links.push({
rel: anchor.attr("rel"),
text,
title: anchor.attr("title"),
url,
});
}
});
return links;
}
function getVideos(doc, topNode, baseUrl) {
const videos = [];
topNode.find("iframe, embed, object, video, source").each((_index, element) => {
const candidate = doc(element);
const tag = getTagName(candidate);
const src = candidate.attr("src") ||
candidate.attr("data-src") ||
candidate.find("param[name='movie']").attr("value");
const url = resolveHttpUrl(src, baseUrl);
if (url && !videos.some((video) => video.url === url)) {
videos.push({
height: toNumber(candidate.attr("height")),
source: tag,
type: candidate.attr("type"),
url,
width: toNumber(candidate.attr("width")),
});
}
});
return videos;
}
function buildMetadata(html, options, includeReadable) {
const warnings = [];
const maxStringLength = options.maxStringLength || DEFAULT_MAX_STRING_LENGTH;
const maxCandidates = options.maxCandidates || DEFAULT_MAX_CANDIDATES;
const maxReadableTextLength = options.maxReadableTextLength || DEFAULT_MAX_READABLE_TEXT_LENGTH;
const inputUrl = options.inputUrl || options.finalUrl || "";
const finalUrl = options.finalUrl || inputUrl;
const baseUrl = getBaseUrl(options);
const { domain, normalizedUrl } = getUrlParts(finalUrl || inputUrl);
const doc = cheerio.load(html, { xmlMode: true });
const docForJsonLd = cheerio.load(html, {
decodeEntities: false,
xmlMode: true,
});
const rawMeta = getRawMeta(doc, warnings, maxStringLength);
const language = options.lang || extractor_1.default.lang(doc) || "";
const canonicalCandidate = firstMetaValue(rawMeta, ["og:url"]) ||
doc("link[rel='canonical']").first().attr("href") ||
finalUrl ||
inputUrl;
const canonicalUrl = resolveHttpUrl(canonicalCandidate, baseUrl) || canonicalCandidate || "";
const faviconCandidates = getFaviconCandidates(doc, baseUrl, maxCandidates);
const imageCandidates = getImageCandidates(doc, baseUrl, maxCandidates);
const title = cleanBounded(extractor_1.default.title(doc), "title", warnings, maxStringLength);
const softTitle = cleanBounded(extractor_1.default.softTitle(doc), "softTitle", warnings, maxStringLength);
const description = cleanBounded(extractor_1.default.description(doc), "description", warnings, maxStringLength);
const readableParts = includeReadable
? getReadableParts(html, language || "en", baseUrl, maxReadableTextLength, warnings)
: {
links: [],
readableText: "",
textStats: getTextStats("", false),
videos: [],
};
const confidenceSignals = [
title,
description,
canonicalUrl,
imageCandidates.length > 0 ? "image" : "",
readableParts.readableText.length > 0 ? "text" : "",
].filter(Boolean).length;
return {
author: extractor_1.default
.author(doc)
.map((author) => cleanBounded(author, "author", warnings, maxStringLength))
.filter(Boolean),
canonicalUrl,
description,
domain,
extraction: {
confidence: Math.min(1, confidenceSignals / 5),
packageVersion,
strategyVersion: STRATEGY_VERSION,
warnings,
},
faviconCandidates,
finalUrl,
imageCandidates,
inputUrl,
jsonld: parseJsonLd(docForJsonLd, warnings),
lang: language,
links: readableParts.links,
locale: cleanBounded(extractor_1.default.locale(doc), "locale", warnings, maxStringLength),
modifiedAt: getDateValue(doc, rawMeta, [
"article:modified_time",
"og:updated_time",
"dcterms.modified",
"dc.date.modified",
"dateModified",
]),
normalizedUrl,
primaryImage: imageCandidates[0] || null,
publishedAt: getDateValue(doc, rawMeta, [
"article:published_time",
"date",
"dcterms.date",
"dc.date",
"dc.date.issued",
"datePublished",
]),
publisher: cleanBounded(extractor_1.default.publisher(doc), "publisher", warnings, maxStringLength),
rawMeta,
readableText: readableParts.readableText,
siteName: cleanBounded(extractor_1.default.siteName(doc), "siteName", warnings, maxStringLength),
softTitle,
textStats: readableParts.textStats,
title,
videos: readableParts.videos,
};
}
function extractFromHtml(html, options = {}) {
return buildMetadata(html, options, true);
}
function extractMetadataOnly(html, options = {}) {
return buildMetadata(html, options, false);
}
function extractLazy(html, options = {}) {
let metadataCache = null;
let fullCache = null;
const metadata = () => {
if (!metadataCache) {
metadataCache = extractMetadataOnly(html, options);
}
return metadataCache;
};
const extract = () => {
if (!fullCache) {
fullCache = extractFromHtml(html, options);
}
return fullCache;
};
return {
extract,
links: () => extract().links,
metadata,
readableText: () => extract().readableText,
videos: () => extract().videos,
};
}
const siteMetadataExtractor = (markup, resourceUrl, lang = "en") => {
const resourceUrlObj = new url_1.URL(resourceUrl);
const doc = cheerio.load(markup, { xmlMode: true });
// Separate instance with decodeEntities: false specifically for JSON-LD extraction
const docForJsonLd = cheerio.load(markup, {
xmlMode: true,
decodeEntities: false,
});
const docForText = cheerio.load(markup, { xmlMode: false });
const language = lang || extractor_1.default.lang(doc);
const pageData = {
author: extractor_1.default.author(doc),
canonicalLink: extractor_1.default.canonicalLink(doc, resourceUrl),
copyright: extractor_1.default.copyright(doc),
date: extractor_1.default.date(doc),
description: extractor_1.default.description(doc),
favicon: extractor_1.default.favicon(doc, resourceUrlObj),
image: extractor_1.default.image(doc),
jsonld: extractor_1.default.jsonld(docForJsonLd),
keywords: extractor_1.default.keywords(doc),
lang: language,
locale: extractor_1.default.locale(doc),
origin: resourceUrlObj.origin,
publisher: extractor_1.default.publisher(doc),
siteName: extractor_1.default.siteName(doc),
softTitle: extractor_1.default.softTitle(doc),
tags: extractor_1.default.tags(doc),
title: extractor_1.default.title(doc),
type: extractor_1.default.type(doc),
};
// Step 1: Clean the doc
(0, cleaner_1.default)(doc);
// Step 2: Find the doc node with the best text
const topNode = extractor_1.default.calculateBestNode(docForText, language);
// Step 3: Extract text ,videos, images, link
pageData.videos = extractor_1.default.videos(doc, topNode);
pageData.links = extractor_1.default.links(doc, topNode, language);
pageData.text = extractor_1.default.text(doc, topNode, language);
return pageData;
};
exports.default = siteMetadataExtractor;
// Allow access to document properties with lazy evaluation
const lazy = (html, resourceUrl, language = "en") => {
const resourceUrlObj = new url_1.URL(resourceUrl);
global.lazyPageData = global.lazyPageData || {};
return {
author: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.author = extractor_1.default.author(doc);
return global.lazyPageData.author;
},
canonicalLink: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.canonicalLink = extractor_1.default.canonicalLink(doc, resourceUrl);
return global.lazyPageData.canonicalLink;
},
copyright: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.copyright = extractor_1.default.copyright(doc);
return global.lazyPageData.copyright;
},
date: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.date = extractor_1.default.date(doc);
return global.lazyPageData.date;
},
description: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.description = extractor_1.default.description(doc);
return global.lazyPageData.description;
},
favicon: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.favicon = extractor_1.default.favicon(doc, resourceUrlObj);
return global.lazyPageData.favicon;
},
image: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.image = extractor_1.default.image(doc);
return global.lazyPageData.image;
},
jsonld: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.jsonld = extractor_1.default.jsonld(doc);
return global.lazyPageData.jsonld;
},
keywords: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.keywords = extractor_1.default.keywords(doc);
return global.lazyPageData.keywords;
},
lang: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.lang = language || extractor_1.default.lang(doc);
return global.lazyPageData.lang;
},
locale: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.locale = extractor_1.default.locale(doc);
return global.lazyPageData.locale;
},
links() {
let doc = getParsedDocForText.call(global, html);
const topNode = getTopNode.call(global, doc, this.lang());
doc = (0, cleaner_1.default)(doc);
global.lazyPageData.links = extractor_1.default.links(doc, topNode, this.lang());
return global.lazyPageData.links;
},
origin: () => {
global.lazyPageData.origin = resourceUrlObj.origin;
return global.lazyPageData.origin;
},
publisher: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.publisher = extractor_1.default.publisher(doc);
return global.lazyPageData.publisher;
},
siteName: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.siteName = extractor_1.default.siteName(doc);
return global.lazyPageData.siteName;
},
softTitle: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.softTitle = extractor_1.default.softTitle(doc);
return global.lazyPageData.softTitle;
},
tags: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.tags = extractor_1.default.tags(doc);
return global.lazyPageData.tags;
},
text() {
let doc = getParsedDocForText.call(global, html);
doc = (0, cleaner_1.default)(doc);
const topNode = getTopNode.call(global, doc, this.lang());
const textData = extractor_1.default.text(doc, topNode, this.lang());
global.lazyPageData.text = textData;
return textData;
},
title: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.title = extractor_1.default.title(doc);
return global.lazyPageData.title;
},
type: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.type = extractor_1.default.type(doc);
return global.lazyPageData.type;
},
videos() {
let doc = getParsedDocForText.call(global, html);
doc = (0, cleaner_1.default)(doc);
const topNode = getTopNode.call(global, doc, this.lang());
global.lazyPageData.videos = extractor_1.default.videos(doc, topNode);
return global.lazyPageData.videos;
},
};
};
exports.lazy = lazy;
function getCleanedDoc(html) {
if (!global.cleanedDoc) {
const doc = getParsedDoc.call(global, html);
global.cleanedDoc = (0, cleaner_1.default)(doc);
}
return global.cleanedDoc;
}
function getParsedDoc(html) {
return (global.doc = cheerio.load(html));
}
function getParsedDocForText(html) {
return (global.doc = cheerio.load(html, { xmlMode: false }));
}
function getTopNode(doc, lang) {
global.topNode = extractor_1.default.calculateBestNode(doc, lang);
return global.topNode;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa3RCQSwwQ0FLQztBQUVELGtEQUtDO0FBRUQsa0NBNEJDO0FBd0xELHNDQU1DO0FBRUQsb0NBRUM7QUFFRCxrREFFQztBQUVELGdDQUdDO0FBdjhCRCxtQ0FBbUM7QUFDbkMsc0RBQXNEO0FBQ3RELGlEQUFtQztBQUluQyw2QkFBMEI7QUFFMUIsd0RBQWdDO0FBQ2hDLDREQUE2RDtBQXVJN0QsTUFBTSxnQkFBZ0IsR0FBRyx1QkFBdUIsQ0FBQztBQUNqRCxNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQztBQUN2QyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUNsQyxNQUFNLGdDQUFnQyxHQUFHLE1BQU0sQ0FBQztBQUVoRCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxPQUFpQixDQUFDO0FBRXBFLFNBQVMsVUFBVSxDQUFDLElBQXNCO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUF3QixDQUFDO0lBQ25ELE9BQU8sQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsT0FBTyxLQUFJLEVBQUUsQ0FBQztBQUNoQyxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsT0FBdUI7SUFDekMsT0FBTyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO0FBQ3BELENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxHQUFXO0lBQzlCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNULE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gs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