User:Jack who built the house/worker-test.js.map.json

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search

Note: After saving, you have to bypass your browser's cache to see the changes. Internet Explorer: press Ctrl-F5, Mozilla: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Opera/Konqueror: press F5, Safari: hold down Shift + Alt while clicking Reload, Chrome: hold down Shift while clicking Reload.

{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/js/cd.js","webpack:///./src/js/util.js","webpack:///./node_modules/@babel/runtime/helpers/classPrivateFieldGet.js","webpack:///./src/js/CdError.js","webpack:///./src/js/timestamp.js","webpack:///./node_modules/htmlparser2/lib/index.js","webpack:///./src/js/treeWalker.js","webpack:///./node_modules/@babel/runtime/helpers/classPrivateFieldSet.js","webpack:///./node_modules/domutils/lib/tagtypes.js","webpack:///./node_modules/domelementtype/lib/index.js","webpack:///./node_modules/htmlparser2/lib/Parser.js","webpack:///./node_modules/htmlparser2/lib/Tokenizer.js","webpack:///./node_modules/entities/lib/decode_codepoint.js","webpack:///./node_modules/domhandler/lib/index.js","webpack:///./node_modules/htmlparser2/lib/FeedHandler.js","webpack:///./node_modules/domutils/lib/index.js","webpack:///./node_modules/entities/lib/decode.js","webpack:///./node_modules/entities/lib/encode.js","webpack:///./node_modules/domutils/lib/querying.js","webpack:///./src/js/staticGlobals.js","webpack:///./src/js/debug.js","webpack:///./src/js/CommentSkeleton.js","webpack:///./src/js/SectionSkeleton.js","webpack:///./node_modules/locutus/php/strings/html_entity_decode.js","webpack:///./src/js/Parser.js","webpack:///./src/js/wikitext.js","webpack:///./src/js/htmlparser2Extended.js","webpack:///./src/js/worker.js","webpack:///./node_modules/events/events.js","webpack:///./node_modules/domhandler/lib/node.js","webpack:///./node_modules/domutils/lib/stringify.js","webpack:///./node_modules/dom-serializer/index.js","webpack:///./node_modules/entities/lib/index.js","webpack:///./node_modules/domutils/lib/traversal.js","webpack:///./node_modules/domutils/lib/manipulation.js","webpack:///./node_modules/domutils/lib/legacy.js","webpack:///./node_modules/domutils/lib/helpers.js","webpack:///./node_modules/htmlparser2/lib/CollectingHandler.js","webpack:///./node_modules/htmlparser2/lib/MultiplexHandler.js","webpack:///./node_modules/locutus/php/strings/get_html_translation_table.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","context","window","self","convenientDiscussions","isInline","node","countTextNodesAsInline","nodeType","Node","TEXT_NODE","ELEMENT_NODE","cd","g","POPULAR_INLINE_ELEMENTS","includes","tagName","POPULAR_NOT_INLINE_ELEMENTS","console","warn","getComputedStyle","display","defined","el","undefined","flat","arr","concat","underlinesToSpaces","replace","spacesToUnderlines","firstCharToUpperCase","length","char","PHP_CHAR_TO_UPPER_JSON","toUpperCase","phpCharToUpper","slice","getMessages","messages","map","mw","msg","hideText","text","regexp","hidden","useAlternativeMarker","pre","textToHide","push","receiver","privateMap","descriptor","TypeError","CdError","Error","constructor","data","message","type","code","apiData","error","super","this","parseTimestampRegexp","parseTimestampRegexpNoTimezone","parseTimestamp","timestamp","timezoneOffset","RegExp","TIMESTAMP_REGEXP","source","TIMESTAMP_REGEXP_NO_TIMEZONE","match","date","TIMESTAMP_PARSER","Date","getTime","MILLISECONDS_IN_A_MINUTE","zeroPad","number","generateCommentAnchor","author","resolveCollisions","year","getUTCFullYear","month","getUTCMonth","day","getUTCDate","hours","getUTCHours","minutes","getUTCMinutes","anchor","commentAnchors","anchorNum","base","registerCommentAnchor","resetCommentAnchors","__export","__importStar","mod","result","k","Parser_1","Parser","domhandler_1","DomHandler","DefaultHandler","parseDOM","options","handler","end","dom","createDomStream","cb","elementCb","Tokenizer_1","Tokenizer","default","ElementType","EVENTS","attribute","cdatastart","cdataend","processinginstruction","comment","commentend","closetag","opentag","opentagname","DomUtils","FeedHandler_1","RssHandler","FeedHandler","TreeWalker","root","acceptNode","onlyElementNodes","startNode","currentNode","firstChildProperty","lastChildProperty","previousSiblingProperty","nextSiblingProperty","tryMove","parentNode","firstChild","lastChild","previousSibling","nextSibling","nextNode","previousNode","ElementsTreeWalker","rootElement","ElementsAndTextTreeWalker","set","writable","domelementtype_1","isTag","isCDATA","isText","isComment","hasChildren","elem","Text","Directive","Comment","Script","Style","Tag","CDATA","Doctype","extendStatics","__extends","b","setPrototypeOf","__proto__","Array","__","__importDefault","events_1","formTags","Set","pTag","openImpliesClose","tr","th","td","body","li","h1","h2","h3","h4","h5","h6","select","input","output","button","datalist","textarea","option","optgroup","dd","dt","address","article","aside","blockquote","details","div","dl","fieldset","figcaption","figure","footer","form","header","hr","main","nav","ol","section","table","ul","rt","rp","tbody","tfoot","voidElements","foreignContextElements","htmlIntegrationElements","reNameEnd","_super","cbs","_this","_tagname","_attribname","_attribvalue","_attribs","_stack","_foreignContext","startIndex","endIndex","parseChunk","write","done","_options","_cbs","_lowerCaseTagNames","lowerCaseTags","xmlMode","_lowerCaseAttributeNames","lowerCaseAttributeNames","_tokenizer","onparserinit","_updatePosition","initialOffset","_sectionStart","getAbsoluteIndex","ontext","onopentagname","toLowerCase","has","onclosetag","onopentag","onopentagend","pop","pos","lastIndexOf","_closeCurrentTag","onselfclosingtag","recognizeSelfClosing","onattribname","onattribdata","onattribend","onattribute","_getInstructionName","idx","search","substr","ondeclaration","onprocessinginstruction","name_1","name_2","oncomment","oncommentend","oncdata","recognizeCDATA","oncdatastart","oncdataend","onerror","err","onend","reset","onreset","parseComplete","chunk","pause","resume","EventEmitter","decode_codepoint_1","entities_json_1","legacy_json_1","xml_json_1","whitespace","ifElseState","upper","SUCCESS","FAILURE","lower","_state","_index","consumeSpecialNameChar","NEXT_STATE","stateBeforeCdata1","stateBeforeCdata2","stateBeforeCdata3","stateBeforeCdata4","stateBeforeCdata5","stateBeforeScript1","stateBeforeScript2","stateBeforeScript3","stateBeforeScript4","stateAfterScript1","stateAfterScript2","stateAfterScript3","stateAfterScript4","stateBeforeStyle1","stateBeforeStyle2","stateBeforeStyle3","stateAfterStyle1","stateAfterStyle2","stateAfterStyle3","stateBeforeEntity","stateBeforeNumericEntity","_buffer","_bufferOffset","_baseState","_special","_running","_ended","_xmlMode","_decodeEntities","decodeEntities","_stateText","_getSection","_stateBeforeTagName","_stateInTagName","_emitToken","_stateBeforeClosingTagName","_stateInClosingTagName","_stateAfterClosingTagName","_stateBeforeAttributeName","_stateInSelfClosingTag","_stateInAttributeName","_stateAfterAttributeName","_stateBeforeAttributeValue","_stateInAttributeValueDoubleQuotes","_stateInAttributeValueSingleQuotes","_stateInAttributeValueNoQuotes","_stateBeforeDeclaration","_stateInDeclaration","_stateInProcessingInstruction","_stateBeforeComment","_stateInComment","_stateAfterComment1","_stateAfterComment2","substring","_stateBeforeCdata6","_stateInCdata","_stateAfterCdata1","_stateAfterCdata2","_stateBeforeSpecial","_stateBeforeSpecialEnd","_stateBeforeScript5","_stateAfterScript5","_stateBeforeStyle4","_stateAfterStyle4","_parseNamedEntityStrict","entity","_emitPartial","_parseLegacyEntity","start","limit","_stateInNamedEntity","_decodeNumericEntity","offset","sectionStart","parsed","parseInt","_stateInNumericEntity","_stateInHexEntity","_cleanup","_parse","charAt","_finish","_handleTrailingData","decode_json_1","codePoint","String","fromCharCode","node_1","Element","DataNode","NodeWithChildren","reWhitespace","defaultOpts","normalizeWhitespace","withStartIndices","withEndIndices","callback","elementCB","_done","_tagStack","_lastNode","_parser","_callback","_elementCB","parser","handleCallback","attribs","element","addNode","normalize","parent","ProcessingInstruction","siblings","children","prev","next","addDataNode","feed","feedRoot","getOneElement","isValidFeed","childs","addConditionally","href","getAttribute","link","updated","fetch","items","getElements","item","entry","description","pubDate","id","what","where","getElementsByTagName","recurse","getText","trim","obj","prop","tmp","defaultOptions","parseFeed","decodeXML","getStrictDecoder","decodeHTMLStrict","keys","join","getReplacer","re","str","sorter","a","decodeHTML","legacy","sort","j","replacer","inverseXML","getInverseObj","xmlReplacer","getInverseReplacer","encodeXML","getInverse","inverseHTML","htmlReplacer","encodeHTML","reduce","inverse","single","multiple","forEach","unshift","reNonASCII","reAstralSymbols","singleCharReplacer","charCodeAt","toString","astralReplacer","_","reXmlChars","escape","tagtypes_1","filter","test","Infinity","isArray","find","elems","findOneChild","findOne","checked","existsOne","findAll","rootElems","stack","shift","apply","LETTER_PATTERN","COMMENT_UNDERLAY_FOCUSED_COLOR","COMMENT_UNDERLAY_TARGET_COLOR","COMMENT_UNDERLAY_NEW_COLOR","COMMENT_UNDERLAY_OWN_COLOR","COMMENT_UNDERLAY_SIDE_MARGIN","HIGHLIGHT_NEW_COMMENTS_INTERVAL","CHECK_FOR_NEW_COMMENTS_INTERVAL","BACKGROUND_CHECK_FOR_NEW_COMMENTS_INTERVAL","SECONDS_IN_A_DAY","UNHIGHLIGHTABLE_ELEMENTS_CLASSES","BAD_COMMENT_BEGINNINGS","FLOATING_ELEMENTS_SELECTORS","SIGN_CODE","init","timerTotal","timerStartTimestamps","timerRunCount","timerAllRunsTotal","initCounters","array","counters","Proxy","startTimer","label","now","stopTimer","thisTime","resetTimer","fullResetTimer","logAndResetTimer","debug","logAndResetEverything","timerLabels","counterLabels","averageTimerTime","average","toFixed","incrementCounter","CommentSkeleton","signature","parts","collectParts","removeNestedParts","encloseInlineParts","filterParts","reverse","replaceListsWithItems","comments","timestampText","authorName","own","CURRENT_USER_NAME","unsigned","elements","part","highlightables","some","classList","contains","addAttributes","setLevels","isHeading","followsHeading","level","splice","isOpeningSection","headingLevelMatch","openingSectionOfLevel","Number","setAttribute","add","levelElements","top","getLevelsUpTree","bottom","Math","min","getSection","sections","sourcePage","CURRENT_PAGE","SectionSkeleton","headingElement","headlineElement","getElementByClassName","classesToFilter","config","foreignElementsInHeadlinesClasses","nodes","from","childNodes","headline","textContent","levelMatch","treeWalker","headingNestingLevel","levelRegexp","firstCommentPart","lastCommentPart","hasSubsections","lastElementInFirstChunk","lastNode","firstCommentPartId","lastCommentPartId","findIndex","follows","commentsInFirstChunk","string","quoteStyle","getHtmlTranslationTable","tmpStr","symbol","hashMap","split","getUserNameFromLink","pageName","url","decodeURIComponent","e","uri","Uri","path","ARTICLE_PATH_REGEXP","query","title","getPageNameFromUrl","userName","USER_NAMESPACES_REGEXP","startsWith","CONTRIBS_PAGE","CONTRIBS_PAGE_LINK_REGEXP","createComment","CommentClass","createSection","watchedSectionsRequest","SectionClass","findTimestamps","blocksToExclude","elementsToExcludeClasses","className","getElementsByClassName","getAllTextNodes","block","finding","document","createElement","textNode","createTextNode","appendChild","remainedText","index","afterNode","insertBefore","findSignatures","timestamps","signatures","timestampElement","unsignedElement","closestNotInlineAncestor","unsignedClass","Boolean","cniaChildren","childElementsProperty","found","startElement","firstSignatureElement","signatureNodes","hasAuthorLinks","signatureScanLimit","firstSignatureElementIndex","indexOf","signatureContainer","startElementNextSibling","sig1","sig2","signatureElement","firstForeignComponentAfter","isTextNode","hasCurrentSignature","hasForeignComponents","lastStep","timezoneRegexp","TIMEZONE_REGEXP","previousPart","signatureEndingRegexp","dived","previousElementSibling","checkForCustomForeignComponents","nextDiveElementIndex","sequencesToBeEnclosed","encloseThis","sequence","wrapper","newNode","lastPart","partTextNoSpaces","current","every","child","newParts","assign","initialElement","findHeadings","headings","heading1","heading2","decodeHtmlEntities","html_entity_decode","walkThroughSubtree","checkSelf","dummyDom","NodeConstructor","getPrototypeOf","returnValue","getOuterHTML","remove","referenceNode","prepend","removeChild","removeElement","thisTree","nodeTree","sharedParent","thisSharedParentChild","nodeSharedParentChild","_classList","list","movedFromClassAttr","moveFromClassAttr","classAttr","names","our","Document","content","el1","el2","alarmTimeout","setAlarm","interval","clearTimeout","setTimeout","postMessage","parse","heading","specialElements","pageHasOutdents","targetComment","otherComment","sectionHeadline","sectionAnchor","targetCommentAuthorName","toMe","onMessageFromWindow","checker","eval","onmessage","ReflectOwnKeys","R","Reflect","ReflectApply","target","args","Function","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","NumberIsNaN","isNaN","_events","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","listener","arg","RangeError","setMaxListeners","_getMaxListeners","that","getMaxListeners","emit","arguments","doError","events","er","len","listeners","arrayClone","_addListener","existing","newListener","warned","w","emitter","count","warning","ProcessEmitWarning","addListener","on","prependListener","onceWrapper","fired","removeListener","wrapFn","_onceWrap","state","wrapped","once","prependOnceListener","position","originalListener","spliceOne","off","removeAllListeners","_listeners","unwrap","evlistener","ret","unwrapListeners","rawListeners","listenerCount","eventNames","copy","nodeTypes","Map","configurable","dom_serializer_1","getInnerHTML","entities","foreignNames","elementNames","attributeNames","unencodedElements","style","script","xmp","iframe","noembed","noframes","plaintext","noscript","singleTag","area","basefont","br","col","command","embed","frame","img","isindex","keygen","meta","param","track","wbr","render","opts","cheerio","renderTag","renderDirective","renderComment","renderCdata","renderText","foreignModeIntegrationPoints","tag","attributes","formatAttrs","decode_1","encode_1","decode","decodeStrict","encode","encode_2","encodeHTML4","encodeHTML5","decode_2","decodeHTML4","decodeHTML5","decodeHTML4Strict","decodeHTML5Strict","decodeXMLStrict","getChildren","getParent","getSiblings","getAttributeValue","hasAttrib","getName","replaceElement","replacement","sibling","append","currNext","querying_1","Checks","tag_name","tag_type","tag_contains","getAttribCheck","attrib","combineFuncs","compileTest","funcs","testElement","getElementById","getElementsByTagType","removeSubsets","ancestor","compareDocumentPosition","nodeA","nodeB","aParents","bParents","aSibling","bSibling","uniqueSort","relative","CollectingHandler","_a","_i","restart","_b","MultiplexHandler","func","_func","decimal","useTable","useQuoteStyle","constMappingTable","constMappingQuoteStyle"],"mappings":"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","file":"worker-test.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 29);\n","/**\r\n * @module cd\r\n */\r\n\r\n// Window or worker context\r\nconst context = typeof window === 'undefined' ? self : window;\r\n\r\n/**\r\n * @namespace convenientDiscussions\r\n */\r\ncontext.convenientDiscussions = context.convenientDiscussions || {};\r\nif (typeof context.convenientDiscussions !== 'object') {\r\n  context.convenientDiscussions = {};\r\n}\r\n\r\nexport default context.convenientDiscussions;\r\n","/**\r\n * Utilities module. Utilities that go to the {@link module:cd~convenientDiscussions.util\r\n * convenientDiscussions.util} object are in {@link module:globalUtil}.\r\n *\r\n * @module util\r\n */\r\n\r\nimport CdError from './CdError';\r\nimport Page from './Page';\r\nimport cd from './cd';\r\n\r\nlet keptScrollPosition = null;\r\n\r\n/**\r\n * Removes duplicated elements from an array.\r\n *\r\n * @param {Array} arr\r\n * @returns {?Array}\r\n */\r\nexport function removeDuplicates(arr) {\r\n  if (!arr || typeof arr !== 'object') {\r\n    return null;\r\n  }\r\n  return arr.filter((value, i) => arr.indexOf(value) === i);\r\n}\r\n\r\n/**\r\n * Generates a transparent color for the given color to use it in a gradient.\r\n *\r\n * @param {string} color\r\n * @returns {string}\r\n */\r\nexport function transparentize(color) {\r\n  const dummyElement = document.createElement('span');\r\n  dummyElement.style.color = color;\r\n  color = dummyElement.style.color;\r\n  return color.includes('rgba') ?\r\n    color.replace(/\\d+(?=\\))/, '0') :\r\n    color\r\n      .replace(/rgb/, 'rgba')\r\n      .replace(/\\)/, ', 0)');\r\n}\r\n\r\n/**\r\n * Check if a node is an element with `display: inline` in the default browser styles. As an option,\r\n * it can also treat text nodes as inline elements.\r\n *\r\n * @param {Node} node\r\n * @param {boolean} countTextNodesAsInline\r\n * @returns {?boolean}\r\n */\r\nexport function isInline(node, countTextNodesAsInline) {\r\n  if (countTextNodesAsInline && node.nodeType === Node.TEXT_NODE) {\r\n    return true;\r\n  }\r\n\r\n  // Precaution\r\n  if (node.nodeType !== Node.ELEMENT_NODE) {\r\n    return null;\r\n  }\r\n\r\n  if (cd.g.POPULAR_INLINE_ELEMENTS.includes(node.tagName)) {\r\n    return true;\r\n  } else if (cd.g.POPULAR_NOT_INLINE_ELEMENTS.includes(node.tagName)) {\r\n    return false;\r\n  } else {\r\n    // This can be called from a worker.\r\n    if (typeof window !== 'undefined') {\r\n      console.warn('Expensive operation: isInline() called for:', node);\r\n\r\n      // This is very expensive. Avoid by any means.\r\n      return window.getComputedStyle(node).display === 'inline';\r\n    } else {\r\n      return null;\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * Generate a pattern for use in a regular expression from a string that is case-insensitive for the\r\n * first character only.\r\n *\r\n * @param {string} s\r\n * @returns {string}\r\n */\r\nexport function caseInsensitiveFirstCharPattern(s) {\r\n  const firstChar = s[0];\r\n  return (\r\n    (\r\n      // Could be issues, probably not very serious, resulting from the difference of PHP's\r\n      // mb_strtoupper and JavaScript's String#toUpperCase, see firstCharToUpperCase() and\r\n      // https://phabricator.wikimedia.org/T141723#2513800.\r\n      firstChar.toUpperCase() !== firstChar.toLowerCase() ?\r\n      '[' + firstChar.toUpperCase() + firstChar.toLowerCase() + ']' :\r\n      mw.util.escapeRegExp(firstChar)\r\n    ) +\r\n    mw.util.escapeRegExp(s.slice(1))\r\n  );\r\n}\r\n\r\n/**\r\n * Check if the provided page is probably a talk page. The namespace number is required.\r\n *\r\n * This function exists mostly because we can't be sure the `mediawiki.Title` module is loaded when\r\n * the script has started executing (and can't use the {@link module:Page Page} constructor), and we\r\n * need to make this check fast. So, in most cases, {@link module:Page#isProbablyTalkPage} should be\r\n * used.\r\n *\r\n * @param {string} pageName\r\n * @param {number} namespaceNumber\r\n * @returns {boolean}\r\n */\r\nexport function isProbablyTalkPage(pageName, namespaceNumber) {\r\n  return (\r\n    (\r\n      namespaceNumber % 2 === 1 ||\r\n      (cd.g.PAGE_WHITE_LIST_REGEXP && cd.g.PAGE_WHITE_LIST_REGEXP.test(pageName)) ||\r\n      !cd.g.PAGE_WHITE_LIST_REGEXP && cd.config.customTalkNamespaces.includes(namespaceNumber)\r\n    ) &&\r\n    (!cd.g.PAGE_BLACK_LIST_REGEXP || !cd.g.PAGE_BLACK_LIST_REGEXP.test(pageName))\r\n  );\r\n}\r\n\r\n/**\r\n * Check by an edit summary if an edit is probably an edit of a comment.\r\n *\r\n * @param {string} summary\r\n * @returns {boolean}\r\n */\r\nexport function isCommentEdit(summary) {\r\n  return (\r\n    summary &&\r\n    (\r\n      summary.includes(`${cd.s('es-edit')} ${cd.s('es-reply-genitive')}`) ||\r\n      summary.includes(`${cd.s('es-edit')} ${cd.s('es-addition-genitive')}`)\r\n    )\r\n  );\r\n}\r\n\r\n/**\r\n * Check by an edit summary if an edit is probably an undo.\r\n *\r\n * @param {string} summary\r\n * @returns {boolean}\r\n */\r\nexport function isUndo(summary) {\r\n  return summary && cd.config.undoTexts.some((text) => summary.includes(text));\r\n}\r\n\r\n/**\r\n * Callback for `Array#filter` functions used with `Array#map`.\r\n *\r\n * @param {*} el\r\n * @returns {boolean}\r\n */\r\nexport function defined(el) {\r\n  return el !== undefined;\r\n}\r\n\r\n/**\r\n * Callback for `Array#filter` functions used with `Array#map`.\r\n *\r\n * @param {*} el\r\n * @returns {boolean}\r\n */\r\nexport function notNull(el) {\r\n  return el !== undefined && el !== null;\r\n}\r\n\r\n/**\r\n * Return an array with a changed start index (`[0, 1, 2, 3]` can be transformed into `[2, 3, 0,\r\n * 1]`) and optionally reversed while keeping the start index (`[0, 1, 2, 3]` can be transformed\r\n * into `[2, 1, 0, 3]`).\r\n *\r\n * @param {Array} arr\r\n * @param {number} startIndex\r\n * @param {boolean} [reverse=false]\r\n * @returns {Array}\r\n */\r\nexport function reorderArray(arr, startIndex, reverse = false) {\r\n  return reverse ?\r\n    arr\r\n      .slice(startIndex + 1)\r\n      .concat(arr.slice(0, startIndex + 1))\r\n      .reverse() :\r\n    arr\r\n      .slice(startIndex)\r\n      .concat(arr.slice(0, startIndex))\r\n}\r\n\r\n/**\r\n * Alternative to `Array#flat(1)`. That method is not yet supported by major browsers.\r\n *\r\n * @param {Array} arr\r\n * @returns {Array}\r\n */\r\nexport function flat(arr) {\r\n  return [].concat(...arr);\r\n}\r\n\r\n/**\r\n * Callback used in the `.catch()` parts of `mw.Api` requests.\r\n *\r\n * @param {string} code\r\n * @param {object} data\r\n * @throws {CdError}\r\n */\r\nexport function handleApiReject(code, data) {\r\n  // See parameters with which mw.Api() rejects:\r\n  // https://phabricator.wikimedia.org/source/mediawiki/browse/master/resources/src/mediawiki.api/index.js;fbfa8f1a61c5ffba664e817701439affb4f6a388$245\r\n  throw code === 'http' ?\r\n    new CdError({ type: 'network' }) :\r\n    new CdError({\r\n      type: 'api',\r\n      code: 'error',\r\n      apiData: data,\r\n    });\r\n}\r\n\r\n/**\r\n * Transforms underlines to spaces in a string.\r\n *\r\n * @param {string} s\r\n * @returns {string}\r\n */\r\nexport function underlinesToSpaces(s) {\r\n  return s.replace(/_/g, ' ');\r\n}\r\n\r\n/**\r\n * Transforms spaces to underlines in a string.\r\n *\r\n * @param {string} s\r\n * @returns {string}\r\n */\r\nexport function spacesToUnderlines(s) {\r\n  return s.replace(/ /g, '_');\r\n}\r\n\r\n/**\r\n * Replaces sequences of spaces to one spaces.\r\n *\r\n * @param {string} s\r\n * @returns {string}\r\n */\r\nexport function removeDoubleSpaces(s) {\r\n  return s.replace(/ {2,}/g, ' ');\r\n}\r\n\r\n/**\r\n * Attach callback functions to links with the provided class names given HTML code, wrap in a\r\n * `<span>` element, and return the resultant jQuery object.\r\n *\r\n * @param {string|JQuery} html\r\n * @param {...Array.<string, Function>} classToCallback\r\n * @returns {JQuery}\r\n */\r\nexport function animateLinks(html, ...classToCallback) {\r\n  const $link = html instanceof $ ? html : cd.util.wrapInElement(html);\r\n  classToCallback.forEach(([className, callback]) => {\r\n    $link.find(`.${className}`).on('click', callback);\r\n  });\r\n  return $link;\r\n}\r\n\r\n/**\r\n * Provide `mw.Title.phpCharToUpper` functionality for the web worker context.\r\n *\r\n * @param {string} char\r\n * @returns {string}\r\n */\r\nfunction phpCharToUpper(char) {\r\n  if (cd.g.PHP_CHAR_TO_UPPER_JSON[char] === '') {\r\n    return char;\r\n  }\r\n  return cd.g.PHP_CHAR_TO_UPPER_JSON[char] || char.toUpperCase();\r\n}\r\n\r\n/**\r\n * Transform the first letter of a string to upper case, for example: `'wikilink'` → `'Wikilink'`.\r\n * Do it in PHP, not JavaScript, fashion to match the MediaWiki behavior, see {@link\r\n * https://phabricator.wikimedia.org/T141723#2513800}.\r\n *\r\n * @param {string} s\r\n * @returns {string}\r\n */\r\nexport function firstCharToUpperCase(s) {\r\n  return s.length ? phpCharToUpper(s[0]) + s.slice(1) : '';\r\n}\r\n\r\n/**\r\n * Get text of the localization messages.\r\n *\r\n * @param {string[]} messages\r\n * @returns {string[]}\r\n */\r\nexport function getMessages(messages) {\r\n  return messages.map(mw.msg);\r\n}\r\n\r\n/**\r\n * `Array#findIndex` analog that looks for the _last_ index.\r\n *\r\n * @param {Array} arr\r\n * @param {Function} callback\r\n * @returns {?number}\r\n */\r\nexport function findLastIndex(arr, callback) {\r\n  for (let i = arr.length - 1; i >= 0; i--) {\r\n    if (callback(arr[i])) {\r\n      return i;\r\n    }\r\n  }\r\n  return null;\r\n}\r\n\r\n/**\r\n * Check if an input or editable element is focused.\r\n *\r\n * @returns {boolean}\r\n */\r\nexport function isInputFocused() {\r\n  return $(':focus:input').length || $(':focus').prop('isContentEditable');\r\n}\r\n\r\n/**\r\n * Turn many regexps into one, putting it in `()` and separating individual expressions by `|`.\r\n *\r\n * @param {RegExp[]|string[]} arr\r\n * @returns {?RegExp}\r\n */\r\nexport function mergeRegexps(arr) {\r\n  if (!arr) {\r\n    return null;\r\n  }\r\n  const pattern = arr\r\n    .map((regexpOrString) => regexpOrString.source || regexpOrString)\r\n    .join('|');\r\n  return pattern ? new RegExp(`(${pattern})`) : null;\r\n}\r\n\r\n/**\r\n * Replace text matched by a regexp with placeholders.\r\n *\r\n * @param {string} text\r\n * @param {RegExp} regexp\r\n * @param {string[]} hidden\r\n * @param {boolean} useAlternativeMarker\r\n * @returns {string}\r\n */\r\nexport function hideText(text, regexp, hidden, useAlternativeMarker) {\r\n  return text.replace(regexp, (s, pre, textToHide) => {\r\n    // If there is no groups, the offset is the second argument.\r\n    if (typeof pre === 'number') {\r\n      pre = '';\r\n      textToHide = '';\r\n    }\r\n    // Handle tables separately\r\n    return (\r\n      (pre || '') +\r\n      (useAlternativeMarker ? '\\x03' : '\\x01') +\r\n      hidden.push(textToHide || s) +\r\n      (useAlternativeMarker ? '\\x04' : '\\x02')\r\n    );\r\n  });\r\n}\r\n\r\n/**\r\n * Replace placeholders created by {@link module:util.hide}.\r\n *\r\n * @param {string} text\r\n * @param {string[]} hidden\r\n * @returns {string}\r\n */\r\nexport function unhideText(text, hidden) {\r\n  while (text.match(/(?:\\x01|\\x03)\\d+(?:\\x02|\\x04)/)) {\r\n    text = text.replace(/(?:\\x01|\\x03)(\\d+)(?:\\x02|\\x04)/g, (s, num) => hidden[num - 1]);\r\n  }\r\n\r\n  return text;\r\n}\r\n\r\n/**\r\n * Save the scroll position to restore it later with {@link module:util.restoreScrollPosition}.\r\n */\r\nexport function saveScrollPosition() {\r\n  keptScrollPosition = window.pageYOffset;\r\n}\r\n\r\n/**\r\n * Restore the scroll position saved in {@link module:util.saveScrollPosition}.\r\n */\r\nexport function restoreScrollPosition() {\r\n  if (keptScrollPosition === null) return;\r\n  window.scrollTo(0, keptScrollPosition);\r\n  keptScrollPosition = null;\r\n}\r\n","function _classPrivateFieldGet(receiver, privateMap) {\n  var descriptor = privateMap.get(receiver);\n\n  if (!descriptor) {\n    throw new TypeError(\"attempted to get private field on non-instance\");\n  }\n\n  if (descriptor.get) {\n    return descriptor.get.call(receiver);\n  }\n\n  return descriptor.value;\n}\n\nmodule.exports = _classPrivateFieldGet;","/**\r\n * Custom error class.\r\n *\r\n * @module CdError\r\n */\r\nexport default class CdError extends Error {\r\n  constructor(data) {\r\n    let message;\r\n    if (data) {\r\n      message = data.type;\r\n      if (data.code) {\r\n        message += `/${data.code}`;\r\n      }\r\n      if (data?.apiData?.error?.code) {\r\n        message += `/${data.apiData.error.code}`;\r\n      }\r\n    } else {\r\n      message = '';\r\n    }\r\n    super(message);\r\n    this.name = 'CdError';\r\n    this.data = data;\r\n  }\r\n}\r\n","/**\r\n * Comment timestamp and author processing utilities. These are mostly format conversion utilities.\r\n * Listing of different formats of dates, digits, and timezones together with regexp and parser\r\n * generators go in {@link module:dateFormat}. Functions related to wikitext parsing go in {@link\r\n * module:wikitext}.\r\n *\r\n * Terminology used here (and in other modules):\r\n * - \"date\" is a `Date` object,\r\n * - \"timestamp\" is a string date as it is present on wiki pages (`23:29, 10 May 2019 (UTC)`).\r\n *\r\n * @module timestamp\r\n */\r\n\r\nimport cd from './cd';\r\nimport { getMessages, spacesToUnderlines } from './util';\r\n\r\nlet parseTimestampRegexp;\r\nlet parseTimestampRegexpNoTimezone;\r\n\r\n/**\r\n * @typedef {object} ParseTimestampReturn\r\n * @property {Date} date\r\n * @property {object} match\r\n */\r\n\r\n/**\r\n * Parse a timestamp, and return a date and the match object.\r\n *\r\n * @param {string} timestamp\r\n * @param {number} [timezoneOffset=0] Timezone offset in minutes.\r\n * @returns {?ParseTimestampReturn}\r\n */\r\nexport function parseTimestamp(timestamp, timezoneOffset) {\r\n  // Creating these regexp every time takes too long, so we cache them.\r\n  if (!parseTimestampRegexp) {\r\n    parseTimestampRegexp = new RegExp(`^([^]*)(${cd.g.TIMESTAMP_REGEXP.source})`);\r\n  }\r\n  if (!parseTimestampRegexpNoTimezone) {\r\n    parseTimestampRegexpNoTimezone = (\r\n      new RegExp(`^([^]*)(${cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE.source})`)\r\n    );\r\n  }\r\n\r\n  const regexp = timezoneOffset === undefined ?\r\n    parseTimestampRegexp :\r\n    parseTimestampRegexpNoTimezone;\r\n  const match = timestamp.match(regexp);\r\n  if (!match) {\r\n    return null;\r\n  }\r\n\r\n  let date = cd.g.TIMESTAMP_PARSER(match, cd);\r\n  if (timezoneOffset) {\r\n    date = new Date(date.getTime() - timezoneOffset * cd.g.MILLISECONDS_IN_A_MINUTE);\r\n  }\r\n\r\n  return { date, match };\r\n}\r\n\r\n/**\r\n * Pad a number with zeros like this: `4` → `04` or `0004`.\r\n *\r\n * @param {number} number Number to pad.\r\n * @param {number} length Length of the resultant string.\r\n * @returns {string}\r\n * @private\r\n */\r\nfunction zeroPad(number, length) {\r\n  return ('0000' + number).slice(-length);\r\n}\r\n\r\n/**\r\n * Convert a date to a string in the timestamp format.\r\n *\r\n * @param {Date} date\r\n * @returns {string}\r\n */\r\nexport function formatDate(date) {\r\n  const format = cd.g.DATE_FORMAT;\r\n\r\n  let s = '';\r\n\r\n  for (let p = 0; p < format.length; p++) {\r\n    let code = format[p];\r\n    if (code === 'x' && p < format.length - 1) {\r\n      code += format[++p];\r\n    }\r\n    if (code === 'xk' && p < format.length - 1) {\r\n      code += format[++p];\r\n    }\r\n\r\n    switch (code) {\r\n      case 'xx':\r\n        s += 'x';\r\n        break;\r\n      case 'xg':\r\n        s += getMessages([\r\n          'january-gen', 'february-gen', 'march-gen', 'april-gen', 'may-gen', 'june-gen',\r\n          'july-gen', 'august-gen', 'september-gen', 'october-gen', 'november-gen', 'december-gen'\r\n        ])[date.getUTCMonth()];\r\n        break;\r\n      case 'd':\r\n        s += zeroPad(date.getUTCDate(), 2);\r\n        break;\r\n      case 'D':\r\n        s += getMessages(['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'])[date.getUTCDay()];\r\n        break;\r\n      case 'j':\r\n        s += date.getUTCDate();\r\n        break;\r\n      case 'l':\r\n        s += getMessages([\r\n          'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'\r\n        ])[date.getDay()];\r\n        break;\r\n      case 'F':\r\n        s += getMessages([\r\n          'january', 'february', 'march', 'april', 'may_long', 'june', 'july', 'august',\r\n          'september', 'october', 'november', 'december'\r\n        ])[date.getUTCMonth()];\r\n        break;\r\n      case 'M':\r\n        s += getMessages([\r\n          'jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'\r\n        ])[date.getUTCMonth()];\r\n        break;\r\n      case 'n':\r\n        s += date.getUTCMonth() + 1;\r\n        break;\r\n      case 'Y':\r\n        s += date.getUTCFullYear();\r\n        break;\r\n      case 'xkY':\r\n        s += date.getUTCFullYear() + 543;\r\n        break;\r\n      case 'G':\r\n        s += date.getUTCHours();\r\n        break;\r\n      case 'H':\r\n        s += zeroPad(date.getUTCHours(), 2);\r\n        break;\r\n      case 'i':\r\n        s += zeroPad(date.getUTCMinutes(), 2);\r\n        break;\r\n      case '\\\\':\r\n        // Backslash escaping\r\n        if (p < format.length - 1) {\r\n          s += format[++p];\r\n        } else {\r\n          s += '\\\\';\r\n        }\r\n        break;\r\n      case '\"':\r\n        // Quoted literal\r\n        if (p < format.length - 1) {\r\n          const endQuote = format.indexOf('\"', p + 1)\r\n          if (endQuote === -1) {\r\n            // No terminating quote, assume literal \"\r\n            s += '\"';\r\n          } else {\r\n            s += format.substr(p + 1, endQuote - p - 1);\r\n            p = endQuote;\r\n          }\r\n        } else {\r\n          // Quote at end of string, assume literal \"\r\n          s += '\"';\r\n        }\r\n        break;\r\n      default:\r\n        s += format[p];\r\n    }\r\n  }\r\n\r\n  return s;\r\n}\r\n\r\n/**\r\n * Generate a comment anchor from a date and author.\r\n *\r\n * @param {Date} date\r\n * @param {string} [author]\r\n * @param {boolean} [resolveCollisions=false] If set to `true`, anchors that collide with anchors\r\n *   already registered via {@link module:timestamp.registerCommentAnchor} will get a `_<number>`\r\n *   postfix.\r\n * @returns {string}\r\n */\r\nexport function generateCommentAnchor(date, author, resolveCollisions = false) {\r\n  let year = date.getUTCFullYear();\r\n  let month = date.getUTCMonth();\r\n  let day = date.getUTCDate();\r\n  let hours = date.getUTCHours();\r\n  let minutes = date.getUTCMinutes();\r\n\r\n  let anchor = (\r\n    zeroPad(year, 4) +\r\n    zeroPad(month + 1, 2) +\r\n    zeroPad(day, 2) +\r\n    zeroPad(hours, 2) +\r\n    zeroPad(minutes, 2) +\r\n    (author ? '_' + spacesToUnderlines(author) : '')\r\n  );\r\n  if (resolveCollisions && commentAnchors.includes(anchor)) {\r\n    let anchorNum = 2;\r\n    const base = anchor;\r\n    do {\r\n      anchor = `${base}_${anchorNum}`;\r\n      anchorNum++;\r\n    } while (commentAnchors.includes(anchor));\r\n  }\r\n  return anchor;\r\n}\r\n\r\nlet commentAnchors = [];\r\n\r\n/**\r\n * Add a comment anchor to the registry to avoid collisions.\r\n *\r\n * @param {string} anchor\r\n */\r\nexport function registerCommentAnchor(anchor) {\r\n  if (anchor) {\r\n    commentAnchors.push(anchor);\r\n  }\r\n}\r\n\r\n/**\r\n * Empty the comment anchor registry.\r\n *\r\n * Meant to be executed any time we start processing a new page. If we forget to run it, the newly\r\n * registered anchors can get extra `_2` or similar text at the end due to collisions with the\r\n * existing anchors that were not unloaded.\r\n */\r\nexport function resetCommentAnchors() {\r\n  commentAnchors = [];\r\n}\r\n\r\n/**\r\n * @typedef {object} ParseCommentAnchorReturn\r\n * @property {Date} date\r\n * @property {string} author\r\n */\r\n\r\n/**\r\n * Extract a date and author from a comment anchor.\r\n *\r\n * @param {string} commentAnchor\r\n * @returns {?ParseCommentAnchorReturn}\r\n */\r\nexport function parseCommentAnchor(commentAnchor) {\r\n  const match = commentAnchor.match(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})_(.+)$/);\r\n  if (!match) {\r\n    return null;\r\n  }\r\n\r\n  const year = Number(match[1]);\r\n  const month = Number(match[2]) - 1;\r\n  const day = Number(match[3]);\r\n  const hours = Number(match[4]);\r\n  const minutes = Number(match[5]);\r\n  const author = match[6];\r\n\r\n  const date = new Date(Date.UTC(year, month, day, hours, minutes));\r\n\r\n  return { date, author };\r\n}\r\n","\"use strict\";\nfunction __export(m) {\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nvar __importStar = (this && this.__importStar) || function (mod) {\n    if (mod && mod.__esModule) return mod;\n    var result = {};\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n    result[\"default\"] = mod;\n    return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Parser_1 = require(\"./Parser\");\nexports.Parser = Parser_1.Parser;\nvar domhandler_1 = require(\"domhandler\");\nexports.DomHandler = domhandler_1.DomHandler;\nexports.DefaultHandler = domhandler_1.DomHandler;\n// Helper methods\n/**\n * Parses data, returns the resulting DOM.\n *\n * @param data The data that should be parsed.\n * @param options Optional options for the parser and DOM builder.\n */\nfunction parseDOM(data, options) {\n    var handler = new domhandler_1.DomHandler(void 0, options);\n    new Parser_1.Parser(handler, options).end(data);\n    return handler.dom;\n}\nexports.parseDOM = parseDOM;\n/**\n * Creates a parser instance, with an attached DOM handler.\n *\n * @param cb A callback that will be called once parsing has been completed.\n * @param options Optional options for the parser and DOM builder.\n * @param elementCb An optional callback that will be called every time a tag has been completed inside of the DOM.\n */\nfunction createDomStream(cb, options, elementCb) {\n    var handler = new domhandler_1.DomHandler(cb, options, elementCb);\n    return new Parser_1.Parser(handler, options);\n}\nexports.createDomStream = createDomStream;\nvar Tokenizer_1 = require(\"./Tokenizer\");\nexports.Tokenizer = Tokenizer_1.default;\nvar ElementType = __importStar(require(\"domelementtype\"));\nexports.ElementType = ElementType;\n/**\n * List of all events that the parser emits.\n *\n * Format: eventname: number of arguments.\n */\nexports.EVENTS = {\n    attribute: 2,\n    cdatastart: 0,\n    cdataend: 0,\n    text: 1,\n    processinginstruction: 2,\n    comment: 1,\n    commentend: 0,\n    closetag: 1,\n    opentag: 2,\n    opentagname: 1,\n    error: 1,\n    end: 0\n};\n/*\n    All of the following exports exist for backwards-compatibility.\n    They should probably be removed eventually.\n*/\n__export(require(\"./FeedHandler\"));\n__export(require(\"./WritableStream\"));\n__export(require(\"./CollectingHandler\"));\nvar DomUtils = __importStar(require(\"domutils\"));\nexports.DomUtils = DomUtils;\nvar FeedHandler_1 = require(\"./FeedHandler\");\nexports.RssHandler = FeedHandler_1.FeedHandler;\n","/**\r\n * Tree walker classes.\r\n *\r\n * @module treeWalker\r\n */\r\n\r\nimport cd from './cd';\r\n\r\n/**\r\n * Generalization and simplification of the TreeWalker web API for the normal and worker contexts.\r\n */\r\nexport class TreeWalker {\r\n  /**\r\n   * Create a tree walker.\r\n   *\r\n   * @param {Node} root Node that limits where the tree walker can go within this document's tree:\r\n   *   only the root node and its descendants.\r\n   * @param {Function} [acceptNode] Function that returns `true` if the tree walker should accept\r\n   *   the node, and `false` if it should reject.\r\n   * @param {boolean} [onlyElementNodes=false] Walk only on element nodes, ignoring nodes of other\r\n   *   types.\r\n   * @param {Node} [startNode=root] Node to set as a current node.\r\n   */\r\n  constructor(root, acceptNode, onlyElementNodes = false, startNode = root) {\r\n    this.acceptNode = acceptNode;\r\n    this.root = root;\r\n    this.currentNode = startNode;\r\n\r\n    if (onlyElementNodes) {\r\n      this.firstChildProperty = 'firstElementChild';\r\n      this.lastChildProperty = 'lastElementChild';\r\n      this.previousSiblingProperty = 'previousElementSibling';\r\n      this.nextSiblingProperty = 'nextElementSibling';\r\n    } else {\r\n      this.firstChildProperty = 'firstChild';\r\n      this.lastChildProperty = 'lastChild';\r\n      this.previousSiblingProperty = 'previousSibling';\r\n      this.nextSiblingProperty = 'nextSibling';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Try changing the current node to a node specified by the property.\r\n   *\r\n   * @param {string} property\r\n   * @returns {?Node}\r\n   * @private\r\n   */\r\n  tryMove(property) {\r\n    let node = this.currentNode;\r\n    if (node === this.root && !property.includes('Child')) {\r\n      return null;\r\n    }\r\n    do {\r\n      node = node[property];\r\n    } while (node && this.acceptNode && !this.acceptNode(node));\r\n    if (node) {\r\n      this.currentNode = node;\r\n    }\r\n    return node || null;\r\n  }\r\n\r\n  /**\r\n   * Go to the parent node.\r\n   *\r\n   * @returns {?Node}\r\n   */\r\n  parentNode() {\r\n    return this.tryMove('parentNode');\r\n  }\r\n\r\n  /**\r\n   * Go to the first child node.\r\n   *\r\n   * @returns {?Node}\r\n   */\r\n  firstChild() {\r\n    return this.tryMove(this.firstChildProperty);\r\n  }\r\n\r\n  /**\r\n   * Go to the last child node.\r\n   *\r\n   * @returns {?Node}\r\n   */\r\n  lastChild() {\r\n    return this.tryMove(this.lastChildProperty);\r\n  }\r\n\r\n  /**\r\n   * Go to the previous sibling node.\r\n   *\r\n   * @returns {?Node}\r\n   */\r\n  previousSibling() {\r\n    return this.tryMove(this.previousSiblingProperty);\r\n  }\r\n\r\n  /**\r\n   * Go to the next sibling node.\r\n   *\r\n   * @returns {?Node}\r\n   */\r\n  nextSibling() {\r\n    return this.tryMove(this.nextSiblingProperty);\r\n  }\r\n\r\n  /**\r\n   * Go to the next node (don't confuse with the next sibling).\r\n   *\r\n   * @returns {?Node}\r\n   */\r\n  nextNode() {\r\n    let node = this.currentNode;\r\n    do {\r\n      if (node[this.firstChildProperty]) {\r\n        node = node[this.firstChildProperty];\r\n      } else {\r\n        while (node && !node[this.nextSiblingProperty] && node.parentNode !== this.root) {\r\n          node = node.parentNode;\r\n        }\r\n        if (node) {\r\n          node = node[this.nextSiblingProperty];\r\n        }\r\n      }\r\n    } while (node && this.acceptNode && !this.acceptNode(node));\r\n    if (node) {\r\n      this.currentNode = node;\r\n    }\r\n    return node;\r\n  }\r\n\r\n  /**\r\n   * Go to the previous node (don't confuse with the previous sibling).\r\n   *\r\n   * @returns {?Node}\r\n   */\r\n  previousNode() {\r\n    let node = this.currentNode;\r\n    if (node === this.root) return;\r\n    do {\r\n      if (node[this.previousSiblingProperty]) {\r\n        node = node[this.previousSiblingProperty];\r\n        while (node[this.lastChildProperty]) {\r\n          node = node[this.lastChildProperty];\r\n        }\r\n      } else {\r\n        node = node.parentNode;\r\n      }\r\n    } while (node && this.acceptNode && !this.acceptNode(node));\r\n    if (node) {\r\n      this.currentNode = node;\r\n    }\r\n    return node;\r\n  }\r\n}\r\n\r\n/**\r\n * Tree walker that walks only on element nodes of the current document and ignores \"style\" and\r\n * \"link\" elements.\r\n *\r\n * @augments module:treeWalker.TreeWalker\r\n */\r\nexport class ElementsTreeWalker extends TreeWalker {\r\n  /**\r\n   * Create an elements {@link module:treeWalker.TreeWalker tree walker}.\r\n   *\r\n   * @param {Node} [startNode]\r\n   */\r\n  constructor(startNode) {\r\n    super(\r\n      cd.g.rootElement,\r\n      (node) => !['STYLE', 'LINK'].includes(node.tagName),\r\n      true\r\n    );\r\n    if (startNode) {\r\n      this.currentNode = startNode;\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * Tree walker that walks on both element and text nodes of the current document and ignores\r\n * \"style\" and \"link\" elements.\r\n *\r\n * @augments module:treeWalker.TreeWalker\r\n */\r\nexport class ElementsAndTextTreeWalker extends TreeWalker {\r\n  /**\r\n   * Create an elements and text {@link module:treeWalker.TreeWalker tree walker}.\r\n   *\r\n   * @param {Node} [startNode]\r\n   */\r\n  constructor(startNode) {\r\n    super(\r\n      cd.g.rootElement,\r\n      (node) => (\r\n        node.nodeType === Node.TEXT_NODE ||\r\n        (node.nodeType === Node.ELEMENT_NODE && !['STYLE', 'LINK'].includes(node.tagName))\r\n      )\r\n    );\r\n    if (startNode) {\r\n      this.currentNode = startNode;\r\n    }\r\n  }\r\n}\r\n","function _classPrivateFieldSet(receiver, privateMap, value) {\n  var descriptor = privateMap.get(receiver);\n\n  if (!descriptor) {\n    throw new TypeError(\"attempted to set private field on non-instance\");\n  }\n\n  if (descriptor.set) {\n    descriptor.set.call(receiver, value);\n  } else {\n    if (!descriptor.writable) {\n      throw new TypeError(\"attempted to set read only private field\");\n    }\n\n    descriptor.value = value;\n  }\n\n  return value;\n}\n\nmodule.exports = _classPrivateFieldSet;","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar domelementtype_1 = require(\"domelementtype\");\nfunction isTag(node) {\n    return domelementtype_1.isTag(node);\n}\nexports.isTag = isTag;\nfunction isCDATA(node) {\n    return \"cdata\" /* CDATA */ === node.type;\n}\nexports.isCDATA = isCDATA;\nfunction isText(node) {\n    return node.type === \"text\" /* Text */;\n}\nexports.isText = isText;\nfunction isComment(node) {\n    return node.type === \"comment\" /* Comment */;\n}\nexports.isComment = isComment;\nfunction hasChildren(node) {\n    return Object.prototype.hasOwnProperty.call(node, \"children\");\n}\nexports.hasChildren = hasChildren;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Tests whether an element is a tag or not.\n *\n * @param elem Element to test\n */\nfunction isTag(elem) {\n    return (elem.type === \"tag\" /* Tag */ ||\n        elem.type === \"script\" /* Script */ ||\n        elem.type === \"style\" /* Style */);\n}\nexports.isTag = isTag;\n// Exports for backwards compatibility\nexports.Text = \"text\" /* Text */; //Text\nexports.Directive = \"directive\" /* Directive */; //<? ... ?>\nexports.Comment = \"comment\" /* Comment */; //<!-- ... -->\nexports.Script = \"script\" /* Script */; //<script> tags\nexports.Style = \"style\" /* Style */; //<style> tags\nexports.Tag = \"tag\" /* Tag */; //Any tag\nexports.CDATA = \"cdata\" /* CDATA */; //<![CDATA[ ... ]]>\nexports.Doctype = \"doctype\" /* Doctype */;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Tokenizer_1 = __importDefault(require(\"./Tokenizer\"));\nvar events_1 = require(\"events\");\nvar formTags = new Set([\n    \"input\",\n    \"option\",\n    \"optgroup\",\n    \"select\",\n    \"button\",\n    \"datalist\",\n    \"textarea\"\n]);\nvar pTag = new Set([\"p\"]);\nvar openImpliesClose = {\n    tr: new Set([\"tr\", \"th\", \"td\"]),\n    th: new Set([\"th\"]),\n    td: new Set([\"thead\", \"th\", \"td\"]),\n    body: new Set([\"head\", \"link\", \"script\"]),\n    li: new Set([\"li\"]),\n    p: pTag,\n    h1: pTag,\n    h2: pTag,\n    h3: pTag,\n    h4: pTag,\n    h5: pTag,\n    h6: pTag,\n    select: formTags,\n    input: formTags,\n    output: formTags,\n    button: formTags,\n    datalist: formTags,\n    textarea: formTags,\n    option: new Set([\"option\"]),\n    optgroup: new Set([\"optgroup\", \"option\"]),\n    dd: new Set([\"dt\", \"dd\"]),\n    dt: new Set([\"dt\", \"dd\"]),\n    address: pTag,\n    article: pTag,\n    aside: pTag,\n    blockquote: pTag,\n    details: pTag,\n    div: pTag,\n    dl: pTag,\n    fieldset: pTag,\n    figcaption: pTag,\n    figure: pTag,\n    footer: pTag,\n    form: pTag,\n    header: pTag,\n    hr: pTag,\n    main: pTag,\n    nav: pTag,\n    ol: pTag,\n    pre: pTag,\n    section: pTag,\n    table: pTag,\n    ul: pTag,\n    rt: new Set([\"rt\", \"rp\"]),\n    rp: new Set([\"rt\", \"rp\"]),\n    tbody: new Set([\"thead\", \"tbody\"]),\n    tfoot: new Set([\"thead\", \"tbody\"])\n};\nvar voidElements = new Set([\n    \"area\",\n    \"base\",\n    \"basefont\",\n    \"br\",\n    \"col\",\n    \"command\",\n    \"embed\",\n    \"frame\",\n    \"hr\",\n    \"img\",\n    \"input\",\n    \"isindex\",\n    \"keygen\",\n    \"link\",\n    \"meta\",\n    \"param\",\n    \"source\",\n    \"track\",\n    \"wbr\"\n]);\nvar foreignContextElements = new Set([\"math\", \"svg\"]);\nvar htmlIntegrationElements = new Set([\n    \"mi\",\n    \"mo\",\n    \"mn\",\n    \"ms\",\n    \"mtext\",\n    \"annotation-xml\",\n    \"foreignObject\",\n    \"desc\",\n    \"title\"\n]);\nvar reNameEnd = /\\s|\\//;\nvar Parser = /** @class */ (function (_super) {\n    __extends(Parser, _super);\n    function Parser(cbs, options) {\n        var _this = _super.call(this) || this;\n        _this._tagname = \"\";\n        _this._attribname = \"\";\n        _this._attribvalue = \"\";\n        _this._attribs = null;\n        _this._stack = [];\n        _this._foreignContext = [];\n        _this.startIndex = 0;\n        _this.endIndex = null;\n        // Aliases for backwards compatibility\n        _this.parseChunk = Parser.prototype.write;\n        _this.done = Parser.prototype.end;\n        _this._options = options || {};\n        _this._cbs = cbs || {};\n        _this._tagname = \"\";\n        _this._attribname = \"\";\n        _this._attribvalue = \"\";\n        _this._attribs = null;\n        _this._stack = [];\n        _this._foreignContext = [];\n        _this.startIndex = 0;\n        _this.endIndex = null;\n        _this._lowerCaseTagNames =\n            \"lowerCaseTags\" in _this._options\n                ? !!_this._options.lowerCaseTags\n                : !_this._options.xmlMode;\n        _this._lowerCaseAttributeNames =\n            \"lowerCaseAttributeNames\" in _this._options\n                ? !!_this._options.lowerCaseAttributeNames\n                : !_this._options.xmlMode;\n        _this._tokenizer = new (_this._options.Tokenizer || Tokenizer_1.default)(_this._options, _this);\n        if (_this._cbs.onparserinit)\n            _this._cbs.onparserinit(_this);\n        return _this;\n    }\n    Parser.prototype._updatePosition = function (initialOffset) {\n        if (this.endIndex === null) {\n            if (this._tokenizer._sectionStart <= initialOffset) {\n                this.startIndex = 0;\n            }\n            else {\n                this.startIndex = this._tokenizer._sectionStart - initialOffset;\n            }\n        }\n        else\n            this.startIndex = this.endIndex + 1;\n        this.endIndex = this._tokenizer.getAbsoluteIndex();\n    };\n    //Tokenizer event handlers\n    Parser.prototype.ontext = function (data) {\n        this._updatePosition(1);\n        // @ts-ignore\n        this.endIndex--;\n        if (this._cbs.ontext)\n            this._cbs.ontext(data);\n    };\n    Parser.prototype.onopentagname = function (name) {\n        if (this._lowerCaseTagNames) {\n            name = name.toLowerCase();\n        }\n        this._tagname = name;\n        if (!this._options.xmlMode &&\n            Object.prototype.hasOwnProperty.call(openImpliesClose, name)) {\n            for (var el = void 0; \n            // @ts-ignore\n            openImpliesClose[name].has((el = this._stack[this._stack.length - 1])); this.onclosetag(el))\n                ;\n        }\n        if (this._options.xmlMode || !voidElements.has(name)) {\n            this._stack.push(name);\n            if (foreignContextElements.has(name)) {\n                this._foreignContext.push(true);\n            }\n            else if (htmlIntegrationElements.has(name)) {\n                this._foreignContext.push(false);\n            }\n        }\n        if (this._cbs.onopentagname)\n            this._cbs.onopentagname(name);\n        if (this._cbs.onopentag)\n            this._attribs = {};\n    };\n    Parser.prototype.onopentagend = function () {\n        this._updatePosition(1);\n        if (this._attribs) {\n            if (this._cbs.onopentag) {\n                this._cbs.onopentag(this._tagname, this._attribs);\n            }\n            this._attribs = null;\n        }\n        if (!this._options.xmlMode &&\n            this._cbs.onclosetag &&\n            voidElements.has(this._tagname)) {\n            this._cbs.onclosetag(this._tagname);\n        }\n        this._tagname = \"\";\n    };\n    Parser.prototype.onclosetag = function (name) {\n        this._updatePosition(1);\n        if (this._lowerCaseTagNames) {\n            name = name.toLowerCase();\n        }\n        if (foreignContextElements.has(name) ||\n            htmlIntegrationElements.has(name)) {\n            this._foreignContext.pop();\n        }\n        if (this._stack.length &&\n            (this._options.xmlMode || !voidElements.has(name))) {\n            var pos = this._stack.lastIndexOf(name);\n            if (pos !== -1) {\n                if (this._cbs.onclosetag) {\n                    pos = this._stack.length - pos;\n                    // @ts-ignore\n                    while (pos--)\n                        this._cbs.onclosetag(this._stack.pop());\n                }\n                else\n                    this._stack.length = pos;\n            }\n            else if (name === \"p\" && !this._options.xmlMode) {\n                this.onopentagname(name);\n                this._closeCurrentTag();\n            }\n        }\n        else if (!this._options.xmlMode && (name === \"br\" || name === \"p\")) {\n            this.onopentagname(name);\n            this._closeCurrentTag();\n        }\n    };\n    Parser.prototype.onselfclosingtag = function () {\n        if (this._options.xmlMode ||\n            this._options.recognizeSelfClosing ||\n            this._foreignContext[this._foreignContext.length - 1]) {\n            this._closeCurrentTag();\n        }\n        else {\n            this.onopentagend();\n        }\n    };\n    Parser.prototype._closeCurrentTag = function () {\n        var name = this._tagname;\n        this.onopentagend();\n        //self-closing tags will be on the top of the stack\n        //(cheaper check than in onclosetag)\n        if (this._stack[this._stack.length - 1] === name) {\n            if (this._cbs.onclosetag) {\n                this._cbs.onclosetag(name);\n            }\n            this._stack.pop();\n        }\n    };\n    Parser.prototype.onattribname = function (name) {\n        if (this._lowerCaseAttributeNames) {\n            name = name.toLowerCase();\n        }\n        this._attribname = name;\n    };\n    Parser.prototype.onattribdata = function (value) {\n        this._attribvalue += value;\n    };\n    Parser.prototype.onattribend = function () {\n        if (this._cbs.onattribute)\n            this._cbs.onattribute(this._attribname, this._attribvalue);\n        if (this._attribs &&\n            !Object.prototype.hasOwnProperty.call(this._attribs, this._attribname)) {\n            this._attribs[this._attribname] = this._attribvalue;\n        }\n        this._attribname = \"\";\n        this._attribvalue = \"\";\n    };\n    Parser.prototype._getInstructionName = function (value) {\n        var idx = value.search(reNameEnd);\n        var name = idx < 0 ? value : value.substr(0, idx);\n        if (this._lowerCaseTagNames) {\n            name = name.toLowerCase();\n        }\n        return name;\n    };\n    Parser.prototype.ondeclaration = function (value) {\n        if (this._cbs.onprocessinginstruction) {\n            var name_1 = this._getInstructionName(value);\n            this._cbs.onprocessinginstruction(\"!\" + name_1, \"!\" + value);\n        }\n    };\n    Parser.prototype.onprocessinginstruction = function (value) {\n        if (this._cbs.onprocessinginstruction) {\n            var name_2 = this._getInstructionName(value);\n            this._cbs.onprocessinginstruction(\"?\" + name_2, \"?\" + value);\n        }\n    };\n    Parser.prototype.oncomment = function (value) {\n        this._updatePosition(4);\n        if (this._cbs.oncomment)\n            this._cbs.oncomment(value);\n        if (this._cbs.oncommentend)\n            this._cbs.oncommentend();\n    };\n    Parser.prototype.oncdata = function (value) {\n        this._updatePosition(1);\n        if (this._options.xmlMode || this._options.recognizeCDATA) {\n            if (this._cbs.oncdatastart)\n                this._cbs.oncdatastart();\n            if (this._cbs.ontext)\n                this._cbs.ontext(value);\n            if (this._cbs.oncdataend)\n                this._cbs.oncdataend();\n        }\n        else {\n            this.oncomment(\"[CDATA[\" + value + \"]]\");\n        }\n    };\n    Parser.prototype.onerror = function (err) {\n        if (this._cbs.onerror)\n            this._cbs.onerror(err);\n    };\n    Parser.prototype.onend = function () {\n        if (this._cbs.onclosetag) {\n            for (var i = this._stack.length; i > 0; this._cbs.onclosetag(this._stack[--i]))\n                ;\n        }\n        if (this._cbs.onend)\n            this._cbs.onend();\n    };\n    //Resets the parser to a blank state, ready to parse a new HTML document\n    Parser.prototype.reset = function () {\n        if (this._cbs.onreset)\n            this._cbs.onreset();\n        this._tokenizer.reset();\n        this._tagname = \"\";\n        this._attribname = \"\";\n        this._attribs = null;\n        this._stack = [];\n        if (this._cbs.onparserinit)\n            this._cbs.onparserinit(this);\n    };\n    //Parses a complete HTML document and pushes it to the handler\n    Parser.prototype.parseComplete = function (data) {\n        this.reset();\n        this.end(data);\n    };\n    Parser.prototype.write = function (chunk) {\n        this._tokenizer.write(chunk);\n    };\n    Parser.prototype.end = function (chunk) {\n        this._tokenizer.end(chunk);\n    };\n    Parser.prototype.pause = function () {\n        this._tokenizer.pause();\n    };\n    Parser.prototype.resume = function () {\n        this._tokenizer.resume();\n    };\n    return Parser;\n}(events_1.EventEmitter));\nexports.Parser = Parser;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar decode_codepoint_1 = __importDefault(require(\"entities/lib/decode_codepoint\"));\nvar entities_json_1 = __importDefault(require(\"entities/lib/maps/entities.json\"));\nvar legacy_json_1 = __importDefault(require(\"entities/lib/maps/legacy.json\"));\nvar xml_json_1 = __importDefault(require(\"entities/lib/maps/xml.json\"));\nfunction whitespace(c) {\n    return c === \" \" || c === \"\\n\" || c === \"\\t\" || c === \"\\f\" || c === \"\\r\";\n}\nfunction ifElseState(upper, SUCCESS, FAILURE) {\n    var lower = upper.toLowerCase();\n    if (upper === lower) {\n        return function (t, c) {\n            if (c === lower) {\n                t._state = SUCCESS;\n            }\n            else {\n                t._state = FAILURE;\n                t._index--;\n            }\n        };\n    }\n    else {\n        return function (t, c) {\n            if (c === lower || c === upper) {\n                t._state = SUCCESS;\n            }\n            else {\n                t._state = FAILURE;\n                t._index--;\n            }\n        };\n    }\n}\nfunction consumeSpecialNameChar(upper, NEXT_STATE) {\n    var lower = upper.toLowerCase();\n    return function (t, c) {\n        if (c === lower || c === upper) {\n            t._state = NEXT_STATE;\n        }\n        else {\n            t._state = 3 /* InTagName */;\n            t._index--; //consume the token again\n        }\n    };\n}\nvar stateBeforeCdata1 = ifElseState(\"C\", 23 /* BeforeCdata2 */, 16 /* InDeclaration */);\nvar stateBeforeCdata2 = ifElseState(\"D\", 24 /* BeforeCdata3 */, 16 /* InDeclaration */);\nvar stateBeforeCdata3 = ifElseState(\"A\", 25 /* BeforeCdata4 */, 16 /* InDeclaration */);\nvar stateBeforeCdata4 = ifElseState(\"T\", 26 /* BeforeCdata5 */, 16 /* InDeclaration */);\nvar stateBeforeCdata5 = ifElseState(\"A\", 27 /* BeforeCdata6 */, 16 /* InDeclaration */);\nvar stateBeforeScript1 = consumeSpecialNameChar(\"R\", 34 /* BeforeScript2 */);\nvar stateBeforeScript2 = consumeSpecialNameChar(\"I\", 35 /* BeforeScript3 */);\nvar stateBeforeScript3 = consumeSpecialNameChar(\"P\", 36 /* BeforeScript4 */);\nvar stateBeforeScript4 = consumeSpecialNameChar(\"T\", 37 /* BeforeScript5 */);\nvar stateAfterScript1 = ifElseState(\"R\", 39 /* AfterScript2 */, 1 /* Text */);\nvar stateAfterScript2 = ifElseState(\"I\", 40 /* AfterScript3 */, 1 /* Text */);\nvar stateAfterScript3 = ifElseState(\"P\", 41 /* AfterScript4 */, 1 /* Text */);\nvar stateAfterScript4 = ifElseState(\"T\", 42 /* AfterScript5 */, 1 /* Text */);\nvar stateBeforeStyle1 = consumeSpecialNameChar(\"Y\", 44 /* BeforeStyle2 */);\nvar stateBeforeStyle2 = consumeSpecialNameChar(\"L\", 45 /* BeforeStyle3 */);\nvar stateBeforeStyle3 = consumeSpecialNameChar(\"E\", 46 /* BeforeStyle4 */);\nvar stateAfterStyle1 = ifElseState(\"Y\", 48 /* AfterStyle2 */, 1 /* Text */);\nvar stateAfterStyle2 = ifElseState(\"L\", 49 /* AfterStyle3 */, 1 /* Text */);\nvar stateAfterStyle3 = ifElseState(\"E\", 50 /* AfterStyle4 */, 1 /* Text */);\nvar stateBeforeEntity = ifElseState(\"#\", 52 /* BeforeNumericEntity */, 53 /* InNamedEntity */);\nvar stateBeforeNumericEntity = ifElseState(\"X\", 55 /* InHexEntity */, 54 /* InNumericEntity */);\nvar Tokenizer = /** @class */ (function () {\n    function Tokenizer(options, cbs) {\n        /** The current state the tokenizer is in. */\n        this._state = 1 /* Text */;\n        /** The read buffer. */\n        this._buffer = \"\";\n        /** The beginning of the section that is currently being read. */\n        this._sectionStart = 0;\n        /** The index within the buffer that we are currently looking at. */\n        this._index = 0;\n        /**\n         * Data that has already been processed will be removed from the buffer occasionally.\n         * `_bufferOffset` keeps track of how many characters have been removed, to make sure position information is accurate.\n         */\n        this._bufferOffset = 0;\n        /** Some behavior, eg. when decoding entities, is done while we are in another state. This keeps track of the other state type. */\n        this._baseState = 1 /* Text */;\n        /** For special parsing behavior inside of script and style tags. */\n        this._special = 1 /* None */;\n        /** Indicates whether the tokenizer has been paused. */\n        this._running = true;\n        /** Indicates whether the tokenizer has finished running / `.end` has been called. */\n        this._ended = false;\n        this._cbs = cbs;\n        this._xmlMode = !!(options && options.xmlMode);\n        this._decodeEntities = !!(options && options.decodeEntities);\n    }\n    Tokenizer.prototype.reset = function () {\n        this._state = 1 /* Text */;\n        this._buffer = \"\";\n        this._sectionStart = 0;\n        this._index = 0;\n        this._bufferOffset = 0;\n        this._baseState = 1 /* Text */;\n        this._special = 1 /* None */;\n        this._running = true;\n        this._ended = false;\n    };\n    Tokenizer.prototype._stateText = function (c) {\n        if (c === \"<\") {\n            if (this._index > this._sectionStart) {\n                this._cbs.ontext(this._getSection());\n            }\n            this._state = 2 /* BeforeTagName */;\n            this._sectionStart = this._index;\n        }\n        else if (this._decodeEntities &&\n            this._special === 1 /* None */ &&\n            c === \"&\") {\n            if (this._index > this._sectionStart) {\n                this._cbs.ontext(this._getSection());\n            }\n            this._baseState = 1 /* Text */;\n            this._state = 51 /* BeforeEntity */;\n            this._sectionStart = this._index;\n        }\n    };\n    Tokenizer.prototype._stateBeforeTagName = function (c) {\n        if (c === \"/\") {\n            this._state = 5 /* BeforeClosingTagName */;\n        }\n        else if (c === \"<\") {\n            this._cbs.ontext(this._getSection());\n            this._sectionStart = this._index;\n        }\n        else if (c === \">\" ||\n            this._special !== 1 /* None */ ||\n            whitespace(c)) {\n            this._state = 1 /* Text */;\n        }\n        else if (c === \"!\") {\n            this._state = 15 /* BeforeDeclaration */;\n            this._sectionStart = this._index + 1;\n        }\n        else if (c === \"?\") {\n            this._state = 17 /* InProcessingInstruction */;\n            this._sectionStart = this._index + 1;\n        }\n        else {\n            this._state =\n                !this._xmlMode && (c === \"s\" || c === \"S\")\n                    ? 31 /* BeforeSpecial */\n                    : 3 /* InTagName */;\n            this._sectionStart = this._index;\n        }\n    };\n    Tokenizer.prototype._stateInTagName = function (c) {\n        if (c === \"/\" || c === \">\" || whitespace(c)) {\n            this._emitToken(\"onopentagname\");\n            this._state = 8 /* BeforeAttributeName */;\n            this._index--;\n        }\n    };\n    Tokenizer.prototype._stateBeforeClosingTagName = function (c) {\n        if (whitespace(c)) {\n            // ignore\n        }\n        else if (c === \">\") {\n            this._state = 1 /* Text */;\n        }\n        else if (this._special !== 1 /* None */) {\n            if (c === \"s\" || c === \"S\") {\n                this._state = 32 /* BeforeSpecialEnd */;\n            }\n            else {\n                this._state = 1 /* Text */;\n                this._index--;\n            }\n        }\n        else {\n            this._state = 6 /* InClosingTagName */;\n            this._sectionStart = this._index;\n        }\n    };\n    Tokenizer.prototype._stateInClosingTagName = function (c) {\n        if (c === \">\" || whitespace(c)) {\n            this._emitToken(\"onclosetag\");\n            this._state = 7 /* AfterClosingTagName */;\n            this._index--;\n        }\n    };\n    Tokenizer.prototype._stateAfterClosingTagName = function (c) {\n        //skip everything until \">\"\n        if (c === \">\") {\n            this._state = 1 /* Text */;\n            this._sectionStart = this._index + 1;\n        }\n    };\n    Tokenizer.prototype._stateBeforeAttributeName = function (c) {\n        if (c === \">\") {\n            this._cbs.onopentagend();\n            this._state = 1 /* Text */;\n            this._sectionStart = this._index + 1;\n        }\n        else if (c === \"/\") {\n            this._state = 4 /* InSelfClosingTag */;\n        }\n        else if (!whitespace(c)) {\n            this._state = 9 /* InAttributeName */;\n            this._sectionStart = this._index;\n        }\n    };\n    Tokenizer.prototype._stateInSelfClosingTag = function (c) {\n        if (c === \">\") {\n            this._cbs.onselfclosingtag();\n            this._state = 1 /* Text */;\n            this._sectionStart = this._index + 1;\n        }\n        else if (!whitespace(c)) {\n            this._state = 8 /* BeforeAttributeName */;\n            this._index--;\n        }\n    };\n    Tokenizer.prototype._stateInAttributeName = function (c) {\n        if (c === \"=\" || c === \"/\" || c === \">\" || whitespace(c)) {\n            this._cbs.onattribname(this._getSection());\n            this._sectionStart = -1;\n            this._state = 10 /* AfterAttributeName */;\n            this._index--;\n        }\n    };\n    Tokenizer.prototype._stateAfterAttributeName = function (c) {\n        if (c === \"=\") {\n            this._state = 11 /* BeforeAttributeValue */;\n        }\n        else if (c === \"/\" || c === \">\") {\n            this._cbs.onattribend();\n            this._state = 8 /* BeforeAttributeName */;\n            this._index--;\n        }\n        else if (!whitespace(c)) {\n            this._cbs.onattribend();\n            this._state = 9 /* InAttributeName */;\n            this._sectionStart = this._index;\n        }\n    };\n    Tokenizer.prototype._stateBeforeAttributeValue = function (c) {\n        if (c === '\"') {\n            this._state = 12 /* InAttributeValueDq */;\n            this._sectionStart = this._index + 1;\n        }\n        else if (c === \"'\") {\n            this._state = 13 /* InAttributeValueSq */;\n            this._sectionStart = this._index + 1;\n        }\n        else if (!whitespace(c)) {\n            this._state = 14 /* InAttributeValueNq */;\n            this._sectionStart = this._index;\n            this._index--; //reconsume token\n        }\n    };\n    Tokenizer.prototype._stateInAttributeValueDoubleQuotes = function (c) {\n        if (c === '\"') {\n            this._emitToken(\"onattribdata\");\n            this._cbs.onattribend();\n            this._state = 8 /* BeforeAttributeName */;\n        }\n        else if (this._decodeEntities && c === \"&\") {\n            this._emitToken(\"onattribdata\");\n            this._baseState = this._state;\n            this._state = 51 /* BeforeEntity */;\n            this._sectionStart = this._index;\n        }\n    };\n    Tokenizer.prototype._stateInAttributeValueSingleQuotes = function (c) {\n        if (c === \"'\") {\n            this._emitToken(\"onattribdata\");\n            this._cbs.onattribend();\n            this._state = 8 /* BeforeAttributeName */;\n        }\n        else if (this._decodeEntities && c === \"&\") {\n            this._emitToken(\"onattribdata\");\n            this._baseState = this._state;\n            this._state = 51 /* BeforeEntity */;\n            this._sectionStart = this._index;\n        }\n    };\n    Tokenizer.prototype._stateInAttributeValueNoQuotes = function (c) {\n        if (whitespace(c) || c === \">\") {\n            this._emitToken(\"onattribdata\");\n            this._cbs.onattribend();\n            this._state = 8 /* BeforeAttributeName */;\n            this._index--;\n        }\n        else if (this._decodeEntities && c === \"&\") {\n            this._emitToken(\"onattribdata\");\n            this._baseState = this._state;\n            this._state = 51 /* BeforeEntity */;\n            this._sectionStart = this._index;\n        }\n    };\n    Tokenizer.prototype._stateBeforeDeclaration = function (c) {\n        this._state =\n            c === \"[\"\n                ? 22 /* BeforeCdata1 */\n                : c === \"-\"\n                    ? 18 /* BeforeComment */\n                    : 16 /* InDeclaration */;\n    };\n    Tokenizer.prototype._stateInDeclaration = function (c) {\n        if (c === \">\") {\n            this._cbs.ondeclaration(this._getSection());\n            this._state = 1 /* Text */;\n            this._sectionStart = this._index + 1;\n        }\n    };\n    Tokenizer.prototype._stateInProcessingInstruction = function (c) {\n        if (c === \">\") {\n            this._cbs.onprocessinginstruction(this._getSection());\n            this._state = 1 /* Text */;\n            this._sectionStart = this._index + 1;\n        }\n    };\n    Tokenizer.prototype._stateBeforeComment = function (c) {\n        if (c === \"-\") {\n            this._state = 19 /* InComment */;\n            this._sectionStart = this._index + 1;\n        }\n        else {\n            this._state = 16 /* InDeclaration */;\n        }\n    };\n    Tokenizer.prototype._stateInComment = function (c) {\n        if (c === \"-\")\n            this._state = 20 /* AfterComment1 */;\n    };\n    Tokenizer.prototype._stateAfterComment1 = function (c) {\n        if (c === \"-\") {\n            this._state = 21 /* AfterComment2 */;\n        }\n        else {\n            this._state = 19 /* InComment */;\n        }\n    };\n    Tokenizer.prototype._stateAfterComment2 = function (c) {\n        if (c === \">\") {\n            //remove 2 trailing chars\n            this._cbs.oncomment(this._buffer.substring(this._sectionStart, this._index - 2));\n            this._state = 1 /* Text */;\n            this._sectionStart = this._index + 1;\n        }\n        else if (c !== \"-\") {\n            this._state = 19 /* InComment */;\n        }\n        // else: stay in AFTER_COMMENT_2 (`--->`)\n    };\n    Tokenizer.prototype._stateBeforeCdata6 = function (c) {\n        if (c === \"[\") {\n            this._state = 28 /* InCdata */;\n            this._sectionStart = this._index + 1;\n        }\n        else {\n            this._state = 16 /* InDeclaration */;\n            this._index--;\n        }\n    };\n    Tokenizer.prototype._stateInCdata = function (c) {\n        if (c === \"]\")\n            this._state = 29 /* AfterCdata1 */;\n    };\n    Tokenizer.prototype._stateAfterCdata1 = function (c) {\n        if (c === \"]\")\n            this._state = 30 /* AfterCdata2 */;\n        else\n            this._state = 28 /* InCdata */;\n    };\n    Tokenizer.prototype._stateAfterCdata2 = function (c) {\n        if (c === \">\") {\n            //remove 2 trailing chars\n            this._cbs.oncdata(this._buffer.substring(this._sectionStart, this._index - 2));\n            this._state = 1 /* Text */;\n            this._sectionStart = this._index + 1;\n        }\n        else if (c !== \"]\") {\n            this._state = 28 /* InCdata */;\n        }\n        //else: stay in AFTER_CDATA_2 (`]]]>`)\n    };\n    Tokenizer.prototype._stateBeforeSpecial = function (c) {\n        if (c === \"c\" || c === \"C\") {\n            this._state = 33 /* BeforeScript1 */;\n        }\n        else if (c === \"t\" || c === \"T\") {\n            this._state = 43 /* BeforeStyle1 */;\n        }\n        else {\n            this._state = 3 /* InTagName */;\n            this._index--; //consume the token again\n        }\n    };\n    Tokenizer.prototype._stateBeforeSpecialEnd = function (c) {\n        if (this._special === 2 /* Script */ && (c === \"c\" || c === \"C\")) {\n            this._state = 38 /* AfterScript1 */;\n        }\n        else if (this._special === 3 /* Style */ &&\n            (c === \"t\" || c === \"T\")) {\n            this._state = 47 /* AfterStyle1 */;\n        }\n        else\n            this._state = 1 /* Text */;\n    };\n    Tokenizer.prototype._stateBeforeScript5 = function (c) {\n        if (c === \"/\" || c === \">\" || whitespace(c)) {\n            this._special = 2 /* Script */;\n        }\n        this._state = 3 /* InTagName */;\n        this._index--; //consume the token again\n    };\n    Tokenizer.prototype._stateAfterScript5 = function (c) {\n        if (c === \">\" || whitespace(c)) {\n            this._special = 1 /* None */;\n            this._state = 6 /* InClosingTagName */;\n            this._sectionStart = this._index - 6;\n            this._index--; //reconsume the token\n        }\n        else\n            this._state = 1 /* Text */;\n    };\n    Tokenizer.prototype._stateBeforeStyle4 = function (c) {\n        if (c === \"/\" || c === \">\" || whitespace(c)) {\n            this._special = 3 /* Style */;\n        }\n        this._state = 3 /* InTagName */;\n        this._index--; //consume the token again\n    };\n    Tokenizer.prototype._stateAfterStyle4 = function (c) {\n        if (c === \">\" || whitespace(c)) {\n            this._special = 1 /* None */;\n            this._state = 6 /* InClosingTagName */;\n            this._sectionStart = this._index - 5;\n            this._index--; //reconsume the token\n        }\n        else\n            this._state = 1 /* Text */;\n    };\n    //for entities terminated with a semicolon\n    Tokenizer.prototype._parseNamedEntityStrict = function () {\n        //offset = 1\n        if (this._sectionStart + 1 < this._index) {\n            var entity = this._buffer.substring(this._sectionStart + 1, this._index), map = this._xmlMode ? xml_json_1.default : entities_json_1.default;\n            if (Object.prototype.hasOwnProperty.call(map, entity)) {\n                // @ts-ignore\n                this._emitPartial(map[entity]);\n                this._sectionStart = this._index + 1;\n            }\n        }\n    };\n    //parses legacy entities (without trailing semicolon)\n    Tokenizer.prototype._parseLegacyEntity = function () {\n        var start = this._sectionStart + 1;\n        var limit = this._index - start;\n        if (limit > 6)\n            limit = 6; // The max length of legacy entities is 6\n        while (limit >= 2) {\n            // The min length of legacy entities is 2\n            var entity = this._buffer.substr(start, limit);\n            if (Object.prototype.hasOwnProperty.call(legacy_json_1.default, entity)) {\n                // @ts-ignore\n                this._emitPartial(legacy_json_1.default[entity]);\n                this._sectionStart += limit + 1;\n                return;\n            }\n            else {\n                limit--;\n            }\n        }\n    };\n    Tokenizer.prototype._stateInNamedEntity = function (c) {\n        if (c === \";\") {\n            this._parseNamedEntityStrict();\n            if (this._sectionStart + 1 < this._index && !this._xmlMode) {\n                this._parseLegacyEntity();\n            }\n            this._state = this._baseState;\n        }\n        else if ((c < \"a\" || c > \"z\") &&\n            (c < \"A\" || c > \"Z\") &&\n            (c < \"0\" || c > \"9\")) {\n            if (this._xmlMode || this._sectionStart + 1 === this._index) {\n                // ignore\n            }\n            else if (this._baseState !== 1 /* Text */) {\n                if (c !== \"=\") {\n                    this._parseNamedEntityStrict();\n                }\n            }\n            else {\n                this._parseLegacyEntity();\n            }\n            this._state = this._baseState;\n            this._index--;\n        }\n    };\n    Tokenizer.prototype._decodeNumericEntity = function (offset, base) {\n        var sectionStart = this._sectionStart + offset;\n        if (sectionStart !== this._index) {\n            //parse entity\n            var entity = this._buffer.substring(sectionStart, this._index);\n            var parsed = parseInt(entity, base);\n            this._emitPartial(decode_codepoint_1.default(parsed));\n            this._sectionStart = this._index;\n        }\n        else {\n            this._sectionStart--;\n        }\n        this._state = this._baseState;\n    };\n    Tokenizer.prototype._stateInNumericEntity = function (c) {\n        if (c === \";\") {\n            this._decodeNumericEntity(2, 10);\n            this._sectionStart++;\n        }\n        else if (c < \"0\" || c > \"9\") {\n            if (!this._xmlMode) {\n                this._decodeNumericEntity(2, 10);\n            }\n            else {\n                this._state = this._baseState;\n            }\n            this._index--;\n        }\n    };\n    Tokenizer.prototype._stateInHexEntity = function (c) {\n        if (c === \";\") {\n            this._decodeNumericEntity(3, 16);\n            this._sectionStart++;\n        }\n        else if ((c < \"a\" || c > \"f\") &&\n            (c < \"A\" || c > \"F\") &&\n            (c < \"0\" || c > \"9\")) {\n            if (!this._xmlMode) {\n                this._decodeNumericEntity(3, 16);\n            }\n            else {\n                this._state = this._baseState;\n            }\n            this._index--;\n        }\n    };\n    Tokenizer.prototype._cleanup = function () {\n        if (this._sectionStart < 0) {\n            this._buffer = \"\";\n            this._bufferOffset += this._index;\n            this._index = 0;\n        }\n        else if (this._running) {\n            if (this._state === 1 /* Text */) {\n                if (this._sectionStart !== this._index) {\n                    this._cbs.ontext(this._buffer.substr(this._sectionStart));\n                }\n                this._buffer = \"\";\n                this._bufferOffset += this._index;\n                this._index = 0;\n            }\n            else if (this._sectionStart === this._index) {\n                //the section just started\n                this._buffer = \"\";\n                this._bufferOffset += this._index;\n                this._index = 0;\n            }\n            else {\n                //remove everything unnecessary\n                this._buffer = this._buffer.substr(this._sectionStart);\n                this._index -= this._sectionStart;\n                this._bufferOffset += this._sectionStart;\n            }\n            this._sectionStart = 0;\n        }\n    };\n    //TODO make events conditional\n    Tokenizer.prototype.write = function (chunk) {\n        if (this._ended)\n            this._cbs.onerror(Error(\".write() after done!\"));\n        this._buffer += chunk;\n        this._parse();\n    };\n    // Iterates through the buffer, calling the function corresponding to the current state.\n    // States that are more likely to be hit are higher up, as a performance improvement.\n    Tokenizer.prototype._parse = function () {\n        while (this._index < this._buffer.length && this._running) {\n            var c = this._buffer.charAt(this._index);\n            if (this._state === 1 /* Text */) {\n                this._stateText(c);\n            }\n            else if (this._state === 12 /* InAttributeValueDq */) {\n                this._stateInAttributeValueDoubleQuotes(c);\n            }\n            else if (this._state === 9 /* InAttributeName */) {\n                this._stateInAttributeName(c);\n            }\n            else if (this._state === 19 /* InComment */) {\n                this._stateInComment(c);\n            }\n            else if (this._state === 8 /* BeforeAttributeName */) {\n                this._stateBeforeAttributeName(c);\n            }\n            else if (this._state === 3 /* InTagName */) {\n                this._stateInTagName(c);\n            }\n            else if (this._state === 6 /* InClosingTagName */) {\n                this._stateInClosingTagName(c);\n            }\n            else if (this._state === 2 /* BeforeTagName */) {\n                this._stateBeforeTagName(c);\n            }\n            else if (this._state === 10 /* AfterAttributeName */) {\n                this._stateAfterAttributeName(c);\n            }\n            else if (this._state === 13 /* InAttributeValueSq */) {\n                this._stateInAttributeValueSingleQuotes(c);\n            }\n            else if (this._state === 11 /* BeforeAttributeValue */) {\n                this._stateBeforeAttributeValue(c);\n            }\n            else if (this._state === 5 /* BeforeClosingTagName */) {\n                this._stateBeforeClosingTagName(c);\n            }\n            else if (this._state === 7 /* AfterClosingTagName */) {\n                this._stateAfterClosingTagName(c);\n            }\n            else if (this._state === 31 /* BeforeSpecial */) {\n                this._stateBeforeSpecial(c);\n            }\n            else if (this._state === 20 /* AfterComment1 */) {\n                this._stateAfterComment1(c);\n            }\n            else if (this._state === 14 /* InAttributeValueNq */) {\n                this._stateInAttributeValueNoQuotes(c);\n            }\n            else if (this._state === 4 /* InSelfClosingTag */) {\n                this._stateInSelfClosingTag(c);\n            }\n            else if (this._state === 16 /* InDeclaration */) {\n                this._stateInDeclaration(c);\n            }\n            else if (this._state === 15 /* BeforeDeclaration */) {\n                this._stateBeforeDeclaration(c);\n            }\n            else if (this._state === 21 /* AfterComment2 */) {\n                this._stateAfterComment2(c);\n            }\n            else if (this._state === 18 /* BeforeComment */) {\n                this._stateBeforeComment(c);\n            }\n            else if (this._state === 32 /* BeforeSpecialEnd */) {\n                this._stateBeforeSpecialEnd(c);\n            }\n            else if (this._state === 38 /* AfterScript1 */) {\n                stateAfterScript1(this, c);\n            }\n            else if (this._state === 39 /* AfterScript2 */) {\n                stateAfterScript2(this, c);\n            }\n            else if (this._state === 40 /* AfterScript3 */) {\n                stateAfterScript3(this, c);\n            }\n            else if (this._state === 33 /* BeforeScript1 */) {\n                stateBeforeScript1(this, c);\n            }\n            else if (this._state === 34 /* BeforeScript2 */) {\n                stateBeforeScript2(this, c);\n            }\n            else if (this._state === 35 /* BeforeScript3 */) {\n                stateBeforeScript3(this, c);\n            }\n            else if (this._state === 36 /* BeforeScript4 */) {\n                stateBeforeScript4(this, c);\n            }\n            else if (this._state === 37 /* BeforeScript5 */) {\n                this._stateBeforeScript5(c);\n            }\n            else if (this._state === 41 /* AfterScript4 */) {\n                stateAfterScript4(this, c);\n            }\n            else if (this._state === 42 /* AfterScript5 */) {\n                this._stateAfterScript5(c);\n            }\n            else if (this._state === 43 /* BeforeStyle1 */) {\n                stateBeforeStyle1(this, c);\n            }\n            else if (this._state === 28 /* InCdata */) {\n                this._stateInCdata(c);\n            }\n            else if (this._state === 44 /* BeforeStyle2 */) {\n                stateBeforeStyle2(this, c);\n            }\n            else if (this._state === 45 /* BeforeStyle3 */) {\n                stateBeforeStyle3(this, c);\n            }\n            else if (this._state === 46 /* BeforeStyle4 */) {\n                this._stateBeforeStyle4(c);\n            }\n            else if (this._state === 47 /* AfterStyle1 */) {\n                stateAfterStyle1(this, c);\n            }\n            else if (this._state === 48 /* AfterStyle2 */) {\n                stateAfterStyle2(this, c);\n            }\n            else if (this._state === 49 /* AfterStyle3 */) {\n                stateAfterStyle3(this, c);\n            }\n            else if (this._state === 50 /* AfterStyle4 */) {\n                this._stateAfterStyle4(c);\n            }\n            else if (this._state === 17 /* InProcessingInstruction */) {\n                this._stateInProcessingInstruction(c);\n            }\n            else if (this._state === 53 /* InNamedEntity */) {\n                this._stateInNamedEntity(c);\n            }\n            else if (this._state === 22 /* BeforeCdata1 */) {\n                stateBeforeCdata1(this, c);\n            }\n            else if (this._state === 51 /* BeforeEntity */) {\n                stateBeforeEntity(this, c);\n            }\n            else if (this._state === 23 /* BeforeCdata2 */) {\n                stateBeforeCdata2(this, c);\n            }\n            else if (this._state === 24 /* BeforeCdata3 */) {\n                stateBeforeCdata3(this, c);\n            }\n            else if (this._state === 29 /* AfterCdata1 */) {\n                this._stateAfterCdata1(c);\n            }\n            else if (this._state === 30 /* AfterCdata2 */) {\n                this._stateAfterCdata2(c);\n            }\n            else if (this._state === 25 /* BeforeCdata4 */) {\n                stateBeforeCdata4(this, c);\n            }\n            else if (this._state === 26 /* BeforeCdata5 */) {\n                stateBeforeCdata5(this, c);\n            }\n            else if (this._state === 27 /* BeforeCdata6 */) {\n                this._stateBeforeCdata6(c);\n            }\n            else if (this._state === 55 /* InHexEntity */) {\n                this._stateInHexEntity(c);\n            }\n            else if (this._state === 54 /* InNumericEntity */) {\n                this._stateInNumericEntity(c);\n            }\n            else if (this._state === 52 /* BeforeNumericEntity */) {\n                stateBeforeNumericEntity(this, c);\n            }\n            else {\n                this._cbs.onerror(Error(\"unknown _state\"), this._state);\n            }\n            this._index++;\n        }\n        this._cleanup();\n    };\n    Tokenizer.prototype.pause = function () {\n        this._running = false;\n    };\n    Tokenizer.prototype.resume = function () {\n        this._running = true;\n        if (this._index < this._buffer.length) {\n            this._parse();\n        }\n        if (this._ended) {\n            this._finish();\n        }\n    };\n    Tokenizer.prototype.end = function (chunk) {\n        if (this._ended)\n            this._cbs.onerror(Error(\".end() after done!\"));\n        if (chunk)\n            this.write(chunk);\n        this._ended = true;\n        if (this._running)\n            this._finish();\n    };\n    Tokenizer.prototype._finish = function () {\n        //if there is remaining data, emit it in a reasonable way\n        if (this._sectionStart < this._index) {\n            this._handleTrailingData();\n        }\n        this._cbs.onend();\n    };\n    Tokenizer.prototype._handleTrailingData = function () {\n        var data = this._buffer.substr(this._sectionStart);\n        if (this._state === 28 /* InCdata */ ||\n            this._state === 29 /* AfterCdata1 */ ||\n            this._state === 30 /* AfterCdata2 */) {\n            this._cbs.oncdata(data);\n        }\n        else if (this._state === 19 /* InComment */ ||\n            this._state === 20 /* AfterComment1 */ ||\n            this._state === 21 /* AfterComment2 */) {\n            this._cbs.oncomment(data);\n        }\n        else if (this._state === 53 /* InNamedEntity */ && !this._xmlMode) {\n            this._parseLegacyEntity();\n            if (this._sectionStart < this._index) {\n                this._state = this._baseState;\n                this._handleTrailingData();\n            }\n        }\n        else if (this._state === 54 /* InNumericEntity */ && !this._xmlMode) {\n            this._decodeNumericEntity(2, 10);\n            if (this._sectionStart < this._index) {\n                this._state = this._baseState;\n                this._handleTrailingData();\n            }\n        }\n        else if (this._state === 55 /* InHexEntity */ && !this._xmlMode) {\n            this._decodeNumericEntity(3, 16);\n            if (this._sectionStart < this._index) {\n                this._state = this._baseState;\n                this._handleTrailingData();\n            }\n        }\n        else if (this._state !== 3 /* InTagName */ &&\n            this._state !== 8 /* BeforeAttributeName */ &&\n            this._state !== 11 /* BeforeAttributeValue */ &&\n            this._state !== 10 /* AfterAttributeName */ &&\n            this._state !== 9 /* InAttributeName */ &&\n            this._state !== 13 /* InAttributeValueSq */ &&\n            this._state !== 12 /* InAttributeValueDq */ &&\n            this._state !== 14 /* InAttributeValueNq */ &&\n            this._state !== 6 /* InClosingTagName */) {\n            this._cbs.ontext(data);\n        }\n        //else, ignore remaining data\n        //TODO add a way to remove current tag\n    };\n    Tokenizer.prototype.getAbsoluteIndex = function () {\n        return this._bufferOffset + this._index;\n    };\n    Tokenizer.prototype._getSection = function () {\n        return this._buffer.substring(this._sectionStart, this._index);\n    };\n    Tokenizer.prototype._emitToken = function (name) {\n        this._cbs[name](this._getSection());\n        this._sectionStart = -1;\n    };\n    Tokenizer.prototype._emitPartial = function (value) {\n        if (this._baseState !== 1 /* Text */) {\n            this._cbs.onattribdata(value); //TODO implement the new event\n        }\n        else {\n            this._cbs.ontext(value);\n        }\n    };\n    return Tokenizer;\n}());\nexports.default = Tokenizer;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar decode_json_1 = __importDefault(require(\"./maps/decode.json\"));\n// modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119\nfunction decodeCodePoint(codePoint) {\n    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {\n        return \"\\uFFFD\";\n    }\n    if (codePoint in decode_json_1.default) {\n        // @ts-ignore\n        codePoint = decode_json_1.default[codePoint];\n    }\n    var output = \"\";\n    if (codePoint > 0xffff) {\n        codePoint -= 0x10000;\n        output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);\n        codePoint = 0xdc00 | (codePoint & 0x3ff);\n    }\n    output += String.fromCharCode(codePoint);\n    return output;\n}\nexports.default = decodeCodePoint;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar node_1 = require(\"./node\");\nexports.Node = node_1.Node;\nexports.Element = node_1.Element;\nexports.DataNode = node_1.DataNode;\nexports.NodeWithChildren = node_1.NodeWithChildren;\nvar reWhitespace = /\\s+/g;\n// Default options\nvar defaultOpts = {\n    normalizeWhitespace: false,\n    withStartIndices: false,\n    withEndIndices: false\n};\nvar DomHandler = /** @class */ (function () {\n    /**\n     * Initiate a new DomHandler.\n     *\n     * @param callback Called once parsing has completed.\n     * @param options Settings for the handler.\n     * @param elementCB Callback whenever a tag is closed.\n     */\n    function DomHandler(callback, options, elementCB) {\n        /** The constructed DOM */\n        this.dom = [];\n        /** Indicated whether parsing has been completed. */\n        this._done = false;\n        /** Stack of open tags. */\n        this._tagStack = [];\n        /** A data node that is still being written to. */\n        this._lastNode = null;\n        /** Reference to the parser instance. Used for location information. */\n        this._parser = null;\n        // Make it possible to skip arguments, for backwards-compatibility\n        if (typeof options === \"function\") {\n            elementCB = options;\n            options = defaultOpts;\n        }\n        if (typeof callback === \"object\") {\n            options = callback;\n            callback = undefined;\n        }\n        this._callback = callback || null;\n        this._options = options || defaultOpts;\n        this._elementCB = elementCB || null;\n    }\n    DomHandler.prototype.onparserinit = function (parser) {\n        this._parser = parser;\n    };\n    // Resets the handler back to starting state\n    DomHandler.prototype.onreset = function () {\n        this.dom = [];\n        this._done = false;\n        this._tagStack = [];\n        this._lastNode = null;\n        this._parser = this._parser || null;\n    };\n    // Signals the handler that parsing is done\n    DomHandler.prototype.onend = function () {\n        if (this._done)\n            return;\n        this._done = true;\n        this._parser = null;\n        this.handleCallback(null);\n    };\n    DomHandler.prototype.onerror = function (error) {\n        this.handleCallback(error);\n    };\n    DomHandler.prototype.onclosetag = function () {\n        this._lastNode = null;\n        // If(this._tagStack.pop().name !== name) this.handleCallback(Error(\"Tagname didn't match!\"));\n        var elem = this._tagStack.pop();\n        if (!elem || !this._parser) {\n            return;\n        }\n        if (this._options.withEndIndices) {\n            elem.endIndex = this._parser.endIndex;\n        }\n        if (this._elementCB)\n            this._elementCB(elem);\n    };\n    DomHandler.prototype.onopentag = function (name, attribs) {\n        var element = new node_1.Element(name, attribs);\n        this.addNode(element);\n        this._tagStack.push(element);\n    };\n    DomHandler.prototype.ontext = function (data) {\n        var normalize = this._options.normalizeWhitespace;\n        var _lastNode = this._lastNode;\n        if (_lastNode && _lastNode.type === \"text\" /* Text */) {\n            if (normalize) {\n                _lastNode.data = (_lastNode.data + data).replace(reWhitespace, \" \");\n            }\n            else {\n                _lastNode.data += data;\n            }\n        }\n        else {\n            if (normalize) {\n                data = data.replace(reWhitespace, \" \");\n            }\n            var node = new node_1.DataNode(\"text\" /* Text */, data);\n            this.addNode(node);\n            this._lastNode = node;\n        }\n    };\n    DomHandler.prototype.oncomment = function (data) {\n        if (this._lastNode && this._lastNode.type === \"comment\" /* Comment */) {\n            this._lastNode.data += data;\n            return;\n        }\n        var node = new node_1.DataNode(\"comment\" /* Comment */, data);\n        this.addNode(node);\n        this._lastNode = node;\n    };\n    DomHandler.prototype.oncommentend = function () {\n        this._lastNode = null;\n    };\n    DomHandler.prototype.oncdatastart = function () {\n        var text = new node_1.DataNode(\"text\" /* Text */, \"\");\n        var node = new node_1.NodeWithChildren(\"cdata\" /* CDATA */, [text]);\n        this.addNode(node);\n        text.parent = node;\n        this._lastNode = text;\n    };\n    DomHandler.prototype.oncdataend = function () {\n        this._lastNode = null;\n    };\n    DomHandler.prototype.onprocessinginstruction = function (name, data) {\n        var node = new node_1.ProcessingInstruction(name, data);\n        this.addNode(node);\n    };\n    DomHandler.prototype.handleCallback = function (error) {\n        if (typeof this._callback === \"function\") {\n            this._callback(error, this.dom);\n        }\n        else if (error) {\n            throw error;\n        }\n    };\n    DomHandler.prototype.addNode = function (node) {\n        var parent = this._tagStack[this._tagStack.length - 1];\n        var siblings = parent ? parent.children : this.dom;\n        var previousSibling = siblings[siblings.length - 1];\n        if (this._parser) {\n            if (this._options.withStartIndices) {\n                node.startIndex = this._parser.startIndex;\n            }\n            if (this._options.withEndIndices) {\n                node.endIndex = this._parser.endIndex;\n            }\n        }\n        siblings.push(node);\n        if (previousSibling) {\n            node.prev = previousSibling;\n            previousSibling.next = node;\n        }\n        if (parent) {\n            node.parent = parent;\n        }\n        this._lastNode = null;\n    };\n    DomHandler.prototype.addDataNode = function (node) {\n        this.addNode(node);\n        this._lastNode = node;\n    };\n    return DomHandler;\n}());\nexports.DomHandler = DomHandler;\nexports.default = DomHandler;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n    if (mod && mod.__esModule) return mod;\n    var result = {};\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n    result[\"default\"] = mod;\n    return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar domhandler_1 = __importDefault(require(\"domhandler\"));\nvar DomUtils = __importStar(require(\"domutils\"));\nvar Parser_1 = require(\"./Parser\");\n//TODO: Consume data as it is coming in\nvar FeedHandler = /** @class */ (function (_super) {\n    __extends(FeedHandler, _super);\n    /**\n     *\n     * @param callback\n     * @param options\n     */\n    function FeedHandler(callback, options) {\n        var _this = this;\n        if (typeof callback === \"object\" && callback !== null) {\n            callback = undefined;\n            options = callback;\n        }\n        _this = _super.call(this, callback, options) || this;\n        return _this;\n    }\n    FeedHandler.prototype.onend = function () {\n        var feed = {};\n        var feedRoot = getOneElement(isValidFeed, this.dom);\n        if (feedRoot) {\n            if (feedRoot.name === \"feed\") {\n                var childs = feedRoot.children;\n                feed.type = \"atom\";\n                addConditionally(feed, \"id\", \"id\", childs);\n                addConditionally(feed, \"title\", \"title\", childs);\n                var href = getAttribute(\"href\", getOneElement(\"link\", childs));\n                if (href) {\n                    feed.link = href;\n                }\n                addConditionally(feed, \"description\", \"subtitle\", childs);\n                var updated = fetch(\"updated\", childs);\n                if (updated) {\n                    feed.updated = new Date(updated);\n                }\n                addConditionally(feed, \"author\", \"email\", childs, true);\n                feed.items = getElements(\"entry\", childs).map(function (item) {\n                    var entry = {};\n                    var children = item.children;\n                    addConditionally(entry, \"id\", \"id\", children);\n                    addConditionally(entry, \"title\", \"title\", children);\n                    var href = getAttribute(\"href\", getOneElement(\"link\", children));\n                    if (href) {\n                        entry.link = href;\n                    }\n                    var description = fetch(\"summary\", children) ||\n                        fetch(\"content\", children);\n                    if (description) {\n                        entry.description = description;\n                    }\n                    var pubDate = fetch(\"updated\", children);\n                    if (pubDate) {\n                        entry.pubDate = new Date(pubDate);\n                    }\n                    return entry;\n                });\n            }\n            else {\n                var childs = getOneElement(\"channel\", feedRoot.children)\n                    .children;\n                feed.type = feedRoot.name.substr(0, 3);\n                feed.id = \"\";\n                addConditionally(feed, \"title\", \"title\", childs);\n                addConditionally(feed, \"link\", \"link\", childs);\n                addConditionally(feed, \"description\", \"description\", childs);\n                var updated = fetch(\"lastBuildDate\", childs);\n                if (updated) {\n                    feed.updated = new Date(updated);\n                }\n                addConditionally(feed, \"author\", \"managingEditor\", childs, true);\n                feed.items = getElements(\"item\", feedRoot.children).map(function (item) {\n                    var entry = {};\n                    var children = item.children;\n                    addConditionally(entry, \"id\", \"guid\", children);\n                    addConditionally(entry, \"title\", \"title\", children);\n                    addConditionally(entry, \"link\", \"link\", children);\n                    addConditionally(entry, \"description\", \"description\", children);\n                    var pubDate = fetch(\"pubDate\", children);\n                    if (pubDate)\n                        entry.pubDate = new Date(pubDate);\n                    return entry;\n                });\n            }\n        }\n        this.feed = feed;\n        this.handleCallback(feedRoot ? null : Error(\"couldn't find root of feed\"));\n    };\n    return FeedHandler;\n}(domhandler_1.default));\nexports.FeedHandler = FeedHandler;\nfunction getElements(what, where) {\n    return DomUtils.getElementsByTagName(what, where, true);\n}\nfunction getOneElement(what, where) {\n    return DomUtils.getElementsByTagName(what, where, true, 1)[0];\n}\nfunction fetch(what, where, recurse) {\n    if (recurse === void 0) { recurse = false; }\n    return DomUtils.getText(DomUtils.getElementsByTagName(what, where, recurse, 1)).trim();\n}\nfunction getAttribute(name, elem) {\n    if (!elem) {\n        return null;\n    }\n    var attribs = elem.attribs;\n    return attribs[name];\n}\nfunction addConditionally(obj, prop, what, where, recurse) {\n    if (recurse === void 0) { recurse = false; }\n    var tmp = fetch(what, where, recurse);\n    // @ts-ignore\n    if (tmp)\n        obj[prop] = tmp;\n}\nfunction isValidFeed(value) {\n    return value === \"rss\" || value === \"feed\" || value === \"rdf:RDF\";\n}\nvar defaultOptions = { xmlMode: true };\n/**\n * Parse a feed.\n *\n * @param feed The feed that should be parsed, as a string.\n * @param options Optionally, options for parsing. When using this option, you probably want to set `xmlMode` to `true`.\n */\nfunction parseFeed(feed, options) {\n    if (options === void 0) { options = defaultOptions; }\n    var handler = new FeedHandler(options);\n    new Parser_1.Parser(handler, options).end(feed);\n    return handler.feed;\n}\nexports.parseFeed = parseFeed;\n","\"use strict\";\nfunction __export(m) {\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(require(\"./stringify\"));\n__export(require(\"./traversal\"));\n__export(require(\"./manipulation\"));\n__export(require(\"./querying\"));\n__export(require(\"./legacy\"));\n__export(require(\"./helpers\"));\n__export(require(\"./tagtypes\"));\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar legacy_json_1 = __importDefault(require(\"./maps/legacy.json\"));\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar decode_codepoint_1 = __importDefault(require(\"./decode_codepoint\"));\nexports.decodeXML = getStrictDecoder(xml_json_1.default);\nexports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);\nfunction getStrictDecoder(map) {\n    var keys = Object.keys(map).join(\"|\");\n    var replace = getReplacer(map);\n    keys += \"|#[xX][\\\\da-fA-F]+|#\\\\d+\";\n    var re = new RegExp(\"&(?:\" + keys + \");\", \"g\");\n    return function (str) { return String(str).replace(re, replace); };\n}\nvar sorter = function (a, b) { return (a < b ? 1 : -1); };\nexports.decodeHTML = (function () {\n    var legacy = Object.keys(legacy_json_1.default).sort(sorter);\n    var keys = Object.keys(entities_json_1.default).sort(sorter);\n    for (var i = 0, j = 0; i < keys.length; i++) {\n        if (legacy[j] === keys[i]) {\n            keys[i] += \";?\";\n            j++;\n        }\n        else {\n            keys[i] += \";\";\n        }\n    }\n    var re = new RegExp(\"&(?:\" + keys.join(\"|\") + \"|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)\", \"g\");\n    var replace = getReplacer(entities_json_1.default);\n    function replacer(str) {\n        if (str.substr(-1) !== \";\")\n            str += \";\";\n        return replace(str);\n    }\n    //TODO consider creating a merged map\n    return function (str) {\n        return String(str).replace(re, replacer);\n    };\n})();\nfunction getReplacer(map) {\n    return function replace(str) {\n        if (str.charAt(1) === \"#\") {\n            if (str.charAt(2) === \"X\" || str.charAt(2) === \"x\") {\n                return decode_codepoint_1.default(parseInt(str.substr(3), 16));\n            }\n            return decode_codepoint_1.default(parseInt(str.substr(2), 10));\n        }\n        return map[str.slice(1, -1)];\n    };\n}\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar inverseXML = getInverseObj(xml_json_1.default);\nvar xmlReplacer = getInverseReplacer(inverseXML);\nexports.encodeXML = getInverse(inverseXML, xmlReplacer);\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar inverseHTML = getInverseObj(entities_json_1.default);\nvar htmlReplacer = getInverseReplacer(inverseHTML);\nexports.encodeHTML = getInverse(inverseHTML, htmlReplacer);\nfunction getInverseObj(obj) {\n    return Object.keys(obj)\n        .sort()\n        .reduce(function (inverse, name) {\n        inverse[obj[name]] = \"&\" + name + \";\";\n        return inverse;\n    }, {});\n}\nfunction getInverseReplacer(inverse) {\n    var single = [];\n    var multiple = [];\n    Object.keys(inverse).forEach(function (k) {\n        return k.length === 1\n            ? // Add value to single array\n                single.push(\"\\\\\" + k)\n            : // Add value to multiple array\n                multiple.push(k);\n    });\n    //TODO add ranges\n    multiple.unshift(\"[\" + single.join(\"\") + \"]\");\n    return new RegExp(multiple.join(\"|\"), \"g\");\n}\nvar reNonASCII = /[^\\0-\\x7F]/g;\nvar reAstralSymbols = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\nfunction singleCharReplacer(c) {\n    return \"&#x\" + c\n        .charCodeAt(0)\n        .toString(16)\n        .toUpperCase() + \";\";\n}\n// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any\nfunction astralReplacer(c, _) {\n    // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n    var high = c.charCodeAt(0);\n    var low = c.charCodeAt(1);\n    var codePoint = (high - 0xd800) * 0x400 + low - 0xdc00 + 0x10000;\n    return \"&#x\" + codePoint.toString(16).toUpperCase() + \";\";\n}\nfunction getInverse(inverse, re) {\n    return function (data) {\n        return data\n            .replace(re, function (name) { return inverse[name]; })\n            .replace(reAstralSymbols, astralReplacer)\n            .replace(reNonASCII, singleCharReplacer);\n    };\n}\nvar reXmlChars = getInverseReplacer(inverseXML);\nfunction escape(data) {\n    return data\n        .replace(reXmlChars, singleCharReplacer)\n        .replace(reAstralSymbols, astralReplacer)\n        .replace(reNonASCII, singleCharReplacer);\n}\nexports.escape = escape;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tagtypes_1 = require(\"./tagtypes\");\nfunction filter(test, element, recurse, limit) {\n    if (recurse === void 0) { recurse = true; }\n    if (limit === void 0) { limit = Infinity; }\n    if (!Array.isArray(element))\n        element = [element];\n    return find(test, element, recurse, limit);\n}\nexports.filter = filter;\nfunction find(test, elems, recurse, limit) {\n    var result = [];\n    for (var i = 0; i < elems.length; i++) {\n        var elem = elems[i];\n        if (test(elem)) {\n            result.push(elem);\n            if (--limit <= 0)\n                break;\n        }\n        if (recurse && tagtypes_1.hasChildren(elem) && elem.children.length > 0) {\n            var children = find(test, elem.children, recurse, limit);\n            result = result.concat(children);\n            limit -= children.length;\n            if (limit <= 0)\n                break;\n        }\n    }\n    return result;\n}\nexports.find = find;\nfunction findOneChild(test, elems) {\n    for (var i = 0; i < elems.length; i++) {\n        if (test(elems[i]))\n            return elems[i];\n    }\n    return null;\n}\nexports.findOneChild = findOneChild;\nfunction findOne(test, elems, recurse) {\n    if (recurse === void 0) { recurse = true; }\n    var elem = null;\n    for (var i = 0; i < elems.length && !elem; i++) {\n        var checked = elems[i];\n        if (!tagtypes_1.isTag(checked)) {\n            continue;\n        }\n        else if (test(checked)) {\n            elem = checked;\n        }\n        else if (recurse && checked.children.length > 0) {\n            elem = findOne(test, checked.children);\n        }\n    }\n    return elem;\n}\nexports.findOne = findOne;\nfunction existsOne(test, elems) {\n    for (var i = 0; i < elems.length; i++) {\n        var checked = elems[i];\n        if (tagtypes_1.isTag(checked) &&\n            (test(checked) ||\n                (checked.children.length > 0 &&\n                    existsOne(test, checked.children)))) {\n            return true;\n        }\n    }\n    return false;\n}\nexports.existsOne = existsOne;\nfunction findAll(test, rootElems) {\n    var result = [];\n    var stack = rootElems.slice();\n    while (stack.length) {\n        var elem = stack.shift();\n        if (!elem || !tagtypes_1.isTag(elem))\n            continue;\n        if (elem.children && elem.children.length > 0) {\n            stack.unshift.apply(stack, elem.children);\n        }\n        if (test(elem))\n            result.push(elem);\n    }\n    return result;\n}\nexports.findAll = findAll;\n","/**\r\n * To-be-properties of the {@link module:cd~convenientDiscussions.g} object. These are those of them\r\n * that are known from the beginning and can be safely imported in a web worker (that doesn't have\r\n * access to the window scope). We assume that there is no point to make these properties subject to\r\n * change by site administrators although that may be disputable. Some of them are extensible in the\r\n * config (such as `UNHIGHLIGHTABLE_ELEMENTS_CLASSES`).\r\n *\r\n * @module staticGlobals\r\n */\r\n\r\n/**\r\n * Properties of the `convenientDiscussions.g` object (incomplete list). Static (i.e., known from\r\n * the beginning) ones are declared in {@link module:staticGlobals}.\r\n *\r\n * @namespace g\r\n * @memberof module:cd~convenientDiscussions\r\n */\r\n\r\nexport default {\r\n  /**\r\n   * A replacement for {@link\r\n   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Unicode_Property_Escapes\r\n   * unicode property escapes} while they are not supported in major browsers. {@link\r\n   * https://github.com/slevithan/xregexp} can be used also.\r\n   *\r\n   * @type {string}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  LETTER_PATTERN: 'A-Za-z\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B4\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0AF9\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58-\\\\u0C5A\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D5F-\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F5\\\\u13F8-\\\\u13FD\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16F1-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2183\\\\u2184\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005\\\\u3006\\\\u3031-\\\\u3035\\\\u303B\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FD5\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6E5\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA7AD\\\\uA7B0-\\\\uA7B7\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA8FD\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB65\\\\uAB70-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC',\r\n\r\n  /**\r\n   * Underlay color for focused (hovered) comments.\r\n   *\r\n   * @type {string}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  COMMENT_UNDERLAY_FOCUSED_COLOR: '#eaf3ff',\r\n\r\n  /**\r\n   * Underlay color for target comments.\r\n   *\r\n   * @type {string}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  COMMENT_UNDERLAY_TARGET_COLOR: '#ffedb8',\r\n\r\n  /**\r\n   * Underlay color for new comments.\r\n   *\r\n   * @type {string}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  COMMENT_UNDERLAY_NEW_COLOR: '#e8ffd1',\r\n\r\n  /**\r\n   * Underlay color for own comments.\r\n   *\r\n   * @type {string}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  COMMENT_UNDERLAY_OWN_COLOR: '#f7ebff',\r\n\r\n  /**\r\n   * Size of the underlay's side margin in pixels.\r\n   *\r\n   * @type {string}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  COMMENT_UNDERLAY_SIDE_MARGIN: 5,\r\n\r\n  /**\r\n   * How long a comment should be considered new and have a corresponding background on newly loaded\r\n   * pages. In minutes.\r\n   *\r\n   * @type {number}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  HIGHLIGHT_NEW_COMMENTS_INTERVAL: 15,\r\n\r\n  /**\r\n   * Number of seconds between new comments checks when the tab is not hidden.\r\n   *\r\n   * @type {number}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  CHECK_FOR_NEW_COMMENTS_INTERVAL: 15,\r\n\r\n  /**\r\n   * Number of seconds between new comments checks when the tab is hidden.\r\n   *\r\n   * @type {number}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  BACKGROUND_CHECK_FOR_NEW_COMMENTS_INTERVAL: 60,\r\n\r\n  /**\r\n   * Number of seconds in a day.\r\n   *\r\n   * @type {number}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  SECONDS_IN_A_DAY: 60 * 60 * 24,\r\n\r\n  /**\r\n   * Number of milliseconds in a minute.\r\n   *\r\n   * @type {number}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  MILLISECONDS_IN_A_MINUTE: 1000 * 60,\r\n\r\n  /**\r\n   * Popular elements that don't have the `display: inline` property in the default browser styles.\r\n   *\r\n   * @type {string[]}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  POPULAR_NOT_INLINE_ELEMENTS: [\r\n    'BLOCKQUOTE', 'DD', 'DIV', 'DL', 'FORM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'INPUT',\r\n    'LI', 'OL', 'P', 'PRE', 'TABLE', 'TBODY', 'TR', 'TH', 'TD', 'UL'\r\n  ],\r\n\r\n  /**\r\n   * Popular elements that do have the `display: inline` property in the default browser styles.\r\n   *\r\n   * @type {string[]}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  POPULAR_INLINE_ELEMENTS: [\r\n    'A', 'ABBR', 'B', 'BIG', 'BR', 'CITE', 'CODE', 'EM', 'FONT', 'I', 'IMG', 'KBD', 'Q', 'S',\r\n    'SAMP', 'SMALL', 'SPAN', 'STRIKE', 'STRONG', 'SUB', 'SUP', 'TT', 'U', 'VAR'\r\n  ],\r\n\r\n  /**\r\n   * Classes of elements that shouldn't be highlighted. Only MediaWiki-assigned classes go here.\r\n   * Wiki-specific classes go in the configuration.\r\n   *\r\n   * @type {string[]}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  UNHIGHLIGHTABLE_ELEMENTS_CLASSES: [\r\n    'mw-empty-elt',\r\n    'tleft',\r\n    'tright',\r\n    'floatleft',\r\n    'floatright',\r\n  ],\r\n\r\n  /**\r\n   * Regexps for strings that should be cut out of comment beginnings (not considered parts of\r\n   * them).\r\n   *\r\n   * @type {RegExp[]}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  BAD_COMMENT_BEGINNINGS: [\r\n    /^<!--[^]*?--> *\\n*/,\r\n    /^(?:----+|<hr>) *\\n*/,\r\n    /^\\{\\|.*?\\|\\} *\\n*(?=[*:#])/,\r\n  ],\r\n\r\n  /**\r\n   * Selectors of floating elements. This is needed to display the comment's underlay and overlay\r\n   * correctly.\r\n   *\r\n   * @type {string[]}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  FLOATING_ELEMENTS_SELECTORS: [\r\n    '.cd-floating',\r\n    '.tright',\r\n    '.floatright',\r\n    '*[style*=\"float:right\"]',\r\n    '*[style*=\"float: right\"]',\r\n    '*[style*=\"float:left\"]',\r\n    '*[style*=\"float: left\"]',\r\n  ],\r\n\r\n  /**\r\n   * Auxiliary property to keep the sign code: \"\\~\\~\\~\\~\". If written as plain text, it gets\r\n   * transformed into the edit author's signature when saved. Note that the minifier translates\r\n   * \"~\\~\\\\~\" and \"'\\~\\~' + '\\~'\" into \"\\~\\~\\~\".\r\n   *\r\n   * @type {string}\r\n   * @memberof module:cd~convenientDiscussions.g\r\n   */\r\n  SIGN_CODE: '~~'.concat('~~'),\r\n};\r\n","/**\r\n * A number of methods to simplify measuring time that it takes to run certain routines as well as\r\n * counting the number of times certain instructions run.\r\n *\r\n * @module debug\r\n */\r\n\r\nexport default {\r\n\t/**\r\n\t * Init/reset all properties of the debug object.\r\n\t */\r\n\tinit() {\r\n\t\t/**\r\n\t\t * Total time for every timer.\r\n\t\t *\r\n\t\t * @type {object}\r\n\t\t */\r\n\t\tthis.timerTotal = {};\r\n\r\n\t\t/**\r\n\t\t * Timer start timestamps for every timer.\r\n\t\t *\r\n\t\t * @type {object}\r\n\t\t */\r\n\t\tthis.timerStartTimestamps = {};\r\n\r\n\t\t/**\r\n\t\t * The number of times a timer has run.\r\n\t\t *\r\n\t\t * @type {object}\r\n\t\t */\r\n\t\tthis.timerRunCount = {};\r\n\r\n\t\t/**\r\n\t\t * Total time for all timer runs, ignoring timer resets (but not full resets).\r\n\t\t *\r\n\t\t * @type {object}\r\n\t\t */\r\n\t\tthis.timerAllRunsTotal = {};\r\n\r\n\t\tthis.initCounters();\r\n\r\n\t\t/**\r\n\t\t * An array to keep any values sequentially.\r\n\t\t *\r\n\t\t * @type {Array}\r\n\t\t */\r\n\t\tthis.array = [];\r\n\r\n\t\t/**\r\n\t\t * An object to keep any values by key.\r\n\t\t *\r\n\t\t * @type {Array}\r\n\t\t */\r\n\t\tthis.object = {};\r\n\t},\r\n\r\n\t/**\r\n\t * Init counters object to have incrementation work with any of its properties without the need to\r\n\t * assign 0 to it first.\r\n\t */\r\n\tinitCounters() {\r\n\t\tthis.counters = typeof Proxy === 'undefined' ?\r\n\t\t\t{} :\r\n\t\t\tnew Proxy({}, { get: (obj, prop) => prop in obj ? obj[prop] : 0 });\r\n\t},\r\n\r\n\t/**\r\n\t * Start the specified timer.\r\n\t *\r\n\t * @param {string} label\r\n\t */\r\n\tstartTimer(label) {\r\n\t\tthis.timerStartTimestamps[label] = Date.now();\r\n\t},\r\n\r\n\t/**\r\n\t * Stop the specified timer.\r\n\t *\r\n\t * @param {string} label\r\n\t */\r\n\tstopTimer(label) {\r\n\t\tif (this.timerStartTimestamps[label] === undefined) return;\r\n\t\tif (this.timerTotal[label] === undefined) {\r\n\t\t\tthis.timerTotal[label] = 0;\r\n\t\t}\r\n\t\tconst thisTime = Date.now() - this.timerStartTimestamps[label];\r\n\t\tthis.timerTotal[label] += thisTime;\r\n\t\tdelete this.timerStartTimestamps[label];\r\n\r\n\t\tif (this.timerAllRunsTotal[label] === undefined) {\r\n\t\t\tthis.timerAllRunsTotal[label] = 0;\r\n\t\t\tthis.timerRunCount[label] = 0;\r\n\t\t}\r\n\t\tthis.timerAllRunsTotal[label] += thisTime;\r\n\t\tthis.timerRunCount[label]++;\r\n\t},\r\n\r\n\t/**\r\n\t * Reset the total time value for the timer.\r\n\t *\r\n\t * @param {string} label\r\n\t */\r\n\tresetTimer(label) {\r\n\t\tif (this.timerStartTimestamps[label] !== undefined) {\r\n\t\t\tthis.stopTimer(label);\r\n\t\t}\r\n\t\tdelete this.timerTotal[label];\r\n\t},\r\n\r\n\t/**\r\n\t * Remove all data associated with the timer.\r\n\t *\r\n\t * @param {string} label\r\n\t */\r\n\tfullResetTimer(label) {\r\n\t\tthis.resetTimer(label);\r\n\t\tdelete this.timerAllRunsTotal[label];\r\n\t\tdelete this.timerRunCount[label];\r\n\t},\r\n\r\n\t/**\r\n\t * Log and reset the specified timer.\r\n\t *\r\n\t * @param {string} label\r\n\t */\r\n\tlogAndResetTimer(label) {\r\n\t\tif (this.timerStartTimestamps[label] !== undefined) {\r\n\t\t\tthis.stopTimer(label);\r\n\t\t}\r\n\t\tif (this.timerTotal[label] !== undefined) {\r\n\t\t\tconsole.debug(`${label}: ${this.timerTotal[label]}`);\r\n\t\t\tthis.resetTimer(label);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Log and reset all timers, as well as counters and other collected values.\r\n\t *\r\n\t * @param {boolean} sort Whether to sort timers and counters alphabetically.\r\n\t */\r\n\tlogAndResetEverything(sort) {\r\n\t\tconst timerLabels = Object.keys(this.timerTotal);\r\n\t\tif (sort) {\r\n\t\t\ttimerLabels.sort();\r\n\t\t}\r\n\t\ttimerLabels.forEach((label) => {\r\n\t\t\tthis.logAndResetTimer(label);\r\n\t\t});\r\n\r\n\t\tconst counterLabels = Object.keys(this.counters);\r\n\t\tif (sort) {\r\n\t\t\tcounterLabels.sort();\r\n\t\t}\r\n\t\tcounterLabels.forEach((label) => {\r\n\t\t\tconsole.debug(`counter ${label}: ${this.counters[label]}`);\r\n\t\t});\r\n\t\tthis.initCounters();\r\n\r\n\t\tif (this.array.length) {\r\n\t\t\tconsole.debug(`array: `, this.array);\r\n\t\t\tthis.array = [];\r\n\t\t}\r\n\r\n\t\tif (Object.keys(this.object).length) {\r\n\t\t\tconsole.debug(`object: `, this.object);\r\n\t\t\tthis.object = {};\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Log the average time one run of the specified timer takes. All runs of the timer are taken into\r\n\t * account unless a [full reset]{@link module:debug.fullResetTimer} has been performed.\r\n\t *\r\n\t * @param {string} label\r\n\t */\r\n\taverageTimerTime(label) {\r\n\t\tif (!this.timerAllRunsTotal[label]) {\r\n\t\t\tconsole.error(`No data for timer ${label}`);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst average = this.timerAllRunsTotal[label] / this.timerRunCount[label];\r\n\t\tconsole.debug(`${label}: ${average.toFixed(1)} average for ${this.timerRunCount[label]} runs`);\r\n\t},\r\n\r\n\t/**\r\n\t * Increment the specified counter.\r\n\t *\r\n\t * @param {string} label\r\n\t */\r\n\tincrementCounter(label) {\r\n\t\tthis.counters[label]++;\r\n\t},\r\n};\r\n","/**\r\n * Comment skeleton class.\r\n *\r\n * @module CommentSkeleton\r\n */\r\n\r\nimport CdError from './CdError';\r\nimport cd from './cd';\r\n\r\n/**\r\n * Class containing the main properties of a comment. This class is the only one used in the worker\r\n * context for comments.\r\n *\r\n * @class\r\n */\r\nexport default class CommentSkeleton {\r\n  #parser\r\n  #cachedSection\r\n\r\n  /**\r\n   * Create a comment skeleton instance.\r\n   *\r\n   * @param {Parser} parser\r\n   * @param {object} signature Signature object returned by {@link module:Parser#findSignatures}.\r\n   * @throws {CdError}\r\n   */\r\n  constructor(parser, signature) {\r\n    this.#parser = parser;\r\n\r\n    // Identify all comment nodes and save the path to them.\r\n    let parts = this.#parser.collectParts(signature.element);\r\n\r\n    // Remove parts contained by other parts\r\n    parts = this.#parser.removeNestedParts(parts);\r\n\r\n    // We may need to enclose sibling sequences in a <div> tag in order for them not to be bare (we\r\n    // can't get bounding client rectangle for text nodes, can't specify margins for them etc.).\r\n    parts = this.#parser.encloseInlineParts(parts, signature.element);\r\n\r\n    // At this point, we can safely remove unnecessary nodes.\r\n    parts = this.#parser.filterParts(parts);\r\n\r\n    parts.reverse();\r\n\r\n    // dd, li instead of dl, ul, ol where appropriate.\r\n    parts = this.#parser.replaceListsWithItems(parts, signature.element);\r\n\r\n    /**\r\n     * Comment ID. Same as the comment index in {@link module:cd~convenientDiscussions.comments\r\n     * convenientDiscussions.comments}.\r\n     *\r\n     * @type {number}\r\n     */\r\n    this.id = cd.comments.length;\r\n\r\n    /**\r\n     * Comment date.\r\n     *\r\n     * @type {?Date}\r\n     */\r\n    this.date = signature.date || null;\r\n\r\n    /**\r\n     * Comment timestamp as present on the page.\r\n     *\r\n     * @type {string}\r\n     */\r\n    this.timestamp = signature.timestampText;\r\n\r\n    /**\r\n     * Comment author name.\r\n     *\r\n     * @type {string}\r\n     */\r\n    this.authorName = signature.authorName;\r\n\r\n    /**\r\n     * Does the comment belong to the current user.\r\n     *\r\n     * @type {boolean}\r\n     */\r\n    this.own = this.authorName === cd.g.CURRENT_USER_NAME;\r\n\r\n    /**\r\n     * Comment anchor.\r\n     *\r\n     * @type {?string}\r\n     */\r\n    this.anchor = signature.anchor;\r\n\r\n    /**\r\n     * Is the comment unsigned or not properly signed (an unsigned template class is present).\r\n     *\r\n     * Not used anywhere in the script yet.\r\n     *\r\n     * @type {boolean}\r\n     */\r\n    this.unsigned = signature.unsigned;\r\n\r\n    /**\r\n     * Comment parts.\r\n     *\r\n     * @type {object[]}\r\n     */\r\n    this.parts = parts;\r\n\r\n    /**\r\n     * Comment elements.\r\n     *\r\n     * @type {Element[]}\r\n     */\r\n    this.elements = this.parts.map((part) => part.node);\r\n\r\n    const isHighlightable = (el) => (\r\n      !/^H[1-6]$/.test(el.tagName) &&\r\n      !cd.g.UNHIGHLIGHTABLE_ELEMENTS_CLASSES.some((name) => el.classList.contains(name)) &&\r\n      !/float: *(?:left|right)/.test(el.getAttribute('style'))\r\n    );\r\n\r\n    /**\r\n     * Comment elements that are highlightable.\r\n     *\r\n     * Keep in mind that the elements may be replaced, and the property values will need to be\r\n     * updated. See mergeAdjacentCommentLevels() in {@link module:modifyDom}.\r\n     *\r\n     * @type {Element[]}\r\n     */\r\n    this.highlightables = this.elements.filter(isHighlightable);\r\n\r\n    // That which cannot be highlighted should not be considered existent.\r\n    if (!this.highlightables.length) {\r\n      throw new CdError();\r\n    }\r\n\r\n    this.addAttributes();\r\n\r\n    this.setLevels();\r\n\r\n    if (this.parts[0].isHeading) {\r\n      /**\r\n       * Is the comment followed by a heading.\r\n       *\r\n       * @type {boolean}\r\n       */\r\n      this.followsHeading = true;\r\n\r\n      if (this.level !== 0) {\r\n        this.parts.splice(0, 1);\r\n        this.elements.splice(0, 1);\r\n      }\r\n    } else {\r\n      this.followsHeading = true;\r\n    }\r\n    if (this.parts[0].isHeading) {\r\n      /**\r\n       * Does the comment open a section (has a heading as the first element and is placed at the\r\n       * zeroth level).\r\n       *\r\n       * @type {boolean}\r\n       */\r\n      this.isOpeningSection = true;\r\n      const headingLevelMatch = this.parts[0].node.tagName.match(/^H([1-6])$/);\r\n      this.openingSectionOfLevel = headingLevelMatch && Number(headingLevelMatch[1]);\r\n    } else {\r\n      this.isOpeningSection = false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add necessary attributes to the comment elements.\r\n   *\r\n   * @private\r\n   */\r\n  addAttributes() {\r\n    if (this.anchor && !this.elements[0].getAttribute('id')) {\r\n      this.elements[0].setAttribute('id', this.anchor);\r\n    }\r\n    this.elements[0].classList.add('cd-commentPart-first');\r\n    this.elements[this.elements.length - 1].classList.add('cd-commentPart-last');\r\n    this.elements.forEach((el) => {\r\n      el.classList.add('cd-commentPart');\r\n      el.setAttribute('data-comment-id', String(this.id));\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Set necessary classes to parent elements of the comment elements to make a visible tree\r\n   * structure.\r\n   *\r\n   * @private\r\n   */\r\n  setLevels() {\r\n    // We make sure the level on the top and on the bottom of the comment are the same, and add\r\n    // corresponding classes.\r\n    const levelElements = {};\r\n    levelElements.top = this.#parser.getLevelsUpTree(this.highlightables[0]);\r\n    levelElements.bottom = this.highlightables.length > 1 ?\r\n      this.#parser.getLevelsUpTree(this.highlightables[this.highlightables.length - 1]) :\r\n      levelElements.top;\r\n\r\n    /**\r\n     * Comment level. A level is a number representing the number of indentation characters\r\n     * preceding the comment (no indentation means zeroth level).\r\n     *\r\n     * @type {number}\r\n     */\r\n    this.level = Math.min(levelElements.top.length, levelElements.bottom.length);\r\n    for (let i = 0; i < this.level; i++) {\r\n      if (levelElements.top[i]) {\r\n        levelElements.top[i].classList.add('cd-commentLevel', `cd-commentLevel-${i + 1}`);\r\n      }\r\n      if (levelElements.bottom[i] && levelElements.bottom[i] !== levelElements.top[i]) {\r\n        levelElements.bottom[i].classList.add('cd-commentLevel', `cd-commentLevel-${i + 1}`);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get the lowest level (= with the biggest level number) section that the comment is in.\r\n   *\r\n   * @returns {?Section}\r\n   * @private\r\n   */\r\n  getSection() {\r\n    return (\r\n      cd.sections\r\n        .slice()\r\n        .reverse()\r\n        .find((section) => section.comments.includes(this)) ||\r\n      null\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Lowest level section that this comment belongs to.\r\n   *\r\n   * @type {?Section}\r\n   */\r\n  get section() {\r\n    if (this.#cachedSection === undefined) {\r\n      this.#cachedSection = this.getSection();\r\n    }\r\n    return this.#cachedSection;\r\n  }\r\n\r\n  /**\r\n   * Wiki page that has the source code of the comment (may be different from the current page if\r\n   * the comment is transcluded from another page).\r\n   *\r\n   * @type {string}\r\n   */\r\n  get sourcePage() {\r\n    return this.section ? this.section.sourcePage : cd.g.CURRENT_PAGE;\r\n  }\r\n}\r\n","/**\r\n * Section skeleton class.\r\n *\r\n * @module SectionSkeleton\r\n */\r\n\r\nimport CdError from './CdError';\r\nimport cd from './cd';\r\nimport { TreeWalker } from './treeWalker';\r\n\r\n/**\r\n * Class containing the main properties of a section. This class is the only one used in the worker\r\n * context for sections.\r\n */\r\nexport default class SectionSkeleton {\r\n  #parser\r\n\r\n  /**\r\n   * Create a section skeleton instance.\r\n   *\r\n   * @param {Parser} parser\r\n   * @param {Element} headingElement\r\n   */\r\n  constructor(parser, headingElement) {\r\n    this.#parser = parser;\r\n\r\n    /**\r\n     * Headline element.\r\n     *\r\n     * @type {Element}\r\n     */\r\n    this.headlineElement = this.#parser.context\r\n      .getElementByClassName(headingElement, 'mw-headline');\r\n    if (!this.headlineElement) {\r\n      throw new CdError();\r\n    }\r\n\r\n    /**\r\n     * Section anchor.\r\n     *\r\n     * @type {string}\r\n     */\r\n    this.anchor = this.headlineElement.getAttribute('id');\r\n\r\n    const classesToFilter = ['mw-headline-number', ...cd.config.foreignElementsInHeadlinesClasses];\r\n    const nodes = Array.from(this.headlineElement.childNodes).filter((node) => (\r\n      node.nodeType !== Node.ELEMENT_NODE ||\r\n      !Array.from(node.classList).some((name) => classesToFilter.includes(name))\r\n    ));\r\n\r\n    /**\r\n     * Section headline.\r\n     *\r\n     * @type {string}\r\n     */\r\n    this.headline = nodes\r\n      .map((node) => node.textContent)\r\n      .join('')\r\n      .trim();\r\n\r\n    const levelMatch = headingElement.tagName.match(/^H([2-6])$/);\r\n\r\n    /**\r\n     * Section level. A level is a number representing the number of `=` characters in the section\r\n     * heading's code.\r\n     *\r\n     * @type {number}\r\n     */\r\n    this.level = levelMatch && Number(levelMatch[1]);\r\n\r\n    const treeWalker = new TreeWalker(\r\n      cd.g.rootElement,\r\n      (node) => (\r\n        !['STYLE', 'LINK'].includes(node.tagName) &&\r\n        // .cd-sectionButtonContainer elements are added to level 2 sections, which means they won't\r\n        // have them as elements but their last subsections can if they are included. So we better\r\n        // don't include them at all.\r\n        !node.classList.contains('cd-sectionButtonContainer')\r\n      ),\r\n      true,\r\n      headingElement\r\n    );\r\n\r\n    this.headingNestingLevel = 0;\r\n    while (treeWalker.parentNode()) {\r\n      this.headingNestingLevel++;\r\n    }\r\n\r\n    treeWalker.currentNode = headingElement;\r\n    const elements = [headingElement];\r\n    const levelRegexp = new RegExp(`^H[1-${this.level}]$`);\r\n\r\n    // The last element before the next heading if we start from the heading of this section. That\r\n    // heading which may be a part of the next section of the same level, or the subsection of this\r\n    // section.\r\n    let hasSubsections = false;\r\n    while (treeWalker.nextSibling() && !levelRegexp.test(treeWalker.currentNode.tagName)) {\r\n      if (\r\n        this.lastElementInFirstChunk === undefined &&\r\n        /^H[3-6]$/.test(treeWalker.currentNode.tagName)\r\n      ) {\r\n        hasSubsections = true;\r\n        this.lastElementInFirstChunk = elements[elements.length - 1];\r\n      }\r\n      elements.push(treeWalker.currentNode);\r\n    }\r\n\r\n    /**\r\n     * Last element in the first chunk of the section, i.e. all elements up to the first subheading\r\n     * if it is present, or all elements if it is not.\r\n     *\r\n     * @type {Element}\r\n     */\r\n    this.lastElementInFirstChunk = this.lastElementInFirstChunk || elements[elements.length - 1];\r\n\r\n    if (!elements.length) {\r\n      throw new CdError();\r\n    }\r\n\r\n    // We only need the first and the last comment parts to determine comments in the section.\r\n    let firstCommentPart;\r\n    let lastCommentPart;\r\n    if (elements[1]) {\r\n      treeWalker.currentNode = elements[elements.length - 1];\r\n      while (treeWalker.lastChild());\r\n      const lastNode = treeWalker.currentNode;\r\n\r\n      treeWalker.currentNode = elements[1];\r\n      do {\r\n        if (treeWalker.currentNode.classList.contains('cd-commentPart')) {\r\n          firstCommentPart = treeWalker.currentNode;\r\n        }\r\n      } while (!firstCommentPart && treeWalker.currentNode !== lastNode && treeWalker.nextNode());\r\n\r\n      treeWalker.currentNode = lastNode;\r\n      do {\r\n        if (treeWalker.currentNode.classList.contains('cd-commentPart')) {\r\n          lastCommentPart = treeWalker.currentNode;\r\n        }\r\n      } while (\r\n        !lastCommentPart &&\r\n        treeWalker.currentNode !== elements[1] &&\r\n        treeWalker.previousNode()\r\n      );\r\n    }\r\n\r\n    if (firstCommentPart) {\r\n      const firstCommentPartId = Number(firstCommentPart.getAttribute('data-comment-id'));\r\n      const lastCommentPartId = Number(lastCommentPart.getAttribute('data-comment-id'));\r\n\r\n      this.comments = cd.comments.slice(firstCommentPartId, lastCommentPartId + 1);\r\n      if (hasSubsections) {\r\n        const endIndex = this.comments.findIndex((comment) => !(\r\n          this.#parser.context.follows(this.lastElementInFirstChunk, comment.elements[0]) ||\r\n          this.lastElementInFirstChunk.contains(comment.elements[0])\r\n        ));\r\n        this.commentsInFirstChunk = this.comments.slice(0, endIndex || 0);\r\n      }\r\n    }\r\n\r\n    /**\r\n     * Section ID. Same as the section index in {@link module:cd~convenientDiscussions.sections\r\n     * convenientDiscussions.sections}.\r\n     *\r\n     * @type {number}\r\n     */\r\n    this.id = cd.sections.length;\r\n\r\n    /**\r\n     * Comments contained in the section.\r\n     *\r\n     * @type {Comment[]}\r\n     */\r\n    this.comments = this.comments || [];\r\n\r\n    /**\r\n     * Comments contained in the first chunk of the section, i.e. all elements up to the first\r\n     * subheading if it is present, or all elements if it is not.\r\n     *\r\n     * @type {Comment[]}\r\n     */\r\n    this.commentsInFirstChunk = this.commentsInFirstChunk || this.comments;\r\n\r\n    /**\r\n     * Section elements.\r\n     *\r\n     * @type {Element[]}\r\n     */\r\n    this.elements = elements;\r\n  }\r\n}\r\n","'use strict';\n\nmodule.exports = function html_entity_decode(string, quoteStyle) {\n  // eslint-disable-line camelcase\n  //  discuss at: http://locutus.io/php/html_entity_decode/\n  // original by: john (http://www.jd-tech.net)\n  //    input by: ger\n  //    input by: Ratheous\n  //    input by: Nick Kolosov (http://sammy.ru)\n  // improved by: Kevin van Zonneveld (http://kvz.io)\n  // improved by: marc andreu\n  //  revised by: Kevin van Zonneveld (http://kvz.io)\n  //  revised by: Kevin van Zonneveld (http://kvz.io)\n  // bugfixed by: Onno Marsman (https://twitter.com/onnomarsman)\n  // bugfixed by: Brett Zamir (http://brett-zamir.me)\n  // bugfixed by: Fox\n  //   example 1: html_entity_decode('Kevin &amp; van Zonneveld')\n  //   returns 1: 'Kevin & van Zonneveld'\n  //   example 2: html_entity_decode('&amp;lt;')\n  //   returns 2: '&lt;'\n\n  var getHtmlTranslationTable = require('../strings/get_html_translation_table');\n  var tmpStr = '';\n  var entity = '';\n  var symbol = '';\n  tmpStr = string.toString();\n\n  var hashMap = getHtmlTranslationTable('HTML_ENTITIES', quoteStyle);\n  if (hashMap === false) {\n    return false;\n  }\n\n  // @todo: &amp; problem\n  // http://locutus.io/php/get_html_translation_table:416#comment_97660\n  delete hashMap['&'];\n  hashMap['&'] = '&amp;';\n\n  for (symbol in hashMap) {\n    entity = hashMap[symbol];\n    tmpStr = tmpStr.split(entity).join(symbol);\n  }\n  tmpStr = tmpStr.split('&#039;').join(\"'\");\n\n  return tmpStr;\n};\n//# sourceMappingURL=html_entity_decode.js.map","/**\r\n * Web page (not wikitext) parsing module. Parsing here means \"extracting meaningful parts from the\r\n * page\". Functions that are more about modification of the DOM go in {@link module:modifyDom}.\r\n * Functions related to wikitext parsing go in {@link module:wikitext}.\r\n *\r\n * Here, we use vanilla JavaScript for recurring operations that together take up a lot of time.\r\n *\r\n * @module Parser\r\n */\r\n\r\nimport cd from './cd';\r\nimport { ElementsAndTextTreeWalker, ElementsTreeWalker } from './treeWalker';\r\nimport { defined, firstCharToUpperCase, flat, isInline, underlinesToSpaces } from './util';\r\nimport { generateCommentAnchor, parseTimestamp, registerCommentAnchor } from './timestamp';\r\n\r\n/**\r\n * Get the page name from a URL.\r\n *\r\n * @param {string} url\r\n * @returns {?string}\r\n * @private\r\n */\r\nfunction getPageNameFromUrl(url) {\r\n  // Are only WMF wikis guaranteed to have the format we need?\r\n  if (\r\n    typeof mw === 'undefined' ||\r\n    (mw.config.get('wgArticlePath') === '/wiki/$1' && mw.config.get('wgScript') === '/w/index.php')\r\n  ) {\r\n    url = url\r\n      .replace(/^(?:https?:)?\\/\\/[^/]+/, '')\r\n      .replace(/^\\/wiki\\//, '')\r\n      .replace(/^\\/w\\/index.php\\?title=/, '')\r\n      .replace(/&action=edit.*/, '')\r\n      .replace(/#.*/, '')\r\n      .replace(/_/g, ' ');\r\n    try {\r\n      url = decodeURIComponent(url);\r\n    } catch (e) {\r\n      return null;\r\n    }\r\n    return url;\r\n  } else {\r\n    const uri = new mw.Uri(url);\r\n    const match = uri.path.match(cd.g.ARTICLE_PATH_REGEXP);\r\n    if (match) {\r\n      try {\r\n        return decodeURIComponent(match[1]);\r\n      } catch (e) {\r\n        return null;\r\n      }\r\n    }\r\n    if (uri.query.title) {\r\n      return uri.query.title;\r\n    }\r\n    return null;\r\n  }\r\n}\r\n\r\n/**\r\n * Get the user name from a link.\r\n *\r\n * @param {Element} element\r\n * @returns {string}\r\n * @private\r\n */\r\nfunction getUserNameFromLink(element) {\r\n  const href = element.getAttribute('href');\r\n  if (!href) {\r\n    return null;\r\n  }\r\n  const pageName = getPageNameFromUrl(href);\r\n  if (!pageName) {\r\n    return null;\r\n  }\r\n  let userName;\r\n  const match = pageName.match(cd.g.USER_NAMESPACES_REGEXP);\r\n  if (match) {\r\n    userName = match[1];\r\n  } else if (pageName.startsWith(cd.g.CONTRIBS_PAGE + '/')) {\r\n    userName = pageName.replace(cd.g.CONTRIBS_PAGE_LINK_REGEXP, '');\r\n  }\r\n  return userName && firstCharToUpperCase(underlinesToSpaces(userName.replace(/\\/.*/, ''))).trim();\r\n}\r\n\r\n/**\r\n * Generalization of a page parser for the window and worker contexts.\r\n */\r\nexport default class Parser {\r\n  /**\r\n   * Create a page parser in the provided context.\r\n   *\r\n   * @param {object} context Collection of classes, functions, and other properties that perform the\r\n   *   tasks we need in the current context (window or worker).\r\n   */\r\n  constructor(context) {\r\n    this.context = context;\r\n  }\r\n\r\n  /**\r\n   * Create a comment instance.\r\n   *\r\n   * @param {Element} signature\r\n   * @returns {*}\r\n   */\r\n  createComment(signature) {\r\n    return new this.context.CommentClass(this, signature);\r\n  }\r\n\r\n  /**\r\n   * Create a section instance.\r\n   *\r\n   * @param {Element} headingElement\r\n   * @param {Promise} watchedSectionsRequest\r\n   * @returns {*}\r\n   */\r\n  createSection(headingElement, watchedSectionsRequest) {\r\n    return new this.context.SectionClass(this, headingElement, watchedSectionsRequest);\r\n  }\r\n\r\n  /**\r\n   * @typedef {object} Timestamp\r\n   * @property {Element} element\r\n   * @property {Date} date\r\n   */\r\n\r\n  /**\r\n   * @typedef {Timestamp[]} FindTimestampsReturn\r\n   */\r\n\r\n  /**\r\n   * Find timestamps under the root element.\r\n   *\r\n   * @returns {FindTimestampsReturn}\r\n   */\r\n  findTimestamps() {\r\n    const blocksToExclude = [\r\n      ...Array.from(cd.g.rootElement.getElementsByTagName('blockquote')),\r\n      ...flat(\r\n        cd.config.elementsToExcludeClasses\r\n          .map((className) => Array.from(cd.g.rootElement.getElementsByClassName(className)))\r\n      ),\r\n    ];\r\n\r\n    return this.context.getAllTextNodes()\r\n      .map((node) => {\r\n        const text = node.textContent;\r\n        const { date, match } = parseTimestamp(text) || {};\r\n        if (date && !blocksToExclude.some((block) => block.contains(node))) {\r\n          return { node, date, match };\r\n        }\r\n      })\r\n      .filter(defined)\r\n      .map((finding) => {\r\n        const { node, match, date } = finding;\r\n        const element = this.context.document.createElement('span');\r\n        element.classList.add('cd-timestamp');\r\n        const textNode = this.context.document.createTextNode(match[2]);\r\n        element.appendChild(textNode);\r\n        const remainedText = node.textContent.slice(match.index + match[0].length);\r\n        let afterNode;\r\n        if (remainedText) {\r\n          afterNode = this.context.document.createTextNode(remainedText);\r\n        }\r\n        node.textContent = node.textContent.slice(0, match.index + match[1].length);\r\n        node.parentNode.insertBefore(element, node.nextSibling);\r\n        if (afterNode) {\r\n          node.parentNode.insertBefore(afterNode, element.nextSibling);\r\n        }\r\n        return { element, date };\r\n      });\r\n  }\r\n\r\n  /**\r\n   * Find signatures under the root element given timestamps.\r\n   *\r\n   * Characters before the author link, like \"—\", aren't considered a part of the signature.\r\n   *\r\n   * @param {object[]} timestamps\r\n   * @returns {object[]}\r\n   */\r\n  findSignatures(timestamps) {\r\n    const signatures = timestamps\r\n      .map((timestamp) => {\r\n        const date = timestamp.date;\r\n        const timestampElement = timestamp.element;\r\n        const timestampText = timestamp.element.textContent;\r\n        let unsignedElement;\r\n\r\n        // If the closest not inline timestamp element ancestor has more than one signature, we\r\n        // choose the last signature to consider it the signature of the comment author. There is no\r\n        // point for us to parse them as distinct comments as a reply posted using our script will\r\n        // go below all of them anyway.\r\n        let closestNotInlineAncestor;\r\n        for (let el = timestamp.element; !closestNotInlineAncestor; el = el.parentNode) {\r\n          if (isInline(el)) {\r\n            // Simultaneously check if we are inside an unsigned template.\r\n            if (el.classList.contains(cd.config.unsignedClass)) {\r\n              unsignedElement = el;\r\n            }\r\n          } else {\r\n            closestNotInlineAncestor = el;\r\n          }\r\n        }\r\n        const unsigned = Boolean(unsignedElement);\r\n\r\n        if (closestNotInlineAncestor) {\r\n          const cniaChildren = Array.from(\r\n            closestNotInlineAncestor[this.context.childElementsProperty]\r\n          );\r\n\r\n          const treeWalker = new ElementsTreeWalker(timestamp.element);\r\n          // Found other timestamp after this timestamp\r\n          let found = false;\r\n          while (\r\n            !found &&\r\n            treeWalker.nextNode() &&\r\n            closestNotInlineAncestor.contains(treeWalker.currentNode) &&\r\n            (!cniaChildren.includes(treeWalker.currentNode) || isInline(treeWalker.currentNode))\r\n          ) {\r\n            if (treeWalker.currentNode.classList.contains('cd-timestamp')) {\r\n              found = true;\r\n            }\r\n          }\r\n          if (found) return;\r\n        }\r\n\r\n        const startElement = unsignedElement || timestamp.element;\r\n        const treeWalker = new ElementsAndTextTreeWalker(startElement);\r\n        let authorName;\r\n        let length = 0;\r\n        let firstSignatureElement;\r\n        const signatureNodes = [];\r\n        if (unsignedElement) {\r\n          firstSignatureElement = startElement;\r\n        } else {\r\n          signatureNodes.push(startElement);\r\n          treeWalker.previousSibling();\r\n        }\r\n\r\n        // Unsigned template may be of the \"undated\" kind - containing a timestamp but no author\r\n        // name, so we need to walk the tree anyway.\r\n        do {\r\n          const node = treeWalker.currentNode;\r\n          length += node.textContent.length;\r\n          if (node.nodeType === Node.ELEMENT_NODE) {\r\n            if (node.classList.contains('cd-timestamp')) break;\r\n            let hasAuthorLinks = false;\r\n            if (node.tagName === 'A') {\r\n              const userName = getUserNameFromLink(node);\r\n              if (userName) {\r\n                if (!authorName) {\r\n                  authorName = userName;\r\n                }\r\n                if (authorName === userName) {\r\n                  // That's not some other user link that is not a part of the signature.\r\n                  hasAuthorLinks = true;\r\n                }\r\n              }\r\n            } else {\r\n              const links = Array.from(node.getElementsByTagName('a'));\r\n              links.some((link) => {\r\n                const userName = getUserNameFromLink(link);\r\n                if (userName) {\r\n                  if (!authorName) {\r\n                    authorName = userName;\r\n                  }\r\n                  if (authorName === userName) {\r\n                    // That's not some other user link that is not a part of the signature.\r\n                    hasAuthorLinks = true;\r\n                    return true;\r\n                  }\r\n                }\r\n              });\r\n            }\r\n\r\n            if (hasAuthorLinks) {\r\n              firstSignatureElement = node;\r\n            }\r\n          }\r\n          signatureNodes.push(node);\r\n        } while (treeWalker.previousSibling() && length < cd.config.signatureScanLimit);\r\n\r\n        const firstSignatureElementIndex = signatureNodes.indexOf(firstSignatureElement);\r\n        signatureNodes.splice(\r\n          firstSignatureElementIndex === -1 ? 1 : firstSignatureElementIndex + 1\r\n        );\r\n\r\n        const anchor = generateCommentAnchor(timestamp.date, authorName, true);\r\n        registerCommentAnchor(anchor);\r\n        const signatureContainer = startElement.parentNode;\r\n        const startElementNextSibling = startElement.nextSibling;\r\n        const element = this.context.document.createElement('span');\r\n        element.classList.add('cd-signature');\r\n        signatureNodes\r\n          .reverse()\r\n          .forEach(element.appendChild.bind(element));\r\n        signatureContainer.insertBefore(element, startElementNextSibling);\r\n\r\n        // If there is no author, we add the class to prevent the element from being considered a\r\n        // part of other comment but don't append to the list of signatures.\r\n        if (!authorName) return;\r\n\r\n        return { element, timestampElement, timestampText, date, authorName, anchor, unsigned };\r\n      })\r\n      .filter(defined);\r\n\r\n    if (cd.config.unsignedClass) {\r\n      Array.from(cd.g.rootElement.getElementsByClassName(cd.config.unsignedClass))\r\n        .forEach((element) => {\r\n          // Only templates with no timestamp interest us.\r\n          if (!this.context.getElementByClassName(element, 'cd-timestamp')) {\r\n            const links = Array.from(element.getElementsByTagName('a'));\r\n            links.some((link) => {\r\n              const authorName = getUserNameFromLink(link);\r\n              if (authorName) {\r\n                element.classList.add('cd-signature');\r\n                const unsigned = true;\r\n                signatures.push({ element, authorName, unsigned });\r\n                return true;\r\n              }\r\n            });\r\n          }\r\n        });\r\n    }\r\n\r\n    // Sort signatures according to their position in the DOM. sig1 and sig2 are expected not to be\r\n    // the same elements.\r\n    signatures.sort((sig1, sig2) => this.context.follows(sig1.element, sig2.element) ? 1 : -1);\r\n\r\n    return signatures;\r\n  }\r\n\r\n  /**\r\n   * Collect the parts of the comment given a signature element.\r\n   *\r\n   * @param {Element} signatureElement\r\n   * @returns {object[]}\r\n   */\r\n  collectParts(signatureElement) {\r\n    const treeWalker = new ElementsAndTextTreeWalker(signatureElement);\r\n    let parts = [];\r\n    let firstForeignComponentAfter;\r\n\r\n    // The code:\r\n    // * Smth. [signature]\r\n    // ** Smth.\r\n    // *: Smth. [signature]\r\n    // or\r\n    // ** Smth. [signature]\r\n    // ** Smth.\r\n    // *: Smth. [signature]\r\n    // produces a DOM where the second line is not a part of the first comment, but there is only\r\n    // the first comment's signature in the DOM subtree related to the second line. We need to\r\n    // acknowledge there is a foreign not inline element here to be able to tell comment boundaries\r\n    // accurately (inline elements in most cases are continuations of the same comment).\r\n    while (!firstForeignComponentAfter) {\r\n      while (!treeWalker.currentNode.nextSibling && treeWalker.parentNode());\r\n      if (!treeWalker.nextSibling()) break;\r\n      if (!isInline(treeWalker.currentNode, true)) {\r\n        firstForeignComponentAfter = treeWalker.currentNode;\r\n      }\r\n    }\r\n\r\n    // As an optimization, avoid adding every text node of the comment to the array of its parts if\r\n    // possible. Add their common container instead.\r\n    if (\r\n      firstForeignComponentAfter &&\r\n      signatureElement.parentNode.contains(firstForeignComponentAfter)\r\n    ) {\r\n      // Collect inline parts after the signature\r\n      treeWalker.currentNode = signatureElement;\r\n      while (treeWalker.nextSibling()) {\r\n        if (isInline(treeWalker.currentNode, true)) {\r\n          parts.push({\r\n            node: treeWalker.currentNode,\r\n            isTextNode: treeWalker.currentNode.nodeType === Node.TEXT_NODE,\r\n            isHeading: false,\r\n            hasCurrentSignature: false,\r\n            hasForeignComponents: false,\r\n            lastStep: 'start',\r\n          });\r\n        } else {\r\n          break;\r\n        }\r\n      }\r\n      parts.reverse();\r\n\r\n      treeWalker.currentNode = signatureElement;\r\n    } else {\r\n      treeWalker.currentNode = signatureElement.parentNode;\r\n    }\r\n    parts.push({\r\n      node: treeWalker.currentNode,\r\n      isTextNode: false,\r\n      isHeading: false,\r\n      hasCurrentSignature: true,\r\n      hasForeignComponents: false,\r\n      lastStep: 'start',\r\n    });\r\n\r\n    const timezoneRegexp = new RegExp(cd.g.TIMEZONE_REGEXP.source + '\\\\s*$');\r\n\r\n    // 500 seems to be a safe enough value in case of any weird reasons for an infinite loop.\r\n    for (let i = 0; i < 500; i++) {\r\n      // lastStep may be:\r\n      // * \"start\" (parts added at the beginning)\r\n      // * \"back\" (go to the previous sibling)\r\n      // * \"up\" (go to the parent element)\r\n      // * \"dive\" (recursively go to the last not inline/text child)\r\n      // * \"replaced\" (obtained as a result of manipulations after node traversal)\r\n      let lastStep;\r\n      const previousPart = parts[parts.length - 1];\r\n\r\n      if (!previousPart.isTextNode && !previousPart.hasCurrentSignature) {\r\n        // A simple check before we go: a timestamp or signature ending at the end of the line means\r\n        // a foreign signature; nothing more to search for in that case.\r\n        const text = previousPart.node.textContent;\r\n        if (\r\n          // Filter out additions to the end of a comment like:\r\n          // https://ru.wikipedia.org/w/index.php?diff=107450915\r\n          // https://ru.wikipedia.org/w/index.php?diff=107487558\r\n          !isInline(previousPart.node, true) &&\r\n\r\n          (\r\n            timezoneRegexp.test(text) ||\r\n            cd.config.signatureEndingRegexp && cd.config.signatureEndingRegexp.test(text)\r\n          )\r\n        ) {\r\n          previousPart.hasForeignComponents = true;\r\n          break;\r\n        }\r\n      }\r\n\r\n      if (!previousPart.hasCurrentSignature && previousPart.hasForeignComponents) {\r\n        // Here we dive to the bottom of the element subtree to find parts of the _current_ comment\r\n        // that may be present. This happens with a code like this:\r\n        // :* Smth. [signature]\r\n        // :* Smth. <!-- The comment part that we need to grab while it's in the same element as the\r\n        //               signature above. -->\r\n        // :: Smth. [signature] <!-- The comment part we are at. -->\r\n\r\n        // Get the last not inline child of the current node.\r\n        let previousNode;\r\n        let dived = false;\r\n        while ((previousNode = treeWalker.currentNode) && treeWalker.lastChild()) {\r\n          if (isInline(treeWalker.currentNode, true)) {\r\n            treeWalker.currentNode = previousNode;\r\n            break;\r\n          }\r\n          dived = true;\r\n        }\r\n        if (dived) {\r\n          lastStep = 'dive';\r\n        } else {\r\n          break;\r\n        }\r\n      } else if (treeWalker.previousSibling()) {\r\n        lastStep = 'back';\r\n      } else {\r\n        if (!treeWalker.parentNode()) break;\r\n        lastStep = 'up';\r\n      }\r\n\r\n      const node = treeWalker.currentNode;\r\n      const isTextNode = node.nodeType === Node.TEXT_NODE;\r\n\r\n      /*\r\n        Cases like:\r\n          === Section title ===\r\n          Section introduction. Not a comment.\r\n          # Vote. [signature]\r\n        Without the following code, the section introduction would be a part of the comment. The\r\n        same may happen inside a discussion thread (often because one of the users didn't sign).\r\n       */\r\n      if (\r\n        lastStep === 'back' &&\r\n        ['OL', 'UL'].includes(previousPart.node.tagName) &&\r\n\r\n        // Exceptions like https://ru.wikipedia.org/w/index.php?diff=105007602\r\n        !(\r\n          ['DL', 'OL', 'UL'].includes(node.tagName) ||\r\n          (\r\n            isTextNode &&\r\n            node.previousSibling &&\r\n            ['DL', 'OL', 'UL'].includes(node.previousSibling.tagName)\r\n          )\r\n        ) &&\r\n\r\n        previousPart.node[this.context.childElementsProperty].length &&\r\n        previousPart.node[this.context.childElementsProperty][0].contains(signatureElement)\r\n      ) {\r\n        break;\r\n      }\r\n\r\n      let isHeading = null;\r\n      let hasCurrentSignature = null;\r\n      let hasForeignComponents = null;\r\n      if (!isTextNode) {\r\n        if (\r\n          node.classList.contains('cd-commentPart') ||\r\n          node.getAttribute('id') === 'toc' ||\r\n          node.tagName === 'TD' ||\r\n\r\n          // Horizontal lines sometimes separate different section blocks.\r\n          (\r\n            node.tagName === 'HR' &&\r\n            node.previousElementSibling &&\r\n            this.context.getElementByClassName(node.previousElementSibling, 'cd-signature')\r\n          ) ||\r\n\r\n          (\r\n            cd.config.checkForCustomForeignComponents &&\r\n            cd.config.checkForCustomForeignComponents(node, this.context)\r\n          )\r\n        ) {\r\n          break;\r\n        }\r\n\r\n        isHeading = /^H[1-6]$/.test(node.tagName);\r\n        hasCurrentSignature = node.contains(signatureElement);\r\n        // The second parameter of getElementsByClassName is an optimization for the worker context.\r\n        const signaturesCount = (\r\n          node.getElementsByClassName('cd-signature', Number(hasCurrentSignature) + 1).length\r\n        );\r\n        hasForeignComponents = (\r\n          signaturesCount - Number(hasCurrentSignature) > 0 ||\r\n          (firstForeignComponentAfter && node.contains(firstForeignComponentAfter))\r\n        );\r\n      }\r\n\r\n      // We save all data related to the nodes on the path to reuse it.\r\n      parts.push({\r\n        node,\r\n        isTextNode,\r\n        isHeading,\r\n        hasCurrentSignature,\r\n        hasForeignComponents,\r\n        lastStep,\r\n      });\r\n\r\n      if (isHeading) break;\r\n    }\r\n\r\n    return parts;\r\n  }\r\n\r\n  /**\r\n   * Remove the comment parts that are inside of other parts.\r\n   *\r\n   * @param {object[]} parts\r\n   * @returns {object[]}\r\n   */\r\n  removeNestedParts(parts) {\r\n    for (let i = parts.length - 1; i >= 0; i--) {\r\n      const part = parts[i];\r\n      if (part.lastStep === 'up' && !part.hasForeignComponents) {\r\n        let nextDiveElementIndex = 0;\r\n        for (let j = i - 1; j > 0; j--) {\r\n          if (parts[j].lastStep === 'dive') {\r\n            nextDiveElementIndex = j;\r\n            break;\r\n          }\r\n        }\r\n        parts.splice(nextDiveElementIndex, i - nextDiveElementIndex);\r\n        i = nextDiveElementIndex;\r\n      }\r\n    }\r\n\r\n    return parts;\r\n  }\r\n\r\n  /**\r\n   * Wrap the text and inline nodes into block elements.\r\n   *\r\n   * @param {object[]} parts\r\n   * @param {Element} signatureElement\r\n   * @returns {object[]}\r\n   */\r\n  encloseInlineParts(parts, signatureElement) {\r\n    const sequencesToBeEnclosed = [];\r\n    let start = null;\r\n    let encloseThis = false;\r\n    for (let i = 0; i <= parts.length; i++) {\r\n      const part = parts[i];\r\n      if (\r\n        part &&\r\n        (start === null || (['back', 'start'].includes(part.lastStep))) &&\r\n        !part.hasForeignComponents &&\r\n        !part.isHeading\r\n      ) {\r\n        if (start === null) {\r\n          // Don't enclose nodes whose parent is an inline element.\r\n          if (isInline(part.node.parentNode)) {\r\n            for (let j = i + 1; j < parts.length; j++) {\r\n              if (parts[j].lastStep === 'up') {\r\n                i = j - 1;\r\n                continue;\r\n              }\r\n            }\r\n            break;\r\n          } else {\r\n            start = i;\r\n          }\r\n        }\r\n\r\n        // We should only enclose if there is a need: there is at least one inline or non-empty text\r\n        // node in the sequence.\r\n        if (\r\n          !encloseThis &&\r\n          ((part.isTextNode && part.node.textContent.trim()) || isInline(part.node))\r\n        ) {\r\n          encloseThis = true;\r\n        }\r\n      } else {\r\n        if (start !== null) {\r\n          if (encloseThis) {\r\n            const end = i - 1;\r\n            sequencesToBeEnclosed.push({ start, end });\r\n          }\r\n          start = null;\r\n          encloseThis = false;\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = sequencesToBeEnclosed.length - 1; i >= 0; i--) {\r\n      const sequence = sequencesToBeEnclosed[i];\r\n      const wrapper = this.context.document.createElement('div');\r\n      const nextSibling = parts[sequence.start].node.nextSibling;\r\n      const parent = parts[sequence.start].node.parentNode;\r\n      for (let j = sequence.end; j >= sequence.start; j--) {\r\n        wrapper.appendChild(parts[j].node);\r\n      }\r\n      parent.insertBefore(wrapper, nextSibling);\r\n      const newNode = {\r\n        node: wrapper,\r\n        isTextNode: false,\r\n        isHeading: false,\r\n        hasCurrentSignature: wrapper.contains(signatureElement),\r\n        hasForeignComponents: false,\r\n        lastStep: 'replaced',\r\n      };\r\n      parts.splice(sequence.start, sequence.end - sequence.start + 1, newNode);\r\n    }\r\n\r\n    return parts;\r\n  }\r\n\r\n  /**\r\n   * Remove unnecessary and incorrect parts from the collection.\r\n   *\r\n   * @param {object[]} parts\r\n   * @returns {object[]}\r\n   */\r\n  filterParts(parts) {\r\n    parts = parts.filter((part) => !part.hasForeignComponents && !part.isTextNode);\r\n    for (let i = parts.length - 1; i > 0; i--) {\r\n      const part = parts[i];\r\n      if (part.node.tagName === 'P' && !part.node.textContent.trim()) {\r\n        parts.splice(i, 1);\r\n      } else {\r\n        break;\r\n      }\r\n    }\r\n\r\n    return parts;\r\n  }\r\n\r\n  /**\r\n   * Replace the list elements with collections of their items if appropriate.\r\n   *\r\n   * @param {object[]} parts\r\n   * @param {Element} signatureElement\r\n   * @returns {object[]}\r\n   */\r\n  replaceListsWithItems(parts, signatureElement) {\r\n    const lastPart = parts[parts.length - 1];\r\n    for (let i = parts.length - 1; i >= 0; i--) {\r\n      const part = parts[i];\r\n      if (\r\n        // 'LI', 'DD' are in this list too for this kind of structures:\r\n        // https://ru.wikipedia.org/w/index.php?diff=103584477.\r\n        ['UL', 'DL', 'OL', 'LI', 'DD'].includes(part.node.tagName) &&\r\n        // The check for 'DD' rescues us here:\r\n        // https://ru.wikipedia.org/wiki/Википедия:Форум/Общий#201911201924_Vcohen.\r\n        // The check for 'DL' rescues us here:\r\n        // https://ru.wikipedia.org/wiki/Википедия:Форум/Общий#202003090945_Serhio_Magpie. The check\r\n        // for 'P' rescues us here:\r\n        // https://ru.wikipedia.org/wiki/Википедия:Форум/Правила#201910270736_S.m.46.\r\n        // The check for \"!parts[i + 1]...\" rescues us here:\r\n        // https://ru.wikipedia.org/wiki/Википедия:Технические_запросы#201912081049_Sunpriat.\r\n        (\r\n          (part.lastStep === 'up' && (!parts[i - 1] || parts[i - 1].lastStep !== 'back')) ||\r\n          (\r\n            (\r\n              lastPart.node.tagName === 'DD' ||\r\n              lastPart.node.parentNode.tagName === 'DD' ||\r\n              lastPart.node.tagName === 'DL'\r\n            ) &&\r\n            !parts.slice(i + 1).some((part) => part.node.tagName === 'P')\r\n          )\r\n        )\r\n      ) {\r\n        // We ignore all spaces as an easy way to ignore only whitespace text nodes between element\r\n        // nodes (this is a bad idea if we deal with inline nodes, but here we deal with lists).\r\n        const partTextNoSpaces = part.node.textContent.replace(/\\s+/g, '');\r\n\r\n        let current = [part.node];\r\n        let children;\r\n\r\n        // With code like this:\r\n        // * Smth. [signature]\r\n        // :: Smth. [signature]\r\n        // ...one comment (preceded by :: in this case) creates its own list tree, not a subtree,\r\n        // even though it's a reply to a reply. So we dive to the bottom of the hierarchy of nested\r\n        // lists to get the bottom node (and therefore draw the comment layers more neatly). One of\r\n        // the most complex tree structures is this:\r\n        // * Smth. [signature]\r\n        // :* Smth.\r\n        // :: Smth. [signature]\r\n        // (seen here:\r\n        // https://ru.wikipedia.org/w/index.php?title=Википедия:Форум/Общий&oldid=103760740#201912010211_Mikhail_Ryazanov)\r\n        // It has a branchy structure that requires a tricky algorithm to be parsed correctly.\r\n        do {\r\n          children = current.reduce(\r\n            (arr, element) => arr.concat(Array.from(element[this.context.childElementsProperty])),\r\n            []\r\n          );\r\n        } while (\r\n          children.length &&\r\n          children.every((child) => ['UL', 'DL', 'OL', 'LI', 'DD'].includes(child.tagName)) &&\r\n          (\r\n            children.map((child) => child.textContent).join('').replace(/\\s+/g, '') ===\r\n            partTextNoSpaces\r\n          ) &&\r\n          (current = children)\r\n        );\r\n\r\n        if (current.length > 1) {\r\n          const newParts = current.map((el) => ({\r\n            node: el,\r\n            isTextNode: false,\r\n            hasCurrentSignature: el.contains(signatureElement),\r\n            hasForeignComponents: false,\r\n            lastStep: 'replaced',\r\n          }));\r\n          parts.splice(i, 1, ...newParts);\r\n        } else if (current[0] !== part.node) {\r\n          Object.assign(part, {\r\n            node: current[0],\r\n            lastStep: 'replaced',\r\n          });\r\n        }\r\n      }\r\n    }\r\n\r\n    return parts;\r\n  }\r\n\r\n  /**\r\n   * Get the \".cd-commentLevel\" elements up the DOM tree.\r\n   *\r\n   * @param {Element} initialElement\r\n   * @returns {Element[]}\r\n   */\r\n  getLevelsUpTree(initialElement) {\r\n    const levelElements = [];\r\n    const treeWalker = new ElementsTreeWalker(initialElement);\r\n    while (treeWalker.parentNode()) {\r\n      const el = treeWalker.currentNode;\r\n      if (['UL', 'DL', 'OL'].includes(el.tagName)) {\r\n        if (el.classList.contains('cd-commentLevel')) {\r\n          const classAttr = el.getAttribute('class');\r\n          const match = classAttr.match(/cd-commentLevel-(\\d+)/);\r\n          if (match) {\r\n            levelElements.unshift(...Array(Number(match[1])));\r\n          }\r\n          return levelElements;\r\n        } else {\r\n          levelElements.unshift(el);\r\n        }\r\n      }\r\n    }\r\n    return levelElements;\r\n  }\r\n\r\n  /**\r\n   * Get all headings on the page.\r\n   *\r\n   * @returns {Element[]}\r\n   */\r\n  // The worker context doesn't support .querySelector(), so we have to use .getElementsByTagName().\r\n  findHeadings() {\r\n    const headings = [\r\n      ...cd.g.rootElement.getElementsByTagName('h2'),\r\n      ...cd.g.rootElement.getElementsByTagName('h3'),\r\n      ...cd.g.rootElement.getElementsByTagName('h4'),\r\n      ...cd.g.rootElement.getElementsByTagName('h5'),\r\n      ...cd.g.rootElement.getElementsByTagName('h6'),\r\n    ];\r\n    headings.sort((heading1, heading2) => this.context.follows(heading1, heading2) ? 1 : -1);\r\n    return headings;\r\n  }\r\n}\r\n\r\n/**\r\n * Get all text nodes under the root element in the window (not worker) context.\r\n *\r\n * @returns {Node[]}\r\n */\r\nexport function windowGetAllTextNodes() {\r\n  const result = document.evaluate(\r\n    // './/text()' doesn't work in Edge.\r\n    './/descendant::text()',\r\n    cd.g.rootElement,\r\n    null,\r\n    XPathResult.ANY_TYPE,\r\n    null\r\n  );\r\n  const textNodes = [];\r\n  let node;\r\n  while ((node = result.iterateNext())) {\r\n    textNodes.push(node);\r\n  }\r\n  return textNodes;\r\n}\r\n\r\n/**\r\n * Find some types of special elements on the page (floating elements, closed discussions, outdent\r\n * templates).\r\n *\r\n * @returns {object}\r\n */\r\nexport function findSpecialElements() {\r\n  // Describe all floating elements on the page in order to calculate the right border (temporarily\r\n  // setting \"overflow: hidden\") for all comments that they intersect with.\r\n  const floatingElementsSelector = [\r\n    ...cd.g.FLOATING_ELEMENTS_SELECTORS,\r\n    ...cd.config.customFloatingElementsSelectors,\r\n  ]\r\n    .join(', ');\r\n  const floating = cd.g.$root\r\n    .find(floatingElementsSelector)\r\n    .get()\r\n    // Remove all known elements that never intersect comments from the collection.\r\n    .filter((el) => !el.classList.contains('cd-ignoreFloating'));\r\n  floating.forEach((el) => {\r\n    const style = window.getComputedStyle(el);\r\n    el.setAttribute('data-margin-top', parseFloat(style.marginTop));\r\n    el.setAttribute('data-margin-bottom', parseFloat(style.marginBottom));\r\n  });\r\n\r\n  const closedDiscussionsSelector = cd.config.closedDiscussionsClasses\r\n    .map((name) => `.${name}`)\r\n    .join(', ');\r\n  const closedDiscussions = cd.g.$root.find(closedDiscussionsSelector).get();\r\n\r\n  const pageHasOutdents = Boolean(cd.g.$root.find('.outdent-template').length);\r\n\r\n  return { floating, closedDiscussions, pageHasOutdents };\r\n}\r\n","/**\r\n * Wikitext parsing and processing functions.\r\n *\r\n * @module wikitext\r\n */\r\n\r\nimport html_entity_decode from 'locutus/php/strings/html_entity_decode';\r\n\r\nimport cd from './cd';\r\nimport userRegistry from './userRegistry';\r\nimport {\r\n  generateCommentAnchor,\r\n  parseTimestamp,\r\n  registerCommentAnchor,\r\n  resetCommentAnchors,\r\n} from './timestamp';\r\nimport { hideText } from './util';\r\n\r\n/**\r\n * Conceal HTML comments (`<!-- -->`) in the code.\r\n *\r\n * This is used to ignore comment contents (there could be section code examples for novices there\r\n * that could confuse search results) but get right positions and code in the result.\r\n *\r\n * @param {string} code\r\n * @returns {string}\r\n */\r\nexport function hideHtmlComments(code) {\r\n  return code\r\n    .replace(/<!--([^]*?)-->/g, (s, content) => '<!--' + ' '.repeat(content.length) + '-->');\r\n}\r\n\r\n/**\r\n * Find the first timestamp related to a comment in the code.\r\n *\r\n * @param {string} code\r\n * @returns {?string}\r\n */\r\nexport function findFirstTimestamp(code) {\r\n  const signatures = extractSignatures(code);\r\n  return signatures.length ? signatures[0].timestamp : null;\r\n}\r\n\r\n/**\r\n * Remove certain kinds of wiki markup from code, such as formatting, links, tags, and comments.\r\n * Also replace multiple spaces with one and trim the input. The product of this function is not for\r\n * display (for example, it just removes template names making the resulting code look silly), but\r\n * for comparing purposes.\r\n *\r\n * @param {string} code\r\n * @returns {string}\r\n */\r\nexport function removeWikiMarkup(code) {\r\n  return code\r\n    // Remove comments\r\n    .replace(/<!--[^]*?-->/g, '')\r\n    // Pipe trick\r\n    .replace(/(\\[\\[:?(?:[^|[\\]<>\\n:]+:)?([^|[\\]<>\\n]+)\\|)(\\]\\])/g, '$1$2$3')\r\n    // Extract displayed text from file embeddings\r\n    .replace(cd.g.FILE_LINK_REGEXP, '$1')\r\n    // Extract displayed text from [[wikilinks]]\r\n    .replace(/\\[\\[:?(?:[^|[\\]<>\\n]+\\|)?(.+?)\\]\\]/g, '$1')\r\n    // For optimization purposes, remove template names\r\n    .replace(/\\{\\{:?(?:[^|{}<>\\n]+)(?:\\|(.+?))?\\}\\}/g, '$1')\r\n    // Extract displayed text from [links]\r\n    .replace(/\\[https?:\\/\\/[^[\\]<>\"\\n ]+ *([^\\]]*)\\]/g, '$1')\r\n    // Remove bold\r\n    .replace(/'''(.+?)'''/g, '$1')\r\n    // Remove italics\r\n    .replace(/''(.+?)''/g, '$1')\r\n    // Replace <br> with a space\r\n    .replace(/<br ?\\/?>/g, ' ')\r\n    // Remove opening tags (won't work with <smth param=\">\">, but wikiparser fails too)\r\n    .replace(/<\\w+(?: [\\w ]+?=[^<>]+?| ?\\/?)>/g, '')\r\n    // Remove closing tags\r\n    .replace(/<\\/\\w+ ?>/g, '')\r\n    // Replace multiple spaces with one space\r\n    .replace(/ {2,}/g, ' ')\r\n    .trim();\r\n}\r\n\r\n/**\r\n * Replace HTML entities with corresponding characters. Also replace different kinds of spaces,\r\n * including multiple, with one normal space.\r\n *\r\n * @param {string} text\r\n * @returns {string}\r\n */\r\nexport function normalizeCode(text) {\r\n  return decodeHtmlEntities(text).replace(/\\s+/g, ' ').trim();\r\n}\r\n\r\n/**\r\n * Encode link text to put it in a `[[wikilink]]`.\r\n *\r\n * @param {string} link\r\n * @returns {string}\r\n */\r\nexport function encodeWikilink(link) {\r\n  return link\r\n    .replace(/</g, '&lt;')\r\n    .replace(/>/g, '&gt;')\r\n    .replace(/\\[/g, '&#91;')\r\n    .replace(/\\]/g, '&#93;')\r\n    .replace(/\\{/g, '&#123;')\r\n    .replace(/\\|/g, '&#124;')\r\n    .replace(/\\}/g, '&#125;')\r\n    .replace(/\\s+/g, ' ');\r\n}\r\n\r\n/**\r\n * Extract signatures that don't come from the unsigned templates from wikitext.\r\n *\r\n * @param {string} code\r\n * @returns {object[]}\r\n * @private\r\n */\r\nfunction extractRegularSignatures(code) {\r\n  const timestampRegexp = new RegExp(\r\n    `^((.*)(${cd.g.TIMESTAMP_REGEXP.source})(?:\\\\}\\\\}|</small>)?).*(?:\\n*|$)`,\r\n    'igm'\r\n  );\r\n\r\n  // \".*\" helps to get the last author link. But after that we make another capture to make sure we\r\n  // take the first link to the comment author. 251 is not arbitrary: it's 255 (maximum allowed\r\n  // signature length) minus '[[u:a'.length plus ' '.length (the space before the timestamp).\r\n  const signatureScanLimitWikitext = 251;\r\n  const signatureRegexp = new RegExp(\r\n    /*\r\n      Captures:\r\n      1 - the whole line with the signature\r\n      2 - text before the last user link\r\n      3 - unprocessed signature\r\n      4 - author name (inside cd.g.CAPTURE_USER_NAME_PATTERN)\r\n      5 - sometimes, a slash appears here (inside cd.g.CAPTURE_USER_NAME_PATTERN)\r\n      6 - timestamp + small template ending characters / ending small tag\r\n      7 - timestamp\r\n      8 - new line characters or empty string\r\n    */\r\n    `^((.*)(${cd.g.CAPTURE_USER_NAME_PATTERN}.{1,${signatureScanLimitWikitext}}((${cd.g.TIMESTAMP_REGEXP.source})(?:\\\\}\\\\}|</small>)?)).*)(\\n*|$)`,\r\n    'igm'\r\n  );\r\n  const authorLinkRegexp = new RegExp(cd.g.CAPTURE_USER_NAME_PATTERN, 'ig');\r\n\r\n  let signatures = [];\r\n  let timestampMatch;\r\n  while ((timestampMatch = timestampRegexp.exec(code))) {\r\n    const line = timestampMatch[0];\r\n    signatureRegexp.lastIndex = 0;\r\n    const authorTimestampMatch = signatureRegexp.exec(line);\r\n\r\n    let author;\r\n    let timestamp;\r\n    let startIndex;\r\n    let endIndex;\r\n    let nextCommentStartIndex;\r\n    let dirtyCode;\r\n    if (authorTimestampMatch) {\r\n      author = userRegistry.getUser(decodeHtmlEntities(authorTimestampMatch[4]));\r\n      timestamp = authorTimestampMatch[7];\r\n      startIndex = timestampMatch.index + authorTimestampMatch[2].length;\r\n      endIndex = timestampMatch.index + authorTimestampMatch[1].length;\r\n      nextCommentStartIndex = timestampMatch.index + authorTimestampMatch[0].length;\r\n      dirtyCode = authorTimestampMatch[3];\r\n\r\n      // Find the first link to this author in the preceding text.\r\n      let authorLinkMatch;\r\n      authorLinkRegexp.lastIndex = 0;\r\n      const commentEndingStartIndex = Math.max(\r\n        0,\r\n        authorTimestampMatch[0].length - authorTimestampMatch[6].length -\r\n        authorTimestampMatch[authorTimestampMatch.length - 1].length - signatureScanLimitWikitext\r\n      );\r\n      const commentEnding = authorTimestampMatch[0].slice(commentEndingStartIndex);\r\n      while ((authorLinkMatch = authorLinkRegexp.exec(commentEnding))) {\r\n        // Slash can be present in authorLinkMatch[2]. It often indicates a link to a page in the\r\n        // author's userspace that is not part of the signature (while some such links are, and we\r\n        // don't want to eliminate those cases).\r\n        if (authorLinkMatch[2]) continue;\r\n        const testAuthor = userRegistry.getUser(decodeHtmlEntities(authorLinkMatch[1]));\r\n        if (testAuthor === author) {\r\n          startIndex = timestampMatch.index + commentEndingStartIndex + authorLinkMatch.index;\r\n          dirtyCode = code.slice(startIndex, endIndex);\r\n          break;\r\n        }\r\n      }\r\n    } else {\r\n      timestamp = timestampMatch[3];\r\n      startIndex = timestampMatch.index + timestampMatch[2].length;\r\n      endIndex = timestampMatch.index + timestampMatch[1].length;\r\n      nextCommentStartIndex = timestampMatch.index + timestampMatch[0].length;\r\n      dirtyCode = timestamp;\r\n    }\r\n\r\n    signatures.push({ author, timestamp, startIndex, endIndex, dirtyCode, nextCommentStartIndex });\r\n  }\r\n\r\n  return signatures;\r\n}\r\n\r\n/**\r\n * Extract signatures that come from the unsigned templates from wikitext.\r\n *\r\n * @param {string} code Page code.\r\n * @param {object[]} signatures Existing signatures.\r\n * @returns {object[]}\r\n * @private\r\n */\r\nfunction extractUnsigneds(code, signatures) {\r\n  const unsigneds = [];\r\n\r\n  if (cd.g.UNSIGNED_TEMPLATES_REGEXP) {\r\n    let match;\r\n    while ((match = cd.g.UNSIGNED_TEMPLATES_REGEXP.exec(code))) {\r\n      let author;\r\n      let timestamp;\r\n      if (cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE.test(match[2])) {\r\n        timestamp = match[2];\r\n        author = match[3];\r\n      } else if (cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE.test(match[3])) {\r\n        timestamp = match[3];\r\n        author = match[2];\r\n      } else {\r\n        author = match[2];\r\n      }\r\n      author = userRegistry.getUser(decodeHtmlEntities(author));\r\n\r\n      let startIndex = match.index;\r\n      const endIndex = match.index + match[1].length;\r\n      let dirtyCode = match[1];\r\n      const nextCommentStartIndex = match.index + match[0].length;\r\n\r\n      // \"[5 tildes] {{unsigned|}}\" cases. In these cases, both the signature and {{unsigned|}} are\r\n      // considered signatures and added to the array. We could combine them but that would need\r\n      // corresponding code in Parser.js which could be tricky, so for now we just remove the\r\n      // duplicate. That still allows to reply to the comment.\r\n      const relevantSignatureIndex = (\r\n        signatures.findIndex((sig) => sig.nextCommentStartIndex === nextCommentStartIndex)\r\n      );\r\n      if (relevantSignatureIndex !== -1) {\r\n        signatures.splice(relevantSignatureIndex, 1);\r\n      }\r\n\r\n      unsigneds.push({\r\n        author,\r\n        timestamp,\r\n        startIndex,\r\n        endIndex,\r\n        dirtyCode,\r\n        nextCommentStartIndex,\r\n      });\r\n    }\r\n  }\r\n\r\n  return unsigneds;\r\n}\r\n\r\n/**\r\n * Extract signatures from wikitext.\r\n *\r\n * Only basic signature parsing is performed here; more precise signature text identification is\r\n * performed in {@link module:Comment#adjustCommentCodeData}. See also {@link\r\n * module:Comment#adjustCommentBeginning}, called before that.\r\n *\r\n * @param {string} code Code to extract signatures from.\r\n * @param {boolean} generateCommentAnchors Whether to generate and register comment anchors.\r\n * @returns {object[]}\r\n */\r\nexport function extractSignatures(code, generateCommentAnchors) {\r\n  // Hide HTML comments, quotes and lines containing antipatterns.\r\n  const adjustedCode = hideHtmlComments(code)\r\n    .replace(cd.g.QUOTE_REGEXP, (s, beginning, content, ending) => (\r\n      beginning +\r\n      ' '.repeat(content.length) +\r\n      ending\r\n    ))\r\n    .replace(cd.g.COMMENT_ANTIPATTERNS_REGEXP, (s) => ' '.repeat(s.length));\r\n\r\n  let signatures = extractRegularSignatures(adjustedCode);\r\n  const unsigneds = extractUnsigneds(adjustedCode, signatures);\r\n  signatures.push(...unsigneds);\r\n\r\n  if (unsigneds.length) {\r\n    signatures.sort((sig1, sig2) => sig1.startIndex > sig2.startIndex ? 1 : -1);\r\n  }\r\n\r\n  signatures = signatures.filter((sig) => sig.author);\r\n  signatures.forEach((sig, i) => {\r\n    sig.commentStartIndex = i === 0 ? 0 : signatures[i - 1].nextCommentStartIndex;\r\n  });\r\n  if (generateCommentAnchors) {\r\n    resetCommentAnchors();\r\n  }\r\n  signatures.forEach((sig, i) => {\r\n    const { date } = sig.timestamp && parseTimestamp(sig.timestamp) || {};\r\n    sig.id = i;\r\n    sig.date = date;\r\n    delete sig.nextCommentStartIndex;\r\n\r\n    if (generateCommentAnchors) {\r\n      const anchor = date && generateCommentAnchor(date, sig.author.name, true);\r\n      sig.anchor = anchor;\r\n      registerCommentAnchor(anchor);\r\n    }\r\n  });\r\n\r\n  return signatures;\r\n}\r\n\r\n/**\r\n * Decode HTML entities in a string.\r\n *\r\n * It should work as fast as possible, so we use String#indexOf, not String#includes.\r\n *\r\n * @param {string} s\r\n * @returns {string}\r\n */\r\nexport function decodeHtmlEntities(s) {\r\n  if (s.indexOf('&') === -1) {\r\n    return s;\r\n  } else {\r\n    let result = s;\r\n    if (result.indexOf('&#38;amp;') !== -1) {\r\n      result = result.replace(/&#38;amp;/g, '&amp;amp;')\r\n    }\r\n    if (result.indexOf('&#') !== -1) {\r\n      result = result.replace(/&#(\\d+);/g, (s, code) => String.fromCharCode(code));\r\n    }\r\n    if (result.indexOf('&') !== -1) {\r\n      result = html_entity_decode(result);\r\n    }\r\n    return result;\r\n  }\r\n}\r\n\r\n/**\r\n * @typedef {object} HideSensitiveCodeReturn\r\n * @property {string} code\r\n * @property {string[]} hidden\r\n */\r\n\r\n/**\r\n * Replace code that should not be modified when processing it with placeholders.\r\n *\r\n * @param {string} code\r\n * @returns {HideSensitiveCodeReturn}\r\n */\r\nexport function hideSensitiveCode(code) {\r\n  const hidden = [];\r\n\r\n  const hide = (regexp, isTable) => {\r\n    code = hideText(code, regexp, hidden, isTable);\r\n  };\r\n\r\n  // Taken from\r\n  // https://ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&oldid=102530721\r\n  const hideTemplates = () => {\r\n    // Simple regexp for hiding templates that have no nested ones.\r\n    hide(/\\{\\{(?:[^{]\\{?)+?\\}\\}/g);\r\n\r\n    let pos = 0;\r\n    const stack = [];\r\n    let template;\r\n    let left;\r\n    let right;\r\n    while (true) {\r\n      left = code.indexOf('{{', pos);\r\n      right = code.indexOf('}}', pos);\r\n      if (left === -1 && right === -1 && !stack.length) {\r\n        break;\r\n      }\r\n      if (left !== -1 && (left < right || right === -1)) {\r\n        stack.push(left);\r\n        pos = left + 2;\r\n      } else {\r\n        left = stack.pop();\r\n        if (typeof left === 'undefined') {\r\n          if (right === -1) {\r\n            pos += 2;\r\n            continue;\r\n          } else {\r\n            left = 0;\r\n          }\r\n        }\r\n        if (right === -1) {\r\n          right = code.length;\r\n        }\r\n        right += 2;\r\n        template = code.substring(left, right);\r\n        code = (\r\n          code.substring(0, left) +\r\n          '\\x01' +\r\n          hidden.push(template) +\r\n          '\\x02' +\r\n          code.substr(right)\r\n        );\r\n        pos = right - template.length;\r\n      }\r\n    }\r\n  };\r\n\r\n  const hideTags = (...args) => {\r\n    args.forEach((arg) => {\r\n      hide(new RegExp(`<${arg}(?: [^>]+)?>[\\\\s\\\\S]+?<\\\\/${arg}>`, 'gi'));\r\n    });\r\n  };\r\n\r\n  hideTemplates();\r\n\r\n  // Hide tables\r\n  hide(/^(:* *)(\\{\\|[^]*?\\n\\|\\})/gm, true);\r\n\r\n  hideTags('nowiki', 'pre', 'source', 'syntaxhighlight');\r\n\r\n  return { code, hidden };\r\n}\r\n\r\n/**\r\n * Modify or leave unchanged the string to have two newlines in the end of it.\r\n *\r\n * @param {string} code\r\n * @returns {string}\r\n */\r\nexport function endWithTwoNewlines(code) {\r\n  return code.replace(/([^\\n])\\n?$/, '$1\\n\\n');\r\n}\r\n","import { DomUtils, parseDOM } from 'htmlparser2';\r\n\r\nimport cd from './cd';\r\nimport { decodeHtmlEntities } from './wikitext';\r\n\r\nself.Node = {\r\n  TEXT_NODE: 3,\r\n  ELEMENT_NODE: 1,\r\n};\r\n\r\n/**\r\n * Iterate over child nodes, testing the node using the provided callback.\r\n *\r\n * Returns `true` to stop walking through subtree (after founding the required amounts for elements,\r\n * for instance).\r\n *\r\n * @param {Node} base\r\n * @param {Function} callback\r\n * @param {boolean} checkSelf\r\n * @returns {boolean}\r\n * @private\r\n */\r\nfunction walkThroughSubtree(base, callback, checkSelf) {\r\n  if (checkSelf && callback(base)) {\r\n    return true;\r\n  }\r\n  for (let n = base.firstChild; n; n = n.nextSibling) {\r\n    if (walkThroughSubtree(n, callback, true)) {\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * Get all text nodes under the root element.\r\n *\r\n * @returns {Array}\r\n * @private\r\n */\r\nfunction getAllTextNodes() {\r\n  let nodes = [];\r\n  walkThroughSubtree(cd.g.rootElement, (node) => {\r\n    if (node.nodeType === Node.TEXT_NODE) {\r\n      nodes.push(node);\r\n    }\r\n  });\r\n  return nodes;\r\n}\r\n\r\nconst dummyDom = parseDOM('<a>a</a>');\r\nconst Element = dummyDom[0].constructor;\r\nconst DataNode = dummyDom[0].childNodes[0].constructor;\r\nconst NodeConstructor = Object.getPrototypeOf(DataNode);\r\n\r\n// We extend the prototype after parsing the html (parsing goes a bit faster with the default\r\n// setup).\r\nObject.defineProperty(Element.prototype, 'childElements', {\r\n  get: function () {\r\n    return this.childNodes.filter((node) => node.nodeType === Node.ELEMENT_NODE);\r\n  },\r\n});\r\n\r\nObject.defineProperty(Element.prototype, 'previousElementSibling', {\r\n  get: function () {\r\n    for (let n = this.previousSibling; n; n = n.previousSibling) {\r\n      if (n.nodeType === Node.ELEMENT_NODE) {\r\n        return n;\r\n      }\r\n    }\r\n    return null;\r\n  },\r\n});\r\n\r\nObject.defineProperty(Element.prototype, 'nextElementSibling', {\r\n  get: function () {\r\n    for (let n = this.nextSibling; n; n = n.nextSibling) {\r\n      if (n.nodeType === Node.ELEMENT_NODE) {\r\n        return n;\r\n      }\r\n    }\r\n    return null;\r\n  },\r\n});\r\n\r\nObject.defineProperty(Element.prototype, 'firstElementChild', {\r\n  get: function () {\r\n    let n;\r\n    for (n = this.firstChild; n && n.nodeType !== Node.ELEMENT_NODE; n = n.nextSibling);\r\n    return n || null;\r\n  },\r\n});\r\n\r\nObject.defineProperty(Element.prototype, 'lastElementChild', {\r\n  get: function () {\r\n    let n;\r\n    for (n = this.lastChild; n && n.nodeType !== Node.ELEMENT_NODE; n = n.previousSibling);\r\n    return n || null;\r\n  },\r\n});\r\n\r\nObject.defineProperty(Element.prototype, 'textContent', {\r\n  get: function () {\r\n    cd.debug.startTimer('textContent');\r\n    // const returnValue = DomUtils.getText(this);\r\n    // const returnValue = this.childNodes.map((node) => node.textContent).join('');\r\n    let returnValue = '';\r\n    // This runs pretty often, so we microoptimize it.\r\n    this.childNodes.forEach((node) => {\r\n      returnValue += node.textContent;\r\n    });\r\n    cd.debug.stopTimer('textContent');\r\n    return returnValue;\r\n  },\r\n});\r\n\r\nObject.defineProperty(Element.prototype, 'outerHTML', {\r\n  get: function () {\r\n    return DomUtils.getOuterHTML(this);\r\n  },\r\n});\r\n\r\nElement.prototype.getAttribute = function (name) {\r\n  let value = this.attribs[name];\r\n  if (value && typeof value === 'string' && value.indexOf('&') !== -1) {\r\n    value = value\r\n      .replace(/&amp;/g, '&')\r\n      .replace(/&quot;/g, '\"');\r\n  }\r\n  return value;\r\n};\r\n\r\nElement.prototype.setAttribute = function (name, value) {\r\n  if (value && typeof value === 'string') {\r\n    if (value.indexOf('&') !== -1) {\r\n      value = value.replace(/&/g, '&amp;');\r\n    }\r\n    if (value.indexOf('\"') !== -1) {\r\n      value = value.replace(/\"/g, '&quot;');\r\n    }\r\n  }\r\n  this.attribs[name] = value || '';\r\n};\r\n\r\nElement.prototype.appendChild = function (node) {\r\n  cd.debug.startTimer('appendChild');\r\n  if (node.parentNode) {\r\n    node.remove();\r\n  }\r\n  DomUtils.appendChild(this, node);\r\n  cd.debug.stopTimer('appendChild');\r\n};\r\n\r\nElement.prototype.insertBefore = function (node, referenceNode) {\r\n  cd.debug.startTimer('insertBefore');\r\n  if (referenceNode) {\r\n    if (node.parentNode) {\r\n      node.remove();\r\n    }\r\n    DomUtils.prepend(referenceNode, node);\r\n  } else {\r\n    this.appendChild(node);\r\n  }\r\n  cd.debug.stopTimer('insertBefore');\r\n};\r\n\r\nElement.prototype.removeChild = function (node) {\r\n  if (node.parentNode === this) {\r\n    DomUtils.removeElement(node);\r\n  }\r\n};\r\n\r\nElement.prototype.contains = function (node) {\r\n  cd.debug.startTimer('contains');\r\n  if (node === this) {\r\n    return true;\r\n  }\r\n  if (!this.childNodes.length) return false;\r\n  for (let n = node; n; n = n.parentNode) {\r\n    if (n === this) {\r\n      return true;\r\n    }\r\n  }\r\n  cd.debug.stopTimer('contains');\r\n  return false;\r\n};\r\n\r\nElement.prototype.follows = function (node) {\r\n  cd.debug.startTimer('follows');\r\n  if (this.startIndex && node.startIndex) {\r\n    return this.startIndex > node.startIndex;\r\n  }\r\n  if (this === node) {\r\n    return false;\r\n  }\r\n\r\n  const thisTree = [];\r\n  const nodeTree = [];\r\n  let sharedParent;\r\n  let thisSharedParentChild;\r\n  let nodeSharedParentChild;\r\n\r\n  for (let current = this; current; current = current.parentNode) {\r\n    if (current === node) {\r\n      return true;\r\n    }\r\n    thisTree.unshift(current);\r\n  }\r\n  for (let current = node; current; current = current.parentNode) {\r\n    nodeTree.unshift(current);\r\n    if (thisTree.includes(current)) {\r\n      sharedParent = current;\r\n      thisSharedParentChild = thisTree[thisTree.indexOf(current) + 1];\r\n      // nodeTree must have at least 2 elements, this is guaranteed by the check\r\n      // \"current === node\" above.\r\n      nodeSharedParentChild = nodeTree[1];\r\n      break;\r\n    }\r\n  }\r\n  const returnValue = (\r\n    !sharedParent ||\r\n    (\r\n      sharedParent.childNodes.indexOf(thisSharedParentChild) >\r\n      sharedParent.childNodes.indexOf(nodeSharedParentChild)\r\n    )\r\n  );\r\n  // const returnValue = null;\r\n  cd.debug.stopTimer('follows');\r\n  return returnValue;\r\n};\r\n\r\nObject.defineProperty(Element.prototype, 'tagName', {\r\n  get: function () {\r\n    return this.name.toUpperCase();\r\n  },\r\n});\r\n\r\n// We have to create a getter as there is no way to access an object from a method of that object's\r\n// property (Element#classList.add() and such in this case).\r\nObject.defineProperty(Element.prototype, 'classList', {\r\n  get: function () {\r\n    if (this._classList) {\r\n      return this._classList;\r\n    } else {\r\n      this._classList = {\r\n        list: [],\r\n\r\n        movedFromClassAttr: false,\r\n\r\n        moveFromClassAttr(classAttr) {\r\n          this.list = (classAttr || '').split(' ');\r\n          this.movedFromClassAttr = true;\r\n        },\r\n\r\n        add: (...names) => {\r\n          names.forEach((name) => {\r\n            cd.debug.startTimer('addClass');\r\n            let classAttr = this.getAttribute('class') || '';\r\n            if (classAttr) {\r\n              classAttr += ' ';\r\n            }\r\n            classAttr += name;\r\n            this.setAttribute('class', classAttr);\r\n            if (this._classList.movedFromClassAttr) {\r\n              this._classList.list.push(name);\r\n            } else {\r\n              this._classList.moveFromClassAttr(classAttr);\r\n            }\r\n            cd.debug.stopTimer('addClass');\r\n          });\r\n        },\r\n\r\n        contains: (name) => {\r\n          cd.debug.startTimer('containsClass');\r\n          const classAttr = this.getAttribute('class');\r\n          if (!classAttr) {\r\n            cd.debug.stopTimer('containsClass');\r\n            return false;\r\n          }\r\n          if (!this._classList.movedFromClassAttr) {\r\n            this._classList.moveFromClassAttr(classAttr);\r\n          }\r\n          // This can run tens of thousand times, so we microoptimize it (don't use template strings\r\n          // and String#includes).\r\n          const returnValue = (\r\n            Boolean(this._classList.list.length) &&\r\n            this._classList.list.indexOf(name) !== -1\r\n          );\r\n          cd.debug.stopTimer('containsClass');\r\n          return returnValue;\r\n        },\r\n      };\r\n      return this._classList;\r\n    }\r\n  },\r\n});\r\n\r\nElement.prototype.getElementsByClassName = function (name, limit, our) {\r\n  cd.debug.startTimer('getElementsByClassName');\r\n  let nodes = [];\r\n  walkThroughSubtree(this, (node) => {\r\n    if (node.nodeType !== Node.ELEMENT_NODE) return;\r\n    if (node.nodeType === Node.ELEMENT_NODE && node.classList.contains(name, our)) {\r\n      nodes.push(node);\r\n      if (limit && nodes.length === limit) {\r\n        return true;\r\n      }\r\n    }\r\n  });\r\n  cd.debug.stopTimer('getElementsByClassName');\r\n  return nodes;\r\n};\r\n\r\nElement.prototype.getElementsByTagName = function (name) {\r\n  cd.debug.startTimer('getElementsByTagName');\r\n  const returnValue = DomUtils.getElementsByTagName(name, this);\r\n  cd.debug.stopTimer('getElementsByTagName');\r\n  return returnValue;\r\n};\r\n\r\nObject.defineProperty(DataNode.prototype, 'textContent', {\r\n  get: function () {\r\n    return decodeHtmlEntities(this.data);\r\n  },\r\n  set: function (value) {\r\n    this.data = value;\r\n  },\r\n});\r\n\r\nNodeConstructor.prototype.remove = function () {\r\n  // removeElement doesn't clean up \"prev\" and \"next\".\r\n  DomUtils.removeElement(this);\r\n  this.prev = null;\r\n  this.next = null;\r\n};\r\n\r\n// We need the \"Document\" class to imitate window.document for the code to be more easily ported to\r\n// other library if needed. Here, we also extend the prototype of the Element and DataNode classes\r\n// that htmlparser2 library uses. Note that the Element class already has the \"children\" property\r\n// containing all child nodes, which differs from what this property stands for in the browser DOM\r\n// representation (only element children), but we can't replace it as it would intervene in the\r\n// internal workings of the class. So we use the \"childElements\" property instead for this purpose.\r\nclass Document extends Element {\r\n  constructor(dom) {\r\n    super('body', {});\r\n    for (const el of dom) {\r\n      this.appendChild(el);\r\n    }\r\n  }\r\n\r\n  createElement(name) {\r\n    return new Element(name, {});\r\n  }\r\n\r\n  createTextNode(content) {\r\n    return new DataNode('text', content);\r\n  }\r\n}\r\n\r\nDocument.prototype.getElementsByClassName = Element.prototype.getElementsByClassName;\r\n\r\nself.Document = Document;\r\n\r\nexport { getAllTextNodes, parseDOM };\r\n","/**\r\n * Web worker entry point.\r\n *\r\n * Note that currently there may be difficulties in testing the web worker in the \"local\" mode with\r\n * custom config functions such as {@link module:defaultConfig.checkForCustomForeignComponents} due to\r\n * the (unfortunate) use of `eval()` here and the fact that webpack renames some objects in some\r\n * contexts resulting in a lost tie between them.\r\n *\r\n * @module worker\r\n */\r\n\r\nimport CdError from './CdError';\r\nimport CommentSkeleton from './CommentSkeleton';\r\nimport Parser from './Parser';\r\nimport SectionSkeleton from './SectionSkeleton';\r\nimport cd from './cd';\r\nimport debug from './debug';\r\nimport g from './staticGlobals';\r\nimport { ElementsTreeWalker } from './treeWalker';\r\nimport { getAllTextNodes, parseDOM } from './htmlparser2Extended';\r\nimport { resetCommentAnchors } from './timestamp';\r\n\r\nself.cd = cd;\r\ncd.g = g;\r\ncd.debug = debug;\r\ncd.debug.init();\r\n\r\nconst context = {\r\n  CommentClass: CommentSkeleton,\r\n  SectionClass: SectionSkeleton,\r\n  childElementsProperty: 'childElements',\r\n  follows: (el1, el2) => el1.follows(el2),\r\n  getAllTextNodes,\r\n  getElementByClassName: (node, className) => {\r\n    const elements = node.getElementsByClassName(className, 1);\r\n    return elements[0] || null;\r\n  },\r\n};\r\n\r\nlet alarmTimeout;\r\n\r\n/**\r\n * Send a \"wake up\" message to the window after the specified interval.\r\n *\r\n * @param {number} interval\r\n * @private\r\n */\r\nfunction setAlarm(interval) {\r\n  clearTimeout(alarmTimeout);\r\n  alarmTimeout = setTimeout(() => {\r\n    postMessage({ type: 'wakeUp' });\r\n  }, interval);\r\n}\r\n\r\n/**\r\n * Parse the page and send a message to the window.\r\n *\r\n * @private\r\n */\r\nfunction parse() {\r\n  cd.comments = [];\r\n  cd.sections = [];\r\n  resetCommentAnchors();\r\n\r\n  cd.debug.startTimer('processing comments');\r\n\r\n  const parser = new Parser(context);\r\n\r\n  cd.debug.startTimer('find timestamps');\r\n  const timestamps = parser.findTimestamps();\r\n  cd.debug.stopTimer('find timestamps');\r\n\r\n  cd.debug.startTimer('find signatures');\r\n  const signatures = parser.findSignatures(timestamps);\r\n  cd.debug.stopTimer('find signatures');\r\n\r\n  signatures.forEach((signature) => {\r\n    try {\r\n      const comment = parser.createComment(signature);\r\n      if (comment.id !== undefined) {\r\n        cd.comments.push(comment);\r\n      }\r\n    } catch (e) {\r\n      if (!(e instanceof CdError)) {\r\n        console.error(e);\r\n      }\r\n    }\r\n  });\r\n\r\n  cd.debug.stopTimer('processing comments');\r\n  cd.debug.startTimer('processing sections');\r\n\r\n  parser.findHeadings().forEach((heading) => {\r\n    try {\r\n      const section = parser.createSection(heading);\r\n      if (section.id !== undefined) {\r\n        cd.sections.push(section);\r\n      }\r\n    } catch (e) {\r\n      if (!(e instanceof CdError)) {\r\n        console.error(e);\r\n      }\r\n    }\r\n  });\r\n\r\n  cd.comments.forEach((comment, i) => {\r\n    // Determine which comments reply to which.\r\n    if (i !== cd.comments.length - 1) {\r\n      if (cd.g.specialElements.pageHasOutdents) {\r\n        const treeWalker = new ElementsTreeWalker(comment.elements[comment.elements.length - 1]);\r\n        let found;\r\n        while (\r\n          !found &&\r\n          treeWalker.nextNode() &&\r\n          !treeWalker.currentNode.classList.contains('cd-commentPart')\r\n        ) {\r\n          found = treeWalker.currentNode.classList.contains('outdent-template');\r\n        }\r\n        if (found) {\r\n          cd.comments[comment.id + 1].targetComment = comment;\r\n        }\r\n      }\r\n\r\n      if (cd.comments[comment.id + 1].targetComment !== comment) {\r\n        cd.comments\r\n          .slice(comment.id + 1)\r\n          .some((otherComment) => {\r\n            if (otherComment.section === comment.section && otherComment.level > comment.level) {\r\n              if (\r\n                otherComment.level === comment.level + 1 ||\r\n                // Comments mistakenly indented more than one level\r\n                otherComment.id === comment.id + 1\r\n              ) {\r\n                otherComment.targetComment = comment;\r\n              }\r\n            } else {\r\n              return true;\r\n            }\r\n          });\r\n      }\r\n    }\r\n\r\n    if (comment.section) {\r\n      comment.sectionHeadline = comment.section.headline;\r\n      comment.sectionAnchor = comment.section.anchor;\r\n      delete comment.section;\r\n    }\r\n    if (comment.targetComment) {\r\n      comment.targetCommentAuthorName = comment.targetComment.authorName;\r\n      comment.toMe = comment.targetComment.own;\r\n      delete comment.targetComment;\r\n    }\r\n    delete comment.elements;\r\n    delete comment.parts;\r\n    delete comment.highlightables;\r\n    delete comment.addAttributes;\r\n    delete comment.setLevels;\r\n    delete comment.getSection;\r\n  });\r\n\r\n  cd.debug.stopTimer('processing sections');\r\n  cd.debug.startTimer('post message from the worker');\r\n\r\n  postMessage({\r\n    type: 'parse',\r\n    comments: cd.comments,\r\n  });\r\n\r\n  cd.debug.stopTimer('post message from the worker');\r\n  cd.debug.stopTimer('worker operations');\r\n  cd.debug.logAndResetEverything();\r\n}\r\n\r\n/**\r\n * Callback for messages from the window.\r\n *\r\n * @param {Event} e\r\n * @private\r\n */\r\nfunction onMessageFromWindow(e) {\r\n  const message = e.data;\r\n\r\n  if (message.type === 'setAlarm') {\r\n    setAlarm(message.interval);\r\n  }\r\n\r\n  if (message.type === 'removeAlarm') {\r\n    clearTimeout(alarmTimeout);\r\n  }\r\n\r\n  if (message.type === 'parse') {\r\n    cd.debug.startTimer('worker operations');\r\n\r\n    Object.assign(cd.g, message.g);\r\n    cd.config = message.config;\r\n\r\n    // FIXME: Any idea how to avoid using eval() here?\r\n    let checker = cd.config.checkForCustomForeignComponents;\r\n    if (checker && !/^ *function +/.test(checker) && !/^.+=>/.test(checker)) {\r\n      checker = 'function ' + checker;\r\n    }\r\n    cd.config.checkForCustomForeignComponents = eval(checker);\r\n\r\n    cd.g.TIMESTAMP_PARSER = eval(cd.g.TIMESTAMP_PARSER);\r\n\r\n    cd.debug.startTimer('parse html');\r\n\r\n    const dom = parseDOM(message.text, {\r\n      withStartIndices: true,\r\n      withEndIndices: true,\r\n    });\r\n\r\n    cd.debug.stopTimer('parse html');\r\n\r\n    cd.g.rootElement = new Document(dom);\r\n    context.document = cd.g.rootElement;\r\n    cd.g.specialElements = {\r\n      pageHasOutdents: Boolean(\r\n        cd.g.rootElement.getElementsByClassName('outdent-template', 1).length\r\n      ),\r\n    };\r\n\r\n    parse();\r\n  }\r\n}\r\n\r\nonmessage = onMessageFromWindow;\r\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n  ? R.apply\n  : function ReflectApply(target, receiver, args) {\n    return Function.prototype.apply.call(target, receiver, args);\n  }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n  ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target)\n      .concat(Object.getOwnPropertySymbols(target));\n  };\n} else {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target);\n  };\n}\n\nfunction ProcessEmitWarning(warning) {\n  if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n  return value !== value;\n}\n\nfunction EventEmitter() {\n  EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n  enumerable: true,\n  get: function() {\n    return defaultMaxListeners;\n  },\n  set: function(arg) {\n    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n      throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n    }\n    defaultMaxListeners = arg;\n  }\n});\n\nEventEmitter.init = function() {\n\n  if (this._events === undefined ||\n      this._events === Object.getPrototypeOf(this)._events) {\n    this._events = Object.create(null);\n    this._eventsCount = 0;\n  }\n\n  this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n    throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n  }\n  this._maxListeners = n;\n  return this;\n};\n\nfunction _getMaxListeners(that) {\n  if (that._maxListeners === undefined)\n    return EventEmitter.defaultMaxListeners;\n  return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n  return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n  var args = [];\n  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n  var doError = (type === 'error');\n\n  var events = this._events;\n  if (events !== undefined)\n    doError = (doError && events.error === undefined);\n  else if (!doError)\n    return false;\n\n  // If there is no 'error' event listener then throw.\n  if (doError) {\n    var er;\n    if (args.length > 0)\n      er = args[0];\n    if (er instanceof Error) {\n      // Note: The comments on the `throw` lines are intentional, they show\n      // up in Node's output if this results in an unhandled exception.\n      throw er; // Unhandled 'error' event\n    }\n    // At least give some kind of context to the user\n    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n    err.context = er;\n    throw err; // Unhandled 'error' event\n  }\n\n  var handler = events[type];\n\n  if (handler === undefined)\n    return false;\n\n  if (typeof handler === 'function') {\n    ReflectApply(handler, this, args);\n  } else {\n    var len = handler.length;\n    var listeners = arrayClone(handler, len);\n    for (var i = 0; i < len; ++i)\n      ReflectApply(listeners[i], this, args);\n  }\n\n  return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n  var m;\n  var events;\n  var existing;\n\n  checkListener(listener);\n\n  events = target._events;\n  if (events === undefined) {\n    events = target._events = Object.create(null);\n    target._eventsCount = 0;\n  } else {\n    // To avoid recursion in the case that type === \"newListener\"! Before\n    // adding it to the listeners, first emit \"newListener\".\n    if (events.newListener !== undefined) {\n      target.emit('newListener', type,\n                  listener.listener ? listener.listener : listener);\n\n      // Re-assign `events` because a newListener handler could have caused the\n      // this._events to be assigned to a new object\n      events = target._events;\n    }\n    existing = events[type];\n  }\n\n  if (existing === undefined) {\n    // Optimize the case of one listener. Don't need the extra array object.\n    existing = events[type] = listener;\n    ++target._eventsCount;\n  } else {\n    if (typeof existing === 'function') {\n      // Adding the second element, need to change to array.\n      existing = events[type] =\n        prepend ? [listener, existing] : [existing, listener];\n      // If we've already got an array, just append.\n    } else if (prepend) {\n      existing.unshift(listener);\n    } else {\n      existing.push(listener);\n    }\n\n    // Check for listener leak\n    m = _getMaxListeners(target);\n    if (m > 0 && existing.length > m && !existing.warned) {\n      existing.warned = true;\n      // No error code for this since it is a Warning\n      // eslint-disable-next-line no-restricted-syntax\n      var w = new Error('Possible EventEmitter memory leak detected. ' +\n                          existing.length + ' ' + String(type) + ' listeners ' +\n                          'added. Use emitter.setMaxListeners() to ' +\n                          'increase limit');\n      w.name = 'MaxListenersExceededWarning';\n      w.emitter = target;\n      w.type = type;\n      w.count = existing.length;\n      ProcessEmitWarning(w);\n    }\n  }\n\n  return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n  return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n    function prependListener(type, listener) {\n      return _addListener(this, type, listener, true);\n    };\n\nfunction onceWrapper() {\n  if (!this.fired) {\n    this.target.removeListener(this.type, this.wrapFn);\n    this.fired = true;\n    if (arguments.length === 0)\n      return this.listener.call(this.target);\n    return this.listener.apply(this.target, arguments);\n  }\n}\n\nfunction _onceWrap(target, type, listener) {\n  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n  var wrapped = onceWrapper.bind(state);\n  wrapped.listener = listener;\n  state.wrapFn = wrapped;\n  return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n  checkListener(listener);\n  this.on(type, _onceWrap(this, type, listener));\n  return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n    function prependOnceListener(type, listener) {\n      checkListener(listener);\n      this.prependListener(type, _onceWrap(this, type, listener));\n      return this;\n    };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n    function removeListener(type, listener) {\n      var list, events, position, i, originalListener;\n\n      checkListener(listener);\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      list = events[type];\n      if (list === undefined)\n        return this;\n\n      if (list === listener || list.listener === listener) {\n        if (--this._eventsCount === 0)\n          this._events = Object.create(null);\n        else {\n          delete events[type];\n          if (events.removeListener)\n            this.emit('removeListener', type, list.listener || listener);\n        }\n      } else if (typeof list !== 'function') {\n        position = -1;\n\n        for (i = list.length - 1; i >= 0; i--) {\n          if (list[i] === listener || list[i].listener === listener) {\n            originalListener = list[i].listener;\n            position = i;\n            break;\n          }\n        }\n\n        if (position < 0)\n          return this;\n\n        if (position === 0)\n          list.shift();\n        else {\n          spliceOne(list, position);\n        }\n\n        if (list.length === 1)\n          events[type] = list[0];\n\n        if (events.removeListener !== undefined)\n          this.emit('removeListener', type, originalListener || listener);\n      }\n\n      return this;\n    };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n    function removeAllListeners(type) {\n      var listeners, events, i;\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      // not listening for removeListener, no need to emit\n      if (events.removeListener === undefined) {\n        if (arguments.length === 0) {\n          this._events = Object.create(null);\n          this._eventsCount = 0;\n        } else if (events[type] !== undefined) {\n          if (--this._eventsCount === 0)\n            this._events = Object.create(null);\n          else\n            delete events[type];\n        }\n        return this;\n      }\n\n      // emit removeListener for all listeners on all events\n      if (arguments.length === 0) {\n        var keys = Object.keys(events);\n        var key;\n        for (i = 0; i < keys.length; ++i) {\n          key = keys[i];\n          if (key === 'removeListener') continue;\n          this.removeAllListeners(key);\n        }\n        this.removeAllListeners('removeListener');\n        this._events = Object.create(null);\n        this._eventsCount = 0;\n        return this;\n      }\n\n      listeners = events[type];\n\n      if (typeof listeners === 'function') {\n        this.removeListener(type, listeners);\n      } else if (listeners !== undefined) {\n        // LIFO order\n        for (i = listeners.length - 1; i >= 0; i--) {\n          this.removeListener(type, listeners[i]);\n        }\n      }\n\n      return this;\n    };\n\nfunction _listeners(target, type, unwrap) {\n  var events = target._events;\n\n  if (events === undefined)\n    return [];\n\n  var evlistener = events[type];\n  if (evlistener === undefined)\n    return [];\n\n  if (typeof evlistener === 'function')\n    return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n  return unwrap ?\n    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n  return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n  return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  if (typeof emitter.listenerCount === 'function') {\n    return emitter.listenerCount(type);\n  } else {\n    return listenerCount.call(emitter, type);\n  }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n  var events = this._events;\n\n  if (events !== undefined) {\n    var evlistener = events[type];\n\n    if (typeof evlistener === 'function') {\n      return 1;\n    } else if (evlistener !== undefined) {\n      return evlistener.length;\n    }\n  }\n\n  return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n  var copy = new Array(n);\n  for (var i = 0; i < n; ++i)\n    copy[i] = arr[i];\n  return copy;\n}\n\nfunction spliceOne(list, index) {\n  for (; index + 1 < list.length; index++)\n    list[index] = list[index + 1];\n  list.pop();\n}\n\nfunction unwrapListeners(arr) {\n  var ret = new Array(arr.length);\n  for (var i = 0; i < ret.length; ++i) {\n    ret[i] = arr[i].listener || arr[i];\n  }\n  return ret;\n}\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar nodeTypes = new Map([\n    [\"tag\" /* Tag */, 1],\n    [\"script\" /* Script */, 1],\n    [\"style\" /* Style */, 1],\n    [\"directive\" /* Directive */, 1],\n    [\"text\" /* Text */, 3],\n    [\"cdata\" /* CDATA */, 4],\n    [\"comment\" /* Comment */, 8]\n]);\n// This object will be used as the prototype for Nodes when creating a\n// DOM-Level-1-compliant structure.\nvar Node = /** @class */ (function () {\n    /**\n     *\n     * @param type The type of the node.\n     */\n    function Node(type) {\n        this.type = type;\n        /** Parent of the node */\n        this.parent = null;\n        /** Previous sibling */\n        this.prev = null;\n        /** Next sibling */\n        this.next = null;\n        /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */\n        this.startIndex = null;\n        /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */\n        this.endIndex = null;\n    }\n    Object.defineProperty(Node.prototype, \"nodeType\", {\n        // Read-only aliases\n        get: function () {\n            return nodeTypes.get(this.type) || 1;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Node.prototype, \"parentNode\", {\n        // Read-write aliases for properties\n        get: function () {\n            return this.parent || null;\n        },\n        set: function (parent) {\n            this.parent = parent;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Node.prototype, \"previousSibling\", {\n        get: function () {\n            return this.prev || null;\n        },\n        set: function (prev) {\n            this.prev = prev;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Node.prototype, \"nextSibling\", {\n        get: function () {\n            return this.next || null;\n        },\n        set: function (next) {\n            this.next = next;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    return Node;\n}());\nexports.Node = Node;\nvar DataNode = /** @class */ (function (_super) {\n    __extends(DataNode, _super);\n    /**\n     *\n     * @param type The type of the node\n     * @param data The content of the data node\n     */\n    function DataNode(type, data) {\n        var _this = _super.call(this, type) || this;\n        _this.data = data;\n        return _this;\n    }\n    Object.defineProperty(DataNode.prototype, \"nodeValue\", {\n        get: function () {\n            return this.data;\n        },\n        set: function (data) {\n            this.data = data;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    return DataNode;\n}(Node));\nexports.DataNode = DataNode;\nvar ProcessingInstruction = /** @class */ (function (_super) {\n    __extends(ProcessingInstruction, _super);\n    function ProcessingInstruction(name, data) {\n        var _this = _super.call(this, \"directive\" /* Directive */, data) || this;\n        _this.name = name;\n        return _this;\n    }\n    return ProcessingInstruction;\n}(DataNode));\nexports.ProcessingInstruction = ProcessingInstruction;\nvar NodeWithChildren = /** @class */ (function (_super) {\n    __extends(NodeWithChildren, _super);\n    /**\n     *\n     * @param type Type of the node.\n     * @param children Children of the node. Only certain node types can have children.\n     */\n    function NodeWithChildren(type, children) {\n        var _this = _super.call(this, type) || this;\n        _this.children = children;\n        return _this;\n    }\n    Object.defineProperty(NodeWithChildren.prototype, \"firstChild\", {\n        // Aliases\n        get: function () {\n            return this.children[0] || null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(NodeWithChildren.prototype, \"lastChild\", {\n        get: function () {\n            return this.children[this.children.length - 1] || null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(NodeWithChildren.prototype, \"childNodes\", {\n        get: function () {\n            return this.children;\n        },\n        set: function (children) {\n            this.children = children;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    return NodeWithChildren;\n}(Node));\nexports.NodeWithChildren = NodeWithChildren;\nvar Element = /** @class */ (function (_super) {\n    __extends(Element, _super);\n    /**\n     *\n     * @param name Name of the tag, eg. `div`, `span`\n     * @param attribs Object mapping attribute names to attribute values\n     */\n    function Element(name, attribs) {\n        var _this = _super.call(this, name === \"script\"\n            ? \"script\" /* Script */\n            : name === \"style\"\n                ? \"style\" /* Style */\n                : \"tag\" /* Tag */, []) || this;\n        _this.name = name;\n        _this.attribs = attribs;\n        _this.attribs = attribs;\n        return _this;\n    }\n    Object.defineProperty(Element.prototype, \"tagName\", {\n        // DOM Level 1 aliases\n        get: function () {\n            return this.name;\n        },\n        set: function (name) {\n            this.name = name;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    return Element;\n}(NodeWithChildren));\nexports.Element = Element;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tagtypes_1 = require(\"./tagtypes\");\nvar dom_serializer_1 = __importDefault(require(\"dom-serializer\"));\nexports.getOuterHTML = dom_serializer_1.default;\nfunction getInnerHTML(node, options) {\n    return tagtypes_1.hasChildren(node)\n        ? node.children.map(function (node) { return exports.getOuterHTML(node, options); }).join(\"\")\n        : \"\";\n}\nexports.getInnerHTML = getInnerHTML;\nfunction getText(node) {\n    if (Array.isArray(node))\n        return node.map(getText).join(\"\");\n    if (tagtypes_1.isTag(node))\n        return node.name === \"br\" ? \"\\n\" : getText(node.children);\n    if (tagtypes_1.isCDATA(node))\n        return getText(node.children);\n    if (tagtypes_1.isText(node))\n        return node.data;\n    return \"\";\n}\nexports.getText = getText;\n","/*\n  Module dependencies\n*/\nvar ElementType = require('domelementtype');\nvar entities = require('entities');\n\n/* mixed-case SVG and MathML tags & attributes\n   recognized by the HTML parser, see\n   https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n*/\nvar foreignNames = require('./foreignNames.json');\nforeignNames.elementNames.__proto__ = null; /* use as a simple dictionary */\nforeignNames.attributeNames.__proto__ = null;\n\nvar unencodedElements = {\n  __proto__: null,\n  style: true,\n  script: true,\n  xmp: true,\n  iframe: true,\n  noembed: true,\n  noframes: true,\n  plaintext: true,\n  noscript: true\n};\n\n/*\n  Format attributes\n*/\nfunction formatAttrs(attributes, opts) {\n  if (!attributes) return;\n\n  var output = '';\n  var value;\n\n  // Loop through the attributes\n  for (var key in attributes) {\n    value = attributes[key];\n    if (output) {\n      output += ' ';\n    }\n\n    if (opts.xmlMode === 'foreign') {\n      /* fix up mixed-case attribute names */\n      key = foreignNames.attributeNames[key] || key;\n    }\n    output += key;\n    if ((value !== null && value !== '') || opts.xmlMode) {\n      output +=\n        '=\"' +\n        (opts.decodeEntities\n          ? entities.encodeXML(value)\n          : value.replace(/\\\"/g, '&quot;')) +\n        '\"';\n    }\n  }\n\n  return output;\n}\n\n/*\n  Self-enclosing tags (stolen from node-htmlparser)\n*/\nvar singleTag = {\n  __proto__: null,\n  area: true,\n  base: true,\n  basefont: true,\n  br: true,\n  col: true,\n  command: true,\n  embed: true,\n  frame: true,\n  hr: true,\n  img: true,\n  input: true,\n  isindex: true,\n  keygen: true,\n  link: true,\n  meta: true,\n  param: true,\n  source: true,\n  track: true,\n  wbr: true\n};\n\nvar render = (module.exports = function(dom, opts) {\n  if (!Array.isArray(dom) && !dom.cheerio) dom = [dom];\n  opts = opts || {};\n\n  var output = '';\n\n  for (var i = 0; i < dom.length; i++) {\n    var elem = dom[i];\n\n    if (elem.type === 'root') output += render(elem.children, opts);\n    else if (ElementType.isTag(elem)) output += renderTag(elem, opts);\n    else if (elem.type === ElementType.Directive)\n      output += renderDirective(elem);\n    else if (elem.type === ElementType.Comment) output += renderComment(elem);\n    else if (elem.type === ElementType.CDATA) output += renderCdata(elem);\n    else output += renderText(elem, opts);\n  }\n\n  return output;\n});\n\nvar foreignModeIntegrationPoints = [\n  'mi',\n  'mo',\n  'mn',\n  'ms',\n  'mtext',\n  'annotation-xml',\n  'foreignObject',\n  'desc',\n  'title'\n];\n\nfunction renderTag(elem, opts) {\n  // Handle SVG / MathML in HTML\n  if (opts.xmlMode === 'foreign') {\n    /* fix up mixed-case element names */\n    elem.name = foreignNames.elementNames[elem.name] || elem.name;\n    /* exit foreign mode at integration points */\n    if (\n      elem.parent &&\n      foreignModeIntegrationPoints.indexOf(elem.parent.name) >= 0\n    )\n      opts = Object.assign({}, opts, { xmlMode: false });\n  }\n  if (!opts.xmlMode && ['svg', 'math'].indexOf(elem.name) >= 0) {\n    opts = Object.assign({}, opts, { xmlMode: 'foreign' });\n  }\n\n  var tag = '<' + elem.name;\n  var attribs = formatAttrs(elem.attribs, opts);\n\n  if (attribs) {\n    tag += ' ' + attribs;\n  }\n\n  if (opts.xmlMode && (!elem.children || elem.children.length === 0)) {\n    tag += '/>';\n  } else {\n    tag += '>';\n    if (elem.children) {\n      tag += render(elem.children, opts);\n    }\n\n    if (!singleTag[elem.name] || opts.xmlMode) {\n      tag += '</' + elem.name + '>';\n    }\n  }\n\n  return tag;\n}\n\nfunction renderDirective(elem) {\n  return '<' + elem.data + '>';\n}\n\nfunction renderText(elem, opts) {\n  var data = elem.data || '';\n\n  // if entities weren't decoded, no need to encode them back\n  if (\n    opts.decodeEntities &&\n    !(elem.parent && elem.parent.name in unencodedElements)\n  ) {\n    data = entities.encodeXML(data);\n  }\n\n  return data;\n}\n\nfunction renderCdata(elem) {\n  return '<![CDATA[' + elem.children[0].data + ']]>';\n}\n\nfunction renderComment(elem) {\n  return '<!--' + elem.data + '-->';\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar decode_1 = require(\"./decode\");\nvar encode_1 = require(\"./encode\");\nfunction decode(data, level) {\n    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTML)(data);\n}\nexports.decode = decode;\nfunction decodeStrict(data, level) {\n    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTMLStrict)(data);\n}\nexports.decodeStrict = decodeStrict;\nfunction encode(data, level) {\n    return (!level || level <= 0 ? encode_1.encodeXML : encode_1.encodeHTML)(data);\n}\nexports.encode = encode;\nvar encode_2 = require(\"./encode\");\nexports.encodeXML = encode_2.encodeXML;\nexports.encodeHTML = encode_2.encodeHTML;\nexports.escape = encode_2.escape;\n// Legacy aliases\nexports.encodeHTML4 = encode_2.encodeHTML;\nexports.encodeHTML5 = encode_2.encodeHTML;\nvar decode_2 = require(\"./decode\");\nexports.decodeXML = decode_2.decodeXML;\nexports.decodeHTML = decode_2.decodeHTML;\nexports.decodeHTMLStrict = decode_2.decodeHTMLStrict;\n// Legacy aliases\nexports.decodeHTML4 = decode_2.decodeHTML;\nexports.decodeHTML5 = decode_2.decodeHTML;\nexports.decodeHTML4Strict = decode_2.decodeHTMLStrict;\nexports.decodeHTML5Strict = decode_2.decodeHTMLStrict;\nexports.decodeXMLStrict = decode_2.decodeXML;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction getChildren(elem) {\n    // @ts-ignore\n    return elem.children || null;\n}\nexports.getChildren = getChildren;\nfunction getParent(elem) {\n    return elem.parent || null;\n}\nexports.getParent = getParent;\nfunction getSiblings(elem) {\n    var parent = getParent(elem);\n    return parent ? getChildren(parent) : [elem];\n}\nexports.getSiblings = getSiblings;\nfunction getAttributeValue(elem, name) {\n    return elem.attribs && elem.attribs[name];\n}\nexports.getAttributeValue = getAttributeValue;\nfunction hasAttrib(elem, name) {\n    return !!getAttributeValue(elem, name);\n}\nexports.hasAttrib = hasAttrib;\n/***\n * Returns the name property of an element\n *\n * @argument elem The element to get the name for\n */\nfunction getName(elem) {\n    return elem.name;\n}\nexports.getName = getName;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/***\n * Remove an element from the dom\n *\n * @argument elem The element to be removed\n */\nfunction removeElement(elem) {\n    if (elem.prev)\n        elem.prev.next = elem.next;\n    if (elem.next)\n        elem.next.prev = elem.prev;\n    if (elem.parent) {\n        var childs = elem.parent.children;\n        childs.splice(childs.lastIndexOf(elem), 1);\n    }\n}\nexports.removeElement = removeElement;\n/***\n * Replace an element in the dom\n *\n * @argument elem The element to be replaced\n * @argument replacement The element to be added\n */\nfunction replaceElement(elem, replacement) {\n    var prev = (replacement.prev = elem.prev);\n    if (prev) {\n        prev.next = replacement;\n    }\n    var next = (replacement.next = elem.next);\n    if (next) {\n        next.prev = replacement;\n    }\n    var parent = (replacement.parent = elem.parent);\n    if (parent) {\n        var childs = parent.children;\n        childs[childs.lastIndexOf(elem)] = replacement;\n    }\n}\nexports.replaceElement = replaceElement;\n/***\n * Append a child to an element\n *\n * @argument elem The element to append to\n * @argument child The element to be added as a child\n */\nfunction appendChild(elem, child) {\n    child.parent = elem;\n    if (elem.children.push(child) !== 1) {\n        var sibling = elem.children[elem.children.length - 2];\n        sibling.next = child;\n        child.prev = sibling;\n        child.next = null;\n    }\n}\nexports.appendChild = appendChild;\n/***\n * Append an element after another\n *\n * @argument elem The element to append to\n * @argument next The element be added\n */\nfunction append(elem, next) {\n    var parent = elem.parent, currNext = elem.next;\n    next.next = currNext;\n    next.prev = elem;\n    elem.next = next;\n    next.parent = parent;\n    if (currNext) {\n        currNext.prev = next;\n        if (parent) {\n            var childs = parent.children;\n            childs.splice(childs.lastIndexOf(currNext), 0, next);\n        }\n    }\n    else if (parent) {\n        parent.children.push(next);\n    }\n}\nexports.append = append;\n/***\n * Prepend an element before another\n *\n * @argument elem The element to append to\n * @argument prev The element be added\n */\nfunction prepend(elem, prev) {\n    var parent = elem.parent;\n    if (parent) {\n        var childs = parent.children;\n        childs.splice(childs.lastIndexOf(elem), 0, prev);\n    }\n    if (elem.prev) {\n        elem.prev.next = prev;\n    }\n    prev.parent = parent;\n    prev.prev = elem.prev;\n    prev.next = elem;\n    elem.prev = prev;\n}\nexports.prepend = prepend;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar querying_1 = require(\"./querying\");\nvar tagtypes_1 = require(\"./tagtypes\");\nfunction isTextNode(node) {\n    return node.type === \"text\" /* Text */;\n}\n/* eslint-disable @typescript-eslint/camelcase */\nvar Checks = {\n    tag_name: function (name) {\n        if (typeof name === \"function\") {\n            return function (elem) { return tagtypes_1.isTag(elem) && name(elem.name); };\n        }\n        else if (name === \"*\") {\n            return tagtypes_1.isTag;\n        }\n        else {\n            return function (elem) { return tagtypes_1.isTag(elem) && elem.name === name; };\n        }\n    },\n    tag_type: function (type) {\n        if (typeof type === \"function\") {\n            return function (elem) { return type(elem.type); };\n        }\n        else {\n            return function (elem) { return elem.type === type; };\n        }\n    },\n    tag_contains: function (data) {\n        if (typeof data === \"function\") {\n            return function (elem) { return isTextNode(elem) && data(elem.data); };\n        }\n        else {\n            return function (elem) { return isTextNode(elem) && elem.data === data; };\n        }\n    }\n};\n/* eslint-enable @typescript-eslint/camelcase */\nfunction getAttribCheck(attrib, value) {\n    if (typeof value === \"function\") {\n        return function (elem) { return tagtypes_1.isTag(elem) && value(elem.attribs[attrib]); };\n    }\n    else {\n        return function (elem) { return tagtypes_1.isTag(elem) && elem.attribs[attrib] === value; };\n    }\n}\nfunction combineFuncs(a, b) {\n    return function (elem) { return a(elem) || b(elem); };\n}\nfunction compileTest(options) {\n    var funcs = Object.keys(options).map(function (key) {\n        var value = options[key];\n        // @ts-ignore\n        return key in Checks ? Checks[key](value) : getAttribCheck(key, value);\n    });\n    return funcs.length === 0 ? null : funcs.reduce(combineFuncs);\n}\nfunction testElement(options, element) {\n    var test = compileTest(options);\n    return test ? test(element) : true;\n}\nexports.testElement = testElement;\nfunction getElements(options, element, recurse, limit) {\n    if (limit === void 0) { limit = Infinity; }\n    var test = compileTest(options);\n    return test ? querying_1.filter(test, element, recurse, limit) : [];\n}\nexports.getElements = getElements;\nfunction getElementById(id, element, recurse) {\n    if (recurse === void 0) { recurse = true; }\n    if (!Array.isArray(element))\n        element = [element];\n    return querying_1.findOne(getAttribCheck(\"id\", id), element, recurse);\n}\nexports.getElementById = getElementById;\nfunction getElementsByTagName(name, element, recurse, limit) {\n    if (limit === void 0) { limit = Infinity; }\n    return querying_1.filter(Checks.tag_name(name), element, recurse, limit);\n}\nexports.getElementsByTagName = getElementsByTagName;\nfunction getElementsByTagType(type, element, recurse, limit) {\n    if (recurse === void 0) { recurse = true; }\n    if (limit === void 0) { limit = Infinity; }\n    return querying_1.filter(Checks.tag_type(type), element, recurse, limit);\n}\nexports.getElementsByTagType = getElementsByTagType;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tagtypes_1 = require(\"./tagtypes\");\n/**\n * Given an array of nodes, remove any member that is contained by another.\n *\n * @param nodes — Nodes to filter.\n */\nfunction removeSubsets(nodes) {\n    var idx = nodes.length;\n    // Check if each node (or one of its ancestors) is already contained in the\n    // array.\n    while (--idx >= 0) {\n        var node = nodes[idx];\n        // Remove the node if it is not unique.\n        // We are going through the array from the end, so we only\n        // have to check nodes that preceed the node under consideration in the array.\n        if (idx > 0 && nodes.lastIndexOf(node, idx - 1) >= 0) {\n            nodes.splice(idx, 1);\n            continue;\n        }\n        for (var ancestor = node.parent; ancestor; ancestor = ancestor.parent) {\n            if (nodes.indexOf(ancestor) > -1) {\n                nodes.splice(idx, 1);\n                break;\n            }\n        }\n    }\n    return nodes;\n}\nexports.removeSubsets = removeSubsets;\n/***\n * Compare the position of one node against another node in any other document.\n * The return value is a bitmask with the following values:\n *\n * document order:\n * > There is an ordering, document order, defined on all the nodes in the\n * > document corresponding to the order in which the first character of the\n * > XML representation of each node occurs in the XML representation of the\n * > document after expansion of general entities. Thus, the document element\n * > node will be the first node. Element nodes occur before their children.\n * > Thus, document order orders element nodes in order of the occurrence of\n * > their start-tag in the XML (after expansion of entities). The attribute\n * > nodes of an element occur after the element and before its children. The\n * > relative order of attribute nodes is implementation-dependent./\n *\n * Source:\n * http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order\n * @argument nodaA The first node to use in the comparison\n * @argument nodeB The second node to use in the comparison\n *\n * @return A bitmask describing the input nodes' relative position.\n *\n *        See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for\n *        a description of these values.\n */\nfunction compareDocumentPosition(nodeA, nodeB) {\n    var aParents = [];\n    var bParents = [];\n    if (nodeA === nodeB) {\n        return 0;\n    }\n    var current = tagtypes_1.hasChildren(nodeA) ? nodeA : nodeA.parent;\n    while (current) {\n        aParents.unshift(current);\n        current = current.parent;\n    }\n    current = tagtypes_1.hasChildren(nodeB) ? nodeB : nodeB.parent;\n    while (current) {\n        bParents.unshift(current);\n        current = current.parent;\n    }\n    var idx = 0;\n    while (aParents[idx] === bParents[idx]) {\n        idx++;\n    }\n    if (idx === 0) {\n        return 1 /* DISCONNECTED */;\n    }\n    var sharedParent = aParents[idx - 1];\n    var siblings = sharedParent.children;\n    var aSibling = aParents[idx];\n    var bSibling = bParents[idx];\n    if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {\n        if (sharedParent === nodeB) {\n            return 4 /* FOLLOWING */ | 16 /* CONTAINED_BY */;\n        }\n        return 4 /* FOLLOWING */;\n    }\n    else {\n        if (sharedParent === nodeA) {\n            return 2 /* PRECEDING */ | 8 /* CONTAINS */;\n        }\n        return 2 /* PRECEDING */;\n    }\n}\nexports.compareDocumentPosition = compareDocumentPosition;\n/***\n * Sort an array of nodes based on their relative position in the document and\n * remove any duplicate nodes. If the array contains nodes that do not belong\n * to the same document, sort order is unspecified.\n *\n * @argument nodes Array of DOM nodes\n * @returns collection of unique nodes, sorted in document order\n */\nfunction uniqueSort(nodes) {\n    nodes = nodes.filter(function (node, i, arr) { return !arr.includes(node, i + 1); });\n    nodes.sort(function (a, b) {\n        var relative = compareDocumentPosition(a, b);\n        if (relative & 2 /* PRECEDING */) {\n            return -1;\n        }\n        else if (relative & 4 /* FOLLOWING */) {\n            return 1;\n        }\n        return 0;\n    });\n    return nodes;\n}\nexports.uniqueSort = uniqueSort;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MultiplexHandler_1 = __importDefault(require(\"./MultiplexHandler\"));\nvar CollectingHandler = /** @class */ (function (_super) {\n    __extends(CollectingHandler, _super);\n    function CollectingHandler(cbs) {\n        if (cbs === void 0) { cbs = {}; }\n        var _this = _super.call(this, function (name) {\n            var _a;\n            var args = [];\n            for (var _i = 1; _i < arguments.length; _i++) {\n                args[_i - 1] = arguments[_i];\n            }\n            _this.events.push([name].concat(args));\n            // @ts-ignore\n            if (_this._cbs[name])\n                (_a = _this._cbs)[name].apply(_a, args);\n        }) || this;\n        _this._cbs = cbs;\n        _this.events = [];\n        return _this;\n    }\n    CollectingHandler.prototype.onreset = function () {\n        this.events = [];\n        if (this._cbs.onreset)\n            this._cbs.onreset();\n    };\n    CollectingHandler.prototype.restart = function () {\n        var _a;\n        if (this._cbs.onreset)\n            this._cbs.onreset();\n        for (var i = 0; i < this.events.length; i++) {\n            var _b = this.events[i], name_1 = _b[0], args = _b.slice(1);\n            if (!this._cbs[name_1]) {\n                continue;\n            }\n            // @ts-ignore\n            (_a = this._cbs)[name_1].apply(_a, args);\n        }\n    };\n    return CollectingHandler;\n}(MultiplexHandler_1.default));\nexports.CollectingHandler = CollectingHandler;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Calls a specific handler function for all events that are encountered.\n *\n * @param func — The function to multiplex all events to.\n */\nvar MultiplexHandler = /** @class */ (function () {\n    function MultiplexHandler(func) {\n        this._func = func;\n    }\n    /* Format: eventname: number of arguments */\n    MultiplexHandler.prototype.onattribute = function (name, value) {\n        this._func(\"onattribute\", name, value);\n    };\n    MultiplexHandler.prototype.oncdatastart = function () {\n        this._func(\"oncdatastart\");\n    };\n    MultiplexHandler.prototype.oncdataend = function () {\n        this._func(\"oncdataend\");\n    };\n    MultiplexHandler.prototype.ontext = function (text) {\n        this._func(\"ontext\", text);\n    };\n    MultiplexHandler.prototype.onprocessinginstruction = function (name, value) {\n        this._func(\"onprocessinginstruction\", name, value);\n    };\n    MultiplexHandler.prototype.oncomment = function (comment) {\n        this._func(\"oncomment\", comment);\n    };\n    MultiplexHandler.prototype.oncommentend = function () {\n        this._func(\"oncommentend\");\n    };\n    MultiplexHandler.prototype.onclosetag = function (name) {\n        this._func(\"onclosetag\", name);\n    };\n    MultiplexHandler.prototype.onopentag = function (name, attribs) {\n        this._func(\"onopentag\", name, attribs);\n    };\n    MultiplexHandler.prototype.onopentagname = function (name) {\n        this._func(\"onopentagname\", name);\n    };\n    MultiplexHandler.prototype.onerror = function (error) {\n        this._func(\"onerror\", error);\n    };\n    MultiplexHandler.prototype.onend = function () {\n        this._func(\"onend\");\n    };\n    MultiplexHandler.prototype.onparserinit = function (parser) {\n        this._func(\"onparserinit\", parser);\n    };\n    MultiplexHandler.prototype.onreset = function () {\n        this._func(\"onreset\");\n    };\n    return MultiplexHandler;\n}());\nexports.default = MultiplexHandler;\n","'use strict';\n\nmodule.exports = function get_html_translation_table(table, quoteStyle) {\n  // eslint-disable-line camelcase\n  //  discuss at: http://locutus.io/php/get_html_translation_table/\n  // original by: Philip Peterson\n  //  revised by: Kevin van Zonneveld (http://kvz.io)\n  // bugfixed by: noname\n  // bugfixed by: Alex\n  // bugfixed by: Marco\n  // bugfixed by: madipta\n  // bugfixed by: Brett Zamir (http://brett-zamir.me)\n  // bugfixed by: T.Wild\n  // improved by: KELAN\n  // improved by: Brett Zamir (http://brett-zamir.me)\n  //    input by: Frank Forte\n  //    input by: Ratheous\n  //      note 1: It has been decided that we're not going to add global\n  //      note 1: dependencies to Locutus, meaning the constants are not\n  //      note 1: real constants, but strings instead. Integers are also supported if someone\n  //      note 1: chooses to create the constants themselves.\n  //   example 1: get_html_translation_table('HTML_SPECIALCHARS')\n  //   returns 1: {'\"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;'}\n\n  var entities = {};\n  var hashMap = {};\n  var decimal;\n  var constMappingTable = {};\n  var constMappingQuoteStyle = {};\n  var useTable = {};\n  var useQuoteStyle = {};\n\n  // Translate arguments\n  constMappingTable[0] = 'HTML_SPECIALCHARS';\n  constMappingTable[1] = 'HTML_ENTITIES';\n  constMappingQuoteStyle[0] = 'ENT_NOQUOTES';\n  constMappingQuoteStyle[2] = 'ENT_COMPAT';\n  constMappingQuoteStyle[3] = 'ENT_QUOTES';\n\n  useTable = !isNaN(table) ? constMappingTable[table] : table ? table.toUpperCase() : 'HTML_SPECIALCHARS';\n\n  useQuoteStyle = !isNaN(quoteStyle) ? constMappingQuoteStyle[quoteStyle] : quoteStyle ? quoteStyle.toUpperCase() : 'ENT_COMPAT';\n\n  if (useTable !== 'HTML_SPECIALCHARS' && useTable !== 'HTML_ENTITIES') {\n    throw new Error('Table: ' + useTable + ' not supported');\n  }\n\n  entities['38'] = '&amp;';\n  if (useTable === 'HTML_ENTITIES') {\n    entities['160'] = '&nbsp;';\n    entities['161'] = '&iexcl;';\n    entities['162'] = '&cent;';\n    entities['163'] = '&pound;';\n    entities['164'] = '&curren;';\n    entities['165'] = '&yen;';\n    entities['166'] = '&brvbar;';\n    entities['167'] = '&sect;';\n    entities['168'] = '&uml;';\n    entities['169'] = '&copy;';\n    entities['170'] = '&ordf;';\n    entities['171'] = '&laquo;';\n    entities['172'] = '&not;';\n    entities['173'] = '&shy;';\n    entities['174'] = '&reg;';\n    entities['175'] = '&macr;';\n    entities['176'] = '&deg;';\n    entities['177'] = '&plusmn;';\n    entities['178'] = '&sup2;';\n    entities['179'] = '&sup3;';\n    entities['180'] = '&acute;';\n    entities['181'] = '&micro;';\n    entities['182'] = '&para;';\n    entities['183'] = '&middot;';\n    entities['184'] = '&cedil;';\n    entities['185'] = '&sup1;';\n    entities['186'] = '&ordm;';\n    entities['187'] = '&raquo;';\n    entities['188'] = '&frac14;';\n    entities['189'] = '&frac12;';\n    entities['190'] = '&frac34;';\n    entities['191'] = '&iquest;';\n    entities['192'] = '&Agrave;';\n    entities['193'] = '&Aacute;';\n    entities['194'] = '&Acirc;';\n    entities['195'] = '&Atilde;';\n    entities['196'] = '&Auml;';\n    entities['197'] = '&Aring;';\n    entities['198'] = '&AElig;';\n    entities['199'] = '&Ccedil;';\n    entities['200'] = '&Egrave;';\n    entities['201'] = '&Eacute;';\n    entities['202'] = '&Ecirc;';\n    entities['203'] = '&Euml;';\n    entities['204'] = '&Igrave;';\n    entities['205'] = '&Iacute;';\n    entities['206'] = '&Icirc;';\n    entities['207'] = '&Iuml;';\n    entities['208'] = '&ETH;';\n    entities['209'] = '&Ntilde;';\n    entities['210'] = '&Ograve;';\n    entities['211'] = '&Oacute;';\n    entities['212'] = '&Ocirc;';\n    entities['213'] = '&Otilde;';\n    entities['214'] = '&Ouml;';\n    entities['215'] = '&times;';\n    entities['216'] = '&Oslash;';\n    entities['217'] = '&Ugrave;';\n    entities['218'] = '&Uacute;';\n    entities['219'] = '&Ucirc;';\n    entities['220'] = '&Uuml;';\n    entities['221'] = '&Yacute;';\n    entities['222'] = '&THORN;';\n    entities['223'] = '&szlig;';\n    entities['224'] = '&agrave;';\n    entities['225'] = '&aacute;';\n    entities['226'] = '&acirc;';\n    entities['227'] = '&atilde;';\n    entities['228'] = '&auml;';\n    entities['229'] = '&aring;';\n    entities['230'] = '&aelig;';\n    entities['231'] = '&ccedil;';\n    entities['232'] = '&egrave;';\n    entities['233'] = '&eacute;';\n    entities['234'] = '&ecirc;';\n    entities['235'] = '&euml;';\n    entities['236'] = '&igrave;';\n    entities['237'] = '&iacute;';\n    entities['238'] = '&icirc;';\n    entities['239'] = '&iuml;';\n    entities['240'] = '&eth;';\n    entities['241'] = '&ntilde;';\n    entities['242'] = '&ograve;';\n    entities['243'] = '&oacute;';\n    entities['244'] = '&ocirc;';\n    entities['245'] = '&otilde;';\n    entities['246'] = '&ouml;';\n    entities['247'] = '&divide;';\n    entities['248'] = '&oslash;';\n    entities['249'] = '&ugrave;';\n    entities['250'] = '&uacute;';\n    entities['251'] = '&ucirc;';\n    entities['252'] = '&uuml;';\n    entities['253'] = '&yacute;';\n    entities['254'] = '&thorn;';\n    entities['255'] = '&yuml;';\n  }\n\n  if (useQuoteStyle !== 'ENT_NOQUOTES') {\n    entities['34'] = '&quot;';\n  }\n  if (useQuoteStyle === 'ENT_QUOTES') {\n    entities['39'] = '&#39;';\n  }\n  entities['60'] = '&lt;';\n  entities['62'] = '&gt;';\n\n  // ascii decimals to real symbols\n  for (decimal in entities) {\n    if (entities.hasOwnProperty(decimal)) {\n      hashMap[String.fromCharCode(decimal)] = entities[decimal];\n    }\n  }\n\n  return hashMap;\n};\n//# sourceMappingURL=get_html_translation_table.js.map"],"sourceRoot":""}