{"version":3,"file":"markdown-it.esm.min.mjs","names":["decode","encode"],"sources":["../../node_modules/mdurl/lib/decode.mjs","../../node_modules/mdurl/lib/encode.mjs","../../node_modules/mdurl/lib/format.mjs","../../node_modules/mdurl/lib/parse.mjs","../../node_modules/mdurl/index.mjs","../../node_modules/uc.micro/build/index.mjs","../../node_modules/entities/dist/decode-codepoint.js","../../node_modules/entities/dist/internal/decode-shared.js","../../node_modules/entities/dist/generated/decode-data-html.js","../../node_modules/entities/dist/internal/bin-trie-flags.js","../../node_modules/entities/dist/decode.js","../../src/common/utils.ts","../../src/helpers/parse_link_label.ts","../../src/helpers/parse_link_destination.ts","../../src/helpers/parse_link_title.ts","../../src/helpers/index.ts","../../src/token.ts","../../src/ruler.ts","../../src/renderer.ts","../../src/rules_core/state_core.ts","../../src/rules_core/normalize.ts","../../src/rules_core/block.ts","../../src/rules_core/strip_references.ts","../../src/rules_core/inline.ts","../../src/rules_core/linkify.ts","../../src/rules_core/replacements.ts","../../src/rules_core/smartquotes.ts","../../src/rules_core/text_join.ts","../../src/parser_core.ts","../../src/rules_block/state_block.ts","../../src/rules_block/table.ts","../../src/rules_block/code.ts","../../src/rules_block/fence.ts","../../src/rules_block/blockquote.ts","../../src/rules_block/hr.ts","../../src/rules_block/list.ts","../../src/rules_block/reference.ts","../../src/common/html_blocks.ts","../../src/common/html_re.ts","../../src/rules_block/html_block.ts","../../src/rules_block/heading.ts","../../src/rules_block/lheading.ts","../../src/rules_block/paragraph.ts","../../src/parser_block.ts","../../src/rules_inline/state_inline.ts","../../src/rules_inline/text.ts","../../src/rules_inline/linkify.ts","../../src/rules_inline/newline.ts","../../src/rules_inline/escape.ts","../../src/rules_inline/backticks.ts","../../src/rules_inline/strikethrough.ts","../../src/rules_inline/emphasis.ts","../../src/rules_inline/link.ts","../../src/rules_inline/image.ts","../../src/rules_inline/autolink.ts","../../src/rules_inline/html_inline.ts","../../src/rules_inline/entity.ts","../../src/rules_inline/balance_pairs.ts","../../src/rules_inline/fragments_join.ts","../../src/parser_inline.ts","../../node_modules/linkify-it/build/index.mjs","../../node_modules/punycode.js/punycode.es6.js","../../src/presets/default.ts","../../src/presets/zero.ts","../../src/presets/commonmark.ts","../../src/markdownit.ts","../../src/index.ts"],"sourcesContent":["/* eslint-disable no-bitwise */\n\nconst decodeCache = {}\n\nfunction getDecodeCache (exclude) {\n  let cache = decodeCache[exclude]\n  if (cache) { return cache }\n\n  cache = decodeCache[exclude] = []\n\n  for (let i = 0; i < 128; i++) {\n    const ch = String.fromCharCode(i)\n    cache.push(ch)\n  }\n\n  for (let i = 0; i < exclude.length; i++) {\n    const ch = exclude.charCodeAt(i)\n    cache[ch] = '%' + ('0' + ch.toString(16).toUpperCase()).slice(-2)\n  }\n\n  return cache\n}\n\n// Decode percent-encoded string.\n//\nfunction decode (string, exclude) {\n  if (typeof exclude !== 'string') {\n    exclude = decode.defaultChars\n  }\n\n  const cache = getDecodeCache(exclude)\n\n  return string.replace(/(%[a-f0-9]{2})+/gi, function (seq) {\n    let result = ''\n\n    for (let i = 0, l = seq.length; i < l; i += 3) {\n      const b1 = parseInt(seq.slice(i + 1, i + 3), 16)\n\n      if (b1 < 0x80) {\n        result += cache[b1]\n        continue\n      }\n\n      if ((b1 & 0xE0) === 0xC0 && (i + 3 < l)) {\n        // 110xxxxx 10xxxxxx\n        const b2 = parseInt(seq.slice(i + 4, i + 6), 16)\n\n        if ((b2 & 0xC0) === 0x80) {\n          const chr = ((b1 << 6) & 0x7C0) | (b2 & 0x3F)\n\n          if (chr < 0x80) {\n            result += '\\ufffd\\ufffd'\n          } else {\n            result += String.fromCharCode(chr)\n          }\n\n          i += 3\n          continue\n        }\n      }\n\n      if ((b1 & 0xF0) === 0xE0 && (i + 6 < l)) {\n        // 1110xxxx 10xxxxxx 10xxxxxx\n        const b2 = parseInt(seq.slice(i + 4, i + 6), 16)\n        const b3 = parseInt(seq.slice(i + 7, i + 9), 16)\n\n        if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {\n          const chr = ((b1 << 12) & 0xF000) | ((b2 << 6) & 0xFC0) | (b3 & 0x3F)\n\n          if (chr < 0x800 || (chr >= 0xD800 && chr <= 0xDFFF)) {\n            result += '\\ufffd\\ufffd\\ufffd'\n          } else {\n            result += String.fromCharCode(chr)\n          }\n\n          i += 6\n          continue\n        }\n      }\n\n      if ((b1 & 0xF8) === 0xF0 && (i + 9 < l)) {\n        // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx\n        const b2 = parseInt(seq.slice(i + 4, i + 6), 16)\n        const b3 = parseInt(seq.slice(i + 7, i + 9), 16)\n        const b4 = parseInt(seq.slice(i + 10, i + 12), 16)\n\n        if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80 && (b4 & 0xC0) === 0x80) {\n          let chr = ((b1 << 18) & 0x1C0000) | ((b2 << 12) & 0x3F000) | ((b3 << 6) & 0xFC0) | (b4 & 0x3F)\n\n          if (chr < 0x10000 || chr > 0x10FFFF) {\n            result += '\\ufffd\\ufffd\\ufffd\\ufffd'\n          } else {\n            chr -= 0x10000\n            result += String.fromCharCode(0xD800 + (chr >> 10), 0xDC00 + (chr & 0x3FF))\n          }\n\n          i += 9\n          continue\n        }\n      }\n\n      result += '\\ufffd'\n    }\n\n    return result\n  })\n}\n\ndecode.defaultChars = ';/?:@&=+$,#'\ndecode.componentChars = ''\n\nexport default decode\n","const encodeCache = {}\n\n// Create a lookup array where anything but characters in `chars` string\n// and alphanumeric chars is percent-encoded.\n//\nfunction getEncodeCache (exclude) {\n  let cache = encodeCache[exclude]\n  if (cache) { return cache }\n\n  cache = encodeCache[exclude] = []\n\n  for (let i = 0; i < 128; i++) {\n    const ch = String.fromCharCode(i)\n\n    if (/^[0-9a-z]$/i.test(ch)) {\n      // always allow unencoded alphanumeric characters\n      cache.push(ch)\n    } else {\n      cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2))\n    }\n  }\n\n  for (let i = 0; i < exclude.length; i++) {\n    cache[exclude.charCodeAt(i)] = exclude[i]\n  }\n\n  return cache\n}\n\n// Encode unsafe characters with percent-encoding, skipping already\n// encoded sequences.\n//\n//  - string       - string to encode\n//  - exclude      - list of characters to ignore (in addition to a-zA-Z0-9)\n//  - keepEscaped  - don't encode '%' in a correct escape sequence (default: true)\n//\nfunction encode (string, exclude, keepEscaped) {\n  if (typeof exclude !== 'string') {\n    // encode(string, keepEscaped)\n    keepEscaped = exclude\n    exclude = encode.defaultChars\n  }\n\n  if (typeof keepEscaped === 'undefined') {\n    keepEscaped = true\n  }\n\n  const cache = getEncodeCache(exclude)\n  let result = ''\n\n  for (let i = 0, l = string.length; i < l; i++) {\n    const code = string.charCodeAt(i)\n\n    if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) {\n      if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {\n        result += string.slice(i, i + 3)\n        i += 2\n        continue\n      }\n    }\n\n    if (code < 128) {\n      result += cache[code]\n      continue\n    }\n\n    if (code >= 0xD800 && code <= 0xDFFF) {\n      if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) {\n        const nextCode = string.charCodeAt(i + 1)\n        if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {\n          result += encodeURIComponent(string[i] + string[i + 1])\n          i++\n          continue\n        }\n      }\n      result += '%EF%BF%BD'\n      continue\n    }\n\n    result += encodeURIComponent(string[i])\n  }\n\n  return result\n}\n\nencode.defaultChars = \";/?:@&=+$,-_.!~*'()#\"\nencode.componentChars = \"-_.!~*'()\"\n\nexport default encode\n","export default function format (url) {\n  let result = ''\n\n  result += url.protocol || ''\n  result += url.slashes ? '//' : ''\n  result += url.auth ? url.auth + '@' : ''\n\n  if (url.hostname && url.hostname.indexOf(':') !== -1) {\n    // ipv6 address\n    result += '[' + url.hostname + ']'\n  } else {\n    result += url.hostname || ''\n  }\n\n  result += url.port ? ':' + url.port : ''\n  result += url.pathname || ''\n  result += url.search || ''\n  result += url.hash || ''\n\n  return result\n};\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//\n// Changes from joyent/node:\n//\n// 1. No leading slash in paths,\n//    e.g. in `url.parse('http://foo?bar')` pathname is ``, not `/`\n//\n// 2. Backslashes are not replaced with slashes,\n//    so `http:\\\\example.org\\` is treated like a relative path\n//\n// 3. Trailing colon is treated like a part of the path,\n//    i.e. in `http://example.org:foo` pathname is `:foo`\n//\n// 4. Nothing is URL-encoded in the resulting object,\n//    (in joyent/node some chars in auth and paths are encoded)\n//\n// 5. `url.parse()` does not have `parseQueryString` argument\n//\n// 6. Removed extraneous result properties: `host`, `path`, `query`, etc.,\n//    which can be constructed using other parts of the url.\n//\n\nfunction Url () {\n  this.protocol = null\n  this.slashes = null\n  this.auth = null\n  this.port = null\n  this.hostname = null\n  this.hash = null\n  this.search = null\n  this.pathname = null\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nconst protocolPattern = /^([a-z0-9.+-]+:)/i\nconst portPattern = /:[0-9]*$/\n\n// Special case for a simple path URL\n/* eslint-disable-next-line no-useless-escape */\nconst simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/\n\n// RFC 2396: characters reserved for delimiting URLs.\n// We actually just auto-escape these.\nconst delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t']\n\n// RFC 2396: characters not allowed for various reasons.\nconst unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims)\n\n// Allowed by RFCs, but cause of XSS attacks.  Always escape these.\nconst autoEscape = ['\\''].concat(unwise)\n// Characters that are never ever allowed in a hostname.\n// Note that any invalid chars are also handled, but these\n// are the ones that are *expected* to be seen, so we fast-path\n// them.\nconst nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape)\nconst hostEndingChars = ['/', '?', '#']\nconst hostnameMaxLen = 255\nconst hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/\nconst hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/\n// protocols that can allow \"unsafe\" and \"unwise\" chars.\n// protocols that never have a hostname.\nconst hostlessProtocol = {\n  javascript: true,\n  'javascript:': true\n}\n// protocols that always contain a // bit.\nconst slashedProtocol = {\n  http: true,\n  https: true,\n  ftp: true,\n  gopher: true,\n  file: true,\n  'http:': true,\n  'https:': true,\n  'ftp:': true,\n  'gopher:': true,\n  'file:': true\n}\n\nfunction urlParse (url, slashesDenoteHost) {\n  if (url && url instanceof Url) return url\n\n  const u = new Url()\n  u.parse(url, slashesDenoteHost)\n  return u\n}\n\nUrl.prototype.parse = function (url, slashesDenoteHost) {\n  let lowerProto, hec, slashes\n  let rest = url\n\n  // trim before proceeding.\n  // This is to support parse stuff like \"  http://foo.com  \\n\"\n  rest = rest.trim()\n\n  if (!slashesDenoteHost && url.split('#').length === 1) {\n    // Try fast path regexp\n    const simplePath = simplePathPattern.exec(rest)\n    if (simplePath) {\n      this.pathname = simplePath[1]\n      if (simplePath[2]) {\n        this.search = simplePath[2]\n      }\n      return this\n    }\n  }\n\n  let proto = protocolPattern.exec(rest)\n  if (proto) {\n    proto = proto[0]\n    lowerProto = proto.toLowerCase()\n    this.protocol = proto\n    rest = rest.substr(proto.length)\n  }\n\n  // figure out if it's got a host\n  // user@server is *always* interpreted as a hostname, and url\n  // resolution will treat //foo/bar as host=foo,path=bar because that's\n  // how the browser resolves relative URLs.\n  /* eslint-disable-next-line no-useless-escape */\n  if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n    slashes = rest.substr(0, 2) === '//'\n    if (slashes && !(proto && hostlessProtocol[proto])) {\n      rest = rest.substr(2)\n      this.slashes = true\n    }\n  }\n\n  if (!hostlessProtocol[proto] &&\n      (slashes || (proto && !slashedProtocol[proto]))) {\n    // there's a hostname.\n    // the first instance of /, ?, ;, or # ends the host.\n    //\n    // If there is an @ in the hostname, then non-host chars *are* allowed\n    // to the left of the last @ sign, unless some host-ending character\n    // comes *before* the @-sign.\n    // URLs are obnoxious.\n    //\n    // ex:\n    // http://a@b@c/ => user:a@b host:c\n    // http://a@b?@c => user:a host:c path:/?@c\n\n    // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n    // Review our test case against browsers more comprehensively.\n\n    // find the first instance of any hostEndingChars\n    let hostEnd = -1\n    for (let i = 0; i < hostEndingChars.length; i++) {\n      hec = rest.indexOf(hostEndingChars[i])\n      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n        hostEnd = hec\n      }\n    }\n\n    // at this point, either we have an explicit point where the\n    // auth portion cannot go past, or the last @ char is the decider.\n    let auth, atSign\n    if (hostEnd === -1) {\n      // atSign can be anywhere.\n      atSign = rest.lastIndexOf('@')\n    } else {\n      // atSign must be in auth portion.\n      // http://a@b/c@d => host:b auth:a path:/c@d\n      atSign = rest.lastIndexOf('@', hostEnd)\n    }\n\n    // Now we have a portion which is definitely the auth.\n    // Pull that off.\n    if (atSign !== -1) {\n      auth = rest.slice(0, atSign)\n      rest = rest.slice(atSign + 1)\n      this.auth = auth\n    }\n\n    // the host is the remaining to the left of the first non-host char\n    hostEnd = -1\n    for (let i = 0; i < nonHostChars.length; i++) {\n      hec = rest.indexOf(nonHostChars[i])\n      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n        hostEnd = hec\n      }\n    }\n    // if we still have not hit it, then the entire thing is a host.\n    if (hostEnd === -1) {\n      hostEnd = rest.length\n    }\n\n    if (rest[hostEnd - 1] === ':') { hostEnd-- }\n    const host = rest.slice(0, hostEnd)\n    rest = rest.slice(hostEnd)\n\n    // pull out port.\n    this.parseHost(host)\n\n    // we've indicated that there is a hostname,\n    // so even if it's empty, it has to be present.\n    this.hostname = this.hostname || ''\n\n    // if hostname begins with [ and ends with ]\n    // assume that it's an IPv6 address.\n    const ipv6Hostname = this.hostname[0] === '[' &&\n        this.hostname[this.hostname.length - 1] === ']'\n\n    // validate a little.\n    if (!ipv6Hostname) {\n      const hostparts = this.hostname.split(/\\./)\n      for (let i = 0, l = hostparts.length; i < l; i++) {\n        const part = hostparts[i]\n        if (!part) { continue }\n        if (!part.match(hostnamePartPattern)) {\n          let newpart = ''\n          for (let j = 0, k = part.length; j < k; j++) {\n            if (part.charCodeAt(j) > 127) {\n              // we replace non-ASCII char with a temporary placeholder\n              // we need this to make sure size of hostname is not\n              // broken by replacing non-ASCII by nothing\n              newpart += 'x'\n            } else {\n              newpart += part[j]\n            }\n          }\n          // we test again with ASCII char only\n          if (!newpart.match(hostnamePartPattern)) {\n            const validParts = hostparts.slice(0, i)\n            const notHost = hostparts.slice(i + 1)\n            const bit = part.match(hostnamePartStart)\n            if (bit) {\n              validParts.push(bit[1])\n              notHost.unshift(bit[2])\n            }\n            if (notHost.length) {\n              rest = notHost.join('.') + rest\n            }\n            this.hostname = validParts.join('.')\n            break\n          }\n        }\n      }\n    }\n\n    if (this.hostname.length > hostnameMaxLen) {\n      this.hostname = ''\n    }\n\n    // strip [ and ] from the hostname\n    // the host field still retains them, though\n    if (ipv6Hostname) {\n      this.hostname = this.hostname.substr(1, this.hostname.length - 2)\n    }\n  }\n\n  // chop off from the tail first.\n  const hash = rest.indexOf('#')\n  if (hash !== -1) {\n    // got a fragment string.\n    this.hash = rest.substr(hash)\n    rest = rest.slice(0, hash)\n  }\n  const qm = rest.indexOf('?')\n  if (qm !== -1) {\n    this.search = rest.substr(qm)\n    rest = rest.slice(0, qm)\n  }\n  if (rest) { this.pathname = rest }\n  if (slashedProtocol[lowerProto] &&\n      this.hostname && !this.pathname) {\n    this.pathname = ''\n  }\n\n  return this\n}\n\nUrl.prototype.parseHost = function (host) {\n  let port = portPattern.exec(host)\n  if (port) {\n    port = port[0]\n    if (port !== ':') {\n      this.port = port.substr(1)\n    }\n    host = host.substr(0, host.length - port.length)\n  }\n  if (host) { this.hostname = host }\n}\n\nexport default urlParse\n","import decode from './lib/decode.mjs'\nimport encode from './lib/encode.mjs'\nimport format from './lib/format.mjs'\nimport parse from './lib/parse.mjs'\n\nexport {\n  decode,\n  encode,\n  format,\n  parse\n}\n","const Any = /[\\0-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nconst Cc = /[\\0-\\x1F\\x7F-\\x9F]/;\nconst Cf = /[\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u0890\\u0891\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB]|\\uD804[\\uDCBD\\uDCCD]|\\uD80D[\\uDC30-\\uDC3F]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]/;\nconst P = /[!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061D-\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u09FD\\u0A76\\u0AF0\\u0C77\\u0C84\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B4E\\u1B4F\\u1B5A-\\u1B60\\u1B7D-\\u1B7F\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E4F\\u2E52-\\u2E5D\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD803[\\uDD6E\\uDEAD\\uDED0\\uDF55-\\uDF59\\uDF86-\\uDF89]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC8\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9\\uDFD4\\uDFD5\\uDFD7\\uDFD8]|\\uD805[\\uDC4B-\\uDC4F\\uDC5A\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDEB9\\uDF3C-\\uDF3E]|\\uD806[\\uDC3B\\uDD44-\\uDD46\\uDDE2\\uDE3F-\\uDE46\\uDE9A-\\uDE9C\\uDE9E-\\uDEA2\\uDF00-\\uDF09\\uDFE1]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71\\uDEF7\\uDEF8\\uDF43-\\uDF4F\\uDFFF]|\\uD809[\\uDC70-\\uDC74]|\\uD80B[\\uDFF1\\uDFF2]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD81B[\\uDD6D-\\uDD6F\\uDE97-\\uDE9A\\uDFE2]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD839\\uDDFF|\\uD83A[\\uDD5E\\uDD5F]/;\nconst S = /[\\$\\+<->\\^`\\|~\\xA2-\\xA6\\xA8\\xA9\\xAC\\xAE-\\xB1\\xB4\\xB8\\xD7\\xF7\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u03F6\\u0482\\u058D-\\u058F\\u0606-\\u0608\\u060B\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u07FE\\u07FF\\u0888\\u09F2\\u09F3\\u09FA\\u09FB\\u0AF1\\u0B70\\u0BF3-\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0E3F\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u166D\\u17DB\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u20A0-\\u20C1\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F\\u218A\\u218B\\u2190-\\u2307\\u230C-\\u2328\\u232B-\\u2429\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u2767\\u2794-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2B73\\u2B76-\\u2BFF\\u2CE5-\\u2CEA\\u2E50\\u2E51\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFF\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u309B\\u309C\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E5\\u31EF\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA828-\\uA82B\\uA836-\\uA839\\uAA77-\\uAA79\\uAB5B\\uAB6A\\uAB6B\\uFB29\\uFBB2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDCF\\uFDFC-\\uFDFF\\uFE62\\uFE64-\\uFE66\\uFE69\\uFF04\\uFF0B\\uFF1C-\\uFF1E\\uFF3E\\uFF40\\uFF5C\\uFF5E\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFFC\\uFFFD]|\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9C\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD803[\\uDD8E\\uDD8F\\uDED1-\\uDED8]|\\uD805\\uDF3F|\\uD807[\\uDFD5-\\uDFF1]|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD833[\\uDC00-\\uDCEF\\uDCFA-\\uDCFC\\uDD00-\\uDEB3\\uDEBA-\\uDED0\\uDEE0-\\uDEF0\\uDF50-\\uDFC3]|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDEA\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD838[\\uDD4F\\uDEFF]|\\uD83B[\\uDCAC\\uDCB0\\uDD2E\\uDEF0\\uDEF1]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD0D-\\uDDAD\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDE60-\\uDE65\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED8\\uDEDC-\\uDEEC\\uDEF0-\\uDEFC\\uDF00-\\uDFD9\\uDFE0-\\uDFEB\\uDFF0]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDCB0-\\uDCBB\\uDCC0\\uDCC1\\uDCD0-\\uDCD8\\uDD00-\\uDE57\\uDE60-\\uDE6D\\uDE70-\\uDE7C\\uDE80-\\uDE8A\\uDE8E-\\uDEC6\\uDEC8\\uDECD-\\uDEDC\\uDEDF-\\uDEEA\\uDEEF-\\uDEF8\\uDF00-\\uDF92\\uDF94-\\uDFEF\\uDFFA]/;\nconst Z = /[ \\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]/;\n\nexport { Any, Cc, Cf, P, S, Z };\n","// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134\nconst decodeMap = new Map([\n    [0, 65_533],\n    // C1 Unicode control character reference replacements\n    [128, 8364],\n    [130, 8218],\n    [131, 402],\n    [132, 8222],\n    [133, 8230],\n    [134, 8224],\n    [135, 8225],\n    [136, 710],\n    [137, 8240],\n    [138, 352],\n    [139, 8249],\n    [140, 338],\n    [142, 381],\n    [145, 8216],\n    [146, 8217],\n    [147, 8220],\n    [148, 8221],\n    [149, 8226],\n    [150, 8211],\n    [151, 8212],\n    [152, 732],\n    [153, 8482],\n    [154, 353],\n    [155, 8250],\n    [156, 339],\n    [158, 382],\n    [159, 376],\n]);\n/**\n * Replace the given code point with a replacement character if it is a\n * surrogate or is outside the valid range. Otherwise return the code\n * point unchanged.\n * @param codePoint Unicode code point to convert.\n */\nexport function replaceCodePoint(codePoint) {\n    if ((codePoint >= 0xd8_00 && codePoint <= 0xdf_ff) ||\n        codePoint > 0x10_ff_ff) {\n        return 0xff_fd;\n    }\n    return decodeMap.get(codePoint) ?? codePoint;\n}\n//# sourceMappingURL=decode-codepoint.js.map","/**\n * Shared base64 decode helper for generated decode data.\n * Assumes global atob is available.\n * @param input Input string to encode or decode.\n */\nexport function decodeBase64(input) {\n    const binary = atob(input);\n    const evenLength = binary.length & ~1; // Round down to even length\n    const out = new Uint16Array(evenLength / 2);\n    for (let index = 0, outIndex = 0; index < evenLength; index += 2) {\n        const lo = binary.charCodeAt(index);\n        const hi = binary.charCodeAt(index + 1);\n        out[outIndex++] = lo | (hi << 8);\n    }\n    return out;\n}\n//# sourceMappingURL=decode-shared.js.map","// Generated using scripts/write-decode-map.ts\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\n/** Packed HTML decode trie data. */\nexport const htmlDecodeTree = /* #__PURE__ */ decodeBase64(\"QR08ALkAAgH6AYsDNQR2BO0EPgXZBQEGLAbdBxMISQrvCmQLfQurDKQNLw4fD4YPpA+6D/IPAAAAAAAAAAAAAAAAKhBMEY8TmxUWF2EYLBkxGuAa3RsJHDscWR8YIC8jSCSIJcMl6ie3Ku8rEC0CLjoupS7kLgAIRU1hYmNmZ2xtbm9wcnN0dVQAWgBeAGUAaQBzAHcAfgCBAIQAhwCSAJoAoACsALMAbABpAGcAO4DGAMZAUAA7gCYAJkBjAHUAdABlADuAwQDBQHIiZXZlAAJhAAFpeW0AcgByAGMAO4DCAMJAEGRyAADgNdgE3XIAYQB2AGUAO4DAAMBA8CFoYZFj4SFjcgBhZAAAoFMqAAFncIsAjgBvAG4ABGFmAADgNdg43fAlbHlGdW5jdGlvbgCgYSBpAG4AZwA7gMUAxUAAAWNzpACoAHIAAOA12Jzc6SFnbgCgVCJpAGwAZABlADuAwwDDQG0AbAA7gMQAxEAABGFjZWZvcnN1xQDYANoA7QDxAPYA+QD8AAABY3LJAM8AayNzbGFzaAAAoBYidgHTANUAAKDnKmUAZAAAoAYjeQARZIABY3J0AOAA5QDrAGEidXNlAACgNSLuI291bGxpcwCgLCFhAJJjcgAA4DXYBd1wAGYAAOA12Dnd5SF2ZdhiYwDyAOoAbSJwZXEAAKBOIgAHSE9hY2RlZmhpbG9yc3UXARoBHwE6AVIBVQFiAWQBZgGCAakB6QHtAfIBYwB5ACdkUABZADuAqQCpQIABY3B5ACUBKAE1AfUhdGUGYWmg0iJ0KGFsRGlmZmVyZW50aWFsRAAAoEUhbCJleXMAAKAtIQACYWVpb0EBRAFKAU0B8iFvbgxhZABpAGwAO4DHAMdAcgBjAAhhbiJpbnQAAKAwIm8AdAAKYQABZG5ZAV0BaSJsbGEAuGB0I2VyRG90ALdg8gA5AWkAp2NyImNsZQAAAkRNUFRwAXQBeQF9AW8AdAAAoJkiaSJudXMAAKCWIuwhdXMAoJUiaSJtZXMAAKCXIm8AAAFjc4cBlAFrKndpc2VDb250b3VySW50ZWdyYWwAAKAyImUjQ3VybHkAAAFEUZwBpAFvJXVibGVRdW90ZQAAoB0gdSJvdGUAAKAZIAACbG5wdbABtgHNAdgBbwBuAGWgNyIAoHQqgAFnaXQAvAHBAcUB8iJ1ZW50AKBhIm4AdAAAoC8i7yV1ckludGVncmFsAKAuIgABZnLRAdMBAKACIe8iZHVjdACgECJuLnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbAAAoDMi7yFzcwCgLypjAHIAAOA12J7ccABDoNMiYQBwAACgTSKABURKU1phY2VmaW9zAAsCEgIVAhgCGwIsAjQCOQI9AnMCfwNvoEUh9CJyYWhkAKARKWMAeQACZGMAeQAFZGMAeQAPZIABZ3JzACECJQIoAuchZXIAoCEgcgAAoKEhaAB2AACg5CoAAWF5MAIzAvIhb24OYRRkbAB0oAciYQCUY3IAAOA12AfdAAFhZkECawIAAWNtRQJnAvIjaXRpY2FsAAJBREdUUAJUAl8CYwJjInV0ZQC0YG8AdAFZAloC2WJiJGxlQWN1dGUA3WJyImF2ZQBgYGkibGRlANxi7yFuZACgxCJmJWVyZW50aWFsRAAAoEYhcAR9AgAAAAAAAIECjgIAABoDZgAA4DXYO91EoagAhQKJAm8AdAAAoNwgcSJ1YWwAAKBQIuIhbGUAA0NETFJVVpkCqAK1Au8C/wIRA28AbgB0AG8AdQByAEkAbgB0AGUAZwByAGEA7ADEAW8AdAKvAgAAAACwAqhgbiNBcnJvdwAAoNMhAAFlb7kC0AJmAHQAgAFBUlQAwQLGAs0CciJyb3cAAKDQIekkZ2h0QXJyb3cAoNQhZQDlACsCbgBnAAABTFLWAugC5SFmdAABQVLcAuECciJyb3cAAKD4J+kkZ2h0QXJyb3cAoPon6SRnaHRBcnJvdwCg+SdpImdodAAAAUFU9gL7AnIicm93AACg0iFlAGUAAKCoInAAQQIGAwAAAAALA3Iicm93AACg0SFvJHduQXJyb3cAAKDVIWUlcnRpY2FsQmFyAACgJSJuAAADQUJMUlRhJAM2AzoDWgNxA3oDciJyb3cAAKGTIUJVLAMwA2EAcgAAoBMpcCNBcnJvdwAAoPUhciJldmUAEWPlIWZ00gJDAwAASwMAAFIDaSVnaHRWZWN0b3IAAKBQKWUkZVZlY3RvcgAAoF4p5SJjdG9yQqC9IWEAcgAAoFYpaSJnaHQA1AFiAwAAaQNlJGVWZWN0b3IAAKBfKeUiY3RvckKgwSFhAHIAAKBXKWUAZQBBoKQiciJyb3cAAKCnIXIAcgBvAPcAtAIAAWN0gwOHA3IA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YwAAoN8i4SFycnCgtiEAoD0pgKIqImJjZG9zACsVMBU6FT4VQRVyImNhcAAAoEgqAAFhdTQVNxVwAACgRipwAACgSipvAHQAAKCNInIAAKBFKgDgKiIA/gACYWxydksVURVuFXMVcgByAG2gtyEAoDwpeQCAAWV2dwBYFWUVaRVxAHACXxUAAAAAYxVyAGUA4wAXFXUA4wAZFWUAZQAAoM4iZSJkZ2UAAKDPImUAbgA7gKQApEBlI2Fycm93AAABbHJ7FX8V5SFmdACgtiFpImdodAAAoLchZQDkAG0VAAFjaYsVkRVvAG4AaQBuAPQAkwFuAHQAAKAxImwiY3R5AACgLSOACUFIYWJjZGVmaGlqbG9yc3R1d3oAuBW7Fb8V1RXgFegV+RUKFhUWHxZUFlcWZRbFFtsW7xb7FgUXChdyAPIAtAJhAHIAAKBlKQACZ2xyc8YVyhXOFdAV5yFlcgCgICDlIXRoAKA4IfIA9QxoAHagECAAoKMiawHZFd4VYSJyb3cAAKAPKWEA4wBfAgABYXnkFecV8iFvbg9hNGQAoUYhYW/tFfQVAAFnciEC8RVyAACgyiF0InNlcQAAoHcqgAFnbG0A/xUCFgUWO4CwALBAdABhALRjcCJ0eXYAAKCxKQABaXIOFhIW8yFodACgfykA4DXYId1hAHIAAAFschsWHRYAoMMhAKDCIYACYWVnc3YAKBauAjYWOhY+Fm0AAKHEIm9zLhY0Fm4AZABzoMQi9SFpdACgZiZhIm1tYQDdY2kAbgAAoPIiAKH3AGlvQxZRFmQAZQAAgfcAO29KFksW90BuI3RpbWVzAACgxyJuAPgAUBZjAHkAUmRjAG8CXhYAAAAAYhZyAG4AAKAeI28AcAAAoA0jgAJscHR1dwBuFnEWdRaSFp4W7CFhciRgZgAA4DXYVd0AotkCZW1wc30WhBaJFo0WcQBkoFAibwB0AACgUSJpIm51cwAAoDgi7CF1cwCgFCLxInVhcmUAoKEiYgBsAGUAYgBhAHIAdwBlAGQAZwDlANcAbgCAAWFkaAClFqoWtBZyAHIAbwD3APUMbwB3AG4AYQByAHIAbwB3APMA8xVhI3Jwb29uAAABbHK8FsAWZQBmAPQAHBZpAGcAaAD0AB4WYgHJFs8WawBhAHIAbwD3AJILbwLUFgAAAADYFnIAbgAAoB8jbwBwAACgDCOAAWNvdADhFukW7BYAAXJ55RboFgDgNdi53FVkbAAAoPYp8iFvaxFhAAFkcvMW9xZvAHQAAKDxImkA5qC/JVsSAAFhaP8WAhdyAPIANQNhAPIA1wvhIm5nbGUAoKYpAAFjaQ4XEBd5AF9k5yJyYXJyAKD/JwAJRGFjZGVmZ2xtbm9wcXJzdHV4MRc4F0YXWxcyBF4XaRd5F40XrBe0F78X2RcVGCEYLRg1GEAYAAFEbzUXgRZvAPQA+BUAAWNzPBdCF3UAdABlADuA6QDpQPQhZXIAoG4qAAJhaW95TRdQF1YXWhfyIW9uG2FyAGOgViI7gOoA6kDsIW9uAKBVIk1kbwB0ABdhAAFEcmIXZhdvAHQAAKBSIgDgNdgi3XKhmipuF3QXYQB2AGUAO4DoAOhAZKCWKm8AdAAAoJgqgKGZKmlscwCAF4UXhxfuInRlcnMAoOcjAKATIWSglSpvAHQAAKCXKoABYXBzAJMXlheiF2MAcgATYXQAeQBzogUinxcAAAAAoRdlAHQAAKAFInAAMaADIDMBqRerFwCgBCAAoAUgAAFnc7AXsRdLYXAAAKACIAABZ3C4F7sXbwBuABlhZgAA4DXYVt2AAWFscwDFF8sXzxdyAHOg1SJsAACg4yl1AHMAAKBxKmkAAKG1A2x21RfYF28AbgC1Y/VjAAJjc3V24BfoF/0XEBgAAWlv5BdWF3IAYwAAoFYiaQLuFwAAAADwF+0ADQThIW50AAFnbPUX+Rd0AHIAAKCWKuUhc3MAoJUqgAFhZWkAAxgGGAoYbABzAD1gcwB0AACgXyJ2AESgYSJEAACgeCrwImFyc2wAoOUpAAFEYRkYHRhvAHQAAKBTInIAcgAAoHEpgAFjZGkAJxgqGO0XcgAAoC8hbwD0AIwCAAFhaDEYMhi3YzuA8ADwQAABbXI5GD0YbAA7gOsA60BvAACgrCCAAWNpcABGGEgYSxhsACFgcwD0ACwEAAFlb08YVxhjAHQAYQB0AGkAbwDuABoEbgBlAG4AdABpAGEAbADlADME4Ql1GAAAgRgAAIMYiBgAAAAAoRilGAAAqhgAALsYvhjRGAAA1xgnGWwAbABpAG4AZwBkAG8AdABzAGUA8QBlF3kARGRtImFsZQAAoEAmgAFpbHIAjRiRGJ0Y7CFpZwCgA/tpApcYAAAAAJoYZwAAoAD7aQBnAACgBPsA4DXYI93sIWlnAKAB++whaWcA4GYAagCAAWFsdACvGLIYthh0AACgbSZpAGcAAKAC+24AcwAAoLElbwBmAJJh8AHCGAAAxhhmAADgNdhX3QABYWvJGMwYbADsAGsEdqDUIgCg2SphI3J0aW50AACgDSoAAWFv2hgiGQABY3PeGB8ZsQPnGP0YBRkSGRUZAAAdGbID7xjyGPQY9xj5GAAA+xg7gL0AvUAAoFMhO4C8ALxAAKBVIQCgWSEAoFshswEBGQAAAxkAoFQhAKBWIbQCCxkOGQAAAAAQGTuAvgC+QACgVyEAoFwhNQAAoFghtgEZGQAAGxkAoFohAKBdITgAAKBeIWwAAKBEIHcAbgAAoCIjYwByAADgNdi73IAIRWFiY2RlZmdpamxub3JzdHYARhlKGVoZXhlmGWkZkhmWGZkZnRmgGa0ZxhnLGc8Z4BkjGmygZyIAoIwqgAFjbXAAUBlTGVgZ9SF0ZfVhbQBhAOSgswM6FgCghipyImV2ZQAfYQABaXliGWUZcgBjAB1hM2RvAHQAIWGAoWUibHFzAMYEcBl6GfGhZSLOBAAAdhlsAGEAbgD0AN8EgKF+KmNkbACBGYQZjBljAACgqSpvAHQAb6CAKmyggioAoIQqZeDbIgD+cwAAoJQqcgAA4DXYJN3noGsirATtIWVsAKA3IWMAeQBTZIChdyJFYWoApxmpGasZAKCSKgCgpSoAoKQqAAJFYWVztBm2Gb0ZwhkAoGkicABwoIoq8iFveACgiipxoIgq8aCIKrUZaQBtAACg5yJwAGYAAOA12FjdYQB2AOUAYwIAAWNp0xnWGXIAAKAKIW0AAKFzImVs3BneGQCgjioAoJAqAIM+ADtjZGxxco0E6xn0GfgZ/BkBGgABY2nvGfEZAKCnKnIAAKB6Km8AdAAAoNci0CFhcgCglSl1ImVzdAAAoHwqgAJhZGVscwAKGvQZFhrVBCAa8AEPGgAAFBpwAHIAbwD4AFkZcgAAoHgpcQAAAWxxxAQbGmwAZQBzAPMASRlpAO0A5AQAAWVuJxouGnIjdG5lcXEAAOBpIgD+xQAsGgAFQWFiY2Vma29zeUAaQxpmGmoabRqDGocalhrCGtMacgDyAMwCAAJpbG1yShpOGlAaVBpyAHMA8ABxD2YAvWBpAGwA9AASBQABZHJYGlsaYwB5AEpkAKGUIWN3YBpkGmkAcgAAoEgpAKCtIWEAcgAAoA8h6SFyYyVhgAFhbHIAcxp7Gn8a8iF0c3WgZSZpAHQAAKBlJuwhaXAAoCYg4yFvbgCguSJyAADgNdgl3XMAAAFld4wakRphInJvdwAAoCUpYSJyb3cAAKAmKYACYW1vcHIAnxqjGqcauhq+GnIAcgAAoP8h9CFodACgOyJrAAABbHKsGrMaZSRmdGFycm93AACgqSHpJGdodGFycm93AKCqIWYAAOA12Fnd4iFhcgCgFSCAAWNsdADIGswa0BpyAADgNdi93GEAcwDoAGka8iFvaydhAAFicNca2xr1IWxsAKBDIOghZW4AoBAg4Qr2GgAA/RoAAAgbExsaGwAAIRs7GwAAAAA+G2IbmRuVG6sbAACyG80b0htjAHUAdABlADuA7QDtQAChYyBpeQEbBhtyAGMAO4DuAO5AOGQAAWN4CxsNG3kANWRjAGwAO4ChAKFAAAFmcssCFhsA4DXYJt1yAGEAdgBlADuA7ADsQIChSCFpbm8AJxsyGzYbAAFpbisbLxtuAHQAAKAMKnQAAKAtIuYhaW4AoNwpdABhAACgKSHsIWlnM2GAAWFvcABDG1sbXhuAAWNndABJG0sbWRtyACthgAFlbHAAcQVRG1UbaQBuAOUAyAVhAHIA9AByBWgAMWFmAACgtyJlAGQAtWEAoggiY2ZvdGkbbRt1G3kb4SFyZQCgBSFpAG4AdKAeImkAZQAAoN0pZABvAPQAWxsAoisiY2VscIEbhRuPG5QbYQBsAACguiIAAWdyiRuNG2UAcgDzACMQ4wCCG2EicmhrAACgFyryIW9kAKA8KgACY2dwdJ8boRukG6gbeQBRZG8AbgAvYWYAAOA12FrdYQC5Y3UAZQBzAHQAO4C/AL9AAAFjabUbuRtyAADgNdi+3G4AAKIIIkVkc3bCG8QbyBvQAwCg+SJvAHQAAKD1Inag9CIAoPMiaaBiIOwhZGUpYesB1hsAANkbYwB5AFZkbAA7gO8A70AAA2NmbW9zdeYb7hvyG/Ub+hsFHAABaXnqG+0bcgBjADVhOWRyAADgNdgn3eEhdGg3YnAAZgAA4DXYW93jAf8bAAADHHIAAOA12L/c8iFjeVhk6yFjeVRkAARhY2ZnaGpvcxUcGhwiHCYcKhwtHDAcNRzwIXBhdqC6A/BjAAFleR4cIRzkIWls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ZmdobG1vcHJzdHV3CiwNLBEsHSwnLDEsQCxLLFIsYix6LIQsjyzLLOgs7Sz/LAotcgDyAAkDYQByAACgYykAAWNyFSwbLHUAdABlADuA+gD6QPIACQ1yAOMBIywAACUseQBeZHYAZQBtYQABaXkrLDAscgBjADuA+wD7QENkgAFhYmgANyw6LD0scgDyANEO7CFhY3FhYQDyAOAOAAFpckQsSCzzIWh0AKB+KQDgNdgy3XIAYQB2AGUAO4D5APlAYQFWLF8scgAAAWxyWixcLACgvyEAoL4hbABrAACggCUAAWN0Zix2LG8CbCwAAAAAcyxyAG4AZaAcI3IAAKAcI28AcAAAoA8jcgBpAACg+CUAAWFsfiyBLGMAcgBrYTuAqACoQAABZ3CILIssbwBuAHNhZgAA4DXYZt0AA2FkaGxzdZksniynLLgsuyzFLHIAcgBvAPcACQ1vAHcAbgBhAHIAcgBvAPcA2A5hI3Jwb29uAAABbHKvLLMsZQBmAPQAWyxpAGcAaAD0AF0sdQDzAKYOaQAAocUDaGzBLMIs0mNvAG4AxWPwI2Fycm93cwCgyCGAAWNpdADRLOEs5CxvAtcsAAAAAN4scgBuAGWgHSNyAACgHSNvAHAAAKAOI24AZwBvYXIAaQAAoPklYwByAADgNdjK3IABZGlyAPMs9yz6LG8AdAAAoPAi7CFkZWlhaQBmoLUlAKC0JQABYW0DLQYtcgDyAMosbAA7gPwA/EDhIm5nbGUAoKcpgAdBQkRhY2RlZmxub3Byc3oAJy0qLTAtNC2bLZ0toS2/LcMtxy3TLdgt3C3gLfwtcgDyABADYQByAHag6CoAoOkqYQBzAOgA/gIAAW5yOC08LechcnQAoJwpgANla25wcnN0AJkpSC1NLVQtXi1iLYItYQBwAHAA4QAaHG8AdABoAGkAbgDnAKEXgAFoaXIAoSmzJFotbwBwAPQAdCVooJUh7wD4JgABaXVmLWotZwBtAOEAuygAAWJwbi14LXMjZXRuZXEAceCKIgD+AODLKgD+cyNldG5lcQBx4IsiAP4A4MwqAP4AAWhyhi2KLWUAdADhABIraSNhbmdsZQAAAWxyki2WLeUhZnQAoLIiaSJnaHQAAKCzInkAMmThIXNoAKCiIoABZWxyAKcttC24LWKiKCKuLQAAAACyLWEAcgAAoLsicQAAoFoi7CFpcACg7iIAAWJ0vC1eD2EA8gBfD3IAAOA12DPddAByAOkAlS1zAHUAAAFicM0t0C0A4IIi0iAA4IMi0iBwAGYAAOA12GfdcgBvAPAAWQt0AHIA6QCaLQABY3XkLegtcgAA4DXYy9wAAWJw7C30LW4AAAFFZXUt8S0A4IoiAP5uAAABRWV/LfktAOCLIgD+6SJnemFnAKCaKYADY2Vmb3BycwANLhAuJS4pLiMuLi40LukhcmN1YQABZGkULiEuAAFiZxguHC5hAHIAAKBfKmUAcaAnIgCgWSLlIXJwAKAYIXIAAOA12DTdcABmAADgNdho3WWgQCJhAHQA6ABqD2MAcgAA4DXYzNzjCuQRUC4AAFQuAABYLmIuAAAAAGMubS5wLnQuAAAAAIguki4AAJouJxIqEnQAcgDpAB0ScgAA4DXYNd0AAUFhWy5eLnIA8gDnAnIA8gCTB75jAAFBYWYuaS5yAPIA4AJyAPIAjAdhAPAAeh5pAHMAAKD7IoABZHB0APgReS6DLgABZmx9LoAuAOA12GnddQDzAP8RaQBtAOUABBIAAUFhiy6OLnIA8gDuAnIA8gCaBwABY3GVLgoScgAA4DXYzdwAAXB0nS6hLmwAdQDzACUScgDpACASAARhY2VmaW9zdbEuvC7ELsguzC7PLtQu2S5jAAABdXm2LrsudABlADuA/QD9QE9kAAFpecAuwy5yAGMAd2FLZG4AO4ClAKVAcgAA4DXYNt1jAHkAV2RwAGYAAOA12GrdYwByAADgNdjO3AABY23dLt8ueQBOZGwAO4D/AP9AAAVhY2RlZmhpb3N38y73Lv8uAi8MLxAvEy8YLx0vIi9jInV0ZQB6YQABYXn7Lv4u8iFvbn5hN2RvAHQAfGEAAWV0Bi8KL3QAcgDmAB8QYQC2Y3IAAOA12DfdYwB5ADZk5yJyYXJyAKDdIXAAZgAA4DXYa91jAHIAAOA12M/cAAFqbiYvKC8AoA0gagAAoAwg\");\n//# sourceMappingURL=decode-data-html.js.map","/**\n * Bit flags & masks for the binary trie encoding used for entity decoding.\n *\n * Bit layout (16 bits total):\n * 15..14 VALUE_LENGTH   (+1 encoding; 0 => no value)\n * 13     FLAG13.        If valueLength>0: semicolon required flag (implicit ';').\n *                       If valueLength==0: compact run flag.\n * 12..7  BRANCH_LENGTH  Branch length (0 => single branch in 6..0 if jumpOffset==char) OR run length (when compact run)\n * 6..0   JUMP_TABLE     Jump offset (jump table) OR single-branch char code OR first run char\n */\nexport var BinTrieFlags;\n(function (BinTrieFlags) {\n    BinTrieFlags[BinTrieFlags[\"VALUE_LENGTH\"] = 49152] = \"VALUE_LENGTH\";\n    BinTrieFlags[BinTrieFlags[\"FLAG13\"] = 8192] = \"FLAG13\";\n    BinTrieFlags[BinTrieFlags[\"BRANCH_LENGTH\"] = 8064] = \"BRANCH_LENGTH\";\n    BinTrieFlags[BinTrieFlags[\"JUMP_TABLE\"] = 127] = \"JUMP_TABLE\";\n})(BinTrieFlags || (BinTrieFlags = {}));\n//# sourceMappingURL=bin-trie-flags.js.map","import { replaceCodePoint } from \"./decode-codepoint.js\";\nimport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nimport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\nimport { BinTrieFlags } from \"./internal/bin-trie-flags.js\";\nvar CharCodes;\n(function (CharCodes) {\n    CharCodes[CharCodes[\"NUM\"] = 35] = \"NUM\";\n    CharCodes[CharCodes[\"SEMI\"] = 59] = \"SEMI\";\n    CharCodes[CharCodes[\"EQUALS\"] = 61] = \"EQUALS\";\n    CharCodes[CharCodes[\"ZERO\"] = 48] = \"ZERO\";\n    CharCodes[CharCodes[\"NINE\"] = 57] = \"NINE\";\n    CharCodes[CharCodes[\"LOWER_A\"] = 97] = \"LOWER_A\";\n    CharCodes[CharCodes[\"LOWER_F\"] = 102] = \"LOWER_F\";\n    CharCodes[CharCodes[\"LOWER_X\"] = 120] = \"LOWER_X\";\n    CharCodes[CharCodes[\"LOWER_Z\"] = 122] = \"LOWER_Z\";\n    CharCodes[CharCodes[\"UPPER_A\"] = 65] = \"UPPER_A\";\n    CharCodes[CharCodes[\"UPPER_F\"] = 70] = \"UPPER_F\";\n    CharCodes[CharCodes[\"UPPER_Z\"] = 90] = \"UPPER_Z\";\n})(CharCodes || (CharCodes = {}));\n/** Bit that needs to be set to convert an upper case ASCII character to lower case */\nconst TO_LOWER_BIT = 0b10_0000;\nfunction isNumber(code) {\n    return code >= CharCodes.ZERO && code <= CharCodes.NINE;\n}\nfunction isHexadecimalCharacter(code) {\n    return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F) ||\n        (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F));\n}\nfunction isAsciiAlphaNumeric(code) {\n    return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z) ||\n        (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z) ||\n        isNumber(code));\n}\n/**\n * Checks if the given character is a valid end character for an entity in an attribute.\n *\n * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error.\n * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state\n * @param code Code point to decode.\n */\nfunction isEntityInAttributeInvalidEnd(code) {\n    return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code);\n}\nvar EntityDecoderState;\n(function (EntityDecoderState) {\n    EntityDecoderState[EntityDecoderState[\"EntityStart\"] = 0] = \"EntityStart\";\n    EntityDecoderState[EntityDecoderState[\"NumericStart\"] = 1] = \"NumericStart\";\n    EntityDecoderState[EntityDecoderState[\"NumericDecimal\"] = 2] = \"NumericDecimal\";\n    EntityDecoderState[EntityDecoderState[\"NumericHex\"] = 3] = \"NumericHex\";\n    EntityDecoderState[EntityDecoderState[\"NamedEntity\"] = 4] = \"NamedEntity\";\n})(EntityDecoderState || (EntityDecoderState = {}));\n/**\n * Decoding mode for named entities.\n */\nexport var DecodingMode;\n(function (DecodingMode) {\n    /** Entities in text nodes that can end with any character. */\n    DecodingMode[DecodingMode[\"Legacy\"] = 0] = \"Legacy\";\n    /** Only allow entities terminated with a semicolon. */\n    DecodingMode[DecodingMode[\"Strict\"] = 1] = \"Strict\";\n    /** Entities in attributes have limitations on ending characters. */\n    DecodingMode[DecodingMode[\"Attribute\"] = 2] = \"Attribute\";\n})(DecodingMode || (DecodingMode = {}));\n/**\n * Token decoder with support of writing partial entities.\n */\nexport class EntityDecoder {\n    decodeTree;\n    emitCodePoint;\n    errors;\n    constructor(\n    /** The tree used to decode entities. */\n    // biome-ignore lint/correctness/noUnusedPrivateClassMembers: False positive\n    decodeTree, \n    /**\n     * The function that is called when a codepoint is decoded.\n     *\n     * For multi-byte named entities, this will be called multiple times,\n     * with the second codepoint, and the same `consumed` value.\n     * @param codepoint The decoded codepoint.\n     * @param consumed The number of bytes consumed by the decoder.\n     */\n    emitCodePoint, \n    /** An object that is used to produce errors. */\n    errors) {\n        this.decodeTree = decodeTree;\n        this.emitCodePoint = emitCodePoint;\n        this.errors = errors;\n    }\n    /** The current state of the decoder. */\n    state = EntityDecoderState.EntityStart;\n    /** Characters that were consumed while parsing an entity. */\n    consumed = 1;\n    /**\n     * The result of the entity.\n     *\n     * Either the result index of a numeric entity, or the codepoint of a\n     * numeric entity.\n     */\n    result = 0;\n    /** The current index in the decode tree. */\n    treeIndex = 0;\n    /** The number of characters that were consumed in excess. */\n    excess = 1;\n    /** The mode in which the decoder is operating. */\n    decodeMode = DecodingMode.Strict;\n    /** The number of characters that have been consumed in the current run. */\n    runConsumed = 0;\n    /**\n     * Resets the instance to make it reusable.\n     * @param decodeMode Entity decoding mode to use.\n     */\n    startEntity(decodeMode) {\n        this.decodeMode = decodeMode;\n        this.state = EntityDecoderState.EntityStart;\n        this.result = 0;\n        this.treeIndex = 0;\n        this.excess = 1;\n        this.consumed = 1;\n        this.runConsumed = 0;\n    }\n    /**\n     * Write an entity to the decoder. This can be called multiple times with partial entities.\n     * If the entity is incomplete, the decoder will return -1.\n     *\n     * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the\n     * entity is incomplete, and resume when the next string is written.\n     * @param input The string containing the entity (or a continuation of the entity).\n     * @param offset The offset at which the entity begins. Should be 0 if this is not the first call.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    write(input, offset) {\n        switch (this.state) {\n            case EntityDecoderState.EntityStart: {\n                if (input.charCodeAt(offset) === CharCodes.NUM) {\n                    this.state = EntityDecoderState.NumericStart;\n                    this.consumed += 1;\n                    return this.stateNumericStart(input, offset + 1);\n                }\n                this.state = EntityDecoderState.NamedEntity;\n                return this.stateNamedEntity(input, offset);\n            }\n            case EntityDecoderState.NumericStart: {\n                return this.stateNumericStart(input, offset);\n            }\n            case EntityDecoderState.NumericDecimal: {\n                return this.stateNumericDecimal(input, offset);\n            }\n            case EntityDecoderState.NumericHex: {\n                return this.stateNumericHex(input, offset);\n            }\n            case EntityDecoderState.NamedEntity: {\n                return this.stateNamedEntity(input, offset);\n            }\n        }\n    }\n    /**\n     * Switches between the numeric decimal and hexadecimal states.\n     *\n     * Equivalent to the `Numeric character reference state` in the HTML spec.\n     * @param input The string containing the entity (or a continuation of the entity).\n     * @param offset The current offset.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    stateNumericStart(input, offset) {\n        if (offset >= input.length) {\n            return -1;\n        }\n        if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {\n            this.state = EntityDecoderState.NumericHex;\n            this.consumed += 1;\n            return this.stateNumericHex(input, offset + 1);\n        }\n        this.state = EntityDecoderState.NumericDecimal;\n        return this.stateNumericDecimal(input, offset);\n    }\n    /**\n     * Parses a hexadecimal numeric entity.\n     *\n     * Equivalent to the `Hexademical character reference state` in the HTML spec.\n     * @param input The string containing the entity (or a continuation of the entity).\n     * @param offset The current offset.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    stateNumericHex(input, offset) {\n        while (offset < input.length) {\n            const char = input.charCodeAt(offset);\n            if (isNumber(char) || isHexadecimalCharacter(char)) {\n                // Convert hex digit to value (0-15); 'a'/'A' -> 10.\n                const digit = char <= CharCodes.NINE\n                    ? char - CharCodes.ZERO\n                    : (char | TO_LOWER_BIT) - CharCodes.LOWER_A + 10;\n                this.result = this.result * 16 + digit;\n                this.consumed++;\n                offset++;\n            }\n            else {\n                return this.emitNumericEntity(char, 3);\n            }\n        }\n        return -1; // Incomplete entity\n    }\n    /**\n     * Parses a decimal numeric entity.\n     *\n     * Equivalent to the `Decimal character reference state` in the HTML spec.\n     * @param input The string containing the entity (or a continuation of the entity).\n     * @param offset The current offset.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    stateNumericDecimal(input, offset) {\n        while (offset < input.length) {\n            const char = input.charCodeAt(offset);\n            if (isNumber(char)) {\n                this.result = this.result * 10 + (char - CharCodes.ZERO);\n                this.consumed++;\n                offset++;\n            }\n            else {\n                return this.emitNumericEntity(char, 2);\n            }\n        }\n        return -1; // Incomplete entity\n    }\n    /**\n     * Validate and emit a numeric entity.\n     *\n     * Implements the logic from the `Hexademical character reference start\n     * state` and `Numeric character reference end state` in the HTML spec.\n     * @param lastCp The last code point of the entity. Used to see if the\n     *               entity was terminated with a semicolon.\n     * @param expectedLength The minimum number of characters that should be\n     *                       consumed. Used to validate that at least one digit\n     *                       was consumed.\n     * @returns The number of characters that were consumed.\n     */\n    emitNumericEntity(lastCp, expectedLength) {\n        // Ensure we consumed at least one digit.\n        if (this.consumed <= expectedLength) {\n            this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);\n            return 0;\n        }\n        // Figure out if this is a legit end of the entity\n        if (lastCp === CharCodes.SEMI) {\n            this.consumed += 1;\n        }\n        else if (this.decodeMode === DecodingMode.Strict) {\n            return 0;\n        }\n        this.emitCodePoint(replaceCodePoint(this.result), this.consumed);\n        if (this.errors) {\n            if (lastCp !== CharCodes.SEMI) {\n                this.errors.missingSemicolonAfterCharacterReference();\n            }\n            this.errors.validateNumericCharacterReference(this.result);\n        }\n        return this.consumed;\n    }\n    /**\n     * Parses a named entity.\n     *\n     * Equivalent to the `Named character reference state` in the HTML spec.\n     * @param input The string containing the entity (or a continuation of the entity).\n     * @param offset The current offset.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    stateNamedEntity(input, offset) {\n        const { decodeTree } = this;\n        let current = decodeTree[this.treeIndex];\n        // The length is the number of bytes of the value, including the current byte.\n        let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n        while (offset < input.length) {\n            // Handle compact runs (possibly inline): valueLength == 0 and SEMI_REQUIRED bit set.\n            if (valueLength === 0 && (current & BinTrieFlags.FLAG13) !== 0) {\n                const runLength = (current & BinTrieFlags.BRANCH_LENGTH) >> 7; /* 2..63 */\n                // If we are starting a run, check the first char.\n                if (this.runConsumed === 0) {\n                    const firstChar = current & BinTrieFlags.JUMP_TABLE;\n                    if (input.charCodeAt(offset) !== firstChar) {\n                        return this.result === 0\n                            ? 0\n                            : this.emitNotTerminatedNamedEntity();\n                    }\n                    offset++;\n                    this.excess++;\n                    this.runConsumed++;\n                }\n                // Check remaining characters in the run.\n                while (this.runConsumed < runLength) {\n                    if (offset >= input.length) {\n                        return -1;\n                    }\n                    const charIndexInPacked = this.runConsumed - 1;\n                    const packedWord = decodeTree[this.treeIndex + 1 + (charIndexInPacked >> 1)];\n                    const expectedChar = charIndexInPacked % 2 === 0\n                        ? packedWord & 0xff\n                        : (packedWord >> 8) & 0xff;\n                    if (input.charCodeAt(offset) !== expectedChar) {\n                        this.runConsumed = 0;\n                        return this.result === 0\n                            ? 0\n                            : this.emitNotTerminatedNamedEntity();\n                    }\n                    offset++;\n                    this.excess++;\n                    this.runConsumed++;\n                }\n                this.runConsumed = 0;\n                this.treeIndex += 1 + (runLength >> 1);\n                current = decodeTree[this.treeIndex];\n                valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n            }\n            if (offset >= input.length)\n                break;\n            const char = input.charCodeAt(offset);\n            /*\n             * Implicit semicolon handling for nodes that require a semicolon but\n             * don't have an explicit ';' branch stored in the trie. If we have\n             * a value on the current node, it requires a semicolon, and the\n             * current input character is a semicolon, emit the entity using the\n             * current node (without descending further).\n             */\n            if (char === CharCodes.SEMI &&\n                valueLength !== 0 &&\n                (current & BinTrieFlags.FLAG13) !== 0) {\n                return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);\n            }\n            this.treeIndex = determineBranch(decodeTree, current, this.treeIndex + Math.max(1, valueLength), char);\n            if (this.treeIndex < 0) {\n                return this.result === 0 ||\n                    // If we are parsing an attribute\n                    (this.decodeMode === DecodingMode.Attribute &&\n                        // We shouldn't have consumed any characters after the entity,\n                        (valueLength === 0 ||\n                            // And there should be no invalid characters.\n                            isEntityInAttributeInvalidEnd(char)))\n                    ? 0\n                    : this.emitNotTerminatedNamedEntity();\n            }\n            current = decodeTree[this.treeIndex];\n            valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n            // If the branch is a value, store it and continue\n            if (valueLength !== 0) {\n                // If the entity is terminated by a semicolon, we are done.\n                if (char === CharCodes.SEMI) {\n                    return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);\n                }\n                // If we encounter a non-terminated (legacy) entity while parsing strictly, then ignore it.\n                if (this.decodeMode !== DecodingMode.Strict &&\n                    (current & BinTrieFlags.FLAG13) === 0) {\n                    this.result = this.treeIndex;\n                    this.consumed += this.excess;\n                    this.excess = 0;\n                }\n            }\n            // Increment offset & excess for next iteration\n            offset++;\n            this.excess++;\n        }\n        return -1;\n    }\n    /**\n     * Emit a named entity that was not terminated with a semicolon.\n     * @returns The number of characters consumed.\n     */\n    emitNotTerminatedNamedEntity() {\n        const { result, decodeTree } = this;\n        const valueLength = (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;\n        this.emitNamedEntityData(result, valueLength, this.consumed);\n        this.errors?.missingSemicolonAfterCharacterReference();\n        return this.consumed;\n    }\n    /**\n     * Emit a named entity.\n     * @param result The index of the entity in the decode tree.\n     * @param valueLength The number of bytes in the entity.\n     * @param consumed The number of characters consumed.\n     * @returns The number of characters consumed.\n     */\n    emitNamedEntityData(result, valueLength, consumed) {\n        const { decodeTree } = this;\n        this.emitCodePoint(valueLength === 1\n            ? decodeTree[result] &\n                ~(BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13)\n            : decodeTree[result + 1], consumed);\n        if (valueLength === 3) {\n            // For multi-byte values, we need to emit the second byte.\n            this.emitCodePoint(decodeTree[result + 2], consumed);\n        }\n        return consumed;\n    }\n    /**\n     * Signal to the parser that the end of the input was reached.\n     *\n     * Remaining data will be emitted and relevant errors will be produced.\n     * @returns The number of characters consumed.\n     */\n    end() {\n        switch (this.state) {\n            case EntityDecoderState.NamedEntity: {\n                // Emit a named entity if we have one.\n                return this.result !== 0 &&\n                    (this.decodeMode !== DecodingMode.Attribute ||\n                        this.result === this.treeIndex)\n                    ? this.emitNotTerminatedNamedEntity()\n                    : 0;\n            }\n            // Otherwise, emit a numeric entity if we have one.\n            case EntityDecoderState.NumericDecimal: {\n                return this.emitNumericEntity(0, 2);\n            }\n            case EntityDecoderState.NumericHex: {\n                return this.emitNumericEntity(0, 3);\n            }\n            case EntityDecoderState.NumericStart: {\n                this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);\n                return 0;\n            }\n            case EntityDecoderState.EntityStart: {\n                // Return 0 if we have no entity.\n                return 0;\n            }\n        }\n    }\n}\n/**\n * Creates a function that decodes entities in a string.\n * @param decodeTree The decode tree.\n * @returns A function that decodes entities in a string.\n */\nfunction getDecoder(decodeTree) {\n    let returnValue = \"\";\n    const decoder = new EntityDecoder(decodeTree, (data) => (returnValue += String.fromCodePoint(data)));\n    return function decodeWithTrie(input, decodeMode) {\n        let lastIndex = 0;\n        let offset = 0;\n        while ((offset = input.indexOf(\"&\", offset)) >= 0) {\n            returnValue += input.slice(lastIndex, offset);\n            decoder.startEntity(decodeMode);\n            const length = decoder.write(input, \n            // Skip the \"&\"\n            offset + 1);\n            if (length < 0) {\n                lastIndex = offset + decoder.end();\n                break;\n            }\n            lastIndex = offset + length;\n            // If `length` is 0, skip the current `&` and continue.\n            offset = length === 0 ? lastIndex + 1 : lastIndex;\n        }\n        const result = returnValue + input.slice(lastIndex);\n        // Make sure we don't keep a reference to the final string.\n        returnValue = \"\";\n        return result;\n    };\n}\n/**\n * Determines the branch of the current node that is taken given the current\n * character. This function is used to traverse the trie.\n * @param decodeTree The trie.\n * @param current The current node.\n * @param nodeIndex Index immediately after the current node header.\n * @param char The current character.\n * @returns The index of the next node, or -1 if no branch is taken.\n */\nexport function determineBranch(decodeTree, current, nodeIndex, char) {\n    const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;\n    const jumpOffset = current & BinTrieFlags.JUMP_TABLE;\n    // Case 1: Single branch encoded in jump offset\n    if (branchCount === 0) {\n        return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1;\n    }\n    // Case 2: Multiple branches encoded in jump table\n    if (jumpOffset) {\n        const value = char - jumpOffset;\n        return value < 0 || value >= branchCount\n            ? -1\n            : decodeTree[nodeIndex + value] - 1;\n    }\n    // Case 3: Multiple branches encoded in packed dictionary (two keys per uint16)\n    const packedKeySlots = (branchCount + 1) >> 1;\n    /*\n     * Treat packed keys as a virtual sorted array of length `branchCount`.\n     * Key(i) = low byte for even i, high byte for odd i in slot i>>1.\n     */\n    let lo = 0;\n    let hi = branchCount - 1;\n    while (lo <= hi) {\n        const mid = (lo + hi) >>> 1;\n        const slot = mid >> 1;\n        const packed = decodeTree[nodeIndex + slot];\n        const midKey = (packed >> ((mid & 1) * 8)) & 0xff;\n        if (midKey < char) {\n            lo = mid + 1;\n        }\n        else if (midKey > char) {\n            hi = mid - 1;\n        }\n        else {\n            return decodeTree[nodeIndex + packedKeySlots + mid];\n        }\n    }\n    return -1;\n}\nconst htmlDecoder = /* #__PURE__ */ getDecoder(htmlDecodeTree);\nconst xmlDecoder = /* #__PURE__ */ getDecoder(xmlDecodeTree);\n/**\n * Decodes an HTML string.\n * @param htmlString The string to decode.\n * @param mode The decoding mode.\n * @returns The decoded string.\n */\nexport function decodeHTML(htmlString, mode = DecodingMode.Legacy) {\n    return htmlDecoder(htmlString, mode);\n}\n/**\n * Decodes an HTML string in an attribute.\n * @param htmlAttribute The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLAttribute(htmlAttribute) {\n    return htmlDecoder(htmlAttribute, DecodingMode.Attribute);\n}\n/**\n * Decodes an HTML string, requiring all entities to be terminated by a semicolon.\n * @param htmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLStrict(htmlString) {\n    return htmlDecoder(htmlString, DecodingMode.Strict);\n}\n/**\n * Decodes an XML string, requiring all entities to be terminated by a semicolon.\n * @param xmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeXML(xmlString) {\n    return xmlDecoder(xmlString, DecodingMode.Strict);\n}\nexport { replaceCodePoint } from \"./decode-codepoint.js\";\n// Re-export for use by eg. htmlparser2\nexport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nexport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\n//# sourceMappingURL=decode.js.map","/**\n * Common utility functions exposed through `md.utils` for use by plugins.\n *\n * @module md.utils\n */\n\nimport * as mdurl from 'mdurl'\nimport * as ucmicro from 'uc.micro'\nimport { decodeHTMLStrict } from 'entities'\n\n/** @hidden */\ntype ClassToWrap = new (...args: any[]) => object\n\n/** Wraps a class so it can be called with or without `new`. */\nfunction callable<T extends ClassToWrap> (\n  cls: T\n): T & ((...args: ConstructorParameters<T>) => InstanceType<T>)\nfunction callable<T extends ClassToWrap> (cls: T) {\n  const wrapper = function (...args: ConstructorParameters<T>) {\n    const newTarget =\n      new.target && new.target !== wrapper\n        ? new.target\n        : cls\n\n    return Reflect.construct(cls, args, newTarget)\n  }\n\n  Object.defineProperty(wrapper, 'name', { value: cls.name })\n  Object.setPrototypeOf(wrapper, cls)\n  wrapper.prototype = cls.prototype\n\n  return wrapper\n}\n\n/**\n * Returns a copy of a token array with the token at `pos` replaced by\n * `newElements`. Used to transform token streams without modifying the\n * original array.\n */\nfunction arrayReplaceAt<T> (src: T[], pos: number, newElements: T[]): T[] {\n  return ([] as T[]).concat(src.slice(0, pos), newElements, src.slice(pos + 1))\n}\n\n/** Checks whether a code point can be decoded from a numeric HTML entity. */\nfunction isValidEntityCode (c: number) {\n  // broken sequence\n  if (c >= 0xD800 && c <= 0xDFFF) { return false }\n  // never used\n  if (c >= 0xFDD0 && c <= 0xFDEF) { return false }\n  if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false }\n  // control codes\n  if (c >= 0x00 && c <= 0x08) { return false }\n  if (c === 0x0B) { return false }\n  if (c >= 0x0E && c <= 0x1F) { return false }\n  if (c >= 0x7F && c <= 0x9F) { return false }\n  // out of range\n  if (c > 0x10FFFF) { return false }\n  return true\n}\n\n/**\n * Converts a Unicode code point to a string, like `String.fromCodePoint()`,\n * but does not throw for invalid input.\n */\nfunction fromCodePoint (c: number) {\n  /* eslint no-bitwise:0 */\n  if (c > 0xffff) {\n    c -= 0x10000\n    const surrogate1 = 0xd800 + (c >> 10)\n    const surrogate2 = 0xdc00 + (c & 0x3ff)\n\n    return String.fromCharCode(surrogate1, surrogate2)\n  }\n  return String.fromCharCode(c)\n}\n\nconst UNESCAPE_MD_RE = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~])/g\nconst ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi\nconst UNESCAPE_ALL_RE = new RegExp(`${UNESCAPE_MD_RE.source}|${ENTITY_RE.source}`, 'gi')\n\nconst DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i\n\nfunction replaceEntityPattern (match: string, name: string) {\n  if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {\n    const code = name[1].toLowerCase() === 'x'\n      ? parseInt(name.slice(2), 16)\n      : parseInt(name.slice(1), 10)\n\n    if (isValidEntityCode(code)) {\n      return fromCodePoint(code)\n    }\n\n    return match\n  }\n\n  const decoded = decodeHTMLStrict(match)\n  if (decoded !== match) {\n    return decoded\n  }\n\n  return match\n}\n\n/** Decodes Markdown backslash escapes. */\nfunction unescapeMd (str: string) {\n  if (str.indexOf('\\\\') < 0) { return str }\n  return str.replace(UNESCAPE_MD_RE, '$1')\n}\n\n/**\n * Decodes Markdown backslash escapes and HTML character references in link\n * destinations, link titles, and fenced code info strings.\n */\nfunction unescapeAll (str: string) {\n  if (str.indexOf('\\\\') < 0 && str.indexOf('&') < 0) { return str }\n\n  return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {\n    if (escaped) { return escaped }\n    return replaceEntityPattern(match, entity)\n  })\n}\n\nconst HTML_ESCAPE_TEST_RE = /[&<>\"]/\nconst HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g\nconst HTML_REPLACEMENTS = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;'\n}\n\nfunction replaceUnsafeChar (ch: string): string {\n  return HTML_REPLACEMENTS[ch as keyof typeof HTML_REPLACEMENTS]\n}\n\n/** Escapes HTML special characters in a string. */\nfunction escapeHtml (str: string) {\n  if (HTML_ESCAPE_TEST_RE.test(str)) {\n    return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar)\n  }\n  return str\n}\n\nconst REGEXP_ESCAPE_RE = /[.?*+^$[\\]\\\\(){}|-]/g\n\n/** Escapes regular expression metacharacters in a string. */\nfunction escapeRE (str: string) {\n  return str.replace(REGEXP_ESCAPE_RE, '\\\\$&')\n}\n\n/** Checks whether a character code is an ASCII space or tab. */\nfunction isSpace (code: number) {\n  switch (code) {\n    case 0x09:\n    case 0x20:\n      return true\n  }\n  return false\n}\n\n/**\n * Checks whether a character code is whitespace recognized by Markdown.\n *\n * Matches the Unicode `Zs` category or `\\t`, `\\f`, `\\v`, `\\r`, `\\n`.\n */\nfunction isWhiteSpace (code: number) {\n  if (code >= 0x2000 && code <= 0x200A) { return true }\n  switch (code) {\n    case 0x09: // \\t\n    case 0x0A: // \\n\n    case 0x0B: // \\v\n    case 0x0C: // \\f\n    case 0x0D: // \\r\n    case 0x20:\n    case 0xA0:\n    case 0x1680:\n    case 0x202F:\n    case 0x205F:\n    case 0x3000:\n      return true\n  }\n  return false\n}\n\n/**\n * Checks whether a character is Unicode punctuation or a symbol.\n *\n * Does not support astral characters.\n */\nfunction isPunctChar (ch: string) {\n  return ucmicro.P.test(ch) || ucmicro.S.test(ch)\n}\n\n/** Checks whether a Unicode code point is punctuation or a symbol. */\nfunction isPunctCharCode (code: number) {\n  return isPunctChar(fromCodePoint(code))\n}\n\n/**\n * Markdown ASCII punctuation characters.\n *\n *     !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @,\n *     [, \\, ], ^, _, `, {, |, }, or ~\n *\n * http://spec.commonmark.org/0.15/#ascii-punctuation-character\n *\n * Don't confuse with Unicode punctuation. It lacks some characters in the\n * ASCII range.\n */\nfunction isMdAsciiPunct (ch: number) {\n  switch (ch) {\n    case 0x21/* ! */:\n    case 0x22/* \" */:\n    case 0x23/* # */:\n    case 0x24/* $ */:\n    case 0x25/* % */:\n    case 0x26/* & */:\n    case 0x27/* ' */:\n    case 0x28/* ( */:\n    case 0x29/* ) */:\n    case 0x2A/* * */:\n    case 0x2B/* + */:\n    case 0x2C/* , */:\n    case 0x2D/* - */:\n    case 0x2E/* . */:\n    case 0x2F/* / */:\n    case 0x3A/* : */:\n    case 0x3B/* ; */:\n    case 0x3C/* < */:\n    case 0x3D/* = */:\n    case 0x3E/* > */:\n    case 0x3F/* ? */:\n    case 0x40/* @ */:\n    case 0x5B/* [ */:\n    case 0x5C/* \\ */:\n    case 0x5D/* ] */:\n    case 0x5E/* ^ */:\n    case 0x5F/* _ */:\n    case 0x60/* ` */:\n    case 0x7B/* { */:\n    case 0x7C/* | */:\n    case 0x7D/* } */:\n    case 0x7E/* ~ */:\n      return true\n    default:\n      return false\n  }\n}\n\n/** Normalizes `[reference labels]` for case-insensitive lookup. */\nfunction normalizeReference (str: string) {\n  // Trim and collapse whitespace\n  //\n  str = str.trim().replace(/\\s+/g, ' ')\n\n  // .toLowerCase().toUpperCase() should get rid of all differences\n  // between letter variants.\n  //\n  // Simple .toLowerCase() doesn't normalize 125 code points correctly,\n  // and .toUpperCase doesn't normalize 6 of them (list of exceptions:\n  // İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently\n  // uppercased versions).\n  //\n  // Here's an example showing how it happens. Lets take greek letter omega:\n  // uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ)\n  //\n  // Unicode entries:\n  // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;\n  // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398\n  // 03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398\n  // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;\n  //\n  // Case-insensitive comparison should treat all of them as equivalent.\n  //\n  // But .toLowerCase() doesn't change ϑ (it's already lowercase),\n  // and .toUpperCase() doesn't change ϴ (already uppercase).\n  //\n  // Applying first lower then upper case normalizes any character:\n  // '\\u0398\\u03f4\\u03b8\\u03d1'.toLowerCase().toUpperCase() === '\\u0398\\u0398\\u0398\\u0398'\n  //\n  // Note: this is equivalent to unicode case folding; unicode normalization\n  // is a different step that is not required here.\n  //\n  // Final result should be uppercased, because it's later stored in an object\n  // (this avoid a conflict with Object.prototype members,\n  // most notably, `__proto__`)\n  //\n  return str.toLowerCase().toUpperCase()\n}\n\nfunction isAsciiTrimmable (c: number) {\n  return c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d\n}\n\n/**\n * \"Light\" `.trim()` for blocks (headings, paragraphs), where Unicode spaces\n * should be preserved.\n */\nfunction asciiTrim (str: string) {\n  let start = 0\n  for (; start < str.length; start++) {\n    if (!isAsciiTrimmable(str.charCodeAt(start))) {\n      break\n    }\n  }\n  let end = str.length - 1\n  for (; end >= start; end--) {\n    if (!isAsciiTrimmable(str.charCodeAt(end))) {\n      break\n    }\n  }\n  return str.slice(start, end + 1)\n}\n\n/**\n * Libraries commonly used by markdown-it and its plugins, re-exported to\n * reduce duplicate dependencies in browser bundles.\n */\nconst lib = { mdurl, ucmicro }\n\nexport {\n  lib,\n  callable,\n  unescapeMd,\n  unescapeAll,\n  isValidEntityCode,\n  fromCodePoint,\n  escapeHtml,\n  arrayReplaceAt,\n  isSpace,\n  isWhiteSpace,\n  isMdAsciiPunct,\n  isPunctChar,\n  isPunctCharCode,\n  escapeRE,\n  normalizeReference,\n  asciiTrim\n}\n","import type StateInline from '../rules_inline/state_inline.ts'\n\n/** Finds the end of a link or image label (`[label]`). */\nexport default function parseLinkLabel (state: StateInline, start: number, disableNested?: boolean): number {\n  let level, found, marker, prevPos\n\n  const max = state.posMax\n  const oldPos = state.pos\n\n  state.pos = start + 1\n  level = 1\n\n  while (state.pos < max) {\n    marker = state.src.charCodeAt(state.pos)\n    if (marker === 0x5D /* ] */) {\n      level--\n      if (level === 0) {\n        found = true\n        break\n      }\n    }\n\n    prevPos = state.pos\n    state.md.inline.skipToken(state)\n    if (marker === 0x5B /* [ */) {\n      if (prevPos === state.pos - 1) {\n        // increase level if we find text `[`, which is not a part of any token\n        level++\n      } else if (disableNested) {\n        state.pos = oldPos\n        return -1\n      }\n    }\n  }\n\n  let labelEnd = -1\n\n  if (found) {\n    labelEnd = state.pos\n  }\n\n  // restore old state\n  state.pos = oldPos\n\n  return labelEnd\n}\n","import { unescapeAll } from '../common/utils.ts'\n\n/** Parses the destination in `[label](destination \"title\")`. */\nexport default function parseLinkDestination (str: string, start: number, max: number) {\n  let code\n  let pos = start\n\n  const result = {\n    ok: false,\n    pos: 0,\n    str: ''\n  }\n\n  if (str.charCodeAt(pos) === 0x3C /* < */) {\n    pos++\n    while (pos < max) {\n      code = str.charCodeAt(pos)\n      if (code === 0x0A /* \\n */) { return result }\n      if (code === 0x3C /* < */) { return result }\n      if (code === 0x3E /* > */) {\n        result.pos = pos + 1\n        result.str = unescapeAll(str.slice(start + 1, pos))\n        result.ok = true\n        return result\n      }\n      if (code === 0x5C /* \\ */ && pos + 1 < max) {\n        pos += 2\n        continue\n      }\n\n      pos++\n    }\n\n    // no closing '>'\n    return result\n  }\n\n  // this should be ... } else { ... branch\n\n  let level = 0\n  while (pos < max) {\n    code = str.charCodeAt(pos)\n\n    if (code === 0x20) { break }\n\n    // ascii control characters\n    if (code < 0x20 || code === 0x7F) { break }\n\n    if (code === 0x5C /* \\ */ && pos + 1 < max) {\n      if (str.charCodeAt(pos + 1) === 0x20) { pos++; continue }\n      pos += 2\n      continue\n    }\n\n    if (code === 0x28 /* ( */) {\n      level++\n      if (level > 32) { return result }\n    }\n\n    if (code === 0x29 /* ) */) {\n      if (level === 0) { break }\n      level--\n    }\n\n    pos++\n  }\n\n  if (start === pos) { return result }\n  if (level !== 0) { return result }\n\n  result.str = unescapeAll(str.slice(start, pos))\n  result.pos = pos\n  result.ok = true\n  return result\n}\n","import { unescapeAll } from '../common/utils.ts'\n\n/** @inline */\ninterface ParseLinkTitleResult {\n  ok: boolean\n  can_continue: boolean\n  pos: number\n  str: string\n  marker: number\n}\n\n/**\n * Parses the optional title in `[label](destination \"title\")` or\n * `[label]: destination \"title\"`.\n *\n * `prev_state` continues a reference title on the next source line.\n */\nexport default function parseLinkTitle (\n  str: string,\n  start: number,\n  max: number,\n  prev_state?: ParseLinkTitleResult\n): ParseLinkTitleResult {\n  let code\n  let pos = start\n\n  const state = {\n    // if `true`, this is a valid link title\n    ok: false,\n    // if `true`, this link can be continued on the next line\n    can_continue: false,\n    // if `ok`, it's the position of the first character after the closing marker\n    pos: 0,\n    // if `ok`, it's the unescaped title\n    str: '',\n    // expected closing marker character code\n    marker: 0\n  }\n\n  if (prev_state) {\n    // this is a continuation of a previous parseLinkTitle call on the next line,\n    // used in reference links only\n    state.str = prev_state.str\n    state.marker = prev_state.marker\n  } else {\n    if (pos >= max) { return state }\n\n    let marker = str.charCodeAt(pos)\n    if (marker !== 0x22 /* \" */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { return state }\n\n    start++\n    pos++\n\n    // if opening marker is \"(\", switch it to closing marker \")\"\n    if (marker === 0x28) { marker = 0x29 }\n\n    state.marker = marker\n  }\n\n  while (pos < max) {\n    code = str.charCodeAt(pos)\n    if (code === state.marker) {\n      state.pos = pos + 1\n      state.str += unescapeAll(str.slice(start, pos))\n      state.ok = true\n      return state\n    } else if (code === 0x28 /* ( */ && state.marker === 0x29 /* ) */) {\n      return state\n    } else if (code === 0x5C /* \\ */ && pos + 1 < max) {\n      pos++\n    }\n\n    pos++\n  }\n\n  // no closing marker found, but this link title may continue on the next line (for references)\n  state.can_continue = true\n  state.str += unescapeAll(str.slice(start, pos))\n  return state\n}\n","/**\n * Functions used to parse links and images, split out of parser rules because\n * of their size.\n *\n * @module md.helpers\n */\n\n// Just a shortcut for bulk export\n\nimport parseLinkLabel from './parse_link_label.ts'\nimport parseLinkDestination from './parse_link_destination.ts'\nimport parseLinkTitle from './parse_link_title.ts'\n\nexport {\n  parseLinkLabel,\n  parseLinkDestination,\n  parseLinkTitle\n}\n","// Token class\n\n/** @inline */\ntype TokenNesting = -1 | 0 | 1\n\n/** @inline */\ntype TokenAttribute = [name: string, value: string | number]\n\n/**\n * Represents one item in the parsed token stream, storing parsed data and\n * providing helpers for managing HTML attributes.\n */\nclass Token {\n  /**\n   * Type of the token (string, e.g. \"paragraph_open\")\n   */\n  declare type: string\n\n  /**\n   * html tag name, e.g. \"p\"\n   */\n  declare tag: string\n\n  /** Html attributes. Format: `[ [ name1, value1 ], [ name2, value2 ] ]` */\n  declare attrs: TokenAttribute[] | null\n\n  /**\n   * Source map info. Format: `[ line_begin, line_end ]`\n   */\n  map: [number, number] | null = null\n\n  /**\n   * Level change (number in {-1, 0, 1} set), where:\n   *\n   * -  `1` means the tag is opening\n   * -  `0` means the tag is self-closing\n   * - `-1` means the tag is closing\n   */\n  declare nesting: TokenNesting\n\n  /**\n   * nesting level, the same as `state.level`\n   */\n  level = 0\n\n  /**\n   * An array of child nodes (inline and img tokens)\n   */\n  children: Token[] | null = null\n\n  /**\n   * In a case of self-closing tag (code, html, fence, etc.),\n   * it has contents of this tag.\n   */\n  content = ''\n\n  /**\n   * '*' or '_' for emphasis, fence string for fence, etc.\n   */\n  markup = ''\n\n  /**\n   * Additional information:\n   *\n   * - Info string for \"fence\" tokens\n   * - The value \"auto\" for autolink \"link_open\" and \"link_close\" tokens\n   * - The string value of the item marker for ordered-list \"list_item_open\" tokens\n   */\n  info = ''\n\n  /** A place for plugins to store an arbitrary data */\n  declare meta: Record<string, unknown> | null\n\n  /**\n   * True for block-level tokens, false for inline tokens.\n   * Used in renderer to calculate line breaks\n   */\n  block = false\n\n  /**\n   * If it's true, ignore this element when rendering. Used for tight lists\n   * to hide paragraphs.\n   */\n  hidden = false\n\n  constructor (type: string, tag: string, nesting: TokenNesting) {\n    this.type = type\n    this.tag = tag\n\n    this.attrs = null\n\n    this.nesting = nesting\n\n    this.meta = null\n  }\n\n  /**\n   * Search attribute index by name.\n   */\n  attrIndex (name: string): number {\n    if (!this.attrs) { return -1 }\n\n    const attrs = this.attrs\n\n    for (let i = 0, len = attrs.length; i < len; i++) {\n      if (attrs[i][0] === name) { return i }\n    }\n    return -1\n  }\n\n  /**\n   * Add `[ name, value ]` attribute to list. Init attrs if necessary\n   */\n  attrPush (attrData: TokenAttribute): void {\n    if (this.attrs) {\n      this.attrs.push(attrData)\n    } else {\n      this.attrs = [attrData]\n    }\n  }\n\n  /**\n   * Set `name` attribute to `value`. Override old value if exists.\n   */\n  attrSet (name: string, value: string | number): void {\n    const idx = this.attrIndex(name)\n    const attrData: TokenAttribute = [name, value]\n\n    if (idx < 0) {\n      this.attrPush(attrData)\n    } else {\n      this.attrs![idx] = attrData\n    }\n  }\n\n  /**\n   * Get the value of attribute `name`, or null if it does not exist.\n   */\n  attrGet (name: string): string | number | null {\n    const idx = this.attrIndex(name)\n    let value = null\n    if (idx >= 0) {\n      value = this.attrs![idx][1]\n    }\n    return value\n  }\n\n  /**\n   * Join value to existing attribute via space. Or create new attribute if not\n   * exists. Useful to operate with token classes.\n   */\n  attrJoin (name: string, value: string | number): void {\n    const idx = this.attrIndex(name)\n\n    if (idx < 0) {\n      this.attrPush([name, value])\n    } else {\n      this.attrs![idx][1] = `${this.attrs![idx][1]} ${value}`\n    }\n  }\n}\n\nexport default Token\n","/** @inline */\ntype RuleOptions = { alt?: string[] }\n\n/**\n * Helper class, used by {@link MarkdownIt.core}, {@link MarkdownIt.block} and\n * {@link MarkdownIt.inline} to manage sequences of functions (rules):\n *\n * - keep rules in defined order\n * - assign the name to each rule\n * - enable/disable rules\n * - add/replace rules\n * - allow assign rules to additional named chains (in the same)\n * - cacheing lists of active rules\n *\n * You will not need use this class directly until write plugins. For simple\n * rules control use {@link MarkdownIt.disable}, {@link MarkdownIt.enable} and\n * {@link MarkdownIt.use}.\n */\nclass Ruler<Args extends unknown[], Result> {\n  // List of added rules. Each element is:\n  //\n  // {\n  //   name: XXX,\n  //   enabled: Boolean,\n  //   fn: Function(),\n  //   alt: [ name2, name3 ]\n  // }\n  //\n  __rules__: Array<{\n    name: string\n    enabled: boolean\n    fn: (...args: Args) => Result\n    alt: string[]\n  }> = []\n\n  // Cached rule chains.\n  //\n  // First level - chain name, '' for default.\n  // Second level - diginal anchor for fast filtering by charcodes.\n  //\n  __cache__: Record<string, Array<(...args: Args) => Result>> | null = null\n\n  // Helper methods, should not be used directly\n\n  // Find rule index by name\n  //\n  __find__ (name: string): number {\n    for (let i = 0; i < this.__rules__.length; i++) {\n      if (this.__rules__[i].name === name) {\n        return i\n      }\n    }\n    return -1\n  }\n\n  // Build rules lookup cache\n  //\n  __compile__ (): void {\n    const chains = new Set<string>()\n\n    // collect unique names\n    this.__rules__.forEach(rule => {\n      if (!rule.enabled) return\n      rule.alt.forEach(altName => {\n        if (altName) chains.add(altName)\n      })\n    })\n\n    this.__cache__ = Object.create(null)\n\n    // Collect default chain\n    this.__cache__![''] = []\n    this.__rules__.forEach(rule => {\n      if (rule.enabled) this.__cache__![''].push(rule.fn)\n    })\n\n    // Collect alt chains\n    chains.forEach(chain => {\n      this.__cache__![chain] = []\n\n      this.__rules__.forEach(rule => {\n        if (rule.enabled && rule.alt.indexOf(chain) >= 0) {\n          this.__cache__![chain].push(rule.fn)\n        }\n      })\n    })\n  }\n\n  /**\n   * Replace rule by name with new function & options. Throws error if name not\n   * found.\n   *\n   * @param name Rule name to replace.\n   * @param fn New rule function.\n   * @param options Rule options. `alt` is an array with names of \"alternate\"\n   * chains.\n   *\n   * @example Replace existing typographer replacement rule with new one\n   * ```javascript\n   * import MarkdownIt from 'markdown-it'\n   * const md = new MarkdownIt()\n   *\n   * md.core.ruler.at('replacements', function replace(state) {\n   *   //...\n   * });\n   * ```\n   */\n  at (name: string, fn: (...args: Args) => Result, options: RuleOptions = {}): void {\n    const index = this.__find__(name)\n\n    if (index === -1) { throw new Error(`Parser rule not found: ${name}`) }\n\n    this.__rules__[index].fn = fn\n    this.__rules__[index].alt = options.alt || []\n    this.__cache__ = null\n  }\n\n  /**\n   * Add new rule to chain before one with given name. See also\n   * {@link Ruler.after}, {@link Ruler.push}.\n   *\n   * @param beforeName New rule will be added before this one.\n   * @param ruleName Name of added rule.\n   * @param fn Rule function.\n   * @param options Rule options. `alt` is an array with names of \"alternate\"\n   * chains.\n   *\n   * @example\n   * ```javascript\n   * import MarkdownIt from 'markdown-it'\n   * const md = new MarkdownIt()\n   *\n   * md.block.ruler.before('paragraph', 'my_rule', function replace(state) {\n   *   //...\n   * });\n   * ```\n   */\n  before (beforeName: string, ruleName: string, fn: (...args: Args) => Result, options: RuleOptions = {}): void {\n    const index = this.__find__(beforeName)\n\n    if (index === -1) { throw new Error(`Parser rule not found: ${beforeName}`) }\n\n    this.__rules__.splice(index, 0, {\n      name: ruleName,\n      enabled: true,\n      fn,\n      alt: options.alt || []\n    })\n\n    this.__cache__ = null\n  }\n\n  /**\n   * Add new rule to chain after one with given name. See also\n   * {@link Ruler.before}, {@link Ruler.push}.\n   *\n   * @param afterName New rule will be added after this one.\n   * @param ruleName Name of added rule.\n   * @param fn Rule function.\n   * @param options Rule options. `alt` is an array with names of \"alternate\"\n   * chains.\n   *\n   * @example\n   * ```javascript\n   * import MarkdownIt from 'markdown-it'\n   * const md = new MarkdownIt()\n   *\n   * md.inline.ruler.after('text', 'my_rule', function replace(state) {\n   *   //...\n   * });\n   * ```\n   */\n  after (afterName: string, ruleName: string, fn: (...args: Args) => Result, options: RuleOptions = {}): void {\n    const index = this.__find__(afterName)\n\n    if (index === -1) { throw new Error(`Parser rule not found: ${afterName}`) }\n\n    this.__rules__.splice(index + 1, 0, {\n      name: ruleName,\n      enabled: true,\n      fn,\n      alt: options.alt || []\n    })\n\n    this.__cache__ = null\n  }\n\n  /**\n   * Push new rule to the end of chain. See also\n   * {@link Ruler.before}, {@link Ruler.after}.\n   *\n   * @param ruleName Name of added rule.\n   * @param fn Rule function.\n   * @param options Rule options. `alt` is an array with names of \"alternate\"\n   * chains.\n   *\n   * @example\n   * ```javascript\n   * import MarkdownIt from 'markdown-it'\n   * const md = new MarkdownIt()\n   *\n   * md.core.ruler.push('my_rule', function replace(state) {\n   *   //...\n   * });\n   * ```\n   */\n  push (ruleName: string, fn: (...args: Args) => Result, options: RuleOptions = {}): void {\n    this.__rules__.push({\n      name: ruleName,\n      enabled: true,\n      fn,\n      alt: options.alt || []\n    })\n\n    this.__cache__ = null\n  }\n\n  /**\n   * Enable rules with given names. If any rule name not found - throw Error.\n   * Errors can be disabled by second param.\n   *\n   * See also {@link Ruler.disable}, {@link Ruler.enableOnly}.\n   *\n   * @param list List of rule names to enable.\n   * @param ignoreInvalid Set `true` to ignore errors when rule not found.\n   * @returns List of found rule names (if no exception happened).\n   */\n  enable (list: string | string[], ignoreInvalid = false): string[] {\n    if (!Array.isArray(list)) { list = [list] }\n\n    const result: string[] = []\n\n    // Search by name and enable\n    list.forEach(name => {\n      const idx = this.__find__(name)\n\n      if (idx < 0) {\n        if (ignoreInvalid) { return }\n        throw new Error(`Rules manager: invalid rule name ${name}`)\n      }\n      this.__rules__[idx].enabled = true\n      result.push(name)\n    })\n\n    this.__cache__ = null\n    return result\n  }\n\n  /**\n   * Enable rules with given names, and disable everything else. If any rule name\n   * not found - throw Error. Errors can be disabled by second param.\n   *\n   * See also {@link Ruler.disable}, {@link Ruler.enable}.\n   *\n   * @param list List of rule names to enable (whitelist).\n   * @param ignoreInvalid Set `true` to ignore errors when rule not found.\n   */\n  enableOnly (list: string | string[], ignoreInvalid = false): void {\n    if (!Array.isArray(list)) { list = [list] }\n\n    this.__rules__.forEach(rule => { rule.enabled = false })\n\n    this.enable(list, ignoreInvalid)\n  }\n\n  /**\n   * Disable rules with given names. If any rule name not found - throw Error.\n   * Errors can be disabled by second param.\n   *\n   * See also {@link Ruler.enable}, {@link Ruler.enableOnly}.\n   *\n   * @param list List of rule names to disable.\n   * @param ignoreInvalid Set `true` to ignore errors when rule not found.\n   * @returns List of found rule names (if no exception happened).\n   */\n  disable (list: string | string[], ignoreInvalid = false): string[] {\n    if (!Array.isArray(list)) { list = [list] }\n\n    const result: string[] = []\n\n    // Search by name and disable\n    list.forEach(name => {\n      const idx = this.__find__(name)\n\n      if (idx < 0) {\n        if (ignoreInvalid) { return }\n        throw new Error(`Rules manager: invalid rule name ${name}`)\n      }\n      this.__rules__[idx].enabled = false\n      result.push(name)\n    })\n\n    this.__cache__ = null\n    return result\n  }\n\n  /**\n   * Return array of active functions (rules) for given chain name. It analyzes\n   * rules configuration, compiles caches if not exists and returns result.\n   *\n   * Default chain name is `''` (empty string). It can't be skipped. That's\n   * done intentionally, to keep signature monomorphic for high speed.\n   */\n  getRules (chainName: string): Array<(...args: Args) => Result> {\n    if (!this.__cache__) this.__compile__()\n\n    // Chain can be empty, if rules disabled. But we still have to return Array.\n    return this.__cache__![chainName] || []\n  }\n}\n\nexport default Ruler\n","import { unescapeAll, escapeHtml } from './common/utils.ts'\nimport type Token from './token.ts'\nimport type { Env, MarkdownItOptions } from './types.ts'\n\n/** Function that renders a token at a given position in a token stream. */\nexport type RendererRule = (\n  tokens: Token[],\n  idx: number,\n  options: Required<MarkdownItOptions>,\n  env: Env | undefined,\n  renderer: Renderer\n) => string\n\nconst default_rules: Record<string, RendererRule> = {}\n\ndefault_rules.code_inline = function (\n  tokens: Token[],\n  idx: number,\n  options: Required<MarkdownItOptions>,\n  env: Env | undefined,\n  slf: Renderer\n): string {\n  const token = tokens[idx]\n\n  return `<code${slf.renderAttrs(token)}>${escapeHtml(token.content)}</code>`\n}\n\ndefault_rules.code_block = function (\n  tokens: Token[],\n  idx: number,\n  options: Required<MarkdownItOptions>,\n  env: Env | undefined,\n  slf: Renderer\n): string {\n  const token = tokens[idx]\n\n  return `<pre${slf.renderAttrs(token)}><code>${escapeHtml(tokens[idx].content)}</code></pre>\\n`\n}\n\ndefault_rules.fence = function (\n  tokens: Token[],\n  idx: number,\n  options: Required<MarkdownItOptions>,\n  env: Env | undefined,\n  slf: Renderer\n): string {\n  const token = tokens[idx]\n  const info = token.info ? unescapeAll(token.info).trim() : ''\n  let langName = ''\n  let langAttrs = ''\n\n  if (info) {\n    const arr = info.split(/(\\s+)/g)\n    langName = arr[0]\n    langAttrs = arr.slice(2).join('')\n  }\n\n  let highlighted\n  if (options.highlight) {\n    highlighted = options.highlight(token.content, langName, langAttrs) || escapeHtml(token.content)\n  } else {\n    highlighted = escapeHtml(token.content)\n  }\n\n  if (highlighted.indexOf('<pre') === 0) {\n    return highlighted + '\\n'\n  }\n\n  // If language exists, inject class gently, without modifying original token.\n  // May be, one day we will add .deepClone() for token and simplify this part, but\n  // now we prefer to keep things local.\n  if (info) {\n    const i = token.attrIndex('class')\n    const tmpAttrs = token.attrs ? token.attrs.slice() : []\n\n    if (i < 0) {\n      tmpAttrs.push(['class', `${options.langPrefix}${langName}`])\n    } else {\n      tmpAttrs[i] = [tmpAttrs[i][0], tmpAttrs[i][1]] // shallow clone\n      tmpAttrs[i][1] += ` ${options.langPrefix}${langName}`\n    }\n\n    // Fake token just to render attributes\n    const tmpToken = {\n      attrs: tmpAttrs\n    }\n\n    return `<pre><code${slf.renderAttrs(tmpToken)}>${highlighted}</code></pre>\\n`\n  }\n\n  return `<pre><code${slf.renderAttrs(token)}>${highlighted}</code></pre>\\n`\n}\n\ndefault_rules.image = function (\n  tokens: Token[],\n  idx: number,\n  options: Required<MarkdownItOptions>,\n  env: Env | undefined,\n  slf: Renderer\n): string {\n  const token = tokens[idx]\n\n  // \"alt\" attr MUST be set, even if empty. Because it's mandatory and\n  // should be placed on proper position for tests.\n  //\n  // Replace content with actual value\n\n  token.attrs![token.attrIndex('alt')][1] =\n    slf.renderInlineAsText(token.children!, options, env)\n\n  return slf.renderToken(tokens, idx, options)\n}\n\ndefault_rules.hardbreak = function (\n  tokens: Token[],\n  idx: number,\n  options: Required<MarkdownItOptions>\n): string {\n  return options.xhtmlOut ? '<br />\\n' : '<br>\\n'\n}\ndefault_rules.softbreak = function (\n  tokens: Token[],\n  idx: number,\n  options: Required<MarkdownItOptions>\n): string {\n  return options.breaks ? (options.xhtmlOut ? '<br />\\n' : '<br>\\n') : '\\n'\n}\n\ndefault_rules.text = function (tokens: Token[], idx: number): string {\n  return escapeHtml(tokens[idx].content)\n}\n\ndefault_rules.html_block = function (tokens: Token[], idx: number): string {\n  return tokens[idx].content\n}\ndefault_rules.html_inline = function (tokens: Token[], idx: number): string {\n  return tokens[idx].content\n}\n\n/**\n * Generates HTML from parsed token stream. Each instance has independent\n * copy of rules. Those can be rewritten with ease. Also, you can add new\n * rules if you create plugin and adds new token types.\n *\n * Creates new renderer instance and fills {@link Renderer.rules} with defaults.\n */\nclass Renderer {\n  /**\n   * Contains render rules for tokens. Can be updated and extended.\n   *\n   * See [source code](https://github.com/markdown-it/markdown-it/blob/master/src/renderer.ts)\n   * for more details and examples.\n   *\n   * @example Custom render rules\n   * ```javascript\n   * import MarkdownIt from 'markdown-it'\n   * const md = new MarkdownIt()\n   *\n   * md.renderer.rules.strong_open  = function () { return '<b>'; };\n   * md.renderer.rules.strong_close = function () { return '</b>'; };\n   *\n   * const result = md.renderInline(...);\n   * ```\n   *\n   * @example Each rule is called as independent static function with fixed signature\n   * ```javascript\n   * function my_token_render(tokens, idx, options, env, renderer) {\n   *   // ...\n   *   return renderedHTML;\n   * }\n   * ```\n   */\n  rules: Record<string, RendererRule> = Object.assign({}, default_rules)\n\n  /**\n   * Render token attributes to string.\n   */\n  renderAttrs (token: Pick<Token, 'attrs'>): string {\n    let i, l, result\n\n    if (!token.attrs) { return '' }\n\n    result = ''\n\n    for (i = 0, l = token.attrs.length; i < l; i++) {\n      result += ` ${escapeHtml(token.attrs[i][0])}=\"${escapeHtml(String(token.attrs[i][1]))}\"`\n    }\n\n    return result\n  }\n\n  /**\n   * Default token renderer. Can be overriden by custom function\n   * in {@link Renderer.rules}.\n   *\n   * @param tokens List of tokens.\n   * @param idx Token index to render.\n   * @param options Params of parser instance.\n   */\n  renderToken (tokens: Token[], idx: number, options: Required<MarkdownItOptions>): string {\n    const token = tokens[idx]\n    let result = ''\n\n    // Tight list paragraphs\n    if (token.hidden) {\n      return ''\n    }\n\n    // Insert a newline between hidden paragraph and subsequent opening\n    // block-level tag.\n    //\n    // For example, here we should insert a newline before blockquote:\n    //  - a\n    //    >\n    //\n    // Only closing hidden tokens count, to not break on other hidden ones.\n    //\n    // Hidden tokens without nesting (`reference_definition`) are skipped here\n    // and below, or they would break line feeds around neighbour blocks.\n    //\n    let prev = idx - 1\n    while (prev >= 0 && tokens[prev].hidden && tokens[prev].nesting === 0) { prev-- }\n\n    if (token.block && token.nesting !== -1 && prev >= 0 &&\n        tokens[prev].hidden && tokens[prev].nesting === -1) {\n      result += '\\n'\n    }\n\n    // Add token name, e.g. `<img`\n    result += (token.nesting === -1 ? '</' : '<') + token.tag\n\n    // Encode attributes, e.g. `<img src=\"foo\"`\n    result += this.renderAttrs(token)\n\n    // Add a slash for self-closing tags, e.g. `<img src=\"foo\" /`\n    if (token.nesting === 0 && options.xhtmlOut) {\n      result += ' /'\n    }\n\n    // Check if we need to add a newline after this tag\n    let needLf = false\n    if (token.block) {\n      needLf = true\n\n      if (token.nesting === 1) {\n        let next = idx + 1\n        while (next < tokens.length && tokens[next].hidden && tokens[next].nesting === 0) { next++ }\n\n        if (next < tokens.length) {\n          const nextToken = tokens[next]\n\n          if (nextToken.type === 'inline' || nextToken.hidden) {\n          // Block-level tag containing an inline tag.\n          //\n            needLf = false\n          } else if (nextToken.nesting === -1 && nextToken.tag === token.tag) {\n          // Opening tag + closing tag of the same type. E.g. `<li></li>`.\n          //\n            needLf = false\n          }\n        }\n      }\n    }\n\n    result += needLf ? '>\\n' : '>'\n\n    return result\n  }\n\n  /**\n   * The same as {@link Renderer.render}, but for single token of `inline` type.\n   *\n   * @param tokens List on block tokens to render.\n   * @param options Params of parser instance.\n   * @param env Additional data from parsed input (references, for example).\n   */\n  renderInline (tokens: Token[], options: Required<MarkdownItOptions>, env: Env | undefined): string {\n    let result = ''\n    const rules = this.rules\n\n    for (let i = 0, len = tokens.length; i < len; i++) {\n      const type = tokens[i].type\n\n      if (typeof rules[type] !== 'undefined') {\n        result += rules[type](tokens, i, options, env, this)\n      } else {\n        result += this.renderToken(tokens, i, options)\n      }\n    }\n\n    return result\n  }\n\n  /**\n   * Special kludge for image `alt` attributes to conform CommonMark spec.\n   * Don't try to use it! Spec requires to show `alt` content with stripped markup,\n   * instead of simple escaping.\n   *\n   * @param tokens List on block tokens to render.\n   * @param options Params of parser instance.\n   * @param env Additional data from parsed input (references, for example).\n   */\n  renderInlineAsText (tokens: Token[], options: Required<MarkdownItOptions>, env: Env | undefined): string {\n    let result = ''\n\n    for (let i = 0, len = tokens.length; i < len; i++) {\n      switch (tokens[i].type) {\n        case 'text':\n        case 'code_inline':\n          // code content is added as plain text, without backticks\n          result += tokens[i].content\n          break\n        case 'image':\n          result += this.renderInlineAsText(tokens[i].children!, options, env)\n          break\n        case 'html_inline':\n        case 'html_block':\n          result += tokens[i].content\n          break\n        case 'softbreak':\n        case 'hardbreak':\n          result += '\\n'\n          break\n        default:\n        // all other tokens are skipped\n      }\n    }\n\n    return result\n  }\n\n  /**\n   * Takes token stream and generates HTML. Probably, you will never need to call\n   * this method directly.\n   *\n   * @param tokens List on block tokens to render.\n   * @param options Params of parser instance.\n   * @param env Additional data from parsed input (references, for example).\n   */\n  render (tokens: Token[], options: Required<MarkdownItOptions>, env?: Env): string {\n    let result = ''\n    const rules = this.rules\n\n    for (let i = 0, len = tokens.length; i < len; i++) {\n      const type = tokens[i].type\n\n      if (type === 'inline') {\n        result += this.renderInline(tokens[i].children!, options, env)\n      } else if (typeof rules[type] !== 'undefined') {\n        result += rules[type](tokens, i, options, env, this)\n      } else {\n        result += this.renderToken(tokens, i, options)\n      }\n    }\n\n    return result\n  }\n}\n\nexport default Renderer\n","import Token from '../token.ts'\nimport type MarkdownIt from '../markdownit.ts'\nimport type { Env } from '../types.ts'\n\n/** Mutable state passed through the core rules chain. */\nclass StateCore {\n  declare src: string\n  declare env: Env\n  tokens: Token[] = []\n  inlineMode = false\n  declare md: MarkdownIt\n\n  // re-export Token class to use in core rules\n  Token = Token\n\n  constructor (src: string, md: MarkdownIt, env: Env) {\n    this.src = src\n    this.env = env\n    this.md = md // link to parser instance\n  }\n}\n\nexport default StateCore\n","// Normalize input string\n\nimport type StateCore from './state_core.ts'\n\n// https://spec.commonmark.org/0.29/#line-ending\nconst NEWLINES_RE = /\\r\\n?|\\n/g\nconst NULL_RE = /\\0/g\n\nexport default function normalize (state: StateCore): void {\n  let str\n\n  // Normalize newlines\n  str = state.src.replace(NEWLINES_RE, '\\n')\n\n  // Replace NULL characters\n  str = str.replace(NULL_RE, '\\uFFFD')\n\n  state.src = str\n}\n","import type StateCore from './state_core.ts'\n\nexport default function block (state: StateCore): void {\n  let token\n\n  if (state.inlineMode) {\n    token = new state.Token('inline', '', 0)\n    token.content = state.src\n    token.map = [0, 1]\n    token.children = []\n    state.tokens.push(token)\n  } else {\n    state.md.block.parse(state.src, state.md, state.env, state.tokens)\n  }\n}\n","// Drop `reference_definition` tokens to keep the stream backward compatible\n//\n// Those tokens mark places link definitions took in the source. They are new,\n// and plugins walking block tokens may not expect them, so by default the\n// stream stays as it always was. Disable this rule to opt in.\n//\n\nimport type StateCore from './state_core.ts'\n\nexport default function strip_references (state: StateCore): void {\n  const tokens = state.tokens\n  let last = 0\n\n  for (let curr = 0; curr < tokens.length; curr++) {\n    if (tokens[curr].type === 'reference_definition') continue\n\n    if (curr !== last) { tokens[last] = tokens[curr] }\n\n    last++\n  }\n\n  if (tokens.length !== last) { tokens.length = last }\n}\n","import type StateCore from './state_core.ts'\n\nexport default function inline (state: StateCore): void {\n  const tokens = state.tokens\n\n  // Parse inlines\n  for (let i = 0, l = tokens.length; i < l; i++) {\n    const tok = tokens[i]\n    if (tok.type === 'inline') {\n      state.md.inline.parse(tok.content, state.md, state.env, tok.children!)\n    }\n  }\n}\n","// Replace link-like texts with link nodes.\n//\n// Currently restricted by `md.validateLink()` to http/https/ftp\n//\n\nimport { arrayReplaceAt } from '../common/utils.ts'\nimport type StateCore from './state_core.ts'\n\nfunction isLinkOpen (str: string) {\n  return /^<a[>\\s]/i.test(str)\n}\nfunction isLinkClose (str: string) {\n  return /^<\\/a\\s*>/i.test(str)\n}\n\nexport default function linkify (state: StateCore): void {\n  const blockTokens = state.tokens\n\n  if (!state.md.options.linkify) { return }\n\n  for (let j = 0, l = blockTokens.length; j < l; j++) {\n    if (blockTokens[j].type !== 'inline' ||\n        !state.md.linkify.test(blockTokens[j].content)) {\n      continue\n    }\n\n    let tokens = blockTokens[j].children!\n\n    let htmlLinkLevel = 0\n\n    // We scan from the end, to keep position when new tags added.\n    // Use reversed logic in links start/end match\n    for (let i = tokens.length - 1; i >= 0; i--) {\n      const currentToken = tokens[i]\n\n      // Skip content of markdown links\n      if (currentToken.type === 'link_close') {\n        i--\n        while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') {\n          i--\n        }\n        continue\n      }\n\n      // Skip content of html tag links\n      if (currentToken.type === 'html_inline') {\n        if (isLinkOpen(currentToken.content) && htmlLinkLevel > 0) {\n          htmlLinkLevel--\n        }\n        if (isLinkClose(currentToken.content)) {\n          htmlLinkLevel++\n        }\n      }\n      if (htmlLinkLevel > 0) { continue }\n\n      if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) {\n        const text = currentToken.content\n        let links = state.md.linkify.match(text)!\n\n        // Now split string to nodes\n        const nodes = []\n        let level = currentToken.level\n        let lastPos = 0\n\n        // forbid escape sequence at the start of the string,\n        // this avoids http\\://example.com/ from being linkified as\n        // http:<a href=\"//example.com/\">//example.com/</a>\n        if (links.length > 0 &&\n            links[0].index === 0 &&\n            i > 0 &&\n            tokens[i - 1].type === 'text_special') {\n          links = links.slice(1)\n        }\n\n        for (let ln = 0; ln < links.length; ln++) {\n          const url = links[ln].url\n          const fullUrl = state.md.normalizeLink(url)\n          if (!state.md.validateLink(fullUrl)) { continue }\n\n          let urlText = links[ln].text\n\n          // Linkifier might send raw hostnames like \"example.com\", where url\n          // starts with domain name. So we prepend http:// in those cases,\n          // and remove it afterwards.\n          //\n          if (!links[ln].schema) {\n            urlText = state.md.normalizeLinkText(`http://${urlText}`).replace(/^http:\\/\\//, '')\n          } else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) {\n            urlText = state.md.normalizeLinkText(`mailto:${urlText}`).replace(/^mailto:/, '')\n          } else {\n            urlText = state.md.normalizeLinkText(urlText)\n          }\n\n          const pos = links[ln].index\n\n          if (pos > lastPos) {\n            const token = new state.Token('text', '', 0)\n            token.content = text.slice(lastPos, pos)\n            token.level = level\n            nodes.push(token)\n          }\n\n          const token_o = new state.Token('link_open', 'a', 1)\n          token_o.attrs = [['href', fullUrl]]\n          token_o.level = level++\n          token_o.markup = 'linkify'\n          token_o.info = 'auto'\n          nodes.push(token_o)\n\n          const token_t = new state.Token('text', '', 0)\n          token_t.content = urlText\n          token_t.level = level\n          nodes.push(token_t)\n\n          const token_c = new state.Token('link_close', 'a', -1)\n          token_c.level = --level\n          token_c.markup = 'linkify'\n          token_c.info = 'auto'\n          nodes.push(token_c)\n\n          lastPos = links[ln].lastIndex\n        }\n        if (lastPos < text.length) {\n          const token = new state.Token('text', '', 0)\n          token.content = text.slice(lastPos)\n          token.level = level\n          nodes.push(token)\n        }\n\n        // replace current node\n        blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, nodes)\n      }\n    }\n  }\n}\n","// Simple typographic replacements\n//\n// (c) (C) → ©\n// (tm) (TM) → ™\n// (r) (R) → ®\n// +- → ±\n// ... → … (also ?.... → ?.., !.... → !..)\n// ???????? → ???, !!!!! → !!!, `,,` → `,`\n// -- → &ndash;, --- → &mdash;\n//\n\n// TODO:\n// - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾\n// - multiplications 2 x 4 -> 2 × 4\n\nimport type StateCore from './state_core.ts'\nimport type Token from '../token.ts'\n\nconst RARE_RE = /\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/\n\n// Workaround for phantomjs - need regex without /g flag,\n// or root check will fail every second time\nconst SCOPED_ABBR_TEST_RE = /\\((c|tm|r)\\)/i\n\nconst SCOPED_ABBR_RE = /\\((c|tm|r)\\)/ig\nconst SCOPED_ABBR: Record<string, string> = {\n  c: '©',\n  r: '®',\n  tm: '™'\n}\n\nfunction replaceFn (match: string, name: string) {\n  return SCOPED_ABBR[name.toLowerCase()]\n}\n\nfunction replace_scoped (inlineTokens: Token[]) {\n  let inside_autolink = 0\n\n  for (let i = inlineTokens.length - 1; i >= 0; i--) {\n    const token = inlineTokens[i]\n\n    if (token.type === 'text' && !inside_autolink) {\n      token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn)\n    }\n\n    if (token.type === 'link_open' && token.info === 'auto') {\n      inside_autolink--\n    }\n\n    if (token.type === 'link_close' && token.info === 'auto') {\n      inside_autolink++\n    }\n  }\n}\n\nfunction replace_rare (inlineTokens: Token[]) {\n  let inside_autolink = 0\n\n  for (let i = inlineTokens.length - 1; i >= 0; i--) {\n    const token = inlineTokens[i]\n\n    if (token.type === 'text' && !inside_autolink) {\n      if (RARE_RE.test(token.content)) {\n        token.content = token.content\n          .replace(/\\+-/g, '±')\n          // .., ..., ....... -> …\n          // but ?..... & !..... -> ?.. & !..\n          .replace(/\\.{2,}/g, '…').replace(/([?!])…/g, '$1..')\n          .replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',')\n          // em-dash\n          .replace(/(^|[^-])---(?=[^-]|$)/mg, '$1\\u2014')\n          // en-dash\n          .replace(/(^|\\s)--(?=\\s|$)/mg, '$1\\u2013')\n          .replace(/(^|[^-\\s])--(?=[^-\\s]|$)/mg, '$1\\u2013')\n      }\n    }\n\n    if (token.type === 'link_open' && token.info === 'auto') {\n      inside_autolink--\n    }\n\n    if (token.type === 'link_close' && token.info === 'auto') {\n      inside_autolink++\n    }\n  }\n}\n\nexport default function replace (state: StateCore): void {\n  let blkIdx\n\n  if (!state.md.options.typographer) { return }\n\n  for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n    if (state.tokens[blkIdx].type !== 'inline') { continue }\n\n    if (SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)) {\n      replace_scoped(state.tokens[blkIdx].children!)\n    }\n\n    if (RARE_RE.test(state.tokens[blkIdx].content)) {\n      replace_rare(state.tokens[blkIdx].children!)\n    }\n  }\n}\n","// Convert straight quotation marks to typographic ones\n//\n\nimport { isWhiteSpace, isPunctCharCode, isMdAsciiPunct } from '../common/utils.ts'\nimport type Token from '../token.ts'\nimport type StateCore from './state_core.ts'\n\nconst QUOTE_TEST_RE = /['\"]/\nconst QUOTE_RE = /['\"]/g\nconst APOSTROPHE = '\\u2019' /* ’ */\n\ninterface Replacement {\n  pos: number\n  ch: string\n}\n\ntype ReplacementMap = Record<string, Replacement[]>\n\nfunction addReplacement (\n  replacements: ReplacementMap,\n  tokenIdx: number,\n  pos: number,\n  ch: string\n) {\n  if (!replacements[tokenIdx]) {\n    replacements[tokenIdx] = []\n  }\n\n  replacements[tokenIdx].push({ pos, ch })\n}\n\nfunction applyReplacements (str: string, replacements: Replacement[]) {\n  let result = ''\n  let lastPos = 0\n\n  replacements.sort((a, b) => a.pos - b.pos)\n\n  for (let i = 0; i < replacements.length; i++) {\n    const replacement = replacements[i]\n\n    result += str.slice(lastPos, replacement.pos) + replacement.ch\n    lastPos = replacement.pos + 1\n  }\n\n  return result + str.slice(lastPos)\n}\n\nfunction process_inlines (tokens: Token[], state: StateCore) {\n  let j\n\n  const stack = []\n  // token index -> list of replacements in the original token content\n  const replacements: ReplacementMap = {}\n\n  for (let i = 0; i < tokens.length; i++) {\n    const token = tokens[i]\n\n    const thisLevel = tokens[i].level\n\n    for (j = stack.length - 1; j >= 0; j--) {\n      if (stack[j].level <= thisLevel) { break }\n    }\n    stack.length = j + 1\n\n    if (token.type !== 'text') { continue }\n\n    const text = token.content\n    let pos = 0\n    const max = text.length\n\n    /* eslint no-labels:0,block-scoped-var:0 */\n    OUTER:\n    while (pos < max) {\n      QUOTE_RE.lastIndex = pos\n      const t = QUOTE_RE.exec(text)\n      if (!t) { break }\n\n      let canOpen = true\n      let canClose = true\n      pos = t.index + 1\n      const isSingle = (t[0] === \"'\")\n\n      // Find previous character,\n      // default to space if it's the beginning of the line\n      //\n      let lastChar = 0x20\n\n      if (t.index - 1 >= 0) {\n        lastChar = text.charCodeAt(t.index - 1)\n      } else {\n        for (j = i - 1; j >= 0; j--) {\n          if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break // lastChar defaults to 0x20\n          if (!tokens[j].content) continue // should skip all tokens except 'text', 'html_inline' or 'code_inline'\n\n          lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1)\n          break\n        }\n      }\n\n      // Find next character,\n      // default to space if it's the end of the line\n      //\n      let nextChar = 0x20\n\n      if (pos < max) {\n        nextChar = text.charCodeAt(pos)\n      } else {\n        for (j = i + 1; j < tokens.length; j++) {\n          if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break // nextChar defaults to 0x20\n          if (!tokens[j].content) continue // should skip all tokens except 'text', 'html_inline' or 'code_inline'\n\n          nextChar = tokens[j].content.charCodeAt(0)\n          break\n        }\n      }\n\n      const isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctCharCode(lastChar)\n      const isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctCharCode(nextChar)\n\n      const isLastWhiteSpace = isWhiteSpace(lastChar)\n      const isNextWhiteSpace = isWhiteSpace(nextChar)\n\n      if (isNextWhiteSpace) {\n        canOpen = false\n      } else if (isNextPunctChar) {\n        if (!(isLastWhiteSpace || isLastPunctChar)) {\n          canOpen = false\n        }\n      }\n\n      if (isLastWhiteSpace) {\n        canClose = false\n      } else if (isLastPunctChar) {\n        if (!(isNextWhiteSpace || isNextPunctChar)) {\n          canClose = false\n        }\n      }\n\n      if (nextChar === 0x22 /* \" */ && t[0] === '\"') {\n        if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) {\n          // special case: 1\"\" - count first quote as an inch\n          canClose = canOpen = false\n        }\n      }\n\n      if (canOpen && canClose) {\n        // Replace quotes in the middle of punctuation sequence, but not\n        // in the middle of the words, i.e.:\n        //\n        // 1. foo \" bar \" baz - not replaced\n        // 2. foo-\"-bar-\"-baz - replaced\n        // 3. foo\"bar\"baz     - not replaced\n        //\n        canOpen = isLastPunctChar\n        canClose = isNextPunctChar\n      }\n\n      if (!canOpen && !canClose) {\n        // middle of word\n        if (isSingle) {\n          addReplacement(replacements, i, t.index, APOSTROPHE)\n        }\n        continue\n      }\n\n      if (canClose) {\n        // this could be a closing quote, rewind the stack to get a match\n        for (j = stack.length - 1; j >= 0; j--) {\n          let item = stack[j]\n          if (stack[j].level < thisLevel) { break }\n          if (item.single === isSingle && stack[j].level === thisLevel) {\n            item = stack[j]\n\n            let openQuote\n            let closeQuote\n            if (isSingle) {\n              openQuote = state.md.options.quotes[2]\n              closeQuote = state.md.options.quotes[3]\n            } else {\n              openQuote = state.md.options.quotes[0]\n              closeQuote = state.md.options.quotes[1]\n            }\n\n            addReplacement(replacements, i, t.index, closeQuote)\n            addReplacement(replacements, item.token, item.pos, openQuote)\n\n            stack.length = j\n            continue OUTER\n          }\n        }\n      }\n\n      if (canOpen) {\n        stack.push({\n          token: i,\n          pos: t.index,\n          single: isSingle,\n          level: thisLevel\n        })\n      } else if (canClose && isSingle) {\n        addReplacement(replacements, i, t.index, APOSTROPHE)\n      }\n    }\n  }\n\n  Object.keys(replacements).forEach(function (tokenIdx) {\n    const idx = Number(tokenIdx)\n    tokens[idx].content = applyReplacements(tokens[idx].content, replacements[tokenIdx])\n  })\n}\n\nexport default function smartquotes (state: StateCore): void {\n  /* eslint max-depth:0 */\n  if (!state.md.options.typographer) { return }\n\n  for (let blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n    if (state.tokens[blkIdx].type !== 'inline' ||\n        !QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) {\n      continue\n    }\n\n    process_inlines(state.tokens[blkIdx].children!, state)\n  }\n}\n","// Join raw text tokens with the rest of the text\n//\n// This is set as a separate rule to provide an opportunity for plugins\n// to run text replacements after text join, but before escape join.\n//\n// For example, `\\:)` shouldn't be replaced with an emoji.\n//\n\nimport type StateCore from './state_core.ts'\nimport type Token from '../token.ts'\n\nfunction join_alt (tokens: Token[]): void {\n  let curr, last\n  const max = tokens.length\n\n  for (curr = 0; curr < max; curr++) {\n    if (tokens[curr].type === 'text_special') tokens[curr].type = 'text'\n  }\n\n  for (curr = last = 0; curr < max; curr++) {\n    if (tokens[curr].type === 'text' &&\n        curr + 1 < max &&\n        tokens[curr + 1].type === 'text') {\n      tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content\n    } else {\n      if (curr !== last) { tokens[last] = tokens[curr] }\n\n      last++\n    }\n  }\n\n  if (curr !== last) tokens.length = last\n}\n\nexport default function text_join (state: StateCore): void {\n  let curr, last\n  const blockTokens = state.tokens\n  const l = blockTokens.length\n\n  for (let j = 0; j < l; j++) {\n    if (blockTokens[j].type !== 'inline') continue\n\n    const tokens = blockTokens[j].children!\n    const max = tokens.length\n\n    for (curr = 0; curr < max; curr++) {\n      if (tokens[curr].type === 'text_special') tokens[curr].type = 'text'\n\n      // image `alt` is parsed into its own token tree\n      if (tokens[curr].children) join_alt(tokens[curr].children!)\n    }\n\n    for (curr = last = 0; curr < max; curr++) {\n      if (tokens[curr].type === 'text' &&\n          curr + 1 < max &&\n          tokens[curr + 1].type === 'text') {\n        // collapse two adjacent text nodes\n        tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content\n      } else {\n        if (curr !== last) { tokens[last] = tokens[curr] }\n\n        last++\n      }\n    }\n\n    if (curr !== last) tokens.length = last\n  }\n}\n","import Ruler from './ruler.ts'\nimport StateCore from './rules_core/state_core.ts'\n\nimport r_normalize from './rules_core/normalize.ts'\nimport r_block from './rules_core/block.ts'\nimport r_strip_references from './rules_core/strip_references.ts'\nimport r_inline from './rules_core/inline.ts'\nimport r_linkify from './rules_core/linkify.ts'\nimport r_replacements from './rules_core/replacements.ts'\nimport r_smartquotes from './rules_core/smartquotes.ts'\nimport r_text_join from './rules_core/text_join.ts'\n\nconst _rules: Array<[\n  name: string,\n  rule: (state: StateCore) => void\n]> = [\n  ['normalize', r_normalize],\n  ['block', r_block],\n  ['strip_references', r_strip_references],\n  ['inline', r_inline],\n  ['linkify', r_linkify],\n  ['replacements', r_replacements],\n  ['smartquotes', r_smartquotes],\n  // `text_join` finds `text_special` tokens (for escape sequences)\n  // and joins them with the rest of the text\n  ['text_join', r_text_join]\n]\n\n/**\n * Top-level rules executor. Glues block/inline parsers and does intermediate\n * transformations.\n */\nclass ParserCore {\n  /**\n   * {@link Ruler} instance. Keep configuration of core rules.\n   */\n  ruler = new Ruler<[StateCore], void>()\n\n  State = StateCore\n\n  constructor () {\n    for (let i = 0; i < _rules.length; i++) {\n      this.ruler.push(_rules[i][0], _rules[i][1])\n    }\n  }\n\n  /**\n   * Executes core chain rules.\n   */\n  process (state: StateCore): void {\n    const rules = this.ruler.getRules('')\n\n    for (let i = 0, l = rules.length; i < l; i++) {\n      rules[i](state)\n    }\n  }\n}\n\nexport default ParserCore\n","import Token from '../token.ts'\nimport { isSpace } from '../common/utils.ts'\nimport type MarkdownIt from '../markdownit.ts'\nimport type { Env } from '../types.ts'\n\n/** Mutable state passed to block rules while tokenizing a source document. */\nclass StateBlock {\n  declare src: string\n  declare md: MarkdownIt\n  declare env: Env\n  declare tokens: Token[]\n\n  bMarks: number[] = [] // line begin offsets for fast jumps\n  eMarks: number[] = [] // line end offsets for fast jumps\n  tShift: number[] = [] // offsets of the first non-space characters (tabs not expanded)\n  sCount: number[] = [] // indents for each line (tabs expanded)\n\n  // An amount of virtual spaces (tabs expanded) between beginning\n  // of each line (bMarks) and real beginning of that line.\n  //\n  // It exists only as a hack because blockquotes override bMarks\n  // losing information in the process.\n  //\n  // It's used only when expanding tabs, you can think about it as\n  // an initial tab length, e.g. bsCount=21 applied to string `\\t123`\n  // means first tab should be expanded to 4-21%4 === 3 spaces.\n  //\n  bsCount: number[] = []\n\n  // block parser variables\n\n  // required block content indent (for example, if we are\n  // inside a list, it would be positioned after list marker)\n  blkIndent = 0\n  line = 0 // line index in src\n  lineMax = 0 // lines count\n  tight = false // loose/tight mode for lists\n  listIndent = -1 // indent of the current list block (-1 if there isn't any)\n\n  // can be 'blockquote', 'list', 'root', 'paragraph' or 'reference'\n  // used in lists to determine if they interrupt a paragraph\n  parentType = 'root'\n\n  level = 0\n\n  // re-export Token class to use in block rules\n  Token = Token\n\n  constructor (src: string, md: MarkdownIt, env: Env, tokens: Token[]) {\n    this.src = src\n\n    // link to parser instance\n    this.md = md\n\n    this.env = env\n\n    //\n    // Internal state vartiables\n    //\n\n    this.tokens = tokens\n\n    // Create caches\n    // Generate markers.\n    const s = this.src\n\n    for (let start = 0, pos = 0, indent = 0, offset = 0, len = s.length, indent_found = false; pos < len; pos++) {\n      const ch = s.charCodeAt(pos)\n\n      if (!indent_found) {\n        if (isSpace(ch)) {\n          indent++\n\n          if (ch === 0x09) {\n            offset += 4 - offset % 4\n          } else {\n            offset++\n          }\n          continue\n        } else {\n          indent_found = true\n        }\n      }\n\n      if (ch === 0x0A || pos === len - 1) {\n        if (ch !== 0x0A) { pos++ }\n        this.bMarks.push(start)\n        this.eMarks.push(pos)\n        this.tShift.push(indent)\n        this.sCount.push(offset)\n        this.bsCount.push(0)\n\n        indent_found = false\n        indent = 0\n        offset = 0\n        start = pos + 1\n      }\n    }\n\n    // Push fake entry to simplify cache bounds checks\n    this.bMarks.push(s.length)\n    this.eMarks.push(s.length)\n    this.tShift.push(0)\n    this.sCount.push(0)\n    this.bsCount.push(0)\n\n    this.lineMax = this.bMarks.length - 1 // don't count last fake line\n  }\n\n  // Push new token to \"stream\".\n  //\n  push (type: string, tag: string, nesting: -1 | 0 | 1): Token {\n    const token = new Token(type, tag, nesting)\n    token.block = true\n\n    if (nesting < 0) this.level-- // closing tag\n    token.level = this.level\n    if (nesting > 0) this.level++ // opening tag\n\n    this.tokens.push(token)\n    return token\n  }\n\n  isEmpty (line: number): boolean {\n    return this.bMarks[line] + this.tShift[line] >= this.eMarks[line]\n  }\n\n  skipEmptyLines (from: number): number {\n    for (let max = this.lineMax; from < max; from++) {\n      if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) {\n        break\n      }\n    }\n    return from\n  }\n\n  // Skip spaces from given position.\n  skipSpaces (pos: number): number {\n    for (let max = this.src.length; pos < max; pos++) {\n      const ch = this.src.charCodeAt(pos)\n      if (!isSpace(ch)) { break }\n    }\n    return pos\n  }\n\n  // Skip spaces from given position in reverse.\n  skipSpacesBack (pos: number, min: number): number {\n    if (pos <= min) { return pos }\n\n    while (pos > min) {\n      if (!isSpace(this.src.charCodeAt(--pos))) { return pos + 1 }\n    }\n    return pos\n  }\n\n  // Skip char codes from given position\n  skipChars (pos: number, code: number): number {\n    for (let max = this.src.length; pos < max; pos++) {\n      if (this.src.charCodeAt(pos) !== code) { break }\n    }\n    return pos\n  }\n\n  // Skip char codes reverse from given position - 1\n  skipCharsBack (pos: number, code: number, min: number): number {\n    if (pos <= min) { return pos }\n\n    while (pos > min) {\n      if (code !== this.src.charCodeAt(--pos)) { return pos + 1 }\n    }\n    return pos\n  }\n\n  // cut lines range from source.\n  getLines (begin: number, end: number, indent: number, keepLastLF: boolean): string {\n    if (begin >= end) {\n      return ''\n    }\n\n    const queue = new Array(end - begin)\n\n    for (let i = 0, line = begin; line < end; line++, i++) {\n      let lineIndent = 0\n      const lineStart = this.bMarks[line]\n      let first = lineStart\n      let last\n\n      if (line + 1 < end || keepLastLF) {\n        // No need for bounds check because we have fake entry on tail.\n        last = this.eMarks[line] + 1\n      } else {\n        last = this.eMarks[line]\n      }\n\n      while (first < last && lineIndent < indent) {\n        const ch = this.src.charCodeAt(first)\n\n        if (isSpace(ch)) {\n          if (ch === 0x09) {\n            lineIndent += 4 - (lineIndent + this.bsCount[line]) % 4\n          } else {\n            lineIndent++\n          }\n        } else if (first - lineStart < this.tShift[line]) {\n          // patched tShift masked characters to look like spaces (blockquotes, list markers)\n          lineIndent++\n        } else {\n          break\n        }\n\n        first++\n      }\n\n      if (lineIndent > indent) {\n        // partially expanding tabs in code blocks, e.g '\\t\\tfoobar'\n        // with indent=2 becomes '  \\tfoobar'\n        queue[i] = new Array(lineIndent - indent + 1).join(' ') + this.src.slice(first, last)\n      } else {\n        queue[i] = this.src.slice(first, last)\n      }\n    }\n\n    return queue.join('')\n  }\n}\n\nexport default StateBlock\n","// GFM table, https://github.github.com/gfm/#tables-extension-\n\nimport { isSpace } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\n// Limit the amount of empty autocompleted cells in a table,\n// see https://github.com/markdown-it/markdown-it/issues/1000,\n//\n// Both pulldown-cmark and commonmark-hs limit the number of cells this way to ~200k.\n// We set it to 65k, which can expand user input by a factor of x370\n// (256x256 square is 1.8kB expanded into 650kB).\nconst MAX_AUTOCOMPLETED_CELLS = 0x10000\n\nfunction getLine (state: StateBlock, line: number) {\n  const pos = state.bMarks[line] + state.tShift[line]\n  const max = state.eMarks[line]\n\n  return state.src.slice(pos, max)\n}\n\nfunction escapedSplit (str: string) {\n  const result = []\n  const max = str.length\n\n  let pos = 0\n  let ch = str.charCodeAt(pos)\n  let isEscaped = false\n  let lastPos = 0\n  let current = ''\n\n  while (pos < max) {\n    if (ch === 0x7c/* | */) {\n      if (!isEscaped) {\n        // pipe separating cells, '|'\n        result.push(current + str.substring(lastPos, pos))\n        current = ''\n        lastPos = pos + 1\n      } else {\n        // escaped pipe, '\\|'\n        current += str.substring(lastPos, pos - 1)\n        lastPos = pos\n      }\n    }\n\n    isEscaped = (ch === 0x5c/* \\ */)\n    pos++\n\n    ch = str.charCodeAt(pos)\n  }\n\n  result.push(current + str.substring(lastPos))\n\n  return result\n}\n\nexport default function table (state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean {\n  // should have at least two lines\n  if (startLine + 2 > endLine) { return false }\n\n  let nextLine = startLine + 1\n\n  if (state.sCount[nextLine] < state.blkIndent) { return false }\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[nextLine] - state.blkIndent >= 4) { return false }\n\n  // first character of the second line should be '|', '-', ':',\n  // and no other characters are allowed but spaces;\n  // basically, this is the equivalent of /^[-:|][-:|\\s]*$/ regexp\n\n  let pos = state.bMarks[nextLine] + state.tShift[nextLine]\n  if (pos >= state.eMarks[nextLine]) { return false }\n\n  const firstCh = state.src.charCodeAt(pos++)\n  if (firstCh !== 0x7C/* | */ && firstCh !== 0x2D/* - */ && firstCh !== 0x3A/* : */) { return false }\n\n  if (pos >= state.eMarks[nextLine]) { return false }\n\n  const secondCh = state.src.charCodeAt(pos++)\n  if (secondCh !== 0x7C/* | */ && secondCh !== 0x2D/* - */ && secondCh !== 0x3A/* : */ && !isSpace(secondCh)) {\n    return false\n  }\n\n  // if first character is '-', then second character must not be a space\n  // (due to parsing ambiguity with list)\n  if (firstCh === 0x2D/* - */ && isSpace(secondCh)) { return false }\n\n  while (pos < state.eMarks[nextLine]) {\n    const ch = state.src.charCodeAt(pos)\n\n    if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */ && !isSpace(ch)) { return false }\n\n    pos++\n  }\n\n  let lineText = getLine(state, startLine + 1)\n  let columns = lineText.split('|')\n  const aligns = []\n  for (let i = 0; i < columns.length; i++) {\n    const t = columns[i].trim()\n    if (!t) {\n      // allow empty columns before and after table, but not in between columns;\n      // e.g. allow ` |---| `, disallow ` ---||--- `\n      if (i === 0 || i === columns.length - 1) {\n        continue\n      } else {\n        return false\n      }\n    }\n\n    if (!/^:?-+:?$/.test(t)) { return false }\n    if (t.charCodeAt(t.length - 1) === 0x3A/* : */) {\n      aligns.push(t.charCodeAt(0) === 0x3A/* : */ ? 'center' : 'right')\n    } else if (t.charCodeAt(0) === 0x3A/* : */) {\n      aligns.push('left')\n    } else {\n      aligns.push('')\n    }\n  }\n\n  lineText = getLine(state, startLine).trim()\n  if (lineText.indexOf('|') === -1) { return false }\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n  columns = escapedSplit(lineText)\n  if (columns.length && columns[0] === '') columns.shift()\n  if (columns.length && columns[columns.length - 1] === '') columns.pop()\n\n  // header row will define an amount of columns in the entire table,\n  // and align row should be exactly the same (the rest of the rows can differ)\n  const columnCount = columns.length\n  if (columnCount === 0 || columnCount !== aligns.length) { return false }\n\n  if (silent) { return true }\n\n  const oldParentType = state.parentType\n  state.parentType = 'table'\n\n  // use 'blockquote' lists for termination because it's\n  // the most similar to tables\n  const terminatorRules = state.md.block.ruler.getRules('blockquote')\n\n  const token_to = state.push('table_open', 'table', 1)\n  const tableLines: [number, number] = [startLine, 0]\n  token_to.map = tableLines\n\n  const token_tho = state.push('thead_open', 'thead', 1)\n  token_tho.map = [startLine, startLine + 1]\n\n  const token_htro = state.push('tr_open', 'tr', 1)\n  token_htro.map = [startLine, startLine + 1]\n\n  for (let i = 0; i < columns.length; i++) {\n    const token_ho = state.push('th_open', 'th', 1)\n    if (aligns[i]) {\n      token_ho.attrs = [['style', `text-align:${aligns[i]}`]]\n    }\n\n    const token_il = state.push('inline', '', 0)\n    token_il.content = columns[i].trim()\n    token_il.children = []\n\n    state.push('th_close', 'th', -1)\n  }\n\n  state.push('tr_close', 'tr', -1)\n  state.push('thead_close', 'thead', -1)\n\n  let tbodyLines: [number, number] | undefined\n  let autocompletedCells = 0\n\n  for (nextLine = startLine + 2; nextLine < endLine; nextLine++) {\n    if (state.sCount[nextLine] < state.blkIndent) { break }\n\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n\n    if (terminate) { break }\n    lineText = getLine(state, nextLine).trim()\n    if (!lineText) { break }\n    if (state.sCount[nextLine] - state.blkIndent >= 4) { break }\n    columns = escapedSplit(lineText)\n    if (columns.length && columns[0] === '') columns.shift()\n    if (columns.length && columns[columns.length - 1] === '') columns.pop()\n\n    // note: autocomplete count can be negative if user specifies more columns than header,\n    // but that does not affect intended use (which is limiting expansion)\n    autocompletedCells += columnCount - columns.length\n    if (autocompletedCells > MAX_AUTOCOMPLETED_CELLS) { break }\n\n    if (nextLine === startLine + 2) {\n      const token_tbo = state.push('tbody_open', 'tbody', 1)\n      token_tbo.map = tbodyLines = [startLine + 2, 0]\n    }\n\n    const token_tro = state.push('tr_open', 'tr', 1)\n    token_tro.map = [nextLine, nextLine + 1]\n\n    for (let i = 0; i < columnCount; i++) {\n      const token_tdo = state.push('td_open', 'td', 1)\n      if (aligns[i]) {\n        token_tdo.attrs = [['style', `text-align:${aligns[i]}`]]\n      }\n\n      const token_il = state.push('inline', '', 0)\n      token_il.content = columns[i] ? columns[i].trim() : ''\n      token_il.children = []\n\n      state.push('td_close', 'td', -1)\n    }\n    state.push('tr_close', 'tr', -1)\n  }\n\n  if (tbodyLines) {\n    state.push('tbody_close', 'tbody', -1)\n    tbodyLines[1] = nextLine\n  }\n\n  state.push('table_close', 'table', -1)\n  tableLines[1] = nextLine\n\n  state.parentType = oldParentType\n  state.line = nextLine\n  return true\n}\n","// Code block (4 spaces padded)\n\nimport type StateBlock from './state_block.ts'\n\nexport default function code (state: StateBlock, startLine: number, endLine: number/*, silent */): boolean {\n  if (state.sCount[startLine] - state.blkIndent < 4) { return false }\n\n  let nextLine = startLine + 1\n  let last = nextLine\n\n  while (nextLine < endLine) {\n    if (state.isEmpty(nextLine)) {\n      nextLine++\n      continue\n    }\n\n    if (state.sCount[nextLine] - state.blkIndent >= 4) {\n      nextLine++\n      last = nextLine\n      continue\n    }\n    break\n  }\n\n  state.line = last\n\n  const token = state.push('code_block', 'code', 0)\n  token.content = state.getLines(startLine, last, 4 + state.blkIndent, false) + '\\n'\n  token.map = [startLine, state.line]\n\n  return true\n}\n","// fences (``` lang, ~~~ lang)\n\nimport type StateBlock from './state_block.ts'\n\nexport default function fence (state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  if (pos + 3 > max) { return false }\n\n  const marker = state.src.charCodeAt(pos)\n\n  if (marker !== 0x7E/* ~ */ && marker !== 0x60 /* ` */) {\n    return false\n  }\n\n  // scan marker length\n  let mem = pos\n  pos = state.skipChars(pos, marker)\n\n  let len = pos - mem\n\n  if (len < 3) { return false }\n\n  const markup = state.src.slice(mem, pos)\n  const params = state.src.slice(pos, max)\n\n  if (marker === 0x60 /* ` */) {\n    if (params.indexOf(String.fromCharCode(marker)) >= 0) {\n      return false\n    }\n  }\n\n  // Since start is found, we can report success here in validation mode\n  if (silent) { return true }\n\n  // search end of block\n  let nextLine = startLine\n  let haveEndMarker = false\n\n  for (;;) {\n    nextLine++\n    if (nextLine >= endLine) {\n      // unclosed block should be autoclosed by end of document.\n      // also block seems to be autoclosed by end of parent\n      break\n    }\n\n    pos = mem = state.bMarks[nextLine] + state.tShift[nextLine]\n    max = state.eMarks[nextLine]\n\n    if (pos < max && state.sCount[nextLine] < state.blkIndent) {\n      // non-empty line with negative indent should stop the list:\n      // - ```\n      //  test\n      break\n    }\n\n    if (state.src.charCodeAt(pos) !== marker) { continue }\n\n    if (state.sCount[nextLine] - state.blkIndent >= 4) {\n      // closing fence should be indented less than 4 spaces\n      continue\n    }\n\n    pos = state.skipChars(pos, marker)\n\n    // closing code fence must be at least as long as the opening one\n    if (pos - mem < len) { continue }\n\n    // make sure tail has spaces only\n    pos = state.skipSpaces(pos)\n\n    if (pos < max) { continue }\n\n    haveEndMarker = true\n    // found!\n    break\n  }\n\n  // If a fence has heading spaces, they should be removed from its inner block\n  len = state.sCount[startLine]\n\n  state.line = nextLine + (haveEndMarker ? 1 : 0)\n\n  const token = state.push('fence', 'code', 0)\n  token.info = params\n  token.content = state.getLines(startLine + 1, nextLine, len, true)\n  token.markup = markup\n  token.map = [startLine, state.line]\n\n  return true\n}\n","// Block quotes\n\nimport { isSpace } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\nexport default function blockquote (state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n\n  const oldLineMax = state.lineMax\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  // check the block quote marker\n  if (state.src.charCodeAt(pos) !== 0x3E/* > */) { return false }\n\n  // we know that it's going to be a valid blockquote,\n  // so no point trying to find the end of it in silent mode\n  if (silent) { return true }\n\n  const oldBMarks = []\n  const oldBSCount = []\n  const oldSCount = []\n  const oldTShift = []\n\n  const terminatorRules = state.md.block.ruler.getRules('blockquote')\n\n  const oldParentType = state.parentType\n  state.parentType = 'blockquote'\n  let lastLineEmpty = false\n  let nextLine\n\n  // Search the end of the block\n  //\n  // Block ends with either:\n  //  1. an empty line outside:\n  //     ```\n  //     > test\n  //\n  //     ```\n  //  2. an empty line inside:\n  //     ```\n  //     >\n  //     test\n  //     ```\n  //  3. another tag:\n  //     ```\n  //     > test\n  //      - - -\n  //     ```\n  for (nextLine = startLine; nextLine < endLine; nextLine++) {\n    // check if it's outdented, i.e. it's inside list item and indented\n    // less than said list item:\n    //\n    // ```\n    // 1. anything\n    //    > current blockquote\n    // 2. checking this line\n    // ```\n    const isOutdented = state.sCount[nextLine] < state.blkIndent\n\n    pos = state.bMarks[nextLine] + state.tShift[nextLine]\n    max = state.eMarks[nextLine]\n\n    if (pos >= max) {\n      // Case 1: line is not inside the blockquote, and this line is empty.\n      break\n    }\n\n    if (state.src.charCodeAt(pos++) === 0x3E/* > */ && !isOutdented) {\n      // This line is inside the blockquote.\n\n      // set offset past spaces and \">\"\n      let initial = state.sCount[nextLine] + 1\n      let spaceAfterMarker\n      let adjustTab\n\n      // skip one optional space after '>'\n      if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n        // ' >   test '\n        //     ^ -- position start of line here:\n        pos++\n        initial++\n        adjustTab = false\n        spaceAfterMarker = true\n      } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n        spaceAfterMarker = true\n\n        if ((state.bsCount[nextLine] + initial) % 4 === 3) {\n          // '  >\\t  test '\n          //       ^ -- position start of line here (tab has width===1)\n          pos++\n          initial++\n          adjustTab = false\n        } else {\n          // ' >\\t  test '\n          //    ^ -- position start of line here + shift bsCount slightly\n          //         to make extra space appear\n          adjustTab = true\n        }\n      } else {\n        spaceAfterMarker = false\n      }\n\n      let offset = initial\n      oldBMarks.push(state.bMarks[nextLine])\n      state.bMarks[nextLine] = pos\n\n      while (pos < max) {\n        const ch = state.src.charCodeAt(pos)\n\n        if (isSpace(ch)) {\n          if (ch === 0x09) {\n            offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4\n          } else {\n            offset++\n          }\n        } else {\n          break\n        }\n\n        pos++\n      }\n\n      lastLineEmpty = pos >= max\n\n      oldBSCount.push(state.bsCount[nextLine])\n      state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0)\n\n      oldSCount.push(state.sCount[nextLine])\n      state.sCount[nextLine] = offset - initial\n\n      oldTShift.push(state.tShift[nextLine])\n      state.tShift[nextLine] = pos - state.bMarks[nextLine]\n      continue\n    }\n\n    // Case 2: line is not inside the blockquote, and the last line was empty.\n    if (lastLineEmpty) { break }\n\n    // Case 3: another tag found.\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n\n    if (terminate) {\n      // Quirk to enforce \"hard termination mode\" for paragraphs;\n      // normally if you call `tokenize(state, startLine, nextLine)`,\n      // paragraphs will look below nextLine for paragraph continuation,\n      // but if blockquote is terminated by another tag, they shouldn't\n      state.lineMax = nextLine\n\n      if (state.blkIndent !== 0) {\n        // state.blkIndent was non-zero, we now set it to zero,\n        // so we need to re-calculate all offsets to appear as\n        // if indent wasn't changed\n        oldBMarks.push(state.bMarks[nextLine])\n        oldBSCount.push(state.bsCount[nextLine])\n        oldTShift.push(state.tShift[nextLine])\n        oldSCount.push(state.sCount[nextLine])\n        state.sCount[nextLine] -= state.blkIndent\n      }\n\n      break\n    }\n\n    oldBMarks.push(state.bMarks[nextLine])\n    oldBSCount.push(state.bsCount[nextLine])\n    oldTShift.push(state.tShift[nextLine])\n    oldSCount.push(state.sCount[nextLine])\n\n    // A negative indentation means that this is a paragraph continuation\n    //\n    state.sCount[nextLine] = -1\n  }\n\n  const oldIndent = state.blkIndent\n  state.blkIndent = 0\n\n  const token_o = state.push('blockquote_open', 'blockquote', 1)\n  token_o.markup = '>'\n  const lines: [number, number] = [startLine, 0]\n  token_o.map = lines\n\n  state.md.block.tokenize(state, startLine, nextLine)\n\n  const token_c = state.push('blockquote_close', 'blockquote', -1)\n  token_c.markup = '>'\n\n  state.lineMax = oldLineMax\n  state.parentType = oldParentType\n  lines[1] = state.line\n\n  // Restore original tShift; this might not be necessary since the parser\n  // has already been here, but just to make sure we can do that.\n  for (let i = 0; i < oldTShift.length; i++) {\n    state.bMarks[i + startLine] = oldBMarks[i]\n    state.tShift[i + startLine] = oldTShift[i]\n    state.sCount[i + startLine] = oldSCount[i]\n    state.bsCount[i + startLine] = oldBSCount[i]\n  }\n  state.blkIndent = oldIndent\n\n  return true\n}\n","// Horizontal rule\n\nimport { isSpace } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\nexport default function hr (state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean {\n  const max = state.eMarks[startLine]\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  const marker = state.src.charCodeAt(pos++)\n\n  // Check hr marker\n  if (marker !== 0x2A/* * */ &&\n      marker !== 0x2D/* - */ &&\n      marker !== 0x5F/* _ */) {\n    return false\n  }\n\n  // markers can be mixed with spaces, but there should be at least 3 of them\n\n  let cnt = 1\n  while (pos < max) {\n    const ch = state.src.charCodeAt(pos++)\n    if (ch !== marker && !isSpace(ch)) { return false }\n    if (ch === marker) { cnt++ }\n  }\n\n  if (cnt < 3) { return false }\n\n  if (silent) { return true }\n\n  state.line = startLine + 1\n\n  const token = state.push('hr', 'hr', 0)\n  token.map = [startLine, state.line]\n  token.markup = Array(cnt + 1).join(String.fromCharCode(marker))\n\n  return true\n}\n","// Lists\n\nimport { isSpace } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\n// Search `[-+*][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipBulletListMarker (state: StateBlock, startLine: number) {\n  const max = state.eMarks[startLine]\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n\n  const marker = state.src.charCodeAt(pos++)\n  // Check bullet\n  if (marker !== 0x2A/* * */ &&\n      marker !== 0x2D/* - */ &&\n      marker !== 0x2B/* + */) {\n    return -1\n  }\n\n  if (pos < max) {\n    const ch = state.src.charCodeAt(pos)\n\n    if (!isSpace(ch)) {\n      // \" -test \" - is not a list item\n      return -1\n    }\n  }\n\n  return pos\n}\n\n// Search `\\d+[.)][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipOrderedListMarker (state: StateBlock, startLine: number) {\n  const start = state.bMarks[startLine] + state.tShift[startLine]\n  const max = state.eMarks[startLine]\n  let pos = start\n\n  // List marker should have at least 2 chars (digit + dot)\n  if (pos + 1 >= max) { return -1 }\n\n  let ch = state.src.charCodeAt(pos++)\n\n  if (ch < 0x30/* 0 */ || ch > 0x39/* 9 */) { return -1 }\n\n  for (;;) {\n    // EOL -> fail\n    if (pos >= max) { return -1 }\n\n    ch = state.src.charCodeAt(pos++)\n\n    if (ch >= 0x30/* 0 */ && ch <= 0x39/* 9 */) {\n      // List marker should have no more than 9 digits\n      // (prevents integer overflow in browsers)\n      if (pos - start >= 10) { return -1 }\n\n      continue\n    }\n\n    // found valid marker\n    if (ch === 0x29/* ) */ || ch === 0x2e/* . */) {\n      break\n    }\n\n    return -1\n  }\n\n  if (pos < max) {\n    ch = state.src.charCodeAt(pos)\n\n    if (!isSpace(ch)) {\n      // \" 1.test \" - is not a list item\n      return -1\n    }\n  }\n  return pos\n}\n\nfunction markTightParagraphs (state: StateBlock, idx: number) {\n  const level = state.level + 2\n\n  for (let i = idx + 2, l = state.tokens.length - 2; i < l; i++) {\n    if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') {\n      state.tokens[i + 2].hidden = true\n      state.tokens[i].hidden = true\n      i += 2\n    }\n  }\n}\n\nexport default function list (state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean {\n  let max, pos, start, token\n  let nextLine = startLine\n  let tight = true\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[nextLine] - state.blkIndent >= 4) { return false }\n\n  // Special case:\n  //  - item 1\n  //   - item 2\n  //    - item 3\n  //     - item 4\n  //      - this one is a paragraph continuation\n  if (state.listIndent >= 0 &&\n      state.sCount[nextLine] - state.listIndent >= 4 &&\n      state.sCount[nextLine] < state.blkIndent) {\n    return false\n  }\n\n  let isTerminatingParagraph = false\n\n  // limit conditions when list can interrupt\n  // a paragraph (validation mode only)\n  if (silent && state.parentType === 'paragraph') {\n    // Next list item should still terminate previous list item;\n    //\n    // This code can fail if plugins use blkIndent as well as lists,\n    // but I hope the spec gets fixed long before that happens.\n    //\n    if (state.sCount[nextLine] >= state.blkIndent) {\n      isTerminatingParagraph = true\n    }\n  }\n\n  // Detect list type and position after marker\n  let isOrdered\n  let markerValue\n  let posAfterMarker\n  if ((posAfterMarker = skipOrderedListMarker(state, nextLine)) >= 0) {\n    isOrdered = true\n    start = state.bMarks[nextLine] + state.tShift[nextLine]\n    markerValue = Number(state.src.slice(start, posAfterMarker - 1))\n\n    // If we're starting a new ordered list right after\n    // a paragraph, it should start with 1.\n    if (isTerminatingParagraph && markerValue !== 1) return false\n  } else if ((posAfterMarker = skipBulletListMarker(state, nextLine)) >= 0) {\n    isOrdered = false\n  } else {\n    return false\n  }\n\n  // If we're starting a new unordered list right after\n  // a paragraph, first line should not be empty.\n  if (isTerminatingParagraph) {\n    if (state.skipSpaces(posAfterMarker) >= state.eMarks[nextLine]) return false\n  }\n\n  // For validation mode we can terminate immediately\n  if (silent) { return true }\n\n  // We should terminate list on style change. Remember first one to compare.\n  const markerCharCode = state.src.charCodeAt(posAfterMarker - 1)\n\n  // Start list\n  const listTokIdx = state.tokens.length\n\n  if (isOrdered) {\n    token = state.push('ordered_list_open', 'ol', 1)\n    if (markerValue !== 1) {\n      token.attrs = [['start', markerValue!]]\n    }\n  } else {\n    token = state.push('bullet_list_open', 'ul', 1)\n  }\n\n  const listLines: [number, number] = [nextLine, 0]\n  token.map = listLines\n  token.markup = String.fromCharCode(markerCharCode)\n\n  //\n  // Iterate list items\n  //\n\n  let prevEmptyEnd = false\n  const terminatorRules = state.md.block.ruler.getRules('list')\n\n  const oldParentType = state.parentType\n  state.parentType = 'list'\n\n  while (nextLine < endLine) {\n    pos = posAfterMarker\n    max = state.eMarks[nextLine]\n\n    const initial = state.sCount[nextLine] + posAfterMarker - (state.bMarks[nextLine] + state.tShift[nextLine])\n    let offset = initial\n\n    while (pos < max) {\n      const ch = state.src.charCodeAt(pos)\n\n      if (ch === 0x09) {\n        offset += 4 - (offset + state.bsCount[nextLine]) % 4\n      } else if (ch === 0x20) {\n        offset++\n      } else {\n        break\n      }\n\n      pos++\n    }\n\n    const contentStart = pos\n    let indentAfterMarker\n\n    if (contentStart >= max) {\n      // trimming space in \"-    \\n  3\" case, indent is 1 here\n      indentAfterMarker = 1\n    } else {\n      indentAfterMarker = offset - initial\n    }\n\n    // If we have more than 4 spaces, the indent is 1\n    // (the rest is just indented code block)\n    if (indentAfterMarker > 4) { indentAfterMarker = 1 }\n\n    // \"  -  test\"\n    //  ^^^^^ - calculating total length of this thing\n    const indent = initial + indentAfterMarker\n\n    // Run subparser & write tokens\n    token = state.push('list_item_open', 'li', 1)\n    token.markup = String.fromCharCode(markerCharCode)\n    const itemLines: [number, number] = [nextLine, 0]\n    token.map = itemLines\n    if (isOrdered) {\n      token.info = state.src.slice(start, posAfterMarker - 1)\n    }\n\n    // change current state, then restore it after parser subcall\n    const oldTight = state.tight\n    const oldTShift = state.tShift[nextLine]\n    const oldSCount = state.sCount[nextLine]\n\n    //  - example list\n    // ^ listIndent position will be here\n    //   ^ blkIndent position will be here\n    //\n    const oldListIndent = state.listIndent\n    state.listIndent = state.blkIndent\n    state.blkIndent = indent\n\n    state.tight = true\n    state.tShift[nextLine] = contentStart - state.bMarks[nextLine]\n    state.sCount[nextLine] = offset\n\n    if (contentStart >= max && state.isEmpty(nextLine + 1)) {\n      // workaround for this case\n      // (list item is empty, list terminates before \"foo\"):\n      // ~~~~~~~~\n      //   -\n      //\n      //     foo\n      // ~~~~~~~~\n      state.line = Math.min(state.line + 2, endLine)\n    } else {\n      state.md.block.tokenize(state, nextLine, endLine)\n    }\n\n    // If any of list item is tight, mark list as tight\n    if (!state.tight || prevEmptyEnd) {\n      tight = false\n    }\n    // Item become loose if finish with empty line,\n    // but we should filter last element, because it means list finish\n    prevEmptyEnd = (state.line - nextLine) > 1 && state.isEmpty(state.line - 1)\n\n    state.blkIndent = state.listIndent\n    state.listIndent = oldListIndent\n    state.tShift[nextLine] = oldTShift\n    state.sCount[nextLine] = oldSCount\n    state.tight = oldTight\n\n    token = state.push('list_item_close', 'li', -1)\n    token.markup = String.fromCharCode(markerCharCode)\n\n    nextLine = state.line\n    itemLines[1] = nextLine\n\n    if (nextLine >= endLine) { break }\n\n    //\n    // Try to check if list is terminated or continued.\n    //\n    if (state.sCount[nextLine] < state.blkIndent) { break }\n\n    // if it's indented more than 3 spaces, it should be a code block\n    if (state.sCount[nextLine] - state.blkIndent >= 4) { break }\n\n    // fail if terminating block found\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n    if (terminate) { break }\n\n    // fail if list has another type\n    if (isOrdered) {\n      posAfterMarker = skipOrderedListMarker(state, nextLine)\n      if (posAfterMarker < 0) { break }\n      start = state.bMarks[nextLine] + state.tShift[nextLine]\n    } else {\n      posAfterMarker = skipBulletListMarker(state, nextLine)\n      if (posAfterMarker < 0) { break }\n    }\n\n    if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { break }\n  }\n\n  // Finalize list\n  if (isOrdered) {\n    token = state.push('ordered_list_close', 'ol', -1)\n  } else {\n    token = state.push('bullet_list_close', 'ul', -1)\n  }\n  token.markup = String.fromCharCode(markerCharCode)\n\n  listLines[1] = nextLine\n  state.line = nextLine\n\n  state.parentType = oldParentType\n\n  // mark paragraphs tight if needed\n  if (tight) {\n    markTightParagraphs(state, listTokIdx)\n  }\n\n  return true\n}\n","import { isSpace, normalizeReference } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\nexport default function reference (state: StateBlock, startLine: number, _endLine: number, silent: boolean): boolean {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n  let nextLine = startLine + 1\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  if (state.src.charCodeAt(pos) !== 0x5B/* [ */) { return false }\n\n  function getNextLine (nextLine: number) {\n    const endLine = state.lineMax\n\n    if (nextLine >= endLine || state.isEmpty(nextLine)) {\n      // empty line or end of input\n      return null\n    }\n\n    let isContinuation = false\n\n    // this would be a code block normally, but after paragraph\n    // it's considered a lazy continuation regardless of what's there\n    if (state.sCount[nextLine] - state.blkIndent > 3) { isContinuation = true }\n\n    // quirk for blockquotes, this line should already be checked by that rule\n    if (state.sCount[nextLine] < 0) { isContinuation = true }\n\n    if (!isContinuation) {\n      const terminatorRules = state.md.block.ruler.getRules('reference')\n      const oldParentType = state.parentType\n      state.parentType = 'reference'\n\n      // Some tags can terminate paragraph without empty line.\n      let terminate = false\n      for (let i = 0, l = terminatorRules.length; i < l; i++) {\n        if (terminatorRules[i](state, nextLine, endLine, true)) {\n          terminate = true\n          break\n        }\n      }\n\n      state.parentType = oldParentType\n      if (terminate) {\n        // terminated by another block\n        return null\n      }\n    }\n\n    const pos = state.bMarks[nextLine] + state.tShift[nextLine]\n    const max = state.eMarks[nextLine]\n\n    // max + 1 explicitly includes the newline\n    return state.src.slice(pos, max + 1)\n  }\n\n  let str = state.src.slice(pos, max + 1)\n\n  max = str.length\n  let labelEnd = -1\n\n  for (pos = 1; pos < max; pos++) {\n    const ch = str.charCodeAt(pos)\n    if (ch === 0x5B /* [ */) {\n      return false\n    } else if (ch === 0x5D /* ] */) {\n      labelEnd = pos\n      break\n    } else if (ch === 0x0A /* \\n */) {\n      const lineContent = getNextLine(nextLine)\n      if (lineContent !== null) {\n        str += lineContent\n        max = str.length\n        nextLine++\n      }\n    } else if (ch === 0x5C /* \\ */) {\n      pos++\n      if (pos < max && str.charCodeAt(pos) === 0x0A) {\n        const lineContent = getNextLine(nextLine)\n        if (lineContent !== null) {\n          str += lineContent\n          max = str.length\n          nextLine++\n        }\n      }\n    }\n  }\n\n  if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return false }\n\n  // [label]:   destination   'title'\n  //         ^^^ skip optional whitespace here\n  for (pos = labelEnd + 2; pos < max; pos++) {\n    const ch = str.charCodeAt(pos)\n    if (ch === 0x0A) {\n      const lineContent = getNextLine(nextLine)\n      if (lineContent !== null) {\n        str += lineContent\n        max = str.length\n        nextLine++\n      }\n    } else if (isSpace(ch)) {\n      /* eslint no-empty:0 */\n    } else {\n      break\n    }\n  }\n\n  // [label]:   destination   'title'\n  //            ^^^^^^^^^^^ parse this\n  const destRes = state.md.helpers.parseLinkDestination(str, pos, max)\n  if (!destRes.ok) { return false }\n\n  const href = state.md.normalizeLink(destRes.str)\n  if (!state.md.validateLink(href)) { return false }\n\n  pos = destRes.pos\n\n  // save cursor state, we could require to rollback later\n  const destEndPos = pos\n  const destEndLineNo = nextLine\n\n  // [label]:   destination   'title'\n  //                       ^^^ skipping those spaces\n  const start = pos\n  for (; pos < max; pos++) {\n    const ch = str.charCodeAt(pos)\n    if (ch === 0x0A) {\n      const lineContent = getNextLine(nextLine)\n      if (lineContent !== null) {\n        str += lineContent\n        max = str.length\n        nextLine++\n      }\n    } else if (isSpace(ch)) {\n      /* Nothing */\n    } else {\n      break\n    }\n  }\n\n  // [label]:   destination   'title'\n  //                          ^^^^^^^ parse this\n  let titleRes = state.md.helpers.parseLinkTitle(str, pos, max)\n  while (titleRes.can_continue) {\n    const lineContent = getNextLine(nextLine)\n    if (lineContent === null) break\n    str += lineContent\n    pos = max\n    max = str.length\n    nextLine++\n    titleRes = state.md.helpers.parseLinkTitle(str, pos, max, titleRes)\n  }\n  let title\n\n  if (pos < max && start !== pos && titleRes.ok) {\n    title = titleRes.str\n    pos = titleRes.pos\n  } else {\n    title = ''\n    pos = destEndPos\n    nextLine = destEndLineNo\n  }\n\n  // skip trailing spaces until the rest of the line\n  while (pos < max) {\n    const ch = str.charCodeAt(pos)\n    if (!isSpace(ch)) { break }\n    pos++\n  }\n\n  if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n    if (title) {\n      // garbage at the end of the line after title,\n      // but it could still be a valid reference if we roll back\n      title = ''\n      pos = destEndPos\n      nextLine = destEndLineNo\n      while (pos < max) {\n        const ch = str.charCodeAt(pos)\n        if (!isSpace(ch)) { break }\n        pos++\n      }\n    }\n  }\n\n  if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n    // garbage at the end of the line\n    return false\n  }\n\n  const label = normalizeReference(str.slice(1, labelEnd))\n  if (!label) {\n    // CommonMark 0.20 disallows empty labels\n    return false\n  }\n\n  // Reference can not terminate anything. This check is for safety only.\n  /* istanbul ignore if */\n  if (silent) { return true }\n\n  if (typeof state.env.references === 'undefined') {\n    state.env.references = {}\n  }\n  if (typeof state.env.references[label] === 'undefined') {\n    state.env.references[label] = { title, href }\n  }\n\n  // Marks the place definition took in the source. Renders to nothing,\n  // href/title stay in `env.references`.\n  const token = state.push('reference_definition', '', 0)\n  token.map = [startLine, nextLine]\n  token.hidden = true\n\n  const meta: Record<string, unknown> = Object.create(null)\n  meta.label = label\n  token.meta = meta\n\n  state.line = nextLine\n  return true\n}\n","// List of valid html blocks names, according to commonmark spec\n// https://spec.commonmark.org/0.30/#html-blocks\n\nexport default [\n  'address',\n  'article',\n  'aside',\n  'base',\n  'basefont',\n  'blockquote',\n  'body',\n  'caption',\n  'center',\n  'col',\n  'colgroup',\n  'dd',\n  'details',\n  'dialog',\n  'dir',\n  'div',\n  'dl',\n  'dt',\n  'fieldset',\n  'figcaption',\n  'figure',\n  'footer',\n  'form',\n  'frame',\n  'frameset',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'head',\n  'header',\n  'hr',\n  'html',\n  'iframe',\n  'legend',\n  'li',\n  'link',\n  'main',\n  'menu',\n  'menuitem',\n  'nav',\n  'noframes',\n  'ol',\n  'optgroup',\n  'option',\n  'p',\n  'param',\n  'search',\n  'section',\n  'summary',\n  'table',\n  'tbody',\n  'td',\n  'tfoot',\n  'th',\n  'thead',\n  'title',\n  'tr',\n  'track',\n  'ul'\n]\n","// Regexps to match html elements\n\nconst attr_name = '[a-zA-Z_:][a-zA-Z0-9:._-]*'\n\nconst unquoted = '[^\"\\'=<>`\\\\x00-\\\\x20]+'\nconst single_quoted = \"'[^']*'\"\nconst double_quoted = '\"[^\"]*\"'\n\nconst attr_value = `(?:${unquoted}|${single_quoted}|${double_quoted})`\n\nconst attribute = `(?:\\\\s+${attr_name}(?:\\\\s*=\\\\s*${attr_value})?)`\n\nconst open_tag = `<[A-Za-z][A-Za-z0-9\\\\-]*${attribute}*\\\\s*\\\\/?>`\n\nconst close_tag = '<\\\\/[A-Za-z][A-Za-z0-9\\\\-]*\\\\s*>'\nconst comment = '<!---?>|<!--(?:[^-]|-[^-]|--[^>])*-->'\nconst processing = '<[?][\\\\s\\\\S]*?[?]>'\nconst declaration = '<![A-Za-z][^>]*>'\nconst cdata = '<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>'\n\nconst HTML_TAG_RE = new RegExp(\n  `^(?:${open_tag}|${close_tag}|${comment}|${processing}|${declaration}|${cdata})`\n)\nconst HTML_OPEN_CLOSE_TAG_RE = new RegExp(`^(?:${open_tag}|${close_tag})`)\n\nexport { HTML_TAG_RE, HTML_OPEN_CLOSE_TAG_RE }\n","// HTML block\n\nimport block_names from '../common/html_blocks.ts'\nimport { HTML_OPEN_CLOSE_TAG_RE } from '../common/html_re.ts'\nimport type StateBlock from './state_block.ts'\n\n// An array of opening and corresponding closing sequences for html tags,\n// last argument defines whether it can terminate a paragraph or not\n//\nconst HTML_SEQUENCES: Array<[\n  open: RegExp,\n  close: RegExp,\n  canTerminateParagraph: boolean\n]> = [\n  [/^<(script|pre|style|textarea)(?=(\\s|>|$))/i, /<\\/(script|pre|style|textarea)>/i, true],\n  [/^<!--/, /-->/, true],\n  [/^<\\?/, /\\?>/, true],\n  [/^<![A-Za-z]/, />/, true],\n  [/^<!\\[CDATA\\[/, /\\]\\]>/, true],\n  [new RegExp(`^</?(${block_names.join('|')})(?=(\\\\s|/?>|$))`, 'i'), /^$/, true],\n  [new RegExp(`${HTML_OPEN_CLOSE_TAG_RE.source}\\\\s*$`), /^$/, false]\n]\n\nexport default function html_block (state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  if (!state.md.options.html) { return false }\n\n  if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false }\n\n  let lineText = state.src.slice(pos, max)\n\n  let i = 0\n  for (; i < HTML_SEQUENCES.length; i++) {\n    if (HTML_SEQUENCES[i][0].test(lineText)) { break }\n  }\n  if (i === HTML_SEQUENCES.length) { return false }\n\n  if (silent) {\n    // true if this sequence can be a terminator, false otherwise\n    return HTML_SEQUENCES[i][2]\n  }\n\n  let nextLine = startLine + 1\n\n  // Block types 6 and 7 (the only ones whose end condition is a blank line)\n  // have `/^$/` as their closing regexp. For all other types (1-5, e.g.\n  // `<!--` comments), a blank line is regular content and must not terminate\n  // the block - it ends only when its closing sequence is found.\n  const endsOnBlankLine = HTML_SEQUENCES[i][1].test('')\n\n  // If we are here - we detected HTML block.\n  // Let's roll down till block end.\n  if (!HTML_SEQUENCES[i][1].test(lineText)) {\n    for (; nextLine < endLine; nextLine++) {\n      if (state.sCount[nextLine] < state.blkIndent) {\n        // An outdented blank line shouldn't end a block that doesn't end on a\n        // blank line (e.g. a `<!--` comment inside a list item). Such blocks\n        // must continue until their closing sequence regardless of indent.\n        if (endsOnBlankLine || !state.isEmpty(nextLine)) { break }\n      }\n\n      pos = state.bMarks[nextLine] + state.tShift[nextLine]\n      max = state.eMarks[nextLine]\n      lineText = state.src.slice(pos, max)\n\n      if (HTML_SEQUENCES[i][1].test(lineText)) {\n        if (lineText.length !== 0) { nextLine++ }\n        break\n      }\n    }\n  }\n\n  state.line = nextLine\n\n  const token = state.push('html_block', '', 0)\n  token.map = [startLine, nextLine]\n  token.content = state.getLines(startLine, nextLine, state.blkIndent, true)\n\n  return true\n}\n","// heading (#, ##, ...)\n\nimport { isSpace, asciiTrim } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\nexport default function heading (state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  let ch = state.src.charCodeAt(pos)\n\n  if (ch !== 0x23/* # */ || pos >= max) { return false }\n\n  // count heading level\n  let level = 1\n  ch = state.src.charCodeAt(++pos)\n  while (ch === 0x23/* # */ && pos < max && level <= 6) {\n    level++\n    ch = state.src.charCodeAt(++pos)\n  }\n\n  if (level > 6 || (pos < max && !isSpace(ch))) { return false }\n\n  if (silent) { return true }\n\n  // Let's cut tails like '    ###  ' from the end of string\n\n  max = state.skipSpacesBack(max, pos)\n  const tmp = state.skipCharsBack(max, 0x23, pos) // #\n  if (tmp > pos && isSpace(state.src.charCodeAt(tmp - 1))) {\n    max = tmp\n  }\n\n  state.line = startLine + 1\n\n  const token_o = state.push('heading_open', `h${level}`, 1)\n  token_o.markup = '########'.slice(0, level)\n  token_o.map = [startLine, state.line]\n\n  const token_i = state.push('inline', '', 0)\n  token_i.content = asciiTrim(state.src.slice(pos, max))\n  token_i.map = [startLine, state.line]\n  token_i.children = []\n\n  const token_c = state.push('heading_close', `h${level}`, -1)\n  token_c.markup = '########'.slice(0, level)\n\n  return true\n}\n","// lheading (---, ===)\n\nimport { asciiTrim } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\nexport default function lheading (state: StateBlock, startLine: number, endLine: number/*, silent */): boolean {\n  const terminatorRules = state.md.block.ruler.getRules('paragraph')\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  const oldParentType = state.parentType\n  state.parentType = 'paragraph' // use paragraph to match terminatorRules\n\n  // jump line-by-line until empty one or EOF\n  let level = 0\n  let marker\n  let nextLine = startLine + 1\n\n  for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n    // this would be a code block normally, but after paragraph\n    // it's considered a lazy continuation regardless of what's there\n    if (state.sCount[nextLine] - state.blkIndent > 3) { continue }\n\n    //\n    // Check for underline in setext header\n    //\n    if (state.sCount[nextLine] >= state.blkIndent) {\n      let pos = state.bMarks[nextLine] + state.tShift[nextLine]\n      const max = state.eMarks[nextLine]\n\n      if (pos < max) {\n        marker = state.src.charCodeAt(pos)\n\n        if (marker === 0x2D/* - */ || marker === 0x3D/* = */) {\n          pos = state.skipChars(pos, marker)\n          pos = state.skipSpaces(pos)\n\n          if (pos >= max) {\n            level = (marker === 0x3D/* = */ ? 1 : 2)\n            break\n          }\n        }\n      }\n    }\n\n    // quirk for blockquotes, this line should already be checked by that rule\n    if (state.sCount[nextLine] < 0) { continue }\n\n    // Some tags can terminate paragraph without empty line.\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n    if (terminate) { break }\n  }\n\n  if (!level) {\n    // Didn't find valid underline\n    state.parentType = oldParentType\n    return false\n  }\n\n  const content = asciiTrim(state.getLines(startLine, nextLine, state.blkIndent, false))\n\n  state.line = nextLine + 1\n\n  const token_o = state.push('heading_open', `h${level}`, 1)\n  token_o.markup = String.fromCharCode(marker!)\n  token_o.map = [startLine, state.line]\n\n  const token_i = state.push('inline', '', 0)\n  token_i.content = content\n  token_i.map = [startLine, state.line - 1]\n  token_i.children = []\n\n  const token_c = state.push('heading_close', `h${level}`, -1)\n  token_c.markup = String.fromCharCode(marker!)\n\n  state.parentType = oldParentType\n\n  return true\n}\n","// Paragraph\n\nimport { asciiTrim } from '../common/utils.ts'\nimport type StateBlock from './state_block.ts'\n\nexport default function paragraph (state: StateBlock, startLine: number, endLine: number): boolean {\n  const terminatorRules = state.md.block.ruler.getRules('paragraph')\n  const oldParentType = state.parentType\n  let nextLine = startLine + 1\n  state.parentType = 'paragraph'\n\n  // jump line-by-line until empty one or EOF\n  for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n    // this would be a code block normally, but after paragraph\n    // it's considered a lazy continuation regardless of what's there\n    if (state.sCount[nextLine] - state.blkIndent > 3) { continue }\n\n    // quirk for blockquotes, this line should already be checked by that rule\n    if (state.sCount[nextLine] < 0) { continue }\n\n    // Some tags can terminate paragraph without empty line.\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n    if (terminate) { break }\n  }\n\n  const content = asciiTrim(state.getLines(startLine, nextLine, state.blkIndent, false))\n\n  state.line = nextLine\n\n  const token_o = state.push('paragraph_open', 'p', 1)\n  token_o.map = [startLine, state.line]\n\n  const token_i = state.push('inline', '', 0)\n  token_i.content = content\n  token_i.map = [startLine, state.line]\n  token_i.children = []\n\n  state.push('paragraph_close', 'p', -1)\n\n  state.parentType = oldParentType\n\n  return true\n}\n","import Ruler from './ruler.ts'\nimport StateBlock from './rules_block/state_block.ts'\nimport type Token from './token.ts'\nimport type MarkdownIt from './markdownit.ts'\nimport type { Env } from './types.ts'\n\nimport r_table from './rules_block/table.ts'\nimport r_code from './rules_block/code.ts'\nimport r_fence from './rules_block/fence.ts'\nimport r_blockquote from './rules_block/blockquote.ts'\nimport r_hr from './rules_block/hr.ts'\nimport r_list from './rules_block/list.ts'\nimport r_reference from './rules_block/reference.ts'\nimport r_html_block from './rules_block/html_block.ts'\nimport r_heading from './rules_block/heading.ts'\nimport r_lheading from './rules_block/lheading.ts'\nimport r_paragraph from './rules_block/paragraph.ts'\n\nconst _rules: Array<[\n  name: string,\n  rule: (state: StateBlock, startLine: number, endLine: number, silent: boolean) => boolean,\n  alt?: string[]\n]> = [\n  // First 2 params - rule name & source. Secondary array - list of rules,\n  // which can be terminated by this one.\n  ['table', r_table, ['paragraph', 'reference']],\n  ['code', r_code],\n  ['fence', r_fence, ['paragraph', 'reference', 'blockquote', 'list']],\n  ['blockquote', r_blockquote, ['paragraph', 'reference', 'blockquote', 'list']],\n  ['hr', r_hr, ['paragraph', 'reference', 'blockquote', 'list']],\n  ['list', r_list, ['paragraph', 'reference', 'blockquote']],\n  ['reference', r_reference],\n  ['html_block', r_html_block, ['paragraph', 'reference', 'blockquote']],\n  ['heading', r_heading, ['paragraph', 'reference', 'blockquote']],\n  ['lheading', r_lheading],\n  ['paragraph', r_paragraph]\n]\n\n/**\n * Block-level tokenizer.\n */\nclass ParserBlock {\n  /**\n   * {@link Ruler} instance. Keep configuration of block rules.\n   */\n  ruler = new Ruler<[StateBlock, number, number, boolean], boolean>()\n\n  State = StateBlock\n\n  constructor () {\n    for (let i = 0; i < _rules.length; i++) {\n      this.ruler.push(_rules[i][0], _rules[i][1], { alt: (_rules[i][2] || []).slice() })\n    }\n  }\n\n  // Generate tokens for input range\n  //\n  tokenize (state: StateBlock, startLine: number, endLine: number): void {\n    const rules = this.ruler.getRules('')\n    const len = rules.length\n    const maxNesting = state.md.options.maxNesting\n    let line = startLine\n    let hasEmptyLines = false\n\n    while (line < endLine) {\n      state.line = line = state.skipEmptyLines(line)\n      if (line >= endLine) { break }\n\n      // Termination condition for nested calls.\n      // Nested calls currently used for blockquotes & lists\n      if (state.sCount[line] < state.blkIndent) { break }\n\n      // If nesting level exceeded - skip tail to the end. That's not ordinary\n      // situation and we should not care about content.\n      if (state.level >= maxNesting) {\n        state.line = endLine\n        break\n      }\n\n      // Try all possible rules.\n      // On success, rule should:\n      //\n      // - update `state.line`\n      // - update `state.tokens`\n      // - return true\n      const prevLine = state.line\n      let ok = false\n\n      for (let i = 0; i < len; i++) {\n        ok = rules[i](state, line, endLine, false)\n        if (ok) {\n          if (prevLine >= state.line) {\n            throw new Error(\"block rule didn't increment state.line\")\n          }\n          break\n        }\n      }\n\n      // this can only happen if user disables paragraph rule\n      if (!ok) throw new Error('none of the block rules matched')\n\n      // set state.tight if we had an empty line before current tag\n      // i.e. latest empty line should not count\n      state.tight = !hasEmptyLines\n\n      // paragraph might \"eat\" one newline after it in nested lists\n      if (state.isEmpty(state.line - 1)) {\n        hasEmptyLines = true\n      }\n\n      line = state.line\n\n      if (line < endLine && state.isEmpty(line)) {\n        hasEmptyLines = true\n        line++\n        state.line = line\n      }\n    }\n  }\n\n  /**\n   * Process input string and push block tokens into `outTokens`\n   */\n  parse (src: string, md: MarkdownIt, env: Env, outTokens: Token[]): void {\n    if (!src) { return }\n\n    const state = new this.State(src, md, env, outTokens)\n\n    this.tokenize(state, state.line, state.lineMax)\n  }\n}\n\nexport default ParserBlock\n","import Token from '../token.ts'\nimport { isWhiteSpace, isPunctCharCode, isMdAsciiPunct } from '../common/utils.ts'\nimport type MarkdownIt from '../markdownit.ts'\nimport type { Delimiter, Env } from '../types.ts'\n\n/** @inline */\ninterface ScannedDelimiters {\n  can_open: boolean\n  can_close: boolean\n  length: number\n}\n\n/** @inline */\ntype StateTokenMeta = Record<string, unknown> & {\n  delimiters?: Delimiter[]\n}\n\n/** Mutable state passed to inline rules while tokenizing inline content. */\nclass StateInline {\n  declare src: string\n  declare env: Env\n  declare md: MarkdownIt\n  declare tokens: Token[]\n  declare tokens_meta: Array<StateTokenMeta | undefined>\n\n  pos = 0\n  declare posMax: number\n  level = 0\n  pending = ''\n  pendingLevel = 0\n\n  // Stores { start: end } pairs. Useful for backtrack\n  // optimization of pairs parse (emphasis, strikes).\n  cache: Record<number, number> = {}\n\n  // backtick length => last seen position\n  backticks: Record<number, number> = {}\n  backticksScanned = false\n\n  // Counter used to disable inline linkify-it execution\n  // inside <a> and markdown links\n  linkLevel = 0\n\n  // List of emphasis-like delimiters for current tag\n  delimiters: Delimiter[] = []\n\n  // Stack of delimiter lists for upper level tags\n  _prev_delimiters: Delimiter[][] = []\n\n  // re-export Token class to use in block rules\n  Token = Token\n\n  constructor (src: string, md: MarkdownIt, env: Env, outTokens: Token[]) {\n    this.src = src\n    this.env = env\n    this.md = md\n    this.tokens = outTokens\n    this.tokens_meta = Array(outTokens.length)\n\n    this.posMax = this.src.length\n  }\n\n  // Flush pending text\n  //\n  pushPending (): Token {\n    const token = new Token('text', '', 0)\n    token.content = this.pending\n    token.level = this.pendingLevel\n    this.tokens.push(token)\n    this.pending = ''\n    return token\n  }\n\n  // Push new token to \"stream\".\n  // If pending text exists - flush it as text token\n  //\n  push (type: string, tag: string, nesting: -1 | 0 | 1): Token {\n    if (this.pending) {\n      this.pushPending()\n    }\n\n    const token = new Token(type, tag, nesting)\n    let token_meta = undefined\n\n    if (nesting < 0) {\n      // closing tag\n      this.level--\n      this.delimiters = this._prev_delimiters.pop()!\n    }\n\n    token.level = this.level\n\n    if (nesting > 0) {\n      // opening tag\n      this.level++\n      this._prev_delimiters.push(this.delimiters)\n      this.delimiters = []\n      token_meta = { delimiters: this.delimiters }\n    }\n\n    this.pendingLevel = this.level\n    this.tokens.push(token)\n    this.tokens_meta.push(token_meta)\n    return token\n  }\n\n  // Scan a sequence of emphasis-like markers, and determine whether\n  // it can start an emphasis sequence or end an emphasis sequence.\n  //\n  //  - start - position to scan from (it should point at a valid marker);\n  //  - canSplitWord - determine if these markers can be found inside a word\n  //\n  scanDelims (start: number, canSplitWord: boolean): ScannedDelimiters {\n    const max = this.posMax\n    const marker = this.src.charCodeAt(start)\n\n    // Astral characters below are combined manually, because .codePointAt()\n    // does not guarantee numeric type output. And we don't wish JIT cache issues.\n    // The broken surrogate pairs are evaluated as U+FFFD to prevent possible\n    // crashes.\n\n    let lastChar\n    if (start === 0) {\n      // treat beginning of the line as a whitespace\n      lastChar = 0x20\n    } else if (start === 1) {\n      lastChar = this.src.charCodeAt(0)\n      if ((lastChar & 0xF800) === 0xD800) { lastChar = 0xFFFD }\n    } else {\n      lastChar = this.src.charCodeAt(start - 1)\n      if ((lastChar & 0xFC00) === 0xDC00) {\n        // low surrogate => add high one, replace broken pair with U+FFFD\n        const highSurr = this.src.charCodeAt(start - 2)\n        lastChar = (highSurr & 0xFC00) === 0xD800\n          ? 0x10000 + ((highSurr - 0xD800) << 10) + (lastChar - 0xDC00)\n          : 0xFFFD\n      } else if ((lastChar & 0xFC00) === 0xD800) {\n        lastChar = 0xFFFD\n      }\n    }\n\n    let pos = start\n    while (pos < max && this.src.charCodeAt(pos) === marker) { pos++ }\n\n    const count = pos - start\n\n    // treat end of the line as a whitespace\n    let nextChar = pos < max ? this.src.charCodeAt(pos) : 0x20\n    if ((nextChar & 0xFC00) === 0xD800) {\n      // high surrogate => add low one, replace broken pair with U+FFFD\n      const lowSurr = this.src.charCodeAt(pos + 1)\n      nextChar = (lowSurr & 0xFC00) === 0xDC00\n        ? 0x10000 + ((nextChar - 0xD800) << 10) + (lowSurr - 0xDC00)\n        : 0xFFFD\n    } else if ((nextChar & 0xFC00) === 0xDC00) {\n      nextChar = 0xFFFD\n    }\n\n    const isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctCharCode(lastChar)\n    const isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctCharCode(nextChar)\n\n    const isLastWhiteSpace = isWhiteSpace(lastChar)\n    const isNextWhiteSpace = isWhiteSpace(nextChar)\n\n    const left_flanking =\n      !isNextWhiteSpace && (!isNextPunctChar || isLastWhiteSpace || isLastPunctChar)\n    const right_flanking =\n      !isLastWhiteSpace && (!isLastPunctChar || isNextWhiteSpace || isNextPunctChar)\n\n    const can_open = left_flanking && (canSplitWord || !right_flanking || isLastPunctChar)\n    const can_close = right_flanking && (canSplitWord || !left_flanking || isNextPunctChar)\n\n    return { can_open, can_close, length: count }\n  }\n}\n\nexport default StateInline\n","// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n\nimport type StateInline from './state_inline.ts'\n\n// Rule to skip pure text\n// '{}$%@~+=:' reserved for extentions\n\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n\n// !!!! Don't confuse with \"Markdown ASCII Punctuation\" chars\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\nfunction isTerminatorChar (ch: number) {\n  switch (ch) {\n    case 0x0A/* \\n */:\n    case 0x21/* ! */:\n    case 0x23/* # */:\n    case 0x24/* $ */:\n    case 0x25/* % */:\n    case 0x26/* & */:\n    case 0x2A/* * */:\n    case 0x2B/* + */:\n    case 0x2D/* - */:\n    case 0x3A/* : */:\n    case 0x3C/* < */:\n    case 0x3D/* = */:\n    case 0x3E/* > */:\n    case 0x40/* @ */:\n    case 0x5B/* [ */:\n    case 0x5C/* \\ */:\n    case 0x5D/* ] */:\n    case 0x5E/* ^ */:\n    case 0x5F/* _ */:\n    case 0x60/* ` */:\n    case 0x7B/* { */:\n    case 0x7D/* } */:\n    case 0x7E/* ~ */:\n      return true\n    default:\n      return false\n  }\n}\n\nexport default function text (state: StateInline, silent: boolean): boolean {\n  let pos = state.pos\n\n  while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n    pos++\n  }\n\n  if (pos === state.pos) { return false }\n\n  if (!silent) { state.pending += state.src.slice(state.pos, pos) }\n\n  state.pos = pos\n\n  return true\n}\n\n// Alternative implementation, for memory.\n//\n// It costs 10% of performance, but allows extend terminators list, if place it\n// to `ParserInline` property. Probably, will switch to it sometime, such\n// flexibility required.\n\n/*\nvar TERMINATOR_RE = /[\\n!#$%&*+\\-:<=>@[\\\\\\]^_`{}~]/;\n\nmodule.exports = function text(state, silent) {\n  var pos = state.pos,\n      idx = state.src.slice(pos).search(TERMINATOR_RE);\n\n  // first char is terminator -> empty text\n  if (idx === 0) { return false; }\n\n  // no terminator -> text till end of string\n  if (idx < 0) {\n    if (!silent) { state.pending += state.src.slice(pos); }\n    state.pos = state.src.length;\n    return true;\n  }\n\n  if (!silent) { state.pending += state.src.slice(pos, pos + idx); }\n\n  state.pos += idx;\n\n  return true;\n}; */\n","// Process links like https://example.org/\n\nimport type StateInline from './state_inline.ts'\n\n// RFC3986: scheme = ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\nconst SCHEME_RE = /(?:^|[^a-z0-9.+-])([a-z][a-z0-9.+-]*)$/i\n\nexport default function linkify (state: StateInline, silent: boolean): boolean {\n  if (!state.md.options.linkify) return false\n  if (state.linkLevel > 0) return false\n\n  const pos = state.pos\n  const max = state.posMax\n\n  if (pos + 3 > max) return false\n  if (state.src.charCodeAt(pos) !== 0x3A/* : */) return false\n  if (state.src.charCodeAt(pos + 1) !== 0x2F/* / */) return false\n  if (state.src.charCodeAt(pos + 2) !== 0x2F/* / */) return false\n\n  const match = state.pending.match(SCHEME_RE)\n  if (!match) return false\n\n  const proto = match[1]\n\n  const link = state.md.linkify.matchAtStart(state.src.slice(pos - proto.length))\n  if (!link) return false\n\n  let url = link.url\n\n  // invalid link, but still detected by linkify somehow;\n  // need to check to prevent infinite loop below\n  if (url.length <= proto.length) return false\n\n  // disallow '*' at the end of the link (conflicts with emphasis)\n  // do manual backsearch to avoid perf issues with regex /\\*+$/ on \"****...****a\".\n  let urlEnd = url.length\n  while (urlEnd > 0 && url.charCodeAt(urlEnd - 1) === 0x2A/* * */) {\n    urlEnd--\n  }\n  if (urlEnd !== url.length) {\n    url = url.slice(0, urlEnd)\n  }\n\n  const fullUrl = state.md.normalizeLink(url)\n  if (!state.md.validateLink(fullUrl)) return false\n\n  if (!silent) {\n    state.pending = state.pending.slice(0, -proto.length)\n\n    const token_o = state.push('link_open', 'a', 1)\n    token_o.attrs = [['href', fullUrl]]\n    token_o.markup = 'linkify'\n    token_o.info = 'auto'\n\n    const token_t = state.push('text', '', 0)\n    token_t.content = state.md.normalizeLinkText(url)\n\n    const token_c = state.push('link_close', 'a', -1)\n    token_c.markup = 'linkify'\n    token_c.info = 'auto'\n  }\n\n  state.pos += url.length - proto.length\n  return true\n}\n","// Proceess '\\n'\n\nimport { isSpace } from '../common/utils.ts'\nimport type StateInline from './state_inline.ts'\n\nexport default function newline (state: StateInline, silent: boolean): boolean {\n  let pos = state.pos\n\n  if (state.src.charCodeAt(pos) !== 0x0A/* \\n */) { return false }\n\n  const pmax = state.pending.length - 1\n  const max = state.posMax\n\n  // '  \\n' -> hardbreak\n  // Lookup in pending chars is bad practice! Don't copy to other rules!\n  // Pending string is stored in concat mode, indexed lookups will cause\n  // convertion to flat mode.\n  if (!silent) {\n    if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) {\n      if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) {\n        // Find whitespaces tail of pending chars.\n        let ws = pmax - 1\n        while (ws >= 1 && state.pending.charCodeAt(ws - 1) === 0x20) ws--\n\n        state.pending = state.pending.slice(0, ws)\n        state.push('hardbreak', 'br', 0)\n      } else {\n        state.pending = state.pending.slice(0, -1)\n        state.push('softbreak', 'br', 0)\n      }\n    } else {\n      state.push('softbreak', 'br', 0)\n    }\n  }\n\n  pos++\n\n  // skip heading spaces for next line\n  while (pos < max && isSpace(state.src.charCodeAt(pos))) { pos++ }\n\n  state.pos = pos\n  return true\n}\n","// Process escaped chars and hardbreaks\n\nimport { isSpace } from '../common/utils.ts'\nimport type StateInline from './state_inline.ts'\n\nconst ESCAPED: number[] = []\n\nfor (let i = 0; i < 256; i++) { ESCAPED.push(0) }\n\n'\\\\!\"#$%&\\'()*+,./:;<=>?@[]^_`{|}~-'\n  .split('').forEach(function (ch) { ESCAPED[ch.charCodeAt(0)] = 1 })\n\nexport default function escape (state: StateInline, silent: boolean): boolean {\n  let pos = state.pos\n  const max = state.posMax\n\n  if (state.src.charCodeAt(pos) !== 0x5C/* \\ */) return false\n  pos++\n\n  // '\\' at the end of the inline block\n  if (pos >= max) return false\n\n  let ch1 = state.src.charCodeAt(pos)\n\n  if (ch1 === 0x0A) {\n    if (!silent) {\n      state.push('hardbreak', 'br', 0)\n    }\n\n    pos++\n    // skip leading whitespaces from next line\n    while (pos < max) {\n      ch1 = state.src.charCodeAt(pos)\n      if (!isSpace(ch1)) break\n      pos++\n    }\n\n    state.pos = pos\n    return true\n  }\n\n  // '\\' before a space is a literal backslash. Don't consume the space, so a\n  // trailing two-space hard line break is still detected by the newline rule.\n  if (ch1 === 0x20) {\n    if (!silent) {\n      const token = state.push('text_special', '', 0)\n      token.content = '\\\\'\n      token.markup = '\\\\'\n      token.info = 'escape'\n    }\n\n    state.pos = pos\n    return true\n  }\n\n  let escapedStr = state.src[pos]\n\n  if (ch1 >= 0xD800 && ch1 <= 0xDBFF && pos + 1 < max) {\n    const ch2 = state.src.charCodeAt(pos + 1)\n\n    if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {\n      escapedStr += state.src[pos + 1]\n      pos++\n    }\n  }\n\n  const origStr = '\\\\' + escapedStr\n\n  if (!silent) {\n    const token = state.push('text_special', '', 0)\n\n    if (ch1 < 256 && ESCAPED[ch1] !== 0) {\n      token.content = escapedStr\n    } else {\n      token.content = origStr\n    }\n\n    token.markup = origStr\n    token.info = 'escape'\n  }\n\n  state.pos = pos + 1\n  return true\n}\n","// Parse backticks\n\nimport type StateInline from './state_inline.ts'\n\nexport default function backtick (state: StateInline, silent: boolean): boolean {\n  let pos = state.pos\n  const ch = state.src.charCodeAt(pos)\n\n  if (ch !== 0x60/* ` */) { return false }\n\n  const start = pos\n  pos++\n  const max = state.posMax\n\n  // scan marker length\n  while (pos < max && state.src.charCodeAt(pos) === 0x60/* ` */) { pos++ }\n\n  const marker = state.src.slice(start, pos)\n  const openerLength = marker.length\n\n  if (state.backticksScanned && (state.backticks[openerLength] || 0) <= start) {\n    if (!silent) state.pending += marker\n    state.pos += openerLength\n    return true\n  }\n\n  let matchEnd = pos\n  let matchStart\n\n  // Nothing found in the cache, scan until the end of the line (or until marker is found)\n  while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) {\n    matchEnd = matchStart + 1\n\n    // scan marker length\n    while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60/* ` */) { matchEnd++ }\n\n    const closerLength = matchEnd - matchStart\n\n    if (closerLength === openerLength) {\n      // Found matching closer length.\n      if (!silent) {\n        const token = state.push('code_inline', 'code', 0)\n        token.markup = marker\n        token.content = state.src.slice(pos, matchStart)\n          .replace(/\\n/g, ' ')\n          .replace(/^ (.+) $/, '$1')\n      }\n      state.pos = matchEnd\n      return true\n    }\n\n    // Some different length found, put it in cache as upper limit of where closer can be found\n    state.backticks[closerLength] = matchStart\n  }\n\n  // Scanned through the end, didn't find anything\n  state.backticksScanned = true\n\n  if (!silent) state.pending += marker\n  state.pos += openerLength\n  return true\n}\n","// ~~strike through~~\n//\n\nimport type { Delimiter } from '../types.ts'\nimport type StateInline from './state_inline.ts'\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nfunction strikethrough_tokenize (state: StateInline, silent: boolean): boolean {\n  const start = state.pos\n  const marker = state.src.charCodeAt(start)\n\n  if (silent) { return false }\n\n  if (marker !== 0x7E/* ~ */) { return false }\n\n  const scanned = state.scanDelims(state.pos, true)\n  let len = scanned.length\n  const ch = String.fromCharCode(marker)\n\n  if (len < 2) { return false }\n\n  let token\n\n  if (len % 2) {\n    token = state.push('text', '', 0)\n    token.content = ch\n    len--\n  }\n\n  for (let i = 0; i < len; i += 2) {\n    token = state.push('text', '', 0)\n    token.content = ch + ch\n\n    state.delimiters.push({\n      marker,\n      length: 0,     // disable \"rule of 3\" length checks meant for emphasis\n      token: state.tokens.length - 1,\n      end: -1,\n      open: scanned.can_open,\n      close: scanned.can_close\n    })\n  }\n\n  state.pos += scanned.length\n\n  return true\n}\n\nfunction postProcess (state: StateInline, delimiters: Delimiter[]) {\n  let token\n  const loneMarkers = []\n  const max = delimiters.length\n\n  for (let i = 0; i < max; i++) {\n    const startDelim = delimiters[i]\n\n    if (startDelim.marker !== 0x7E/* ~ */) {\n      continue\n    }\n\n    if (startDelim.end === -1) {\n      continue\n    }\n\n    const endDelim = delimiters[startDelim.end]\n\n    token = state.tokens[startDelim.token]\n    token.type = 's_open'\n    token.tag = 's'\n    token.nesting = 1\n    token.markup = '~~'\n    token.content = ''\n\n    token = state.tokens[endDelim.token]\n    token.type = 's_close'\n    token.tag = 's'\n    token.nesting = -1\n    token.markup = '~~'\n    token.content = ''\n\n    if (state.tokens[endDelim.token - 1].type === 'text' &&\n        state.tokens[endDelim.token - 1].content === '~') {\n      loneMarkers.push(endDelim.token - 1)\n    }\n  }\n\n  // If a marker sequence has an odd number of characters, it's splitted\n  // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the\n  // start of the sequence.\n  //\n  // So, we have to move all those markers after subsequent s_close tags.\n  //\n  while (loneMarkers.length) {\n    const i = loneMarkers.pop()!\n    let j = i + 1\n\n    while (j < state.tokens.length && state.tokens[j].type === 's_close') {\n      j++\n    }\n\n    j--\n\n    if (i !== j) {\n      token = state.tokens[j]\n      state.tokens[j] = state.tokens[i]\n      state.tokens[i] = token\n    }\n  }\n}\n\n// Walk through delimiter list and replace text tokens with tags\n//\nfunction strikethrough_postProcess (state: StateInline): void {\n  const tokens_meta = state.tokens_meta\n  const max = state.tokens_meta.length\n\n  postProcess(state, state.delimiters)\n\n  for (let curr = 0; curr < max; curr++) {\n    const delimiters = tokens_meta[curr]?.delimiters\n    if (delimiters) {\n      postProcess(state, delimiters)\n    }\n  }\n}\n\nexport default {\n  tokenize: strikethrough_tokenize,\n  postProcess: strikethrough_postProcess\n}\n","// Process *this* and _that_\n//\n\nimport type { Delimiter } from '../types.ts'\nimport type StateInline from './state_inline.ts'\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nfunction emphasis_tokenize (state: StateInline, silent: boolean): boolean {\n  const start = state.pos\n  const marker = state.src.charCodeAt(start)\n\n  if (silent) { return false }\n\n  if (marker !== 0x5F /* _ */ && marker !== 0x2A /* * */) { return false }\n\n  const scanned = state.scanDelims(state.pos, marker === 0x2A)\n\n  for (let i = 0; i < scanned.length; i++) {\n    const token = state.push('text', '', 0)\n    token.content = String.fromCharCode(marker)\n\n    state.delimiters.push({\n      // Char code of the starting marker (number).\n      //\n      marker,\n\n      // Total length of these series of delimiters.\n      //\n      length: scanned.length,\n\n      // A position of the token this delimiter corresponds to.\n      //\n      token: state.tokens.length - 1,\n\n      // If this delimiter is matched as a valid opener, `end` will be\n      // equal to its position, otherwise it's `-1`.\n      //\n      end: -1,\n\n      // Boolean flags that determine if this delimiter could open or close\n      // an emphasis.\n      //\n      open: scanned.can_open,\n      close: scanned.can_close\n    })\n  }\n\n  state.pos += scanned.length\n\n  return true\n}\n\nfunction postProcess (state: StateInline, delimiters: Delimiter[]) {\n  const max = delimiters.length\n\n  for (let i = max - 1; i >= 0; i--) {\n    const startDelim = delimiters[i]\n\n    if (startDelim.marker !== 0x5F/* _ */ && startDelim.marker !== 0x2A/* * */) {\n      continue\n    }\n\n    // Process only opening markers\n    if (startDelim.end === -1) {\n      continue\n    }\n\n    const endDelim = delimiters[startDelim.end]\n\n    // If the previous delimiter has the same marker and is adjacent to this one,\n    // merge those into one strong delimiter.\n    //\n    // `<em><em>whatever</em></em>` -> `<strong>whatever</strong>`\n    //\n    const isStrong = i > 0 &&\n               delimiters[i - 1].end === startDelim.end + 1 &&\n               // check that first two markers match and adjacent\n               delimiters[i - 1].marker === startDelim.marker &&\n               delimiters[i - 1].token === startDelim.token - 1 &&\n               // check that last two markers are adjacent (we can safely assume they match)\n               delimiters[startDelim.end + 1].token === endDelim.token + 1\n\n    const ch = String.fromCharCode(startDelim.marker)\n\n    const token_o = state.tokens[startDelim.token]\n    token_o.type = isStrong ? 'strong_open' : 'em_open'\n    token_o.tag = isStrong ? 'strong' : 'em'\n    token_o.nesting = 1\n    token_o.markup = isStrong ? ch + ch : ch\n    token_o.content = ''\n\n    const token_c = state.tokens[endDelim.token]\n    token_c.type = isStrong ? 'strong_close' : 'em_close'\n    token_c.tag = isStrong ? 'strong' : 'em'\n    token_c.nesting = -1\n    token_c.markup = isStrong ? ch + ch : ch\n    token_c.content = ''\n\n    if (isStrong) {\n      state.tokens[delimiters[i - 1].token].content = ''\n      state.tokens[delimiters[startDelim.end + 1].token].content = ''\n      i--\n    }\n  }\n}\n\n// Walk through delimiter list and replace text tokens with tags\n//\nfunction emphasis_post_process (state: StateInline): void {\n  const tokens_meta = state.tokens_meta\n  const max = state.tokens_meta.length\n\n  postProcess(state, state.delimiters)\n\n  for (let curr = 0; curr < max; curr++) {\n    const delimiters = tokens_meta[curr]?.delimiters\n    if (delimiters) {\n      postProcess(state, delimiters)\n    }\n  }\n}\n\nexport default {\n  tokenize: emphasis_tokenize,\n  postProcess: emphasis_post_process\n}\n","// Process [link](<to> \"stuff\")\n\nimport { normalizeReference, isSpace } from '../common/utils.ts'\nimport type StateInline from './state_inline.ts'\n\nexport default function link (state: StateInline, silent: boolean): boolean {\n  let code, label, res, ref\n  let href = ''\n  let title = ''\n  let start = state.pos\n  let parseReference = true\n\n  if (state.src.charCodeAt(state.pos) !== 0x5B/* [ */) { return false }\n\n  const oldPos = state.pos\n  const max = state.posMax\n  const labelStart = state.pos + 1\n  const labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true)\n\n  // parser failed to find ']', so it's not a valid link\n  if (labelEnd < 0) { return false }\n\n  let pos = labelEnd + 1\n  if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n    //\n    // Inline link\n    //\n\n    // might have found a valid shortcut link, disable reference parsing\n    parseReference = false\n\n    // [link](  <href>  \"title\"  )\n    //        ^^ skipping these spaces\n    pos++\n    for (; pos < max; pos++) {\n      code = state.src.charCodeAt(pos)\n      if (!isSpace(code) && code !== 0x0A) { break }\n    }\n    if (pos >= max) { return false }\n\n    // [link](  <href>  \"title\"  )\n    //          ^^^^^^ parsing link destination\n    start = pos\n    res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax)\n    if (res.ok) {\n      href = state.md.normalizeLink(res.str)\n      if (state.md.validateLink(href)) {\n        pos = res.pos\n      } else {\n        href = ''\n      }\n\n      // [link](  <href>  \"title\"  )\n      //                ^^ skipping these spaces\n      start = pos\n      for (; pos < max; pos++) {\n        code = state.src.charCodeAt(pos)\n        if (!isSpace(code) && code !== 0x0A) { break }\n      }\n\n      // [link](  <href>  \"title\"  )\n      //                  ^^^^^^^ parsing link title\n      res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax)\n      if (pos < max && start !== pos && res.ok) {\n        title = res.str\n        pos = res.pos\n\n        // [link](  <href>  \"title\"  )\n        //                         ^^ skipping these spaces\n        for (; pos < max; pos++) {\n          code = state.src.charCodeAt(pos)\n          if (!isSpace(code) && code !== 0x0A) { break }\n        }\n      }\n    }\n\n    if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n      // parsing a valid shortcut link failed, fallback to reference\n      parseReference = true\n    }\n    pos++\n  }\n\n  if (parseReference) {\n    //\n    // Link reference\n    //\n    if (typeof state.env.references === 'undefined') { return false }\n\n    if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n      start = pos + 1\n      pos = state.md.helpers.parseLinkLabel(state, pos)\n      if (pos >= 0) {\n        label = state.src.slice(start, pos++)\n      } else {\n        pos = labelEnd + 1\n      }\n    } else {\n      pos = labelEnd + 1\n    }\n\n    // covers label === '' and label === undefined\n    // (collapsed reference link and shortcut reference link respectively)\n    if (!label) { label = state.src.slice(labelStart, labelEnd) }\n\n    label = normalizeReference(label)\n    ref = state.env.references[label]\n    if (!ref) {\n      state.pos = oldPos\n      return false\n    }\n    href = ref.href\n    title = ref.title\n  }\n\n  //\n  // We found the end of the link, and know for a fact it's a valid link;\n  // so all that's left to do is to call tokenizer.\n  //\n  if (!silent) {\n    state.pos = labelStart\n    state.posMax = labelEnd\n\n    const token_o = state.push('link_open', 'a', 1)\n    const attrs: Array<[string, string]> = [['href', href]]\n    token_o.attrs = attrs\n    if (title) {\n      attrs.push(['title', title])\n    }\n    if (label) {\n      const meta: Record<string, unknown> = Object.create(null)\n      meta.label = label\n      token_o.meta = meta\n    }\n\n    state.linkLevel++\n    state.md.inline.tokenize(state)\n    state.linkLevel--\n\n    state.push('link_close', 'a', -1)\n  }\n\n  state.pos = pos\n  state.posMax = max\n  return true\n}\n","// Process ![image](<src> \"title\")\n\nimport { normalizeReference, isSpace } from '../common/utils.ts'\nimport type Token from '../token.ts'\nimport type StateInline from './state_inline.ts'\n\nexport default function image (state: StateInline, silent: boolean): boolean {\n  let code, content, label, pos, ref, res, title, start\n  let href = ''\n  const oldPos = state.pos\n  const max = state.posMax\n\n  if (state.src.charCodeAt(state.pos) !== 0x21/* ! */) { return false }\n  if (state.src.charCodeAt(state.pos + 1) !== 0x5B/* [ */) { return false }\n\n  const labelStart = state.pos + 2\n  const labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false)\n\n  // parser failed to find ']', so it's not a valid link\n  if (labelEnd < 0) { return false }\n\n  pos = labelEnd + 1\n  if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n    //\n    // Inline link\n    //\n\n    // [link](  <href>  \"title\"  )\n    //        ^^ skipping these spaces\n    pos++\n    for (; pos < max; pos++) {\n      code = state.src.charCodeAt(pos)\n      if (!isSpace(code) && code !== 0x0A) { break }\n    }\n    if (pos >= max) { return false }\n\n    // [link](  <href>  \"title\"  )\n    //          ^^^^^^ parsing link destination\n    start = pos\n    res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax)\n    if (res.ok) {\n      href = state.md.normalizeLink(res.str)\n      if (state.md.validateLink(href)) {\n        pos = res.pos\n      } else {\n        href = ''\n      }\n    }\n\n    // [link](  <href>  \"title\"  )\n    //                ^^ skipping these spaces\n    start = pos\n    for (; pos < max; pos++) {\n      code = state.src.charCodeAt(pos)\n      if (!isSpace(code) && code !== 0x0A) { break }\n    }\n\n    // [link](  <href>  \"title\"  )\n    //                  ^^^^^^^ parsing link title\n    res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax)\n    if (pos < max && start !== pos && res.ok) {\n      title = res.str\n      pos = res.pos\n\n      // [link](  <href>  \"title\"  )\n      //                         ^^ skipping these spaces\n      for (; pos < max; pos++) {\n        code = state.src.charCodeAt(pos)\n        if (!isSpace(code) && code !== 0x0A) { break }\n      }\n    } else {\n      title = ''\n    }\n\n    if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n      state.pos = oldPos\n      return false\n    }\n    pos++\n  } else {\n    //\n    // Link reference\n    //\n    if (typeof state.env.references === 'undefined') { return false }\n\n    if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n      start = pos + 1\n      pos = state.md.helpers.parseLinkLabel(state, pos)\n      if (pos >= 0) {\n        label = state.src.slice(start, pos++)\n      } else {\n        pos = labelEnd + 1\n      }\n    } else {\n      pos = labelEnd + 1\n    }\n\n    // covers label === '' and label === undefined\n    // (collapsed reference link and shortcut reference link respectively)\n    if (!label) { label = state.src.slice(labelStart, labelEnd) }\n\n    label = normalizeReference(label)\n    ref = state.env.references[label]\n    if (!ref) {\n      state.pos = oldPos\n      return false\n    }\n    href = ref.href\n    title = ref.title\n  }\n\n  //\n  // We found the end of the link, and know for a fact it's a valid link;\n  // so all that's left to do is to call tokenizer.\n  //\n  if (!silent) {\n    content = state.src.slice(labelStart, labelEnd)\n\n    const tokens: Token[] = []\n    state.md.inline.parse(\n      content,\n      state.md,\n      state.env,\n      tokens\n    )\n\n    const token = state.push('image', 'img', 0)\n    const attrs: Array<[string, string]> = [['src', href], ['alt', '']]\n    token.attrs = attrs\n    token.children = tokens\n    token.content = content\n\n    if (title) {\n      attrs.push(['title', title])\n    }\n    if (label) {\n      const meta: Record<string, unknown> = Object.create(null)\n      meta.label = label\n      token.meta = meta\n    }\n  }\n\n  state.pos = pos\n  state.posMax = max\n  return true\n}\n","// Process autolinks '<protocol:...>'\n\nimport type StateInline from './state_inline.ts'\n\n/* eslint max-len:0 */\nconst EMAIL_RE = /^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/\n/* eslint-disable-next-line no-control-regex */\nconst AUTOLINK_RE = /^([a-zA-Z][a-zA-Z0-9+.-]{1,31}):([^<>\\x00-\\x20]*)$/\n\nexport default function autolink (state: StateInline, silent: boolean): boolean {\n  let pos = state.pos\n\n  if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false }\n\n  const start = state.pos\n  const max = state.posMax\n\n  for (;;) {\n    if (++pos >= max) return false\n\n    const ch = state.src.charCodeAt(pos)\n\n    if (ch === 0x3C /* < */) return false\n    if (ch === 0x3E /* > */) break\n  }\n\n  const url = state.src.slice(start + 1, pos)\n\n  if (AUTOLINK_RE.test(url)) {\n    const fullUrl = state.md.normalizeLink(url)\n    if (!state.md.validateLink(fullUrl)) { return false }\n\n    if (!silent) {\n      const token_o = state.push('link_open', 'a', 1)\n      token_o.attrs = [['href', fullUrl]]\n      token_o.markup = 'autolink'\n      token_o.info = 'auto'\n\n      const token_t = state.push('text', '', 0)\n      token_t.content = state.md.normalizeLinkText(url)\n\n      const token_c = state.push('link_close', 'a', -1)\n      token_c.markup = 'autolink'\n      token_c.info = 'auto'\n    }\n\n    state.pos += url.length + 2\n    return true\n  }\n\n  if (EMAIL_RE.test(url)) {\n    const fullUrl = state.md.normalizeLink(`mailto:${url}`)\n    if (!state.md.validateLink(fullUrl)) { return false }\n\n    if (!silent) {\n      const token_o = state.push('link_open', 'a', 1)\n      token_o.attrs = [['href', fullUrl]]\n      token_o.markup = 'autolink'\n      token_o.info = 'auto'\n\n      const token_t = state.push('text', '', 0)\n      token_t.content = state.md.normalizeLinkText(url)\n\n      const token_c = state.push('link_close', 'a', -1)\n      token_c.markup = 'autolink'\n      token_c.info = 'auto'\n    }\n\n    state.pos += url.length + 2\n    return true\n  }\n\n  return false\n}\n","// Process html tags\n\nimport { HTML_TAG_RE } from '../common/html_re.ts'\nimport type StateInline from './state_inline.ts'\n\nfunction isLinkOpen (str: string) {\n  return /^<a[>\\s]/i.test(str)\n}\nfunction isLinkClose (str: string) {\n  return /^<\\/a\\s*>/i.test(str)\n}\n\nfunction isLetter (ch: number) {\n  /* eslint no-bitwise:0 */\n  const lc = ch | 0x20 // to lower case\n  return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */)\n}\n\nexport default function html_inline (state: StateInline, silent: boolean): boolean {\n  if (!state.md.options.html) { return false }\n\n  // Check start\n  const max = state.posMax\n  const pos = state.pos\n  if (state.src.charCodeAt(pos) !== 0x3C/* < */ ||\n      pos + 2 >= max) {\n    return false\n  }\n\n  // Quick fail on second char\n  const ch = state.src.charCodeAt(pos + 1)\n  if (ch !== 0x21/* ! */ &&\n      ch !== 0x3F/* ? */ &&\n      ch !== 0x2F/* / */ &&\n      !isLetter(ch)) {\n    return false\n  }\n\n  const match = state.src.slice(pos).match(HTML_TAG_RE)\n  if (!match) { return false }\n\n  if (!silent) {\n    const token = state.push('html_inline', '', 0)\n    token.content = match[0]\n\n    if (isLinkOpen(token.content)) state.linkLevel++\n    if (isLinkClose(token.content)) state.linkLevel--\n  }\n  state.pos += match[0].length\n  return true\n}\n","// Process html entity - &#123;, &#xAF;, &quot;, ...\n\nimport { decodeHTMLStrict } from 'entities'\nimport { isValidEntityCode, fromCodePoint } from '../common/utils.ts'\nimport type StateInline from './state_inline.ts'\n\nconst DIGITAL_RE = /^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i\nconst NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i\n\nexport default function entity (state: StateInline, silent: boolean): boolean {\n  const pos = state.pos\n  const max = state.posMax\n\n  if (state.src.charCodeAt(pos) !== 0x26/* & */) return false\n\n  if (pos + 1 >= max) return false\n\n  const ch = state.src.charCodeAt(pos + 1)\n\n  if (ch === 0x23 /* # */) {\n    const match = state.src.slice(pos).match(DIGITAL_RE)\n    if (match) {\n      if (!silent) {\n        const code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10)\n\n        const token = state.push('text_special', '', 0)\n        token.content = isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD)\n        token.markup = match[0]\n        token.info = 'entity'\n      }\n      state.pos += match[0].length\n      return true\n    }\n  } else {\n    const match = state.src.slice(pos).match(NAMED_RE)\n    if (match) {\n      const decoded = decodeHTMLStrict(match[0])\n      if (decoded !== match[0]) {\n        if (!silent) {\n          const token = state.push('text_special', '', 0)\n          token.content = decoded\n          token.markup = match[0]\n          token.info = 'entity'\n        }\n        state.pos += match[0].length\n        return true\n      }\n    }\n  }\n\n  return false\n}\n","// For each opening emphasis-like marker find a matching closing one\n//\n\nimport type { Delimiter } from '../types.ts'\nimport type StateInline from './state_inline.ts'\n\nfunction processDelimiters (delimiters: Delimiter[]) {\n  const openersBottom: Record<number, number[]> = {}\n  const max = delimiters.length\n\n  if (!max) return\n\n  // headerIdx is the first delimiter of the current (where closer is) delimiter run\n  let headerIdx = 0\n  let lastTokenIdx = -2 // needs any value lower than -1\n  const jumps: number[] = []\n\n  for (let closerIdx = 0; closerIdx < max; closerIdx++) {\n    const closer = delimiters[closerIdx]\n\n    jumps.push(0)\n\n    // markers belong to same delimiter run if:\n    //  - they have adjacent tokens\n    //  - AND markers are the same\n    //\n    if (delimiters[headerIdx].marker !== closer.marker || lastTokenIdx !== closer.token - 1) {\n      headerIdx = closerIdx\n    }\n\n    lastTokenIdx = closer.token\n\n    // Length is only used for emphasis-specific \"rule of 3\",\n    // if it's not defined (in strikethrough or 3rd party plugins),\n    // we can default it to 0 to disable those checks.\n    //\n    closer.length = closer.length || 0\n\n    if (!closer.close) continue\n\n    // Previously calculated lower bounds (previous fails)\n    // for each marker, each delimiter length modulo 3,\n    // and for whether this closer can be an opener;\n    // https://github.com/commonmark/cmark/commit/34250e12ccebdc6372b8b49c44fab57c72443460\n    /* eslint-disable-next-line no-prototype-builtins */\n    if (!openersBottom.hasOwnProperty(closer.marker)) {\n      openersBottom[closer.marker] = [-1, -1, -1, -1, -1, -1]\n    }\n\n    const minOpenerIdx = openersBottom[closer.marker][(closer.open ? 3 : 0) + (closer.length % 3)]\n\n    let openerIdx = headerIdx - jumps[headerIdx] - 1\n\n    let newMinOpenerIdx = openerIdx\n\n    for (; openerIdx > minOpenerIdx; openerIdx -= jumps[openerIdx] + 1) {\n      const opener = delimiters[openerIdx]\n\n      if (opener.marker !== closer.marker) continue\n\n      if (opener.open && opener.end < 0) {\n        let isOddMatch = false\n\n        // from spec:\n        //\n        // If one of the delimiters can both open and close emphasis, then the\n        // sum of the lengths of the delimiter runs containing the opening and\n        // closing delimiters must not be a multiple of 3 unless both lengths\n        // are multiples of 3.\n        //\n        if (opener.close || closer.open) {\n          if ((opener.length! + closer.length) % 3 === 0) {\n            if (opener.length! % 3 !== 0 || closer.length % 3 !== 0) {\n              isOddMatch = true\n            }\n          }\n        }\n\n        if (!isOddMatch) {\n          // If previous delimiter cannot be an opener, we can safely skip\n          // the entire sequence in future checks. This is required to make\n          // sure algorithm has linear complexity (see *_*_*_*_*_... case).\n          //\n          const lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open\n            ? jumps[openerIdx - 1] + 1\n            : 0\n\n          jumps[closerIdx] = closerIdx - openerIdx + lastJump\n          jumps[openerIdx] = lastJump\n\n          closer.open = false\n          opener.end = closerIdx\n          opener.close = false\n          newMinOpenerIdx = -1\n          // treat next token as start of run,\n          // it optimizes skips in **<...>**a**<...>** pathological case\n          lastTokenIdx = -2\n          break\n        }\n      }\n    }\n\n    if (newMinOpenerIdx !== -1) {\n      // If match for this delimiter run failed, we want to set lower bound for\n      // future lookups. This is required to make sure algorithm has linear\n      // complexity.\n      //\n      // See details here:\n      // https://github.com/commonmark/cmark/issues/178#issuecomment-270417442\n      //\n      openersBottom[closer.marker][(closer.open ? 3 : 0) + ((closer.length || 0) % 3)] = newMinOpenerIdx\n    }\n  }\n}\n\nexport default function link_pairs (state: StateInline): void {\n  const tokens_meta = state.tokens_meta\n  const max = state.tokens_meta.length\n\n  processDelimiters(state.delimiters)\n\n  for (let curr = 0; curr < max; curr++) {\n    const delimiters = tokens_meta[curr]?.delimiters\n    if (delimiters) {\n      processDelimiters(delimiters)\n    }\n  }\n}\n","// Clean up tokens after emphasis and strikethrough postprocessing:\n// merge adjacent text nodes into one and re-calculate all token levels\n//\n// This is necessary because initially emphasis delimiter markers (*, _, ~)\n// are treated as their own separate text tokens. Then emphasis rule either\n// leaves them as text (needed to merge with adjacent text) or turns them\n// into opening/closing tags (which messes up levels inside).\n//\n\nimport type StateInline from './state_inline.ts'\n\nexport default function fragments_join (state: StateInline): void {\n  let curr, last\n  let level = 0\n  const tokens = state.tokens\n  const max = state.tokens.length\n\n  for (curr = last = 0; curr < max; curr++) {\n    // re-calculate levels after emphasis/strikethrough turns some text nodes\n    // into opening/closing tags\n    if (tokens[curr].nesting < 0) level-- // closing tag\n    tokens[curr].level = level\n    if (tokens[curr].nesting > 0) level++ // opening tag\n\n    if (tokens[curr].type === 'text' &&\n        curr + 1 < max &&\n        tokens[curr + 1].type === 'text') {\n      // collapse two adjacent text nodes\n      tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content\n    } else {\n      if (curr !== last) { tokens[last] = tokens[curr] }\n\n      last++\n    }\n  }\n\n  if (curr !== last) {\n    tokens.length = last\n  }\n}\n","import Ruler from './ruler.ts'\nimport StateInline from './rules_inline/state_inline.ts'\nimport type Token from './token.ts'\nimport type MarkdownIt from './markdownit.ts'\nimport type { Env } from './types.ts'\n\nimport r_text from './rules_inline/text.ts'\nimport r_linkify from './rules_inline/linkify.ts'\nimport r_newline from './rules_inline/newline.ts'\nimport r_escape from './rules_inline/escape.ts'\nimport r_backticks from './rules_inline/backticks.ts'\nimport r_strikethrough from './rules_inline/strikethrough.ts'\nimport r_emphasis from './rules_inline/emphasis.ts'\nimport r_link from './rules_inline/link.ts'\nimport r_image from './rules_inline/image.ts'\nimport r_autolink from './rules_inline/autolink.ts'\nimport r_html_inline from './rules_inline/html_inline.ts'\nimport r_entity from './rules_inline/entity.ts'\n\nimport r_balance_pairs from './rules_inline/balance_pairs.ts'\nimport r_fragments_join from './rules_inline/fragments_join.ts'\n\n// Parser rules\n\nconst _rules: Array<[\n  name: string,\n  rule: (state: StateInline, silent: boolean) => boolean\n]> = [\n  ['text', r_text],\n  ['linkify', r_linkify],\n  ['newline', r_newline],\n  ['escape', r_escape],\n  ['backticks', r_backticks],\n  ['strikethrough', r_strikethrough.tokenize],\n  ['emphasis', r_emphasis.tokenize],\n  ['link', r_link],\n  ['image', r_image],\n  ['autolink', r_autolink],\n  ['html_inline', r_html_inline],\n  ['entity', r_entity]\n]\n\n// `rule2` ruleset was created specifically for emphasis/strikethrough\n// post-processing and may be changed in the future.\n//\n// Don't use this for anything except pairs (plugins working with `balance_pairs`).\n//\nconst _rules2: Array<[\n  name: string,\n  rule: (state: StateInline) => void\n]> = [\n  ['balance_pairs', r_balance_pairs],\n  ['strikethrough', r_strikethrough.postProcess],\n  ['emphasis', r_emphasis.postProcess],\n  // rules for pairs separate '**' into its own text tokens, which may be left unused,\n  // rule below merges unused segments back with the rest of the text\n  ['fragments_join', r_fragments_join]\n]\n\n/**\n * Tokenizes paragraph content.\n */\nclass ParserInline {\n  /**\n   * {@link Ruler} instance. Keep configuration of inline rules.\n   */\n  ruler = new Ruler<[StateInline, boolean], boolean>()\n\n  /**\n   * {@link Ruler} instance. Second ruler used for post-processing\n   * (e.g. in emphasis-like rules).\n   */\n  ruler2 = new Ruler<[StateInline], void>()\n\n  State = StateInline\n\n  constructor () {\n    for (let i = 0; i < _rules.length; i++) {\n      this.ruler.push(_rules[i][0], _rules[i][1])\n    }\n\n    for (let i = 0; i < _rules2.length; i++) {\n      this.ruler2.push(_rules2[i][0], _rules2[i][1])\n    }\n  }\n\n  // Skip single token by running all rules in validation mode;\n  // returns `true` if any rule reported success\n  //\n  skipToken (state: StateInline): void {\n    const pos = state.pos\n    const rules = this.ruler.getRules('')\n    const len = rules.length\n    const maxNesting = state.md.options.maxNesting\n    const cache = state.cache\n\n    if (typeof cache[pos] !== 'undefined') {\n      state.pos = cache[pos]\n      return\n    }\n\n    let ok = false\n\n    if (state.level < maxNesting) {\n      for (let i = 0; i < len; i++) {\n        // Increment state.level and decrement it later to limit recursion.\n        // It's harmless to do here, because no tokens are created. But ideally,\n        // we'd need a separate private state variable for this purpose.\n        //\n        state.level++\n        ok = rules[i](state, true)\n        state.level--\n\n        if (ok) {\n          if (pos >= state.pos) { throw new Error(\"inline rule didn't increment state.pos\") }\n          break\n        }\n      }\n    } else {\n      // Too much nesting, just skip until the end of the paragraph.\n      //\n      // NOTE: this will cause links to behave incorrectly in the following case,\n      //       when an amount of `[` is exactly equal to `maxNesting + 1`:\n      //\n      //       [[[[[[[[[[[[[[[[[[[[[foo]()\n      //\n      // TODO: remove this workaround when CM standard will allow nested links\n      //       (we can replace it by preventing links from being parsed in\n      //       validation mode)\n      //\n      state.pos = state.posMax\n    }\n\n    if (!ok) { state.pos++ }\n    cache[pos] = state.pos\n  }\n\n  // Generate tokens for input range\n  //\n  tokenize (state: StateInline): void {\n    const rules = this.ruler.getRules('')\n    const len = rules.length\n    const end = state.posMax\n    const maxNesting = state.md.options.maxNesting\n\n    while (state.pos < end) {\n      // Try all possible rules.\n      // On success, rule should:\n      //\n      // - update `state.pos`\n      // - update `state.tokens`\n      // - return true\n      const prevPos = state.pos\n      let ok = false\n\n      if (state.level < maxNesting) {\n        for (let i = 0; i < len; i++) {\n          ok = rules[i](state, false)\n          if (ok) {\n            if (prevPos >= state.pos) { throw new Error(\"inline rule didn't increment state.pos\") }\n            break\n          }\n        }\n      }\n\n      if (ok) {\n        if (state.pos >= end) { break }\n        continue\n      }\n\n      state.pending += state.src[state.pos++]\n    }\n\n    if (state.pending) {\n      state.pushPending()\n    }\n  }\n\n  /**\n   * Process input string and push inline tokens into `outTokens`\n   */\n  parse (str: string, md: MarkdownIt, env: Env, outTokens: Token[]): void {\n    const state = new this.State(str, md, env, outTokens)\n\n    this.tokenize(state)\n\n    const rules = this.ruler2.getRules('')\n    const len = rules.length\n\n    for (let i = 0; i < len; i++) {\n      rules[i](state)\n    }\n  }\n}\n\nexport default ParserInline\n","import { Any, Cc, P, Z } from \"uc.micro\";\n//#region src/rebuilder.ts\nvar REBuilder = class {\n\tsrc_Any = Any.source;\n\tsrc_Cc = Cc.source;\n\tsrc_Z = Z.source;\n\tsrc_P = P.source;\n\tsrc_ZPCc = [\n\t\tthis.src_Z,\n\t\tthis.src_P,\n\t\tthis.src_Cc\n\t].join(\"|\");\n\tsrc_ZCc = [this.src_Z, this.src_Cc].join(\"|\");\n\tcache = {};\n\topts = {\n\t\tmaxLength: 1e4,\n\t\turlAuth: false,\n\t\tschema_names: []\n\t};\n\tconstructor(opts = {}) {\n\t\tthis.opts = {\n\t\t\t...this.opts,\n\t\t\t...opts\n\t\t};\n\t}\n\tset(opts = {}) {\n\t\tthis.opts = {\n\t\t\t...this.opts,\n\t\t\t...opts\n\t\t};\n\t\tthis.cache = {};\n\t\treturn this;\n\t}\n\tescapeRE(str) {\n\t\treturn str.replace(/[.?*+^$[\\]\\\\(){}|-]/g, \"\\\\$&\");\n\t}\n\tnestedPairRE(open, close, depth = 4) {\n\t\tconst openRE = this.escapeRE(open);\n\t\tconst closeRE = this.escapeRE(close);\n\t\tconst atom = `(?:(?!${this.src_ZCc}|${openRE}|${closeRE}).)`;\n\t\tlet pair = `${openRE}${atom}{0,1000}${closeRE}`;\n\t\tfor (let level = 2; level <= depth; level++) pair = `${openRE}(?:${atom}|${pair}){0,1000}${closeRE}`;\n\t\treturn pair;\n\t}\n\tget_text_separators() {\n\t\treturn this.cache.text_separators ??= /[><\\uff5c]/;\n\t}\n\tget_pseudo_letter() {\n\t\treturn this.cache.src_pseudo_letter ??= new RegExp(`(?:(?!${this.get_text_separators().source}|${this.src_ZPCc})${this.src_Any})`);\n\t}\n\tget_ipv4_addr() {\n\t\treturn this.cache.src_ip4 ??= /* @__PURE__ */ new RegExp(\"(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])[.]){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\");\n\t}\n\tget_ipv6_addr() {\n\t\tconst h16 = \"[0-9A-Fa-f]{1,4}\";\n\t\tconst ls32 = `(?:(?:${h16}:${h16})|${this.get_ipv4_addr().source})`;\n\t\treturn this.cache.src_ip6_addr ??= new RegExp(`(?:(?:${h16}:){6}${ls32}|::(?:${h16}:){5}${ls32}|(?:${h16})?::(?:${h16}:){4}${ls32}|(?:(?:${h16}:){0,1}${h16})?::(?:${h16}:){3}${ls32}|(?:(?:${h16}:){0,2}${h16})?::(?:${h16}:){2}${ls32}|(?:(?:${h16}:){0,3}${h16})?::${h16}:${ls32}|(?:(?:${h16}:){0,4}${h16})?::${ls32}|(?:(?:${h16}:){0,5}${h16})?::${h16}|(?:(?:${h16}:){0,6}${h16})?::)`);\n\t}\n\tget_ipv6_url_host() {\n\t\treturn this.cache.src_ip6_host ??= new RegExp(`\\\\[${this.get_ipv6_addr().source}\\\\]`);\n\t}\n\tget_ipv6_mail_host() {\n\t\treturn this.cache.src_ipv6_mail_host ??= new RegExp(`\\\\[IPv6:${this.get_ipv6_addr().source}\\\\]`);\n\t}\n\tget_auth() {\n\t\treturn this.cache.src_auth ??= new RegExp(`(?:(?:(?!${this.src_ZCc}|[@/\\\\[\\\\]()]).){1,50}@)?`);\n\t}\n\tget_port() {\n\t\treturn this.cache.src_port ??= /* @__PURE__ */ new RegExp(\"(?::(?:6(?:[0-4]\\\\d{3}|5(?:[0-4]\\\\d{2}|5(?:[0-2]\\\\d|3[0-5])))|[1-5]?\\\\d{1,4}))?\");\n\t}\n\tget_host_terminator() {\n\t\treturn this.cache.src_host_terminator ??= new RegExp(`(?=$|${this.get_text_separators().source}|${this.src_ZPCc})(?!${this.opts[\"---\"] ? \"-(?!--)|\" : \"-|\"}_|:\\\\d|\\\\.-|\\\\.(?!$|${this.src_ZPCc}))`);\n\t}\n\tget_path_terminator() {\n\t\treturn this.cache.src_path_terminator ??= new RegExp(`${this.src_ZPCc}|${this.get_text_separators().source}`);\n\t}\n\tget_path() {\n\t\treturn this.cache.src_path ??= new RegExp(`(?:[/?#](?:${this.nestedPairRE(\"[\", \"]\")}|${this.nestedPairRE(\"(\", \")\")}|${this.nestedPairRE(\"{\", \"}\")}|\\\\\"(?:(?!${this.src_ZCc}|[\"]).){1,100}\\\\\"|\\\\'(?:(?!${this.src_ZCc}|[']).){1,100}\\\\'|\\\\'(?=${this.get_pseudo_letter().source}|[-])|\\\\.{2,20}[:]?[a-zA-Z0-9%/&]|\\\\.(?!${this.src_ZCc}|[.]|$)|` + (this.opts[\"---\"] ? \"\\\\-(?!--(?:[^-]|$))(?:-{0,19})|\" : \"\\\\-{1,20}|\") + `,(?!${this.src_ZCc}|$)|;(?!${this.src_ZCc}|$)|\\\\!{1,20}(?!${this.src_ZCc}|[!]|$)|\\\\?(?!${this.src_ZCc}|[?]|$)|` + this.get_path_extra().source + `[\\\\\\\\/:%@#&=_~*]|(?!${this.get_path_terminator().source}).){1,${this.opts.maxLength}}|\\\\/)?`);\n\t}\n\tget_mail_name() {\n\t\treturn this.cache.src_mail_name ??= /* @__PURE__ */ new RegExp(\"[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9](?:[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9]|[.](?=[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9])){0,63}\");\n\t}\n\tget_xn() {\n\t\treturn this.cache.src_xn ??= /* @__PURE__ */ new RegExp(\"xn--[a-z0-9\\\\-]{1,59}\");\n\t}\n\tget_tld() {\n\t\tif (this.cache.tld) return this.cache.tld;\n\t\tconst tlds_src = [...new Set(this.opts.tlds || [])].sort().reverse().join(\"|\");\n\t\tthis.cache.tld = new RegExp(`${tlds_src || \"$#none#$\"}|${this.get_xn().source}`);\n\t\treturn this.cache.tld;\n\t}\n\tget_domain_root() {\n\t\treturn this.cache.src_domain_root ??= new RegExp(\"(?:\" + this.get_xn().source + `|${this.get_pseudo_letter().source}{1,63})`);\n\t}\n\tget_domain() {\n\t\treturn this.cache.src_domain ??= new RegExp(\"(?:\" + this.get_xn().source + `|(?:${this.get_pseudo_letter().source})|(?:${this.get_pseudo_letter().source}(?:-|${this.get_pseudo_letter().source}){0,61}${this.get_pseudo_letter().source}))`);\n\t}\n\tget_url_host_port() {\n\t\treturn this.cache.url_host_port ??= new RegExp(\"(?:\" + this.get_ipv6_url_host().source + `|(?:(?:(?:${this.get_domain().source})\\\\.){0,10}${this.get_domain().source}))` + this.get_port().source + this.get_host_terminator().source);\n\t}\n\tget_fuzzy_url_host_port() {\n\t\treturn this.cache.fuzzy_url_host_port ??= new RegExp(\"(?:\" + (this.opts.fuzzyIP ? this.get_ipv4_addr().source + \"|\" : \"\") + `(?:(?:(?:${this.get_domain().source})\\\\.){1,10}(?:${this.get_tld().source})))` + this.get_host_terminator().source);\n\t}\n\tget_mail_host() {\n\t\treturn this.cache.src_mail_host ??= new RegExp(\"(?:\" + this.get_ipv6_mail_host().source + `|(?:(?:(?:${this.get_domain().source})\\\\.){0,4}${this.get_domain().source}))` + this.get_host_terminator().source);\n\t}\n\tget_fuzzy_mail_host() {\n\t\treturn this.cache.src_fuzzy_mail_host ??= new RegExp(\"(?:\" + this.get_ipv6_mail_host().source + `|(?:(?:(?:${this.get_domain().source})[.]){1,4}${this.get_domain_root().source}))` + this.get_host_terminator().source);\n\t}\n\tget_path_extra() {\n\t\treturn this.cache.src_path_extra ??= /* @__PURE__ */ new RegExp(\"\");\n\t}\n\tget_fuzzy_mail_host_search() {\n\t\treturn this.cache.mail_fuzzy_host_search ??= new RegExp(`@${this.get_fuzzy_mail_host().source}`, \"ig\");\n\t}\n\tget_fuzzy_link_search() {\n\t\treturn this.cache.link_fuzzy_search ??= new RegExp(`(^|(?![.:/\\\\-_@])(?:[$+<=>^\\`|\\uff5c]|${this.src_ZPCc}))(?:(?![$+<=>^\\`|\\uff5c])${this.get_fuzzy_url_host_port().source}${this.get_path().source})`, \"ig\");\n\t}\n\tget_http_validator() {\n\t\treturn this.cache.http_validator ??= new RegExp(\"\\\\/\\\\/\" + (this.opts.urlAuth ? this.get_auth().source : \"\") + this.get_url_host_port().source + this.get_path().source, \"iy\");\n\t}\n\tget_relative_proto_validator() {\n\t\treturn this.cache.relative_proto_validator ??= new RegExp((this.opts.urlAuth ? this.get_auth().source : \"\") + `(?:localhost|${this.get_ipv6_url_host().source}|(?:(?:${this.get_domain().source})[.]){1,10}${this.get_domain_root().source})` + this.get_port().source + this.get_host_terminator().source + this.get_path().source, \"iy\");\n\t}\n\tget_mail_name_validator() {\n\t\treturn this.cache.mail_name_validator ??= new RegExp(`(?:^|${this.get_text_separators().source}|\"|\\\\(|${this.src_ZCc})(${this.get_mail_name().source})$`);\n\t}\n\tget_mailto_validator() {\n\t\treturn this.cache.mailto_validator ??= new RegExp(`${this.get_mail_name().source}@${this.get_mail_host().source}`, \"iy\");\n\t}\n\tget_schema_names() {\n\t\treturn this.cache.schema_names ??= new RegExp((this.opts.schema_names || []).map((name) => this.escapeRE(name)).join(\"|\"));\n\t}\n\tget_schema_search() {\n\t\treturn this.cache.schema_search ??= new RegExp(`(^|(?!_)(?:[><\\uff5c]|${this.src_ZPCc}))(${this.get_schema_names().source})`, \"ig\");\n\t}\n\tget_schema_at_start() {\n\t\treturn this.cache.schema_at_start ??= new RegExp(`^${this.get_schema_search().source}`, \"i\");\n\t}\n};\n//#endregion\n//#region src/linkifyit.ts\nvar web_schema = {\n\tvalidate: (text, pos, self) => {\n\t\tconst re = self.re.get_http_validator();\n\t\tre.lastIndex = pos;\n\t\tconst m = re.exec(text);\n\t\treturn m ? m[0].length : 0;\n\t},\n\tnormalize: (match, self) => self.normalize(match)\n};\nvar defaultSchemas = {\n\t\"http:\": web_schema,\n\t\"https:\": web_schema,\n\t\"ftp:\": web_schema,\n\t\"//\": {\n\t\tvalidate: function(text, pos, self) {\n\t\t\tconst re = self.re.get_relative_proto_validator();\n\t\t\tre.lastIndex = pos;\n\t\t\tconst m = re.exec(text);\n\t\t\tif (m) {\n\t\t\t\tif (pos >= 3 && text[pos - 3] === \":\") return 0;\n\t\t\t\tif (pos >= 3 && text[pos - 3] === \"/\") return 0;\n\t\t\t\treturn m[0].length;\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\t\tnormalize: (match, self) => self.normalize(match)\n\t},\n\t\"mailto:\": {\n\t\tvalidate: function(text, pos, self) {\n\t\t\tconst re = self.re.get_mailto_validator();\n\t\t\tre.lastIndex = pos;\n\t\t\tconst m = re.exec(text);\n\t\t\treturn m ? m[0].length : 0;\n\t\t},\n\t\tnormalize: (match, self) => self.normalize(match)\n\t}\n};\nvar tlds_2ch = \"a:cdefgilmnoqrstuwxz|b:abdefghijmnorstvwyz|c:acdfghiklmnoruvwxyz|d:ejkmoz|e:cegrstu|f:ijkmor|g:abdefghilmnpqrstuwy|h:kmnrtu|i:delmnoqrst|j:emop|k:eghimnprwyz|l:abcikrstuvy|m:acdeghklmnopqrstuvwxyz|n:acefgilopruz|o:m|p:aefghklmnrstwy|q:a|r:eosuw|s:abcdeghijklmnortuvxyz|t:cdfghjklmnortvwz|u:agksyz|v:aceginu|w:fs|y:et|z:amw\";\nvar tlds_default = \"biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф\";\nfunction unpackTlds() {\n\tconst result = tlds_default.split(\"|\");\n\ttlds_2ch.split(\"|\").forEach((item) => {\n\t\tconst sep = item.indexOf(\":\");\n\t\tconst prefix = item.slice(0, sep);\n\t\tfor (const suffix of item.slice(sep + 1)) result.push(prefix + suffix);\n\t});\n\treturn result;\n}\nvar defaultOptions = {\n\tfuzzyLink: false,\n\tfuzzyEmail: true,\n\tfuzzyIP: false,\n\t\"---\": false,\n\ttlds: unpackTlds(),\n\turlAuth: false,\n\tmaxLength: 1e4\n};\n/**\n* Match result returned by {@link LinkifyIt.match} and\n* {@link LinkifyIt.matchAtStart}.\n*\n* @category types\n*/\nvar Match = class {\n\t/** Prefix (protocol) for matched string. Empty for fuzzy links. */\n\tschema;\n\t/** First position of matched string. */\n\tindex;\n\t/** Next position after matched string. */\n\tlastIndex;\n\t/** Matched string. */\n\traw;\n\t/** Normalized text of matched string. */\n\ttext;\n\t/** Normalized URL of matched string. */\n\turl;\n\tconstructor(text, schema, index, lastIndex) {\n\t\tconst raw = text.slice(index, lastIndex);\n\t\tthis.schema = schema.toLowerCase();\n\t\tthis.index = index;\n\t\tthis.lastIndex = lastIndex;\n\t\tthis.raw = raw;\n\t\tthis.text = raw;\n\t\tthis.url = raw;\n\t}\n};\n/** Linkifier instance. */\nvar LinkifyIt = class {\n\t__opts__;\n\t__schemas__;\n\tre;\n\t/**\n\t* Creates new linkifier instance.\n\t*\n\t* By default understands:\n\t*\n\t* - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links\n\t* - \"fuzzy\" emails (foo@bar.com).\n\t*\n\t* See {@link LinkifyConstructorOptions} for available options.\n\t*\n\t* @param options Recognition options.\n\t*\n\t* @example\n\t* ```javascript\n\t* import { LinkifyIt } from 'linkify-it'\n\t*\n\t* const linkify = new LinkifyIt({ fuzzyLink: true })\n\t*\n\t* linkify\n\t*   .tlds(require('tlds'))       // Reload with full TLD list\n\t*   .tlds('onion', true)         // Add unofficial `.onion` domain\n\t*   .add('ftp:', null)           // Disable `ftp:` protocol\n\t*   .set({ fuzzyIP: true })      // Enable IPs in fuzzy links\n\t*\n\t* console.log(linkify.test('Site github.com!')) // true\n\t* console.log(linkify.match('Site github.com!'))\n\t* ```\n\t*/\n\tconstructor(options = {}) {\n\t\tconst { rebuilder, ...linkifyOptions } = options;\n\t\tthis.__opts__ = {\n\t\t\t...defaultOptions,\n\t\t\t...linkifyOptions\n\t\t};\n\t\tthis.__schemas__ = { ...defaultSchemas };\n\t\tthis.re = rebuilder || new REBuilder();\n\t\tthis.re.set({\n\t\t\t...this.__opts__,\n\t\t\tschema_names: Object.keys(this.__schemas__)\n\t\t});\n\t}\n\t/**\n\t* Add new rule definition.\n\t*\n\t* `schema` is a link prefix (usually, protocol name with `:` at the end,\n\t* `skype:` for example). `linkify-it` makes sure that prefix is not\n\t* preceded with alphanumeric char and symbols. Only whitespaces and\n\t* punctuation allowed.\n\t*\n\t* `definition` is a rule to check tail after link prefix. To disable an\n\t* existing rule, pass `null`.\n\t*\n\t* @param schema Rule name (fixed pattern prefix).\n\t* @param definition Schema definition, or `null` to disable the rule.\n\t*\n\t* See [twitter mentions example](https://github.com/markdown-it/linkify-it/blob/master/examples/twitter.mjs).\n\t*/\n\tadd(schema, definition = null) {\n\t\tif (!definition) delete this.__schemas__[schema];\n\t\telse {\n\t\t\tconst def = {\n\t\t\t\tnormalize: (match, self) => self.normalize(match),\n\t\t\t\t...definition\n\t\t\t};\n\t\t\tthis.__schemas__[schema] = def;\n\t\t}\n\t\tthis.re.set({\n\t\t\t...this.__opts__,\n\t\t\tschema_names: Object.keys(this.__schemas__)\n\t\t});\n\t\treturn this;\n\t}\n\t/**\n\t* Set recognition options for links without schema.\n\t*\n\t* @param options Recognition options.\n\t*/\n\tset(options = {}) {\n\t\tthis.__opts__ = {\n\t\t\t...this.__opts__,\n\t\t\t...options\n\t\t};\n\t\tthis.re.set({\n\t\t\t...this.__opts__,\n\t\t\tschema_names: Object.keys(this.__schemas__)\n\t\t});\n\t\treturn this;\n\t}\n\t/**\n\t* Searches linkifiable pattern and returns `true` on success or `false` on fail.\n\t*\n\t* @param text Text to scan.\n\t*/\n\ttest(text) {\n\t\tif (!text.length) return false;\n\t\tlet m, re;\n\t\tre = this.re.get_schema_search();\n\t\tre.lastIndex = 0;\n\t\twhile ((m = re.exec(text)) !== null) if (this.testSchemaAt(text, m[2], re.lastIndex)) return true;\n\t\tif (this.__opts__.fuzzyLink && this.__schemas__[\"http:\"]) {\n\t\t\tre = this.re.get_fuzzy_link_search();\n\t\t\tre.lastIndex = 0;\n\t\t\tif (re.exec(text) !== null) return true;\n\t\t}\n\t\tif (this.__opts__.fuzzyEmail && this.__schemas__[\"mailto:\"]) {\n\t\t\tif (text.indexOf(\"@\") >= 0) {\n\t\t\t\tconst mailHostRe = this.re.get_fuzzy_mail_host_search();\n\t\t\t\tconst mailNameRe = this.re.get_mail_name_validator();\n\t\t\t\tmailHostRe.lastIndex = 0;\n\t\t\t\twhile ((m = mailHostRe.exec(text)) !== null) {\n\t\t\t\t\tconst name = text.slice(Math.max(0, m.index - 65), m.index);\n\t\t\t\t\tif (mailNameRe.test(name)) return true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t/**\n\t* Similar to {@link LinkifyIt.test} but checks only specific protocol tail exactly\n\t* at given position. Returns length of found pattern (0 on fail).\n\t*\n\t* @param text Text to scan.\n\t* @param schema Rule (schema) name.\n\t* @param pos Text offset to check from.\n\t*/\n\ttestSchemaAt(text, schema, pos) {\n\t\tif (!this.__schemas__[schema.toLowerCase()]) return 0;\n\t\treturn this.__schemas__[schema.toLowerCase()].validate(text.slice(0, pos + this.__opts__.maxLength), pos, this);\n\t}\n\t/**\n\t* Returns array of found link descriptions or `null` on fail. We strongly\n\t* recommend to use {@link LinkifyIt.test} first, for best speed.\n\t*\n\t* @param text Text to scan.\n\t*/\n\tmatch(text) {\n\t\tconst result = [];\n\t\tconst schemaRe = this.re.get_schema_search();\n\t\tlet fuzzyLinkRe;\n\t\tlet mailHostRe;\n\t\tlet mailNameRe;\n\t\tlet fuzzyLinkCandidate;\n\t\tlet fuzzyEmailCandidate;\n\t\tlet schemaPrefix;\n\t\tlet schemaDone = false;\n\t\tlet fuzzyLinkDone = false;\n\t\tlet fuzzyEmailDone = false;\n\t\tlet pos = 0;\n\t\tif (!text.length) return null;\n\t\tschemaRe.lastIndex = 0;\n\t\tif (this.__opts__.fuzzyLink && this.__schemas__[\"http:\"]) {\n\t\t\tfuzzyLinkRe = this.re.get_fuzzy_link_search();\n\t\t\tfuzzyLinkRe.lastIndex = 0;\n\t\t}\n\t\tif (this.__opts__.fuzzyEmail && this.__schemas__[\"mailto:\"]) {\n\t\t\tmailHostRe = this.re.get_fuzzy_mail_host_search();\n\t\t\tmailHostRe.lastIndex = 0;\n\t\t\tmailNameRe = this.re.get_mail_name_validator();\n\t\t}\n\t\tfor (;;) {\n\t\t\tconst scanFrom = Math.max(pos - 1, 0);\n\t\t\tif (mailHostRe && mailNameRe && !fuzzyEmailDone && (!fuzzyEmailCandidate || fuzzyEmailCandidate.index < pos)) {\n\t\t\t\tif (mailHostRe.lastIndex < scanFrom) mailHostRe.lastIndex = scanFrom;\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst m = mailHostRe.exec(text);\n\t\t\t\t\tif (!m) {\n\t\t\t\t\t\tfuzzyEmailDone = true;\n\t\t\t\t\t\tfuzzyEmailCandidate = void 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst name = mailNameRe.exec(text.slice(Math.max(0, m.index - 65), m.index));\n\t\t\t\t\tif (!name) continue;\n\t\t\t\t\tfuzzyEmailCandidate = {\n\t\t\t\t\t\tschema: \"mailto:\",\n\t\t\t\t\t\tindex: m.index - name[1].length,\n\t\t\t\t\t\tlastIndex: m.index + m[0].length\n\t\t\t\t\t};\n\t\t\t\t\tif (fuzzyEmailCandidate.index >= pos) break;\n\t\t\t\t\tif (mailHostRe.lastIndex < scanFrom) mailHostRe.lastIndex = scanFrom;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (fuzzyLinkRe && !fuzzyLinkDone && (!fuzzyLinkCandidate || fuzzyLinkCandidate.index < pos)) {\n\t\t\t\tif (fuzzyLinkRe.lastIndex < scanFrom) fuzzyLinkRe.lastIndex = scanFrom;\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst m = fuzzyLinkRe.exec(text);\n\t\t\t\t\tif (!m) {\n\t\t\t\t\t\tfuzzyLinkDone = true;\n\t\t\t\t\t\tfuzzyLinkCandidate = void 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tfuzzyLinkCandidate = {\n\t\t\t\t\t\tschema: \"\",\n\t\t\t\t\t\tindex: m.index + m[1].length,\n\t\t\t\t\t\tlastIndex: m.index + m[0].length\n\t\t\t\t\t};\n\t\t\t\t\tif (fuzzyLinkCandidate.index >= pos) break;\n\t\t\t\t\tif (fuzzyLinkRe.lastIndex < scanFrom) fuzzyLinkRe.lastIndex = scanFrom;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet fuzzyCandidate = fuzzyEmailCandidate;\n\t\t\tif (!fuzzyCandidate || fuzzyLinkCandidate && (fuzzyLinkCandidate.index < fuzzyCandidate.index || fuzzyLinkCandidate.index === fuzzyCandidate.index && fuzzyLinkCandidate.lastIndex > fuzzyCandidate.lastIndex)) fuzzyCandidate = fuzzyLinkCandidate;\n\t\t\tlet schemaCandidate;\n\t\t\tif (!schemaDone) for (;;) {\n\t\t\t\tif (!schemaPrefix) {\n\t\t\t\t\tif (schemaRe.lastIndex < scanFrom) schemaRe.lastIndex = scanFrom;\n\t\t\t\t\tconst m = schemaRe.exec(text);\n\t\t\t\t\tif (!m) {\n\t\t\t\t\t\tschemaDone = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tschemaPrefix = {\n\t\t\t\t\t\tschema: m[2],\n\t\t\t\t\t\tindex: m.index + m[1].length,\n\t\t\t\t\t\tlastIndex: m.index + m[0].length\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (schemaPrefix.index < pos) {\n\t\t\t\t\tschemaPrefix = void 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (fuzzyCandidate && schemaPrefix.index > fuzzyCandidate.index) break;\n\t\t\t\tconst prefix = schemaPrefix;\n\t\t\t\tschemaPrefix = void 0;\n\t\t\t\tconst len = this.testSchemaAt(text, prefix.schema, prefix.lastIndex);\n\t\t\t\tif (len) {\n\t\t\t\t\tschemaCandidate = {\n\t\t\t\t\t\tschema: prefix.schema,\n\t\t\t\t\t\tindex: prefix.index,\n\t\t\t\t\t\tlastIndex: prefix.lastIndex + len\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet candidate = schemaCandidate;\n\t\t\tif (!candidate || fuzzyEmailCandidate && (fuzzyEmailCandidate.index < candidate.index || fuzzyEmailCandidate.index === candidate.index && fuzzyEmailCandidate.lastIndex > candidate.lastIndex)) candidate = fuzzyEmailCandidate;\n\t\t\tif (!candidate || fuzzyLinkCandidate && (fuzzyLinkCandidate.index < candidate.index || fuzzyLinkCandidate.index === candidate.index && fuzzyLinkCandidate.lastIndex > candidate.lastIndex)) candidate = fuzzyLinkCandidate;\n\t\t\tif (!candidate) break;\n\t\t\tif (candidate === fuzzyEmailCandidate) fuzzyEmailCandidate = void 0;\n\t\t\telse if (candidate === fuzzyLinkCandidate) fuzzyLinkCandidate = void 0;\n\t\t\tconst match = new Match(text, candidate.schema, candidate.index, candidate.lastIndex);\n\t\t\tif (match.schema) this.__schemas__[match.schema].normalize(match, this);\n\t\t\telse this.normalize(match);\n\t\t\tresult.push(match);\n\t\t\tpos = candidate.lastIndex;\n\t\t}\n\t\tif (result.length) return result;\n\t\treturn null;\n\t}\n\t/**\n\t* Returns fully-formed (not fuzzy) link if it starts at the beginning\n\t* of the string, and null otherwise.\n\t*\n\t* @param text Text to scan.\n\t*/\n\tmatchAtStart(text) {\n\t\tif (!text.length) return null;\n\t\tconst m = this.re.get_schema_at_start().exec(text);\n\t\tif (!m) return null;\n\t\tconst len = this.testSchemaAt(text, m[2], m[0].length);\n\t\tif (!len) return null;\n\t\tconst match = new Match(text, m[2], m.index + m[1].length, m.index + m[0].length + len);\n\t\tthis.__schemas__[match.schema].normalize(match, this);\n\t\treturn match;\n\t}\n\t/**\n\t* Load (or merge) new TLDs list. Those are used for fuzzy links (without\n\t* prefix) to avoid false positives. By default this algorithm is used:\n\t*\n\t* - hostname with any 2-letter root zones are ok.\n\t* - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф\n\t*   are ok.\n\t* - encoded (`xn--...`) root zones are ok.\n\t*\n\t* If list is replaced, then exact match for 2-chars root zones will be checked.\n\t*\n\t* @param list List of TLDs.\n\t* @param keepOld Merge with current list if `true` (`false` by default).\n\t*/\n\ttlds(list, keepOld = false) {\n\t\tlist = Array.isArray(list) ? list : [list];\n\t\tif (!keepOld) this.__opts__.tlds = list;\n\t\telse this.__opts__.tlds = this.__opts__.tlds.concat(list);\n\t\tthis.re.set({\n\t\t\t...this.__opts__,\n\t\t\tschema_names: Object.keys(this.__schemas__)\n\t\t});\n\t\treturn this;\n\t}\n\t/**\n\t* Default normalizer (if schema does not define its own).\n\t*\n\t* @param match Match to normalize.\n\t*/\n\tnormalize(match) {\n\t\tif (!match.schema) match.url = `http://${match.url}`;\n\t\tif (match.schema === \"mailto:\" && !/^mailto:/i.test(match.url)) match.url = `mailto:${match.url}`;\n\t}\n};\nfunction linkifyit(options = {}) {\n\treturn new LinkifyIt(options);\n}\n//#endregion\nexport { LinkifyIt, REBuilder, linkifyit };\n\n//# sourceMappingURL=index.mjs.map","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7F]/; // Note: U+007F DEL is excluded too.\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, callback) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = callback(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {String} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(domain, callback) {\n\tconst parts = domain.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tdomain = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tdomain = domain.replace(regexSeparators, '\\x2E');\n\tconst labels = domain.split('.');\n\tconst encoded = map(labels, callback).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = codePoints => String.fromCodePoint(...codePoints);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint >= 0x30 && codePoint < 0x3A) {\n\t\treturn 26 + (codePoint - 0x30);\n\t}\n\tif (codePoint >= 0x41 && codePoint < 0x5B) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint >= 0x61 && codePoint < 0x7B) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t//  0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tconst oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\t\t\tif (digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tconst inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tconst basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue === n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.3.1',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport { ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode };\nexport default punycode;\n","// markdown-it default options\n\nimport type { MarkdownItOptions } from '../types.ts'\n\nconst options: Required<MarkdownItOptions> = {\n  // Enable HTML tags in source\n  html: false,\n\n  // Use '/' to close single tags (<br />)\n  xhtmlOut: false,\n\n  // Convert '\\n' in paragraphs into <br>\n  breaks: false,\n\n  // CSS language prefix for fenced blocks\n  langPrefix: 'language-',\n\n  // autoconvert URL-like texts to links\n  linkify: false,\n\n  // Enable some language-neutral replacements + quotes beautification\n  typographer: false,\n\n  // Double + single quotes replacement pairs, when typographer enabled,\n  // and smartquotes on. Could be either a String or an Array.\n  //\n  // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n  // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n  quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n  // Highlighter function. Should return escaped HTML,\n  // or '' if the source string is not changed and should be escaped externaly.\n  // If result starts with <pre... internal wrapper is skipped.\n  //\n  // function (/*str, lang*/) { return ''; }\n  //\n  highlight: null,\n\n  // Internal protection, recursion limit\n  maxNesting: 100\n}\n\nexport default {\n  options,\n\n  components: {\n    core: {},\n    block: {},\n    inline: {}\n  }\n}\n","// \"Zero\" preset, with nothing enabled. Useful for manual configuring of simple\n// modes. For example, to parse bold/italic only.\n\nimport type { MarkdownItOptions } from '../types.ts'\n\nconst options: Required<MarkdownItOptions> = {\n  // Enable HTML tags in source\n  html: false,\n\n  // Use '/' to close single tags (<br />)\n  xhtmlOut: false,\n\n  // Convert '\\n' in paragraphs into <br>\n  breaks: false,\n\n  // CSS language prefix for fenced blocks\n  langPrefix: 'language-',\n\n  // autoconvert URL-like texts to links\n  linkify: false,\n\n  // Enable some language-neutral replacements + quotes beautification\n  typographer: false,\n\n  // Double + single quotes replacement pairs, when typographer enabled,\n  // and smartquotes on. Could be either a String or an Array.\n  //\n  // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n  // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n  quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n  // Highlighter function. Should return escaped HTML,\n  // or '' if the source string is not changed and should be escaped externaly.\n  // If result starts with <pre... internal wrapper is skipped.\n  //\n  // function (/*str, lang*/) { return ''; }\n  //\n  highlight: null,\n\n  // Internal protection, recursion limit\n  maxNesting: 20\n}\n\nexport default {\n  options,\n\n  components: {\n\n    core: {\n      rules: [\n        'normalize',\n        'block',\n        'strip_references',\n        'inline',\n        'text_join'\n      ]\n    },\n\n    block: {\n      rules: [\n        'paragraph'\n      ]\n    },\n\n    inline: {\n      rules: [\n        'text'\n      ],\n      rules2: [\n        'balance_pairs',\n        'fragments_join'\n      ]\n    }\n  }\n}\n","// Commonmark default options\n\nimport type { MarkdownItOptions } from '../types.ts'\n\nconst options: Required<MarkdownItOptions> = {\n  // Enable HTML tags in source\n  html: true,\n\n  // Use '/' to close single tags (<br />)\n  xhtmlOut: true,\n\n  // Convert '\\n' in paragraphs into <br>\n  breaks: false,\n\n  // CSS language prefix for fenced blocks\n  langPrefix: 'language-',\n\n  // autoconvert URL-like texts to links\n  linkify: false,\n\n  // Enable some language-neutral replacements + quotes beautification\n  typographer: false,\n\n  // Double + single quotes replacement pairs, when typographer enabled,\n  // and smartquotes on. Could be either a String or an Array.\n  //\n  // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n  // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n  quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n  // Highlighter function. Should return escaped HTML,\n  // or '' if the source string is not changed and should be escaped externaly.\n  // If result starts with <pre... internal wrapper is skipped.\n  //\n  // function (/*str, lang*/) { return ''; }\n  //\n  highlight: null,\n\n  // Internal protection, recursion limit\n  maxNesting: 20\n}\n\nexport default {\n  options,\n\n  components: {\n\n    core: {\n      rules: [\n        'normalize',\n        'block',\n        'strip_references',\n        'inline',\n        'text_join'\n      ]\n    },\n\n    block: {\n      rules: [\n        'blockquote',\n        'code',\n        'fence',\n        'heading',\n        'hr',\n        'html_block',\n        'lheading',\n        'list',\n        'reference',\n        'paragraph'\n      ]\n    },\n\n    inline: {\n      rules: [\n        'autolink',\n        'backticks',\n        'emphasis',\n        'entity',\n        'escape',\n        'html_inline',\n        'image',\n        'link',\n        'newline',\n        'text'\n      ],\n      rules2: [\n        'balance_pairs',\n        'emphasis',\n        'fragments_join'\n      ]\n    }\n  }\n}\n","// Main parser class\n\nimport * as utils from './common/utils.ts'\nimport * as helpers from './helpers/index.ts'\nimport Token from './token.ts'\nimport Ruler from './ruler.ts'\nimport Renderer from './renderer.ts'\nimport ParserCore from './parser_core.ts'\nimport StateCore from './rules_core/state_core.ts'\nimport ParserBlock from './parser_block.ts'\nimport StateBlock from './rules_block/state_block.ts'\nimport ParserInline from './parser_inline.ts'\nimport StateInline from './rules_inline/state_inline.ts'\nimport { LinkifyIt } from 'linkify-it'\nimport * as mdurl from 'mdurl'\nimport punycode from 'punycode.js'\n\nimport cfg_default from './presets/default.ts'\nimport cfg_zero from './presets/zero.ts'\nimport cfg_commonmark from './presets/commonmark.ts'\nimport type { Env, MarkdownItOptions } from './types.ts'\n\nconst config = {\n  default: cfg_default,\n  zero: cfg_zero,\n  commonmark: cfg_commonmark\n}\n\ntype MarkdownItPresetName = keyof typeof config\n\n/**\n * Parser preset containing options and enabled rules for each parser component.\n */\nexport interface MarkdownItPreset {\n  options?: Required<MarkdownItOptions>\n  components?: {\n    core?: {\n      rules?: string[]\n    }\n    block?: {\n      rules?: string[]\n    }\n    inline?: {\n      rules?: string[]\n      rules2?: string[]\n    }\n  }\n}\n\ntype MarkdownItComponentName = keyof NonNullable<MarkdownItPreset['components']>\n\n//\n// This validator can prohibit more than really needed to prevent XSS. It's a\n// tradeoff to keep code simple and to be secure by default.\n//\n// If you need different setup - override validator method as you wish. Or\n// replace it with dummy function and use external sanitizer.\n//\n\nconst BAD_PROTO_RE = /^(vbscript|javascript|file|data):/\nconst GOOD_DATA_RE = /^data:image\\/(gif|png|jpeg|webp);/\n\nconst RECODE_HOSTNAME_FOR = ['http:', 'https:', 'mailto:']\n\n/**\n * Parses Markdown into tokens and renders them to HTML.\n *\n * @category Main\n */\nclass MarkdownIt {\n  /**\n   * Instance of {@link ParserInline}. You may need it to add new rules when\n   * writing plugins. For simple rules control use {@link MarkdownIt.disable}\n   * and {@link MarkdownIt.enable}.\n   */\n  inline = new ParserInline()\n\n  /**\n   * Instance of {@link ParserBlock}. You may need it to add new rules when\n   * writing plugins. For simple rules control use {@link MarkdownIt.disable}\n   * and {@link MarkdownIt.enable}.\n   */\n  block = new ParserBlock()\n\n  /**\n   * Instance of {@link ParserCore} chain executor. You may need it to add new\n   * rules when writing plugins. For simple rules control use\n   * {@link MarkdownIt.disable} and {@link MarkdownIt.enable}.\n   */\n  core = new ParserCore()\n\n  /**\n   * Instance of {@link Renderer}. Use it to modify output look. Or to add rendering\n   * rules for new token types, generated by plugins.\n   *\n   * See {@link Renderer} docs and\n   * [source code](https://github.com/markdown-it/markdown-it/blob/master/src/renderer.ts).\n   *\n   * @example\n   * ```javascript\n   * import MarkdownIt from 'markdown-it'\n   * const md = new MarkdownIt()\n   *\n   * function myToken(tokens, idx, options, env, self) {\n   *   //...\n   *   return result;\n   * };\n   *\n   * md.renderer.rules['my_token'] = myToken\n   * ```\n   */\n  renderer = new Renderer()\n\n  /**\n   * [linkify-it](https://github.com/markdown-it/linkify-it) instance.\n   * Used by [linkify](https://github.com/markdown-it/markdown-it/blob/master/src/rules_core/linkify.ts)\n   * rule.\n   */\n  linkify = new LinkifyIt()\n\n  /**\n   * Link validation function. CommonMark allows too much in links. By default\n   * we disable `javascript:`, `vbscript:`, `file:` schemas, and almost all `data:...` schemas\n   * except some embedded image types.\n   *\n   * You can change this behaviour:\n   *\n   * @example\n   * ```javascript\n   * import MarkdownIt from 'markdown-it'\n   * const md = new MarkdownIt()\n   *\n   * // enable everything\n   * md.validateLink = function () { return true; }\n   * ```\n   */\n  validateLink (url: string): boolean {\n    // url should be normalized at this point, and existing entities are decoded\n    const str = url.trim().toLowerCase()\n\n    return BAD_PROTO_RE.test(str) ? GOOD_DATA_RE.test(str) : true\n  }\n\n  /**\n   * Function used to encode link url to a machine-readable format,\n   * which includes url-encoding, punycode, etc.\n   */\n  normalizeLink (url: string): string {\n    const parsed = mdurl.parse(url, true)\n\n    if (parsed.hostname) {\n      // Encode hostnames in urls like:\n      // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n      //\n      // We don't encode unknown schemas, because it's likely that we encode\n      // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n      //\n      if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n        try {\n          parsed.hostname = punycode.toASCII(parsed.hostname)\n        } catch (er) { /**/ }\n      }\n    }\n\n    return mdurl.encode(mdurl.format(parsed))\n  }\n\n  /**\n   * Function used to decode link url to a human-readable format`\n   */\n  normalizeLinkText (url: string): string {\n    const parsed = mdurl.parse(url, true)\n\n    if (parsed.hostname) {\n      // Encode hostnames in urls like:\n      // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n      //\n      // We don't encode unknown schemas, because it's likely that we encode\n      // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n      //\n      if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n        try {\n          parsed.hostname = punycode.toUnicode(parsed.hostname)\n        } catch (er) { /**/ }\n      }\n    }\n\n    // add '%' to exclude list because of https://github.com/markdown-it/markdown-it/issues/720\n    return mdurl.decode(mdurl.format(parsed), mdurl.decode.defaultChars + '%')\n  }\n\n  // Expose utils & helpers for easy acces from plugins\n\n  /**\n   * Assorted utility functions, useful to write plugins. See details\n   * [here](https://github.com/markdown-it/markdown-it/blob/master/src/common/utils.ts).\n   */\n  utils = utils\n\n  /**\n   * Link components parser functions, useful to write plugins. See details\n   * [here](https://github.com/markdown-it/markdown-it/blob/master/src/helpers).\n   */\n  helpers = Object.assign({}, helpers)\n\n  declare options: Required<MarkdownItOptions>\n\n  constructor (\n    ...args:\n      | []\n      | [options: MarkdownItOptions]\n      | [presetName: MarkdownItPresetName, options?: MarkdownItOptions]\n  ) {\n    const [presetNameOrOptions, options] = args\n\n    if (typeof presetNameOrOptions === 'string') {\n      this.configure(presetNameOrOptions)\n      if (options) { this.set(options) }\n    } else {\n      this.configure('default')\n      this.set(presetNameOrOptions || {})\n    }\n  }\n\n  /**\n   * Set parser options (in the same format as in constructor). Probably, you\n   * will never need it, but you can change options after constructor call.\n   *\n   * __Note:__ To achieve the best possible performance, don't modify a\n   * `markdown-it` instance options on the fly. If you need multiple configurations\n   * it's best to create multiple instances and initialize each with separate\n   * config.\n   *\n   * @example\n   * ```javascript\n   * import MarkdownIt from 'markdown-it'\n   *\n   * const md = new MarkdownIt()\n   *   .set({ html: true, breaks: true })\n   *   .set({ typographer: true })\n   * ```\n   */\n  set (options: MarkdownItOptions): this {\n    Object.assign(this.options, options)\n    return this\n  }\n\n  /**\n   * Batch load of all options and compenent settings. This is internal method,\n   * and you probably will not need it. But if you will - see available presets\n   * and data structure [here](https://github.com/markdown-it/markdown-it/tree/master/src/presets)\n   *\n   * We strongly recommend to use presets instead of direct config loads. That\n   * will give better compatibility with next versions.\n   */\n  configure (presets: MarkdownItPresetName | MarkdownItPreset): this {\n    let p: MarkdownItPreset\n\n    if (typeof presets === 'string') {\n      const presetName = presets\n      p = config[presetName]\n      if (!p) { throw new Error(`Wrong 'markdown-it' preset \"${presetName}\", check name`) }\n    } else {\n      p = presets\n    }\n\n    if (!p) { throw new Error('Wrong `markdown-it` preset, can\\'t be empty') }\n\n    if (p.options) { this.options = { ...p.options } }\n\n    const components = p.components\n    if (components) {\n      const componentNames: MarkdownItComponentName[] = ['core', 'block', 'inline']\n      componentNames.forEach((name) => {\n        const rules = components[name]?.rules\n        if (rules) {\n          this[name].ruler.enableOnly(rules)\n        }\n      })\n\n      const rules2 = components.inline?.rules2\n      if (rules2) {\n        this.inline.ruler2.enableOnly(rules2)\n      }\n    }\n    return this\n  }\n\n  /**\n   * Enable list or rules. It will automatically find appropriate components,\n   * containing rules with given names. If rule not found, and `ignoreInvalid`\n   * not set - throws exception.\n   *\n   * @param list Rule name or list of rule names to enable.\n   * @param ignoreInvalid Set `true` to ignore errors when rule not found.\n   *\n   * @example\n   * ```javascript\n   * import MarkdownIt from 'markdown-it'\n   *\n   * const md = new MarkdownIt()\n   *   .enable(['sub', 'sup'])\n   *   .disable('smartquotes')\n   * ```\n   */\n  enable (list: string | string[], ignoreInvalid = false): this {\n    let result: string[] = []\n\n    if (!Array.isArray(list)) { list = [list] }\n\n    const chains: MarkdownItComponentName[] = ['core', 'block', 'inline']\n    chains.forEach((chain) => {\n      result = result.concat(this[chain].ruler.enable(list, true))\n    })\n\n    result = result.concat(this.inline.ruler2.enable(list, true))\n\n    const missed = list.filter((name) => result.indexOf(name) < 0)\n\n    if (missed.length && !ignoreInvalid) {\n      throw new Error(`MarkdownIt. Failed to enable unknown rule(s): ${missed}`)\n    }\n\n    return this\n  }\n\n  /**\n   * The same as {@link MarkdownIt.enable}, but turn specified rules off.\n   *\n   * @param list Rule name or list of rule names to disable.\n   * @param ignoreInvalid Set `true` to ignore errors when rule not found.\n   */\n  disable (list: string | string[], ignoreInvalid = false): this {\n    let result: string[] = []\n\n    if (!Array.isArray(list)) { list = [list] }\n\n    const chains: MarkdownItComponentName[] = ['core', 'block', 'inline']\n    chains.forEach((chain) => {\n      result = result.concat(this[chain].ruler.disable(list, true))\n    })\n\n    result = result.concat(this.inline.ruler2.disable(list, true))\n\n    const missed = list.filter((name) => result.indexOf(name) < 0)\n\n    if (missed.length && !ignoreInvalid) {\n      throw new Error(`MarkdownIt. Failed to disable unknown rule(s): ${missed}`)\n    }\n    return this\n  }\n\n  /**\n   * Load specified plugin with given params into current parser instance.\n   * It's just a sugar to call `plugin(md, params)` with curring.\n   *\n   * @example\n   * ```javascript\n   * import MarkdownIt from 'markdown-it'\n   * import iterator from 'markdown-it-for-inline'\n   *\n   * const md = new MarkdownIt()\n   *   .use(iterator, 'foo_replace', 'text', function (tokens, idx) {\n   *     tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar')\n   *   })\n   * ```\n   */\n  use<Params extends unknown[]> (\n    plugin: (md: this, ...params: Params) => void,\n    ...params: Params\n  ): this {\n    plugin.apply(plugin, [this, ...params])\n    return this\n  }\n\n  /**\n   * Parse input string and return list of block tokens (special token type\n   * \"inline\" will contain list of inline tokens). You should not call this\n   * method directly, until you write custom renderer (for example, to produce\n   * AST).\n   *\n   * `env` is used to pass data between \"distributed\" rules and return additional\n   * metadata like reference info, needed for the renderer. It also can be used to\n   * inject data in specific cases. Usually, you will be ok to pass `{}`,\n   * and then pass updated object to renderer.\n   *\n   * @param src Source string.\n   * @param env Environment sandbox.\n   */\n  parse (src: string, env: Env): Token[] {\n    if (typeof src !== 'string') {\n      throw new Error('Input data should be a String')\n    }\n\n    const state = new this.core.State(src, this, env)\n\n    this.core.process(state)\n\n    return state.tokens\n  }\n\n  /**\n   * Render markdown string into html. It does all magic for you :).\n   *\n   * `env` can be used to inject additional metadata (`{}` by default).\n   * But you will not need it with high probability. See also comment\n   * in {@link MarkdownIt.parse}.\n   *\n   * @param src Source string.\n   * @param env Environment sandbox.\n   */\n  render (src: string, env: Env = {}): string {\n    return this.renderer.render(this.parse(src, env), this.options, env)\n  }\n\n  /**\n   * The same as {@link MarkdownIt.parse} but skip all block rules. It returns\n   * the block tokens list with the single `inline` element, containing parsed\n   * inline tokens in `children` property. Also updates `env` object.\n   *\n   * @param src Source string.\n   * @param env Environment sandbox.\n   */\n  parseInline (src: string, env: Env): Token[] {\n    const state = new this.core.State(src, this, env)\n\n    state.inlineMode = true\n    this.core.process(state)\n\n    return state.tokens\n  }\n\n  /**\n   * Similar to {@link MarkdownIt.render} but for single paragraph content.\n   * Result will NOT be wrapped into `<p>` tags.\n   *\n   * @param src Source string.\n   * @param env Environment sandbox.\n   */\n  renderInline (src: string, env: Env = {}): string {\n    return this.renderer.render(this.parseInline(src, env), this.options, env)\n  }\n\n  static Token = Token\n  static Ruler = Ruler\n  static Renderer = Renderer\n  static ParserCore = ParserCore\n  static StateCore = StateCore\n  static ParserBlock = ParserBlock\n  static StateBlock = StateBlock\n  static ParserInline = ParserInline\n  static StateInline = StateInline\n}\n\nexport default MarkdownIt\n","import { callable } from './common/utils.ts'\nimport MarkdownIt from './markdownit.ts'\n\n/**\n * Default package export.\n *\n * For backward compatibility, the {@link MarkdownIt} class is wrapped so\n * legacy code can call it without `new`. New code should instantiate it as a\n * regular class with `new`. The compatibility wrapper may be removed in a\n * future release.\n *\n * @category Main\n */\nconst MarkdownItCallable = callable(MarkdownIt)\n\nexport default MarkdownItCallable\n\nexport type { default as MarkdownIt, MarkdownItPreset } from './markdownit.ts'\nexport type { Delimiter, Env, MarkdownItOptions } from './types.ts'\nexport type { default as Token } from './token.ts'\nexport type { default as Ruler } from './ruler.ts'\nexport type { default as Renderer, RendererRule } from './renderer.ts'\nexport type { default as ParserCore } from './parser_core.ts'\nexport type { default as StateCore } from './rules_core/state_core.ts'\nexport type { default as ParserBlock } from './parser_block.ts'\nexport type { default as StateBlock } from './rules_block/state_block.ts'\nexport type { default as ParserInline } from './parser_inline.ts'\nexport type { default as StateInline } from './rules_inline/state_inline.ts'\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,60,61],"mappings":"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"}