{"version":3,"file":"comments-ziLjzWom.js","sources":["../node_modules/dayjs/dayjs.min.js","../node_modules/marked/lib/marked.esm.js","../node_modules/htmlparser2/node_modules/entities/dist/decode-codepoint.js","../node_modules/htmlparser2/node_modules/entities/dist/internal/decode-shared.js","../node_modules/htmlparser2/node_modules/entities/dist/generated/decode-data-html.js","../node_modules/htmlparser2/node_modules/entities/dist/generated/decode-data-xml.js","../node_modules/htmlparser2/node_modules/entities/dist/internal/bin-trie-flags.js","../node_modules/htmlparser2/node_modules/entities/dist/decode.js","../node_modules/htmlparser2/dist/Tokenizer.js","../node_modules/htmlparser2/dist/Parser.js","../node_modules/htmlparser2/node_modules/domelementtype/dist/index.js","../node_modules/htmlparser2/node_modules/domhandler/dist/node.js","../node_modules/htmlparser2/node_modules/domhandler/dist/index.js","../node_modules/htmlparser2/node_modules/domutils/dist/querying.js","../node_modules/htmlparser2/node_modules/domutils/dist/legacy.js","../node_modules/htmlparser2/node_modules/entities/dist/escape.js","../node_modules/htmlparser2/node_modules/dom-serializer/dist/foreign-names.js","../node_modules/htmlparser2/node_modules/dom-serializer/dist/index.js","../node_modules/htmlparser2/node_modules/domutils/dist/stringify.js","../node_modules/htmlparser2/node_modules/domutils/dist/feeds.js","../node_modules/htmlparser2/node_modules/domutils/dist/helpers.js","../node_modules/htmlparser2/node_modules/domutils/dist/manipulation.js","../node_modules/htmlparser2/node_modules/domutils/dist/traversal.js","../node_modules/htmlparser2/dist/index.js","../node_modules/escape-string-regexp/index.js","../node_modules/is-plain-object/dist/is-plain-object.js","../node_modules/parse-srcset/src/parse-srcset.js","../node_modules/picocolors/picocolors.browser.js","../node_modules/postcss/lib/css-syntax-error.js","../node_modules/postcss/lib/stringifier.js","../node_modules/postcss/lib/stringify.js","../node_modules/postcss/lib/symbols.js","../node_modules/postcss/lib/node.js","../node_modules/postcss/lib/comment.js","../node_modules/postcss/lib/declaration.js","../node_modules/postcss/lib/container.js","../node_modules/postcss/lib/at-rule.js","../node_modules/postcss/lib/document.js","../node_modules/nanoid/non-secure/index.cjs","../node_modules/postcss/lib/previous-map.js","../node_modules/postcss/lib/input.js","../node_modules/postcss/lib/root.js","../node_modules/postcss/lib/list.js","../node_modules/postcss/lib/rule.js","../node_modules/postcss/lib/fromJSON.js","../node_modules/postcss/lib/map-generator.js","../node_modules/postcss/lib/tokenize.js","../node_modules/postcss/lib/parser.js","../node_modules/postcss/lib/parse.js","../node_modules/postcss/lib/warning.js","../node_modules/postcss/lib/result.js","../node_modules/postcss/lib/lazy-result.js","../node_modules/postcss/lib/no-work-result.js","../node_modules/postcss/lib/processor.js","../node_modules/postcss/lib/postcss.js","../node_modules/launder/index.js","../node_modules/sanitize-html/index.js","../src/comments/ProjectMarkdown.vue","../src/comments/CommentForm.vue","../node_modules/dayjs/plugin/relativeTime.js","../src/comments/CommentFeedback.vue","../src/comments/Comment.vue","../src/comments/CommentTree.vue","../src/comments/Comments.vue","../src/comments/main.js"],"sourcesContent":["!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),Y=_.prototype;return O.prototype=Y,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){Y[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","/**\n * marked v5.1.2 - a markdown parser\n * Copyright (c) 2011-2023, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction getDefaults() {\n  return {\n    async: false,\n    baseUrl: null,\n    breaks: false,\n    extensions: null,\n    gfm: true,\n    headerIds: true,\n    headerPrefix: '',\n    highlight: null,\n    hooks: null,\n    langPrefix: 'language-',\n    mangle: true,\n    pedantic: false,\n    renderer: null,\n    sanitize: false,\n    sanitizer: null,\n    silent: false,\n    smartypants: false,\n    tokenizer: null,\n    walkTokens: null,\n    xhtml: false\n  };\n}\n\nlet defaults = getDefaults();\n\nfunction changeDefaults(newDefaults) {\n  defaults = newDefaults;\n}\n\n/**\n * Helpers\n */\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = new RegExp(escapeTest.source, 'g');\nconst escapeTestNoEncode = /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/;\nconst escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');\nconst escapeReplacements = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;'\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape(html, encode) {\n  if (encode) {\n    if (escapeTest.test(html)) {\n      return html.replace(escapeReplace, getEscapeReplacement);\n    }\n  } else {\n    if (escapeTestNoEncode.test(html)) {\n      return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n    }\n  }\n\n  return html;\n}\n\nconst unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\n\n/**\n * @param {string} html\n */\nfunction unescape(html) {\n  // explicitly match decimal, hex, and named HTML entities\n  return html.replace(unescapeTest, (_, n) => {\n    n = n.toLowerCase();\n    if (n === 'colon') return ':';\n    if (n.charAt(0) === '#') {\n      return n.charAt(1) === 'x'\n        ? String.fromCharCode(parseInt(n.substring(2), 16))\n        : String.fromCharCode(+n.substring(1));\n    }\n    return '';\n  });\n}\n\nconst caret = /(^|[^\\[])\\^/g;\n\n/**\n * @param {string | RegExp} regex\n * @param {string} opt\n */\nfunction edit(regex, opt) {\n  regex = typeof regex === 'string' ? regex : regex.source;\n  opt = opt || '';\n  const obj = {\n    replace: (name, val) => {\n      val = val.source || val;\n      val = val.replace(caret, '$1');\n      regex = regex.replace(name, val);\n      return obj;\n    },\n    getRegex: () => {\n      return new RegExp(regex, opt);\n    }\n  };\n  return obj;\n}\n\nconst nonWordAndColonTest = /[^\\w:]/g;\nconst originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;\n\n/**\n * @param {boolean} sanitize\n * @param {string} base\n * @param {string} href\n */\nfunction cleanUrl(sanitize, base, href) {\n  if (sanitize) {\n    let prot;\n    try {\n      prot = decodeURIComponent(unescape(href))\n        .replace(nonWordAndColonTest, '')\n        .toLowerCase();\n    } catch (e) {\n      return null;\n    }\n    if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {\n      return null;\n    }\n  }\n  if (base && !originIndependentUrl.test(href)) {\n    href = resolveUrl(base, href);\n  }\n  try {\n    href = encodeURI(href).replace(/%25/g, '%');\n  } catch (e) {\n    return null;\n  }\n  return href;\n}\n\nconst baseUrls = {};\nconst justDomain = /^[^:]+:\\/*[^/]*$/;\nconst protocol = /^([^:]+:)[\\s\\S]*$/;\nconst domain = /^([^:]+:\\/*[^/]*)[\\s\\S]*$/;\n\n/**\n * @param {string} base\n * @param {string} href\n */\nfunction resolveUrl(base, href) {\n  if (!baseUrls[' ' + base]) {\n    // we can ignore everything in base after the last slash of its path component,\n    // but we might need to add _that_\n    // https://tools.ietf.org/html/rfc3986#section-3\n    if (justDomain.test(base)) {\n      baseUrls[' ' + base] = base + '/';\n    } else {\n      baseUrls[' ' + base] = rtrim(base, '/', true);\n    }\n  }\n  base = baseUrls[' ' + base];\n  const relativeBase = base.indexOf(':') === -1;\n\n  if (href.substring(0, 2) === '//') {\n    if (relativeBase) {\n      return href;\n    }\n    return base.replace(protocol, '$1') + href;\n  } else if (href.charAt(0) === '/') {\n    if (relativeBase) {\n      return href;\n    }\n    return base.replace(domain, '$1') + href;\n  } else {\n    return base + href;\n  }\n}\n\nconst noopTest = { exec: function noopTest() {} };\n\nfunction splitCells(tableRow, count) {\n  // ensure that every cell-delimiting pipe has a space\n  // before it to distinguish it from an escaped pipe\n  const row = tableRow.replace(/\\|/g, (match, offset, str) => {\n      let escaped = false,\n        curr = offset;\n      while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n      if (escaped) {\n        // odd number of slashes means | is escaped\n        // so we leave it alone\n        return '|';\n      } else {\n        // add space before unescaped |\n        return ' |';\n      }\n    }),\n    cells = row.split(/ \\|/);\n  let i = 0;\n\n  // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n  if (!cells[0].trim()) { cells.shift(); }\n  if (cells.length > 0 && !cells[cells.length - 1].trim()) { cells.pop(); }\n\n  if (cells.length > count) {\n    cells.splice(count);\n  } else {\n    while (cells.length < count) cells.push('');\n  }\n\n  for (; i < cells.length; i++) {\n    // leading or trailing whitespace is ignored per the gfm spec\n    cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n  }\n  return cells;\n}\n\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param {string} str\n * @param {string} c\n * @param {boolean} invert Remove suffix of non-c chars instead. Default falsey.\n */\nfunction rtrim(str, c, invert) {\n  const l = str.length;\n  if (l === 0) {\n    return '';\n  }\n\n  // Length of suffix matching the invert condition.\n  let suffLen = 0;\n\n  // Step left until we fail to match the invert condition.\n  while (suffLen < l) {\n    const currChar = str.charAt(l - suffLen - 1);\n    if (currChar === c && !invert) {\n      suffLen++;\n    } else if (currChar !== c && invert) {\n      suffLen++;\n    } else {\n      break;\n    }\n  }\n\n  return str.slice(0, l - suffLen);\n}\n\nfunction findClosingBracket(str, b) {\n  if (str.indexOf(b[1]) === -1) {\n    return -1;\n  }\n  const l = str.length;\n  let level = 0,\n    i = 0;\n  for (; i < l; i++) {\n    if (str[i] === '\\\\') {\n      i++;\n    } else if (str[i] === b[0]) {\n      level++;\n    } else if (str[i] === b[1]) {\n      level--;\n      if (level < 0) {\n        return i;\n      }\n    }\n  }\n  return -1;\n}\n\nfunction checkDeprecations(opt, callback) {\n  if (!opt || opt.silent) {\n    return;\n  }\n\n  if (callback) {\n    console.warn('marked(): callback is deprecated since version 5.0.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/using_pro#async');\n  }\n\n  if (opt.sanitize || opt.sanitizer) {\n    console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');\n  }\n\n  if (opt.highlight || opt.langPrefix !== 'language-') {\n    console.warn('marked(): highlight and langPrefix parameters are deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-highlight.');\n  }\n\n  if (opt.mangle) {\n    console.warn('marked(): mangle parameter is enabled by default, but is deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install https://www.npmjs.com/package/marked-mangle, or disable by setting `{mangle: false}`.');\n  }\n\n  if (opt.baseUrl) {\n    console.warn('marked(): baseUrl parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-base-url.');\n  }\n\n  if (opt.smartypants) {\n    console.warn('marked(): smartypants parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-smartypants.');\n  }\n\n  if (opt.xhtml) {\n    console.warn('marked(): xhtml parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-xhtml.');\n  }\n\n  if (opt.headerIds || opt.headerPrefix) {\n    console.warn('marked(): headerIds and headerPrefix parameters enabled by default, but are deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install  https://www.npmjs.com/package/marked-gfm-heading-id, or disable by setting `{headerIds: false}`.');\n  }\n}\n\nfunction outputLink(cap, link, raw, lexer) {\n  const href = link.href;\n  const title = link.title ? escape(link.title) : null;\n  const text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n\n  if (cap[0].charAt(0) !== '!') {\n    lexer.state.inLink = true;\n    const token = {\n      type: 'link',\n      raw,\n      href,\n      title,\n      text,\n      tokens: lexer.inlineTokens(text)\n    };\n    lexer.state.inLink = false;\n    return token;\n  }\n  return {\n    type: 'image',\n    raw,\n    href,\n    title,\n    text: escape(text)\n  };\n}\n\nfunction indentCodeCompensation(raw, text) {\n  const matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n\n  if (matchIndentToCode === null) {\n    return text;\n  }\n\n  const indentToCode = matchIndentToCode[1];\n\n  return text\n    .split('\\n')\n    .map(node => {\n      const matchIndentInNode = node.match(/^\\s+/);\n      if (matchIndentInNode === null) {\n        return node;\n      }\n\n      const [indentInNode] = matchIndentInNode;\n\n      if (indentInNode.length >= indentToCode.length) {\n        return node.slice(indentToCode.length);\n      }\n\n      return node;\n    })\n    .join('\\n');\n}\n\n/**\n * Tokenizer\n */\nclass Tokenizer {\n  constructor(options) {\n    this.options = options || defaults;\n  }\n\n  space(src) {\n    const cap = this.rules.block.newline.exec(src);\n    if (cap && cap[0].length > 0) {\n      return {\n        type: 'space',\n        raw: cap[0]\n      };\n    }\n  }\n\n  code(src) {\n    const cap = this.rules.block.code.exec(src);\n    if (cap) {\n      const text = cap[0].replace(/^ {1,4}/gm, '');\n      return {\n        type: 'code',\n        raw: cap[0],\n        codeBlockStyle: 'indented',\n        text: !this.options.pedantic\n          ? rtrim(text, '\\n')\n          : text\n      };\n    }\n  }\n\n  fences(src) {\n    const cap = this.rules.block.fences.exec(src);\n    if (cap) {\n      const raw = cap[0];\n      const text = indentCodeCompensation(raw, cap[3] || '');\n\n      return {\n        type: 'code',\n        raw,\n        lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, '$1') : cap[2],\n        text\n      };\n    }\n  }\n\n  heading(src) {\n    const cap = this.rules.block.heading.exec(src);\n    if (cap) {\n      let text = cap[2].trim();\n\n      // remove trailing #s\n      if (/#$/.test(text)) {\n        const trimmed = rtrim(text, '#');\n        if (this.options.pedantic) {\n          text = trimmed.trim();\n        } else if (!trimmed || / $/.test(trimmed)) {\n          // CommonMark requires space before trailing #s\n          text = trimmed.trim();\n        }\n      }\n\n      return {\n        type: 'heading',\n        raw: cap[0],\n        depth: cap[1].length,\n        text,\n        tokens: this.lexer.inline(text)\n      };\n    }\n  }\n\n  hr(src) {\n    const cap = this.rules.block.hr.exec(src);\n    if (cap) {\n      return {\n        type: 'hr',\n        raw: cap[0]\n      };\n    }\n  }\n\n  blockquote(src) {\n    const cap = this.rules.block.blockquote.exec(src);\n    if (cap) {\n      const text = cap[0].replace(/^ *>[ \\t]?/gm, '');\n      const top = this.lexer.state.top;\n      this.lexer.state.top = true;\n      const tokens = this.lexer.blockTokens(text);\n      this.lexer.state.top = top;\n      return {\n        type: 'blockquote',\n        raw: cap[0],\n        tokens,\n        text\n      };\n    }\n  }\n\n  list(src) {\n    let cap = this.rules.block.list.exec(src);\n    if (cap) {\n      let raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine,\n        line, nextLine, rawLine, itemContents, endEarly;\n\n      let bull = cap[1].trim();\n      const isordered = bull.length > 1;\n\n      const list = {\n        type: 'list',\n        raw: '',\n        ordered: isordered,\n        start: isordered ? +bull.slice(0, -1) : '',\n        loose: false,\n        items: []\n      };\n\n      bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n\n      if (this.options.pedantic) {\n        bull = isordered ? bull : '[*+-]';\n      }\n\n      // Get next list item\n      const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`);\n\n      // Check if current bullet point can start a new List Item\n      while (src) {\n        endEarly = false;\n        if (!(cap = itemRegex.exec(src))) {\n          break;\n        }\n\n        if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n          break;\n        }\n\n        raw = cap[0];\n        src = src.substring(raw.length);\n\n        line = cap[2].split('\\n', 1)[0].replace(/^\\t+/, (t) => ' '.repeat(3 * t.length));\n        nextLine = src.split('\\n', 1)[0];\n\n        if (this.options.pedantic) {\n          indent = 2;\n          itemContents = line.trimLeft();\n        } else {\n          indent = cap[2].search(/[^ ]/); // Find first non-space char\n          indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n          itemContents = line.slice(indent);\n          indent += cap[1].length;\n        }\n\n        blankLine = false;\n\n        if (!line && /^ *$/.test(nextLine)) { // Items begin with at most one blank line\n          raw += nextLine + '\\n';\n          src = src.substring(nextLine.length + 1);\n          endEarly = true;\n        }\n\n        if (!endEarly) {\n          const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`);\n          const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`);\n          const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`);\n          const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);\n\n          // Check if following lines should be included in List Item\n          while (src) {\n            rawLine = src.split('\\n', 1)[0];\n            nextLine = rawLine;\n\n            // Re-align to follow commonmark nesting rules\n            if (this.options.pedantic) {\n              nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, '  ');\n            }\n\n            // End list item if found code fences\n            if (fencesBeginRegex.test(nextLine)) {\n              break;\n            }\n\n            // End list item if found start of new heading\n            if (headingBeginRegex.test(nextLine)) {\n              break;\n            }\n\n            // End list item if found start of new bullet\n            if (nextBulletRegex.test(nextLine)) {\n              break;\n            }\n\n            // Horizontal rule found\n            if (hrRegex.test(src)) {\n              break;\n            }\n\n            if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible\n              itemContents += '\\n' + nextLine.slice(indent);\n            } else {\n              // not enough indentation\n              if (blankLine) {\n                break;\n              }\n\n              // paragraph continuation unless last line was a different block level element\n              if (line.search(/[^ ]/) >= 4) { // indented code block\n                break;\n              }\n              if (fencesBeginRegex.test(line)) {\n                break;\n              }\n              if (headingBeginRegex.test(line)) {\n                break;\n              }\n              if (hrRegex.test(line)) {\n                break;\n              }\n\n              itemContents += '\\n' + nextLine;\n            }\n\n            if (!blankLine && !nextLine.trim()) { // Check if current line is blank\n              blankLine = true;\n            }\n\n            raw += rawLine + '\\n';\n            src = src.substring(rawLine.length + 1);\n            line = nextLine.slice(indent);\n          }\n        }\n\n        if (!list.loose) {\n          // If the previous item ended with a blank line, the list is loose\n          if (endsWithBlankLine) {\n            list.loose = true;\n          } else if (/\\n *\\n *$/.test(raw)) {\n            endsWithBlankLine = true;\n          }\n        }\n\n        // Check for task list items\n        if (this.options.gfm) {\n          istask = /^\\[[ xX]\\] /.exec(itemContents);\n          if (istask) {\n            ischecked = istask[0] !== '[ ] ';\n            itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n          }\n        }\n\n        list.items.push({\n          type: 'list_item',\n          raw,\n          task: !!istask,\n          checked: ischecked,\n          loose: false,\n          text: itemContents\n        });\n\n        list.raw += raw;\n      }\n\n      // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n      list.items[list.items.length - 1].raw = raw.trimRight();\n      list.items[list.items.length - 1].text = itemContents.trimRight();\n      list.raw = list.raw.trimRight();\n\n      const l = list.items.length;\n\n      // Item child tokens handled here at end because we needed to have the final item to trim it first\n      for (i = 0; i < l; i++) {\n        this.lexer.state.top = false;\n        list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n\n        if (!list.loose) {\n          // Check if list should be loose\n          const spacers = list.items[i].tokens.filter(t => t.type === 'space');\n          const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\\n.*\\n/.test(t.raw));\n\n          list.loose = hasMultipleLineBreaks;\n        }\n      }\n\n      // Set all items to loose if list is loose\n      if (list.loose) {\n        for (i = 0; i < l; i++) {\n          list.items[i].loose = true;\n        }\n      }\n\n      return list;\n    }\n  }\n\n  html(src) {\n    const cap = this.rules.block.html.exec(src);\n    if (cap) {\n      const token = {\n        type: 'html',\n        block: true,\n        raw: cap[0],\n        pre: !this.options.sanitizer\n          && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),\n        text: cap[0]\n      };\n      if (this.options.sanitize) {\n        const text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]);\n        token.type = 'paragraph';\n        token.text = text;\n        token.tokens = this.lexer.inline(text);\n      }\n      return token;\n    }\n  }\n\n  def(src) {\n    const cap = this.rules.block.def.exec(src);\n    if (cap) {\n      const tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n      const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline._escapes, '$1') : '';\n      const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, '$1') : cap[3];\n      return {\n        type: 'def',\n        tag,\n        raw: cap[0],\n        href,\n        title\n      };\n    }\n  }\n\n  table(src) {\n    const cap = this.rules.block.table.exec(src);\n    if (cap) {\n      const item = {\n        type: 'table',\n        header: splitCells(cap[1]).map(c => { return { text: c }; }),\n        align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n        rows: cap[3] && cap[3].trim() ? cap[3].replace(/\\n[ \\t]*$/, '').split('\\n') : []\n      };\n\n      if (item.header.length === item.align.length) {\n        item.raw = cap[0];\n\n        let l = item.align.length;\n        let i, j, k, row;\n        for (i = 0; i < l; i++) {\n          if (/^ *-+: *$/.test(item.align[i])) {\n            item.align[i] = 'right';\n          } else if (/^ *:-+: *$/.test(item.align[i])) {\n            item.align[i] = 'center';\n          } else if (/^ *:-+ *$/.test(item.align[i])) {\n            item.align[i] = 'left';\n          } else {\n            item.align[i] = null;\n          }\n        }\n\n        l = item.rows.length;\n        for (i = 0; i < l; i++) {\n          item.rows[i] = splitCells(item.rows[i], item.header.length).map(c => { return { text: c }; });\n        }\n\n        // parse child tokens inside headers and cells\n\n        // header child tokens\n        l = item.header.length;\n        for (j = 0; j < l; j++) {\n          item.header[j].tokens = this.lexer.inline(item.header[j].text);\n        }\n\n        // cell child tokens\n        l = item.rows.length;\n        for (j = 0; j < l; j++) {\n          row = item.rows[j];\n          for (k = 0; k < row.length; k++) {\n            row[k].tokens = this.lexer.inline(row[k].text);\n          }\n        }\n\n        return item;\n      }\n    }\n  }\n\n  lheading(src) {\n    const cap = this.rules.block.lheading.exec(src);\n    if (cap) {\n      return {\n        type: 'heading',\n        raw: cap[0],\n        depth: cap[2].charAt(0) === '=' ? 1 : 2,\n        text: cap[1],\n        tokens: this.lexer.inline(cap[1])\n      };\n    }\n  }\n\n  paragraph(src) {\n    const cap = this.rules.block.paragraph.exec(src);\n    if (cap) {\n      const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n        ? cap[1].slice(0, -1)\n        : cap[1];\n      return {\n        type: 'paragraph',\n        raw: cap[0],\n        text,\n        tokens: this.lexer.inline(text)\n      };\n    }\n  }\n\n  text(src) {\n    const cap = this.rules.block.text.exec(src);\n    if (cap) {\n      return {\n        type: 'text',\n        raw: cap[0],\n        text: cap[0],\n        tokens: this.lexer.inline(cap[0])\n      };\n    }\n  }\n\n  escape(src) {\n    const cap = this.rules.inline.escape.exec(src);\n    if (cap) {\n      return {\n        type: 'escape',\n        raw: cap[0],\n        text: escape(cap[1])\n      };\n    }\n  }\n\n  tag(src) {\n    const cap = this.rules.inline.tag.exec(src);\n    if (cap) {\n      if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {\n        this.lexer.state.inLink = true;\n      } else if (this.lexer.state.inLink && /^<\\/a>/i.test(cap[0])) {\n        this.lexer.state.inLink = false;\n      }\n      if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n        this.lexer.state.inRawBlock = true;\n      } else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n        this.lexer.state.inRawBlock = false;\n      }\n\n      return {\n        type: this.options.sanitize\n          ? 'text'\n          : 'html',\n        raw: cap[0],\n        inLink: this.lexer.state.inLink,\n        inRawBlock: this.lexer.state.inRawBlock,\n        block: false,\n        text: this.options.sanitize\n          ? (this.options.sanitizer\n            ? this.options.sanitizer(cap[0])\n            : escape(cap[0]))\n          : cap[0]\n      };\n    }\n  }\n\n  link(src) {\n    const cap = this.rules.inline.link.exec(src);\n    if (cap) {\n      const trimmedUrl = cap[2].trim();\n      if (!this.options.pedantic && /^</.test(trimmedUrl)) {\n        // commonmark requires matching angle brackets\n        if (!(/>$/.test(trimmedUrl))) {\n          return;\n        }\n\n        // ending angle bracket cannot be escaped\n        const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n        if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n          return;\n        }\n      } else {\n        // find closing parenthesis\n        const lastParenIndex = findClosingBracket(cap[2], '()');\n        if (lastParenIndex > -1) {\n          const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n          const linkLen = start + cap[1].length + lastParenIndex;\n          cap[2] = cap[2].substring(0, lastParenIndex);\n          cap[0] = cap[0].substring(0, linkLen).trim();\n          cap[3] = '';\n        }\n      }\n      let href = cap[2];\n      let title = '';\n      if (this.options.pedantic) {\n        // split pedantic href and title\n        const link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n\n        if (link) {\n          href = link[1];\n          title = link[3];\n        }\n      } else {\n        title = cap[3] ? cap[3].slice(1, -1) : '';\n      }\n\n      href = href.trim();\n      if (/^</.test(href)) {\n        if (this.options.pedantic && !(/>$/.test(trimmedUrl))) {\n          // pedantic allows starting angle bracket without ending angle bracket\n          href = href.slice(1);\n        } else {\n          href = href.slice(1, -1);\n        }\n      }\n      return outputLink(cap, {\n        href: href ? href.replace(this.rules.inline._escapes, '$1') : href,\n        title: title ? title.replace(this.rules.inline._escapes, '$1') : title\n      }, cap[0], this.lexer);\n    }\n  }\n\n  reflink(src, links) {\n    let cap;\n    if ((cap = this.rules.inline.reflink.exec(src))\n        || (cap = this.rules.inline.nolink.exec(src))) {\n      let link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n      link = links[link.toLowerCase()];\n      if (!link) {\n        const text = cap[0].charAt(0);\n        return {\n          type: 'text',\n          raw: text,\n          text\n        };\n      }\n      return outputLink(cap, link, cap[0], this.lexer);\n    }\n  }\n\n  emStrong(src, maskedSrc, prevChar = '') {\n    let match = this.rules.inline.emStrong.lDelim.exec(src);\n    if (!match) return;\n\n    // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n    if (match[3] && prevChar.match(/[\\p{L}\\p{N}]/u)) return;\n\n    const nextChar = match[1] || match[2] || '';\n\n    if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n      const lLength = match[0].length - 1;\n      let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n\n      const endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;\n      endReg.lastIndex = 0;\n\n      // Clip maskedSrc to same section of string as src (move to lexer?)\n      maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n      while ((match = endReg.exec(maskedSrc)) != null) {\n        rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n        if (!rDelim) continue; // skip single * in __abc*abc__\n\n        rLength = rDelim.length;\n\n        if (match[3] || match[4]) { // found another Left Delim\n          delimTotal += rLength;\n          continue;\n        } else if (match[5] || match[6]) { // either Left or Right Delim\n          if (lLength % 3 && !((lLength + rLength) % 3)) {\n            midDelimTotal += rLength;\n            continue; // CommonMark Emphasis Rules 9-10\n          }\n        }\n\n        delimTotal -= rLength;\n\n        if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n        // Remove extra characters. *a*** -> *a*\n        rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n\n        const raw = src.slice(0, lLength + match.index + rLength + 1);\n\n        // Create `em` if smallest delimiter has odd char count. *a***\n        if (Math.min(lLength, rLength) % 2) {\n          const text = raw.slice(1, -1);\n          return {\n            type: 'em',\n            raw,\n            text,\n            tokens: this.lexer.inlineTokens(text)\n          };\n        }\n\n        // Create 'strong' if smallest delimiter has even char count. **a***\n        const text = raw.slice(2, -2);\n        return {\n          type: 'strong',\n          raw,\n          text,\n          tokens: this.lexer.inlineTokens(text)\n        };\n      }\n    }\n  }\n\n  codespan(src) {\n    const cap = this.rules.inline.code.exec(src);\n    if (cap) {\n      let text = cap[2].replace(/\\n/g, ' ');\n      const hasNonSpaceChars = /[^ ]/.test(text);\n      const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n      if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n        text = text.substring(1, text.length - 1);\n      }\n      text = escape(text, true);\n      return {\n        type: 'codespan',\n        raw: cap[0],\n        text\n      };\n    }\n  }\n\n  br(src) {\n    const cap = this.rules.inline.br.exec(src);\n    if (cap) {\n      return {\n        type: 'br',\n        raw: cap[0]\n      };\n    }\n  }\n\n  del(src) {\n    const cap = this.rules.inline.del.exec(src);\n    if (cap) {\n      return {\n        type: 'del',\n        raw: cap[0],\n        text: cap[2],\n        tokens: this.lexer.inlineTokens(cap[2])\n      };\n    }\n  }\n\n  autolink(src, mangle) {\n    const cap = this.rules.inline.autolink.exec(src);\n    if (cap) {\n      let text, href;\n      if (cap[2] === '@') {\n        text = escape(this.options.mangle ? mangle(cap[1]) : cap[1]);\n        href = 'mailto:' + text;\n      } else {\n        text = escape(cap[1]);\n        href = text;\n      }\n\n      return {\n        type: 'link',\n        raw: cap[0],\n        text,\n        href,\n        tokens: [\n          {\n            type: 'text',\n            raw: text,\n            text\n          }\n        ]\n      };\n    }\n  }\n\n  url(src, mangle) {\n    let cap;\n    if (cap = this.rules.inline.url.exec(src)) {\n      let text, href;\n      if (cap[2] === '@') {\n        text = escape(this.options.mangle ? mangle(cap[0]) : cap[0]);\n        href = 'mailto:' + text;\n      } else {\n        // do extended autolink path validation\n        let prevCapZero;\n        do {\n          prevCapZero = cap[0];\n          cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];\n        } while (prevCapZero !== cap[0]);\n        text = escape(cap[0]);\n        if (cap[1] === 'www.') {\n          href = 'http://' + cap[0];\n        } else {\n          href = cap[0];\n        }\n      }\n      return {\n        type: 'link',\n        raw: cap[0],\n        text,\n        href,\n        tokens: [\n          {\n            type: 'text',\n            raw: text,\n            text\n          }\n        ]\n      };\n    }\n  }\n\n  inlineText(src, smartypants) {\n    const cap = this.rules.inline.text.exec(src);\n    if (cap) {\n      let text;\n      if (this.lexer.state.inRawBlock) {\n        text = this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0];\n      } else {\n        text = escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]);\n      }\n      return {\n        type: 'text',\n        raw: cap[0],\n        text\n      };\n    }\n  }\n}\n\n/**\n * Block-Level Grammar\n */\nconst block = {\n  newline: /^(?: *(?:\\n|$))+/,\n  code: /^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/,\n  fences: /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,\n  hr: /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,\n  heading: /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,\n  blockquote: /^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,\n  list: /^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/,\n  html: '^ {0,3}(?:' // optional indentation\n    + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n    + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n    + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n    + '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n    + '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n    + '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (6)\n    + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) open tag\n    + '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) closing tag\n    + ')',\n  def: /^ {0,3}\\[(label)\\]: *(?:\\n *)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n *)?| *\\n *)(title))? *(?:\\n+|$)/,\n  table: noopTest,\n  lheading: /^((?:(?!^bull ).|\\n(?!\\n|bull ))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n  // regex template, placeholders will be replaced according to different paragraph\n  // interruption rules of commonmark and the original markdown spec:\n  _paragraph: /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,\n  text: /^[^\\n]+/\n};\n\nblock._label = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nblock._title = /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/;\nblock.def = edit(block.def)\n  .replace('label', block._label)\n  .replace('title', block._title)\n  .getRegex();\n\nblock.bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nblock.listItemStart = edit(/^( *)(bull) */)\n  .replace('bull', block.bullet)\n  .getRegex();\n\nblock.list = edit(block.list)\n  .replace(/bull/g, block.bullet)\n  .replace('hr', '\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))')\n  .replace('def', '\\\\n+(?=' + block.def.source + ')')\n  .getRegex();\n\nblock._tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n  + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n  + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n  + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n  + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'\n  + '|track|ul';\nblock._comment = /<!--(?!-?>)[\\s\\S]*?(?:-->|$)/;\nblock.html = edit(block.html, 'i')\n  .replace('comment', block._comment)\n  .replace('tag', block._tag)\n  .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n  .getRegex();\n\nblock.lheading = edit(block.lheading)\n  .replace(/bull/g, block.bullet) // lists can interrupt\n  .getRegex();\n\nblock.paragraph = edit(block._paragraph)\n  .replace('hr', block.hr)\n  .replace('heading', ' {0,3}#{1,6} ')\n  .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n  .replace('|table', '')\n  .replace('blockquote', ' {0,3}>')\n  .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n  .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n  .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n  .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n  .getRegex();\n\nblock.blockquote = edit(block.blockquote)\n  .replace('paragraph', block.paragraph)\n  .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nblock.normal = { ...block };\n\n/**\n * GFM Block Grammar\n */\n\nblock.gfm = {\n  ...block.normal,\n  table: '^ *([^\\\\n ].*\\\\|.*)\\\\n' // Header\n    + ' {0,3}(?:\\\\| *)?(:?-+:? *(?:\\\\| *:?-+:? *)*)(?:\\\\| *)?' // Align\n    + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)' // Cells\n};\n\nblock.gfm.table = edit(block.gfm.table)\n  .replace('hr', block.hr)\n  .replace('heading', ' {0,3}#{1,6} ')\n  .replace('blockquote', ' {0,3}>')\n  .replace('code', ' {4}[^\\\\n]')\n  .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n  .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n  .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n  .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks\n  .getRegex();\n\nblock.gfm.paragraph = edit(block._paragraph)\n  .replace('hr', block.hr)\n  .replace('heading', ' {0,3}#{1,6} ')\n  .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n  .replace('table', block.gfm.table) // interrupt paragraphs with table\n  .replace('blockquote', ' {0,3}>')\n  .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n  .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n  .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n  .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n  .getRegex();\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nblock.pedantic = {\n  ...block.normal,\n  html: edit(\n    '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n    + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n    + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n    .replace('comment', block._comment)\n    .replace(/tag/g, '(?!(?:'\n      + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n      + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n      + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n    .getRegex(),\n  def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n  heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n  fences: noopTest, // fences not supported\n  lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n  paragraph: edit(block.normal._paragraph)\n    .replace('hr', block.hr)\n    .replace('heading', ' *#{1,6} *[^\\n]')\n    .replace('lheading', block.lheading)\n    .replace('blockquote', ' {0,3}>')\n    .replace('|fences', '')\n    .replace('|list', '')\n    .replace('|html', '')\n    .getRegex()\n};\n\n/**\n * Inline-Level Grammar\n */\nconst inline = {\n  escape: /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,\n  autolink: /^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,\n  url: noopTest,\n  tag: '^comment'\n    + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n    + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n    + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n    + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n    + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>', // CDATA section\n  link: /^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/,\n  reflink: /^!?\\[(label)\\]\\[(ref)\\]/,\n  nolink: /^!?\\[(ref)\\](?:\\[\\])?/,\n  reflinkSearch: 'reflink|nolink(?!\\\\()',\n  emStrong: {\n    lDelim: /^(?:\\*+(?:((?!\\*)[punct])|[^\\s*]))|^_+(?:((?!_)[punct])|([^\\s_]))/,\n    //         (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left.  (5) and (6) can be either Left or Right.\n    //         | Skip orphan inside strong      | Consume to delim | (1) #***              | (2) a***#, a***                    | (3) #***a, ***a                  | (4) ***#                 | (5) #***#                         | (6) a***a\n    rDelimAst: /^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])/,\n    rDelimUnd: /^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])/ // ^- Not allowed for _\n  },\n  code: /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,\n  br: /^( {2,}|\\\\)\\n(?!\\s*$)/,\n  del: noopTest,\n  text: /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,\n  punctuation: /^((?![*_])[\\spunctuation])/\n};\n\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\ninline._punctuation = '\\\\p{P}$+<=>`^|~';\ninline.punctuation = edit(inline.punctuation, 'u').replace(/punctuation/g, inline._punctuation).getRegex();\n\n// sequences em should skip over [title](link), `code`, <html>\ninline.blockSkip = /\\[[^[\\]]*?\\]\\([^\\(\\)]*?\\)|`[^`]*?`|<[^<>]*?>/g;\ninline.anyPunctuation = /\\\\[punct]/g;\ninline._escapes = /\\\\([punct])/g;\n\ninline._comment = edit(block._comment).replace('(?:-->|$)', '-->').getRegex();\n\ninline.emStrong.lDelim = edit(inline.emStrong.lDelim, 'u')\n  .replace(/punct/g, inline._punctuation)\n  .getRegex();\n\ninline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, 'gu')\n  .replace(/punct/g, inline._punctuation)\n  .getRegex();\n\ninline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, 'gu')\n  .replace(/punct/g, inline._punctuation)\n  .getRegex();\n\ninline.anyPunctuation = edit(inline.anyPunctuation, 'gu')\n  .replace(/punct/g, inline._punctuation)\n  .getRegex();\n\ninline._escapes = edit(inline._escapes, 'gu')\n  .replace(/punct/g, inline._punctuation)\n  .getRegex();\n\ninline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;\ninline._email = /[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])?)+(?![-_])/;\ninline.autolink = edit(inline.autolink)\n  .replace('scheme', inline._scheme)\n  .replace('email', inline._email)\n  .getRegex();\n\ninline._attribute = /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/;\n\ninline.tag = edit(inline.tag)\n  .replace('comment', inline._comment)\n  .replace('attribute', inline._attribute)\n  .getRegex();\n\ninline._label = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\ninline._href = /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/;\ninline._title = /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/;\n\ninline.link = edit(inline.link)\n  .replace('label', inline._label)\n  .replace('href', inline._href)\n  .replace('title', inline._title)\n  .getRegex();\n\ninline.reflink = edit(inline.reflink)\n  .replace('label', inline._label)\n  .replace('ref', block._label)\n  .getRegex();\n\ninline.nolink = edit(inline.nolink)\n  .replace('ref', block._label)\n  .getRegex();\n\ninline.reflinkSearch = edit(inline.reflinkSearch, 'g')\n  .replace('reflink', inline.reflink)\n  .replace('nolink', inline.nolink)\n  .getRegex();\n\n/**\n * Normal Inline Grammar\n */\n\ninline.normal = { ...inline };\n\n/**\n * Pedantic Inline Grammar\n */\n\ninline.pedantic = {\n  ...inline.normal,\n  strong: {\n    start: /^__|\\*\\*/,\n    middle: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n    endAst: /\\*\\*(?!\\*)/g,\n    endUnd: /__(?!_)/g\n  },\n  em: {\n    start: /^_|\\*/,\n    middle: /^()\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)|^_(?=\\S)([\\s\\S]*?\\S)_(?!_)/,\n    endAst: /\\*(?!\\*)/g,\n    endUnd: /_(?!_)/g\n  },\n  link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n    .replace('label', inline._label)\n    .getRegex(),\n  reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n    .replace('label', inline._label)\n    .getRegex()\n};\n\n/**\n * GFM Inline Grammar\n */\n\ninline.gfm = {\n  ...inline.normal,\n  escape: edit(inline.escape).replace('])', '~|])').getRegex(),\n  _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,\n  url: /^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/,\n  _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n  del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n  text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/\n};\n\ninline.gfm.url = edit(inline.gfm.url, 'i')\n  .replace('email', inline.gfm._extended_email)\n  .getRegex();\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\ninline.breaks = {\n  ...inline.gfm,\n  br: edit(inline.br).replace('{2,}', '*').getRegex(),\n  text: edit(inline.gfm.text)\n    .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n    .replace(/\\{2,\\}/g, '*')\n    .getRegex()\n};\n\n/**\n * smartypants text replacement\n * @param {string} text\n */\nfunction smartypants(text) {\n  return text\n    // em-dashes\n    .replace(/---/g, '\\u2014')\n    // en-dashes\n    .replace(/--/g, '\\u2013')\n    // opening singles\n    .replace(/(^|[-\\u2014/(\\[{\"\\s])'/g, '$1\\u2018')\n    // closing singles & apostrophes\n    .replace(/'/g, '\\u2019')\n    // opening doubles\n    .replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g, '$1\\u201c')\n    // closing doubles\n    .replace(/\"/g, '\\u201d')\n    // ellipses\n    .replace(/\\.{3}/g, '\\u2026');\n}\n\n/**\n * mangle email addresses\n * @param {string} text\n */\nfunction mangle(text) {\n  let out = '',\n    i,\n    ch;\n\n  const l = text.length;\n  for (i = 0; i < l; i++) {\n    ch = text.charCodeAt(i);\n    if (Math.random() > 0.5) {\n      ch = 'x' + ch.toString(16);\n    }\n    out += '&#' + ch + ';';\n  }\n\n  return out;\n}\n\n/**\n * Block Lexer\n */\nclass Lexer {\n  constructor(options) {\n    this.tokens = [];\n    this.tokens.links = Object.create(null);\n    this.options = options || defaults;\n    this.options.tokenizer = this.options.tokenizer || new Tokenizer();\n    this.tokenizer = this.options.tokenizer;\n    this.tokenizer.options = this.options;\n    this.tokenizer.lexer = this;\n    this.inlineQueue = [];\n    this.state = {\n      inLink: false,\n      inRawBlock: false,\n      top: true\n    };\n\n    const rules = {\n      block: block.normal,\n      inline: inline.normal\n    };\n\n    if (this.options.pedantic) {\n      rules.block = block.pedantic;\n      rules.inline = inline.pedantic;\n    } else if (this.options.gfm) {\n      rules.block = block.gfm;\n      if (this.options.breaks) {\n        rules.inline = inline.breaks;\n      } else {\n        rules.inline = inline.gfm;\n      }\n    }\n    this.tokenizer.rules = rules;\n  }\n\n  /**\n   * Expose Rules\n   */\n  static get rules() {\n    return {\n      block,\n      inline\n    };\n  }\n\n  /**\n   * Static Lex Method\n   */\n  static lex(src, options) {\n    const lexer = new Lexer(options);\n    return lexer.lex(src);\n  }\n\n  /**\n   * Static Lex Inline Method\n   */\n  static lexInline(src, options) {\n    const lexer = new Lexer(options);\n    return lexer.inlineTokens(src);\n  }\n\n  /**\n   * Preprocessing\n   */\n  lex(src) {\n    src = src\n      .replace(/\\r\\n|\\r/g, '\\n');\n\n    this.blockTokens(src, this.tokens);\n\n    let next;\n    while (next = this.inlineQueue.shift()) {\n      this.inlineTokens(next.src, next.tokens);\n    }\n\n    return this.tokens;\n  }\n\n  /**\n   * Lexing\n   */\n  blockTokens(src, tokens = []) {\n    if (this.options.pedantic) {\n      src = src.replace(/\\t/g, '    ').replace(/^ +$/gm, '');\n    } else {\n      src = src.replace(/^( *)(\\t+)/gm, (_, leading, tabs) => {\n        return leading + '    '.repeat(tabs.length);\n      });\n    }\n\n    let token, lastToken, cutSrc, lastParagraphClipped;\n\n    while (src) {\n      if (this.options.extensions\n        && this.options.extensions.block\n        && this.options.extensions.block.some((extTokenizer) => {\n          if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n            src = src.substring(token.raw.length);\n            tokens.push(token);\n            return true;\n          }\n          return false;\n        })) {\n        continue;\n      }\n\n      // newline\n      if (token = this.tokenizer.space(src)) {\n        src = src.substring(token.raw.length);\n        if (token.raw.length === 1 && tokens.length > 0) {\n          // if there's a single \\n as a spacer, it's terminating the last line,\n          // so move it there so that we don't get unecessary paragraph tags\n          tokens[tokens.length - 1].raw += '\\n';\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // code\n      if (token = this.tokenizer.code(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        // An indented code block cannot interrupt a paragraph.\n        if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // fences\n      if (token = this.tokenizer.fences(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // heading\n      if (token = this.tokenizer.heading(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // hr\n      if (token = this.tokenizer.hr(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // blockquote\n      if (token = this.tokenizer.blockquote(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // list\n      if (token = this.tokenizer.list(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // html\n      if (token = this.tokenizer.html(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // def\n      if (token = this.tokenizer.def(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.raw;\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else if (!this.tokens.links[token.tag]) {\n          this.tokens.links[token.tag] = {\n            href: token.href,\n            title: token.title\n          };\n        }\n        continue;\n      }\n\n      // table (gfm)\n      if (token = this.tokenizer.table(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // lheading\n      if (token = this.tokenizer.lheading(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // top-level paragraph\n      // prevent paragraph consuming extensions by clipping 'src' to extension start\n      cutSrc = src;\n      if (this.options.extensions && this.options.extensions.startBlock) {\n        let startIndex = Infinity;\n        const tempSrc = src.slice(1);\n        let tempStart;\n        this.options.extensions.startBlock.forEach(function(getStartIndex) {\n          tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n          if (typeof tempStart === 'number' && tempStart >= 0) { startIndex = Math.min(startIndex, tempStart); }\n        });\n        if (startIndex < Infinity && startIndex >= 0) {\n          cutSrc = src.substring(0, startIndex + 1);\n        }\n      }\n      if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n        lastToken = tokens[tokens.length - 1];\n        if (lastParagraphClipped && lastToken.type === 'paragraph') {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue.pop();\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        lastParagraphClipped = (cutSrc.length !== src.length);\n        src = src.substring(token.raw.length);\n        continue;\n      }\n\n      // text\n      if (token = this.tokenizer.text(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && lastToken.type === 'text') {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue.pop();\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      if (src) {\n        const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n        if (this.options.silent) {\n          console.error(errMsg);\n          break;\n        } else {\n          throw new Error(errMsg);\n        }\n      }\n    }\n\n    this.state.top = true;\n    return tokens;\n  }\n\n  inline(src, tokens = []) {\n    this.inlineQueue.push({ src, tokens });\n    return tokens;\n  }\n\n  /**\n   * Lexing/Compiling\n   */\n  inlineTokens(src, tokens = []) {\n    let token, lastToken, cutSrc;\n\n    // String with links masked to avoid interference with em and strong\n    let maskedSrc = src;\n    let match;\n    let keepPrevChar, prevChar;\n\n    // Mask out reflinks\n    if (this.tokens.links) {\n      const links = Object.keys(this.tokens.links);\n      if (links.length > 0) {\n        while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n          if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n            maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n          }\n        }\n      }\n    }\n    // Mask out other blocks\n    while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n      maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n    }\n\n    // Mask out escaped characters\n    while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n      maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n    }\n\n    while (src) {\n      if (!keepPrevChar) {\n        prevChar = '';\n      }\n      keepPrevChar = false;\n\n      // extensions\n      if (this.options.extensions\n        && this.options.extensions.inline\n        && this.options.extensions.inline.some((extTokenizer) => {\n          if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n            src = src.substring(token.raw.length);\n            tokens.push(token);\n            return true;\n          }\n          return false;\n        })) {\n        continue;\n      }\n\n      // escape\n      if (token = this.tokenizer.escape(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // tag\n      if (token = this.tokenizer.tag(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // link\n      if (token = this.tokenizer.link(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // reflink, nolink\n      if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // em & strong\n      if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // code\n      if (token = this.tokenizer.codespan(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // br\n      if (token = this.tokenizer.br(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // del (gfm)\n      if (token = this.tokenizer.del(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // autolink\n      if (token = this.tokenizer.autolink(src, mangle)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // url (gfm)\n      if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // text\n      // prevent inlineText consuming extensions by clipping 'src' to extension start\n      cutSrc = src;\n      if (this.options.extensions && this.options.extensions.startInline) {\n        let startIndex = Infinity;\n        const tempSrc = src.slice(1);\n        let tempStart;\n        this.options.extensions.startInline.forEach(function(getStartIndex) {\n          tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n          if (typeof tempStart === 'number' && tempStart >= 0) { startIndex = Math.min(startIndex, tempStart); }\n        });\n        if (startIndex < Infinity && startIndex >= 0) {\n          cutSrc = src.substring(0, startIndex + 1);\n        }\n      }\n      if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {\n        src = src.substring(token.raw.length);\n        if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n          prevChar = token.raw.slice(-1);\n        }\n        keepPrevChar = true;\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && lastToken.type === 'text') {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      if (src) {\n        const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n        if (this.options.silent) {\n          console.error(errMsg);\n          break;\n        } else {\n          throw new Error(errMsg);\n        }\n      }\n    }\n\n    return tokens;\n  }\n}\n\n/**\n * Renderer\n */\nclass Renderer {\n  constructor(options) {\n    this.options = options || defaults;\n  }\n\n  code(code, infostring, escaped) {\n    const lang = (infostring || '').match(/\\S*/)[0];\n    if (this.options.highlight) {\n      const out = this.options.highlight(code, lang);\n      if (out != null && out !== code) {\n        escaped = true;\n        code = out;\n      }\n    }\n\n    code = code.replace(/\\n$/, '') + '\\n';\n\n    if (!lang) {\n      return '<pre><code>'\n        + (escaped ? code : escape(code, true))\n        + '</code></pre>\\n';\n    }\n\n    return '<pre><code class=\"'\n      + this.options.langPrefix\n      + escape(lang)\n      + '\">'\n      + (escaped ? code : escape(code, true))\n      + '</code></pre>\\n';\n  }\n\n  /**\n   * @param {string} quote\n   */\n  blockquote(quote) {\n    return `<blockquote>\\n${quote}</blockquote>\\n`;\n  }\n\n  html(html, block) {\n    return html;\n  }\n\n  /**\n   * @param {string} text\n   * @param {string} level\n   * @param {string} raw\n   * @param {any} slugger\n   */\n  heading(text, level, raw, slugger) {\n    if (this.options.headerIds) {\n      const id = this.options.headerPrefix + slugger.slug(raw);\n      return `<h${level} id=\"${id}\">${text}</h${level}>\\n`;\n    }\n\n    // ignore IDs\n    return `<h${level}>${text}</h${level}>\\n`;\n  }\n\n  hr() {\n    return this.options.xhtml ? '<hr/>\\n' : '<hr>\\n';\n  }\n\n  list(body, ordered, start) {\n    const type = ordered ? 'ol' : 'ul',\n      startatt = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n    return '<' + type + startatt + '>\\n' + body + '</' + type + '>\\n';\n  }\n\n  /**\n   * @param {string} text\n   */\n  listitem(text) {\n    return `<li>${text}</li>\\n`;\n  }\n\n  checkbox(checked) {\n    return '<input '\n      + (checked ? 'checked=\"\" ' : '')\n      + 'disabled=\"\" type=\"checkbox\"'\n      + (this.options.xhtml ? ' /' : '')\n      + '> ';\n  }\n\n  /**\n   * @param {string} text\n   */\n  paragraph(text) {\n    return `<p>${text}</p>\\n`;\n  }\n\n  /**\n   * @param {string} header\n   * @param {string} body\n   */\n  table(header, body) {\n    if (body) body = `<tbody>${body}</tbody>`;\n\n    return '<table>\\n'\n      + '<thead>\\n'\n      + header\n      + '</thead>\\n'\n      + body\n      + '</table>\\n';\n  }\n\n  /**\n   * @param {string} content\n   */\n  tablerow(content) {\n    return `<tr>\\n${content}</tr>\\n`;\n  }\n\n  tablecell(content, flags) {\n    const type = flags.header ? 'th' : 'td';\n    const tag = flags.align\n      ? `<${type} align=\"${flags.align}\">`\n      : `<${type}>`;\n    return tag + content + `</${type}>\\n`;\n  }\n\n  /**\n   * span level renderer\n   * @param {string} text\n   */\n  strong(text) {\n    return `<strong>${text}</strong>`;\n  }\n\n  /**\n   * @param {string} text\n   */\n  em(text) {\n    return `<em>${text}</em>`;\n  }\n\n  /**\n   * @param {string} text\n   */\n  codespan(text) {\n    return `<code>${text}</code>`;\n  }\n\n  br() {\n    return this.options.xhtml ? '<br/>' : '<br>';\n  }\n\n  /**\n   * @param {string} text\n   */\n  del(text) {\n    return `<del>${text}</del>`;\n  }\n\n  /**\n   * @param {string} href\n   * @param {string} title\n   * @param {string} text\n   */\n  link(href, title, text) {\n    href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n    if (href === null) {\n      return text;\n    }\n    let out = '<a href=\"' + href + '\"';\n    if (title) {\n      out += ' title=\"' + title + '\"';\n    }\n    out += '>' + text + '</a>';\n    return out;\n  }\n\n  /**\n   * @param {string} href\n   * @param {string} title\n   * @param {string} text\n   */\n  image(href, title, text) {\n    href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n    if (href === null) {\n      return text;\n    }\n\n    let out = `<img src=\"${href}\" alt=\"${text}\"`;\n    if (title) {\n      out += ` title=\"${title}\"`;\n    }\n    out += this.options.xhtml ? '/>' : '>';\n    return out;\n  }\n\n  text(text) {\n    return text;\n  }\n}\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nclass TextRenderer {\n  // no need for block level renderers\n  strong(text) {\n    return text;\n  }\n\n  em(text) {\n    return text;\n  }\n\n  codespan(text) {\n    return text;\n  }\n\n  del(text) {\n    return text;\n  }\n\n  html(text) {\n    return text;\n  }\n\n  text(text) {\n    return text;\n  }\n\n  link(href, title, text) {\n    return '' + text;\n  }\n\n  image(href, title, text) {\n    return '' + text;\n  }\n\n  br() {\n    return '';\n  }\n}\n\n/**\n * Slugger generates header id\n */\nclass Slugger {\n  constructor() {\n    this.seen = {};\n  }\n\n  /**\n   * @param {string} value\n   */\n  serialize(value) {\n    return value\n      .toLowerCase()\n      .trim()\n      // remove html tags\n      .replace(/<[!\\/a-z].*?>/ig, '')\n      // remove unwanted chars\n      .replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,./:;<=>?@[\\]^`{|}~]/g, '')\n      .replace(/\\s/g, '-');\n  }\n\n  /**\n   * Finds the next safe (unique) slug to use\n   * @param {string} originalSlug\n   * @param {boolean} isDryRun\n   */\n  getNextSafeSlug(originalSlug, isDryRun) {\n    let slug = originalSlug;\n    let occurenceAccumulator = 0;\n    if (this.seen.hasOwnProperty(slug)) {\n      occurenceAccumulator = this.seen[originalSlug];\n      do {\n        occurenceAccumulator++;\n        slug = originalSlug + '-' + occurenceAccumulator;\n      } while (this.seen.hasOwnProperty(slug));\n    }\n    if (!isDryRun) {\n      this.seen[originalSlug] = occurenceAccumulator;\n      this.seen[slug] = 0;\n    }\n    return slug;\n  }\n\n  /**\n   * Convert string to unique id\n   * @param {object} [options]\n   * @param {boolean} [options.dryrun] Generates the next unique slug without\n   * updating the internal accumulator.\n   */\n  slug(value, options = {}) {\n    const slug = this.serialize(value);\n    return this.getNextSafeSlug(slug, options.dryrun);\n  }\n}\n\n/**\n * Parsing & Compiling\n */\nclass Parser {\n  constructor(options) {\n    this.options = options || defaults;\n    this.options.renderer = this.options.renderer || new Renderer();\n    this.renderer = this.options.renderer;\n    this.renderer.options = this.options;\n    this.textRenderer = new TextRenderer();\n    this.slugger = new Slugger();\n  }\n\n  /**\n   * Static Parse Method\n   */\n  static parse(tokens, options) {\n    const parser = new Parser(options);\n    return parser.parse(tokens);\n  }\n\n  /**\n   * Static Parse Inline Method\n   */\n  static parseInline(tokens, options) {\n    const parser = new Parser(options);\n    return parser.parseInline(tokens);\n  }\n\n  /**\n   * Parse Loop\n   */\n  parse(tokens, top = true) {\n    let out = '',\n      i,\n      j,\n      k,\n      l2,\n      l3,\n      row,\n      cell,\n      header,\n      body,\n      token,\n      ordered,\n      start,\n      loose,\n      itemBody,\n      item,\n      checked,\n      task,\n      checkbox,\n      ret;\n\n    const l = tokens.length;\n    for (i = 0; i < l; i++) {\n      token = tokens[i];\n\n      // Run any renderer extensions\n      if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n        ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n        if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) {\n          out += ret || '';\n          continue;\n        }\n      }\n\n      switch (token.type) {\n        case 'space': {\n          continue;\n        }\n        case 'hr': {\n          out += this.renderer.hr();\n          continue;\n        }\n        case 'heading': {\n          out += this.renderer.heading(\n            this.parseInline(token.tokens),\n            token.depth,\n            unescape(this.parseInline(token.tokens, this.textRenderer)),\n            this.slugger);\n          continue;\n        }\n        case 'code': {\n          out += this.renderer.code(token.text,\n            token.lang,\n            token.escaped);\n          continue;\n        }\n        case 'table': {\n          header = '';\n\n          // header\n          cell = '';\n          l2 = token.header.length;\n          for (j = 0; j < l2; j++) {\n            cell += this.renderer.tablecell(\n              this.parseInline(token.header[j].tokens),\n              { header: true, align: token.align[j] }\n            );\n          }\n          header += this.renderer.tablerow(cell);\n\n          body = '';\n          l2 = token.rows.length;\n          for (j = 0; j < l2; j++) {\n            row = token.rows[j];\n\n            cell = '';\n            l3 = row.length;\n            for (k = 0; k < l3; k++) {\n              cell += this.renderer.tablecell(\n                this.parseInline(row[k].tokens),\n                { header: false, align: token.align[k] }\n              );\n            }\n\n            body += this.renderer.tablerow(cell);\n          }\n          out += this.renderer.table(header, body);\n          continue;\n        }\n        case 'blockquote': {\n          body = this.parse(token.tokens);\n          out += this.renderer.blockquote(body);\n          continue;\n        }\n        case 'list': {\n          ordered = token.ordered;\n          start = token.start;\n          loose = token.loose;\n          l2 = token.items.length;\n\n          body = '';\n          for (j = 0; j < l2; j++) {\n            item = token.items[j];\n            checked = item.checked;\n            task = item.task;\n\n            itemBody = '';\n            if (item.task) {\n              checkbox = this.renderer.checkbox(checked);\n              if (loose) {\n                if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n                  item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n                  if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n                    item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n                  }\n                } else {\n                  item.tokens.unshift({\n                    type: 'text',\n                    text: checkbox\n                  });\n                }\n              } else {\n                itemBody += checkbox;\n              }\n            }\n\n            itemBody += this.parse(item.tokens, loose);\n            body += this.renderer.listitem(itemBody, task, checked);\n          }\n\n          out += this.renderer.list(body, ordered, start);\n          continue;\n        }\n        case 'html': {\n          out += this.renderer.html(token.text, token.block);\n          continue;\n        }\n        case 'paragraph': {\n          out += this.renderer.paragraph(this.parseInline(token.tokens));\n          continue;\n        }\n        case 'text': {\n          body = token.tokens ? this.parseInline(token.tokens) : token.text;\n          while (i + 1 < l && tokens[i + 1].type === 'text') {\n            token = tokens[++i];\n            body += '\\n' + (token.tokens ? this.parseInline(token.tokens) : token.text);\n          }\n          out += top ? this.renderer.paragraph(body) : body;\n          continue;\n        }\n\n        default: {\n          const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n          if (this.options.silent) {\n            console.error(errMsg);\n            return;\n          } else {\n            throw new Error(errMsg);\n          }\n        }\n      }\n    }\n\n    return out;\n  }\n\n  /**\n   * Parse Inline Tokens\n   */\n  parseInline(tokens, renderer) {\n    renderer = renderer || this.renderer;\n    let out = '',\n      i,\n      token,\n      ret;\n\n    const l = tokens.length;\n    for (i = 0; i < l; i++) {\n      token = tokens[i];\n\n      // Run any renderer extensions\n      if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n        ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n        if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {\n          out += ret || '';\n          continue;\n        }\n      }\n\n      switch (token.type) {\n        case 'escape': {\n          out += renderer.text(token.text);\n          break;\n        }\n        case 'html': {\n          out += renderer.html(token.text);\n          break;\n        }\n        case 'link': {\n          out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));\n          break;\n        }\n        case 'image': {\n          out += renderer.image(token.href, token.title, token.text);\n          break;\n        }\n        case 'strong': {\n          out += renderer.strong(this.parseInline(token.tokens, renderer));\n          break;\n        }\n        case 'em': {\n          out += renderer.em(this.parseInline(token.tokens, renderer));\n          break;\n        }\n        case 'codespan': {\n          out += renderer.codespan(token.text);\n          break;\n        }\n        case 'br': {\n          out += renderer.br();\n          break;\n        }\n        case 'del': {\n          out += renderer.del(this.parseInline(token.tokens, renderer));\n          break;\n        }\n        case 'text': {\n          out += renderer.text(token.text);\n          break;\n        }\n        default: {\n          const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n          if (this.options.silent) {\n            console.error(errMsg);\n            return;\n          } else {\n            throw new Error(errMsg);\n          }\n        }\n      }\n    }\n    return out;\n  }\n}\n\nclass Hooks {\n  constructor(options) {\n    this.options = options || defaults;\n  }\n\n  static passThroughHooks = new Set([\n    'preprocess',\n    'postprocess'\n  ]);\n\n  /**\n   * Process markdown before marked\n   */\n  preprocess(markdown) {\n    return markdown;\n  }\n\n  /**\n   * Process HTML after marked is finished\n   */\n  postprocess(html) {\n    return html;\n  }\n}\n\nclass Marked {\n  defaults = getDefaults();\n  options = this.setOptions;\n\n  parse = this.#parseMarkdown(Lexer.lex, Parser.parse);\n  parseInline = this.#parseMarkdown(Lexer.lexInline, Parser.parseInline);\n\n  Parser = Parser;\n  parser = Parser.parse;\n  Renderer = Renderer;\n  TextRenderer = TextRenderer;\n  Lexer = Lexer;\n  lexer = Lexer.lex;\n  Tokenizer = Tokenizer;\n  Slugger = Slugger;\n  Hooks = Hooks;\n\n  constructor(...args) {\n    this.use(...args);\n  }\n\n  walkTokens(tokens, callback) {\n    let values = [];\n    for (const token of tokens) {\n      values = values.concat(callback.call(this, token));\n      switch (token.type) {\n        case 'table': {\n          for (const cell of token.header) {\n            values = values.concat(this.walkTokens(cell.tokens, callback));\n          }\n          for (const row of token.rows) {\n            for (const cell of row) {\n              values = values.concat(this.walkTokens(cell.tokens, callback));\n            }\n          }\n          break;\n        }\n        case 'list': {\n          values = values.concat(this.walkTokens(token.items, callback));\n          break;\n        }\n        default: {\n          if (this.defaults.extensions && this.defaults.extensions.childTokens && this.defaults.extensions.childTokens[token.type]) { // Walk any extensions\n            this.defaults.extensions.childTokens[token.type].forEach((childTokens) => {\n              values = values.concat(this.walkTokens(token[childTokens], callback));\n            });\n          } else if (token.tokens) {\n            values = values.concat(this.walkTokens(token.tokens, callback));\n          }\n        }\n      }\n    }\n    return values;\n  }\n\n  use(...args) {\n    const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };\n\n    args.forEach((pack) => {\n      // copy options to new object\n      const opts = { ...pack };\n\n      // set async to true if it was set to true before\n      opts.async = this.defaults.async || opts.async || false;\n\n      // ==-- Parse \"addon\" extensions --== //\n      if (pack.extensions) {\n        pack.extensions.forEach((ext) => {\n          if (!ext.name) {\n            throw new Error('extension name required');\n          }\n          if (ext.renderer) { // Renderer extensions\n            const prevRenderer = extensions.renderers[ext.name];\n            if (prevRenderer) {\n              // Replace extension with func to run new extension but fall back if false\n              extensions.renderers[ext.name] = function(...args) {\n                let ret = ext.renderer.apply(this, args);\n                if (ret === false) {\n                  ret = prevRenderer.apply(this, args);\n                }\n                return ret;\n              };\n            } else {\n              extensions.renderers[ext.name] = ext.renderer;\n            }\n          }\n          if (ext.tokenizer) { // Tokenizer Extensions\n            if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n              throw new Error(\"extension level must be 'block' or 'inline'\");\n            }\n            if (extensions[ext.level]) {\n              extensions[ext.level].unshift(ext.tokenizer);\n            } else {\n              extensions[ext.level] = [ext.tokenizer];\n            }\n            if (ext.start) { // Function to check for start of token\n              if (ext.level === 'block') {\n                if (extensions.startBlock) {\n                  extensions.startBlock.push(ext.start);\n                } else {\n                  extensions.startBlock = [ext.start];\n                }\n              } else if (ext.level === 'inline') {\n                if (extensions.startInline) {\n                  extensions.startInline.push(ext.start);\n                } else {\n                  extensions.startInline = [ext.start];\n                }\n              }\n            }\n          }\n          if (ext.childTokens) { // Child tokens to be visited by walkTokens\n            extensions.childTokens[ext.name] = ext.childTokens;\n          }\n        });\n        opts.extensions = extensions;\n      }\n\n      // ==-- Parse \"overwrite\" extensions --== //\n      if (pack.renderer) {\n        const renderer = this.defaults.renderer || new Renderer(this.defaults);\n        for (const prop in pack.renderer) {\n          const prevRenderer = renderer[prop];\n          // Replace renderer with func to run extension, but fall back if false\n          renderer[prop] = (...args) => {\n            let ret = pack.renderer[prop].apply(renderer, args);\n            if (ret === false) {\n              ret = prevRenderer.apply(renderer, args);\n            }\n            return ret;\n          };\n        }\n        opts.renderer = renderer;\n      }\n      if (pack.tokenizer) {\n        const tokenizer = this.defaults.tokenizer || new Tokenizer(this.defaults);\n        for (const prop in pack.tokenizer) {\n          const prevTokenizer = tokenizer[prop];\n          // Replace tokenizer with func to run extension, but fall back if false\n          tokenizer[prop] = (...args) => {\n            let ret = pack.tokenizer[prop].apply(tokenizer, args);\n            if (ret === false) {\n              ret = prevTokenizer.apply(tokenizer, args);\n            }\n            return ret;\n          };\n        }\n        opts.tokenizer = tokenizer;\n      }\n\n      // ==-- Parse Hooks extensions --== //\n      if (pack.hooks) {\n        const hooks = this.defaults.hooks || new Hooks();\n        for (const prop in pack.hooks) {\n          const prevHook = hooks[prop];\n          if (Hooks.passThroughHooks.has(prop)) {\n            hooks[prop] = (arg) => {\n              if (this.defaults.async) {\n                return Promise.resolve(pack.hooks[prop].call(hooks, arg)).then(ret => {\n                  return prevHook.call(hooks, ret);\n                });\n              }\n\n              const ret = pack.hooks[prop].call(hooks, arg);\n              return prevHook.call(hooks, ret);\n            };\n          } else {\n            hooks[prop] = (...args) => {\n              let ret = pack.hooks[prop].apply(hooks, args);\n              if (ret === false) {\n                ret = prevHook.apply(hooks, args);\n              }\n              return ret;\n            };\n          }\n        }\n        opts.hooks = hooks;\n      }\n\n      // ==-- Parse WalkTokens extensions --== //\n      if (pack.walkTokens) {\n        const walkTokens = this.defaults.walkTokens;\n        opts.walkTokens = function(token) {\n          let values = [];\n          values.push(pack.walkTokens.call(this, token));\n          if (walkTokens) {\n            values = values.concat(walkTokens.call(this, token));\n          }\n          return values;\n        };\n      }\n\n      this.defaults = { ...this.defaults, ...opts };\n    });\n\n    return this;\n  }\n\n  setOptions(opt) {\n    this.defaults = { ...this.defaults, ...opt };\n    return this;\n  }\n\n  #parseMarkdown(lexer, parser) {\n    return (src, opt, callback) => {\n      if (typeof opt === 'function') {\n        callback = opt;\n        opt = null;\n      }\n\n      const origOpt = { ...opt };\n      opt = { ...this.defaults, ...origOpt };\n      const throwError = this.#onError(opt.silent, opt.async, callback);\n\n      // throw error in case of non string input\n      if (typeof src === 'undefined' || src === null) {\n        return throwError(new Error('marked(): input parameter is undefined or null'));\n      }\n      if (typeof src !== 'string') {\n        return throwError(new Error('marked(): input parameter is of type '\n          + Object.prototype.toString.call(src) + ', string expected'));\n      }\n\n      checkDeprecations(opt, callback);\n\n      if (opt.hooks) {\n        opt.hooks.options = opt;\n      }\n\n      if (callback) {\n        const highlight = opt.highlight;\n        let tokens;\n\n        try {\n          if (opt.hooks) {\n            src = opt.hooks.preprocess(src);\n          }\n          tokens = lexer(src, opt);\n        } catch (e) {\n          return throwError(e);\n        }\n\n        const done = (err) => {\n          let out;\n\n          if (!err) {\n            try {\n              if (opt.walkTokens) {\n                this.walkTokens(tokens, opt.walkTokens);\n              }\n              out = parser(tokens, opt);\n              if (opt.hooks) {\n                out = opt.hooks.postprocess(out);\n              }\n            } catch (e) {\n              err = e;\n            }\n          }\n\n          opt.highlight = highlight;\n\n          return err\n            ? throwError(err)\n            : callback(null, out);\n        };\n\n        if (!highlight || highlight.length < 3) {\n          return done();\n        }\n\n        delete opt.highlight;\n\n        if (!tokens.length) return done();\n\n        let pending = 0;\n        this.walkTokens(tokens, (token) => {\n          if (token.type === 'code') {\n            pending++;\n            setTimeout(() => {\n              highlight(token.text, token.lang, (err, code) => {\n                if (err) {\n                  return done(err);\n                }\n                if (code != null && code !== token.text) {\n                  token.text = code;\n                  token.escaped = true;\n                }\n\n                pending--;\n                if (pending === 0) {\n                  done();\n                }\n              });\n            }, 0);\n          }\n        });\n\n        if (pending === 0) {\n          done();\n        }\n\n        return;\n      }\n\n      if (opt.async) {\n        return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src)\n          .then(src => lexer(src, opt))\n          .then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens)\n          .then(tokens => parser(tokens, opt))\n          .then(html => opt.hooks ? opt.hooks.postprocess(html) : html)\n          .catch(throwError);\n      }\n\n      try {\n        if (opt.hooks) {\n          src = opt.hooks.preprocess(src);\n        }\n        const tokens = lexer(src, opt);\n        if (opt.walkTokens) {\n          this.walkTokens(tokens, opt.walkTokens);\n        }\n        let html = parser(tokens, opt);\n        if (opt.hooks) {\n          html = opt.hooks.postprocess(html);\n        }\n        return html;\n      } catch (e) {\n        return throwError(e);\n      }\n    };\n  }\n\n  #onError(silent, async, callback) {\n    return (e) => {\n      e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n\n      if (silent) {\n        const msg = '<p>An error occurred:</p><pre>'\n          + escape(e.message + '', true)\n          + '</pre>';\n        if (async) {\n          return Promise.resolve(msg);\n        }\n        if (callback) {\n          callback(null, msg);\n          return;\n        }\n        return msg;\n      }\n\n      if (async) {\n        return Promise.reject(e);\n      }\n      if (callback) {\n        callback(e);\n        return;\n      }\n      throw e;\n    };\n  }\n}\n\nconst markedInstance = new Marked(defaults);\n\n/**\n * Marked\n */\nfunction marked(src, opt, callback) {\n  return markedInstance.parse(src, opt, callback);\n}\n\n/**\n * Options\n */\n\nmarked.options =\nmarked.setOptions = function(opt) {\n  markedInstance.setOptions(opt);\n  marked.defaults = markedInstance.defaults;\n  changeDefaults(marked.defaults);\n  return marked;\n};\n\nmarked.getDefaults = getDefaults;\n\nmarked.defaults = defaults;\n\n/**\n * Use Extension\n */\n\nmarked.use = function(...args) {\n  markedInstance.use(...args);\n  marked.defaults = markedInstance.defaults;\n  changeDefaults(marked.defaults);\n  return marked;\n};\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function(tokens, callback) {\n  return markedInstance.walkTokens(tokens, callback);\n};\n\n/**\n * Parse Inline\n * @param {string} src\n */\nmarked.parseInline = markedInstance.parseInline;\n\n/**\n * Expose\n */\nmarked.Parser = Parser;\nmarked.parser = Parser.parse;\nmarked.Renderer = Renderer;\nmarked.TextRenderer = TextRenderer;\nmarked.Lexer = Lexer;\nmarked.lexer = Lexer.lex;\nmarked.Tokenizer = Tokenizer;\nmarked.Slugger = Slugger;\nmarked.Hooks = Hooks;\nmarked.parse = marked;\n\nconst options = marked.options;\nconst setOptions = marked.setOptions;\nconst use = marked.use;\nconst walkTokens = marked.walkTokens;\nconst parseInline = marked.parseInline;\nconst parse = marked;\nconst parser = Parser.parse;\nconst lexer = Lexer.lex;\n\nexport { Hooks, Lexer, Marked, Parser, Renderer, Slugger, TextRenderer, Tokenizer, defaults, getDefaults, lexer, marked, options, parse, parseInline, parser, setOptions, use, walkTokens };\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","// Generated using scripts/write-decode-map.ts\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\n/** Packed XML decode trie data. */\nexport const xmlDecodeTree = /* #__PURE__ */ decodeBase64(\"AAJhZ2xxBwARABMAFQBtAg0AAAAAAA8AcAAmYG8AcwAnYHQAPmB0ADxg9SFvdCJg\");\n//# sourceMappingURL=decode-data-xml.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","import { DecodingMode, EntityDecoder, htmlDecodeTree, xmlDecodeTree, } from \"entities/decode\";\nvar CharCodes;\n(function (CharCodes) {\n    CharCodes[CharCodes[\"Tab\"] = 9] = \"Tab\";\n    CharCodes[CharCodes[\"NewLine\"] = 10] = \"NewLine\";\n    CharCodes[CharCodes[\"FormFeed\"] = 12] = \"FormFeed\";\n    CharCodes[CharCodes[\"CarriageReturn\"] = 13] = \"CarriageReturn\";\n    CharCodes[CharCodes[\"Space\"] = 32] = \"Space\";\n    CharCodes[CharCodes[\"ExclamationMark\"] = 33] = \"ExclamationMark\";\n    CharCodes[CharCodes[\"Number\"] = 35] = \"Number\";\n    CharCodes[CharCodes[\"Amp\"] = 38] = \"Amp\";\n    CharCodes[CharCodes[\"SingleQuote\"] = 39] = \"SingleQuote\";\n    CharCodes[CharCodes[\"DoubleQuote\"] = 34] = \"DoubleQuote\";\n    CharCodes[CharCodes[\"Dash\"] = 45] = \"Dash\";\n    CharCodes[CharCodes[\"Slash\"] = 47] = \"Slash\";\n    CharCodes[CharCodes[\"Zero\"] = 48] = \"Zero\";\n    CharCodes[CharCodes[\"Nine\"] = 57] = \"Nine\";\n    CharCodes[CharCodes[\"Semi\"] = 59] = \"Semi\";\n    CharCodes[CharCodes[\"Lt\"] = 60] = \"Lt\";\n    CharCodes[CharCodes[\"Eq\"] = 61] = \"Eq\";\n    CharCodes[CharCodes[\"Gt\"] = 62] = \"Gt\";\n    CharCodes[CharCodes[\"Questionmark\"] = 63] = \"Questionmark\";\n    CharCodes[CharCodes[\"UpperA\"] = 65] = \"UpperA\";\n    CharCodes[CharCodes[\"LowerA\"] = 97] = \"LowerA\";\n    CharCodes[CharCodes[\"UpperF\"] = 70] = \"UpperF\";\n    CharCodes[CharCodes[\"LowerF\"] = 102] = \"LowerF\";\n    CharCodes[CharCodes[\"UpperZ\"] = 90] = \"UpperZ\";\n    CharCodes[CharCodes[\"LowerZ\"] = 122] = \"LowerZ\";\n    CharCodes[CharCodes[\"LowerX\"] = 120] = \"LowerX\";\n    CharCodes[CharCodes[\"OpeningSquareBracket\"] = 91] = \"OpeningSquareBracket\";\n})(CharCodes || (CharCodes = {}));\n/** All the states the tokenizer can be in. */\nvar State;\n(function (State) {\n    State[State[\"Text\"] = 1] = \"Text\";\n    State[State[\"BeforeTagName\"] = 2] = \"BeforeTagName\";\n    State[State[\"InTagName\"] = 3] = \"InTagName\";\n    State[State[\"InSelfClosingTag\"] = 4] = \"InSelfClosingTag\";\n    State[State[\"BeforeClosingTagName\"] = 5] = \"BeforeClosingTagName\";\n    State[State[\"InClosingTagName\"] = 6] = \"InClosingTagName\";\n    State[State[\"AfterClosingTagName\"] = 7] = \"AfterClosingTagName\";\n    // Attributes\n    State[State[\"BeforeAttributeName\"] = 8] = \"BeforeAttributeName\";\n    State[State[\"InAttributeName\"] = 9] = \"InAttributeName\";\n    State[State[\"AfterAttributeName\"] = 10] = \"AfterAttributeName\";\n    State[State[\"BeforeAttributeValue\"] = 11] = \"BeforeAttributeValue\";\n    State[State[\"InAttributeValueDq\"] = 12] = \"InAttributeValueDq\";\n    State[State[\"InAttributeValueSq\"] = 13] = \"InAttributeValueSq\";\n    State[State[\"InAttributeValueNq\"] = 14] = \"InAttributeValueNq\";\n    // Declarations\n    State[State[\"BeforeDeclaration\"] = 15] = \"BeforeDeclaration\";\n    State[State[\"InDeclaration\"] = 16] = \"InDeclaration\";\n    // Processing instructions\n    State[State[\"InProcessingInstruction\"] = 17] = \"InProcessingInstruction\";\n    // Comments & CDATA\n    State[State[\"BeforeComment\"] = 18] = \"BeforeComment\";\n    State[State[\"CDATASequence\"] = 19] = \"CDATASequence\";\n    State[State[\"DeclarationSequence\"] = 20] = \"DeclarationSequence\";\n    State[State[\"InSpecialComment\"] = 21] = \"InSpecialComment\";\n    State[State[\"InCommentLike\"] = 22] = \"InCommentLike\";\n    // Special tags\n    State[State[\"SpecialStartSequence\"] = 23] = \"SpecialStartSequence\";\n    State[State[\"InSpecialTag\"] = 24] = \"InSpecialTag\";\n    State[State[\"InPlainText\"] = 25] = \"InPlainText\";\n    State[State[\"InEntity\"] = 26] = \"InEntity\";\n})(State || (State = {}));\nfunction isWhitespace(c) {\n    return (c === CharCodes.Space ||\n        c === CharCodes.NewLine ||\n        c === CharCodes.Tab ||\n        c === CharCodes.FormFeed ||\n        c === CharCodes.CarriageReturn);\n}\nfunction isEndOfTagSection(c) {\n    return c === CharCodes.Slash || c === CharCodes.Gt || isWhitespace(c);\n}\nfunction isASCIIAlpha(c) {\n    return ((c >= CharCodes.LowerA && c <= CharCodes.LowerZ) ||\n        (c >= CharCodes.UpperA && c <= CharCodes.UpperZ));\n}\n/**\n * Quote style used for parsed attributes.\n */\nexport var QuoteType;\n(function (QuoteType) {\n    QuoteType[QuoteType[\"NoValue\"] = 0] = \"NoValue\";\n    QuoteType[QuoteType[\"Unquoted\"] = 1] = \"Unquoted\";\n    QuoteType[QuoteType[\"Single\"] = 2] = \"Single\";\n    QuoteType[QuoteType[\"Double\"] = 3] = \"Double\";\n})(QuoteType || (QuoteType = {}));\n/**\n * Sequences used to match longer strings.\n *\n * We don't have `Script`, `Style`, or `Title` here. Instead, we re-use the *End\n * sequences with an increased offset.\n */\nconst Sequences = {\n    Empty: new Uint8Array(0),\n    Cdata: new Uint8Array([0x43, 0x44, 0x41, 0x54, 0x41, 0x5b]), // CDATA[\n    CdataEnd: new Uint8Array([0x5d, 0x5d, 0x3e]), // ]]>\n    CommentEnd: new Uint8Array([0x2d, 0x2d, 0x21, 0x3e]), // `--!>`\n    Doctype: new Uint8Array([0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65]), // `doctype`\n    IframeEnd: new Uint8Array([0x3c, 0x2f, 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65]), // `</iframe`\n    NoembedEnd: new Uint8Array([\n        0x3c, 0x2f, 0x6e, 0x6f, 0x65, 0x6d, 0x62, 0x65, 0x64,\n    ]), // `</noembed`\n    NoframesEnd: new Uint8Array([\n        0x3c, 0x2f, 0x6e, 0x6f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73,\n    ]), // `</noframes`\n    Plaintext: new Uint8Array([\n        0x3c, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74,\n    ]), // `</plaintext`\n    ScriptEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74]), // `</script`\n    StyleEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65]), // `</style`\n    TitleEnd: new Uint8Array([0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65]), // `</title`\n    TextareaEnd: new Uint8Array([\n        0x3c, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61,\n    ]), // `</textarea`\n    XmpEnd: new Uint8Array([0x3c, 0x2f, 0x78, 0x6d, 0x70]), // `</xmp`\n};\n/**\n * Maps the first lowercase character of an HTML tag name to the sequence\n * used for special-tag detection.  All sequences share a common layout\n * where index 2 is the first tag-name character, so matching always\n * continues from offset 3.\n */\nconst specialStartSequences = new Map([\n    [Sequences.IframeEnd[2], Sequences.IframeEnd],\n    [Sequences.NoembedEnd[2], Sequences.NoembedEnd],\n    [Sequences.Plaintext[2], Sequences.Plaintext],\n    [Sequences.ScriptEnd[2], Sequences.ScriptEnd],\n    [Sequences.TitleEnd[2], Sequences.TitleEnd],\n    [Sequences.XmpEnd[2], Sequences.XmpEnd],\n]);\n/**\n * Tokenizer implementation used by `Parser`.\n */\nexport default class Tokenizer {\n    cbs;\n    /** The current state the tokenizer is in. */\n    state = State.Text;\n    /** The read buffer. */\n    buffer = \"\";\n    /** The beginning of the section that is currently being read. */\n    sectionStart = 0;\n    /** The index within the buffer that we are currently looking at. */\n    index = 0;\n    /** The start of the last entity. */\n    entityStart = 0;\n    /** Some behavior, eg. when decoding entities, is done while we are in another state. This keeps track of the other state type. */\n    baseState = State.Text;\n    /** For special parsing behavior inside of script and style tags. */\n    isSpecial = false;\n    /** Indicates whether the tokenizer has been paused. */\n    running = true;\n    /** The offset of the current buffer. */\n    offset = 0;\n    xmlMode;\n    decodeEntities;\n    recognizeSelfClosing;\n    entityDecoder;\n    constructor({ xmlMode = false, decodeEntities = true, recognizeSelfClosing = xmlMode, }, cbs) {\n        this.cbs = cbs;\n        this.xmlMode = xmlMode;\n        this.decodeEntities = decodeEntities;\n        this.recognizeSelfClosing = recognizeSelfClosing;\n        this.entityDecoder = new EntityDecoder(xmlMode ? xmlDecodeTree : htmlDecodeTree, (cp, consumed) => this.emitCodePoint(cp, consumed));\n    }\n    reset() {\n        this.state = State.Text;\n        this.buffer = \"\";\n        this.sectionStart = 0;\n        this.index = 0;\n        this.baseState = State.Text;\n        this.isSpecial = false;\n        this.currentSequence = Sequences.Empty;\n        this.sequenceIndex = 0;\n        this.running = true;\n        this.offset = 0;\n    }\n    write(chunk) {\n        this.offset += this.buffer.length;\n        this.buffer = chunk;\n        this.parse();\n    }\n    end() {\n        if (this.running)\n            this.finish();\n    }\n    pause() {\n        this.running = false;\n    }\n    resume() {\n        this.running = true;\n        if (this.index < this.buffer.length + this.offset) {\n            this.parse();\n        }\n    }\n    stateText(c) {\n        if (c === CharCodes.Lt ||\n            (!this.decodeEntities && this.fastForwardTo(CharCodes.Lt))) {\n            if (this.index > this.sectionStart) {\n                this.cbs.ontext(this.sectionStart, this.index);\n            }\n            this.state = State.BeforeTagName;\n            this.sectionStart = this.index;\n        }\n        else if (this.decodeEntities && c === CharCodes.Amp) {\n            this.startEntity();\n        }\n    }\n    currentSequence = Sequences.Empty;\n    sequenceIndex = 0;\n    enterTagBody() {\n        if (this.currentSequence === Sequences.Plaintext) {\n            this.currentSequence = Sequences.Empty;\n            this.state = State.InPlainText;\n        }\n        else if (this.isSpecial) {\n            this.state = State.InSpecialTag;\n            this.sequenceIndex = 0;\n        }\n        else {\n            this.state = State.Text;\n        }\n    }\n    /**\n     * Match the opening tag name against an HTML text-only tag sequence.\n     *\n     * Some tags share an initial prefix (`script`/`style`, `title`/`textarea`,\n     * `noembed`/`noframes`), so we may switch to an alternate sequence at the\n     * first distinguishing byte.  On a successful full match we fall back to\n     * the normal tag-name state; a later `>` will enter raw-text, RCDATA, or\n     * plaintext mode based on `currentSequence` / `isSpecial`.\n     * @param c Current character code point.\n     */\n    stateSpecialStartSequence(c) {\n        const lower = c | 0x20;\n        // Still matching — check for an alternate sequence at branch points.\n        if (this.sequenceIndex < this.currentSequence.length) {\n            if (lower === this.currentSequence[this.sequenceIndex]) {\n                this.sequenceIndex++;\n                return;\n            }\n            if (this.sequenceIndex === 3) {\n                if (this.currentSequence === Sequences.ScriptEnd &&\n                    lower === Sequences.StyleEnd[3]) {\n                    this.currentSequence = Sequences.StyleEnd;\n                    this.sequenceIndex = 4;\n                    return;\n                }\n                if (this.currentSequence === Sequences.TitleEnd &&\n                    lower === Sequences.TextareaEnd[3]) {\n                    this.currentSequence = Sequences.TextareaEnd;\n                    this.sequenceIndex = 4;\n                    return;\n                }\n            }\n            else if (this.sequenceIndex === 4 &&\n                this.currentSequence === Sequences.NoembedEnd &&\n                lower === Sequences.NoframesEnd[4]) {\n                this.currentSequence = Sequences.NoframesEnd;\n                this.sequenceIndex = 5;\n                return;\n            }\n        }\n        else if (isEndOfTagSection(c)) {\n            // Full match on a valid tag boundary — keep the sequence.\n            this.sequenceIndex = 0;\n            this.state = State.InTagName;\n            this.stateInTagName(c);\n            return;\n        }\n        // No match — abandon special-tag detection.\n        this.isSpecial = false;\n        this.currentSequence = Sequences.Empty;\n        this.sequenceIndex = 0;\n        this.state = State.InTagName;\n        this.stateInTagName(c);\n    }\n    stateCDATASequence(c) {\n        if (c === Sequences.Cdata[this.sequenceIndex]) {\n            if (++this.sequenceIndex === Sequences.Cdata.length) {\n                this.state = State.InCommentLike;\n                this.currentSequence = Sequences.CdataEnd;\n                this.sequenceIndex = 0;\n                this.sectionStart = this.index + 1;\n            }\n        }\n        else {\n            this.sequenceIndex = 0;\n            if (this.xmlMode) {\n                this.state = State.InDeclaration;\n                this.stateInDeclaration(c); // Reconsume the character\n            }\n            else {\n                this.state = State.InSpecialComment;\n                this.stateInSpecialComment(c); // Reconsume the character\n            }\n        }\n    }\n    /**\n     * When we wait for one specific character, we can speed things up\n     * by skipping through the buffer until we find it.\n     * @param c Current character code point.\n     * @returns Whether the character was found.\n     */\n    fastForwardTo(c) {\n        while (++this.index < this.buffer.length + this.offset) {\n            if (this.buffer.charCodeAt(this.index - this.offset) === c) {\n                return true;\n            }\n        }\n        /*\n         * We increment the index at the end of the `parse` loop,\n         * so set it to `buffer.length - 1` here.\n         *\n         * TODO: Refactor `parse` to increment index before calling states.\n         */\n        this.index = this.buffer.length + this.offset - 1;\n        return false;\n    }\n    /**\n     * Emit a comment token and return to the text state.\n     * @param offset Number of characters in the end sequence that have already been matched.\n     */\n    emitComment(offset) {\n        this.cbs.oncomment(this.sectionStart, this.index, offset);\n        this.sequenceIndex = 0;\n        this.sectionStart = this.index + 1;\n        this.state = State.Text;\n    }\n    /**\n     * Comments and CDATA end with `-->` and `]]>`.\n     *\n     * Their common qualities are:\n     * - Their end sequences have a distinct character they start with.\n     * - That character is then repeated, so we have to check multiple repeats.\n     * - All characters but the start character of the sequence can be skipped.\n     * @param c Current character code point.\n     */\n    stateInCommentLike(c) {\n        if (!this.xmlMode &&\n            this.currentSequence === Sequences.CommentEnd &&\n            this.sequenceIndex <= 1 &&\n            /*\n             * We're still at the very start of the comment: the only\n             * characters consumed since `<!--` are the dashes that\n             * advanced sequenceIndex (0 for `<!-->`, 1 for `<!--->`).\n             */\n            this.index === this.sectionStart + this.sequenceIndex &&\n            c === CharCodes.Gt) {\n            // Abruptly closed empty HTML comment.\n            this.emitComment(this.sequenceIndex);\n        }\n        else if (this.currentSequence === Sequences.CommentEnd &&\n            this.sequenceIndex === 2 &&\n            c === CharCodes.Gt) {\n            // `!` is optional here, so the same sequence also accepts `-->`.\n            this.emitComment(2);\n        }\n        else if (this.currentSequence === Sequences.CommentEnd &&\n            this.sequenceIndex === this.currentSequence.length - 1 &&\n            c !== CharCodes.Gt) {\n            this.sequenceIndex = Number(c === CharCodes.Dash);\n        }\n        else if (c === this.currentSequence[this.sequenceIndex]) {\n            if (++this.sequenceIndex === this.currentSequence.length) {\n                if (this.currentSequence === Sequences.CdataEnd) {\n                    this.cbs.oncdata(this.sectionStart, this.index, 2);\n                }\n                else {\n                    this.cbs.oncomment(this.sectionStart, this.index, 3);\n                }\n                this.sequenceIndex = 0;\n                this.sectionStart = this.index + 1;\n                this.state = State.Text;\n            }\n        }\n        else if (this.sequenceIndex === 0) {\n            // Fast-forward to the first character of the sequence\n            if (this.fastForwardTo(this.currentSequence[0])) {\n                this.sequenceIndex = 1;\n            }\n        }\n        else if (c !== this.currentSequence[this.sequenceIndex - 1]) {\n            // Allow long sequences, eg. --->, ]]]>\n            this.sequenceIndex = 0;\n        }\n    }\n    /**\n     * HTML only allows ASCII alpha characters (a-z and A-Z) at the beginning of a tag name.\n     *\n     * XML allows a lot more characters here (@see https://www.w3.org/TR/REC-xml/#NT-NameStartChar).\n     * We allow anything that wouldn't end the tag.\n     * @param c Current character code point.\n     */\n    isTagStartChar(c) {\n        return this.xmlMode ? !isEndOfTagSection(c) : isASCIIAlpha(c);\n    }\n    /**\n     * Scan raw-text / RCDATA content for the matching end tag.\n     *\n     * For RCDATA tags (`<title>`, `<textarea>`) entities are decoded inline.\n     * For raw-text tags (`<script>`, `<style>`, etc.) we fast-forward to `<`.\n     * @param c Current character code point.\n     */\n    stateInSpecialTag(c) {\n        if (this.sequenceIndex === this.currentSequence.length) {\n            if (isEndOfTagSection(c)) {\n                const endOfText = this.index - this.currentSequence.length;\n                if (this.sectionStart < endOfText) {\n                    // Spoof the index so that reported locations match up.\n                    const actualIndex = this.index;\n                    this.index = endOfText;\n                    this.cbs.ontext(this.sectionStart, endOfText);\n                    this.index = actualIndex;\n                }\n                this.isSpecial = false;\n                this.sectionStart = endOfText + 2; // Skip over the `</`\n                this.stateInClosingTagName(c);\n                return; // We are done; skip the rest of the function.\n            }\n            this.sequenceIndex = 0;\n        }\n        if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) {\n            this.sequenceIndex += 1;\n        }\n        else if (this.sequenceIndex === 0) {\n            if (this.currentSequence === Sequences.TitleEnd ||\n                this.currentSequence === Sequences.TextareaEnd) {\n                // RCDATA tags have to parse entities while still looking for their end tag.\n                if (this.decodeEntities && c === CharCodes.Amp) {\n                    this.startEntity();\n                }\n            }\n            else if (this.fastForwardTo(CharCodes.Lt)) {\n                // Outside of RCDATA tags, we can fast-forward.\n                this.sequenceIndex = 1;\n            }\n        }\n        else {\n            // If we see a `<`, set the sequence index to 1; useful for eg. `<</script>`.\n            this.sequenceIndex = Number(c === CharCodes.Lt);\n        }\n    }\n    stateBeforeTagName(c) {\n        if (c === CharCodes.ExclamationMark) {\n            this.state = State.BeforeDeclaration;\n            this.sectionStart = this.index + 1;\n        }\n        else if (c === CharCodes.Questionmark) {\n            if (this.xmlMode) {\n                this.state = State.InProcessingInstruction;\n                this.sequenceIndex = 0;\n                this.sectionStart = this.index + 1;\n            }\n            else {\n                this.state = State.InSpecialComment;\n                this.sectionStart = this.index;\n            }\n        }\n        else if (this.isTagStartChar(c)) {\n            this.sectionStart = this.index;\n            const special = this.xmlMode || this.cbs.isInForeignContext?.()\n                ? undefined\n                : specialStartSequences.get(c | 0x20);\n            if (special === undefined) {\n                this.state = State.InTagName;\n            }\n            else {\n                this.isSpecial = true;\n                this.currentSequence = special;\n                this.sequenceIndex = 3;\n                this.state = State.SpecialStartSequence;\n            }\n        }\n        else if (c === CharCodes.Slash) {\n            this.state = State.BeforeClosingTagName;\n        }\n        else {\n            this.state = State.Text;\n            this.stateText(c);\n        }\n    }\n    stateInTagName(c) {\n        if (isEndOfTagSection(c)) {\n            this.cbs.onopentagname(this.sectionStart, this.index);\n            this.sectionStart = -1;\n            this.state = State.BeforeAttributeName;\n            this.stateBeforeAttributeName(c);\n        }\n    }\n    stateBeforeClosingTagName(c) {\n        if (isWhitespace(c)) {\n            if (this.xmlMode) {\n                // Ignore\n            }\n            else {\n                this.state = State.InSpecialComment;\n                this.sectionStart = this.index;\n            }\n        }\n        else if (c === CharCodes.Gt) {\n            this.state = State.Text;\n            if (!this.xmlMode) {\n                this.sectionStart = this.index + 1;\n            }\n        }\n        else {\n            this.state = this.isTagStartChar(c)\n                ? State.InClosingTagName\n                : State.InSpecialComment;\n            this.sectionStart = this.index;\n        }\n    }\n    stateInClosingTagName(c) {\n        if (isEndOfTagSection(c)) {\n            this.cbs.onclosetag(this.sectionStart, this.index);\n            this.sectionStart = -1;\n            this.state = State.AfterClosingTagName;\n            this.stateAfterClosingTagName(c);\n        }\n    }\n    stateAfterClosingTagName(c) {\n        // Skip everything until \">\"\n        if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n            this.state = State.Text;\n            this.sectionStart = this.index + 1;\n        }\n    }\n    stateBeforeAttributeName(c) {\n        if (c === CharCodes.Gt) {\n            this.cbs.onopentagend(this.index);\n            this.enterTagBody();\n            this.sectionStart = this.index + 1;\n        }\n        else if (c === CharCodes.Slash) {\n            this.state = State.InSelfClosingTag;\n        }\n        else if (!isWhitespace(c)) {\n            this.state = State.InAttributeName;\n            this.sectionStart = this.index;\n        }\n    }\n    /**\n     * Handle `/` before `>` in an opening tag.\n     *\n     * In HTML mode, text-only tags ignore the self-closing flag and still enter\n     * their raw-text/RCDATA/plaintext state unless self-closing tags are being\n     * recognized. In XML mode, or for ordinary tags, the tokenizer returns to\n     * regular text parsing after emitting the self-closing callback.\n     * @param c Current character code point.\n     */\n    stateInSelfClosingTag(c) {\n        if (c === CharCodes.Gt) {\n            this.cbs.onselfclosingtag(this.index);\n            this.sectionStart = this.index + 1;\n            if (!this.recognizeSelfClosing) {\n                this.enterTagBody();\n                return;\n            }\n            this.state = State.Text;\n            this.isSpecial = false; // Reset special state, in case of self-closing special tags\n            this.currentSequence = Sequences.Empty;\n        }\n        else if (!isWhitespace(c)) {\n            this.state = State.BeforeAttributeName;\n            this.stateBeforeAttributeName(c);\n        }\n    }\n    stateInAttributeName(c) {\n        if (c === CharCodes.Eq || isEndOfTagSection(c)) {\n            this.cbs.onattribname(this.sectionStart, this.index);\n            this.sectionStart = this.index;\n            this.state = State.AfterAttributeName;\n            this.stateAfterAttributeName(c);\n        }\n    }\n    stateAfterAttributeName(c) {\n        if (c === CharCodes.Eq) {\n            this.state = State.BeforeAttributeValue;\n        }\n        else if (c === CharCodes.Slash || c === CharCodes.Gt) {\n            this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n            this.sectionStart = -1;\n            this.state = State.BeforeAttributeName;\n            this.stateBeforeAttributeName(c);\n        }\n        else if (!isWhitespace(c)) {\n            this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n            this.state = State.InAttributeName;\n            this.sectionStart = this.index;\n        }\n    }\n    stateBeforeAttributeValue(c) {\n        if (c === CharCodes.DoubleQuote) {\n            this.state = State.InAttributeValueDq;\n            this.sectionStart = this.index + 1;\n        }\n        else if (c === CharCodes.SingleQuote) {\n            this.state = State.InAttributeValueSq;\n            this.sectionStart = this.index + 1;\n        }\n        else if (!isWhitespace(c)) {\n            this.sectionStart = this.index;\n            this.state = State.InAttributeValueNq;\n            this.stateInAttributeValueNoQuotes(c); // Reconsume token\n        }\n    }\n    handleInAttributeValue(c, quote) {\n        if (c === quote ||\n            (!this.decodeEntities && this.fastForwardTo(quote))) {\n            this.cbs.onattribdata(this.sectionStart, this.index);\n            this.sectionStart = -1;\n            this.cbs.onattribend(quote === CharCodes.DoubleQuote\n                ? QuoteType.Double\n                : QuoteType.Single, this.index + 1);\n            this.state = State.BeforeAttributeName;\n        }\n        else if (this.decodeEntities && c === CharCodes.Amp) {\n            this.startEntity();\n        }\n    }\n    stateInAttributeValueDoubleQuotes(c) {\n        this.handleInAttributeValue(c, CharCodes.DoubleQuote);\n    }\n    stateInAttributeValueSingleQuotes(c) {\n        this.handleInAttributeValue(c, CharCodes.SingleQuote);\n    }\n    stateInAttributeValueNoQuotes(c) {\n        if (isWhitespace(c) || c === CharCodes.Gt) {\n            this.cbs.onattribdata(this.sectionStart, this.index);\n            this.sectionStart = -1;\n            this.cbs.onattribend(QuoteType.Unquoted, this.index);\n            this.state = State.BeforeAttributeName;\n            this.stateBeforeAttributeName(c);\n        }\n        else if (this.decodeEntities && c === CharCodes.Amp) {\n            this.startEntity();\n        }\n    }\n    /**\n     * Distinguish between CDATA, declarations, HTML comments, and HTML bogus\n     * comments after `<!`.\n     *\n     * In HTML mode, only real comments and doctypes stay on declaration paths;\n     * everything else becomes a bogus comment terminated by the next `>`.\n     * @param c Current character code point.\n     */\n    stateBeforeDeclaration(c) {\n        if (c === CharCodes.OpeningSquareBracket) {\n            this.state = State.CDATASequence;\n            this.sequenceIndex = 0;\n        }\n        else if (this.xmlMode) {\n            this.state =\n                c === CharCodes.Dash\n                    ? State.BeforeComment\n                    : State.InDeclaration;\n        }\n        else if ((c | 0x20) === Sequences.Doctype[0]) {\n            this.state = State.DeclarationSequence;\n            this.currentSequence = Sequences.Doctype;\n            this.sequenceIndex = 1;\n        }\n        else if (c === CharCodes.Gt) {\n            this.cbs.oncomment(this.sectionStart, this.index, 0);\n            this.state = State.Text;\n            this.sectionStart = this.index + 1;\n        }\n        else if (c === CharCodes.Dash) {\n            this.state = State.BeforeComment;\n        }\n        else {\n            this.state = State.InSpecialComment;\n        }\n    }\n    /**\n     * Continue matching `doctype` after `<!d`.\n     *\n     * A full `doctype` match stays on the declaration path; any other name falls\n     * back to an HTML bogus comment, which matches browser behavior for\n     * non-doctype `<!...>` constructs.\n     * @param c Current character code point.\n     */\n    stateDeclarationSequence(c) {\n        if (this.sequenceIndex === this.currentSequence.length) {\n            this.state = State.InDeclaration;\n            this.stateInDeclaration(c);\n        }\n        else if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) {\n            this.sequenceIndex += 1;\n        }\n        else if (c === CharCodes.Gt) {\n            this.cbs.oncomment(this.sectionStart, this.index, 0);\n            this.state = State.Text;\n            this.sectionStart = this.index + 1;\n        }\n        else {\n            this.state = State.InSpecialComment;\n        }\n    }\n    stateInDeclaration(c) {\n        if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n            this.cbs.ondeclaration(this.sectionStart, this.index);\n            this.state = State.Text;\n            this.sectionStart = this.index + 1;\n        }\n    }\n    /**\n     * XML processing instructions (`<?...?>`).\n     *\n     * In HTML mode `<?` is routed to `InSpecialComment` instead, so this\n     * state is only reachable in XML mode.\n     * @param c Current character code point.\n     */\n    stateInProcessingInstruction(c) {\n        if (c === CharCodes.Questionmark) {\n            // Remember that we just consumed `?`, so the next `>` closes the PI.\n            this.sequenceIndex = 1;\n        }\n        else if (c === CharCodes.Gt && this.sequenceIndex === 1) {\n            this.cbs.onprocessinginstruction(this.sectionStart, this.index - 1);\n            this.sequenceIndex = 0;\n            this.state = State.Text;\n            this.sectionStart = this.index + 1;\n        }\n        else {\n            // Keep scanning for the next `?`, which can start a closing `?>`.\n            this.sequenceIndex = Number(this.fastForwardTo(CharCodes.Questionmark));\n        }\n    }\n    stateBeforeComment(c) {\n        if (c === CharCodes.Dash) {\n            this.state = State.InCommentLike;\n            this.currentSequence = Sequences.CommentEnd;\n            this.sequenceIndex = 0;\n            this.sectionStart = this.index + 1;\n        }\n        else if (this.xmlMode) {\n            this.state = State.InDeclaration;\n        }\n        else if (c === CharCodes.Gt) {\n            this.cbs.oncomment(this.sectionStart, this.index, 0);\n            this.state = State.Text;\n            this.sectionStart = this.index + 1;\n        }\n        else {\n            this.state = State.InSpecialComment;\n        }\n    }\n    stateInSpecialComment(c) {\n        if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n            this.cbs.oncomment(this.sectionStart, this.index, 0);\n            this.state = State.Text;\n            this.sectionStart = this.index + 1;\n        }\n    }\n    startEntity() {\n        this.baseState = this.state;\n        this.state = State.InEntity;\n        this.entityStart = this.index;\n        this.entityDecoder.startEntity(this.xmlMode\n            ? DecodingMode.Strict\n            : this.baseState === State.Text ||\n                this.baseState === State.InSpecialTag\n                ? DecodingMode.Legacy\n                : DecodingMode.Attribute);\n    }\n    stateInEntity() {\n        const indexInBuffer = this.index - this.offset;\n        const length = this.entityDecoder.write(this.buffer, indexInBuffer);\n        // If `length` is positive, we are done with the entity.\n        if (length >= 0) {\n            this.state = this.baseState;\n            if (length === 0) {\n                this.index -= 1;\n            }\n        }\n        else {\n            if (indexInBuffer < this.buffer.length &&\n                this.buffer.charCodeAt(indexInBuffer) === CharCodes.Amp) {\n                this.state = this.baseState;\n                this.index -= 1;\n                return;\n            }\n            // Mark buffer as consumed.\n            this.index = this.offset + this.buffer.length - 1;\n        }\n    }\n    /**\n     * Remove data that has already been consumed from the buffer.\n     */\n    cleanup() {\n        // If we are inside of text or attributes, emit what we already have.\n        if (this.running && this.sectionStart !== this.index) {\n            if (this.state === State.Text ||\n                this.state === State.InPlainText ||\n                (this.state === State.InSpecialTag && this.sequenceIndex === 0)) {\n                this.cbs.ontext(this.sectionStart, this.index);\n                this.sectionStart = this.index;\n            }\n            else if (this.state === State.InAttributeValueDq ||\n                this.state === State.InAttributeValueSq ||\n                this.state === State.InAttributeValueNq) {\n                this.cbs.onattribdata(this.sectionStart, this.index);\n                this.sectionStart = this.index;\n            }\n        }\n    }\n    shouldContinue() {\n        return this.index < this.buffer.length + this.offset && this.running;\n    }\n    /**\n     * Iterates through the buffer, calling the function corresponding to the current state.\n     *\n     * States that are more likely to be hit are higher up, as a performance improvement.\n     */\n    parse() {\n        while (this.shouldContinue()) {\n            const c = this.buffer.charCodeAt(this.index - this.offset);\n            switch (this.state) {\n                case State.Text: {\n                    this.stateText(c);\n                    break;\n                }\n                case State.InPlainText: {\n                    // Skip to end of buffer; cleanup() emits the text.\n                    this.index = this.buffer.length + this.offset - 1;\n                    break;\n                }\n                case State.SpecialStartSequence: {\n                    this.stateSpecialStartSequence(c);\n                    break;\n                }\n                case State.InSpecialTag: {\n                    this.stateInSpecialTag(c);\n                    break;\n                }\n                case State.CDATASequence: {\n                    this.stateCDATASequence(c);\n                    break;\n                }\n                case State.DeclarationSequence: {\n                    this.stateDeclarationSequence(c);\n                    break;\n                }\n                case State.InAttributeValueDq: {\n                    this.stateInAttributeValueDoubleQuotes(c);\n                    break;\n                }\n                case State.InAttributeName: {\n                    this.stateInAttributeName(c);\n                    break;\n                }\n                case State.InCommentLike: {\n                    this.stateInCommentLike(c);\n                    break;\n                }\n                case State.InSpecialComment: {\n                    this.stateInSpecialComment(c);\n                    break;\n                }\n                case State.BeforeAttributeName: {\n                    this.stateBeforeAttributeName(c);\n                    break;\n                }\n                case State.InTagName: {\n                    this.stateInTagName(c);\n                    break;\n                }\n                case State.InClosingTagName: {\n                    this.stateInClosingTagName(c);\n                    break;\n                }\n                case State.BeforeTagName: {\n                    this.stateBeforeTagName(c);\n                    break;\n                }\n                case State.AfterAttributeName: {\n                    this.stateAfterAttributeName(c);\n                    break;\n                }\n                case State.InAttributeValueSq: {\n                    this.stateInAttributeValueSingleQuotes(c);\n                    break;\n                }\n                case State.BeforeAttributeValue: {\n                    this.stateBeforeAttributeValue(c);\n                    break;\n                }\n                case State.BeforeClosingTagName: {\n                    this.stateBeforeClosingTagName(c);\n                    break;\n                }\n                case State.AfterClosingTagName: {\n                    this.stateAfterClosingTagName(c);\n                    break;\n                }\n                case State.InAttributeValueNq: {\n                    this.stateInAttributeValueNoQuotes(c);\n                    break;\n                }\n                case State.InSelfClosingTag: {\n                    this.stateInSelfClosingTag(c);\n                    break;\n                }\n                case State.InDeclaration: {\n                    this.stateInDeclaration(c);\n                    break;\n                }\n                case State.BeforeDeclaration: {\n                    this.stateBeforeDeclaration(c);\n                    break;\n                }\n                case State.BeforeComment: {\n                    this.stateBeforeComment(c);\n                    break;\n                }\n                case State.InProcessingInstruction: {\n                    this.stateInProcessingInstruction(c);\n                    break;\n                }\n                case State.InEntity: {\n                    this.stateInEntity();\n                    break;\n                }\n            }\n            this.index++;\n        }\n        this.cleanup();\n    }\n    finish() {\n        if (this.state === State.InEntity) {\n            this.entityDecoder.end();\n            this.state = this.baseState;\n        }\n        this.handleTrailingData();\n        this.cbs.onend();\n    }\n    handleTrailingCommentLikeData(endIndex) {\n        if (this.state !== State.InCommentLike) {\n            return false;\n        }\n        if (this.currentSequence === Sequences.CdataEnd) {\n            if (this.xmlMode) {\n                if (this.sectionStart < endIndex) {\n                    this.cbs.oncdata(this.sectionStart, endIndex, 0);\n                }\n            }\n            else {\n                /* In HTML mode, unclosed CDATA is a bogus comment. */\n                const cdataStart = this.sectionStart - Sequences.Cdata.length - 1;\n                this.cbs.oncomment(cdataStart, endIndex, 0);\n            }\n        }\n        else {\n            const offset = this.xmlMode\n                ? 0\n                : Math.min(this.sequenceIndex, Sequences.CommentEnd.length - 1);\n            this.cbs.oncomment(this.sectionStart, endIndex, offset);\n        }\n        return true;\n    }\n    handleTrailingMarkupDeclaration(endIndex) {\n        if (this.xmlMode) {\n            switch (this.state) {\n                case State.InSpecialComment:\n                case State.BeforeComment:\n                case State.CDATASequence:\n                case State.DeclarationSequence:\n                case State.InDeclaration: {\n                    this.cbs.ontext(this.sectionStart, endIndex);\n                    return true;\n                }\n                default: {\n                    return false;\n                }\n            }\n        }\n        switch (this.state) {\n            case State.BeforeDeclaration:\n            case State.InSpecialComment:\n            case State.BeforeComment:\n            case State.CDATASequence: {\n                this.cbs.oncomment(this.sectionStart, endIndex, 0);\n                return true;\n            }\n            case State.DeclarationSequence: {\n                if (this.sequenceIndex !== Sequences.Doctype.length) {\n                    this.cbs.oncomment(this.sectionStart, endIndex, 0);\n                }\n                return true;\n            }\n            case State.InDeclaration: {\n                return true;\n            }\n            default: {\n                return false;\n            }\n        }\n    }\n    /** Handle any trailing data. */\n    handleTrailingData() {\n        const endIndex = this.buffer.length + this.offset;\n        if (this.handleTrailingCommentLikeData(endIndex) ||\n            this.handleTrailingMarkupDeclaration(endIndex)) {\n            return;\n        }\n        // If there is no remaining data, we are done.\n        if (this.sectionStart >= endIndex) {\n            return;\n        }\n        switch (this.state) {\n            case State.InTagName:\n            case State.BeforeAttributeName:\n            case State.BeforeAttributeValue:\n            case State.AfterAttributeName:\n            case State.InAttributeName:\n            case State.InAttributeValueSq:\n            case State.InAttributeValueDq:\n            case State.InAttributeValueNq:\n            case State.InClosingTagName: {\n                /*\n                 * If we are currently in an opening or closing tag, us not calling the\n                 * respective callback signals that the tag should be ignored.\n                 */\n                break;\n            }\n            default: {\n                this.cbs.ontext(this.sectionStart, endIndex);\n            }\n        }\n    }\n    emitCodePoint(cp, consumed) {\n        if (this.baseState !== State.Text &&\n            this.baseState !== State.InSpecialTag) {\n            if (this.sectionStart < this.entityStart) {\n                this.cbs.onattribdata(this.sectionStart, this.entityStart);\n            }\n            this.sectionStart = this.entityStart + consumed;\n            this.index = this.sectionStart - 1;\n            this.cbs.onattribentity(cp);\n        }\n        else {\n            if (this.sectionStart < this.entityStart) {\n                this.cbs.ontext(this.sectionStart, this.entityStart);\n            }\n            this.sectionStart = this.entityStart + consumed;\n            this.index = this.sectionStart - 1;\n            this.cbs.ontextentity(cp, this.sectionStart);\n        }\n    }\n}\n//# sourceMappingURL=Tokenizer.js.map","const { fromCodePoint } = String;\nimport Tokenizer, { QuoteType } from \"./Tokenizer.js\";\nconst formTags = new Set([\n    \"input\",\n    \"option\",\n    \"optgroup\",\n    \"select\",\n    \"button\",\n    \"datalist\",\n    \"textarea\",\n]);\nconst pTag = new Set([\"p\"]);\nconst headingTags = new Set([\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"p\"]);\nconst tableSectionTags = new Set([\"thead\", \"tbody\"]);\nconst ddtTags = new Set([\"dd\", \"dt\"]);\nconst rtpTags = new Set([\"rt\", \"rp\"]);\nconst openImpliesClose = new Map([\n    [\"tr\", new Set([\"tr\", \"th\", \"td\"])],\n    [\"th\", new Set([\"th\"])],\n    [\"td\", new Set([\"thead\", \"th\", \"td\"])],\n    [\"body\", new Set([\"head\", \"link\", \"script\"])],\n    [\"a\", new Set([\"a\"])],\n    [\"li\", new Set([\"li\"])],\n    [\"p\", pTag],\n    [\"h1\", headingTags],\n    [\"h2\", headingTags],\n    [\"h3\", headingTags],\n    [\"h4\", headingTags],\n    [\"h5\", headingTags],\n    [\"h6\", headingTags],\n    [\"select\", formTags],\n    [\"input\", formTags],\n    [\"output\", formTags],\n    [\"button\", formTags],\n    [\"datalist\", formTags],\n    [\"textarea\", formTags],\n    [\"option\", new Set([\"option\"])],\n    [\"optgroup\", new Set([\"optgroup\", \"option\"])],\n    [\"dd\", ddtTags],\n    [\"dt\", ddtTags],\n    [\"address\", pTag],\n    [\"article\", pTag],\n    [\"aside\", pTag],\n    [\"blockquote\", pTag],\n    [\"details\", pTag],\n    [\"div\", pTag],\n    [\"dl\", pTag],\n    [\"fieldset\", pTag],\n    [\"figcaption\", pTag],\n    [\"figure\", pTag],\n    [\"footer\", pTag],\n    [\"form\", pTag],\n    [\"header\", pTag],\n    [\"hr\", pTag],\n    [\"main\", pTag],\n    [\"nav\", pTag],\n    [\"ol\", pTag],\n    [\"pre\", pTag],\n    [\"section\", pTag],\n    [\"table\", pTag],\n    [\"ul\", pTag],\n    [\"rt\", rtpTags],\n    [\"rp\", rtpTags],\n    [\"tbody\", tableSectionTags],\n    [\"tfoot\", tableSectionTags],\n]);\nconst DOCUMENT_TYPE = \"doctype\";\nconst voidElements = new Set([\n    \"area\",\n    \"base\",\n    \"basefont\",\n    \"br\",\n    \"col\",\n    \"command\",\n    \"embed\",\n    \"frame\",\n    \"hr\",\n    \"img\",\n    \"input\",\n    \"isindex\",\n    \"keygen\",\n    \"link\",\n    \"meta\",\n    \"param\",\n    \"source\",\n    \"track\",\n    \"wbr\",\n]);\nconst foreignContextElements = new Set([\"math\", \"svg\"]);\n/**\n * Elements that can be used to integrate HTML content within foreign namespaces (e.g., SVG or MathML).\n *\n * Entries must use the SVG-adjusted casing (e.g. \"foreignObject\" not\n * \"foreignobject\") since they are compared against adjusted tag names.\n */\nconst htmlIntegrationElements = new Set([\n    \"mi\",\n    \"mo\",\n    \"mn\",\n    \"ms\",\n    \"mtext\",\n    \"annotation-xml\",\n    \"foreignObject\",\n    \"desc\",\n    \"title\",\n]);\nconst svgTagNameAdjustments = new Map([\n    [\"altglyph\", \"altGlyph\"],\n    [\"altglyphdef\", \"altGlyphDef\"],\n    [\"altglyphitem\", \"altGlyphItem\"],\n    [\"animatecolor\", \"animateColor\"],\n    [\"animatemotion\", \"animateMotion\"],\n    [\"animatetransform\", \"animateTransform\"],\n    [\"clippath\", \"clipPath\"],\n    [\"feblend\", \"feBlend\"],\n    [\"fecolormatrix\", \"feColorMatrix\"],\n    [\"fecomponenttransfer\", \"feComponentTransfer\"],\n    [\"fecomposite\", \"feComposite\"],\n    [\"feconvolvematrix\", \"feConvolveMatrix\"],\n    [\"fediffuselighting\", \"feDiffuseLighting\"],\n    [\"fedisplacementmap\", \"feDisplacementMap\"],\n    [\"fedistantlight\", \"feDistantLight\"],\n    [\"fedropshadow\", \"feDropShadow\"],\n    [\"feflood\", \"feFlood\"],\n    [\"fefunca\", \"feFuncA\"],\n    [\"fefuncb\", \"feFuncB\"],\n    [\"fefuncg\", \"feFuncG\"],\n    [\"fefuncr\", \"feFuncR\"],\n    [\"fegaussianblur\", \"feGaussianBlur\"],\n    [\"feimage\", \"feImage\"],\n    [\"femerge\", \"feMerge\"],\n    [\"femergenode\", \"feMergeNode\"],\n    [\"femorphology\", \"feMorphology\"],\n    [\"feoffset\", \"feOffset\"],\n    [\"fepointlight\", \"fePointLight\"],\n    [\"fespecularlighting\", \"feSpecularLighting\"],\n    [\"fespotlight\", \"feSpotLight\"],\n    [\"fetile\", \"feTile\"],\n    [\"feturbulence\", \"feTurbulence\"],\n    [\"foreignobject\", \"foreignObject\"],\n    [\"glyphref\", \"glyphRef\"],\n    [\"lineargradient\", \"linearGradient\"],\n    [\"radialgradient\", \"radialGradient\"],\n    [\"textpath\", \"textPath\"],\n]);\nvar ForeignContext;\n(function (ForeignContext) {\n    ForeignContext[ForeignContext[\"None\"] = 0] = \"None\";\n    ForeignContext[ForeignContext[\"Svg\"] = 1] = \"Svg\";\n    ForeignContext[ForeignContext[\"MathML\"] = 2] = \"MathML\";\n})(ForeignContext || (ForeignContext = {}));\nconst reNameEnd = /\\s|\\//;\n/**\n * Incremental parser implementation.\n */\nexport class Parser {\n    options;\n    /** The start index of the last event. */\n    startIndex = 0;\n    /** The end index of the last event. */\n    endIndex = 0;\n    /**\n     * Store the start index of the current open tag,\n     * so we can update the start index for attributes.\n     */\n    openTagStart = 0;\n    tagname = \"\";\n    attribname = \"\";\n    attribvalue = \"\";\n    attribs = null;\n    stack = [];\n    foreignContext;\n    cbs;\n    lowerCaseTagNames;\n    lowerCaseAttributeNames;\n    recognizeSelfClosing;\n    /** We are parsing HTML. Inverse of the `xmlMode` option. */\n    htmlMode;\n    tokenizer;\n    buffers = [];\n    bufferOffset = 0;\n    /** The index of the last written buffer. Used when resuming after a `pause()`. */\n    writeIndex = 0;\n    /** Indicates whether the parser has finished running / `.end` has been called. */\n    ended = false;\n    constructor(cbs, options = {}) {\n        this.options = options;\n        this.cbs = cbs ?? {};\n        this.htmlMode = !this.options.xmlMode;\n        this.lowerCaseTagNames = options.lowerCaseTags ?? this.htmlMode;\n        this.lowerCaseAttributeNames =\n            options.lowerCaseAttributeNames ?? this.htmlMode;\n        this.recognizeSelfClosing =\n            options.recognizeSelfClosing ?? !this.htmlMode;\n        this.tokenizer = new (options.Tokenizer ?? Tokenizer)(this.options, this);\n        this.foreignContext = [ForeignContext.None];\n        this.cbs.onparserinit?.(this);\n    }\n    // Tokenizer event handlers\n    /**\n     * @param start Start index for the current parser event.\n     * @param endIndex End index for the current parser event.\n     * @internal\n     */\n    ontext(start, endIndex) {\n        const data = this.getSlice(start, endIndex);\n        this.endIndex = endIndex - 1;\n        this.cbs.ontext?.(data);\n        this.startIndex = endIndex;\n    }\n    /**\n     * @param cp Current Unicode code point.\n     * @param endIndex End index for the current parser event.\n     * @internal\n     */\n    ontextentity(cp, endIndex) {\n        this.endIndex = endIndex - 1;\n        this.cbs.ontext?.(fromCodePoint(cp));\n        this.startIndex = endIndex;\n    }\n    /** @internal */\n    isInForeignContext() {\n        return this.foreignContext[0] !== ForeignContext.None;\n    }\n    /**\n     * Checks if the current tag is a void element. Override this if you want\n     * to specify your own additional void elements.\n     * @param name Name of the pseudo selector.\n     */\n    isVoidElement(name) {\n        return this.htmlMode && voidElements.has(name);\n    }\n    /**\n     * Read a tag name from the buffer.\n     *\n     * When `lowerCaseTagNames` is enabled (the default in HTML mode), the name\n     * is lowercased and may be adjusted for SVG casing or the `image` → `img`\n     * alias.\n     * @param start Start index of the tag name in the buffer.\n     * @param endIndex End index of the tag name in the buffer.\n     */\n    readTagName(start, endIndex) {\n        const name = this.lowerCaseTagNames\n            ? this.getSlice(start, endIndex).toLowerCase()\n            : this.getSlice(start, endIndex);\n        if (!(this.lowerCaseTagNames && this.htmlMode)) {\n            return name;\n        }\n        if (this.foreignContext[0] === ForeignContext.Svg) {\n            return svgTagNameAdjustments.get(name) ?? name;\n        }\n        /*\n         * Closing tags for SVG elements inside HTML integration points\n         * (e.g. </foreignObject> while inside its own content) need case\n         * adjustment so the name matches what was pushed to the stack.\n         * `foreignContext.length > 1` means a foreign ancestor exists —\n         * the base [None] entry plus at least one pushed context.\n         */\n        if (this.foreignContext.length > 1) {\n            const adjusted = svgTagNameAdjustments.get(name);\n            if (adjusted !== undefined && this.stack.includes(adjusted)) {\n                return adjusted;\n            }\n        }\n        if (!this.isInForeignContext()) {\n            return name === \"image\" ? \"img\" : name;\n        }\n        return name;\n    }\n    /**\n     * @param start Start index for the current parser event.\n     * @param endIndex End index for the current parser event.\n     * @internal\n     */\n    onopentagname(start, endIndex) {\n        this.endIndex = endIndex;\n        this.emitOpenTag(this.readTagName(start, endIndex));\n    }\n    emitOpenTag(name) {\n        this.openTagStart = this.startIndex;\n        this.tagname = name;\n        /*\n         * The spec ignores a second <form> when one is already open.\n         * Setting tagname to \"\" suppresses all downstream effects: attribs\n         * stays null so endOpenTag is a no-op, and closeCurrentTag can't\n         * match \"\" on the stack.\n         */\n        if (this.htmlMode && name === \"form\" && this.stack.includes(\"form\")) {\n            this.tagname = \"\";\n            return;\n        }\n        const impliesClose = this.htmlMode && openImpliesClose.get(name);\n        if (impliesClose) {\n            while (this.stack.length > 0 && impliesClose.has(this.stack[0])) {\n                this.popElement(true);\n            }\n        }\n        if (!this.isVoidElement(name)) {\n            this.stack.unshift(name);\n            if (this.htmlMode) {\n                if (name === \"svg\") {\n                    this.foreignContext.unshift(ForeignContext.Svg);\n                }\n                else if (name === \"math\") {\n                    this.foreignContext.unshift(ForeignContext.MathML);\n                }\n                else if (htmlIntegrationElements.has(name)) {\n                    this.foreignContext.unshift(ForeignContext.None);\n                }\n            }\n        }\n        this.cbs.onopentagname?.(name);\n        if (this.cbs.onopentag)\n            this.attribs = {};\n    }\n    endOpenTag(isImplied) {\n        this.startIndex = this.openTagStart;\n        if (this.attribs) {\n            this.cbs.onopentag?.(this.tagname, this.attribs, isImplied);\n            this.attribs = null;\n        }\n        if (this.cbs.onclosetag && this.isVoidElement(this.tagname)) {\n            this.cbs.onclosetag(this.tagname, true);\n        }\n        this.tagname = \"\";\n    }\n    /**\n     * @param endIndex End index for the current parser event.\n     * @internal\n     */\n    onopentagend(endIndex) {\n        this.endIndex = endIndex;\n        this.endOpenTag(false);\n        // Set `startIndex` for next node\n        this.startIndex = endIndex + 1;\n    }\n    /**\n     * @param start Start index for the current parser event.\n     * @param endIndex End index for the current parser event.\n     * @internal\n     */\n    onclosetag(start, endIndex) {\n        this.endIndex = endIndex;\n        const name = this.readTagName(start, endIndex);\n        if (!this.isVoidElement(name)) {\n            const pos = this.stack.indexOf(name);\n            if (pos !== -1) {\n                for (let index = 0; index < pos; index++) {\n                    this.popElement(true);\n                }\n                this.popElement(false);\n            }\n            else if (this.htmlMode && name === \"p\") {\n                // Implicit open before close\n                this.emitOpenTag(\"p\");\n                this.closeCurrentTag(true);\n            }\n        }\n        else if (this.htmlMode && name === \"br\") {\n            // We can't use `emitOpenTag` for implicit open, as `br` would be implicitly closed.\n            this.cbs.onopentagname?.(\"br\");\n            this.cbs.onopentag?.(\"br\", {}, true);\n            this.cbs.onclosetag?.(\"br\", false);\n        }\n        // Set `startIndex` for next node\n        this.startIndex = endIndex + 1;\n    }\n    /**\n     * @param endIndex End index for the current parser event.\n     * @internal\n     */\n    onselfclosingtag(endIndex) {\n        this.endIndex = endIndex;\n        if (this.recognizeSelfClosing || this.isInForeignContext()) {\n            this.closeCurrentTag(false);\n            // Set `startIndex` for next node\n            this.startIndex = endIndex + 1;\n        }\n        else {\n            // Ignore the fact that the tag is self-closing.\n            this.onopentagend(endIndex);\n        }\n    }\n    /**\n     * Pop the top element off the stack, emit a close event, and maintain\n     * the foreign context stack.\n     * @param implied Whether this close is implied (not from an explicit end tag).\n     */\n    popElement(implied) {\n        // biome-ignore lint/style/noNonNullAssertion: The element is guaranteed to exist.\n        const element = this.stack.shift();\n        if (this.htmlMode &&\n            (foreignContextElements.has(element) ||\n                htmlIntegrationElements.has(element))) {\n            this.foreignContext.shift();\n        }\n        this.cbs.onclosetag?.(element, implied);\n    }\n    closeCurrentTag(isOpenImplied) {\n        const name = this.tagname;\n        this.endOpenTag(isOpenImplied);\n        // Self-closing tags will be on the top of the stack\n        if (this.stack[0] === name) {\n            this.popElement(!isOpenImplied);\n        }\n    }\n    /**\n     * @param start Start index for the current parser event.\n     * @param endIndex End index for the current parser event.\n     * @internal\n     */\n    onattribname(start, endIndex) {\n        this.startIndex = start;\n        const name = this.getSlice(start, endIndex);\n        this.attribname = this.lowerCaseAttributeNames\n            ? name.toLowerCase()\n            : name;\n    }\n    /**\n     * @param start Start index for the current parser event.\n     * @param endIndex End index for the current parser event.\n     * @internal\n     */\n    onattribdata(start, endIndex) {\n        this.attribvalue += this.getSlice(start, endIndex);\n    }\n    /**\n     * @param cp Current Unicode code point.\n     * @internal\n     */\n    onattribentity(cp) {\n        this.attribvalue += fromCodePoint(cp);\n    }\n    /**\n     * @param quote Quote type used for the current attribute.\n     * @param endIndex End index for the current parser event.\n     * @internal\n     */\n    onattribend(quote, endIndex) {\n        this.endIndex = endIndex;\n        this.cbs.onattribute?.(this.attribname, this.attribvalue, quote === QuoteType.Double\n            ? '\"'\n            : quote === QuoteType.Single\n                ? \"'\"\n                : quote === QuoteType.NoValue\n                    ? undefined\n                    : null);\n        if (this.attribs && !Object.hasOwn(this.attribs, this.attribname)) {\n            this.attribs[this.attribname] = this.attribvalue;\n        }\n        this.attribvalue = \"\";\n    }\n    getInstructionName(value) {\n        const index = value.search(reNameEnd);\n        let name = index < 0 ? value : value.substr(0, index);\n        if (this.lowerCaseTagNames) {\n            name = name.toLowerCase();\n        }\n        return name;\n    }\n    /**\n     * @param start Start index for the current parser event.\n     * @param endIndex End index for the current parser event.\n     * @internal\n     */\n    ondeclaration(start, endIndex) {\n        this.endIndex = endIndex;\n        const value = this.getSlice(start, endIndex);\n        if (this.cbs.onprocessinginstruction) {\n            /*\n             * In HTML mode, ondeclaration is only reached for DOCTYPE\n             * (the tokenizer routes everything else to bogus comments).\n             */\n            const name = this.htmlMode\n                ? this.lowerCaseTagNames\n                    ? DOCUMENT_TYPE\n                    : value.slice(0, DOCUMENT_TYPE.length)\n                : this.getInstructionName(value);\n            this.cbs.onprocessinginstruction(`!${name}`, `!${value}`);\n        }\n        // Set `startIndex` for next node\n        this.startIndex = endIndex + 1;\n    }\n    /**\n     * @param start Start index for the current parser event.\n     * @param endIndex End index for the current parser event.\n     * @internal\n     */\n    onprocessinginstruction(start, endIndex) {\n        this.endIndex = endIndex;\n        const value = this.getSlice(start, endIndex);\n        if (this.cbs.onprocessinginstruction) {\n            const name = this.getInstructionName(value);\n            this.cbs.onprocessinginstruction(`?${name}`, `?${value}`);\n        }\n        // Set `startIndex` for next node\n        this.startIndex = endIndex + 1;\n    }\n    /**\n     * @param start Start index for the current parser event.\n     * @param endIndex End index for the current parser event.\n     * @param offset Offset applied when computing parser indices.\n     * @internal\n     */\n    oncomment(start, endIndex, offset) {\n        this.endIndex = endIndex;\n        this.cbs.oncomment?.(this.getSlice(start, endIndex - offset));\n        this.cbs.oncommentend?.();\n        // Set `startIndex` for next node\n        this.startIndex = endIndex + 1;\n    }\n    /**\n     * @param start Start index for the current parser event.\n     * @param endIndex End index for the current parser event.\n     * @param offset Offset applied when computing parser indices.\n     * @internal\n     */\n    oncdata(start, endIndex, offset) {\n        this.endIndex = endIndex;\n        const value = this.getSlice(start, endIndex - offset);\n        if (!this.htmlMode || this.options.recognizeCDATA) {\n            this.cbs.oncdatastart?.();\n            this.cbs.ontext?.(value);\n            this.cbs.oncdataend?.();\n        }\n        else if (this.isInForeignContext()) {\n            this.cbs.ontext?.(value);\n        }\n        else {\n            this.cbs.oncomment?.(`[CDATA[${value}]]`);\n            this.cbs.oncommentend?.();\n        }\n        // Set `startIndex` for next node\n        this.startIndex = endIndex + 1;\n    }\n    /** @internal */\n    onend() {\n        if (this.cbs.onclosetag) {\n            // Set the end index for all remaining tags\n            this.endIndex = this.startIndex;\n            for (let index = 0; index < this.stack.length; index++) {\n                this.cbs.onclosetag(this.stack[index], true);\n            }\n        }\n        this.cbs.onend?.();\n    }\n    /**\n     * Resets the parser to a blank state, ready to parse a new HTML document\n     */\n    reset() {\n        this.cbs.onreset?.();\n        this.tokenizer.reset();\n        this.tagname = \"\";\n        this.attribname = \"\";\n        this.attribvalue = \"\";\n        this.attribs = null;\n        this.stack.length = 0;\n        this.startIndex = 0;\n        this.endIndex = 0;\n        this.cbs.onparserinit?.(this);\n        this.buffers.length = 0;\n        this.foreignContext.length = 0;\n        this.foreignContext.unshift(ForeignContext.None);\n        this.bufferOffset = 0;\n        this.writeIndex = 0;\n        this.ended = false;\n    }\n    /**\n     * Resets the parser, then parses a complete document and\n     * pushes it to the handler.\n     * @param data Document to parse.\n     */\n    parseComplete(data) {\n        this.reset();\n        this.end(data);\n    }\n    getSlice(start, end) {\n        if (start === end) {\n            return \"\";\n        }\n        while (start - this.bufferOffset >= this.buffers[0].length) {\n            this.shiftBuffer();\n        }\n        let slice = this.buffers[0].slice(start - this.bufferOffset, end - this.bufferOffset);\n        while (end - this.bufferOffset > this.buffers[0].length) {\n            this.shiftBuffer();\n            slice += this.buffers[0].slice(0, end - this.bufferOffset);\n        }\n        return slice;\n    }\n    shiftBuffer() {\n        this.bufferOffset += this.buffers[0].length;\n        this.writeIndex--;\n        this.buffers.shift();\n    }\n    /**\n     * Parses a chunk of data and calls the corresponding callbacks.\n     * @param chunk Chunk to parse.\n     */\n    write(chunk) {\n        if (this.ended) {\n            this.cbs.onerror?.(new Error(\".write() after done!\"));\n            return;\n        }\n        this.buffers.push(chunk);\n        if (this.tokenizer.running) {\n            this.tokenizer.write(chunk);\n            this.writeIndex++;\n        }\n    }\n    /**\n     * Parses the end of the buffer and clears the stack, calls onend.\n     * @param chunk Optional final chunk to parse.\n     */\n    end(chunk) {\n        if (this.ended) {\n            this.cbs.onerror?.(new Error(\".end() after done!\"));\n            return;\n        }\n        if (chunk)\n            this.write(chunk);\n        this.ended = true;\n        this.tokenizer.end();\n    }\n    /**\n     * Pauses parsing. The parser won't emit events until `resume` is called.\n     */\n    pause() {\n        this.tokenizer.pause();\n    }\n    /**\n     * Resumes parsing after `pause` was called.\n     */\n    resume() {\n        this.tokenizer.resume();\n        while (this.tokenizer.running &&\n            this.writeIndex < this.buffers.length) {\n            this.tokenizer.write(this.buffers[this.writeIndex++]);\n        }\n        if (this.ended)\n            this.tokenizer.end();\n    }\n}\n//# sourceMappingURL=Parser.js.map","/** Types of elements found in htmlparser2's DOM */\nexport var ElementType;\n(function (ElementType) {\n    /** Type for the root element of a document */\n    ElementType[\"Root\"] = \"root\";\n    /** Type for Text */\n    ElementType[\"Text\"] = \"text\";\n    /** Type for <? ... ?> */\n    ElementType[\"Directive\"] = \"directive\";\n    /** Type for <!-- ... --> */\n    ElementType[\"Comment\"] = \"comment\";\n    /** Type for <script> tags */\n    ElementType[\"Script\"] = \"script\";\n    /** Type for <style> tags */\n    ElementType[\"Style\"] = \"style\";\n    /** Type for Any tag */\n    ElementType[\"Tag\"] = \"tag\";\n    /** Type for <![CDATA[ ... ]]> */\n    ElementType[\"CDATA\"] = \"cdata\";\n    /** Type for <!doctype ...> */\n    ElementType[\"Doctype\"] = \"doctype\";\n})(ElementType || (ElementType = {}));\n/**\n * Tests whether an element is a tag or not.\n * @param element Element to test\n * @param element.type Node type discriminator to check.\n */\nexport function isTag(element) {\n    return (element.type === ElementType.Tag ||\n        element.type === ElementType.Script ||\n        element.type === ElementType.Style);\n}\n// Exports for backwards compatibility\n/** Type for the root element of a document */\n// eslint-disable-next-line prefer-destructuring\nexport const Root = ElementType.Root;\n/** Type for Text */\n// eslint-disable-next-line prefer-destructuring\nexport const Text = ElementType.Text;\n/** Type for <? ... ?> */\n// eslint-disable-next-line prefer-destructuring\nexport const Directive = ElementType.Directive;\n/** Type for <!-- ... --> */\n// eslint-disable-next-line prefer-destructuring\nexport const Comment = ElementType.Comment;\n/** Type for <script> tags */\n// eslint-disable-next-line prefer-destructuring\nexport const Script = ElementType.Script;\n/** Type for <style> tags */\n// eslint-disable-next-line prefer-destructuring\nexport const Style = ElementType.Style;\n/** Type for Any tag */\n// eslint-disable-next-line prefer-destructuring\nexport const Tag = ElementType.Tag;\n/** Type for <![CDATA[ ... ]]> */\n// eslint-disable-next-line prefer-destructuring\nexport const CDATA = ElementType.CDATA;\n/** Type for <!doctype ...> */\n// eslint-disable-next-line prefer-destructuring\nexport const Doctype = ElementType.Doctype;\n","import { ElementType, isTag as isTagRaw } from \"domelementtype\";\n/**\n * This object will be used as the prototype for Nodes when creating a\n * DOM-Level-1-compliant structure.\n */\nexport class Node {\n    /** Parent of the node */\n    parent = null;\n    /** Previous sibling */\n    prev = null;\n    /** Next sibling */\n    next = null;\n    /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */\n    startIndex = null;\n    /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */\n    endIndex = null;\n    // Read-write aliases for properties\n    /**\n     * Same as {@link parent}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get parentNode() {\n        return this.parent;\n    }\n    set parentNode(parent) {\n        this.parent = parent;\n    }\n    /**\n     * Same as {@link prev}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get previousSibling() {\n        return this.prev;\n    }\n    set previousSibling(previous) {\n        this.prev = previous;\n    }\n    /**\n     * Same as {@link next}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get nextSibling() {\n        return this.next;\n    }\n    set nextSibling(next) {\n        this.next = next;\n    }\n    /**\n     * Clone this node, and optionally its children.\n     * @param recursive Clone child nodes as well.\n     * @returns A clone of the node.\n     */\n    cloneNode(recursive = false) {\n        return cloneNode(this, recursive);\n    }\n}\n/**\n * A node that contains some data.\n */\nexport class DataNode extends Node {\n    data;\n    /**\n     * @param data The content of the data node\n     */\n    constructor(data) {\n        super();\n        this.data = data;\n    }\n    /**\n     * Same as {@link data}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get nodeValue() {\n        return this.data;\n    }\n    set nodeValue(data) {\n        this.data = data;\n    }\n}\n/**\n * Text within the document.\n */\nexport class Text extends DataNode {\n    type = ElementType.Text;\n    get nodeType() {\n        return 3;\n    }\n}\n/**\n * Comments within the document.\n */\nexport class Comment extends DataNode {\n    type = ElementType.Comment;\n    get nodeType() {\n        return 8;\n    }\n}\n/**\n * Processing instructions, including doc types.\n */\nexport class ProcessingInstruction extends DataNode {\n    type = ElementType.Directive;\n    name;\n    constructor(name, data) {\n        super(data);\n        this.name = name;\n    }\n    get nodeType() {\n        return 1;\n    }\n    /** If this is a doctype, the document type name (parse5 only). */\n    \"x-name\";\n    /** If this is a doctype, the document type public identifier (parse5 only). */\n    \"x-publicId\";\n    /** If this is a doctype, the document type system identifier (parse5 only). */\n    \"x-systemId\";\n}\n/**\n * A node that can have children.\n */\nexport class NodeWithChildren extends Node {\n    children;\n    /**\n     * @param children Children of the node. Only certain node types can have children.\n     */\n    constructor(children) {\n        super();\n        this.children = children;\n    }\n    // Aliases\n    /** First child of the node. */\n    get firstChild() {\n        return this.children[0] ?? null;\n    }\n    /** Last child of the node. */\n    get lastChild() {\n        return this.children.length > 0\n            ? this.children[this.children.length - 1]\n            : null;\n    }\n    /**\n     * Same as {@link children}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get childNodes() {\n        return this.children;\n    }\n    set childNodes(children) {\n        this.children = children;\n    }\n}\n/**\n * CDATA nodes.\n */\nexport class CDATA extends NodeWithChildren {\n    type = ElementType.CDATA;\n    get nodeType() {\n        return 4;\n    }\n}\n/**\n * The root node of the document.\n */\nexport class Document extends NodeWithChildren {\n    type = ElementType.Root;\n    get nodeType() {\n        return 9;\n    }\n}\n/**\n * An element within the DOM.\n */\nexport class Element extends NodeWithChildren {\n    name;\n    attribs;\n    type;\n    /**\n     * @param name Name of the tag, eg. `div`, `span`.\n     * @param attribs Object mapping attribute names to attribute values.\n     * @param children Children of the node.\n     * @param type Node type used for the new node instance.\n     */\n    constructor(name, attribs, children = [], type = name === \"script\"\n        ? ElementType.Script\n        : name === \"style\"\n            ? ElementType.Style\n            : ElementType.Tag) {\n        super(children);\n        this.name = name;\n        this.attribs = attribs;\n        this.type = type;\n    }\n    get nodeType() {\n        return 1;\n    }\n    // DOM Level 1 aliases\n    /**\n     * Same as {@link name}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get tagName() {\n        return this.name;\n    }\n    set tagName(name) {\n        this.name = name;\n    }\n    get attributes() {\n        return Object.keys(this.attribs).map((name) => ({\n            name,\n            value: this.attribs[name],\n            namespace: this[\"x-attribsNamespace\"]?.[name],\n            prefix: this[\"x-attribsPrefix\"]?.[name],\n        }));\n    }\n    /** Element namespace (parse5 only). */\n    namespace;\n    /** Element attribute namespaces (parse5 only). */\n    \"x-attribsNamespace\";\n    /** Element attribute namespace-related prefixes (parse5 only). */\n    \"x-attribsPrefix\";\n}\n/**\n * Checks if `node` is an element node.\n * @param node Node to check.\n * @returns `true` if the node is an element node.\n */\nexport function isTag(node) {\n    return isTagRaw(node);\n}\n/**\n * Checks if `node` is a CDATA node.\n * @param node Node to check.\n * @returns `true` if the node is a CDATA node.\n */\nexport function isCDATA(node) {\n    return node.type === ElementType.CDATA;\n}\n/**\n * Checks if `node` is a text node.\n * @param node Node to check.\n * @returns `true` if the node is a text node.\n */\nexport function isText(node) {\n    return node.type === ElementType.Text;\n}\n/**\n * Checks if `node` is a comment node.\n * @param node Node to check.\n * @returns `true` if the node is a comment node.\n */\nexport function isComment(node) {\n    return node.type === ElementType.Comment;\n}\n/**\n * Checks if `node` is a directive node.\n * @param node Node to check.\n * @returns `true` if the node is a directive node.\n */\nexport function isDirective(node) {\n    return node.type === ElementType.Directive;\n}\n/**\n * Checks if `node` is a document node.\n * @param node Node to check.\n * @returns `true` if the node is a document node.\n */\nexport function isDocument(node) {\n    return node.type === ElementType.Root;\n}\n/**\n * Checks if `node` has children.\n * @param node Node to check.\n * @returns `true` if the node has children.\n */\nexport function hasChildren(node) {\n    return Object.hasOwn(node, \"children\");\n}\n/**\n * Clone a node, and optionally its children.\n * @param node Node to clone.\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\nexport function cloneNode(node, recursive = false) {\n    let result;\n    if (isText(node)) {\n        result = new Text(node.data);\n    }\n    else if (isComment(node)) {\n        result = new Comment(node.data);\n    }\n    else if (isTag(node)) {\n        const children = recursive ? cloneChildren(node.children) : [];\n        const clone = new Element(node.name, { ...node.attribs }, children);\n        for (const child of children) {\n            child.parent = clone;\n        }\n        if (node.namespace != null) {\n            clone.namespace = node.namespace;\n        }\n        if (node[\"x-attribsNamespace\"]) {\n            clone[\"x-attribsNamespace\"] = { ...node[\"x-attribsNamespace\"] };\n        }\n        if (node[\"x-attribsPrefix\"]) {\n            clone[\"x-attribsPrefix\"] = { ...node[\"x-attribsPrefix\"] };\n        }\n        result = clone;\n    }\n    else if (isCDATA(node)) {\n        const children = recursive ? cloneChildren(node.children) : [];\n        const clone = new CDATA(children);\n        for (const child of children) {\n            child.parent = clone;\n        }\n        result = clone;\n    }\n    else if (isDocument(node)) {\n        const children = recursive ? cloneChildren(node.children) : [];\n        const clone = new Document(children);\n        for (const child of children) {\n            child.parent = clone;\n        }\n        if (node[\"x-mode\"]) {\n            clone[\"x-mode\"] = node[\"x-mode\"];\n        }\n        result = clone;\n    }\n    else if (isDirective(node)) {\n        const instruction = new ProcessingInstruction(node.name, node.data);\n        if (node[\"x-name\"] != null) {\n            instruction[\"x-name\"] = node[\"x-name\"];\n            instruction[\"x-publicId\"] = node[\"x-publicId\"];\n            instruction[\"x-systemId\"] = node[\"x-systemId\"];\n        }\n        result = instruction;\n    }\n    else {\n        throw new Error(`Not implemented yet: ${node.type}`);\n    }\n    result.startIndex = node.startIndex;\n    result.endIndex = node.endIndex;\n    if (node.sourceCodeLocation != null) {\n        result.sourceCodeLocation = node.sourceCodeLocation;\n    }\n    return result;\n}\n/**\n * Clone a list of child nodes.\n * @param childs The child nodes to clone.\n * @returns A list of cloned child nodes.\n */\nfunction cloneChildren(childs) {\n    const children = childs.map((child) => cloneNode(child, true));\n    for (let index = 1; index < children.length; index++) {\n        children[index].prev = children[index - 1];\n        children[index - 1].next = children[index];\n    }\n    return children;\n}\n","import { ElementType } from \"domelementtype\";\nimport { CDATA, Comment, Document, Element, ProcessingInstruction, Text, } from \"./node.js\";\nexport * from \"./node.js\";\n// Default options\nconst defaultOptions = {\n    withStartIndices: false,\n    withEndIndices: false,\n    xmlMode: false,\n};\n/**\n * Event-based handler that builds a DOM tree from parser callbacks.\n */\nexport class DomHandler {\n    /** The elements of the DOM */\n    dom = [];\n    /** The root element for the DOM */\n    root = new Document(this.dom);\n    /** Called once parsing has completed. */\n    callback;\n    /** Settings for the handler. */\n    options;\n    /** Callback whenever a tag is closed. */\n    elementCB;\n    /** Indicated whether parsing has been completed. */\n    done = false;\n    /** Stack of open tags. */\n    tagStack = [this.root];\n    /** A data node that is still being written to. */\n    lastNode = null;\n    /** Reference to the parser instance. Used for location information. */\n    parser = null;\n    /**\n     * @param callback Called once parsing has completed.\n     * @param options Settings for the handler.\n     * @param elementCB Callback whenever a tag is closed.\n     */\n    constructor(callback, options, elementCB) {\n        // Make it possible to skip arguments, for backwards-compatibility\n        if (typeof options === \"function\") {\n            elementCB = options;\n            options = defaultOptions;\n        }\n        if (typeof callback === \"object\") {\n            options = callback;\n            callback = undefined;\n        }\n        this.callback = callback ?? null;\n        this.options = options ?? defaultOptions;\n        this.elementCB = elementCB ?? null;\n    }\n    onparserinit(parser) {\n        this.parser = parser;\n    }\n    // Resets the handler back to starting state\n    onreset() {\n        this.dom = [];\n        this.root = new Document(this.dom);\n        this.done = false;\n        this.tagStack = [this.root];\n        this.lastNode = null;\n        this.parser = null;\n    }\n    // Signals the handler that parsing is done\n    onend() {\n        if (this.done)\n            return;\n        this.done = true;\n        this.parser = null;\n        this.handleCallback(null);\n    }\n    onerror(error) {\n        this.handleCallback(error);\n    }\n    onclosetag() {\n        this.lastNode = null;\n        const element = this.tagStack.pop();\n        if (this.options.withEndIndices && this.parser) {\n            element.endIndex = this.parser.endIndex;\n        }\n        if (this.elementCB)\n            this.elementCB(element);\n    }\n    onopentag(name, attribs) {\n        const type = this.options.xmlMode ? ElementType.Tag : undefined;\n        const element = new Element(name, attribs, undefined, type);\n        this.addNode(element);\n        this.tagStack.push(element);\n    }\n    ontext(data) {\n        const { lastNode } = this;\n        if (lastNode && lastNode.type === ElementType.Text) {\n            lastNode.data += data;\n            if (this.options.withEndIndices && this.parser) {\n                lastNode.endIndex = this.parser.endIndex;\n            }\n        }\n        else {\n            const node = new Text(data);\n            this.addNode(node);\n            this.lastNode = node;\n        }\n    }\n    oncomment(data) {\n        if (this.lastNode && this.lastNode.type === ElementType.Comment) {\n            this.lastNode.data += data;\n            return;\n        }\n        const node = new Comment(data);\n        this.addNode(node);\n        this.lastNode = node;\n    }\n    oncommentend() {\n        this.lastNode = null;\n    }\n    oncdatastart() {\n        const text = new Text(\"\");\n        const node = new CDATA([text]);\n        this.addNode(node);\n        text.parent = node;\n        this.lastNode = text;\n    }\n    oncdataend() {\n        this.lastNode = null;\n    }\n    onprocessinginstruction(name, data) {\n        const node = new ProcessingInstruction(name, data);\n        this.addNode(node);\n    }\n    handleCallback(error) {\n        if (typeof this.callback === \"function\") {\n            this.callback(error, this.dom);\n        }\n        else if (error) {\n            throw error;\n        }\n    }\n    addNode(node) {\n        const parent = this.tagStack[this.tagStack.length - 1];\n        const previousSibling = parent.children[parent.children.length - 1];\n        if (this.options.withStartIndices && this.parser) {\n            node.startIndex = this.parser.startIndex;\n        }\n        if (this.options.withEndIndices && this.parser) {\n            node.endIndex = this.parser.endIndex;\n        }\n        parent.children.push(node);\n        if (previousSibling) {\n            node.prev = previousSibling;\n            previousSibling.next = node;\n        }\n        node.parent = parent;\n        this.lastNode = null;\n    }\n}\nexport default DomHandler;\n","import { hasChildren, isTag, } from \"domhandler\";\n/**\n * Search a node and its children for nodes passing a test function. If `node` is not an array, it will be wrapped in one.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param node Node to search. Will be included in the result set if it matches.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes passing `test`.\n */\nexport function filter(test, node, recurse = true, limit = Number.POSITIVE_INFINITY) {\n    return find(test, Array.isArray(node) ? node : [node], recurse, limit);\n}\n/**\n * Search an array of nodes and their children for nodes passing a test function.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes passing `test`.\n */\nexport function find(test, nodes, recurse, limit) {\n    const result = [];\n    /** Stack of the arrays we are looking at. */\n    const nodeStack = [Array.isArray(nodes) ? nodes : [nodes]];\n    /** Stack of the indices within the arrays. */\n    const indexStack = [0];\n    for (;;) {\n        // First, check if the current array has any more elements to look at.\n        if (indexStack[0] >= nodeStack[0].length) {\n            // If we have no more arrays to look at, we are done.\n            if (indexStack.length === 1) {\n                return result;\n            }\n            // Otherwise, remove the current array from the stack.\n            nodeStack.shift();\n            indexStack.shift();\n            // Loop back to the start to continue with the next array.\n            continue;\n        }\n        const element = nodeStack[0][indexStack[0]++];\n        if (test(element)) {\n            result.push(element);\n            if (--limit <= 0)\n                return result;\n        }\n        if (recurse && hasChildren(element) && element.children.length > 0) {\n            /*\n             * Add the children to the stack. We are depth-first, so this is\n             * the next array we look at.\n             */\n            indexStack.unshift(0);\n            nodeStack.unshift(element.children);\n        }\n    }\n}\n/**\n * Finds one element in a tree that passes a test.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param nodes Node or array of nodes to search.\n * @param recurse Also consider child nodes.\n * @returns The first node that passes `test`.\n */\nexport function findOne(test, nodes, recurse = true) {\n    const searchedNodes = Array.isArray(nodes) ? nodes : [nodes];\n    for (const node of searchedNodes) {\n        if (isTag(node) && test(node)) {\n            return node;\n        }\n        if (recurse && hasChildren(node) && node.children.length > 0) {\n            const found = findOne(test, node.children, true);\n            if (found)\n                return found;\n        }\n    }\n    return null;\n}\n/**\n * Checks if a tree of nodes contains at least one node passing a test.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @returns Whether a tree of nodes contains at least one node passing the test.\n */\nexport function existsOne(test, nodes) {\n    return (Array.isArray(nodes) ? nodes : [nodes]).some((node) => (isTag(node) && test(node)) ||\n        (hasChildren(node) && existsOne(test, node.children)));\n}\n/**\n * Search an array of nodes and their children for elements passing a test function.\n *\n * Same as `find`, but limited to elements and with less options, leading to reduced complexity.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @returns All nodes passing `test`.\n */\nexport function findAll(test, nodes) {\n    const result = [];\n    const nodeStack = [Array.isArray(nodes) ? nodes : [nodes]];\n    const indexStack = [0];\n    for (;;) {\n        if (indexStack[0] >= nodeStack[0].length) {\n            if (nodeStack.length === 1) {\n                return result;\n            }\n            // Otherwise, remove the current array from the stack.\n            nodeStack.shift();\n            indexStack.shift();\n            // Loop back to the start to continue with the next array.\n            continue;\n        }\n        const element = nodeStack[0][indexStack[0]++];\n        if (isTag(element) && test(element))\n            result.push(element);\n        if (hasChildren(element) && element.children.length > 0) {\n            indexStack.unshift(0);\n            nodeStack.unshift(element.children);\n        }\n    }\n}\n//# sourceMappingURL=querying.js.map","import { isTag, isText } from \"domhandler\";\nimport { filter, findOne } from \"./querying.js\";\n/**\n * A map of functions to check nodes against.\n */\nconst Checks = {\n    tag_name(name) {\n        if (typeof name === \"function\") {\n            return (element) => isTag(element) && name(element.name);\n        }\n        if (name === \"*\") {\n            return isTag;\n        }\n        return (element) => isTag(element) && element.name === name;\n    },\n    tag_type(type) {\n        if (typeof type === \"function\") {\n            return (element) => type(element.type);\n        }\n        return (element) => element.type === type;\n    },\n    tag_contains(data) {\n        if (typeof data === \"function\") {\n            return (element) => isText(element) && data(element.data);\n        }\n        return (element) => isText(element) && element.data === data;\n    },\n};\n/**\n * Returns a function to check whether a node has an attribute with a particular\n * value.\n *\n * @param attrib Attribute to check.\n * @param value Attribute value to look for.\n * @returns A function to check whether the a node has an attribute with a\n *   particular value.\n */\nfunction getAttribCheck(attrib, value) {\n    if (typeof value === \"function\") {\n        return (element) => isTag(element) && value(element.attribs[attrib]);\n    }\n    return (element) => isTag(element) && element.attribs[attrib] === value;\n}\n/**\n * Returns a function that returns `true` if either of the input functions\n * returns `true` for a node.\n *\n * @param a First function to combine.\n * @param b Second function to combine.\n * @returns A function taking a node and returning `true` if either of the input\n *   functions returns `true` for the node.\n */\nfunction combineFuncs(a, b) {\n    return (element) => a(element) || b(element);\n}\n/**\n * Returns a function that executes all checks in `options` and returns `true`\n * if any of them match a node.\n *\n * @param options An object describing nodes to look for.\n * @returns A function that executes all checks in `options` and returns `true`\n *   if any of them match a node.\n */\nfunction compileTest(options) {\n    const funcs = Object.keys(options).map((key) => {\n        const value = options[key];\n        return Object.hasOwn(Checks, key)\n            ? Checks[key](value)\n            : getAttribCheck(key, value);\n    });\n    return funcs.length === 0 ? null : funcs.reduce(combineFuncs);\n}\n/**\n * Checks whether a node matches the description in `options`.\n *\n * @category Legacy Query Functions\n * @param options An object describing nodes to look for.\n * @param node The element to test.\n * @returns Whether the element matches the description in `options`.\n */\nexport function testElement(options, node) {\n    const test = compileTest(options);\n    return test ? test(node) : true;\n}\n/**\n * Returns all nodes that match `options`.\n *\n * @category Legacy Query Functions\n * @param options An object describing nodes to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes that match `options`.\n */\nexport function getElements(options, nodes, recurse, limit = Number.POSITIVE_INFINITY) {\n    const test = compileTest(options);\n    return test ? filter(test, nodes, recurse, limit) : [];\n}\n/**\n * Returns the node with the supplied ID.\n *\n * @category Legacy Query Functions\n * @param id The unique ID attribute value to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @returns The node with the supplied ID.\n */\nexport function getElementById(id, nodes, recurse = true) {\n    if (!Array.isArray(nodes))\n        nodes = [nodes];\n    return findOne(getAttribCheck(\"id\", id), nodes, recurse);\n}\n/**\n * Returns all nodes with the supplied `tagName`.\n *\n * @category Legacy Query Functions\n * @param tagName Tag name to search for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes with the supplied `tagName`.\n */\nexport function getElementsByTagName(tagName, nodes, recurse = true, limit = Number.POSITIVE_INFINITY) {\n    return filter(Checks[\"tag_name\"](tagName), nodes, recurse, limit);\n}\n/**\n * Returns all nodes with the supplied `className`.\n *\n * @category Legacy Query Functions\n * @param className Class name to search for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes with the supplied `className`.\n */\nexport function getElementsByClassName(className, nodes, recurse = true, limit = Number.POSITIVE_INFINITY) {\n    return filter(getAttribCheck(\"class\", className), nodes, recurse, limit);\n}\n/**\n * Returns all nodes with the supplied `type`.\n *\n * @category Legacy Query Functions\n * @param type Element type to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes with the supplied `type`.\n */\nexport function getElementsByTagType(type, nodes, recurse = true, limit = Number.POSITIVE_INFINITY) {\n    return filter(Checks[\"tag_type\"](type), nodes, recurse, limit);\n}\n//# sourceMappingURL=legacy.js.map","const xmlCodeMap = new Map([\n    [34, \"&quot;\"],\n    [38, \"&amp;\"],\n    [39, \"&apos;\"],\n    [60, \"&lt;\"],\n    [62, \"&gt;\"],\n]);\n// For compatibility with node < 4, we wrap `codePointAt`\n/**\n * Read a code point at a given index.\n * @param input Input string to encode or decode.\n * @param index Current read position in the input string.\n */\nexport const getCodePoint = typeof String.prototype.codePointAt === \"function\"\n    ? (input, index) => input.codePointAt(index)\n    : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n        (c, index) => (c.charCodeAt(index) & 0xfc_00) === 0xd8_00\n            ? (c.charCodeAt(index) - 0xd8_00) * 0x4_00 +\n                c.charCodeAt(index + 1) -\n                0xdc_00 +\n                0x1_00_00\n            : c.charCodeAt(index);\n/**\n * Bitset for ASCII characters that need to be escaped in XML.\n */\nexport const XML_BITSET_VALUE = 0x50_00_00_c4; // 32..63 -> 34 (\"),38 (&),39 ('),60 (<),62 (>)\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using XML entities. Uses a fast bitset scan instead of RegExp.\n *\n * If a character has no equivalent entity, a numeric hexadecimal reference\n * (eg. `&#xfc;`) will be used.\n * @param input Input string to encode or decode.\n */\nexport function encodeXML(input) {\n    let out;\n    let last = 0;\n    const { length } = input;\n    for (let index = 0; index < length; index++) {\n        const char = input.charCodeAt(index);\n        // Check for ASCII chars that don't need escaping\n        if (char < 0x80 &&\n            (((XML_BITSET_VALUE >>> char) & 1) === 0 || char >= 64 || char < 32)) {\n            continue;\n        }\n        if (out === undefined)\n            out = input.substring(0, index);\n        else if (last !== index)\n            out += input.substring(last, index);\n        if (char < 64) {\n            // Known replacement\n            out += xmlCodeMap.get(char);\n            last = index + 1;\n            continue;\n        }\n        // Non-ASCII: encode as numeric entity (handle surrogate pair)\n        const cp = getCodePoint(input, index);\n        out += `&#x${cp.toString(16)};`;\n        if (cp !== char)\n            index++; // Skip trailing surrogate\n        last = index + 1;\n    }\n    if (out === undefined)\n        return input;\n    if (last < length)\n        out += input.substr(last);\n    return out;\n}\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using numeric hexadecimal reference (eg. `&#xfc;`).\n *\n * Have a look at `escapeUTF8` if you want a more concise output at the expense\n * of reduced transportability.\n * @param data String to escape.\n */\nexport const escape = encodeXML;\n/**\n * Creates a function that escapes all characters matched by the given regular\n * expression using the given map of characters to escape to their entities.\n * @param regex Regular expression to match characters to escape.\n * @param map Map of characters to escape to their entities.\n * @returns Function that escapes all characters matched by the given regular\n * expression using the given map of characters to escape to their entities.\n */\nfunction getEscaper(regex, map) {\n    return function escape(data) {\n        let match;\n        let lastIndex = 0;\n        let result = \"\";\n        while ((match = regex.exec(data))) {\n            if (lastIndex !== match.index) {\n                result += data.substring(lastIndex, match.index);\n            }\n            // We know that this character will be in the map.\n            result += map.get(match[0].charCodeAt(0));\n            // Every match will be of length 1\n            lastIndex = match.index + 1;\n        }\n        return result + data.substring(lastIndex);\n    };\n}\n/**\n * Encodes all characters not valid in XML documents using XML entities.\n *\n * Note that the output will be character-set dependent.\n * @param data String to escape.\n */\nexport const escapeUTF8 = /* #__PURE__ */ getEscaper(/[\"&'<>]/g, xmlCodeMap);\n/**\n * Encodes all characters that have to be escaped in HTML attributes,\n * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.\n * @param data String to escape.\n */\nexport const escapeAttribute = \n/* #__PURE__ */ getEscaper(/[\"&\\u00A0]/g, new Map([\n    [34, \"&quot;\"],\n    [38, \"&amp;\"],\n    [160, \"&nbsp;\"],\n]));\n/**\n * Encodes all characters that have to be escaped in HTML text,\n * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.\n * @param data String to escape.\n */\nexport const escapeText = /* #__PURE__ */ getEscaper(/[&<>\\u00A0]/g, new Map([\n    [38, \"&amp;\"],\n    [60, \"&lt;\"],\n    [62, \"&gt;\"],\n    [160, \"&nbsp;\"],\n]));\n//# sourceMappingURL=escape.js.map","/**\n * Mixed-case SVG and MathML element names recognized in foreign content.\n * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n */\nexport const elementNames = new Map(\"altGlyph altGlyphDef altGlyphItem animateColor animateMotion animateTransform clipPath feBlend feColorMatrix feComponentTransfer feComposite feConvolveMatrix feDiffuseLighting feDisplacementMap feDistantLight feDropShadow feFlood feFuncA feFuncB feFuncG feFuncR feGaussianBlur feImage feMerge feMergeNode feMorphology feOffset fePointLight feSpecularLighting feSpotLight feTile feTurbulence foreignObject glyphRef linearGradient radialGradient textPath\"\n    .split(\" \")\n    .map((name) => [name.toLowerCase(), name]));\n/**\n * Mixed-case SVG and MathML attribute names recognized in foreign content.\n * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n */\nexport const attributeNames = new Map(\"definitionURL attributeName attributeType baseFrequency baseProfile calcMode clipPathUnits diffuseConstant edgeMode filterUnits glyphRef gradientTransform gradientUnits kernelMatrix kernelUnitLength keyPoints keySplines keyTimes lengthAdjust limitingConeAngle markerHeight markerUnits markerWidth maskContentUnits maskUnits numOctaves pathLength patternContentUnits patternTransform patternUnits pointsAtX pointsAtY pointsAtZ preserveAlpha preserveAspectRatio primitiveUnits refX refY repeatCount repeatDur requiredExtensions requiredFeatures specularConstant specularExponent spreadMethod startOffset stdDeviation stitchTiles surfaceScale systemLanguage tableValues targetX targetY textLength viewBox viewTarget xChannelSelector yChannelSelector zoomAndPan\"\n    .split(\" \")\n    .map((name) => [name.toLowerCase(), name]));\n//# sourceMappingURL=foreign-names.js.map","import * as ElementType from \"domelementtype\";\nimport { encodeXML, escapeAttribute, escapeText } from \"entities\";\nimport { attributeNames, elementNames } from \"./foreign-names.js\";\n// ── Constants ────────────────────────────────────────────────────────\n/** Elements whose text content is never entity-encoded. */\nconst unencodedElements = new Set(\"style script xmp iframe noembed noframes plaintext noscript\".split(\" \"));\n/** HTML void elements — they cannot have children. */\nconst voidElements = new Set(\"area base basefont br col command embed frame hr img input isindex keygen link meta param source track wbr\".split(\" \"));\n/** Elements that switch the parser into foreign (XML-like) mode. */\nconst foreignElements = new Set([\"svg\", \"math\"]);\n/**\n * Foreign-mode integration points: children of these elements are parsed\n * as HTML again, not as foreign content.\n */\nconst foreignModeIntegrationPoints = new Set(\"mi mo mn ms mtext annotation-xml foreignObject desc title\".split(\" \"));\n// ── Public API ───────────────────────────────────────────────────────\n/**\n * Renders a DOM node or an array of DOM nodes to a string.\n *\n * Can be thought of as the equivalent of the `outerHTML` of the passed\n * node(s).\n * @param node Node to be rendered.\n * @param options Changes serialization behavior\n */\nexport function render(node, options = {}) {\n    const nodes = \"length\" in node ? node : [node];\n    /*\n     * `xmlMode` is threaded as a separate argument through the internal\n     * functions so that foreign-mode transitions (svg/mathml ↔ html) can\n     * adjust it without copying the options object on every element.\n     */\n    const xmlMode = options.xmlMode ?? false;\n    let output = \"\";\n    // eslint-disable-next-line unicorn/no-for-loop\n    for (let index = 0; index < nodes.length; index++) {\n        output += renderNode(nodes[index], options, xmlMode);\n    }\n    return output;\n}\nexport default render;\n// ── Internal rendering ───────────────────────────────────────────────\n/**\n * Render an array of child nodes (skips the single-node wrapping in `render`).\n * @param children The child nodes to render.\n * @param options The serialization options.\n * @param xmlMode The XML mode to use.\n */\nfunction renderChildren(children, options, xmlMode) {\n    let output = \"\";\n    // eslint-disable-next-line unicorn/no-for-loop\n    for (let index = 0; index < children.length; index++) {\n        output += renderNode(children[index], options, xmlMode);\n    }\n    return output;\n}\nfunction renderNode(node, options, xmlMode) {\n    switch (node.type) {\n        case ElementType.Root: {\n            return renderChildren(node.children, options, xmlMode);\n        }\n        case ElementType.Directive: {\n            return `<${node.data}>`;\n        }\n        case ElementType.Comment: {\n            return `<!--${node.data}-->`;\n        }\n        case ElementType.CDATA: {\n            return `<![CDATA[${node.children[0].data}]]>`;\n        }\n        case ElementType.Script:\n        case ElementType.Style:\n        case ElementType.Tag: {\n            return renderTag(node, options, xmlMode);\n        }\n        case ElementType.Text: {\n            const element = node;\n            const data = element.data || \"\";\n            /*\n             * Skip encoding when entities weren't decoded on input, or when\n             * inside a raw-text element (script, style, etc.) in HTML mode.\n             */\n            if ((options.encodeEntities ?? options.decodeEntities) !== false &&\n                !(!xmlMode &&\n                    element.parent &&\n                    unencodedElements.has(element.parent.name))) {\n                // `xmlMode: \"foreign\"` is truthy\n                return xmlMode || options.encodeEntities !== \"utf8\"\n                    ? encodeXML(data)\n                    : escapeText(data);\n            }\n            return data;\n        }\n    }\n}\nfunction renderTag(element, options, xmlMode) {\n    if (xmlMode === \"foreign\") {\n        // Correct lowercase element names back to their canonical mixed-case form\n        element.name = elementNames.get(element.name) ?? element.name;\n        // Integration points exit foreign mode: their children are HTML\n        if (element.parent &&\n            foreignModeIntegrationPoints.has(element.parent.name)) {\n            xmlMode = false;\n        }\n    }\n    if (!xmlMode && foreignElements.has(element.name)) {\n        xmlMode = \"foreign\";\n    }\n    const { name, children } = element;\n    // Cache the void-element check — used for both self-closing and closing-tag logic\n    const isVoid = !xmlMode && voidElements.has(name);\n    let tag = `<${name}${formatAttributes(element.attribs, options, xmlMode)}`;\n    if (children.length === 0 &&\n        (xmlMode\n            ? options.selfClosingTags !== false\n            : options.selfClosingTags && isVoid)) {\n        // XML: `<br/>`, HTML: `<br />`\n        tag += xmlMode ? \"/>\" : \" />\";\n    }\n    else {\n        tag += \">\";\n        if (children.length > 0) {\n            tag += renderChildren(children, options, xmlMode);\n        }\n        if (!isVoid) {\n            tag += `</${name}>`;\n        }\n    }\n    return tag;\n}\n// ── Attribute formatting ─────────────────────────────────────────────\nfunction replaceQuotes(value) {\n    return value.replaceAll('\"', \"&quot;\");\n}\n/**\n * Serialize an element's attribute map to a string.\n *\n * Returns a string with a leading space before each attribute, or an\n * empty string if there are no attributes. This convention lets the\n * caller unconditionally concatenate the result onto the tag name.\n * @param attributes\n * @param options\n * @param xmlMode\n */\nfunction formatAttributes(attributes, options, xmlMode) {\n    if (!attributes)\n        return \"\";\n    /*\n     * Pick the right encoder:\n     *  - Encoding disabled → only escape double-quotes (for valid attributes)\n     *  - XML / non-utf8    → full numeric entity encoding (encodeXML)\n     *  - HTML + utf8       → minimal escaping (escapeAttribute)\n     */\n    const encode = (options.encodeEntities ?? options.decodeEntities) === false\n        ? replaceQuotes\n        : xmlMode || options.encodeEntities !== \"utf8\"\n            ? encodeXML\n            : escapeAttribute;\n    const isForeign = xmlMode === \"foreign\";\n    const showEmpty = !!(options.emptyAttrs ?? xmlMode);\n    let result = \"\";\n    for (const key in attributes) {\n        if (!Object.hasOwn(attributes, key))\n            continue;\n        const value = attributes[key];\n        const k = isForeign ? (attributeNames.get(key) ?? key) : key;\n        result +=\n            !showEmpty && (value == null || value === \"\")\n                ? ` ${k}`\n                : ` ${k}=\"${encode(value == null ? \"\" : String(value))}\"`;\n    }\n    return result;\n}\n//# sourceMappingURL=index.js.map","import renderHTML from \"dom-serializer\";\nimport { ElementType } from \"domelementtype\";\nimport { hasChildren, isCDATA, isComment, isTag, isText, } from \"domhandler\";\n/**\n * @category Stringify\n * @deprecated Use the `dom-serializer` module directly.\n * @param node Node to get the outer HTML of.\n * @param options Options for serialization.\n * @returns `node`'s outer HTML.\n */\nexport function getOuterHTML(node, options) {\n    return renderHTML(node, options);\n}\n/**\n * @category Stringify\n * @deprecated Use the `dom-serializer` module directly.\n * @param node Node to get the inner HTML of.\n * @param options Options for serialization.\n * @returns `node`'s inner HTML.\n */\nexport function getInnerHTML(node, options) {\n    return hasChildren(node)\n        ? node.children.map((node) => getOuterHTML(node, options)).join(\"\")\n        : \"\";\n}\n/**\n * Get a node's inner text. Same as `textContent`, but inserts newlines for `<br>` tags. Ignores comments.\n *\n * @category Stringify\n * @deprecated Use `textContent` instead.\n * @param node Node to get the inner text of.\n * @returns `node`'s inner text.\n */\nexport function getText(node) {\n    if (Array.isArray(node))\n        return node.map(getText).join(\"\");\n    if (isTag(node))\n        return node.name === \"br\" ? \"\\n\" : getText(node.children);\n    if (isCDATA(node))\n        return getText(node.children);\n    if (isText(node))\n        return node.data;\n    return \"\";\n}\n/**\n * Get a node's text content. Ignores comments.\n *\n * @category Stringify\n * @param node Node to get the text content of.\n * @returns `node`'s text content.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent}\n */\nexport function textContent(node) {\n    if (Array.isArray(node))\n        return node.map(textContent).join(\"\");\n    if (hasChildren(node) && !isComment(node)) {\n        return textContent(node.children);\n    }\n    if (isText(node))\n        return node.data;\n    return \"\";\n}\n/**\n * Get a node's inner text, ignoring `<script>` and `<style>` tags. Ignores comments.\n *\n * @category Stringify\n * @param node Node to get the inner text of.\n * @returns `node`'s inner text.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/innerText}\n */\nexport function innerText(node) {\n    if (Array.isArray(node))\n        return node.map(innerText).join(\"\");\n    if (hasChildren(node) && (node.type === ElementType.Tag || isCDATA(node))) {\n        return innerText(node.children);\n    }\n    if (isText(node))\n        return node.data;\n    return \"\";\n}\n//# sourceMappingURL=stringify.js.map","import { getElementsByTagName } from \"./legacy.js\";\nimport { textContent } from \"./stringify.js\";\n/**\n * Get the feed object from the root of a DOM tree.\n *\n * @category Feeds\n * @param document The DOM to extract the feed from.\n * @returns The feed.\n */\nexport function getFeed(document) {\n    const feedRoot = getOneElement(isValidFeed, document);\n    return feedRoot\n        ? feedRoot.name === \"feed\"\n            ? getAtomFeed(feedRoot)\n            : getRssFeed(feedRoot)\n        : null;\n}\n/**\n * Parse an Atom feed.\n *\n * @param feedRoot The root of the feed.\n * @returns The parsed feed.\n */\nfunction getAtomFeed(feedRoot) {\n    const childs = feedRoot.children;\n    const feed = {\n        type: \"atom\",\n        items: getElementsByTagName(\"entry\", childs).map((item) => {\n            const { children } = item;\n            const entry = { media: getMediaElements(children) };\n            addConditionally(entry, \"id\", \"id\", children);\n            addConditionally(entry, \"title\", \"title\", children);\n            const href = getOneElement(\"link\", children)?.attribs[\"href\"];\n            if (href) {\n                entry.link = href;\n            }\n            const description = fetch(\"summary\", children) || fetch(\"content\", children);\n            if (description) {\n                entry.description = description;\n            }\n            const pubDate = fetch(\"updated\", children);\n            if (pubDate) {\n                entry.pubDate = new Date(pubDate);\n            }\n            return entry;\n        }),\n    };\n    addConditionally(feed, \"id\", \"id\", childs);\n    addConditionally(feed, \"title\", \"title\", childs);\n    const href = getOneElement(\"link\", childs)?.attribs[\"href\"];\n    if (href) {\n        feed.link = href;\n    }\n    addConditionally(feed, \"description\", \"subtitle\", childs);\n    const updated = fetch(\"updated\", childs);\n    if (updated) {\n        feed.updated = new Date(updated);\n    }\n    addConditionally(feed, \"author\", \"email\", childs, true);\n    return feed;\n}\n/**\n * Parse a RSS feed.\n *\n * @param feedRoot The root of the feed.\n * @returns The parsed feed.\n */\nfunction getRssFeed(feedRoot) {\n    const childs = getOneElement(\"channel\", feedRoot.children)?.children ?? [];\n    const feed = {\n        type: feedRoot.name.substr(0, 3),\n        id: \"\",\n        items: getElementsByTagName(\"item\", feedRoot.children).map((item) => {\n            const { children } = item;\n            const entry = { media: getMediaElements(children) };\n            addConditionally(entry, \"id\", \"guid\", children);\n            addConditionally(entry, \"title\", \"title\", children);\n            addConditionally(entry, \"link\", \"link\", children);\n            addConditionally(entry, \"description\", \"description\", children);\n            const pubDate = fetch(\"pubDate\", children) || fetch(\"dc:date\", children);\n            if (pubDate)\n                entry.pubDate = new Date(pubDate);\n            return entry;\n        }),\n    };\n    addConditionally(feed, \"title\", \"title\", childs);\n    addConditionally(feed, \"link\", \"link\", childs);\n    addConditionally(feed, \"description\", \"description\", childs);\n    const updated = fetch(\"lastBuildDate\", childs);\n    if (updated) {\n        feed.updated = new Date(updated);\n    }\n    addConditionally(feed, \"author\", \"managingEditor\", childs, true);\n    return feed;\n}\nconst MEDIA_KEYS_STRING = [\"url\", \"type\", \"lang\"];\nconst MEDIA_KEYS_INT = [\n    \"fileSize\",\n    \"bitrate\",\n    \"framerate\",\n    \"samplingrate\",\n    \"channels\",\n    \"duration\",\n    \"height\",\n    \"width\",\n];\n/**\n * Get all media elements of a feed item.\n *\n * @param where Nodes to search in.\n * @returns Media elements.\n */\nfunction getMediaElements(where) {\n    return getElementsByTagName(\"media:content\", where).map((element) => {\n        const { attribs } = element;\n        const media = {\n            medium: attribs[\"medium\"],\n            isDefault: !!attribs[\"isDefault\"],\n        };\n        for (const attrib of MEDIA_KEYS_STRING) {\n            if (attribs[attrib]) {\n                media[attrib] = attribs[attrib];\n            }\n        }\n        for (const attrib of MEDIA_KEYS_INT) {\n            if (attribs[attrib]) {\n                media[attrib] = Number.parseInt(attribs[attrib], 10);\n            }\n        }\n        if (attribs[\"expression\"]) {\n            media.expression = attribs[\"expression\"];\n        }\n        return media;\n    });\n}\n/**\n * Get one element by tag name.\n *\n * @param tagName Tag name to look for\n * @param node Node to search in\n * @returns The element or null\n */\nfunction getOneElement(tagName, node) {\n    return getElementsByTagName(tagName, node, true, 1)[0];\n}\n/**\n * Get the text content of an element with a certain tag name.\n *\n * @param tagName Tag name to look for.\n * @param where Node to search in.\n * @param recurse Whether to recurse into child nodes.\n * @returns The text content of the element.\n */\nfunction fetch(tagName, where, recurse = false) {\n    return textContent(getElementsByTagName(tagName, where, recurse, 1)).trim();\n}\n/**\n * Adds a property to an object if it has a value.\n *\n * @param object Object to be extended.\n * @param property Property name.\n * @param tagName Tag name that contains the conditionally added property.\n * @param where Element to search for the property.\n * @param recurse Whether to recurse into child nodes.\n */\nfunction addConditionally(object, property, tagName, where, recurse = false) {\n    const value = fetch(tagName, where, recurse);\n    if (value)\n        object[property] = value;\n}\n/**\n * Checks if an element is a feed root node.\n *\n * @param value The name of the element to check.\n * @returns Whether an element is a feed root node.\n */\nfunction isValidFeed(value) {\n    return value === \"rss\" || value === \"feed\" || value === \"rdf:RDF\";\n}\n//# sourceMappingURL=feeds.js.map","import { hasChildren } from \"domhandler\";\n/**\n * Given an array of nodes, remove any member that is contained by another\n * member.\n *\n * @category Helpers\n * @param nodes Nodes to filter.\n * @returns Remaining nodes that aren't contained by other nodes.\n */\nexport function removeSubsets(nodes) {\n    let index = nodes.length;\n    /*\n     * Check if each node (or one of its ancestors) is already contained in the\n     * array.\n     */\n    while (--index >= 0) {\n        const node = nodes[index];\n        /*\n         * Remove the node if it is not unique.\n         * We are going through the array from the end, so we only\n         * have to check nodes that preceed the node under consideration in the array.\n         */\n        if (index > 0 && nodes.lastIndexOf(node, index - 1) >= 0) {\n            nodes.splice(index, 1);\n            continue;\n        }\n        for (let ancestor = node.parent; ancestor; ancestor = ancestor.parent) {\n            if (nodes.includes(ancestor)) {\n                nodes.splice(index, 1);\n                break;\n            }\n        }\n    }\n    return nodes;\n}\n/**\n * @category Helpers\n * @see {@link http://dom.spec.whatwg.org/#dom-node-comparedocumentposition}\n */\nexport var DocumentPosition;\n(function (DocumentPosition) {\n    DocumentPosition[DocumentPosition[\"DISCONNECTED\"] = 1] = \"DISCONNECTED\";\n    DocumentPosition[DocumentPosition[\"PRECEDING\"] = 2] = \"PRECEDING\";\n    DocumentPosition[DocumentPosition[\"FOLLOWING\"] = 4] = \"FOLLOWING\";\n    DocumentPosition[DocumentPosition[\"CONTAINS\"] = 8] = \"CONTAINS\";\n    DocumentPosition[DocumentPosition[\"CONTAINED_BY\"] = 16] = \"CONTAINED_BY\";\n})(DocumentPosition || (DocumentPosition = {}));\n/**\n * Compare the position of one node against another node in any other document,\n * returning a bitmask with the values from {@link DocumentPosition}.\n *\n * Document order:\n * > There is an ordering, document order, defined on all the nodes in the\n * > document corresponding to the order in which the first character of the\n * > XML representation of each node occurs in the XML representation of the\n * > document after expansion of general entities. Thus, the document element\n * > node will be the first node. Element nodes occur before their children.\n * > Thus, document order orders element nodes in order of the occurrence of\n * > their start-tag in the XML (after expansion of entities). The attribute\n * > nodes of an element occur after the element and before its children. The\n * > relative order of attribute nodes is implementation-dependent.\n *\n * Source:\n * http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order\n *\n * @category Helpers\n * @param nodeA The first node to use in the comparison\n * @param nodeB The second node to use in the comparison\n * @returns A bitmask describing the input nodes' relative position.\n *\n * See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for\n * a description of these values.\n */\nexport function compareDocumentPosition(nodeA, nodeB) {\n    const aParents = [];\n    const bParents = [];\n    if (nodeA === nodeB) {\n        return 0;\n    }\n    let current = hasChildren(nodeA) ? nodeA : nodeA.parent;\n    while (current) {\n        aParents.unshift(current);\n        current = current.parent;\n    }\n    current = hasChildren(nodeB) ? nodeB : nodeB.parent;\n    while (current) {\n        bParents.unshift(current);\n        current = current.parent;\n    }\n    const maxIndex = Math.min(aParents.length, bParents.length);\n    let index = 0;\n    while (index < maxIndex && aParents[index] === bParents[index]) {\n        index++;\n    }\n    if (index === 0) {\n        return DocumentPosition.DISCONNECTED;\n    }\n    const sharedParent = aParents[index - 1];\n    const siblings = sharedParent.children;\n    const aSibling = aParents[index];\n    const bSibling = bParents[index];\n    if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {\n        if (sharedParent === nodeB) {\n            return DocumentPosition.FOLLOWING | DocumentPosition.CONTAINED_BY;\n        }\n        return DocumentPosition.FOLLOWING;\n    }\n    if (sharedParent === nodeA) {\n        return DocumentPosition.PRECEDING | DocumentPosition.CONTAINS;\n    }\n    return DocumentPosition.PRECEDING;\n}\n/**\n * Sort an array of nodes based on their relative position in the document,\n * removing any duplicate nodes. If the array contains nodes that do not belong\n * to the same document, sort order is unspecified.\n *\n * @category Helpers\n * @param nodes Array of DOM nodes.\n * @returns Collection of unique nodes, sorted in document order.\n */\nexport function uniqueSort(nodes) {\n    nodes = nodes.filter((node, index, array) => !array.includes(node, index + 1));\n    nodes.sort((a, b) => {\n        const relative = compareDocumentPosition(a, b);\n        if (relative & DocumentPosition.PRECEDING) {\n            return -1;\n        }\n        if (relative & DocumentPosition.FOLLOWING) {\n            return 1;\n        }\n        return 0;\n    });\n    return nodes;\n}\n//# sourceMappingURL=helpers.js.map","/**\n * Remove an element from the dom\n *\n * @category Manipulation\n * @param element The element to be removed.\n */\nexport function removeElement(element) {\n    if (element.prev)\n        element.prev.next = element.next;\n    if (element.next)\n        element.next.prev = element.prev;\n    if (element.parent) {\n        const childs = element.parent.children;\n        const childsIndex = childs.lastIndexOf(element);\n        if (childsIndex !== -1) {\n            childs.splice(childsIndex, 1);\n        }\n    }\n    element.next = null;\n    element.prev = null;\n    element.parent = null;\n}\n/**\n * Replace an element in the dom\n *\n * @category Manipulation\n * @param element The element to be replaced.\n * @param replacement The element to be added\n */\nexport function replaceElement(element, replacement) {\n    replacement.prev = element.prev;\n    if (replacement.prev) {\n        replacement.prev.next = replacement;\n    }\n    replacement.next = element.next;\n    if (replacement.next) {\n        replacement.next.prev = replacement;\n    }\n    replacement.parent = element.parent;\n    if (replacement.parent) {\n        const { children } = replacement.parent;\n        const elementIndex = children.lastIndexOf(element);\n        if (elementIndex === -1) {\n            return;\n        }\n        children[elementIndex] = replacement;\n        element.parent = null;\n    }\n}\n/**\n * Append a child to an element.\n *\n * @category Manipulation\n * @param parent The element to append to.\n * @param child The element to be added as a child.\n */\nexport function appendChild(parent, child) {\n    removeElement(child);\n    child.next = null;\n    child.parent = parent;\n    if (parent.children.push(child) > 1) {\n        const sibling = parent.children[parent.children.length - 2];\n        sibling.next = child;\n        child.prev = sibling;\n    }\n    else {\n        child.prev = null;\n    }\n}\n/**\n * Append an element after another.\n *\n * @category Manipulation\n * @param element The element to append after.\n * @param next The element be added.\n */\nexport function append(element, next) {\n    removeElement(next);\n    const { parent } = element;\n    const currentNext = element.next;\n    next.next = currentNext;\n    next.prev = element;\n    element.next = next;\n    next.parent = parent;\n    if (currentNext) {\n        currentNext.prev = next;\n        if (parent) {\n            const childs = parent.children;\n            childs.splice(childs.lastIndexOf(currentNext), 0, next);\n        }\n    }\n    else if (parent) {\n        parent.children.push(next);\n    }\n}\n/**\n * Prepend a child to an element.\n *\n * @category Manipulation\n * @param parent The element to prepend before.\n * @param child The element to be added as a child.\n */\nexport function prependChild(parent, child) {\n    removeElement(child);\n    child.parent = parent;\n    child.prev = null;\n    if (parent.children.unshift(child) === 1) {\n        child.next = null;\n    }\n    else {\n        const sibling = parent.children[1];\n        sibling.prev = child;\n        child.next = sibling;\n    }\n}\n/**\n * Prepend an element before another.\n *\n * @category Manipulation\n * @param element The element to prepend before.\n * @param previous The element to be added.\n */\nexport function prepend(element, previous) {\n    removeElement(previous);\n    const { parent } = element;\n    if (parent) {\n        const childs = parent.children;\n        childs.splice(childs.indexOf(element), 0, previous);\n    }\n    if (element.prev) {\n        element.prev.next = previous;\n    }\n    previous.parent = parent;\n    previous.prev = element.prev;\n    previous.next = element;\n    element.prev = previous;\n}\n//# sourceMappingURL=manipulation.js.map","import { hasChildren, isTag, } from \"domhandler\";\n/**\n * Get a node's children.\n *\n * @category Traversal\n * @param element Node to get the children of.\n * @returns `element`'s children, or an empty array.\n */\nexport function getChildren(element) {\n    return hasChildren(element) ? element.children : [];\n}\nexport function getParent(element) {\n    return element.parent || null;\n}\n/**\n * Gets an elements siblings, including the element itself.\n *\n * Attempts to get the children through the element's parent first. If we don't\n * have a parent (the element is a root node), we walk the element's `prev` &\n * `next` to get all remaining nodes.\n *\n * @category Traversal\n * @param element Element to get the siblings of.\n * @returns `element`'s siblings, including `element`.\n */\nexport function getSiblings(element) {\n    const parent = getParent(element);\n    if (parent != null)\n        return getChildren(parent);\n    const siblings = [element];\n    let { prev, next } = element;\n    while (prev != null) {\n        siblings.unshift(prev);\n        ({ prev } = prev);\n    }\n    while (next != null) {\n        siblings.push(next);\n        ({ next } = next);\n    }\n    return siblings;\n}\n/**\n * Gets an attribute from an element.\n *\n * @category Traversal\n * @param element Element to check.\n * @param name Attribute name to retrieve.\n * @returns The element's attribute value, or `undefined`.\n */\nexport function getAttributeValue(element, name) {\n    const { attribs } = element;\n    return attribs?.[name];\n}\n/**\n * Checks whether an element has an attribute.\n *\n * @category Traversal\n * @param element Element to check.\n * @param name Attribute name to look for.\n * @returns Returns whether `element` has the attribute `name`.\n */\nexport function hasAttrib(element, name) {\n    const { attribs } = element;\n    return (attribs != null && Object.hasOwn(attribs, name) && attribs[name] != null);\n}\n/**\n * Get the tag name of an element.\n *\n * @category Traversal\n * @param element The element to get the name for.\n * @returns The tag name of `element`.\n */\nexport function getName(element) {\n    return element.name;\n}\n/**\n * Returns the next element sibling of a node.\n *\n * @category Traversal\n * @param element The element to get the next sibling of.\n * @returns `element`'s next sibling that is a tag, or `null` if there is no next\n * sibling.\n */\nexport function nextElementSibling(element) {\n    let { next } = element;\n    while (next !== null && !isTag(next))\n        ({ next } = next);\n    return next;\n}\n/**\n * Returns the previous element sibling of a node.\n *\n * @category Traversal\n * @param element The element to get the previous sibling of.\n * @returns `element`'s previous sibling that is a tag, or `null` if there is no\n * previous sibling.\n */\n// eslint-disable-next-line unicorn/prevent-abbreviations -- Keep public API name for backwards compatibility.\nexport function prevElementSibling(element) {\n    let { prev } = element;\n    while (prev !== null && !isTag(prev))\n        ({ prev } = prev);\n    return prev;\n}\n//# sourceMappingURL=traversal.js.map","import { Parser } from \"./Parser.js\";\nexport { Parser } from \"./Parser.js\";\nimport { DomHandler, } from \"domhandler\";\nexport { DomHandler, \n// Old name for DomHandler\nDomHandler as DefaultHandler, } from \"domhandler\";\n// Helper methods\n/**\n * Parses the data, returns the resulting document.\n * @param data The data that should be parsed.\n * @param options Optional options for the parser and DOM handler.\n */\nexport function parseDocument(data, options) {\n    const handler = new DomHandler(undefined, options);\n    new Parser(handler, options).end(data);\n    return handler.root;\n}\n/**\n * Creates a parser instance, with an attached DOM handler.\n * @param callback A callback that will be called once parsing has been completed, with the resulting document.\n * @param options Optional options for the parser and DOM handler.\n * @param elementCallback An optional callback that will be called every time a tag has been completed inside of the DOM.\n */\nexport function createDocumentStream(callback, options, elementCallback) {\n    const handler = new DomHandler((error) => callback(error, handler.root), options, elementCallback);\n    return new Parser(handler, options);\n}\n/*\n * All of the following exports exist for backwards-compatibility.\n * They should probably be removed eventually.\n */\nexport * as ElementType from \"domelementtype\";\nexport { default as Tokenizer, QuoteType, } from \"./Tokenizer.js\";\nimport { getFeed } from \"domutils\";\nexport { getFeed } from \"domutils\";\nconst parseFeedDefaultOptions = { xmlMode: true };\n/**\n * Parse a feed.\n * @param feed The feed that should be parsed, as a string.\n * @param options Optionally, options for parsing. When using this, you should set `xmlMode` to `true`.\n */\nexport function parseFeed(feed, options = parseFeedDefaultOptions) {\n    return getFeed(parseDocument(feed, options).children);\n}\nexport * as DomUtils from \"domutils\";\n//# sourceMappingURL=index.js.map","'use strict';\n\nmodule.exports = string => {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\t// Escape characters with special meaning either inside or outside character sets.\n\t// Use a simple backslash escape when it’s always valid, and a \\unnnn escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar.\n\treturn string\n\t\t.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n\t\t.replace(/-/g, '\\\\x2d');\n};\n","'use strict';\n\n/*!\n * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o) {\n  return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nfunction isPlainObject(o) {\n  var ctor,prot;\n\n  if (isObject(o) === false) return false;\n\n  // If has modified constructor\n  ctor = o.constructor;\n  if (ctor === undefined) return true;\n\n  // If has modified prototype\n  prot = ctor.prototype;\n  if (isObject(prot) === false) return false;\n\n  // If constructor does not have an Object-specific method\n  if (prot.hasOwnProperty('isPrototypeOf') === false) {\n    return false;\n  }\n\n  // Most likely a plain Object\n  return true;\n}\n\nexports.isPlainObject = isPlainObject;\n","/**\n * Srcset Parser\n *\n * By Alex Bell |  MIT License\n *\n * JS Parser for the string value that appears in markup <img srcset=\"here\">\n *\n * @returns Array [{url: _, d: _, w: _, h:_}, ...]\n *\n * Based super duper closely on the reference algorithm at:\n * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute\n *\n * Most comments are copied in directly from the spec\n * (except for comments in parens).\n */\n\n(function (root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([], factory);\n\t} else if (typeof module === 'object' && module.exports) {\n\t\t// Node. Does not work with strict CommonJS, but\n\t\t// only CommonJS-like environments that support module.exports,\n\t\t// like Node.\n\t\tmodule.exports = factory();\n\t} else {\n\t\t// Browser globals (root is window)\n\t\troot.parseSrcset = factory();\n\t}\n}(this, function () {\n\n\t// 1. Let input be the value passed to this algorithm.\n\treturn function (input) {\n\n\t\t// UTILITY FUNCTIONS\n\n\t\t// Manual is faster than RegEx\n\t\t// http://bjorn.tipling.com/state-and-regular-expressions-in-javascript\n\t\t// http://jsperf.com/whitespace-character/5\n\t\tfunction isSpace(c) {\n\t\t\treturn (c === \"\\u0020\" || // space\n\t\t\tc === \"\\u0009\" || // horizontal tab\n\t\t\tc === \"\\u000A\" || // new line\n\t\t\tc === \"\\u000C\" || // form feed\n\t\t\tc === \"\\u000D\");  // carriage return\n\t\t}\n\n\t\tfunction collectCharacters(regEx) {\n\t\t\tvar chars,\n\t\t\t\tmatch = regEx.exec(input.substring(pos));\n\t\t\tif (match) {\n\t\t\t\tchars = match[ 0 ];\n\t\t\t\tpos += chars.length;\n\t\t\t\treturn chars;\n\t\t\t}\n\t\t}\n\n\t\tvar inputLength = input.length,\n\n\t\t\t// (Don't use \\s, to avoid matching non-breaking space)\n\t\t\tregexLeadingSpaces = /^[ \\t\\n\\r\\u000c]+/,\n\t\t\tregexLeadingCommasOrSpaces = /^[, \\t\\n\\r\\u000c]+/,\n\t\t\tregexLeadingNotSpaces = /^[^ \\t\\n\\r\\u000c]+/,\n\t\t\tregexTrailingCommas = /[,]+$/,\n\t\t\tregexNonNegativeInteger = /^\\d+$/,\n\n\t\t\t// ( Positive or negative or unsigned integers or decimals, without or without exponents.\n\t\t\t// Must include at least one digit.\n\t\t\t// According to spec tests any decimal point must be followed by a digit.\n\t\t\t// No leading plus sign is allowed.)\n\t\t\t// https://html.spec.whatwg.org/multipage/infrastructure.html#valid-floating-point-number\n\t\t\tregexFloatingPoint = /^-?(?:[0-9]+|[0-9]*\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/,\n\n\t\t\turl,\n\t\t\tdescriptors,\n\t\t\tcurrentDescriptor,\n\t\t\tstate,\n\t\t\tc,\n\n\t\t\t// 2. Let position be a pointer into input, initially pointing at the start\n\t\t\t//    of the string.\n\t\t\tpos = 0,\n\n\t\t\t// 3. Let candidates be an initially empty source set.\n\t\t\tcandidates = [];\n\n\t\t// 4. Splitting loop: Collect a sequence of characters that are space\n\t\t//    characters or U+002C COMMA characters. If any U+002C COMMA characters\n\t\t//    were collected, that is a parse error.\n\t\twhile (true) {\n\t\t\tcollectCharacters(regexLeadingCommasOrSpaces);\n\n\t\t\t// 5. If position is past the end of input, return candidates and abort these steps.\n\t\t\tif (pos >= inputLength) {\n\t\t\t\treturn candidates; // (we're done, this is the sole return path)\n\t\t\t}\n\n\t\t\t// 6. Collect a sequence of characters that are not space characters,\n\t\t\t//    and let that be url.\n\t\t\turl = collectCharacters(regexLeadingNotSpaces);\n\n\t\t\t// 7. Let descriptors be a new empty list.\n\t\t\tdescriptors = [];\n\n\t\t\t// 8. If url ends with a U+002C COMMA character (,), follow these substeps:\n\t\t\t//\t\t(1). Remove all trailing U+002C COMMA characters from url. If this removed\n\t\t\t//         more than one character, that is a parse error.\n\t\t\tif (url.slice(-1) === \",\") {\n\t\t\t\turl = url.replace(regexTrailingCommas, \"\");\n\t\t\t\t// (Jump ahead to step 9 to skip tokenization and just push the candidate).\n\t\t\t\tparseDescriptors();\n\n\t\t\t\t//\tOtherwise, follow these substeps:\n\t\t\t} else {\n\t\t\t\ttokenize();\n\t\t\t} // (close else of step 8)\n\n\t\t\t// 16. Return to the step labeled splitting loop.\n\t\t} // (Close of big while loop.)\n\n\t\t/**\n\t\t * Tokenizes descriptor properties prior to parsing\n\t\t * Returns undefined.\n\t\t */\n\t\tfunction tokenize() {\n\n\t\t\t// 8.1. Descriptor tokeniser: Skip whitespace\n\t\t\tcollectCharacters(regexLeadingSpaces);\n\n\t\t\t// 8.2. Let current descriptor be the empty string.\n\t\t\tcurrentDescriptor = \"\";\n\n\t\t\t// 8.3. Let state be in descriptor.\n\t\t\tstate = \"in descriptor\";\n\n\t\t\twhile (true) {\n\n\t\t\t\t// 8.4. Let c be the character at position.\n\t\t\t\tc = input.charAt(pos);\n\n\t\t\t\t//  Do the following depending on the value of state.\n\t\t\t\t//  For the purpose of this step, \"EOF\" is a special character representing\n\t\t\t\t//  that position is past the end of input.\n\n\t\t\t\t// In descriptor\n\t\t\t\tif (state === \"in descriptor\") {\n\t\t\t\t\t// Do the following, depending on the value of c:\n\n\t\t\t\t\t// Space character\n\t\t\t\t\t// If current descriptor is not empty, append current descriptor to\n\t\t\t\t\t// descriptors and let current descriptor be the empty string.\n\t\t\t\t\t// Set state to after descriptor.\n\t\t\t\t\tif (isSpace(c)) {\n\t\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\t\tcurrentDescriptor = \"\";\n\t\t\t\t\t\t\tstate = \"after descriptor\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// U+002C COMMA (,)\n\t\t\t\t\t\t// Advance position to the next character in input. If current descriptor\n\t\t\t\t\t\t// is not empty, append current descriptor to descriptors. Jump to the step\n\t\t\t\t\t\t// labeled descriptor parser.\n\t\t\t\t\t} else if (c === \",\") {\n\t\t\t\t\t\tpos += 1;\n\t\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// U+0028 LEFT PARENTHESIS (()\n\t\t\t\t\t\t// Append c to current descriptor. Set state to in parens.\n\t\t\t\t\t} else if (c === \"\\u0028\") {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t\tstate = \"in parens\";\n\n\t\t\t\t\t\t// EOF\n\t\t\t\t\t\t// If current descriptor is not empty, append current descriptor to\n\t\t\t\t\t\t// descriptors. Jump to the step labeled descriptor parser.\n\t\t\t\t\t} else if (c === \"\") {\n\t\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Anything else\n\t\t\t\t\t\t// Append c to current descriptor.\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t}\n\t\t\t\t\t// (end \"in descriptor\"\n\n\t\t\t\t\t// In parens\n\t\t\t\t} else if (state === \"in parens\") {\n\n\t\t\t\t\t// U+0029 RIGHT PARENTHESIS ())\n\t\t\t\t\t// Append c to current descriptor. Set state to in descriptor.\n\t\t\t\t\tif (c === \")\") {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t\tstate = \"in descriptor\";\n\n\t\t\t\t\t\t// EOF\n\t\t\t\t\t\t// Append current descriptor to descriptors. Jump to the step labeled\n\t\t\t\t\t\t// descriptor parser.\n\t\t\t\t\t} else if (c === \"\") {\n\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Anything else\n\t\t\t\t\t\t// Append c to current descriptor.\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t}\n\n\t\t\t\t\t// After descriptor\n\t\t\t\t} else if (state === \"after descriptor\") {\n\n\t\t\t\t\t// Do the following, depending on the value of c:\n\t\t\t\t\t// Space character: Stay in this state.\n\t\t\t\t\tif (isSpace(c)) {\n\n\t\t\t\t\t\t// EOF: Jump to the step labeled descriptor parser.\n\t\t\t\t\t} else if (c === \"\") {\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Anything else\n\t\t\t\t\t\t// Set state to in descriptor. Set position to the previous character in input.\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstate = \"in descriptor\";\n\t\t\t\t\t\tpos -= 1;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Advance position to the next character in input.\n\t\t\t\tpos += 1;\n\n\t\t\t\t// Repeat this step.\n\t\t\t} // (close while true loop)\n\t\t}\n\n\t\t/**\n\t\t * Adds descriptor properties to a candidate, pushes to the candidates array\n\t\t * @return undefined\n\t\t */\n\t\t// Declared outside of the while loop so that it's only created once.\n\t\tfunction parseDescriptors() {\n\n\t\t\t// 9. Descriptor parser: Let error be no.\n\t\t\tvar pError = false,\n\n\t\t\t\t// 10. Let width be absent.\n\t\t\t\t// 11. Let density be absent.\n\t\t\t\t// 12. Let future-compat-h be absent. (We're implementing it now as h)\n\t\t\t\tw, d, h, i,\n\t\t\t\tcandidate = {},\n\t\t\t\tdesc, lastChar, value, intVal, floatVal;\n\n\t\t\t// 13. For each descriptor in descriptors, run the appropriate set of steps\n\t\t\t// from the following list:\n\t\t\tfor (i = 0 ; i < descriptors.length; i++) {\n\t\t\t\tdesc = descriptors[ i ];\n\n\t\t\t\tlastChar = desc[ desc.length - 1 ];\n\t\t\t\tvalue = desc.substring(0, desc.length - 1);\n\t\t\t\tintVal = parseInt(value, 10);\n\t\t\t\tfloatVal = parseFloat(value);\n\n\t\t\t\t// If the descriptor consists of a valid non-negative integer followed by\n\t\t\t\t// a U+0077 LATIN SMALL LETTER W character\n\t\t\t\tif (regexNonNegativeInteger.test(value) && (lastChar === \"w\")) {\n\n\t\t\t\t\t// If width and density are not both absent, then let error be yes.\n\t\t\t\t\tif (w || d) {pError = true;}\n\n\t\t\t\t\t// Apply the rules for parsing non-negative integers to the descriptor.\n\t\t\t\t\t// If the result is zero, let error be yes.\n\t\t\t\t\t// Otherwise, let width be the result.\n\t\t\t\t\tif (intVal === 0) {pError = true;} else {w = intVal;}\n\n\t\t\t\t\t// If the descriptor consists of a valid floating-point number followed by\n\t\t\t\t\t// a U+0078 LATIN SMALL LETTER X character\n\t\t\t\t} else if (regexFloatingPoint.test(value) && (lastChar === \"x\")) {\n\n\t\t\t\t\t// If width, density and future-compat-h are not all absent, then let error\n\t\t\t\t\t// be yes.\n\t\t\t\t\tif (w || d || h) {pError = true;}\n\n\t\t\t\t\t// Apply the rules for parsing floating-point number values to the descriptor.\n\t\t\t\t\t// If the result is less than zero, let error be yes. Otherwise, let density\n\t\t\t\t\t// be the result.\n\t\t\t\t\tif (floatVal < 0) {pError = true;} else {d = floatVal;}\n\n\t\t\t\t\t// If the descriptor consists of a valid non-negative integer followed by\n\t\t\t\t\t// a U+0068 LATIN SMALL LETTER H character\n\t\t\t\t} else if (regexNonNegativeInteger.test(value) && (lastChar === \"h\")) {\n\n\t\t\t\t\t// If height and density are not both absent, then let error be yes.\n\t\t\t\t\tif (h || d) {pError = true;}\n\n\t\t\t\t\t// Apply the rules for parsing non-negative integers to the descriptor.\n\t\t\t\t\t// If the result is zero, let error be yes. Otherwise, let future-compat-h\n\t\t\t\t\t// be the result.\n\t\t\t\t\tif (intVal === 0) {pError = true;} else {h = intVal;}\n\n\t\t\t\t\t// Anything else, Let error be yes.\n\t\t\t\t} else {pError = true;}\n\t\t\t} // (close step 13 for loop)\n\n\t\t\t// 15. If error is still no, then append a new image source to candidates whose\n\t\t\t// URL is url, associated with a width width if not absent and a pixel\n\t\t\t// density density if not absent. Otherwise, there is a parse error.\n\t\t\tif (!pError) {\n\t\t\t\tcandidate.url = url;\n\t\t\t\tif (w) { candidate.w = w;}\n\t\t\t\tif (d) { candidate.d = d;}\n\t\t\t\tif (h) { candidate.h = h;}\n\t\t\t\tcandidates.push(candidate);\n\t\t\t} else if (console && console.log) {\n\t\t\t\tconsole.log(\"Invalid srcset descriptor found in '\" +\n\t\t\t\t\tinput + \"' at '\" + desc + \"'.\");\n\t\t\t}\n\t\t} // (close parseDescriptors fn)\n\n\t}\n}));\n","var x=String;\nvar create=function() {return {isColorSupported:false,reset:x,bold:x,dim:x,italic:x,underline:x,inverse:x,hidden:x,strikethrough:x,black:x,red:x,green:x,yellow:x,blue:x,magenta:x,cyan:x,white:x,gray:x,bgBlack:x,bgRed:x,bgGreen:x,bgYellow:x,bgBlue:x,bgMagenta:x,bgCyan:x,bgWhite:x,blackBright:x,redBright:x,greenBright:x,yellowBright:x,blueBright:x,magentaBright:x,cyanBright:x,whiteBright:x,bgBlackBright:x,bgRedBright:x,bgGreenBright:x,bgYellowBright:x,bgBlueBright:x,bgMagentaBright:x,bgCyanBright:x,bgWhiteBright:x}};\nmodule.exports=create();\nmodule.exports.createColors = create;\n","'use strict'\n\nlet pico = require('picocolors')\n\nlet terminalHighlight = require('./terminal-highlight')\n\nclass CssSyntaxError extends Error {\n  constructor(message, line, column, source, file, plugin) {\n    super(message)\n    this.name = 'CssSyntaxError'\n    this.reason = message\n\n    if (file) {\n      this.file = file\n    }\n    if (source) {\n      this.source = source\n    }\n    if (plugin) {\n      this.plugin = plugin\n    }\n    if (typeof line !== 'undefined' && typeof column !== 'undefined') {\n      if (typeof line === 'number') {\n        this.line = line\n        this.column = column\n      } else {\n        this.line = line.line\n        this.column = line.column\n        this.endLine = column.line\n        this.endColumn = column.column\n      }\n    }\n\n    this.setMessage()\n\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, CssSyntaxError)\n    }\n  }\n\n  setMessage() {\n    this.message = this.plugin ? this.plugin + ': ' : ''\n    this.message += this.file ? this.file : '<css input>'\n    if (typeof this.line !== 'undefined') {\n      this.message += ':' + this.line + ':' + this.column\n    }\n    this.message += ': ' + this.reason\n  }\n\n  showSourceCode(color) {\n    if (!this.source) return ''\n\n    let css = this.source\n    if (color == null) color = pico.isColorSupported\n\n    let aside = text => text\n    let mark = text => text\n    let highlight = text => text\n    if (color) {\n      let { bold, gray, red } = pico.createColors(true)\n      mark = text => bold(red(text))\n      aside = text => gray(text)\n      if (terminalHighlight) {\n        highlight = text => terminalHighlight(text)\n      }\n    }\n\n    let lines = css.split(/\\r?\\n/)\n    let start = Math.max(this.line - 3, 0)\n    let end = Math.min(this.line + 2, lines.length)\n    let maxWidth = String(end).length\n\n    return lines\n      .slice(start, end)\n      .map((line, index) => {\n        let number = start + 1 + index\n        let gutter = ' ' + (' ' + number).slice(-maxWidth) + ' | '\n        if (number === this.line) {\n          if (line.length > 160) {\n            let padding = 20\n            let subLineStart = Math.max(0, this.column - padding)\n            let subLineEnd = Math.max(\n              this.column + padding,\n              this.endColumn + padding\n            )\n            let subLine = line.slice(subLineStart, subLineEnd)\n\n            let spacing =\n              aside(gutter.replace(/\\d/g, ' ')) +\n              line\n                .slice(0, Math.min(this.column - 1, padding - 1))\n                .replace(/[^\\t]/g, ' ')\n\n            return (\n              mark('>') +\n              aside(gutter) +\n              highlight(subLine) +\n              '\\n ' +\n              spacing +\n              mark('^')\n            )\n          }\n\n          let spacing =\n            aside(gutter.replace(/\\d/g, ' ')) +\n            line.slice(0, this.column - 1).replace(/[^\\t]/g, ' ')\n\n          return (\n            mark('>') +\n            aside(gutter) +\n            highlight(line) +\n            '\\n ' +\n            spacing +\n            mark('^')\n          )\n        }\n\n        return ' ' + aside(gutter) + highlight(line)\n      })\n      .join('\\n')\n  }\n\n  toString() {\n    let code = this.showSourceCode()\n    if (code) {\n      code = '\\n\\n' + code + '\\n'\n    }\n    return this.name + ': ' + this.message + code\n  }\n}\n\nmodule.exports = CssSyntaxError\nCssSyntaxError.default = CssSyntaxError\n","'use strict'\n\n// Characters that end an at-rule name, mirroring RE_AT_END in the tokenizer.\n// Params starting with anything else need a space to stay separate tokens.\nconst AT_NAME_END = /[\\t\\n\\f\\r \"#'()/;[\\\\\\]{}]/\n\nconst DEFAULT_RAW = {\n  after: '\\n',\n  beforeClose: '\\n',\n  beforeComment: '\\n',\n  beforeDecl: '\\n',\n  beforeOpen: ' ',\n  beforeRule: '\\n',\n  colon: ': ',\n  commentLeft: ' ',\n  commentRight: ' ',\n  emptyBody: '',\n  indent: '    ',\n  semicolon: false\n}\n\nfunction capitalize(str) {\n  return str[0].toUpperCase() + str.slice(1)\n}\n\nfunction atruleStart(str, node) {\n  let name = '@' + node.name\n  let params = node.params ? str.rawValue(node, 'params') : ''\n  let afterName = node.raws.afterName\n\n  if (typeof afterName === 'undefined') {\n    afterName = params ? ' ' : ''\n  } else if (afterName === '' && params && !AT_NAME_END.test(params[0])) {\n    afterName = ' '\n  }\n\n  return name + afterName + params\n}\n\n// `*--x` is not a custom property: the parser checks the first token, and the\n// `*`/`_` hack prefix moves from `prop` into `before` only after that. A free\n// semicolon in front of the declaration also ends up in `before`.\nfunction isCustomProperty(node) {\n  if (!node.prop.startsWith('--')) return false\n  let before = node.raws.before\n  return typeof before === 'undefined' || !/[^\\s;]$/.test(before)\n}\n\nfunction pushBody(str, stack, node) {\n  let nodes = node.nodes\n  let last = nodes.length - 1\n  while (last > 0) {\n    if (nodes[last].type !== 'comment') break\n    last -= 1\n  }\n\n  let semicolon = str.raw(node, 'semicolon')\n  let isDocument = node.type === 'document'\n  for (let i = nodes.length - 1; i >= 0; i--) {\n    let child = nodes[i]\n    let childSemicolon = last !== i || semicolon\n    // A childless at-rule or a custom property declaration that still has\n    // following siblings must be terminated. Without the semicolon those\n    // trailing comments are folded into the at-rule's prelude or the custom\n    // property's value and disappear when the output is re-parsed.\n    if (\n      !childSemicolon &&\n      i < nodes.length - 1 &&\n      ((child.type === 'atrule' && !child.nodes) ||\n        (child.type === 'decl' && isCustomProperty(child)))\n    ) {\n      childSemicolon = true\n    }\n    stack.push({\n      document: isDocument,\n      node: child,\n      semicolon: childSemicolon\n    })\n  }\n}\n\nfunction pushBlock(str, stack, node, start) {\n  let between = str.raw(node, 'between', 'beforeOpen')\n  str.builder(start + between + '{', node, 'start')\n\n  let hasNodes = node.nodes && node.nodes.length\n  let close = () => {\n    let after = hasNodes\n      ? str.raw(node, 'after')\n      : str.raw(node, 'after', 'emptyBody')\n    if (after) str.builder(after)\n    str.builder('}', node, 'end')\n    if (node.type === 'rule' && node.raws.ownSemicolon) {\n      str.builder(node.raws.ownSemicolon, node, 'end')\n    }\n  }\n\n  if (hasNodes) {\n    stack.push(close)\n    pushBody(str, stack, node)\n  } else {\n    close()\n  }\n}\n\nclass Stringifier {\n  constructor(builder) {\n    this.builder = builder\n  }\n\n  atrule(node, semicolon) {\n    let start = atruleStart(this, node)\n    if (node.nodes) {\n      this.block(node, start)\n    } else {\n      let end = (node.raws.between || '') + (semicolon ? ';' : '')\n      this.builder(start + end, node)\n    }\n  }\n\n  beforeAfter(node, detect) {\n    let value\n    if (node.type === 'decl') {\n      value = this.raw(node, null, 'beforeDecl')\n    } else if (node.type === 'comment') {\n      value = this.raw(node, null, 'beforeComment')\n    } else if (detect === 'before') {\n      value = this.raw(node, null, 'beforeRule')\n    } else {\n      value = this.raw(node, null, 'beforeClose')\n    }\n\n    let buf = node.parent\n    let depth = 0\n    while (buf && buf.type !== 'root') {\n      depth += 1\n      buf = buf.parent\n    }\n\n    if (value.includes('\\n')) {\n      let indent = this.raw(node, null, 'indent')\n      if (indent.length) {\n        for (let step = 0; step < depth; step++) value += indent\n      }\n    }\n\n    return value\n  }\n\n  block(node, start) {\n    let between = this.raw(node, 'between', 'beforeOpen')\n    this.builder(start + between + '{', node, 'start')\n\n    let after\n    if (node.nodes && node.nodes.length) {\n      this.body(node)\n      after = this.raw(node, 'after')\n    } else {\n      after = this.raw(node, 'after', 'emptyBody')\n    }\n\n    if (after) this.builder(after)\n    this.builder('}', node, 'end')\n  }\n\n  body(node) {\n    // Rules and at-rules are expanded into an explicit stack instead of\n    // recursive `stringify()` calls to survive deeply nested trees.\n    // If a subclass changes the traversal methods, its children go\n    // through `stringify()` to keep the override in charge.\n    let proto = Stringifier.prototype\n    let expandable = ['atrule', 'block', 'body', 'rule', 'stringify'].every(\n      method => this[method] === proto[method]\n    )\n\n    let stack = []\n    pushBody(this, stack, node)\n\n    while (stack.length > 0) {\n      let entry = stack.pop()\n      if (typeof entry === 'function') {\n        entry()\n        continue\n      }\n\n      let child = entry.node\n      let before = this.raw(child, 'before')\n      if (before) {\n        this.builder(before)\n      }\n\n      if (expandable && child.type === 'rule') {\n        pushBlock(this, stack, child, this.rawValue(child, 'selector'))\n      } else if (expandable && child.type === 'atrule' && child.nodes) {\n        pushBlock(this, stack, child, atruleStart(this, child))\n      } else {\n        this.stringify(child, entry.semicolon)\n      }\n    }\n  }\n\n  comment(node) {\n    let left = this.raw(node, 'left', 'commentLeft')\n    let right = this.raw(node, 'right', 'commentRight')\n    this.builder('/*' + left + node.text + right + '*/', node)\n  }\n\n  decl(node, semicolon) {\n    let raws = node.raws\n    let between = this.raw(node, 'between', 'colon')\n\n    let string = node.prop + between + this.rawValue(node, 'value')\n\n    if (node.important) {\n      string += raws.important || ' !important'\n    }\n\n    if (semicolon) string += ';'\n    this.builder(string, node)\n  }\n\n  document(node) {\n    this.body(node)\n  }\n\n  raw(node, own, detect) {\n    let value\n    if (!detect) detect = own\n\n    // Already had\n    if (own) {\n      value = node.raws[own]\n      if (typeof value !== 'undefined') return value\n    }\n\n    let parent = node.parent\n\n    if (detect === 'before') {\n      // Hack for first rule in CSS\n      if (!parent || (parent.type === 'root' && parent.first === node)) {\n        return ''\n      }\n\n      // `root` nodes in `document` should use only their own raws\n      if (parent && parent.type === 'document') {\n        return ''\n      }\n    }\n\n    // Floating child without parent\n    if (!parent) return DEFAULT_RAW[detect]\n\n    // Detect style by other nodes\n    let root = node.root()\n    let cache = root.rawCache || (root.rawCache = {})\n    if (typeof cache[detect] !== 'undefined') {\n      return cache[detect]\n    }\n\n    if (detect === 'before' || detect === 'after') {\n      return this.beforeAfter(node, detect)\n    } else {\n      let method = 'raw' + capitalize(detect)\n      if (this[method]) {\n        value = this[method](root, node)\n      } else {\n        root.walk(i => {\n          value = i.raws[own]\n          if (typeof value !== 'undefined') return false\n        })\n      }\n    }\n\n    if (typeof value === 'undefined') value = DEFAULT_RAW[detect]\n\n    cache[detect] = value\n    return value\n  }\n\n  rawBeforeClose(root) {\n    let value\n    root.walk(i => {\n      if (i.nodes && i.nodes.length > 0) {\n        if (typeof i.raws.after !== 'undefined') {\n          value = i.raws.after\n          if (value.includes('\\n')) {\n            value = value.replace(/[^\\n]+$/, '')\n          }\n          return false\n        }\n      }\n    })\n    if (value) value = value.replace(/\\S/g, '')\n    return value\n  }\n\n  rawBeforeComment(root, node) {\n    let value\n    root.walkComments(i => {\n      if (typeof i.raws.before !== 'undefined') {\n        value = i.raws.before\n        if (value.includes('\\n')) {\n          value = value.replace(/[^\\n]+$/, '')\n        }\n        return false\n      }\n    })\n    if (typeof value === 'undefined') {\n      value = this.raw(node, null, 'beforeDecl')\n    } else if (value) {\n      value = value.replace(/\\S/g, '')\n    }\n    return value\n  }\n\n  rawBeforeDecl(root, node) {\n    let value\n    root.walkDecls(i => {\n      if (typeof i.raws.before !== 'undefined') {\n        value = i.raws.before\n        if (value.includes('\\n')) {\n          value = value.replace(/[^\\n]+$/, '')\n        }\n        return false\n      }\n    })\n    if (typeof value === 'undefined') {\n      value = this.raw(node, null, 'beforeRule')\n    } else if (value) {\n      value = value.replace(/\\S/g, '')\n    }\n    return value\n  }\n\n  rawBeforeOpen(root) {\n    let value\n    root.walk(i => {\n      if (i.type !== 'decl') {\n        value = i.raws.between\n        if (typeof value !== 'undefined') return false\n      }\n    })\n    return value\n  }\n\n  rawBeforeRule(root) {\n    let value\n    root.walk(i => {\n      if (i.nodes && (i.parent !== root || root.first !== i)) {\n        if (typeof i.raws.before !== 'undefined') {\n          value = i.raws.before\n          if (value.includes('\\n')) {\n            value = value.replace(/[^\\n]+$/, '')\n          }\n          return false\n        }\n      }\n    })\n    if (value) value = value.replace(/\\S/g, '')\n    return value\n  }\n\n  rawColon(root) {\n    let value\n    root.walkDecls(i => {\n      if (typeof i.raws.between !== 'undefined') {\n        value = i.raws.between.replace(/[^\\s:]/g, '')\n        return false\n      }\n    })\n    return value\n  }\n\n  rawEmptyBody(root) {\n    let value\n    root.walk(i => {\n      if (i.nodes && i.nodes.length === 0) {\n        value = i.raws.after\n        if (typeof value !== 'undefined') return false\n      }\n    })\n    return value\n  }\n\n  rawIndent(root) {\n    if (root.raws.indent) return root.raws.indent\n    let value\n    root.walk(i => {\n      let p = i.parent\n      if (p && p !== root && p.parent && p.parent === root) {\n        if (typeof i.raws.before !== 'undefined') {\n          let parts = i.raws.before.split('\\n')\n          value = parts[parts.length - 1]\n          value = value.replace(/\\S/g, '')\n          return false\n        }\n      }\n    })\n    return value\n  }\n\n  rawSemicolon(root) {\n    let value\n    root.walk(i => {\n      if (i.nodes && i.nodes.length && i.last.type === 'decl') {\n        value = i.raws.semicolon\n        if (typeof value !== 'undefined') return false\n      }\n    })\n    return value\n  }\n\n  rawValue(node, prop) {\n    let value = node[prop]\n    let raw = node.raws[prop]\n    if (raw && raw.value === value) {\n      return raw.raw\n    }\n\n    return value\n  }\n\n  root(node) {\n    let inDocument = node.parent && node.parent.type === 'document'\n    if (!inDocument && node.source && node.source.input.hasBOM) {\n      this.builder('\\uFEFF', node, 'start')\n    }\n    this.body(node)\n    if (node.raws.after) {\n      this.builder(node.raws.after)\n    }\n  }\n\n  rule(node) {\n    this.block(node, this.rawValue(node, 'selector'))\n    if (node.raws.ownSemicolon) {\n      this.builder(node.raws.ownSemicolon, node, 'end')\n    }\n  }\n\n  stringify(node, semicolon) {\n    /* c8 ignore start */\n    if (!this[node.type]) {\n      throw new Error(\n        'Unknown AST node type ' +\n          node.type +\n          '. ' +\n          'Maybe you need to change PostCSS stringifier.'\n      )\n    }\n    /* c8 ignore stop */\n    this[node.type](node, semicolon)\n  }\n}\n\nmodule.exports = Stringifier\nStringifier.default = Stringifier\n","'use strict'\n\nlet Stringifier = require('./stringifier')\n\nconst STYLE_TAG = /(<)(\\/?style\\b)/gi\nconst COMMENT_OPEN = /(<)(!--)/g\n\nfunction escapeHTMLInCSS(str) {\n  if (!str.includes('<')) return str\n  return str.replace(STYLE_TAG, '\\\\3c $2').replace(COMMENT_OPEN, '\\\\3c $2')\n}\n\nfunction cutEscaped(chunks, css, escaped) {\n  let parts = []\n  let at = 0\n  let into = 0\n  for (let i = 0; i < chunks.length; i += 3) {\n    let from = into\n    let end = at + chunks[i].length\n    while (at < end) {\n      if (css[at] === escaped[into]) {\n        at += 1\n        into += 1\n      } else {\n        // The `<` of this pair was replaced by the `\\3c ` in front of it\n        at += 1\n        into += 4\n      }\n    }\n    parts.push(escaped.slice(from, into))\n  }\n  return parts\n}\n\nclass SafeStringifier extends Stringifier {\n  escapeHTML(print) {\n    let builder = this.builder\n    let chunks, css\n    this.builder = (str, child, type) => {\n      if (chunks) {\n        css += str\n        chunks.push(str, child, type)\n      } else if (str.includes('<')) {\n        // Dangerous sequences start with `<`, so everything before\n        // the first `<` is safe to pass through. The rest is buffered\n        // to escape it as a whole.\n        css = str\n        chunks = [str, child, type]\n      } else {\n        builder(str, child, type)\n      }\n    }\n    print()\n    this.builder = builder\n    if (!chunks) return\n\n    let escaped = escapeHTMLInCSS(css)\n    if (escaped === css) {\n      // Keep the chunks to get a precise source map\n      for (let i = 0; i < chunks.length; i += 3) {\n        builder(chunks[i], chunks[i + 1], chunks[i + 2])\n      }\n    } else {\n      let parts = cutEscaped(chunks, css, escaped)\n      for (let i = 0; i < chunks.length; i += 3) {\n        builder(parts[i / 3], chunks[i + 1], chunks[i + 2])\n      }\n    }\n  }\n\n  root(node) {\n    if (node.parent && node.parent.type === 'document') {\n      // Document raws around the Root hold markup and are kept as is since CSS in Document can be marked with <style>\n      this.escapeHTML(() => this.body(node))\n      if (node.raws.after) this.builder(node.raws.after)\n    } else {\n      this.escapeHTML(() => super.root(node))\n    }\n  }\n}\n\nfunction stringify(node, builder) {\n  let str = new SafeStringifier(builder)\n  // Root escapes its own output and keeps markup in Document raws\n  if (node.type === 'root' || node.type === 'document') {\n    str.stringify(node)\n  } else {\n    str.escapeHTML(() => str.stringify(node))\n  }\n}\n\nmodule.exports = stringify\nstringify.default = stringify\n","'use strict'\n\nmodule.exports.isClean = Symbol('isClean')\n\nmodule.exports.my = Symbol('my')\n","'use strict'\n\nlet CssSyntaxError = require('./css-syntax-error')\nlet Stringifier = require('./stringifier')\nlet stringify = require('./stringify')\nlet { isClean, my } = require('./symbols')\n\nfunction cloneNode(obj, parent) {\n  let cloned = new obj.constructor()\n  // An explicit stack instead of recursive calls to survive deeply\n  // nested trees. Each entry is [source, its clone, clone's parent].\n  let stack = [[obj, cloned, parent]]\n\n  while (stack.length > 0) {\n    let [source, target, targetParent] = stack.pop()\n    for (let i in source) {\n      if (!Object.prototype.hasOwnProperty.call(source, i)) {\n        /* c8 ignore next 2 */\n        continue\n      }\n      if (i === 'proxyCache') continue\n      let value = source[i]\n      let type = typeof value\n\n      if (i === 'parent' && type === 'object') {\n        if (targetParent) target[i] = targetParent\n      } else if (i === 'source') {\n        target[i] = value\n      } else if (Array.isArray(value)) {\n        let children = []\n        target[i] = children\n        for (let j of value) {\n          let childClone = new j.constructor()\n          children.push(childClone)\n          stack.push([j, childClone, target])\n        }\n      } else {\n        if (type === 'object' && value !== null) {\n          let valueClone = new value.constructor()\n          stack.push([value, valueClone, undefined])\n          value = valueClone\n        }\n        target[i] = value\n      }\n    }\n  }\n\n  return cloned\n}\n\nfunction sourceOffset(inputCSS, position) {\n  // Not all custom syntaxes support `offset` in `source.start` and `source.end`\n  if (position && typeof position.offset !== 'undefined') {\n    return position.offset\n  }\n\n  let column = 1\n  let line = 1\n  let offset = 0\n\n  for (let i = 0; i < inputCSS.length; i++) {\n    if (line === position.line && column === position.column) {\n      offset = i\n      break\n    }\n\n    if (inputCSS[i] === '\\n') {\n      column = 1\n      line += 1\n    } else {\n      column += 1\n    }\n  }\n\n  return offset\n}\n\nclass Node {\n  get proxyOf() {\n    return this\n  }\n\n  constructor(defaults = {}) {\n    this.raws = {}\n    this[isClean] = false\n    this[my] = true\n\n    for (let name of Object.keys(defaults)) {\n      if (name === '__proto__') continue\n      if (name === 'nodes') {\n        this.nodes = []\n        for (let node of defaults[name]) {\n          // Clone only nodes that already belong to another tree, so passing a\n          // freshly created (parent-less) node adopts that instance instead of\n          // a copy and keeps the caller's reference usable. See #1987.\n          if (typeof node.clone === 'function' && node.parent) {\n            this.append(node.clone())\n          } else {\n            this.append(node)\n          }\n        }\n      } else {\n        this[name] = defaults[name]\n      }\n    }\n  }\n\n  addToError(error) {\n    error.postcssNode = this\n    if (error.stack && this.source && /\\n\\s{4}at /.test(error.stack)) {\n      let s = this.source\n      error.stack = error.stack.replace(\n        /\\n\\s{4}at /,\n        `$&${s.input.from}:${s.start.line}:${s.start.column}$&`\n      )\n    }\n    return error\n  }\n\n  after(add) {\n    this.parent.insertAfter(this, add)\n    return this\n  }\n\n  assign(overrides = {}) {\n    for (let name in overrides) {\n      this[name] = overrides[name]\n    }\n    return this\n  }\n\n  before(add) {\n    this.parent.insertBefore(this, add)\n    return this\n  }\n\n  cleanRaws(keepBetween) {\n    delete this.raws.before\n    delete this.raws.after\n    if (!keepBetween) delete this.raws.between\n  }\n\n  clone(overrides = {}) {\n    let cloned = cloneNode(this)\n    for (let name in overrides) {\n      cloned[name] = overrides[name]\n    }\n    return cloned\n  }\n\n  cloneAfter(overrides = {}) {\n    let cloned = this.clone(overrides)\n    this.parent.insertAfter(this, cloned)\n    return cloned\n  }\n\n  cloneBefore(overrides = {}) {\n    let cloned = this.clone(overrides)\n    this.parent.insertBefore(this, cloned)\n    return cloned\n  }\n\n  error(message, opts = {}) {\n    if (this.source) {\n      let { end, start } = this.rangeBy(opts)\n      return this.source.input.error(\n        message,\n        { column: start.column, line: start.line },\n        { column: end.column, line: end.line },\n        opts\n      )\n    }\n    return new CssSyntaxError(message)\n  }\n\n  getProxyProcessor() {\n    return {\n      get(node, prop) {\n        if (prop === 'proxyOf') {\n          return node\n        } else if (prop === 'root') {\n          return () => node.root().toProxy()\n        } else {\n          return node[prop]\n        }\n      },\n\n      set(node, prop, value) {\n        if (node[prop] === value) return true\n        node[prop] = value\n        if (\n          prop === 'prop' ||\n          prop === 'value' ||\n          prop === 'name' ||\n          prop === 'params' ||\n          prop === 'important' ||\n          /* c8 ignore next */\n          prop === 'text'\n        ) {\n          node.markDirty()\n        }\n        return true\n      }\n    }\n  }\n\n  /* c8 ignore next 3 */\n  markClean() {\n    this[isClean] = true\n  }\n\n  markDirty() {\n    if (this[isClean]) {\n      this[isClean] = false\n      let next = this\n      while ((next = next.parent)) {\n        next[isClean] = false\n      }\n    }\n  }\n\n  next() {\n    if (!this.parent) return undefined\n    let index = this.parent.index(this)\n    return this.parent.nodes[index + 1]\n  }\n\n  positionBy(opts = {}) {\n    let inputString =\n      'document' in this.source.input\n        ? this.source.input.document\n        : this.source.input.css\n    let pos = {\n      column: this.source.start.column,\n      line: this.source.start.line,\n      offset: sourceOffset(inputString, this.source.start)\n    }\n    if (opts.index) {\n      pos = this.positionInside(opts.index)\n    } else if (opts.word) {\n      let stringRepresentation = inputString.slice(\n        sourceOffset(inputString, this.source.start),\n        sourceOffset(inputString, this.source.end)\n      )\n      let index = stringRepresentation.indexOf(opts.word)\n      if (index !== -1) pos = this.positionInside(index)\n    }\n    return pos\n  }\n\n  positionInside(index) {\n    let column = this.source.start.column\n    let line = this.source.start.line\n    let inputString =\n      'document' in this.source.input\n        ? this.source.input.document\n        : this.source.input.css\n    let offset = sourceOffset(inputString, this.source.start)\n    let end = offset + index\n\n    for (let i = offset; i < end; i++) {\n      if (inputString[i] === '\\n') {\n        column = 1\n        line += 1\n      } else {\n        column += 1\n      }\n    }\n\n    return { column, line, offset: end }\n  }\n\n  prev() {\n    if (!this.parent) return undefined\n    let index = this.parent.index(this)\n    return this.parent.nodes[index - 1]\n  }\n\n  rangeBy(opts = {}) {\n    let inputString =\n      'document' in this.source.input\n        ? this.source.input.document\n        : this.source.input.css\n    let start = {\n      column: this.source.start.column,\n      line: this.source.start.line,\n      offset: sourceOffset(inputString, this.source.start)\n    }\n    let end = this.source.end\n      ? {\n          column: this.source.end.column + 1,\n          line: this.source.end.line,\n          offset:\n            typeof this.source.end.offset === 'number'\n              ? // `source.end.offset` is exclusive, so we don't need to add 1\n                this.source.end.offset\n              : // Since line/column in this.source.end is inclusive,\n                // the `sourceOffset(... , this.source.end)` returns an inclusive offset.\n                // So, we add 1 to convert it to exclusive.\n                sourceOffset(inputString, this.source.end) + 1\n        }\n      : {\n          column: start.column + 1,\n          line: start.line,\n          offset: start.offset + 1\n        }\n\n    if (opts.word) {\n      let stringRepresentation = inputString.slice(\n        sourceOffset(inputString, this.source.start),\n        sourceOffset(inputString, this.source.end)\n      )\n      let index = stringRepresentation.indexOf(opts.word)\n      if (index !== -1) {\n        start = this.positionInside(index)\n        end = this.positionInside(index + opts.word.length)\n      }\n    } else {\n      if (opts.start) {\n        start = {\n          column: opts.start.column,\n          line: opts.start.line,\n          offset: sourceOffset(inputString, opts.start)\n        }\n      } else if (typeof opts.index === 'number') {\n        start = this.positionInside(opts.index)\n      }\n\n      if (opts.end) {\n        end = {\n          column: opts.end.column,\n          line: opts.end.line,\n          offset: sourceOffset(inputString, opts.end)\n        }\n      } else if (typeof opts.endIndex === 'number') {\n        end = this.positionInside(opts.endIndex)\n      } else if (typeof opts.index === 'number') {\n        end = this.positionInside(opts.index + 1)\n      }\n    }\n\n    if (\n      end.line < start.line ||\n      (end.line === start.line && end.column <= start.column)\n    ) {\n      end = {\n        column: start.column + 1,\n        line: start.line,\n        offset: start.offset + 1\n      }\n    }\n\n    return { end, start }\n  }\n\n  raw(prop, defaultType) {\n    let str = new Stringifier()\n    return str.raw(this, prop, defaultType)\n  }\n\n  remove() {\n    if (this.parent) {\n      this.parent.removeChild(this)\n    }\n    this.parent = undefined\n    return this\n  }\n\n  replaceWith(...nodes) {\n    if (this.parent) {\n      let bookmark = this\n      let foundSelf = false\n      for (let node of nodes) {\n        if (node === this) {\n          foundSelf = true\n        } else if (foundSelf) {\n          this.parent.insertAfter(bookmark, node)\n          bookmark = node\n        } else {\n          this.parent.insertBefore(bookmark, node)\n        }\n      }\n\n      if (!foundSelf) {\n        this.remove()\n      }\n    }\n\n    return this\n  }\n\n  root() {\n    let result = this\n    while (result.parent && result.parent.type !== 'document') {\n      result = result.parent\n    }\n    return result\n  }\n\n  toJSON(_, inputs) {\n    let emitInputs = inputs == null\n    inputs = inputs || new Map()\n\n    // A worklist instead of recursive `toJSON()` calls to survive deeply\n    // nested trees. Each entry converts one node and writes the result\n    // into the already converted parent by [holder, key].\n    let holderOfRoot = []\n    let queue = [[this, holderOfRoot, 0]]\n\n    for (let step = 0; step < queue.length; step++) {\n      let [node, holder, key] = queue[step]\n      let fixed = {}\n      holder[key] = fixed\n\n      for (let name in node) {\n        if (!Object.prototype.hasOwnProperty.call(node, name)) {\n          /* c8 ignore next 2 */\n          continue\n        }\n        if (name === 'parent' || name === 'proxyCache') continue\n        let value = node[name]\n\n        if (Array.isArray(value)) {\n          let fixedArray = []\n          fixed[name] = fixedArray\n          for (let i = 0; i < value.length; i++) {\n            let item = value[i]\n            if (typeof item === 'object' && item.toJSON) {\n              if (item.toJSON === Node.prototype.toJSON) {\n                queue.push([item, fixedArray, i])\n              } else {\n                fixedArray[i] = item.toJSON(null, inputs)\n              }\n            } else {\n              fixedArray[i] = item\n            }\n          }\n        } else if (typeof value === 'object' && value.toJSON) {\n          if (value.toJSON === Node.prototype.toJSON) {\n            queue.push([value, fixed, name])\n          } else {\n            fixed[name] = value.toJSON(null, inputs)\n          }\n        } else if (name === 'source') {\n          if (value == null) continue\n          let inputId = inputs.get(value.input)\n          if (inputId == null) {\n            inputId = inputs.size\n            inputs.set(value.input, inputId)\n          }\n          fixed[name] = {\n            end: value.end,\n            inputId,\n            start: value.start\n          }\n        } else {\n          fixed[name] = value\n        }\n      }\n    }\n\n    let fixed = holderOfRoot[0]\n    if (emitInputs) {\n      fixed.inputs = [...inputs.keys()].map(input => input.toJSON())\n    }\n\n    return fixed\n  }\n\n  toProxy() {\n    if (!this.proxyCache) {\n      this.proxyCache = new Proxy(this, this.getProxyProcessor())\n    }\n    return this.proxyCache\n  }\n\n  toString(stringifier = stringify) {\n    if (stringifier.stringify) stringifier = stringifier.stringify\n    let result = ''\n    stringifier(this, i => {\n      result += i\n    })\n    return result\n  }\n\n  warn(result, text, opts = {}) {\n    let data = { node: this }\n    for (let i in opts) data[i] = opts[i]\n    return result.warn(text, data)\n  }\n}\n\nmodule.exports = Node\nNode.default = Node\n","'use strict'\n\nlet Node = require('./node')\n\nclass Comment extends Node {\n  constructor(defaults) {\n    super(defaults)\n    this.type = 'comment'\n  }\n}\n\nmodule.exports = Comment\nComment.default = Comment\n","'use strict'\n\nlet Node = require('./node')\n\nclass Declaration extends Node {\n  get variable() {\n    return this.prop.startsWith('--') || this.prop[0] === '$'\n  }\n\n  constructor(defaults) {\n    if (\n      defaults &&\n      typeof defaults.value !== 'undefined' &&\n      typeof defaults.value !== 'string'\n    ) {\n      defaults = { ...defaults, value: String(defaults.value) }\n    }\n    super(defaults)\n    this.type = 'decl'\n  }\n}\n\nmodule.exports = Declaration\nDeclaration.default = Declaration\n","'use strict'\n\nlet Comment = require('./comment')\nlet Declaration = require('./declaration')\nlet Node = require('./node')\nlet { isClean, my } = require('./symbols')\n\nlet AtRule, parse, Root, Rule\n\nfunction cleanSource(nodes) {\n  let stack = nodes.slice()\n  while (stack.length > 0) {\n    let node = stack.pop()\n    delete node.source\n    if (node.nodes) {\n      node.nodes = node.nodes.slice()\n      for (let i of node.nodes) stack.push(i)\n    }\n  }\n  return nodes.slice()\n}\n\nfunction markTreeDirty(node) {\n  let stack = [node]\n  while (stack.length > 0) {\n    let next = stack.pop()\n    next[isClean] = false\n    if (next.proxyOf.nodes) {\n      for (let i of next.proxyOf.nodes) stack.push(i)\n    }\n  }\n}\n\nclass Container extends Node {\n  get first() {\n    if (!this.proxyOf.nodes) return undefined\n    return this.proxyOf.nodes[0]\n  }\n\n  get last() {\n    if (!this.proxyOf.nodes) return undefined\n    return this.proxyOf.nodes[this.proxyOf.nodes.length - 1]\n  }\n\n  append(...children) {\n    for (let child of children) {\n      let nodes = this.normalize(child, this.last)\n      for (let node of nodes) this.proxyOf.nodes.push(node)\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  cleanRaws(keepBetween) {\n    let stack = [this]\n    while (stack.length > 0) {\n      let node = stack.pop()\n      if (node !== this && node.cleanRaws !== Container.prototype.cleanRaws) {\n        // Subclass with own logic; let it handle its subtree\n        node.cleanRaws(keepBetween)\n        continue\n      }\n      Node.prototype.cleanRaws.call(node, keepBetween)\n      if (node.nodes) {\n        for (let child of node.nodes) stack.push(child)\n      }\n    }\n  }\n\n  each(callback) {\n    if (!this.proxyOf.nodes) return undefined\n    let iterator = this.getIterator()\n\n    let index, result\n    while (this.indexes[iterator] < this.proxyOf.nodes.length) {\n      index = this.indexes[iterator]\n      result = callback(this.proxyOf.nodes[index], index)\n      if (result === false) break\n\n      this.indexes[iterator] += 1\n    }\n\n    delete this.indexes[iterator]\n    return result\n  }\n\n  every(condition) {\n    return this.nodes.every(condition)\n  }\n\n  getIterator() {\n    if (!this.lastEach) this.lastEach = 0\n    if (!this.indexes) this.indexes = {}\n\n    this.lastEach += 1\n    let iterator = this.lastEach\n    this.indexes[iterator] = 0\n\n    return iterator\n  }\n\n  getProxyProcessor() {\n    return {\n      get(node, prop) {\n        if (prop === 'proxyOf') {\n          return node\n        } else if (!node[prop]) {\n          return node[prop]\n        } else if (\n          prop === 'each' ||\n          (typeof prop === 'string' && prop.startsWith('walk'))\n        ) {\n          return (...args) => {\n            return node[prop](\n              ...args.map(i => {\n                if (typeof i === 'function') {\n                  return (child, index) => i(child.toProxy(), index)\n                } else {\n                  return i\n                }\n              })\n            )\n          }\n        } else if (prop === 'every' || prop === 'some') {\n          return cb => {\n            return node[prop]((child, ...other) =>\n              cb(child.toProxy(), ...other)\n            )\n          }\n        } else if (prop === 'root') {\n          return () => node.root().toProxy()\n        } else if (prop === 'nodes') {\n          return node.nodes.map(i => i.toProxy())\n        } else if (prop === 'first' || prop === 'last') {\n          return node[prop].toProxy()\n        } else {\n          return node[prop]\n        }\n      },\n\n      set(node, prop, value) {\n        if (node[prop] === value) return true\n        node[prop] = value\n        if (prop === 'name' || prop === 'params' || prop === 'selector') {\n          node.markDirty()\n        }\n        return true\n      }\n    }\n  }\n\n  index(child) {\n    if (typeof child === 'number') return child\n    if (child.proxyOf) child = child.proxyOf\n    return this.proxyOf.nodes.indexOf(child)\n  }\n\n  insertAfter(exist, add) {\n    let existIndex = this.index(exist)\n    let nodes = this.normalize(add, this.proxyOf.nodes[existIndex]).reverse()\n    existIndex = this.index(exist)\n    for (let node of nodes) this.proxyOf.nodes.splice(existIndex + 1, 0, node)\n\n    let index\n    for (let id in this.indexes) {\n      index = this.indexes[id]\n      if (existIndex < index) {\n        this.indexes[id] = index + nodes.length\n      }\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  insertBefore(exist, add) {\n    let existIndex = this.index(exist)\n    let type = existIndex === 0 ? 'prepend' : false\n    let nodes = this.normalize(\n      add,\n      this.proxyOf.nodes[existIndex],\n      type\n    ).reverse()\n    existIndex = this.index(exist)\n    for (let node of nodes) this.proxyOf.nodes.splice(existIndex, 0, node)\n\n    let index\n    for (let id in this.indexes) {\n      index = this.indexes[id]\n      if (existIndex <= index) {\n        this.indexes[id] = index + nodes.length\n      }\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  normalize(nodes, sample) {\n    if (typeof nodes === 'string') {\n      nodes = cleanSource(parse(nodes).nodes)\n    } else if (typeof nodes === 'undefined') {\n      nodes = []\n    } else if (Array.isArray(nodes)) {\n      nodes = nodes.slice(0)\n      for (let i of nodes) {\n        if (i.parent) i.parent.removeChild(i, 'ignore')\n      }\n    } else if (nodes.type === 'root' && this.type !== 'document') {\n      nodes = nodes.nodes.slice(0)\n      for (let i of nodes) {\n        if (i.parent) i.parent.removeChild(i, 'ignore')\n      }\n    } else if (nodes.type) {\n      nodes = [nodes]\n    } else if (nodes.prop) {\n      if (typeof nodes.value === 'undefined') {\n        throw new Error('Value field is missed in node creation')\n      } else if (typeof nodes.value !== 'string') {\n        nodes.value = String(nodes.value)\n      }\n      nodes = [new Declaration(nodes)]\n    } else if (nodes.selector || nodes.selectors) {\n      nodes = [new Rule(nodes)]\n    } else if (nodes.name) {\n      nodes = [new AtRule(nodes)]\n    } else if (nodes.text) {\n      nodes = [new Comment(nodes)]\n    } else {\n      throw new Error('Unknown node type in node creation')\n    }\n\n    let processed = nodes.map(i => {\n      /* c8 ignore next */\n      if (!i[my]) Container.rebuild(i)\n      i = i.proxyOf\n      if (i.parent) i.parent.removeChild(i)\n      if (i[isClean]) markTreeDirty(i)\n\n      if (!i.raws) i.raws = {}\n      if (typeof i.raws.before === 'undefined') {\n        if (sample && typeof sample.raws.before !== 'undefined') {\n          i.raws.before = sample.raws.before.replace(/\\S/g, '')\n        }\n      }\n      i.parent = this.proxyOf\n      return i\n    })\n\n    return processed\n  }\n\n  prepend(...children) {\n    children = children.reverse()\n    for (let child of children) {\n      let nodes = this.normalize(child, this.first, 'prepend').reverse()\n      for (let node of nodes) this.proxyOf.nodes.unshift(node)\n      for (let id in this.indexes) {\n        this.indexes[id] = this.indexes[id] + nodes.length\n      }\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  push(child) {\n    child.parent = this\n    this.proxyOf.nodes.push(child)\n    return this\n  }\n\n  removeAll() {\n    for (let node of this.proxyOf.nodes) node.parent = undefined\n    this.proxyOf.nodes = []\n\n    this.markDirty()\n\n    return this\n  }\n\n  removeChild(child) {\n    child = this.index(child)\n    this.proxyOf.nodes[child].parent = undefined\n    this.proxyOf.nodes.splice(child, 1)\n\n    let index\n    for (let id in this.indexes) {\n      index = this.indexes[id]\n      if (index >= child) {\n        this.indexes[id] = index - 1\n      }\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  replaceValues(pattern, opts, callback) {\n    if (!callback) {\n      callback = opts\n      opts = {}\n    }\n\n    this.walkDecls(decl => {\n      if (opts.props && !opts.props.includes(decl.prop)) return\n      if (opts.fast && !decl.value.includes(opts.fast)) return\n\n      decl.value = decl.value.replace(pattern, callback)\n    })\n\n    this.markDirty()\n\n    return this\n  }\n\n  some(condition) {\n    return this.nodes.some(condition)\n  }\n\n  walk(callback) {\n    if (!this.proxyOf.nodes) return undefined\n\n    // An explicit stack instead of recursive `each()` calls to survive\n    // deeply nested trees. Each frame keeps a live `indexes` slot, so\n    // insertion and removal during the walk behave like `each()`: the\n    // slot stays at the current child until its subtree is finished.\n    let stack = [{ iterator: this.getIterator(), node: this.proxyOf }]\n\n    while (stack.length > 0) {\n      let { iterator, node } = stack[stack.length - 1]\n      let index = node.indexes[iterator]\n\n      if (index >= node.proxyOf.nodes.length) {\n        delete node.indexes[iterator]\n        stack.pop()\n        let parent = stack[stack.length - 1]\n        // Finish the parent’s step for the child subtree we just left\n        if (parent) parent.node.indexes[parent.iterator] += 1\n        continue\n      }\n\n      let child = node.proxyOf.nodes[index]\n      let result\n      try {\n        result = callback(child, index)\n      } catch (e) {\n        throw child.addToError(e)\n      }\n      if (result === false) {\n        for (let opened of stack) {\n          delete opened.node.indexes[opened.iterator]\n        }\n        return false\n      }\n      if (child.walk && child.proxyOf.nodes) {\n        stack.push({ iterator: child.getIterator(), node: child })\n      } else {\n        node.indexes[iterator] += 1\n      }\n    }\n\n    return undefined\n  }\n\n  walkAtRules(name, callback) {\n    if (!callback) {\n      callback = name\n      return this.walk((child, i) => {\n        if (child.type === 'atrule') {\n          return callback(child, i)\n        }\n      })\n    }\n    if (name instanceof RegExp) {\n      return this.walk((child, i) => {\n        if (child.type === 'atrule' && name.test(child.name)) {\n          return callback(child, i)\n        }\n      })\n    }\n    return this.walk((child, i) => {\n      if (child.type === 'atrule' && child.name === name) {\n        return callback(child, i)\n      }\n    })\n  }\n\n  walkComments(callback) {\n    return this.walk((child, i) => {\n      if (child.type === 'comment') {\n        return callback(child, i)\n      }\n    })\n  }\n\n  walkDecls(prop, callback) {\n    if (!callback) {\n      callback = prop\n      return this.walk((child, i) => {\n        if (child.type === 'decl') {\n          return callback(child, i)\n        }\n      })\n    }\n    if (prop instanceof RegExp) {\n      return this.walk((child, i) => {\n        if (child.type === 'decl' && prop.test(child.prop)) {\n          return callback(child, i)\n        }\n      })\n    }\n    return this.walk((child, i) => {\n      if (child.type === 'decl' && child.prop === prop) {\n        return callback(child, i)\n      }\n    })\n  }\n\n  walkRules(selector, callback) {\n    if (!callback) {\n      callback = selector\n\n      return this.walk((child, i) => {\n        if (child.type === 'rule') {\n          return callback(child, i)\n        }\n      })\n    }\n    if (selector instanceof RegExp) {\n      return this.walk((child, i) => {\n        if (child.type === 'rule' && selector.test(child.selector)) {\n          return callback(child, i)\n        }\n      })\n    }\n    return this.walk((child, i) => {\n      if (child.type === 'rule' && child.selector === selector) {\n        return callback(child, i)\n      }\n    })\n  }\n}\n\nContainer.registerParse = dependant => {\n  parse = dependant\n}\n\nContainer.registerRule = dependant => {\n  Rule = dependant\n}\n\nContainer.registerAtRule = dependant => {\n  AtRule = dependant\n}\n\nContainer.registerRoot = dependant => {\n  Root = dependant\n}\n\nmodule.exports = Container\nContainer.default = Container\n\n/* c8 ignore start */\nContainer.rebuild = node => {\n  let stack = [node]\n  while (stack.length > 0) {\n    let next = stack.pop()\n    if (next.type === 'atrule') {\n      Object.setPrototypeOf(next, AtRule.prototype)\n    } else if (next.type === 'rule') {\n      Object.setPrototypeOf(next, Rule.prototype)\n    } else if (next.type === 'decl') {\n      Object.setPrototypeOf(next, Declaration.prototype)\n    } else if (next.type === 'comment') {\n      Object.setPrototypeOf(next, Comment.prototype)\n    } else if (next.type === 'root') {\n      Object.setPrototypeOf(next, Root.prototype)\n    }\n\n    next[my] = true\n\n    if (next.nodes) {\n      for (let child of next.nodes) stack.push(child)\n    }\n  }\n}\n/* c8 ignore stop */\n","'use strict'\n\nlet Container = require('./container')\n\nclass AtRule extends Container {\n  constructor(defaults) {\n    super(defaults)\n    this.type = 'atrule'\n  }\n\n  append(...children) {\n    if (!this.proxyOf.nodes) this.nodes = []\n    return super.append(...children)\n  }\n\n  prepend(...children) {\n    if (!this.proxyOf.nodes) this.nodes = []\n    return super.prepend(...children)\n  }\n}\n\nmodule.exports = AtRule\nAtRule.default = AtRule\n\nContainer.registerAtRule(AtRule)\n","'use strict'\n\nlet Container = require('./container')\n\nlet LazyResult, Processor\n\nclass Document extends Container {\n  constructor(defaults) {\n    // type needs to be passed to super, otherwise child roots won't be normalized correctly\n    super({ type: 'document', ...defaults })\n\n    if (!this.nodes) {\n      this.nodes = []\n    }\n  }\n\n  toResult(opts = {}) {\n    let lazy = new LazyResult(new Processor(), this, opts)\n\n    return lazy.stringify()\n  }\n}\n\nDocument.registerLazyResult = dependant => {\n  LazyResult = dependant\n}\n\nDocument.registerProcessor = dependant => {\n  Processor = dependant\n}\n\nmodule.exports = Document\nDocument.default = Document\n","let urlAlphabet =\n  'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n\nlet customAlphabet = (alphabet, defaultSize = 21) => {\n  return (size = defaultSize) => {\n    let id = ''\n    let i = size | 0\n    while (i-- > 0) {\n      id += alphabet[(Math.random() * alphabet.length) | 0]\n    }\n    return id\n  }\n}\n\nlet nanoid = (size = 21) => {\n  let id = ''\n  let i = size | 0\n  while (i-- > 0) {\n    id += urlAlphabet[(Math.random() * 64) | 0]\n  }\n  return id\n}\n\nmodule.exports = { nanoid, customAlphabet }\n","'use strict'\n\nlet { existsSync, readFileSync, realpathSync } = require('fs')\nlet { dirname, isAbsolute, join, relative, sep } = require('path')\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\n\nfunction realPath(path) {\n  try {\n    return realpathSync(path)\n  } catch {\n    // Missing or dangling: keep the literal path. The existsSync() check below\n    // still gates the read, and a path that does not exist cannot escape.\n    return path\n  }\n}\n\nfunction fromBase64(str) {\n  if (Buffer) {\n    return Buffer.from(str, 'base64').toString()\n  } else {\n    /* c8 ignore next 2 */\n    return window.atob(str)\n  }\n}\n\nclass PreviousMap {\n  constructor(css, opts) {\n    if (opts.map === false) return\n    if (opts.unsafeMap) this.unsafeMap = true\n    this.loadAnnotation(css)\n    this.inline = this.startWith(this.annotation, 'data:')\n\n    let prev = opts.map ? opts.map.prev : undefined\n    let text = this.loadMap(opts.from, prev)\n    if (!this.mapFile && opts.from) {\n      this.mapFile = opts.from\n    }\n    if (this.mapFile) this.root = dirname(this.mapFile)\n    if (text) this.text = text\n  }\n\n  consumer() {\n    if (!this.consumerCache) {\n      this.consumerCache = new SourceMapConsumer(this.json || this.text)\n    }\n    return this.consumerCache\n  }\n\n  decodeInline(text) {\n    let baseCharsetUri = /^data:application\\/json;charset=utf-?8;base64,/\n    let baseUri = /^data:application\\/json;base64,/\n    let charsetUri = /^data:application\\/json;charset=utf-?8,/\n    let uri = /^data:application\\/json,/\n\n    let uriMatch = text.match(charsetUri) || text.match(uri)\n    if (uriMatch) {\n      return decodeURIComponent(text.substr(uriMatch[0].length))\n    }\n\n    let baseUriMatch = text.match(baseCharsetUri) || text.match(baseUri)\n    if (baseUriMatch) {\n      return fromBase64(text.substr(baseUriMatch[0].length))\n    }\n\n    let encoding = text.slice('data:application/json;'.length)\n    encoding = encoding.slice(0, encoding.indexOf(','))\n    throw new Error('Unsupported source map encoding ' + encoding)\n  }\n\n  getAnnotationURL(sourceMapString) {\n    return sourceMapString.replace(/^\\/\\*\\s*# sourceMappingURL=/, '').trim()\n  }\n\n  isMap(map) {\n    if (typeof map !== 'object') return false\n    return (\n      typeof map.mappings === 'string' ||\n      typeof map._mappings === 'string' ||\n      Array.isArray(map.sections)\n    )\n  }\n\n  loadAnnotation(css) {\n    let comments = css.match(/\\/\\*\\s*# sourceMappingURL=/g)\n    if (!comments) return\n\n    // sourceMappingURLs from comments, strings, etc.\n    let start = css.lastIndexOf(comments.pop())\n    let end = css.indexOf('*/', start)\n\n    if (start > -1 && end > -1) {\n      // Locate the last sourceMappingURL to avoid pickin\n      this.annotation = this.getAnnotationURL(css.substring(start, end))\n    }\n  }\n\n  loadFile(path, cssFile, trusted) {\n    if (!trusted && !this.unsafeMap) {\n      if (!/\\.map$/i.test(path)) return undefined\n      if (!cssFile) return undefined\n\n      // Compare *resolved* paths: relative() is textual, so without this a\n      // symlink at or below the CSS file's directory points the map outside it.\n      let rel = relative(realPath(dirname(cssFile)), realPath(path))\n      if (rel === '..' || rel.startsWith('..' + sep) || isAbsolute(rel)) {\n        return undefined\n      }\n    }\n    this.root = dirname(path)\n    if (existsSync(path)) {\n      this.mapFile = path\n      return readFileSync(path, 'utf-8').toString().trim()\n    }\n  }\n\n  loadMap(file, prev) {\n    if (prev === false) return false\n\n    if (prev) {\n      if (typeof prev === 'string') {\n        return prev\n      } else if (typeof prev === 'function') {\n        let prevPath = prev(file)\n        if (prevPath) {\n          let map = this.loadFile(prevPath, file, true)\n          if (!map) {\n            throw new Error(\n              'Unable to load previous source map: ' + prevPath.toString()\n            )\n          }\n          return map\n        }\n      } else if (prev instanceof SourceMapConsumer) {\n        return SourceMapGenerator.fromSourceMap(prev).toString()\n      } else if (prev instanceof SourceMapGenerator) {\n        return prev.toString()\n      } else if (this.isMap(prev)) {\n        return JSON.stringify(prev)\n      } else {\n        throw new Error(\n          'Unsupported previous source map format: ' + prev.toString()\n        )\n      }\n    } else if (this.inline) {\n      return this.decodeInline(this.annotation)\n    } else if (this.annotation) {\n      let map = this.annotation\n      if (file) map = join(dirname(file), map)\n      let unknown = this.loadFile(map, file, false)\n      if (unknown) {\n        try {\n          /* c8 ignore next 4 */\n          this.json = JSON.parse(unknown.replace(/^\\)]}'[^\\n]*\\n/, ''))\n        } catch {\n          return undefined\n        }\n      }\n      return unknown\n    }\n  }\n\n  startWith(string, start) {\n    if (!string) return false\n    return string.substr(0, start.length) === start\n  }\n\n  withContent() {\n    return !!(\n      this.consumer().sourcesContent &&\n      this.consumer().sourcesContent.length > 0\n    )\n  }\n}\n\nmodule.exports = PreviousMap\nPreviousMap.default = PreviousMap\n","'use strict'\n\nlet { nanoid } = require('nanoid/non-secure')\nlet { isAbsolute, resolve } = require('path')\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\nlet { fileURLToPath, pathToFileURL } = require('url')\n\nlet CssSyntaxError = require('./css-syntax-error')\nlet PreviousMap = require('./previous-map')\nlet terminalHighlight = require('./terminal-highlight')\n\nlet lineToIndexCache = Symbol('lineToIndexCache')\n\nlet sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator)\nlet pathAvailable = Boolean(resolve && isAbsolute)\n\nfunction getLineToIndex(input) {\n  if (input[lineToIndexCache]) return input[lineToIndexCache]\n  let lines = input.css.split('\\n')\n  let lineToIndex = new Array(lines.length)\n  let prevIndex = 0\n\n  for (let i = 0, l = lines.length; i < l; i++) {\n    lineToIndex[i] = prevIndex\n    prevIndex += lines[i].length + 1\n  }\n\n  input[lineToIndexCache] = lineToIndex\n  return lineToIndex\n}\n\nclass Input {\n  get from() {\n    return this.file || this.id\n  }\n\n  constructor(css, opts = {}) {\n    if (\n      css === null ||\n      typeof css === 'undefined' ||\n      (typeof css === 'object' && !css.toString)\n    ) {\n      throw new Error(`PostCSS received ${css} instead of CSS string`)\n    }\n\n    this.css = css.toString()\n\n    if (this.css[0] === '\\uFEFF' || this.css[0] === '\\uFFFE') {\n      this.hasBOM = true\n      this.css = this.css.slice(1)\n    } else {\n      this.hasBOM = false\n    }\n\n    this.document = this.css\n    if (opts.document) this.document = opts.document.toString()\n\n    if (opts.from) {\n      if (\n        !pathAvailable ||\n        /^\\w+:\\/\\//.test(opts.from) ||\n        isAbsolute(opts.from)\n      ) {\n        this.file = opts.from\n      } else {\n        this.file = resolve(opts.from)\n      }\n    }\n\n    if (pathAvailable && sourceMapAvailable) {\n      let map = new PreviousMap(this.css, opts)\n      if (map.text) {\n        this.map = map\n        let file = map.consumer().file\n        if (!this.file && file) this.file = this.mapResolve(file)\n      }\n    }\n\n    if (!this.file) {\n      this.id = '<input css ' + nanoid(6) + '>'\n    }\n    if (this.map) this.map.file = this.from\n  }\n\n  error(message, line, column, opts = {}) {\n    let endColumn, endLine, endOffset, offset, result\n\n    if (line && typeof line === 'object') {\n      let start = line\n      let end = column\n      if (typeof start.offset === 'number') {\n        offset = start.offset\n        let pos = this.fromOffset(offset)\n        line = pos.line\n        column = pos.col\n      } else {\n        line = start.line\n        column = start.column\n        offset = this.fromLineAndColumn(line, column)\n      }\n      if (typeof end.offset === 'number') {\n        endOffset = end.offset\n        let pos = this.fromOffset(endOffset)\n        endLine = pos.line\n        endColumn = pos.col\n      } else {\n        endLine = end.line\n        endColumn = end.column\n        endOffset = this.fromLineAndColumn(end.line, end.column)\n      }\n    } else if (!column) {\n      offset = line\n      let pos = this.fromOffset(offset)\n      line = pos.line\n      column = pos.col\n    } else {\n      offset = this.fromLineAndColumn(line, column)\n    }\n\n    let origin = this.origin(line, column, endLine, endColumn)\n    if (origin) {\n      result = new CssSyntaxError(\n        message,\n        origin.endLine === undefined\n          ? origin.line\n          : { column: origin.column, line: origin.line },\n        origin.endLine === undefined\n          ? origin.column\n          : { column: origin.endColumn, line: origin.endLine },\n        origin.source,\n        origin.file,\n        opts.plugin\n      )\n    } else {\n      result = new CssSyntaxError(\n        message,\n        endLine === undefined ? line : { column, line },\n        endLine === undefined ? column : { column: endColumn, line: endLine },\n        this.css,\n        this.file,\n        opts.plugin\n      )\n    }\n\n    result.input = {\n      column,\n      endColumn,\n      endLine,\n      endOffset,\n      line,\n      offset,\n      source: this.css\n    }\n    if (this.file) {\n      if (pathToFileURL) {\n        result.input.url = pathToFileURL(this.file).toString()\n      }\n      result.input.file = this.file\n    }\n\n    return result\n  }\n\n  fromLineAndColumn(line, column) {\n    let lineToIndex = getLineToIndex(this)\n    let index = lineToIndex[line - 1]\n    return index + column - 1\n  }\n\n  fromOffset(offset) {\n    let lineToIndex = getLineToIndex(this)\n    let lastLine = lineToIndex[lineToIndex.length - 1]\n\n    let min = 0\n    if (offset >= lastLine) {\n      min = lineToIndex.length - 1\n    } else {\n      let max = lineToIndex.length - 2\n      let mid\n      while (min < max) {\n        mid = min + ((max - min) >> 1)\n        if (offset < lineToIndex[mid]) {\n          max = mid - 1\n        } else if (offset >= lineToIndex[mid + 1]) {\n          min = mid + 1\n        } else {\n          min = mid\n          break\n        }\n      }\n    }\n    return {\n      col: offset - lineToIndex[min] + 1,\n      line: min + 1\n    }\n  }\n\n  mapResolve(file) {\n    if (/^\\w+:\\/\\//.test(file)) {\n      return file\n    }\n    return resolve(this.map.consumer().sourceRoot || this.map.root || '.', file)\n  }\n\n  origin(line, column, endLine, endColumn) {\n    if (!this.map) return false\n    let consumer = this.map.consumer()\n\n    let from = consumer.originalPositionFor({ column: column - 1, line })\n    if (!from.source) return false\n\n    let to\n    if (typeof endLine === 'number') {\n      let toPosition = consumer.originalPositionFor({\n        column: endColumn - 1,\n        line: endLine\n      })\n      // The source map may not have a mapping that covers the end position\n      // (`originalPositionFor()` then returns `null` for `line`/`column`\n      // instead of omitting them). Treat that the same as not requesting\n      // an end position at all, so `endLine`/`endColumn` stay a consistent\n      // `undefined` pair instead of a mix of `null` and a bogus number.\n      if (toPosition.source) to = toPosition\n    }\n\n    let fromUrl\n\n    if (isAbsolute(from.source)) {\n      fromUrl = pathToFileURL(from.source)\n    } else {\n      fromUrl = new URL(\n        from.source,\n        this.map.consumer().sourceRoot || pathToFileURL(this.map.mapFile)\n      )\n    }\n\n    let result = {\n      column: from.column + 1,\n      endColumn: to && to.column + 1,\n      endLine: to && to.line,\n      line: from.line,\n      url: fromUrl.toString()\n    }\n\n    if (fromUrl.protocol === 'file:') {\n      if (fileURLToPath) {\n        result.file = fileURLToPath(fromUrl)\n      } else {\n        /* c8 ignore next 2 */\n        throw new Error(`file: protocol is not available in this PostCSS build`)\n      }\n    }\n\n    let source = consumer.sourceContentFor(from.source)\n    if (source) result.source = source\n\n    return result\n  }\n\n  toJSON() {\n    let json = {}\n    for (let name of ['hasBOM', 'css', 'file', 'id']) {\n      if (this[name] != null) {\n        json[name] = this[name]\n      }\n    }\n    if (this.map) {\n      json.map = { ...this.map }\n      if (json.map.consumerCache) {\n        json.map.consumerCache = undefined\n      }\n    }\n    return json\n  }\n}\n\nmodule.exports = Input\nInput.default = Input\n\nif (terminalHighlight && terminalHighlight.registerInput) {\n  terminalHighlight.registerInput(Input)\n}\n","'use strict'\n\nlet Container = require('./container')\n\nlet LazyResult, Processor\n\nclass Root extends Container {\n  constructor(defaults) {\n    super(defaults)\n    this.type = 'root'\n    if (!this.nodes) this.nodes = []\n  }\n\n  normalize(child, sample, type) {\n    let keepBefore = new Set()\n    for (let node of Array.isArray(child) ? child : [child]) {\n      if (\n        node &&\n        typeof node === 'object' &&\n        !node.parent &&\n        node.raws &&\n        typeof node.raws.before !== 'undefined'\n      ) {\n        keepBefore.add(node.raws)\n      }\n    }\n\n    let nodes = super.normalize(child)\n\n    if (sample) {\n      if (type === 'prepend') {\n        if (this.nodes.length > 1) {\n          sample.raws.before = this.nodes[1].raws.before\n        } else {\n          delete sample.raws.before\n        }\n      } else if (this.first !== sample) {\n        for (let node of nodes) {\n          if (!keepBefore.has(node.raws)) {\n            node.raws.before = sample.raws.before\n          }\n        }\n      }\n    }\n\n    return nodes\n  }\n\n  removeChild(child, ignore) {\n    let index = this.index(child)\n\n    if (!ignore && index === 0 && this.nodes.length > 1) {\n      this.nodes[1].raws.before = this.nodes[index].raws.before\n    }\n\n    return super.removeChild(child)\n  }\n\n  toResult(opts = {}) {\n    let lazy = new LazyResult(new Processor(), this, opts)\n    return lazy.stringify()\n  }\n}\n\nRoot.registerLazyResult = dependant => {\n  LazyResult = dependant\n}\n\nRoot.registerProcessor = dependant => {\n  Processor = dependant\n}\n\nmodule.exports = Root\nRoot.default = Root\n\nContainer.registerRoot(Root)\n","'use strict'\n\nlet list = {\n  comma(string) {\n    return list.split(string, [','], true)\n  },\n\n  space(string) {\n    let spaces = [' ', '\\n', '\\t']\n    return list.split(string, spaces)\n  },\n\n  split(string, separators, last) {\n    if (typeof string !== 'string') return []\n    let array = []\n    let current = ''\n    let split = false\n\n    let func = 0\n    let inQuote = false\n    let prevQuote = ''\n    let escape = false\n    let inComment = false\n\n    for (let i = 0; i < string.length; i++) {\n      let letter = string[i]\n\n      if (inComment) {\n        current += letter\n        if (letter === '*' && string[i + 1] === '/') {\n          current += '/'\n          i += 1\n          inComment = false\n        }\n        continue\n      }\n\n      if (escape) {\n        escape = false\n      } else if (letter === '\\\\') {\n        escape = true\n      } else if (inQuote) {\n        if (letter === prevQuote) {\n          inQuote = false\n        }\n      } else if (letter === '\"' || letter === \"'\") {\n        inQuote = true\n        prevQuote = letter\n      } else if (letter === '/' && string[i + 1] === '*') {\n        current += '/*'\n        i += 1\n        inComment = true\n        continue\n      } else if (letter === '(') {\n        func += 1\n      } else if (letter === ')') {\n        if (func > 0) func -= 1\n      } else if (func === 0) {\n        if (separators.includes(letter)) split = true\n      }\n\n      if (split) {\n        let value = current.trim()\n        if (last || value !== '') array.push(value)\n        current = ''\n        split = false\n      } else {\n        current += letter\n      }\n    }\n\n    let value = current.trim()\n    if (last || value !== '') array.push(value)\n    return array\n  }\n}\n\nmodule.exports = list\nlist.default = list\n","'use strict'\n\nlet Container = require('./container')\nlet list = require('./list')\n\nclass Rule extends Container {\n  get selectors() {\n    return list.comma(this.selector)\n  }\n\n  set selectors(values) {\n    let match = this.selector ? this.selector.match(/,\\s*/) : null\n    let sep = match ? match[0] : ',' + this.raw('between', 'beforeOpen')\n    this.selector = values.join(sep)\n  }\n\n  constructor(defaults) {\n    super(defaults)\n    this.type = 'rule'\n    if (!this.nodes) this.nodes = []\n  }\n}\n\nmodule.exports = Rule\nRule.default = Rule\n\nContainer.registerRule(Rule)\n","'use strict'\n\nlet AtRule = require('./at-rule')\nlet Comment = require('./comment')\nlet Declaration = require('./declaration')\nlet Input = require('./input')\nlet PreviousMap = require('./previous-map')\nlet Root = require('./root')\nlet Rule = require('./rule')\n\nfunction hydrateInputs(json, inputs) {\n  if (!json.inputs) return inputs\n  return json.inputs.map(input => {\n    let inputHydrated = { ...input, __proto__: Input.prototype }\n    if (inputHydrated.map) {\n      inputHydrated.map = {\n        ...inputHydrated.map,\n        __proto__: PreviousMap.prototype\n      }\n    }\n    return inputHydrated\n  })\n}\n\nfunction constructNode(json, inputs, children) {\n  let defaults = { ...json }\n  delete defaults.inputs\n  delete defaults.nodes\n  if (defaults.source) {\n    let { inputId, ...source } = defaults.source\n    defaults.source = source\n    if (inputId != null) {\n      defaults.source.input = inputs[inputId]\n    }\n  }\n\n  let node\n  if (defaults.type === 'root') {\n    node = new Root(defaults)\n  } else if (defaults.type === 'decl') {\n    node = new Declaration(defaults)\n  } else if (defaults.type === 'rule') {\n    node = new Rule(defaults)\n  } else if (defaults.type === 'comment') {\n    node = new Comment(defaults)\n  } else if (defaults.type === 'atrule') {\n    node = new AtRule(defaults)\n  } else {\n    throw new Error('Unknown node type: ' + json.type)\n  }\n\n  // Rehydrated children are attached after construction. Passing them\n  // through the container constructor would re-run insertion spacing\n  // normalization and overwrite each child's own `raws.before`.\n  if (children) {\n    node.nodes = children\n    for (let child of children) child.parent = node\n  }\n\n  return node\n}\n\nfunction fromJSON(json, inputs) {\n  if (Array.isArray(json)) return json.map(n => fromJSON(n))\n\n  // An explicit stack instead of recursive calls to survive deeply\n  // nested trees. Children are rehydrated before their parent node\n  // is constructed.\n  let result\n  let stack = [\n    { childIndex: 0, children: [], inputs: hydrateInputs(json, inputs), json }\n  ]\n\n  while (stack.length > 0) {\n    let frame = stack[stack.length - 1]\n    let jsonNodes = frame.json.nodes\n\n    if (jsonNodes && frame.childIndex < jsonNodes.length) {\n      let childJson = jsonNodes[frame.childIndex]\n      frame.childIndex += 1\n      stack.push({\n        childIndex: 0,\n        children: [],\n        inputs: hydrateInputs(childJson, frame.inputs),\n        json: childJson\n      })\n      continue\n    }\n\n    stack.pop()\n    let node = constructNode(\n      frame.json,\n      frame.inputs,\n      jsonNodes ? frame.children : undefined\n    )\n    if (stack.length > 0) {\n      stack[stack.length - 1].children.push(node)\n    } else {\n      result = node\n    }\n  }\n\n  return result\n}\n\nmodule.exports = fromJSON\nfromJSON.default = fromJSON\n","'use strict'\n\nlet { dirname, relative, resolve, sep } = require('path')\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\nlet { pathToFileURL } = require('url')\n\nlet Input = require('./input')\n\nlet sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator)\nlet pathAvailable = Boolean(dirname && resolve && relative && sep)\n\nclass MapGenerator {\n  constructor(stringify, root, opts, cssString) {\n    this.stringify = stringify\n    this.mapOpts = opts.map || {}\n    this.root = root\n    this.opts = opts\n    this.css = cssString\n    this.originalCSS = cssString\n    this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute\n\n    this.memoizedFileURLs = new Map()\n    this.memoizedPaths = new Map()\n    this.memoizedURLs = new Map()\n  }\n\n  addAnnotation() {\n    let content\n\n    if (this.isInline()) {\n      content =\n        'data:application/json;base64,' + this.toBase64(this.map.toString())\n    } else if (typeof this.mapOpts.annotation === 'string') {\n      content = this.mapOpts.annotation\n    } else if (typeof this.mapOpts.annotation === 'function') {\n      content = this.mapOpts.annotation(this.opts.to, this.root)\n    } else {\n      content = this.outputFile() + '.map'\n    }\n    let eol = '\\n'\n    if (this.css.includes('\\r\\n')) eol = '\\r\\n'\n\n    this.css += eol + '/*# sourceMappingURL=' + content + ' */'\n  }\n\n  applyPrevMaps() {\n    for (let prev of this.previous()) {\n      let from = this.toUrl(this.path(prev.file))\n      let root = prev.root || dirname(prev.file)\n      let map\n\n      if (this.mapOpts.sourcesContent === false) {\n        map = new SourceMapConsumer(prev.text)\n        if (map.sourcesContent) {\n          map.sourcesContent = null\n        }\n      } else {\n        map = prev.consumer()\n      }\n\n      this.map.applySourceMap(map, from, this.toUrl(this.path(root)))\n    }\n  }\n\n  clearAnnotation() {\n    if (this.mapOpts.annotation === false) return\n\n    if (this.root) {\n      let node\n      for (let i = this.root.nodes.length - 1; i >= 0; i--) {\n        node = this.root.nodes[i]\n        if (node.type !== 'comment') continue\n        if (node.text.startsWith('# sourceMappingURL=')) {\n          this.root.removeChild(i)\n        }\n      }\n    } else if (this.css) {\n      // Single forward pass. Removing every annotation from the whole\n      // string separately would be O(n^2) on many annotations.\n      let annotation = '/*# sourceMappingURL='\n      let css = ''\n      let cursor = 0\n      let startIndex\n      while ((startIndex = this.css.indexOf(annotation, cursor)) !== -1) {\n        let endIndex = this.css.indexOf('*/', startIndex + annotation.length)\n        if (endIndex === -1) break\n        while (startIndex > cursor && this.css[startIndex - 1] === '\\n') {\n          startIndex--\n        }\n        css += this.css.slice(cursor, startIndex)\n        cursor = endIndex + 2\n      }\n      if (cursor > 0) this.css = css + this.css.slice(cursor)\n    }\n  }\n\n  generate() {\n    this.clearAnnotation()\n    if (pathAvailable && sourceMapAvailable && this.isMap()) {\n      return this.generateMap()\n    } else {\n      let result = ''\n      this.stringify(this.root, i => {\n        result += i\n      })\n      return [result]\n    }\n  }\n\n  generateMap() {\n    if (this.root) {\n      this.generateString()\n    } else if (this.previous().length === 1) {\n      let prev = this.previous()[0].consumer()\n      prev.file = this.outputFile()\n      this.map = SourceMapGenerator.fromSourceMap(prev, {\n        ignoreInvalidMapping: true\n      })\n    } else {\n      this.map = new SourceMapGenerator({\n        file: this.outputFile(),\n        ignoreInvalidMapping: true\n      })\n      this.map.addMapping({\n        generated: { column: 0, line: 1 },\n        original: { column: 0, line: 1 },\n        source: this.opts.from\n          ? this.toUrl(this.path(this.opts.from))\n          : '<no source>'\n      })\n    }\n\n    if (this.isSourcesContent()) this.setSourcesContent()\n    if (this.root && this.previous().length > 0) this.applyPrevMaps()\n    if (this.isAnnotation()) this.addAnnotation()\n\n    if (this.isInline()) {\n      return [this.css]\n    } else {\n      return [this.css, this.map]\n    }\n  }\n\n  generateString() {\n    this.css = ''\n    this.map = new SourceMapGenerator({\n      file: this.outputFile(),\n      ignoreInvalidMapping: true\n    })\n\n    let line = 1\n    let column = 1\n\n    let noSource = '<no source>'\n    let mapping = {\n      generated: { column: 0, line: 0 },\n      original: { column: 0, line: 0 },\n      source: ''\n    }\n\n    let last, lines\n    this.stringify(this.root, (str, node, type) => {\n      this.css += str\n\n      if (node && type !== 'end') {\n        mapping.generated.line = line\n        mapping.generated.column = column - 1\n        if (node.source && node.source.start) {\n          mapping.source = this.sourcePath(node)\n          mapping.original.line = node.source.start.line\n          mapping.original.column = node.source.start.column - 1\n          this.map.addMapping(mapping)\n        } else {\n          mapping.source = noSource\n          mapping.original.line = 1\n          mapping.original.column = 0\n          this.map.addMapping(mapping)\n        }\n      }\n\n      lines = str.match(/\\n/g)\n      if (lines) {\n        line += lines.length\n        last = str.lastIndexOf('\\n')\n        column = str.length - last\n      } else {\n        column += str.length\n      }\n\n      if (node && type !== 'start') {\n        let p = node.parent || { raws: {} }\n        let childless =\n          node.type === 'decl' || (node.type === 'atrule' && !node.nodes)\n        if (!childless || node !== p.last || p.raws.semicolon) {\n          if (node.source && node.source.end) {\n            mapping.source = this.sourcePath(node)\n            mapping.original.line = node.source.end.line\n            mapping.original.column = node.source.end.column - 1\n            mapping.generated.line = line\n            mapping.generated.column = column - 2\n            this.map.addMapping(mapping)\n          } else {\n            mapping.source = noSource\n            mapping.original.line = 1\n            mapping.original.column = 0\n            mapping.generated.line = line\n            mapping.generated.column = column - 1\n            this.map.addMapping(mapping)\n          }\n        }\n      }\n    })\n  }\n\n  isAnnotation() {\n    if (this.isInline()) {\n      return true\n    }\n    if (typeof this.mapOpts.annotation !== 'undefined') {\n      return this.mapOpts.annotation\n    }\n    if (this.previous().length) {\n      return this.previous().some(i => i.annotation)\n    }\n    return true\n  }\n\n  isInline() {\n    if (typeof this.mapOpts.inline !== 'undefined') {\n      return this.mapOpts.inline\n    }\n\n    let annotation = this.mapOpts.annotation\n    if (typeof annotation !== 'undefined' && annotation !== true) {\n      return false\n    }\n\n    if (this.previous().length) {\n      return this.previous().some(i => i.inline)\n    }\n    return true\n  }\n\n  isMap() {\n    if (typeof this.opts.map !== 'undefined') {\n      return !!this.opts.map\n    }\n    return this.previous().length > 0\n  }\n\n  isSourcesContent() {\n    if (typeof this.mapOpts.sourcesContent !== 'undefined') {\n      return this.mapOpts.sourcesContent\n    }\n    if (this.previous().length) {\n      return this.previous().some(i => i.withContent())\n    }\n    return true\n  }\n\n  outputFile() {\n    if (this.opts.to) {\n      return this.path(this.opts.to)\n    } else if (this.opts.from) {\n      return this.path(this.opts.from)\n    } else {\n      return 'to.css'\n    }\n  }\n\n  path(file) {\n    if (this.mapOpts.absolute) return file\n    if (file.charCodeAt(0) === 60 /* `<` */) return file\n    if (/^\\w+:\\/\\//.test(file)) return file\n    let cached = this.memoizedPaths.get(file)\n    if (cached) return cached\n\n    let from = this.opts.to ? dirname(this.opts.to) : '.'\n\n    if (typeof this.mapOpts.annotation === 'string') {\n      from = dirname(resolve(from, this.mapOpts.annotation))\n    }\n\n    let path = relative(from, file)\n    this.memoizedPaths.set(file, path)\n\n    return path\n  }\n\n  previous() {\n    if (!this.previousMaps) {\n      this.previousMaps = []\n      if (this.root) {\n        this.root.walk(node => {\n          if (node.source && node.source.input.map) {\n            let map = node.source.input.map\n            if (!this.previousMaps.includes(map)) {\n              this.previousMaps.push(map)\n            }\n          }\n        })\n      } else {\n        let input = new Input(this.originalCSS, this.opts)\n        if (input.map) this.previousMaps.push(input.map)\n      }\n    }\n\n    return this.previousMaps\n  }\n\n  setSourcesContent() {\n    let already = {}\n    if (this.root) {\n      this.root.walk(node => {\n        if (node.source) {\n          let from = node.source.input.from\n          if (from && !already[from]) {\n            already[from] = true\n            let fromUrl = this.usesFileUrls\n              ? this.toFileUrl(from)\n              : this.toUrl(this.path(from))\n            this.map.setSourceContent(fromUrl, node.source.input.css)\n          }\n        }\n      })\n    } else if (this.css) {\n      let from = this.opts.from\n        ? this.toUrl(this.path(this.opts.from))\n        : '<no source>'\n      this.map.setSourceContent(from, this.css)\n    }\n  }\n\n  sourcePath(node) {\n    if (this.mapOpts.from) {\n      return this.toUrl(this.mapOpts.from)\n    } else if (this.usesFileUrls) {\n      return this.toFileUrl(node.source.input.from)\n    } else {\n      return this.toUrl(this.path(node.source.input.from))\n    }\n  }\n\n  toBase64(str) {\n    if (Buffer) {\n      return Buffer.from(str).toString('base64')\n    } else {\n      return window.btoa(unescape(encodeURIComponent(str)))\n    }\n  }\n\n  toFileUrl(path) {\n    let cached = this.memoizedFileURLs.get(path)\n    if (cached) return cached\n\n    if (pathToFileURL) {\n      let fileURL = pathToFileURL(path).toString()\n      this.memoizedFileURLs.set(path, fileURL)\n\n      return fileURL\n    } else {\n      throw new Error(\n        '`map.absolute` option is not available in this PostCSS build'\n      )\n    }\n  }\n\n  toUrl(path) {\n    let cached = this.memoizedURLs.get(path)\n    if (cached) return cached\n\n    if (sep === '\\\\') {\n      path = path.replace(/\\\\/g, '/')\n    }\n\n    let url = encodeURI(path).replace(/[#?]/g, encodeURIComponent)\n    this.memoizedURLs.set(path, url)\n\n    return url\n  }\n}\n\nmodule.exports = MapGenerator\n","'use strict'\n\nconst SINGLE_QUOTE = \"'\".charCodeAt(0)\nconst DOUBLE_QUOTE = '\"'.charCodeAt(0)\nconst BACKSLASH = '\\\\'.charCodeAt(0)\nconst SLASH = '/'.charCodeAt(0)\nconst NEWLINE = '\\n'.charCodeAt(0)\nconst SPACE = ' '.charCodeAt(0)\nconst FEED = '\\f'.charCodeAt(0)\nconst TAB = '\\t'.charCodeAt(0)\nconst CR = '\\r'.charCodeAt(0)\nconst OPEN_SQUARE = '['.charCodeAt(0)\nconst CLOSE_SQUARE = ']'.charCodeAt(0)\nconst OPEN_PARENTHESES = '('.charCodeAt(0)\nconst CLOSE_PARENTHESES = ')'.charCodeAt(0)\nconst OPEN_CURLY = '{'.charCodeAt(0)\nconst CLOSE_CURLY = '}'.charCodeAt(0)\nconst SEMICOLON = ';'.charCodeAt(0)\nconst ASTERISK = '*'.charCodeAt(0)\nconst COLON = ':'.charCodeAt(0)\nconst AT = '@'.charCodeAt(0)\n\nconst RE_AT_END = /[\\t\\n\\f\\r \"#'()/;[\\\\\\]{}]/g\nconst RE_WORD_END = /[\\t\\n\\f\\r !\"#'():;@[\\\\\\]{}]|\\/(?=\\*)/g\nconst RE_BAD_BRACKET = /.[\\r\\n\"'(/\\\\]/\nconst RE_HEX_ESCAPE = /[\\da-f]/i\n\nmodule.exports = function tokenizer(input, options = {}) {\n  let css = input.css.valueOf()\n  let ignore = options.ignoreErrors\n\n  let code, content, escape, next, quote\n  let currentToken, escaped, escapePos, n, prev\n\n  let length = css.length\n  let pos = 0\n  let buffer = []\n  let returned = []\n  let lastBadParen = -1\n\n  function position() {\n    return pos\n  }\n\n  function unclosed(what) {\n    throw input.error('Unclosed ' + what, pos)\n  }\n\n  function endOfFile() {\n    return returned.length === 0 && pos >= length\n  }\n\n  function nextToken(opts) {\n    if (returned.length) return returned.pop()\n    if (pos >= length) return\n\n    let ignoreUnclosed = opts ? opts.ignoreUnclosed : false\n\n    code = css.charCodeAt(pos)\n\n    switch (code) {\n      case NEWLINE:\n      case SPACE:\n      case TAB:\n      case CR:\n      case FEED: {\n        next = pos\n        do {\n          next += 1\n          code = css.charCodeAt(next)\n        } while (\n          code === SPACE ||\n          code === NEWLINE ||\n          code === TAB ||\n          code === CR ||\n          code === FEED\n        )\n\n        currentToken = ['space', css.slice(pos, next)]\n        pos = next - 1\n        break\n      }\n\n      case OPEN_SQUARE:\n      case CLOSE_SQUARE:\n      case OPEN_CURLY:\n      case CLOSE_CURLY:\n      case COLON:\n      case SEMICOLON:\n      case CLOSE_PARENTHESES: {\n        let controlChar = String.fromCharCode(code)\n        currentToken = [controlChar, controlChar, pos]\n        break\n      }\n\n      case OPEN_PARENTHESES: {\n        prev = buffer.length ? buffer.pop()[1] : ''\n        n = css.charCodeAt(pos + 1)\n        if (\n          prev === 'url' &&\n          n !== SINGLE_QUOTE &&\n          n !== DOUBLE_QUOTE &&\n          n !== SPACE &&\n          n !== NEWLINE &&\n          n !== TAB &&\n          n !== FEED &&\n          n !== CR\n        ) {\n          next = pos\n          do {\n            escaped = false\n            next = css.indexOf(')', next + 1)\n            if (next === -1) {\n              if (ignore || ignoreUnclosed) {\n                next = pos\n                break\n              } else {\n                unclosed('bracket')\n              }\n            }\n            escapePos = next\n            while (css.charCodeAt(escapePos - 1) === BACKSLASH) {\n              escapePos -= 1\n              escaped = !escaped\n            }\n          } while (escaped)\n\n          currentToken = ['brackets', css.slice(pos, next + 1), pos, next]\n\n          pos = next\n        } else if (pos <= lastBadParen) {\n          currentToken = ['(', '(', pos]\n        } else {\n          next = css.indexOf(')', pos + 1)\n          content = css.slice(pos, next + 1)\n\n          if (next === -1 || RE_BAD_BRACKET.test(content)) {\n            lastBadParen = next === -1 ? length : next\n            currentToken = ['(', '(', pos]\n          } else {\n            currentToken = ['brackets', content, pos, next]\n            pos = next\n          }\n        }\n\n        break\n      }\n\n      case SINGLE_QUOTE:\n      case DOUBLE_QUOTE: {\n        quote = code === SINGLE_QUOTE ? \"'\" : '\"'\n        next = pos\n        do {\n          escaped = false\n          next = css.indexOf(quote, next + 1)\n          if (next === -1) {\n            if (ignore || ignoreUnclosed) {\n              next = pos + 1\n              break\n            } else {\n              unclosed('string')\n            }\n          }\n          escapePos = next\n          while (css.charCodeAt(escapePos - 1) === BACKSLASH) {\n            escapePos -= 1\n            escaped = !escaped\n          }\n        } while (escaped)\n\n        currentToken = ['string', css.slice(pos, next + 1), pos, next]\n        pos = next\n        break\n      }\n\n      case AT: {\n        RE_AT_END.lastIndex = pos + 1\n        RE_AT_END.test(css)\n        if (RE_AT_END.lastIndex === 0) {\n          next = css.length - 1\n        } else {\n          next = RE_AT_END.lastIndex - 2\n        }\n\n        currentToken = ['at-word', css.slice(pos, next + 1), pos, next]\n\n        pos = next\n        break\n      }\n\n      case BACKSLASH: {\n        next = pos\n        escape = true\n        while (css.charCodeAt(next + 1) === BACKSLASH) {\n          next += 1\n          escape = !escape\n        }\n        code = css.charCodeAt(next + 1)\n        if (\n          escape &&\n          code !== SLASH &&\n          code !== SPACE &&\n          code !== NEWLINE &&\n          code !== TAB &&\n          code !== CR &&\n          code !== FEED\n        ) {\n          next += 1\n          if (RE_HEX_ESCAPE.test(css.charAt(next))) {\n            while (RE_HEX_ESCAPE.test(css.charAt(next + 1))) {\n              next += 1\n            }\n            if (css.charCodeAt(next + 1) === SPACE) {\n              next += 1\n            }\n          }\n        }\n\n        currentToken = ['word', css.slice(pos, next + 1), pos, next]\n\n        pos = next\n        break\n      }\n\n      default: {\n        if (code === SLASH && css.charCodeAt(pos + 1) === ASTERISK) {\n          next = css.indexOf('*/', pos + 2) + 1\n          if (next === 0) {\n            if (ignore || ignoreUnclosed) {\n              next = css.length\n            } else {\n              unclosed('comment')\n            }\n          }\n\n          currentToken = ['comment', css.slice(pos, next + 1), pos, next]\n          pos = next\n        } else {\n          RE_WORD_END.lastIndex = pos + 1\n          RE_WORD_END.test(css)\n          if (RE_WORD_END.lastIndex === 0) {\n            next = css.length - 1\n          } else {\n            next = RE_WORD_END.lastIndex - 2\n          }\n\n          currentToken = ['word', css.slice(pos, next + 1), pos, next]\n          buffer.push(currentToken)\n          pos = next\n        }\n\n        break\n      }\n    }\n\n    pos++\n    return currentToken\n  }\n\n  function back(token) {\n    returned.push(token)\n  }\n\n  return {\n    back,\n    endOfFile,\n    nextToken,\n    position\n  }\n}\n","'use strict'\n\nlet AtRule = require('./at-rule')\nlet Comment = require('./comment')\nlet Declaration = require('./declaration')\nlet Root = require('./root')\nlet Rule = require('./rule')\nlet tokenizer = require('./tokenize')\n\nconst SAFE_COMMENT_NEIGHBOR = {\n  empty: true,\n  space: true\n}\n\nfunction findLastWithPosition(tokens) {\n  for (let i = tokens.length - 1; i >= 0; i--) {\n    let token = tokens[i]\n    let pos = token[3] || token[2]\n    if (pos) return pos\n  }\n}\n\nfunction tokensToString(tokens, from, to) {\n  let result = ''\n  for (let i = from; i < to; i++) result += tokens[i][1]\n  return result\n}\n\nclass Parser {\n  constructor(input) {\n    this.input = input\n\n    this.root = new Root()\n    this.current = this.root\n    this.spaces = ''\n    this.semicolon = false\n\n    this.createTokenizer()\n    this.root.source = { input, start: { column: 1, line: 1, offset: 0 } }\n  }\n\n  atrule(token) {\n    let node = new AtRule()\n    node.name = token[1].slice(1)\n    if (node.name === '') {\n      this.unnamedAtrule(node, token)\n    }\n    this.init(node, token[2])\n\n    let type\n    let prev\n    let shift\n    let last = false\n    let open = false\n    let params = []\n    let brackets = []\n\n    while (!this.tokenizer.endOfFile()) {\n      token = this.tokenizer.nextToken()\n      type = token[0]\n\n      if (type === '(' || type === '[') {\n        brackets.push(type === '(' ? ')' : ']')\n      } else if (type === '{' && brackets.length > 0) {\n        brackets.push('}')\n      } else if (type === brackets[brackets.length - 1]) {\n        brackets.pop()\n      }\n\n      if (brackets.length === 0) {\n        if (type === ';') {\n          node.source.end = this.getPosition(token[2])\n          node.source.end.offset++\n          this.semicolon = true\n          break\n        } else if (type === '{') {\n          open = true\n          break\n        } else if (type === '}') {\n          if (params.length > 0) {\n            shift = params.length - 1\n            prev = params[shift]\n            while (prev && prev[0] === 'space') {\n              prev = params[--shift]\n            }\n            if (prev) {\n              node.source.end = this.getPosition(prev[3] || prev[2])\n              node.source.end.offset++\n            }\n          }\n          this.end(token)\n          break\n        } else {\n          params.push(token)\n        }\n      } else {\n        params.push(token)\n      }\n\n      if (this.tokenizer.endOfFile()) {\n        last = true\n        break\n      }\n    }\n\n    node.raws.between = this.spacesAndCommentsFromEnd(params)\n    if (params.length) {\n      node.raws.afterName = this.spacesAndCommentsFromStart(params)\n      this.raw(node, 'params', params)\n      if (last) {\n        token = params[params.length - 1]\n        node.source.end = this.getPosition(token[3] || token[2])\n        node.source.end.offset++\n        this.spaces = node.raws.between\n        node.raws.between = ''\n      }\n    } else {\n      node.raws.afterName = ''\n      node.params = ''\n    }\n\n    if (open) {\n      node.nodes = []\n      this.current = node\n    }\n  }\n\n  checkMissedSemicolon(tokens) {\n    let colon = this.colon(tokens)\n    if (colon === false) return\n\n    let founded = 0\n    let token\n    for (let j = colon - 1; j >= 0; j--) {\n      token = tokens[j]\n      if (token[0] !== 'space') {\n        founded += 1\n        if (founded === 2) break\n      }\n    }\n    // If the token is a word, e.g. `!important`, `red` or any other valid\n    // property's value. Then we need to return the colon after that word\n    // token. [3] is the \"end\" colon of that word. And because we need it\n    // after that one we do +1 to get the next one.\n    throw this.input.error(\n      'Missed semicolon',\n      token[0] === 'word' ? token[3] + 1 : token[2]\n    )\n  }\n\n  colon(tokens) {\n    let brackets = 0\n    let prev, token, type\n    for (let [i, element] of tokens.entries()) {\n      token = element\n      type = token[0]\n\n      if (type === '(') {\n        brackets += 1\n      }\n      if (type === ')') {\n        brackets -= 1\n      }\n      if (brackets === 0 && type === ':') {\n        if (!prev) {\n          this.doubleColon(token)\n        } else if (prev[0] === 'word' && prev[1] === 'progid') {\n          continue\n        } else {\n          return i\n        }\n      }\n\n      prev = token\n    }\n    return false\n  }\n\n  comment(token) {\n    let node = new Comment()\n    this.init(node, token[2])\n    node.source.end = this.getPosition(token[3] || token[2])\n    node.source.end.offset++\n\n    let text = token[1].slice(2, -2)\n    if (!text.trim()) {\n      node.text = ''\n      node.raws.left = text\n      node.raws.right = ''\n    } else {\n      let match = text.match(/^(\\s*)([^]*\\S)(\\s*)$/)\n      node.text = match[2]\n      node.raws.left = match[1]\n      node.raws.right = match[3]\n    }\n  }\n\n  createTokenizer() {\n    this.tokenizer = tokenizer(this.input)\n  }\n\n  decl(tokens, customProperty) {\n    let node = new Declaration()\n    this.init(node, tokens[0][2])\n\n    let last = tokens[tokens.length - 1]\n    if (last[0] === ';') {\n      this.semicolon = true\n      tokens.pop()\n    }\n\n    node.source.end = this.getPosition(\n      last[3] || last[2] || findLastWithPosition(tokens)\n    )\n    node.source.end.offset++\n\n    let start = 0\n    while (tokens[start][0] !== 'word') {\n      if (start === tokens.length - 1) this.unknownWord([tokens[start]])\n      start++\n    }\n    node.raws.before += tokensToString(tokens, 0, start)\n    node.source.start = this.getPosition(tokens[start][2])\n\n    let propStart = start\n    while (start < tokens.length) {\n      let type = tokens[start][0]\n      if (type === ':' || type === 'space' || type === 'comment') {\n        break\n      }\n      start++\n    }\n    node.prop = tokensToString(tokens, propStart, start)\n\n    let betweenStart = start\n    let token\n    while (start < tokens.length) {\n      token = tokens[start]\n      start++\n      if (token[0] === ':') break\n      if (token[0] === 'word' && /\\w/.test(token[1])) {\n        this.unknownWord([token])\n      }\n    }\n    node.raws.between = tokensToString(tokens, betweenStart, start)\n\n    if (node.prop[0] === '_' || node.prop[0] === '*') {\n      node.raws.before += node.prop[0]\n      node.prop = node.prop.slice(1)\n    }\n\n    let firstSpacesStart = start\n    while (start < tokens.length) {\n      let next = tokens[start][0]\n      if (next !== 'space' && next !== 'comment') break\n      start++\n    }\n    let firstSpaces = tokens.slice(firstSpacesStart, start)\n\n    tokens = tokens.slice(start)\n\n    this.precheckMissedSemicolon(tokens)\n\n    for (let i = tokens.length - 1; i >= 0; i--) {\n      token = tokens[i]\n      if (token[1].toLowerCase() === '!important') {\n        node.important = true\n        let string = this.stringFrom(tokens, i)\n        string = this.spacesFromEnd(tokens) + string\n        if (string !== ' !important') node.raws.important = string\n        break\n      } else if (token[1].toLowerCase() === 'important') {\n        let cache = tokens.slice(0)\n        let str = ''\n        for (let j = i; j > 0; j--) {\n          let type = cache[j][0]\n          if (str.trim().startsWith('!') && type !== 'space') {\n            break\n          }\n          str = cache.pop()[1] + str\n        }\n        if (str.trim().startsWith('!')) {\n          node.important = true\n          node.raws.important = str\n          tokens = cache\n        }\n      }\n\n      if (token[0] !== 'space' && token[0] !== 'comment') {\n        break\n      }\n    }\n\n    let hasWord = tokens.some(i => i[0] !== 'space' && i[0] !== 'comment')\n\n    if (hasWord) {\n      node.raws.between += firstSpaces.map(i => i[1]).join('')\n      firstSpaces = []\n    }\n    this.raw(node, 'value', firstSpaces.concat(tokens), customProperty)\n\n    if (node.value.includes(':') && !customProperty) {\n      this.checkMissedSemicolon(tokens)\n    }\n  }\n\n  doubleColon(token) {\n    throw this.input.error(\n      'Double colon',\n      { offset: token[2] },\n      { offset: token[2] + token[1].length }\n    )\n  }\n\n  emptyRule(token) {\n    let node = new Rule()\n    this.init(node, token[2])\n    node.selector = ''\n    node.raws.between = ''\n    this.current = node\n  }\n\n  end(token) {\n    if (this.current.nodes && this.current.nodes.length) {\n      this.current.raws.semicolon = this.semicolon\n    }\n    this.semicolon = false\n\n    this.current.raws.after = (this.current.raws.after || '') + this.spaces\n    this.spaces = ''\n\n    if (this.current.parent) {\n      this.current.source.end = this.getPosition(token[2])\n      this.current.source.end.offset++\n      this.current = this.current.parent\n    } else {\n      this.unexpectedClose(token)\n    }\n  }\n\n  endFile() {\n    if (this.current.parent) this.unclosedBlock()\n    if (this.current.nodes && this.current.nodes.length) {\n      this.current.raws.semicolon = this.semicolon\n    }\n    this.current.raws.after = (this.current.raws.after || '') + this.spaces\n    this.root.source.end = this.getPosition(this.tokenizer.position())\n  }\n\n  freeSemicolon(token) {\n    this.spaces += token[1]\n    if (this.current.nodes) {\n      let prev = this.current.nodes[this.current.nodes.length - 1]\n      if (prev && prev.type === 'rule' && !prev.raws.ownSemicolon) {\n        prev.raws.ownSemicolon = this.spaces\n        this.spaces = ''\n        // `ownSemicolon` also holds the spaces before the semicolon, but\n        // the position above is the semicolon itself, so the node ends\n        // right after it.\n        prev.source.end = this.getPosition(token[2])\n        prev.source.end.offset++\n      }\n    }\n  }\n\n  // Helpers\n\n  getPosition(offset) {\n    let pos = this.input.fromOffset(offset)\n    return {\n      column: pos.col,\n      line: pos.line,\n      offset\n    }\n  }\n\n  init(node, offset) {\n    this.current.push(node)\n    node.source = {\n      input: this.input,\n      start: this.getPosition(offset)\n    }\n    node.raws.before = this.spaces\n    this.spaces = ''\n    if (node.type !== 'comment') this.semicolon = false\n  }\n\n  other(start) {\n    let end = false\n    let type = null\n    let colon = false\n    let bracket = null\n    let brackets = []\n    let customProperty = start[1].startsWith('--')\n\n    let tokens = []\n    let token = start\n    while (token) {\n      type = token[0]\n      tokens.push(token)\n\n      if (type === '(' || type === '[') {\n        if (!bracket) bracket = token\n        brackets.push(type === '(' ? ')' : ']')\n      } else if (customProperty && colon && type === '{') {\n        if (!bracket) bracket = token\n        brackets.push('}')\n      } else if (brackets.length === 0) {\n        if (type === ';') {\n          if (colon) {\n            this.decl(tokens, customProperty)\n            return\n          } else {\n            break\n          }\n        } else if (type === '{') {\n          this.rule(tokens)\n          return\n        } else if (type === '}') {\n          this.tokenizer.back(tokens.pop())\n          end = true\n          break\n        } else if (type === ':') {\n          colon = true\n        }\n      } else if (type === brackets[brackets.length - 1]) {\n        brackets.pop()\n        if (brackets.length === 0) bracket = null\n      }\n\n      token = this.tokenizer.nextToken()\n    }\n\n    if (this.tokenizer.endOfFile()) end = true\n    if (brackets.length > 0) this.unclosedBracket(bracket)\n\n    if (end && colon) {\n      if (!customProperty) {\n        while (tokens.length) {\n          token = tokens[tokens.length - 1][0]\n          if (token !== 'space' && token !== 'comment') break\n          this.tokenizer.back(tokens.pop())\n        }\n      }\n      this.decl(tokens, customProperty)\n    } else {\n      this.unknownWord(tokens)\n    }\n  }\n\n  parse() {\n    let token\n    while (!this.tokenizer.endOfFile()) {\n      token = this.tokenizer.nextToken()\n\n      switch (token[0]) {\n        case 'space':\n          this.spaces += token[1]\n          break\n\n        case ';':\n          this.freeSemicolon(token)\n          break\n\n        case '}':\n          this.end(token)\n          break\n\n        case 'comment':\n          this.comment(token)\n          break\n\n        case 'at-word':\n          this.atrule(token)\n          break\n\n        case '{':\n          this.emptyRule(token)\n          break\n\n        default:\n          this.other(token)\n          break\n      }\n    }\n    this.endFile()\n  }\n\n  precheckMissedSemicolon(/* tokens */) {\n    // Hook for Safe Parser\n  }\n\n  raw(node, prop, tokens, customProperty) {\n    let token, type\n    let length = tokens.length\n    let value = ''\n    // Last character of `value`. Reading it from `value` would flatten\n    // the string concatenation on every comment and make parsing O(n^2).\n    let last = ''\n    let clean = true\n    let next, prev\n\n    for (let i = 0; i < length; i += 1) {\n      token = tokens[i]\n      type = token[0]\n      if (type === 'space' && i === length - 1 && !customProperty) {\n        clean = false\n      } else if (type === 'comment') {\n        prev = tokens[i - 1] ? tokens[i - 1][0] : 'empty'\n        next = tokens[i + 1] ? tokens[i + 1][0] : 'empty'\n        if (!SAFE_COMMENT_NEIGHBOR[prev] && !SAFE_COMMENT_NEIGHBOR[next]) {\n          if (last === ',') {\n            clean = false\n          } else {\n            value += token[1]\n            last = token[1].slice(-1)\n          }\n        } else {\n          clean = false\n        }\n      } else {\n        value += token[1]\n        last = token[1].slice(-1)\n      }\n    }\n    if (!clean) {\n      let raw = tokens.reduce((all, i) => all + i[1], '')\n      node.raws[prop] = { raw, value }\n    }\n    node[prop] = value\n  }\n\n  rule(tokens) {\n    tokens.pop()\n\n    let node = new Rule()\n    this.init(node, tokens[0][2])\n\n    node.raws.between = this.spacesAndCommentsFromEnd(tokens)\n    this.raw(node, 'selector', tokens)\n    this.current = node\n  }\n\n  spacesAndCommentsFromEnd(tokens) {\n    let lastTokenType\n    let spaces = ''\n    while (tokens.length) {\n      lastTokenType = tokens[tokens.length - 1][0]\n      if (lastTokenType !== 'space' && lastTokenType !== 'comment') break\n      spaces = tokens.pop()[1] + spaces\n    }\n    return spaces\n  }\n\n  // Errors\n\n  spacesAndCommentsFromStart(tokens) {\n    let next\n    let spaces = ''\n    while (tokens.length) {\n      next = tokens[0][0]\n      if (next !== 'space' && next !== 'comment') break\n      spaces += tokens.shift()[1]\n    }\n    return spaces\n  }\n\n  spacesFromEnd(tokens) {\n    let lastTokenType\n    let spaces = ''\n    while (tokens.length) {\n      lastTokenType = tokens[tokens.length - 1][0]\n      if (lastTokenType !== 'space') break\n      spaces = tokens.pop()[1] + spaces\n    }\n    return spaces\n  }\n\n  stringFrom(tokens, from) {\n    let result = ''\n    for (let i = from; i < tokens.length; i++) {\n      result += tokens[i][1]\n    }\n    tokens.splice(from, tokens.length - from)\n    return result\n  }\n\n  unclosedBlock() {\n    let pos = this.current.source.start\n    throw this.input.error('Unclosed block', pos.line, pos.column)\n  }\n\n  unclosedBracket(bracket) {\n    throw this.input.error(\n      'Unclosed bracket',\n      { offset: bracket[2] },\n      { offset: bracket[2] + 1 }\n    )\n  }\n\n  unexpectedClose(token) {\n    throw this.input.error(\n      'Unexpected }',\n      { offset: token[2] },\n      { offset: token[2] + 1 }\n    )\n  }\n\n  unknownWord(tokens) {\n    throw this.input.error(\n      'Unknown word ' + tokens[0][1],\n      { offset: tokens[0][2] },\n      { offset: tokens[0][2] + tokens[0][1].length }\n    )\n  }\n\n  unnamedAtrule(node, token) {\n    throw this.input.error(\n      'At-rule without name',\n      { offset: token[2] },\n      { offset: token[2] + token[1].length }\n    )\n  }\n}\n\nmodule.exports = Parser\n","'use strict'\n\nlet Container = require('./container')\nlet Input = require('./input')\nlet Parser = require('./parser')\n\nfunction parse(css, opts) {\n  let input = new Input(css, opts)\n  let parser = new Parser(input)\n  try {\n    parser.parse()\n  } catch (e) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (e.name === 'CssSyntaxError' && opts && opts.from) {\n        if (/\\.scss$/i.test(opts.from)) {\n          e.message +=\n            '\\nYou tried to parse SCSS with ' +\n            'the standard CSS parser; ' +\n            'try again with the postcss-scss parser'\n        } else if (/\\.sass/i.test(opts.from)) {\n          e.message +=\n            '\\nYou tried to parse Sass with ' +\n            'the standard CSS parser; ' +\n            'try again with the postcss-sass parser'\n        } else if (/\\.less$/i.test(opts.from)) {\n          e.message +=\n            '\\nYou tried to parse Less with ' +\n            'the standard CSS parser; ' +\n            'try again with the postcss-less parser'\n        }\n      }\n    }\n    throw e\n  }\n\n  return parser.root\n}\n\nmodule.exports = parse\nparse.default = parse\n\nContainer.registerParse(parse)\n","'use strict'\n\nlet Container = require('./container')\nlet { my } = require('./symbols')\n\nclass Warning {\n  constructor(text, opts = {}) {\n    this.type = 'warning'\n    this.text = text\n\n    if (opts.node && opts.node.source) {\n      if (!opts.node[my]) {\n        // The node comes from another PostCSS copy in node_modules, so it does\n        // not have this copy’s methods. Container#normalize() rebuilds such\n        // nodes on insert, but a node passed straight to Result#warn() never\n        // goes through it.\n        Container.rebuild(opts.node)\n      }\n      let range = opts.node.rangeBy(opts)\n      this.line = range.start.line\n      this.column = range.start.column\n      this.endLine = range.end.line\n      this.endColumn = range.end.column\n    }\n\n    for (let opt in opts) this[opt] = opts[opt]\n  }\n\n  toString() {\n    if (this.node) {\n      return this.node.error(this.text, {\n        index: this.index,\n        plugin: this.plugin,\n        word: this.word\n      }).message\n    }\n\n    if (this.plugin) {\n      return this.plugin + ': ' + this.text\n    }\n\n    return this.text\n  }\n}\n\nmodule.exports = Warning\nWarning.default = Warning\n","'use strict'\n\nlet Warning = require('./warning')\n\nclass Result {\n  get content() {\n    return this.css\n  }\n\n  constructor(processor, root, opts) {\n    this.processor = processor\n    this.messages = []\n    this.root = root\n    this.opts = opts\n    this.css = ''\n    this.map = undefined\n  }\n\n  toString() {\n    return this.css\n  }\n\n  warn(text, opts = {}) {\n    if (!opts.plugin) {\n      if (this.lastPlugin && this.lastPlugin.postcssPlugin) {\n        opts.plugin = this.lastPlugin.postcssPlugin\n      }\n    }\n\n    let warning = new Warning(text, opts)\n    this.messages.push(warning)\n\n    return warning\n  }\n\n  warnings() {\n    return this.messages.filter(i => i.type === 'warning')\n  }\n}\n\nmodule.exports = Result\nResult.default = Result\n","'use strict'\n\nlet Container = require('./container')\nlet Document = require('./document')\nlet MapGenerator = require('./map-generator')\nlet parse = require('./parse')\nlet Result = require('./result')\nlet Root = require('./root')\nlet stringify = require('./stringify')\nlet { isClean, my } = require('./symbols')\nlet warnOnce = require('./warn-once')\n\nconst TYPE_TO_CLASS_NAME = {\n  atrule: 'AtRule',\n  comment: 'Comment',\n  decl: 'Declaration',\n  document: 'Document',\n  root: 'Root',\n  rule: 'Rule'\n}\n\nconst PLUGIN_PROPS = {\n  AtRule: true,\n  AtRuleExit: true,\n  Comment: true,\n  CommentExit: true,\n  Declaration: true,\n  DeclarationExit: true,\n  Document: true,\n  DocumentExit: true,\n  Once: true,\n  OnceExit: true,\n  postcssPlugin: true,\n  prepare: true,\n  Root: true,\n  RootExit: true,\n  Rule: true,\n  RuleExit: true\n}\n\nconst NOT_VISITORS = {\n  Once: true,\n  postcssPlugin: true,\n  prepare: true\n}\n\nconst CHILDREN = 0\n\nfunction isPromise(obj) {\n  return typeof obj === 'object' && typeof obj.then === 'function'\n}\n\nfunction getEvents(node) {\n  let key = false\n  let type = TYPE_TO_CLASS_NAME[node.type]\n  if (node.type === 'decl') {\n    key = node.prop.toLowerCase()\n  } else if (node.type === 'atrule') {\n    key = node.name.toLowerCase()\n  }\n\n  if (key && node.append) {\n    return [\n      type,\n      type + '-' + key,\n      CHILDREN,\n      type + 'Exit',\n      type + 'Exit-' + key\n    ]\n  } else if (key) {\n    return [type, type + '-' + key, type + 'Exit', type + 'Exit-' + key]\n  } else if (node.append) {\n    return [type, CHILDREN, type + 'Exit']\n  } else {\n    return [type, type + 'Exit']\n  }\n}\n\nfunction toStack(node) {\n  let events\n  if (node.type === 'document') {\n    events = ['Document', CHILDREN, 'DocumentExit']\n  } else if (node.type === 'root') {\n    events = ['Root', CHILDREN, 'RootExit']\n  } else {\n    events = getEvents(node)\n  }\n\n  return {\n    eventIndex: 0,\n    events,\n    iterator: 0,\n    node,\n    visitorIndex: 0,\n    visitors: []\n  }\n}\n\nfunction cleanMarks(node) {\n  let stack = [node]\n  while (stack.length > 0) {\n    let next = stack.pop()\n    next[isClean] = false\n    if (next.nodes) {\n      for (let i of next.nodes) stack.push(i)\n    }\n  }\n  return node\n}\n\nlet postcss = {}\n\nclass LazyResult {\n  get content() {\n    return this.stringify().content\n  }\n\n  get css() {\n    return this.stringify().css\n  }\n\n  get map() {\n    return this.stringify().map\n  }\n\n  get messages() {\n    return this.sync().messages\n  }\n\n  get opts() {\n    return this.result.opts\n  }\n\n  get processor() {\n    return this.result.processor\n  }\n\n  get root() {\n    return this.sync().root\n  }\n\n  get [Symbol.toStringTag]() {\n    return 'LazyResult'\n  }\n\n  constructor(processor, css, opts) {\n    this.stringified = false\n    this.processed = false\n\n    let root\n    if (\n      typeof css === 'object' &&\n      css !== null &&\n      (css.type === 'root' || css.type === 'document')\n    ) {\n      root = cleanMarks(css)\n    } else if (css instanceof LazyResult || css instanceof Result) {\n      root = cleanMarks(css.root)\n      if (css.map) {\n        if (typeof opts.map === 'undefined') opts.map = {}\n        if (!opts.map.inline) opts.map.inline = false\n        opts.map.prev = css.map\n      }\n    } else {\n      let parser = parse\n      if (opts.syntax) parser = opts.syntax.parse\n      if (opts.parser) parser = opts.parser\n      if (parser.parse) parser = parser.parse\n\n      try {\n        root = parser(css, opts)\n      } catch (error) {\n        this.processed = true\n        this.error = error\n      }\n\n      if (root && !root[my]) {\n        /* c8 ignore next 2 */\n        Container.rebuild(root)\n      }\n    }\n\n    this.result = new Result(processor, root, opts)\n    this.helpers = { ...postcss, postcss, result: this.result }\n    this.plugins = this.processor.plugins.map(plugin => {\n      if (typeof plugin === 'object' && plugin.prepare) {\n        return { ...plugin, ...plugin.prepare(this.result) }\n      } else {\n        return plugin\n      }\n    })\n  }\n\n  async() {\n    if (this.error) return Promise.reject(this.error)\n    if (this.processed) return Promise.resolve(this.result)\n    if (!this.processing) {\n      this.processing = this.runAsync()\n    }\n    return this.processing\n  }\n\n  catch(onRejected) {\n    return this.async().catch(onRejected)\n  }\n\n  finally(onFinally) {\n    return this.async().then(onFinally, onFinally)\n  }\n\n  getAsyncError() {\n    throw new Error('Use process(css).then(cb) to work with async plugins')\n  }\n\n  handleError(error, node) {\n    let plugin = this.result.lastPlugin\n    try {\n      if (node) node.addToError(error)\n      this.error = error\n      if (error.name === 'CssSyntaxError' && !error.plugin) {\n        error.plugin = plugin.postcssPlugin\n        error.setMessage()\n      } else if (plugin.postcssVersion) {\n        if (process.env.NODE_ENV !== 'production') {\n          let pluginName = plugin.postcssPlugin\n          let pluginVer = plugin.postcssVersion\n          let runtimeVer = this.result.processor.version\n          let a = pluginVer.split('.')\n          let b = runtimeVer.split('.')\n\n          if (a[0] !== b[0] || parseInt(a[1]) > parseInt(b[1])) {\n            // eslint-disable-next-line no-console\n            console.error(\n              'Unknown error from PostCSS plugin. Your current PostCSS ' +\n                'version is ' +\n                runtimeVer +\n                ', but ' +\n                pluginName +\n                ' uses ' +\n                pluginVer +\n                '. Perhaps this is the source of the error below.'\n            )\n          }\n        }\n      }\n    } catch (err) {\n      /* c8 ignore next 3 */\n      // eslint-disable-next-line no-console\n      if (console && console.error) console.error(err)\n    }\n    return error\n  }\n\n  prepareVisitors() {\n    this.listeners = {}\n    let add = (plugin, type, cb) => {\n      if (!this.listeners[type]) this.listeners[type] = []\n      this.listeners[type].push([plugin, cb])\n    }\n    for (let plugin of this.plugins) {\n      if (typeof plugin === 'object') {\n        for (let event in plugin) {\n          if (!PLUGIN_PROPS[event] && /^[A-Z]/.test(event)) {\n            throw new Error(\n              `Unknown event ${event} in ${plugin.postcssPlugin}. ` +\n                `Try to update PostCSS (${this.processor.version} now).`\n            )\n          }\n          if (!NOT_VISITORS[event]) {\n            if (typeof plugin[event] === 'object') {\n              for (let filter in plugin[event]) {\n                if (filter === '*') {\n                  add(plugin, event, plugin[event][filter])\n                } else {\n                  add(\n                    plugin,\n                    event + '-' + filter.toLowerCase(),\n                    plugin[event][filter]\n                  )\n                }\n              }\n            } else if (typeof plugin[event] === 'function') {\n              add(plugin, event, plugin[event])\n            }\n          }\n        }\n      }\n    }\n    this.hasListener = Object.keys(this.listeners).length > 0\n  }\n\n  async runAsync() {\n    this.plugin = 0\n    for (let i = 0; i < this.plugins.length; i++) {\n      let plugin = this.plugins[i]\n      let promise = this.runOnRoot(plugin)\n      if (isPromise(promise)) {\n        try {\n          await promise\n        } catch (error) {\n          throw this.handleError(error)\n        }\n      }\n    }\n\n    this.prepareVisitors()\n    if (this.hasListener) {\n      let root = this.result.root\n      while (!root[isClean]) {\n        root[isClean] = true\n        let stack = [toStack(root)]\n        while (stack.length > 0) {\n          let promise = this.visitTick(stack)\n          if (isPromise(promise)) {\n            try {\n              await promise\n            } catch (e) {\n              let node = stack[stack.length - 1].node\n              throw this.handleError(e, node)\n            }\n          }\n        }\n      }\n\n      if (this.listeners.OnceExit) {\n        for (let [plugin, visitor] of this.listeners.OnceExit) {\n          this.result.lastPlugin = plugin\n          try {\n            if (root.type === 'document') {\n              let roots = root.nodes.map(subRoot =>\n                visitor(subRoot, this.helpers)\n              )\n\n              await Promise.all(roots)\n            } else {\n              await visitor(root, this.helpers)\n            }\n          } catch (e) {\n            throw this.handleError(e)\n          }\n        }\n      }\n    }\n\n    this.processed = true\n    return this.stringify()\n  }\n\n  runOnRoot(plugin) {\n    this.result.lastPlugin = plugin\n    try {\n      if (typeof plugin === 'object' && plugin.Once) {\n        if (this.result.root.type === 'document') {\n          let roots = this.result.root.nodes.map(root =>\n            plugin.Once(root, this.helpers)\n          )\n\n          if (isPromise(roots[0])) {\n            return Promise.all(roots)\n          }\n\n          return roots\n        }\n\n        return plugin.Once(this.result.root, this.helpers)\n      } else if (typeof plugin === 'function') {\n        return plugin(this.result.root, this.result)\n      }\n    } catch (error) {\n      throw this.handleError(error)\n    }\n  }\n\n  stringify() {\n    if (this.error) throw this.error\n    if (this.stringified) return this.result\n    this.stringified = true\n\n    this.sync()\n\n    let opts = this.result.opts\n    let str = stringify\n    if (opts.syntax) str = opts.syntax.stringify\n    if (opts.stringifier) str = opts.stringifier\n    if (str.stringify) str = str.stringify\n\n    let rootSource = this.result.root.source\n    if (\n      opts.map === undefined &&\n      !(rootSource && rootSource.input && rootSource.input.map)\n    ) {\n      let result = ''\n      str(this.result.root, i => {\n        result += i\n      })\n      this.result.css = result\n      return this.result\n    }\n\n    let map = new MapGenerator(str, this.result.root, this.result.opts)\n    let data = map.generate()\n    this.result.css = data[0]\n    this.result.map = data[1]\n\n    return this.result\n  }\n\n  sync() {\n    if (this.error) throw this.error\n    if (this.processed) return this.result\n    this.processed = true\n\n    if (this.processing) {\n      throw this.getAsyncError()\n    }\n\n    for (let plugin of this.plugins) {\n      let promise = this.runOnRoot(plugin)\n      if (isPromise(promise)) {\n        throw this.getAsyncError()\n      }\n    }\n\n    this.prepareVisitors()\n    if (this.hasListener) {\n      let root = this.result.root\n      while (!root[isClean]) {\n        root[isClean] = true\n        this.walkSync(root)\n      }\n      if (this.listeners.OnceExit) {\n        if (root.type === 'document') {\n          for (let subRoot of root.nodes) {\n            this.visitSync(this.listeners.OnceExit, subRoot)\n          }\n        } else {\n          this.visitSync(this.listeners.OnceExit, root)\n        }\n      }\n    }\n\n    return this.result\n  }\n\n  then(onFulfilled, onRejected) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (!('from' in this.opts)) {\n        warnOnce(\n          'Without `from` option PostCSS could generate wrong source map ' +\n            'and will not find Browserslist config. Set it to CSS file path ' +\n            'or to `undefined` to prevent this warning.'\n        )\n      }\n    }\n    return this.async().then(onFulfilled, onRejected)\n  }\n\n  toString() {\n    return this.css\n  }\n\n  visitSync(visitors, node) {\n    for (let [plugin, visitor] of visitors) {\n      this.result.lastPlugin = plugin\n      let promise\n      try {\n        promise = visitor(node, this.helpers)\n      } catch (e) {\n        throw this.handleError(e, node.proxyOf)\n      }\n      if (node.type !== 'root' && node.type !== 'document' && !node.parent) {\n        return true\n      }\n      if (isPromise(promise)) {\n        throw this.getAsyncError()\n      }\n    }\n  }\n\n  visitTick(stack) {\n    let visit = stack[stack.length - 1]\n    let { node, visitors } = visit\n\n    if (node.type !== 'root' && node.type !== 'document' && !node.parent) {\n      stack.pop()\n      return\n    }\n\n    if (visitors.length > 0 && visit.visitorIndex < visitors.length) {\n      let [plugin, visitor] = visitors[visit.visitorIndex]\n      visit.visitorIndex += 1\n      if (visit.visitorIndex === visitors.length) {\n        visit.visitors = []\n        visit.visitorIndex = 0\n      }\n      this.result.lastPlugin = plugin\n      try {\n        return visitor(node.toProxy(), this.helpers)\n      } catch (e) {\n        throw this.handleError(e, node)\n      }\n    }\n\n    if (visit.iterator !== 0) {\n      let iterator = visit.iterator\n      // Advance past the child we just finished visiting. Like\n      // `Container#each`, the index is incremented only after a child has\n      // been fully processed, so a node inserted right after the current\n      // child is not skipped by the `existIndex < index` adjustment in\n      // `Container#insertAfter()` (which would fire exit events too early).\n      if (visit.descending) {\n        visit.descending = false\n        node.indexes[iterator] += 1\n      }\n      let child\n      while ((child = node.nodes[node.indexes[iterator]])) {\n        if (!child[isClean]) {\n          child[isClean] = true\n          visit.descending = true\n          stack.push(toStack(child))\n          return\n        }\n        node.indexes[iterator] += 1\n      }\n      visit.iterator = 0\n      delete node.indexes[iterator]\n    }\n\n    let events = visit.events\n    while (visit.eventIndex < events.length) {\n      let event = events[visit.eventIndex]\n      visit.eventIndex += 1\n      if (event === CHILDREN) {\n        if (node.nodes && node.nodes.length) {\n          node[isClean] = true\n          visit.iterator = node.getIterator()\n        }\n        return\n      } else if (this.listeners[event]) {\n        visit.visitors = this.listeners[event]\n        return\n      }\n    }\n    stack.pop()\n  }\n\n  walkSync(node) {\n    // An explicit stack like in async `visitTick()` to survive deeply\n    // nested trees. Unlike `visitTick()`, nodes are marked clean only\n    // on entering, so a node dirtied by its own visitors is revisited\n    // on the next pass.\n    node[isClean] = true\n    let stack = [{ eventIndex: 0, events: getEvents(node), iterator: 0, node }]\n\n    while (stack.length > 0) {\n      let visit = stack[stack.length - 1]\n      let visitNode = visit.node\n\n      if (visit.iterator !== 0) {\n        let iterator = visit.iterator\n        // Advance past the child we just finished visiting. Like\n        // `Container#each`, the index is incremented only after a child has\n        // been fully processed. Incrementing before (as this loop used to)\n        // makes a node inserted right after the current child get skipped by\n        // the `existIndex < index` adjustment in `Container#insertAfter()`,\n        // which fires exit events before those new siblings are visited.\n        if (visit.descending) {\n          visit.descending = false\n          visitNode.indexes[iterator] += 1\n        }\n        let child\n        let descended = false\n        while ((child = visitNode.nodes[visitNode.indexes[iterator]])) {\n          if (!child[isClean]) {\n            child[isClean] = true\n            visit.descending = true\n            stack.push({\n              eventIndex: 0,\n              events: getEvents(child),\n              iterator: 0,\n              node: child\n            })\n            descended = true\n            break\n          }\n          visitNode.indexes[iterator] += 1\n        }\n        if (descended) continue\n        visit.iterator = 0\n        delete visitNode.indexes[iterator]\n      }\n\n      if (visit.eventIndex < visit.events.length) {\n        let event = visit.events[visit.eventIndex]\n        visit.eventIndex += 1\n        if (event === CHILDREN) {\n          if (visitNode.nodes && visitNode.nodes.length) {\n            visit.iterator = visitNode.getIterator()\n          }\n        } else {\n          let visitors = this.listeners[event]\n          if (visitors) {\n            if (this.visitSync(visitors, visitNode.toProxy())) stack.pop()\n          }\n        }\n        continue\n      }\n\n      stack.pop()\n    }\n  }\n\n  warnings() {\n    return this.sync().warnings()\n  }\n}\n\nLazyResult.registerPostcss = dependant => {\n  postcss = dependant\n}\n\nmodule.exports = LazyResult\nLazyResult.default = LazyResult\n\nRoot.registerLazyResult(LazyResult)\nDocument.registerLazyResult(LazyResult)\n","'use strict'\n\nlet MapGenerator = require('./map-generator')\nlet parse = require('./parse')\nlet Result = require('./result')\nlet stringify = require('./stringify')\nlet warnOnce = require('./warn-once')\n\nclass NoWorkResult {\n  get content() {\n    return this.result.css\n  }\n\n  get css() {\n    return this.result.css\n  }\n\n  get map() {\n    return this.result.map\n  }\n\n  get messages() {\n    return []\n  }\n\n  get opts() {\n    return this.result.opts\n  }\n\n  get processor() {\n    return this.result.processor\n  }\n\n  get root() {\n    if (this._root) {\n      return this._root\n    }\n\n    let root\n    let parser = parse\n\n    try {\n      root = parser(this._css, this._opts)\n    } catch (error) {\n      this.error = error\n    }\n\n    if (this.error) {\n      throw this.error\n    } else {\n      this._root = root\n      return root\n    }\n  }\n\n  get [Symbol.toStringTag]() {\n    return 'NoWorkResult'\n  }\n\n  constructor(processor, css, opts) {\n    css = css.toString()\n    this.stringified = false\n\n    this._processor = processor\n    this._css = css\n    this._opts = opts\n    this._map = undefined\n\n    let str = stringify\n    this.result = new Result(this._processor, undefined, this._opts)\n    this.result.css = css\n\n    let self = this\n    Object.defineProperty(this.result, 'root', {\n      get() {\n        return self.root\n      }\n    })\n\n    let map = new MapGenerator(str, undefined, this._opts, css)\n    if (map.isMap()) {\n      let [generatedCSS, generatedMap] = map.generate()\n      if (generatedCSS) {\n        this.result.css = generatedCSS\n      }\n      if (generatedMap) {\n        this.result.map = generatedMap\n      }\n    } else {\n      map.clearAnnotation()\n      this.result.css = map.css\n    }\n  }\n\n  async() {\n    if (this.error) return Promise.reject(this.error)\n    return Promise.resolve(this.result)\n  }\n\n  catch(onRejected) {\n    return this.async().catch(onRejected)\n  }\n\n  finally(onFinally) {\n    return this.async().then(onFinally, onFinally)\n  }\n\n  sync() {\n    if (this.error) throw this.error\n    return this.result\n  }\n\n  then(onFulfilled, onRejected) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (!('from' in this._opts)) {\n        warnOnce(\n          'Without `from` option PostCSS could generate wrong source map ' +\n            'and will not find Browserslist config. Set it to CSS file path ' +\n            'or to `undefined` to prevent this warning.'\n        )\n      }\n    }\n\n    return this.async().then(onFulfilled, onRejected)\n  }\n\n  toString() {\n    return this._css\n  }\n\n  warnings() {\n    return []\n  }\n}\n\nmodule.exports = NoWorkResult\nNoWorkResult.default = NoWorkResult\n","'use strict'\n\nlet Document = require('./document')\nlet LazyResult = require('./lazy-result')\nlet NoWorkResult = require('./no-work-result')\nlet Root = require('./root')\n\nclass Processor {\n  constructor(plugins = []) {\n    this.version = '8.5.31'\n    this.plugins = this.normalize(plugins)\n  }\n\n  normalize(plugins) {\n    let normalized = []\n    for (let i of plugins) {\n      if (i.postcss === true) {\n        i = i()\n      } else if (i.postcss) {\n        i = i.postcss\n      }\n\n      if (typeof i === 'object' && Array.isArray(i.plugins)) {\n        normalized = normalized.concat(i.plugins)\n      } else if (typeof i === 'object' && i.postcssPlugin) {\n        normalized.push(i)\n      } else if (typeof i === 'function') {\n        normalized.push(i)\n      } else if (typeof i === 'object' && (i.parse || i.stringify)) {\n        if (process.env.NODE_ENV !== 'production') {\n          throw new Error(\n            'PostCSS syntaxes cannot be used as plugins. Instead, please use ' +\n              'one of the syntax/parser/stringifier options as outlined ' +\n              'in your PostCSS runner documentation.'\n          )\n        }\n      } else {\n        throw new Error(i + ' is not a PostCSS plugin')\n      }\n    }\n    return normalized\n  }\n\n  process(css, opts = {}) {\n    if (\n      !this.plugins.length &&\n      !opts.parser &&\n      !opts.stringifier &&\n      !opts.syntax\n    ) {\n      return new NoWorkResult(this, css, opts)\n    } else {\n      return new LazyResult(this, css, opts)\n    }\n  }\n\n  use(plugin) {\n    this.plugins = this.plugins.concat(this.normalize([plugin]))\n    return this\n  }\n}\n\nmodule.exports = Processor\nProcessor.default = Processor\n\nRoot.registerProcessor(Processor)\nDocument.registerProcessor(Processor)\n","'use strict'\n\nlet AtRule = require('./at-rule')\nlet Comment = require('./comment')\nlet Container = require('./container')\nlet CssSyntaxError = require('./css-syntax-error')\nlet Declaration = require('./declaration')\nlet Document = require('./document')\nlet fromJSON = require('./fromJSON')\nlet Input = require('./input')\nlet LazyResult = require('./lazy-result')\nlet list = require('./list')\nlet Node = require('./node')\nlet parse = require('./parse')\nlet Processor = require('./processor')\nlet Result = require('./result.js')\nlet Root = require('./root')\nlet Rule = require('./rule')\nlet stringify = require('./stringify')\nlet Warning = require('./warning')\n\nfunction postcss(...plugins) {\n  if (plugins.length === 1 && Array.isArray(plugins[0])) {\n    plugins = plugins[0]\n  }\n  return new Processor(plugins)\n}\n\npostcss.plugin = function plugin(name, initializer) {\n  let warningPrinted = false\n  function creator(...args) {\n    // eslint-disable-next-line no-console\n    if (console && console.warn && !warningPrinted) {\n      warningPrinted = true\n      // eslint-disable-next-line no-console\n      console.warn(\n        name +\n          ': postcss.plugin was deprecated. Migration guide:\\n' +\n          'https://evilmartians.com/chronicles/postcss-8-plugin-migration'\n      )\n      if (process.env.LANG && process.env.LANG.startsWith('zh')) {\n        /* c8 ignore next 7 */\n        // eslint-disable-next-line no-console\n        console.warn(\n          name +\n            ': 里面 postcss.plugin 被弃用. 迁移指南:\\n' +\n            'https://www.w3ctech.com/topic/2226'\n        )\n      }\n    }\n    let transformer = initializer(...args)\n    transformer.postcssPlugin = name\n    transformer.postcssVersion = new Processor().version\n    return transformer\n  }\n\n  let cache\n  Object.defineProperty(creator, 'postcss', {\n    get() {\n      if (!cache) cache = creator()\n      return cache\n    }\n  })\n\n  creator.process = function (css, processOpts, pluginOpts) {\n    return postcss([creator(pluginOpts)]).process(css, processOpts)\n  }\n\n  return creator\n}\n\npostcss.stringify = stringify\npostcss.parse = parse\npostcss.fromJSON = fromJSON\npostcss.list = list\n\npostcss.comment = defaults => new Comment(defaults)\npostcss.atRule = defaults => new AtRule(defaults)\npostcss.decl = defaults => new Declaration(defaults)\npostcss.rule = defaults => new Rule(defaults)\npostcss.root = defaults => new Root(defaults)\npostcss.document = defaults => new Document(defaults)\n\npostcss.CssSyntaxError = CssSyntaxError\npostcss.Declaration = Declaration\npostcss.Container = Container\npostcss.Processor = Processor\npostcss.Document = Document\npostcss.Comment = Comment\npostcss.Warning = Warning\npostcss.AtRule = AtRule\npostcss.Result = Result\npostcss.Input = Input\npostcss.Rule = Rule\npostcss.Root = Root\npostcss.Node = Node\n\nLazyResult.registerPostcss(postcss)\n\nmodule.exports = postcss\npostcss.default = postcss\n","const dayjs = require('dayjs');\n\n// Strip characters browsers ignore inside URLs (control chars and\n// embedded HTML comments) that are commonly used to sneak XSS\n// payloads past simple scheme checks.\nfunction cleanHref(href) {\n  // Browsers ignore character codes of 32 (space) and below in a surprising\n  // number of situations. Start reading here:\n  // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#Embedded_tab\n  // eslint-disable-next-line no-control-regex\n  href = href.replace(/[\\x00-\\x20]+/g, '');\n  // Clobber any comments in URLs, which the browser might\n  // interpret inside an XML data island, allowing\n  // a javascript: URL to be snuck through\n  while (true) {\n    const firstIndex = href.indexOf('<!--');\n    if (firstIndex === -1) {\n      break;\n    }\n    const lastIndex = href.indexOf('-->', firstIndex + 4);\n    if (lastIndex === -1) {\n      break;\n    }\n    href = href.substring(0, firstIndex) + href.substring(lastIndex + 3);\n  }\n  return href;\n}\n\n// Returns true if `href` should be rejected as unsafe. Used to block\n// `javascript:`, `data:` and other dangerous schemes both when\n// validating URL fields and when sanitizing HTML attribute values.\n//\n// `options.allowedSchemes` is an array of permitted URL schemes\n// (defaults to the schemes long permitted by `launder().url`).\n// `options.allowProtocolRelative` controls whether protocol-relative\n// URLs (e.g. `//example.com`) are permitted. Defaults to true.\nfunction naughtyHref(href, options) {\n  options = options || {};\n  const allowedSchemes = options.allowedSchemes ||\n    [ 'http', 'https', 'ftp', 'mailto', 'tel', 'sms' ];\n  const allowProtocolRelative = (options.allowProtocolRelative !== false);\n  if (typeof href !== 'string') {\n    return false;\n  }\n  href = cleanHref(href);\n  // Case insensitive so we don't get faked out by JAVASCRIPT #1\n  // Allow more characters after the first so we don't get faked\n  // out by certain schemes browsers accept\n  const matches = href.match(/^([a-zA-Z][a-zA-Z0-9.\\-+]*):/);\n  if (!matches) {\n    // Protocol-relative URL starting with any combination of '/' and '\\'\n    if (href.match(/^[/\\\\]{2}/)) {\n      return !allowProtocolRelative;\n    }\n    // No scheme\n    return false;\n  }\n  const scheme = matches[1].toLowerCase();\n  return allowedSchemes.indexOf(scheme) === -1;\n}\n\nmodule.exports = function(options) {\n  const self = {};\n  self.options = options || {};\n\n  self.filterTag = self.options.filterTag || function(tag) {\n    tag = tag.trim();\n    return tag.toLowerCase();\n  };\n\n  self.string = function(s, def) {\n    if (typeof (s) !== 'string') {\n      if ((typeof (s) === 'number') || (typeof (s) === 'boolean')) {\n        s += '';\n      } else {\n        s = '';\n      }\n    }\n    s = s.trim();\n    if (def !== undefined) {\n      if (s === '') {\n        s = def;\n      }\n    }\n    return s;\n  };\n\n  self.strings = function(strings) {\n    if (!Array.isArray(strings)) {\n      return [];\n    }\n    return strings.map(function(s) {\n      return self.string(s);\n    });\n  };\n\n  self.integer = function(i, def, min, max) {\n    if (def === undefined) {\n      def = 0;\n    }\n    if (typeof (i) === 'number') {\n      i = Math.floor(i);\n    } else {\n      try {\n        i = parseInt(i, 10);\n        if (isNaN(i)) {\n          i = def;\n        }\n      } catch (e) {\n        i = def;\n      }\n    }\n    if ((typeof (min) === 'number') && (i < min)) {\n      i = min;\n    }\n    if ((typeof (max) === 'number') && (i > max)) {\n      i = max;\n    }\n    return i;\n  };\n\n  self.padInteger = function(i, places) {\n    let s = i + '';\n    while (s.length < places) {\n      s = '0' + s;\n    }\n    return s;\n  };\n\n  self.float = function(i, def, min, max) {\n    if (def === undefined) {\n      def = 0;\n    }\n    if (!(typeof (i) === 'number')) {\n      try {\n        i = parseFloat(i, 10);\n        if (isNaN(i)) {\n          i = def;\n        }\n      } catch (e) {\n        i = def;\n      }\n    }\n    if ((typeof (min) === 'number') && (i < min)) {\n      i = min;\n    }\n    if ((typeof (max) === 'number') && (i > max)) {\n      i = max;\n    }\n    return i;\n  };\n\n  self.naughtyHref = naughtyHref;\n\n  self.url = function(s, def, httpsFix) {\n    s = self.string(s, def);\n    // Allow the default to be undefined, null, false, etc.\n    if (s === def) {\n      return s;\n    }\n    // Strip characters browsers ignore that are commonly used to\n    // smuggle dangerous schemes past validation.\n    s = cleanHref(s);\n    // Reject naughty URLs (e.g. `javascript:`, `data:`) before fixUrl\n    // runs. Otherwise fixUrl could mask such schemes by prepending\n    // `https://` to anything containing a `.`, turning\n    // `javascript:alert(document.domain)` into a syntactically odd\n    // but accepted `https://...` URL.\n    if (naughtyHref(s)) {\n      return def;\n    }\n    s = fixUrl(s);\n    if (s === null) {\n      return def;\n    }\n    return s;\n\n    function fixUrl(href) {\n      if (href.match(/^(((https?|ftp):\\/\\/)|((mailto|tel|sms):)|#|([^/.]+)?\\/|[^/.]+$)/)) {\n        // All good - no change required\n        return href;\n      } else if (href.match(/^[^/.]+\\.[^/.]+/)) {\n        // Smells like a domain name. Educated guess: they left off http://\n        const protocol = httpsFix ? 'https://' : 'http://';\n        return protocol + href;\n      } else {\n        return null;\n      }\n    };\n  };\n\n  self.select = function(s, choices, def) {\n    s = self.string(s);\n    if (!choices || !choices.length) {\n      return def;\n    }\n    let choice;\n    if (typeof (choices[0]) === 'object') {\n      choice = choices.find(function(choice) {\n        if ((choice.value === null) || (choice.value === undefined)) {\n          // Don't crash on invalid choices\n          return false;\n        }\n        return choice.value.toString() === s;\n      });\n      if (choice != null) {\n        return choice.value;\n      }\n      return def;\n    }\n    choice = choices.find(function(choice) {\n      if ((choice === null) || (choice === undefined)) {\n        // Don't crash on invalid choices\n        return false;\n      }\n      return choice.toString() === s;\n    });\n    if (choice !== undefined) {\n      return choice;\n    }\n    return def;\n  };\n\n  self.boolean = function(b, def) {\n    if (b === true) {\n      return true;\n    }\n    if (b === false) {\n      return false;\n    }\n    b = self.string(b, def);\n    if (b === def) {\n      if (b === undefined) {\n        return false;\n      }\n      return b;\n    }\n    b = b.toLowerCase().charAt(0);\n    if ((b === '') || (b === 'n') || (b === '0') || (b === 'f')) {\n      return false;\n    }\n    if ((b === 't') || (b === 'y') || (b === '1')) {\n      return true;\n    }\n    return false;\n  };\n\n  // Given an `options` object in which options[name] is a string\n  // set to '0', '1', or 'any', this method adds mongodb criteria\n  // to the `criteria` object.\n  //\n  // '0' or false means \"the property must be false or absent,\" '1' or true\n  // means \"the property must be true,\" and 'any' or null means \"we don't care\n  // what the property is.\"\n  //\n  // See `booleanOrNull` for additional synonyms accepted for the\n  // three possible values.\n  //\n  // An empty string is considered equivalent to '0'.\n  //\n  // This is not the same as apos.sanitizeBoolean which is concerned only with\n  // true or false and does not address \"any.\"\n  //\n  // `def` defaults to `any`.\n  //\n  // This method is most often used with REST API parameters and forms.\n\n  self.addBooleanFilterToCriteria = function(options, name, criteria, def) {\n    // if any or null, we aren't changing criteria\n    if (def === undefined) {\n      def = null;\n    }\n\n    // allow object or boolean\n    let value = (typeof (options) === 'object' && options !== null) ? options[name] : options;\n    value = (value === undefined) ? def : value;\n    value = self.booleanOrNull(value);\n\n    if (value === null) {\n      // Don't care, show all\n    } else if (!value) {\n      // Must be absent or false. Hooray for $ne\n      criteria[name] = { $ne: true };\n    } else {\n      // Must be true\n      criteria[name] = true;\n    }\n  };\n\n  // This method is used for tristate filters, i.e. \"published,\"\n  // \"unpublished\", and \"show me both\".\n  //\n  // Accepts `true`, `false`, or `null` and returns them exactly\n  // as such; if the parameter is none of those or their synonyms\n  // below, returns `def`.\n  //\n  // Also accepts the strings `'yes'` (or starting with y), `'no'` (or\n  // starting with n), `'true'` (or starting with t), `'false'`\n  // (or starting with f), `'1'`, `'0'` and the strings `'any'` and\n  // `'null'`. The string `'null'` must be an exact match, anything\n  // else starting with `n` is taken as `no` (false).\n  //\n  // These various synonyms are useful for string input, such as from\n  // a user friendly query string.\n\n  self.booleanOrNull = function(b, def) {\n    if (b === true) {\n      return b;\n    }\n    if (b === false) {\n      return b;\n    }\n    if (b === null) {\n      return b;\n    }\n\n    b = self.string(b, def);\n    if (b === def) {\n      if (def === undefined) {\n        return null;\n      }\n      return b;\n    }\n\n    // String 'null' must match as a full string to disambiguate from string 'n' for 'no'\n    if (b === 'null') {\n      return null;\n    }\n\n    b = b.toLowerCase().charAt(0);\n\n    if ((b === '') || (b === 'n') || (b === '0') || (b === 'f')) {\n      return false;\n    }\n\n    if ((b === 't') || (b === 'y') || (b === '1')) {\n      return true;\n    }\n\n    if ((b === 'a')) {\n      return null;\n    }\n\n    return def;\n  };\n\n  // Accept a user-entered string in YYYY-MM-DD, MM/DD, MM/DD/YY, or MM/DD/YYYY format\n  // (tolerates missing leading zeroes on MM and DD). Also accepts a Date object.\n  // Returns YYYY-MM-DD.\n  //\n  // The current year is assumed when MM/DD is used. If there is no explicit default\n  // any unparseable date is returned as today's date.\n  //\n  // If the default is explicitly `null` (not `undefined`) then `null` is returned for\n  // any unparseable date.\n  //\n  // The `now` argument can be passed for performance if you prefer to call\n  // `new Date()` just once before many calls to this method and pass that single\n  // value to all of them.\n\n  self.date = function(date, def, now) {\n    let components;\n\n    function returnDefault() {\n      if (def === undefined) {\n        def = dayjs().format('YYYY-MM-DD');\n      }\n      return def;\n    }\n\n    if (typeof (date) === 'string') {\n      if (date.match(/\\//)) {\n        components = date.split('/');\n        if (components.length === 2) {\n          // Convert mm/dd to yyyy-mm-dd\n          return (now || new Date()).getFullYear() + '-' + self.padInteger(components[0], 2) + '-' + self.padInteger(components[1], 2);\n        } else if (components.length === 3) {\n          // Convert mm/dd/yy to mm/dd/yyyy\n          if (components[2] < 100) {\n            // Add the current century. If the result is more than\n            // 50 years in the future, assume they meant the\n            // previous century. Thus in 2015, we find that\n            // we get the intuitive result for both 1/1/75,\n            // 1/1/99 and 1/1/25. It's a nasty habit among\n            // us imprecise humans. -Tom\n            const d = (now || new Date());\n            const nowYear = d.getFullYear() % 100;\n            const nowCentury = d.getFullYear() - nowYear;\n            let theirYear = parseInt(components[2]) + nowCentury;\n            if (theirYear - d.getFullYear() > 50) {\n              theirYear -= 100;\n            }\n            components[2] = theirYear;\n          }\n          // Convert mm/dd/yyyy to yyyy-mm-dd\n          return self.padInteger(components[2], 4) + '-' + self.padInteger(components[0], 2) + '-' + self.padInteger(components[1], 2);\n        } else {\n          return returnDefault();\n        }\n      } else if (date.match(/-/)) {\n        components = date.split('-');\n        if (components.length === 2) {\n          // Convert mm-dd to yyyy-mm-dd\n          return (now || new Date()).getFullYear() + '-' + self.padInteger(components[0], 2) + '-' + self.padInteger(components[1], 2);\n        } else if (components.length === 3) {\n          // Convert yyyy-mm-dd (with questionable padding) to yyyy-mm-dd\n          return self.padInteger(components[0], 4) + '-' + self.padInteger(components[1], 2) + '-' + self.padInteger(components[2], 2);\n        } else {\n          return returnDefault();\n        }\n      }\n    }\n    try {\n      if (date === null) {\n        return returnDefault();\n      }\n      date = (now || new Date(date));\n      if (isNaN(date.getTime())) {\n        return returnDefault();\n      }\n      return date.getFullYear() + '-' + self.padInteger(date.getMonth() + 1, 2) + '-' + self.padInteger(date.getDate(), 2);\n    } catch (e) {\n      return returnDefault();\n    }\n  };\n\n  // This is likely not relevent to you unless you're using Apostrophe\n  // Given a date object, return a date string in Apostrophe's preferred sortable,\n  // comparable, JSON-able format, which is YYYY-MM-DD. If `date` is undefined\n  // the current date is used.\n  self.formatDate = function(date) {\n    return dayjs(date).format('YYYY-MM-DD');\n  };\n\n  // Accepts a user-entered string in 12-hour or 24-hour time and returns a string\n  // in 24-hour time. This method is tolerant of syntax such as `4pm`; minutes and\n  // seconds are optional.\n  //\n  // If `def` is not set the default is the current time.\n\n  self.time = function(time, def) {\n    time = self.string(time).toLowerCase();\n    time = time.trim();\n    const components = time.match(/^(\\d+)([:|.](\\d+))?([:|.](\\d+))?\\s*(am|pm|AM|PM|a|p|A|M)?$/);\n    if (components) {\n      let hours = parseInt(components[1], 10);\n      const minutes = (components[3] !== undefined) ? parseInt(components[3], 10) : 0;\n      const seconds = (components[5] !== undefined) ? parseInt(components[5], 10) : 0;\n      let ampm = (components[6]) ? components[6].toLowerCase() : components[6];\n      ampm = ampm && ampm.charAt(0);\n      if ((hours === 12) && (ampm === 'a')) {\n        hours -= 12;\n      } else if ((hours === 12) && (ampm === 'p')) {\n        // Leave it be\n      } else if (ampm === 'p') {\n        hours += 12;\n      }\n      if ((hours === 24) || (hours === '24')) {\n        hours = 0;\n      }\n      return self.padInteger(hours, 2) + ':' + self.padInteger(minutes, 2) + ':' + self.padInteger(seconds, 2);\n    } else {\n      if (def !== undefined) {\n        return def;\n      }\n      return dayjs().format('HH:mm');\n    }\n  };\n\n  // This is likely not relevent to you unless you're using Apostrophe\n  // Given a JavaScript Date object, return a time string in\n  // Apostrophe's preferred sortable, comparable, JSON-able format:\n  // 24-hour time, with seconds.\n  //\n  // If `date` is missing the current time is used.\n\n  self.formatTime = function(date) {\n    return dayjs(date).format('HH:mm:ss');\n  };\n\n  // Sanitize tags. Tags should be submitted as an array of strings,\n  // or a comma-separated string.\n  //\n  // This method ensures the input is an array or string and, if\n  // an array, that the elements of the array are strings.\n  //\n  // If a filterTag function is passed as an option when initializing\n  // Launder, then all tags are passed through it (as individual\n  // strings, one per call) and the return value is used instead. You\n  // may also pass a filterTag when calling this function\n\n  self.tags = function(tags, filter) {\n    if (typeof (tags) === 'string') {\n      tags = tags.split(/,\\s*/);\n    }\n    if (!Array.isArray(tags)) {\n      return [];\n    }\n    const strings = tags.map(tag => self.string(tag));\n    const rewritten = strings.map(filter || self.filterTag);\n    const filtered = rewritten.filter(tag => tag.length > 0);\n    return filtered;\n  };\n\n  // Sanitize an id. IDs must consist solely of upper and lower case\n  // letters, numbers, and digits unless options.idRegExp is set.\n\n  self.idRegExp = self.options.idRegExp || /^[A-Za-z0-9_]+$/;\n\n  self.id = function(s, def) {\n    const id = self.string(s, def);\n    if (id === def) {\n      return id;\n    }\n    if (!id.match(self.idRegExp)) {\n      return def;\n    }\n    return id;\n  };\n\n  // Sanitize an array of IDs. IDs must consist solely of upper and lower case\n  // letters and numbers, digits, and underscores. Any elements that are not\n  // IDs are omitted from the final array.\n  self.ids = function(ids) {\n    if (!Array.isArray(ids)) {\n      return [];\n    }\n    const result = ids.filter(function(id) {\n      return (self.id(id) !== undefined);\n    });\n    return result;\n  };\n  return self;\n};\n\n// Expose `naughtyHref` statically so callers (notably sanitize-html)\n// can use it without instantiating a launder.\nmodule.exports.naughtyHref = naughtyHref;\n","const htmlparser = require('htmlparser2');\nconst escapeStringRegexp = require('escape-string-regexp');\nconst { isPlainObject } = require('is-plain-object');\nconst parseSrcset = require('parse-srcset');\nconst { parse: postcssParse } = require('postcss');\nconst { naughtyHref: launderNaughtyHref } = require('launder');\n// Tags that can conceivably represent stand-alone media.\nconst mediaTags = [\n  'img', 'audio', 'video', 'picture', 'svg',\n  'object', 'map', 'iframe', 'embed'\n];\n// Tags that are inherently vulnerable to being used in XSS attacks.\nconst vulnerableTags = [ 'script', 'style' ];\n// SVG SMIL animation elements. These do not carry a URL themselves: they\n// retarget an attribute of another element, naming it with `attributeName`\n// and supplying the new value(s) in `values`, `from`, `to` and `by`.\nconst svgAnimationTags = [\n  'animate', 'animatecolor', 'animatemotion', 'animatetransform', 'set'\n];\n// Attribute names that always name a URL sink, whatever\n// `allowedSchemesAppliedToAttributes` has been narrowed to. A namespace prefix\n// is ignored when matching, so `xlink:href` and any other prefixed spelling of\n// `href` are covered.\nconst alwaysUrlAttributes = [ 'href' ];\n\n// Our own diagnostics. A console-shaped `logger` option takes them instead of\n// the console; missing methods fall back to it.\nconst severities = [ 'debug', 'info', 'warn', 'error' ];\n\nfunction loggerFor(options) {\n  const source = (options && options.logger) || console;\n  const logger = {};\n  for (const severity of severities) {\n    logger[severity] = typeof source[severity] === 'function'\n      ? (...args) => source[severity](...args)\n      // eslint-disable-next-line no-console\n      : (...args) => console[severity](...args);\n  }\n  return logger;\n}\n\nfunction each(obj, cb) {\n  if (obj) {\n    Object.keys(obj).forEach(function (key) {\n      cb(obj[key], key);\n    });\n  }\n}\n\n// Avoid false positives with .__proto__, .hasOwnProperty, etc.\nfunction has(obj, key) {\n  return ({}).hasOwnProperty.call(obj, key);\n}\n\n// Combine the tag-specific and wildcard lists of allowed classes\nfunction mergeClasses(specific, wildcard) {\n  if (!Array.isArray(specific) || !Array.isArray(wildcard)) {\n    return wildcard;\n  }\n  return specific.concat(wildcard);\n}\n\n// Combine the tag-specific and wildcard allowed styles, concatenating the\n// lists of regular expressions for properties that appear in both. The result\n// has no prototype, so a property named `__proto__` is just another property\nfunction mergeStyles(specific, wildcard) {\n  const merged = Object.create(null);\n  for (const rules of [ specific, wildcard ]) {\n    for (const prop of Object.keys(rules)) {\n      merged[prop] = has(merged, prop)\n        ? merged[prop].concat(rules[prop])\n        : rules[prop];\n    }\n  }\n  return merged;\n}\n\n// Returns those elements of `a` for which `cb(a)` returns truthy\nfunction filter(a, cb) {\n  const n = [];\n  each(a, function(v) {\n    if (cb(v)) {\n      n.push(v);\n    }\n  });\n  return n;\n}\n\nfunction isEmptyObject(obj) {\n  for (const key in obj) {\n    if (has(obj, key)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction stringifySrcset(parsedSrcset) {\n  return parsedSrcset.map(function(part) {\n    if (!part.url) {\n      throw new Error('URL missing');\n    }\n\n    return (\n      part.url +\n      (part.w ? ` ${part.w}w` : '') +\n      (part.h ? ` ${part.h}h` : '') +\n      (part.d ? ` ${part.d}x` : '')\n    );\n  }).join(', ');\n}\n\nmodule.exports = sanitizeHtml;\n\n// A valid attribute name.\n// We use a tolerant definition based on the set of strings defined by\n// html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state\n// and html.spec.whatwg.org/multipage/parsing.html#attribute-name-state .\n// The characters accepted are ones which can be appended to the attribute\n// name buffer without triggering a parse error:\n//   * unexpected-equals-sign-before-attribute-name\n//   * unexpected-null-character\n//   * unexpected-character-in-attribute-name\n// We exclude the empty string because it's impossible to get to the after\n// attribute name state with an empty attribute name buffer.\nconst VALID_HTML_ATTRIBUTE_NAME = /^[^\\0\\t\\n\\f\\r /<=>]+$/;\n\n// How many discarded <iframe> elements can be nested while their fallback\n// markup is still re-sanitized as HTML (see the `ontext` handler). Deeper\n// fallback is escaped as text, so that crafted input cannot recurse without\n// bound or re-parse the remainder of the input once per iframe\n// (GHSA-c9rx-x947-fp3h).\nconst MAX_IFRAME_FALLBACK_DEPTH = 8;\n\n// `_fallback` is internal: it is set when re-sanitizing the fallback markup\n// of a discarded <iframe>, to carry the current nesting depth into the\n// recursive call.\n\nfunction sanitizeHtml(html, options, _fallback) {\n  if (html == null) {\n    return '';\n  }\n  const baseDepth = (_fallback && _fallback.depth) || 0;\n  const iframeFallbackDepth = (_fallback && _fallback.iframeFallbackDepth) || 0;\n  if (typeof html === 'number') {\n    html = html.toString();\n  }\n\n  let result = '';\n  // Used for hot swapping the result variable with an empty string\n  // in order to \"capture\" the text written to it.\n  let tempResult = '';\n\n  function Frame(tag, attribs) {\n    const that = this;\n    this.tag = tag;\n    this.attribs = attribs || {};\n    this.tagPosition = result.length;\n    this.text = ''; // Node inner text\n    this.openingTagLength = 0;\n    this.mediaChildren = [];\n\n    this.updateParentNodeText = function() {\n      if (stack.length) {\n        const parentFrame = stack[stack.length - 1];\n        parentFrame.text += that.text;\n      }\n    };\n\n    this.updateParentNodeMediaChildren = function() {\n      if (stack.length && mediaTags.includes(this.tag)) {\n        const parentFrame = stack[stack.length - 1];\n        parentFrame.mediaChildren.push(this.tag);\n      }\n    };\n  }\n\n  options = Object.assign({}, sanitizeHtml.defaults, options);\n  options.parser = Object.assign({}, htmlParserDefaults, options.parser);\n\n  const logger = loggerFor(options);\n\n  const tagAllowed = function (name) {\n    return options.allowedTags === false ||\n      (options.allowedTags || []).indexOf(name) > -1;\n  };\n\n  // vulnerableTags\n  vulnerableTags.forEach(function (tag) {\n    if (tagAllowed(tag) && !options.allowVulnerableTags) {\n      logger.warn(\n        `Your \\`allowedTags\\` option includes \\`${tag}\\`, which is inherently ` +\n        'vulnerable to XSS attacks. Please remove it from `allowedTags`, or, ' +\n        'to disable this warning, add the `allowVulnerableTags` option and ' +\n        'ensure you are accounting for this risk.'\n      );\n    }\n  });\n\n  // Tags that contain something other than HTML, or where discarding\n  // the text when the tag is disallowed makes sense for other reasons.\n  // If we are not allowing these tags, we should drop their content too.\n  // For other tags you would drop the tag but keep its content.\n  // `xmp` is included because htmlparser2 treats it as a raw-text element,\n  // so markup inside is parsed as text on input but would otherwise be\n  // re-emitted unescaped via the `ontext` branch below, allowing XSS bypass\n  // when `xmp` is disallowed (which is the default).\n  const nonTextTagsArray = options.nonTextTags || [\n    'script',\n    'style',\n    'textarea',\n    'option',\n    'xmp'\n  ];\n  let allowedAttributesMap;\n  let allowedAttributesGlobMap;\n  if (options.allowedAttributes) {\n    allowedAttributesMap = {};\n    allowedAttributesGlobMap = {};\n    each(options.allowedAttributes, function(attributes, tag) {\n      allowedAttributesMap[tag] = [];\n      const globRegex = [];\n      attributes.forEach(function(obj) {\n        if (typeof obj === 'string' && obj.indexOf('*') >= 0) {\n          globRegex.push(escapeStringRegexp(obj).replace(/\\\\\\*/g, '.*'));\n        } else {\n          allowedAttributesMap[tag].push(obj);\n        }\n      });\n      if (globRegex.length) {\n        allowedAttributesGlobMap[tag] = new RegExp('^(' + globRegex.join('|') + ')$');\n      }\n    });\n  }\n  const allowedClassesMap = {};\n  const allowedClassesGlobMap = {};\n  const allowedClassesRegexMap = {};\n  each(options.allowedClasses, function(classes, tag) {\n    // Implicitly allows the class attribute\n    if (allowedAttributesMap) {\n      if (!has(allowedAttributesMap, tag)) {\n        allowedAttributesMap[tag] = [];\n      }\n      allowedAttributesMap[tag].push('class');\n    }\n\n    allowedClassesMap[tag] = classes;\n\n    if (Array.isArray(classes)) {\n      const globRegex = [];\n      allowedClassesMap[tag] = [];\n      allowedClassesRegexMap[tag] = [];\n      classes.forEach(function(obj) {\n        if (typeof obj === 'string' && obj.indexOf('*') >= 0) {\n          globRegex.push(escapeStringRegexp(obj).replace(/\\\\\\*/g, '.*'));\n        } else if (obj instanceof RegExp) {\n          allowedClassesRegexMap[tag].push(obj);\n        } else {\n          allowedClassesMap[tag].push(obj);\n        }\n      });\n      if (globRegex.length) {\n        allowedClassesGlobMap[tag] = new RegExp('^(' + globRegex.join('|') + ')$');\n      }\n    }\n  });\n\n  const transformTagsMap = {};\n  let transformTagsAll;\n  each(options.transformTags, function(transform, tag) {\n    let transFun;\n    if (typeof transform === 'function') {\n      transFun = transform;\n    } else if (typeof transform === 'string') {\n      transFun = sanitizeHtml.simpleTransform(transform);\n    }\n    if (tag === '*') {\n      transformTagsAll = transFun;\n    } else {\n      transformTagsMap[tag] = transFun;\n    }\n  });\n\n  let depth;\n  let stack;\n  let skipMap;\n  let transformMap;\n  let skipText;\n  let skipTextDepth;\n  // Browsers (with scripting enabled) parse <noscript> content as raw text up\n  // to the first `</noscript`, but htmlparser2 parses it as markup, so an end\n  // tag for an ancestor can make htmlparser2 close the <noscript> implicitly\n  // much earlier. `rawTextEnd` is the source offset where the browser ends the\n  // <noscript> being discarded, and `skipRawText` is set while htmlparser2 has\n  // already closed it but the browser has not, so that we keep discarding\n  // until we reach that offset (GHSA-x3q4-9hxx-gx8m).\n  let rawTextEnd;\n  let skipRawText;\n  let addedText = false;\n\n  initializeState();\n\n  const parser = new htmlparser.Parser({\n    onopentag: function(name, attribs) {\n      if (options.onOpenTag) {\n        options.onOpenTag(name, attribs);\n      }\n      updateRawTextRegion();\n\n      // If `enforceHtmlBoundary` is `true` and this has found the opening\n      // `html` tag, reset the state.\n      if (options.enforceHtmlBoundary && name === 'html') {\n        initializeState();\n      }\n\n      if (skipRawText) {\n        return;\n      }\n      if (skipText) {\n        skipTextDepth++;\n        return;\n      }\n      const frame = new Frame(name, attribs);\n      stack.push(frame);\n\n      let skip = false;\n      const hasText = !!frame.text;\n      let transformedTag;\n      if (has(transformTagsMap, name)) {\n        transformedTag = transformTagsMap[name](name, attribs);\n\n        frame.attribs = attribs = transformedTag.attribs;\n\n        if (transformedTag.text !== undefined) {\n          frame.innerText = transformedTag.text;\n        }\n\n        if (name !== transformedTag.tagName) {\n          frame.name = name = transformedTag.tagName;\n          transformMap[depth] = transformedTag.tagName;\n        }\n      }\n      if (transformTagsAll) {\n        transformedTag = transformTagsAll(name, attribs);\n\n        frame.attribs = attribs = transformedTag.attribs;\n        if (name !== transformedTag.tagName) {\n          frame.name = name = transformedTag.tagName;\n          transformMap[depth] = transformedTag.tagName;\n        }\n      }\n\n      if (!tagAllowed(name) || animatesUrlAttribute(name, attribs) || (options.disallowedTagsMode === 'recursiveEscape' && !isEmptyObject(skipMap)) || (options.nestingLimit != null && depth >= options.nestingLimit)) {\n        skip = true;\n        skipMap[depth] = true;\n        if (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') {\n          if (nonTextTagsArray.indexOf(name) !== -1) {\n            skipText = true;\n            skipTextDepth = 1;\n            if (frame.tag.toLowerCase() === 'noscript') {\n              rawTextEnd = findRawTextEnd('noscript', parser.endIndex + 1);\n            }\n          }\n        }\n      }\n      depth++;\n      if (skip) {\n        if (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') {\n          // We want the contents but not this tag\n          if (frame.innerText && !hasText) {\n            const escaped = escapeHtml(frame.innerText);\n            if (options.textFilter) {\n              result += options.textFilter(escaped, name);\n            } else {\n              result += escaped;\n            }\n            addedText = true;\n          }\n          return;\n        }\n        tempResult = result;\n        result = '';\n      }\n      result += '<' + name;\n\n      if (name === 'script') {\n        if (options.allowedScriptHostnames || options.allowedScriptDomains) {\n          frame.innerText = '';\n        }\n      }\n\n      const isBeingEscaped = skip && (options.disallowedTagsMode === 'escape' || options.disallowedTagsMode === 'recursiveEscape');\n      const shouldPreserveEscapedAttributes = isBeingEscaped &&\n        options.preserveEscapedAttributes;\n\n      if (shouldPreserveEscapedAttributes) {\n        each(attribs, function(value, a) {\n          result += ' ' + a + '=\"' + escapeHtml((value || ''), true) + '\"';\n        });\n      } else if (!allowedAttributesMap || has(allowedAttributesMap, name) || allowedAttributesMap['*']) {\n        each(attribs, function(value, a) {\n          if (!VALID_HTML_ATTRIBUTE_NAME.test(a)) {\n            // This prevents part of an attribute name in the output from being\n            // interpreted as the end of an attribute, or end of a tag.\n            delete frame.attribs[a];\n            return;\n          }\n          // If the value is empty, check if the attribute is\n          // in the allowedEmptyAttributes array.\n          // If it is not in the allowedEmptyAttributes array,\n          // and it is a known non-boolean attribute, delete it\n          // List taken from https://html.spec.whatwg.org/multipage/indices.html#attributes-3\n          if (value === '' && (!options.allowedEmptyAttributes.includes(a)) &&\n            (options.nonBooleanAttributes.includes(a) || options.nonBooleanAttributes.includes('*'))) {\n            delete frame.attribs[a];\n            return;\n          }\n          // check allowedAttributesMap for the element and attribute and modify the value\n          // as necessary if there are specific values defined.\n          let passedAllowedAttributesMapCheck = false;\n          if (!allowedAttributesMap ||\n            (has(allowedAttributesMap, name) &&\n              allowedAttributesMap[name].indexOf(a) !== -1) ||\n            (allowedAttributesMap['*'] && allowedAttributesMap['*'].indexOf(a) !== -1) ||\n            (has(allowedAttributesGlobMap, name) &&\n              allowedAttributesGlobMap[name].test(a)) ||\n            (allowedAttributesGlobMap['*'] && allowedAttributesGlobMap['*'].test(a))) {\n            passedAllowedAttributesMapCheck = true;\n          } else if (allowedAttributesMap && allowedAttributesMap[name]) {\n            for (const o of allowedAttributesMap[name]) {\n              if (isPlainObject(o) && o.name && (o.name === a)) {\n                passedAllowedAttributesMapCheck = true;\n                let newValue = '';\n                if (o.multiple === true) {\n                  // verify the values that are allowed\n                  const splitStrArray = value.split(' ');\n                  for (const s of splitStrArray) {\n                    if (o.values.indexOf(s) !== -1) {\n                      if (newValue === '') {\n                        newValue = s;\n                      } else {\n                        newValue += ' ' + s;\n                      }\n                    }\n                  }\n                } else if (o.values.indexOf(value) >= 0) {\n                  // verified an allowed value matches the entire attribute value\n                  newValue = value;\n                }\n                value = newValue;\n              }\n            }\n          }\n          if (passedAllowedAttributesMapCheck) {\n            if (options.allowedSchemesAppliedToAttributes.indexOf(a) !== -1) {\n              if (naughtyHref(name, value)) {\n                delete frame.attribs[a];\n                return;\n              }\n            }\n\n            // `<meta http-equiv=\"refresh\" content=\"0;url=...\">` navigates to a\n            // URL embedded in `content`, so scheme check that URL too\n            // (GHSA-cv27-6wvh-8x7j). Other meta `content` values are left alone.\n            if (name === 'meta' && a.toLowerCase() === 'content' && isRefresh(attribs) && naughtyRefresh(value)) {\n              delete frame.attribs[a];\n              return;\n            }\n\n            if (name === 'script' && a === 'src') {\n\n              let allowed = true;\n\n              try {\n                const parsed = parseUrl(value);\n\n                if (options.allowedScriptHostnames || options.allowedScriptDomains) {\n                  const allowedHostname = (options.allowedScriptHostnames || [])\n                    .find(function (hostname) {\n                      return hostname === parsed.url.hostname;\n                    });\n                  const allowedDomain = (options.allowedScriptDomains || [])\n                    .find(function(domain) {\n                      return parsed.url.hostname === domain || parsed.url.hostname.endsWith(`.${domain}`);\n                    });\n                  allowed = allowedHostname || allowedDomain;\n                }\n              } catch (e) {\n                allowed = false;\n              }\n\n              if (!allowed) {\n                delete frame.attribs[a];\n                return;\n              }\n            }\n\n            if (name === 'iframe' && a === 'src') {\n              let allowed = true;\n              try {\n                const parsed = parseUrl(value);\n\n                if (parsed.isRelativeUrl) {\n                  // default value of allowIframeRelativeUrls is true\n                  // unless allowedIframeHostnames or allowedIframeDomains specified\n                  allowed = has(options, 'allowIframeRelativeUrls')\n                    ? options.allowIframeRelativeUrls\n                    : (!options.allowedIframeHostnames && !options.allowedIframeDomains);\n                } else if (\n                  options.allowedIframeHostnames ||\n                  options.allowedIframeDomains\n                ) {\n                  const allowedHostname = (options.allowedIframeHostnames || [])\n                    .find(function (hostname) {\n                      return hostname === parsed.url.hostname;\n                    });\n                  const allowedDomain = (options.allowedIframeDomains || [])\n                    .find(function(domain) {\n                      return parsed.url.hostname === domain || parsed.url.hostname.endsWith(`.${domain}`);\n                    });\n                  allowed = allowedHostname || allowedDomain;\n                }\n              } catch (e) {\n                // Unparseable iframe src\n                allowed = false;\n              }\n              if (!allowed) {\n                delete frame.attribs[a];\n                return;\n              }\n            }\n            if (a === 'srcset' || a === 'imagesrcset') {\n              try {\n                let parsed = parseSrcset(value);\n                parsed.forEach(function(value) {\n                  if (naughtyHref(name, value.url)) {\n                    value.evil = true;\n                  }\n                });\n                parsed = filter(parsed, function(v) {\n                  return !v.evil;\n                });\n                if (!parsed.length) {\n                  delete frame.attribs[a];\n                  return;\n                } else {\n                  value = stringifySrcset(filter(parsed, function(v) {\n                    return !v.evil;\n                  }));\n                  frame.attribs[a] = value;\n                }\n              } catch (e) {\n                // Unparseable srcset\n                delete frame.attribs[a];\n                return;\n              }\n            }\n            if (a === 'class') {\n              const allowedSpecificClasses = allowedClassesMap[name];\n              const allowedWildcardClasses = allowedClassesMap['*'];\n              const allowedSpecificClassesGlob = allowedClassesGlobMap[name];\n              const allowedSpecificClassesRegex = allowedClassesRegexMap[name];\n              const allowedWildcardClassesRegex = allowedClassesRegexMap['*'];\n              const allowedWildcardClassesGlob = allowedClassesGlobMap['*'];\n              const allowedClassesGlobs = [\n                allowedSpecificClassesGlob,\n                allowedWildcardClassesGlob\n              ]\n                .concat(allowedSpecificClassesRegex, allowedWildcardClassesRegex)\n                .filter(function (t) {\n                  return t;\n                });\n              if (allowedSpecificClasses && allowedWildcardClasses) {\n                value = filterClasses(\n                  value,\n                  mergeClasses(allowedSpecificClasses, allowedWildcardClasses),\n                  allowedClassesGlobs\n                );\n              } else {\n                value = filterClasses(\n                  value,\n                  allowedSpecificClasses || allowedWildcardClasses,\n                  allowedClassesGlobs\n                );\n              }\n              if (!value.length) {\n                delete frame.attribs[a];\n                return;\n              }\n            }\n            if (a === 'style') {\n              if (options.parseStyleAttributes) {\n                try {\n                  const abstractSyntaxTree = postcssParse(name + ' {' + value + '}', { map: false });\n                  const filteredAST = filterCss(\n                    abstractSyntaxTree,\n                    options.allowedStyles\n                  );\n\n                  value = stringifyStyleAttributes(filteredAST);\n\n                  if (value.length === 0) {\n                    delete frame.attribs[a];\n                    return;\n                  }\n                } catch (e) {\n                  if (typeof window !== 'undefined') {\n                    logger.warn(\n                      `Failed to parse \"${name} {${value}}\". If you are ` +\n                      'running this in a browser, we recommend disabling ' +\n                      'style parsing with the parseStyleAttributes option, ' +\n                      'since it only works in a node environment due to a ' +\n                      'postcss dependency. More info: ' +\n                      'https://github.com/apostrophecms/sanitize-html/issues/547'\n                    );\n                  }\n                  delete frame.attribs[a];\n                  return;\n                }\n              } else if (options.allowedStyles) {\n                throw new Error('allowedStyles option cannot be used together with parseStyleAttributes: false.');\n              }\n            }\n            result += ' ' + a;\n            if (value && value.length) {\n              result += '=\"' + escapeHtml(value, true) + '\"';\n            } else if (options.allowedEmptyAttributes.includes(a)) {\n              result += '=\"\"';\n            }\n          } else {\n            delete frame.attribs[a];\n          }\n        });\n      }\n      if (options.selfClosing.indexOf(name) !== -1) {\n        result += ' />';\n      } else {\n        result += '>';\n        if (frame.innerText && !hasText) {\n          const escaped = escapeHtml(frame.innerText);\n          if (options.textFilter) {\n            result += options.textFilter(escaped, name);\n          } else {\n            result += escaped;\n          }\n          addedText = true;\n        }\n      }\n      if (skip) {\n        result = tempResult + escapeHtml(result);\n        tempResult = '';\n      }\n      frame.openingTagLength = result.length - frame.tagPosition;\n    },\n    ontext: function(text) {\n      updateRawTextRegion();\n      if (skipText || skipRawText) {\n        return;\n      }\n      const lastFrame = stack[stack.length - 1];\n      let tag;\n\n      if (lastFrame) {\n        tag = lastFrame.tag;\n        // If inner text was set by transform function then let's use it\n        text = lastFrame.innerText !== undefined ? lastFrame.innerText : text;\n      }\n\n      if (options.disallowedTagsMode === 'completelyDiscard' && !tagAllowed(tag)) {\n        text = '';\n      } else if (tag && tagAllowed(tag) && (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') && ((tag === 'script') || (tag === 'style'))) {\n        // htmlparser2 gives us these as-is. Escaping them ruins the content. Allowing\n        // script tags is, by definition, game over for XSS protection, so if that's\n        // your concern, don't allow them. The same is essentially true for style tags\n        // which have their own collection of XSS vectors.\n        result += text;\n      } else if (tag && tagAllowed(tag) && (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') && (tag === 'textarea' || tag === 'xmp')) {\n        // <textarea> and <xmp> hold text that must not be re-emitted verbatim:\n        // if a raw `<` survives into the output it can reopen a tag when the\n        // result is re-parsed by a browser, smuggling non-allowlisted markup\n        // through the allowlist (mutation-XSS, GHSA-jxwj-j7wr-gfrw — e.g. the\n        // `</textarea/>` solidus mis-close). We therefore ALWAYS escape this\n        // content rather than passing it through. Escaping unconditionally also\n        // closes the related SVG/MathML foreign-content bypass (where the HTML5\n        // parser treats <textarea>/<xmp> as ordinary foreign elements and a\n        // browser re-parses their contents as live markup, e.g.\n        // `<svg><textarea><img src=x onerror=alert(1)></textarea></svg>`): since\n        // we never re-emit raw text for these tags, no namespace check is\n        // needed. The two tags need different escaping because htmlparser2\n        // tokenizes them differently:\n        if (tag === 'xmp') {\n          // <xmp> is a raw-text (CDATA) element: entities are NOT decoded, so\n          // its content reaches us as raw source that is already entity-encoded.\n          // Escape only the angle brackets so a literal `<` cannot reopen a tag,\n          // while leaving `&` untouched to avoid double-encoding entities that\n          // are already encoded in the source.\n          result += text.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n        } else {\n          // <textarea> is an RCDATA element: htmlparser2 (>= 11) decodes\n          // entities inside it, so its content reaches us as plain decoded text.\n          // It must therefore be fully escaped like any other text — escaping\n          // `&` as well as `<`/`>` — so entities round-trip faithfully (no\n          // double-encoding, see the CVE-2026-40186 regression tests) and no\n          // `<` can reopen a tag.\n          result += escapeHtml(text, false);\n        }\n        // Other \"nonTextTags\" like <option> are not raw text elements in\n        // htmlparser2, so their contents are decoded and must be escaped below\n        // like any other text (important to prevent XSS via entity-encoded\n        // payloads such as <option>&lt;script&gt;...&lt;/script&gt;</option>).\n      } else if (\n        // htmlparser2 treats <iframe> as a raw-text element, so markup inside\n        // (including after an unclosed <iframe>) arrives as a single text node.\n        // When the iframe is discarded, re-sanitize that fallback markup as HTML\n        // instead of escaping it as plain text (issue #5550).\n        // The nested call continues from the current depth so that\n        // `nestingLimit` applies to the whole output.\n        tag === 'iframe' &&\n        !tagAllowed(tag) &&\n        options.disallowedTagsMode === 'discard' &&\n        iframeFallbackDepth < MAX_IFRAME_FALLBACK_DEPTH\n      ) {\n        result += sanitizeHtml(text, options, {\n          depth,\n          iframeFallbackDepth: iframeFallbackDepth + 1\n        });\n      } else if (!addedText) {\n        const escaped = escapeHtml(text, false);\n        if (options.textFilter) {\n          result += options.textFilter(escaped, tag);\n        } else {\n          result += escaped;\n        }\n      }\n      if (stack.length) {\n        const frame = stack[stack.length - 1];\n        frame.text += text;\n      }\n    },\n    onclosetag: function(name, isImplied) {\n      if (options.onCloseTag) {\n        options.onCloseTag(name, isImplied);\n      }\n\n      updateRawTextRegion();\n      if (skipRawText) {\n        // Still inside the browser's raw text: only close elements that were\n        // opened before the discarded region, so the output stays balanced.\n        const lastFrame = stack[stack.length - 1];\n        if (!lastFrame || lastFrame.tag !== name) {\n          return;\n        }\n      } else if (skipText) {\n        skipTextDepth--;\n        if (!skipTextDepth) {\n          skipText = false;\n          if (rawTextEnd !== null) {\n            // htmlparser2 closed the element implicitly (e.g. an ancestor's\n            // end tag) before the browser would. Close its frame below, but\n            // keep discarding up to the browser's end tag.\n            skipRawText = true;\n          }\n        } else {\n          return;\n        }\n      }\n\n      const frame = stack.pop();\n      if (!frame) {\n        // Do not crash on bad markup\n        return;\n      }\n\n      if (frame.tag !== name) {\n        // Another case of bad markup.\n        // Push to stack, so that it will be used in future closing tags.\n        stack.push(frame);\n        return;\n      }\n\n      skipText = options.enforceHtmlBoundary ? name === 'html' : false;\n      depth--;\n      const skip = skipMap[depth];\n      if (skip) {\n        delete skipMap[depth];\n        if (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') {\n          frame.updateParentNodeText();\n          return;\n        }\n        tempResult = result;\n        result = '';\n      }\n\n      if (transformMap[depth]) {\n        name = transformMap[depth];\n        delete transformMap[depth];\n      }\n\n      if (options.exclusiveFilter) {\n        const filterResult = options.exclusiveFilter(frame);\n        if (filterResult === 'excludeTag') {\n          if (skip) {\n            // no longer escaping the tag since it's not added at all\n            result = tempResult;\n            tempResult = '';\n          }\n          // remove the opening tag from the result\n          result = result.substring(0, frame.tagPosition) +\n            result.substring(frame.tagPosition + frame.openingTagLength);\n          return;\n        } else if (filterResult) {\n          result = result.substring(0, frame.tagPosition);\n          return;\n        }\n      }\n\n      frame.updateParentNodeMediaChildren();\n      frame.updateParentNodeText();\n\n      if (\n        // Already output />\n        options.selfClosing.indexOf(name) !== -1 ||\n        // Escaped tag, closing tag is implied\n        (isImplied && !tagAllowed(name) && [ 'escape', 'recursiveEscape' ].indexOf(options.disallowedTagsMode) >= 0)\n      ) {\n        if (skip) {\n          result = tempResult;\n          tempResult = '';\n        }\n        return;\n      }\n\n      result += '</' + name + '>';\n      if (skip) {\n        result = tempResult + escapeHtml(result);\n        tempResult = '';\n      }\n      addedText = false;\n    }\n  }, options.parser);\n  parser.write(html);\n  parser.end();\n\n  if (options.disallowedTagsMode === 'escape' || options.disallowedTagsMode === 'recursiveEscape') {\n    const lastParsedIndex = parser.endIndex;\n    if (lastParsedIndex != null && lastParsedIndex >= 0 &&\n        lastParsedIndex < html.length) {\n      const unparsed = html.substring(lastParsedIndex);\n      result += escapeHtml(unparsed);\n    } else if ((lastParsedIndex == null || lastParsedIndex < 0) && html.length > 0 && result === '') {\n      result = escapeHtml(html);\n    }\n  }\n\n  return result;\n\n  function initializeState() {\n    result = '';\n    depth = baseDepth;\n    stack = [];\n    skipMap = {};\n    transformMap = {};\n    skipText = false;\n    skipTextDepth = 0;\n    rawTextEnd = null;\n    skipRawText = false;\n  }\n\n  // Leave the raw text region once the parser reaches the offset where the\n  // browser ends it.\n  function updateRawTextRegion() {\n    if (rawTextEnd !== null && parser.startIndex >= rawTextEnd) {\n      rawTextEnd = null;\n      skipRawText = false;\n    }\n  }\n\n  // Offset of the end tag that ends a raw text element in a browser: the\n  // first case-insensitive `</name` followed by HTML whitespace, `/` or `>`.\n  // With no such end tag the element runs to the end of the input.\n  function findRawTextEnd(tagName, from) {\n    const re = new RegExp('</' + tagName + '[\\\\t\\\\n\\\\f\\\\r />]', 'ig');\n    re.lastIndex = from;\n    const match = re.exec(html);\n    return match ? match.index : Infinity;\n  }\n\n  function escapeHtml(s, quote) {\n    if (typeof (s) !== 'string') {\n      s = s + '';\n    }\n    if (options.parser.decodeEntities) {\n      s = s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n      if (quote) {\n        s = s.replace(/\"/g, '&quot;');\n      }\n    }\n    // TODO: this is inadequate because it will pass `&0;`. This approach\n    // will not work, each & must be considered with regard to whether it\n    // is followed by a 100% syntactically valid entity or not, and escaped\n    // if it is not. If this bothers you, don't set parser.decodeEntities\n    // to false. (The default is true.)\n    s = s.replace(/&(?![a-zA-Z0-9#]{1,20};)/g, '&amp;') // Match ampersands not part of existing HTML entity\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;');\n    if (quote) {\n      s = s.replace(/\"/g, '&quot;');\n    }\n    return s;\n  }\n\n  function naughtyHref(name, href) {\n    // Resolve the per-tag scheme allowlist if one is configured for\n    // this tag, otherwise fall back to the global allowedSchemes.\n    const allowedSchemes = has(options.allowedSchemesByTag, name)\n      ? options.allowedSchemesByTag[name]\n      : (options.allowedSchemes || []);\n    return launderNaughtyHref(href, {\n      allowedSchemes,\n      allowProtocolRelative: options.allowProtocolRelative\n    });\n  }\n\n  function isRefresh(attribs) {\n    return Object.keys(attribs).some(function(a) {\n      return a.toLowerCase() === 'http-equiv' &&\n        String(attribs[a]).trim().toLowerCase() === 'refresh';\n    });\n  }\n\n  // True if the `content` of a `<meta http-equiv=\"refresh\">` must be dropped:\n  // its destination URL fails the scheme policy, or it cannot be parsed as a\n  // refresh at all (a browser would ignore it then, so nothing is lost).\n  // Extracts the URL the way the HTML standard's \"shared declarative refresh\n  // steps\" do, so that spelling, separator, quoting and case variations of\n  // `url=`, or no `url=` at all, all yield the URL a browser would navigate to.\n  function naughtyRefresh(content) {\n    const input = String(content);\n    const isWhitespace = function(c) {\n      return c === ' ' || c === '\\t' || c === '\\n' || c === '\\f' || c === '\\r';\n    };\n    let position = 0;\n    const skipWhitespace = function() {\n      while (position < input.length && isWhitespace(input[position])) {\n        position++;\n      }\n    };\n    const lowerAt = function(i) {\n      return (input[i] || '').toLowerCase();\n    };\n    skipWhitespace();\n    const timeStart = position;\n    while (position < input.length && /[0-9.]/.test(input[position])) {\n      position++;\n    }\n    if (position === timeStart) {\n      return true;\n    }\n    if (position < input.length) {\n      const c = input[position];\n      if (c !== ';' && c !== ',' && !isWhitespace(c)) {\n        return true;\n      }\n      skipWhitespace();\n      if (input[position] === ';' || input[position] === ',') {\n        position++;\n      }\n      skipWhitespace();\n    }\n    if (position >= input.length) {\n      // No URL: refreshes the current document\n      return false;\n    }\n    let url = input.slice(position);\n    let quoted = true;\n    if (lowerAt(position) === 'u') {\n      quoted = false;\n      if (lowerAt(position + 1) === 'r' && lowerAt(position + 2) === 'l') {\n        position += 3;\n        skipWhitespace();\n        if (input[position] === '=') {\n          position++;\n          skipWhitespace();\n          quoted = true;\n        }\n      }\n    }\n    if (quoted) {\n      const quote = input[position];\n      if (quote === '\"' || quote === '\\'') {\n        position++;\n      }\n      url = input.slice(position);\n      if (quote === '\"' || quote === '\\'') {\n        const end = url.indexOf(quote);\n        if (end !== -1) {\n          url = url.slice(0, end);\n        }\n      }\n    }\n    return naughtyHref('meta', url);\n  }\n\n  // True if this is an SVG SMIL animation element that animates a URL-bearing\n  // attribute, e.g. `<animate attributeName=\"href\" values=\"#safe;javascript:...\">`.\n  //\n  // Such an element carries no URL of its own: the browser copies the animation\n  // values into the target attribute *after* sanitization, so a `javascript:`\n  // destination reaches a live link sink without ever being scheme checked.\n  // `values` compounds this, because it is a semicolon-separated LIST of\n  // destinations: checking it as one flat URL only validates its first entry, so\n  // a leading `#safe` fragment carries the rest of the list past the policy.\n  //\n  // Re-checking each entry of each value attribute would leave the safety of the\n  // output resting on our imitation of SMIL list parsing, so we reject the\n  // animation on the strength of its target instead. Animations of attributes\n  // that are not URL sinks, such as `fill` or `opacity`, are unaffected.\n  function animatesUrlAttribute(name, attribs) {\n    // In an XML serialization a prefixed name such as `svg:animate` is the same\n    // element as `animate`, so match on the local name (GHSA-374f-7chj-9948).\n    if (svgAnimationTags.indexOf(localPart(name)) === -1) {\n      return false;\n    }\n    const schemeCheckedAttributes = options.allowedSchemesAppliedToAttributes || [];\n    return Object.keys(attribs || {}).some(function(attributeName) {\n      if (localPart(attributeName) !== 'attributename') {\n        return false;\n      }\n      const target = (attribs[attributeName] || '').trim().toLowerCase();\n      // The target may be namespace prefixed (`xlink:href`). Which prefixes are\n      // in scope depends on the document, so consider the local name too.\n      const localName = target.slice(target.lastIndexOf(':') + 1);\n      return alwaysUrlAttributes.indexOf(localName) !== -1 ||\n        schemeCheckedAttributes.indexOf(target) !== -1 ||\n        schemeCheckedAttributes.indexOf(localName) !== -1;\n    });\n  }\n\n  // Lowercased name with any namespace prefix removed.\n  function localPart(name) {\n    const lower = name.toLowerCase();\n    return lower.slice(lower.lastIndexOf(':') + 1);\n  }\n\n  function parseUrl(value) {\n    value = value.replace(/^(\\w+:)?\\s*[\\\\/]\\s*[\\\\/]/, '$1//');\n    if (value.startsWith('relative:')) {\n      // An attempt to exploit our workaround for base URLs being\n      // mandatory for relative URL validation in the WHATWG\n      // URL parser, reject it\n      throw new Error('relative: exploit attempt');\n    }\n    // naughtyHref is in charge of whether protocol relative URLs\n    // are cool. Here we are concerned just with allowed hostnames and\n    // whether to allow relative URLs.\n    //\n    // Build a placeholder \"base URL\" against which any reasonable\n    // relative URL may be parsed successfully\n    let base = 'relative://relative-site';\n    for (let i = 0; (i < 100); i++) {\n      base += `/${i}`;\n    }\n\n    const parsed = new URL(value, base);\n\n    const isRelativeUrl = parsed && parsed.hostname === 'relative-site' && parsed.protocol === 'relative:';\n    return {\n      isRelativeUrl,\n      url: parsed\n    };\n  }\n  /**\n   * Filters user input css properties by allowlisted regex attributes.\n   * Modifies the abstractSyntaxTree object.\n   *\n   * @param {object} abstractSyntaxTree  - Object representation of CSS attributes.\n   * @property {array[Declaration]} abstractSyntaxTree.nodes[0] -\n   * Each object contains prop and value key, i.e { prop: 'color', value: 'red' }.\n   * @param {object} allowedStyles       - Keys are properties (i.e color),\n   * value is list of permitted regex rules (i.e /green/i).\n   * @return {object}                    - The modified tree.\n   */\n  function filterCss(abstractSyntaxTree, allowedStyles) {\n    if (!allowedStyles) {\n      return abstractSyntaxTree;\n    }\n\n    const astRules = abstractSyntaxTree.nodes[0];\n    let selectedRule;\n\n    // Merge global and tag-specific styles into new AST.\n    if (allowedStyles[astRules.selector] && allowedStyles['*']) {\n      selectedRule = mergeStyles(\n        allowedStyles[astRules.selector],\n        allowedStyles['*']\n      );\n    } else {\n      selectedRule = allowedStyles[astRules.selector] || allowedStyles['*'];\n    }\n\n    if (selectedRule) {\n      abstractSyntaxTree.nodes[0].nodes = astRules.nodes\n        .reduce(filterDeclarations(selectedRule), []);\n    }\n\n    return abstractSyntaxTree;\n  }\n\n  /**\n   * Extracts the style attributes from an AbstractSyntaxTree and formats those\n   * values in the inline style attribute format.\n   *\n   * @param  {AbstractSyntaxTree} filteredAST\n   * @return {string}             - Example:\n   * \"color:yellow;text-align:center !important;font-family:helvetica;\"\n   */\n  function stringifyStyleAttributes(filteredAST) {\n    return filteredAST.nodes[0].nodes\n      .reduce(function(extractedAttributes, attrObject) {\n        extractedAttributes.push(\n          `${attrObject.prop}:${attrObject.value}${attrObject.important ? ' !important' : ''}`\n        );\n        return extractedAttributes;\n      }, [])\n      .join(';');\n  }\n\n  /**\n    * Filters the existing attributes for the given property. Discards any attributes\n    * which don't match the allowlist.\n    *\n    * @param  {object} selectedRule - Example: { color: red, font-family: helvetica }\n    * @param  {array} allowedDeclarationsList - List of declarations\n    * which pass the allowlist.\n    * @param  {object} attributeObject - Object representing the current css property.\n    * @property {string} attributeObject.type - Typically 'declaration'.\n    * @property {string} attributeObject.prop - The CSS property, i.e 'color'.\n    * @property {string} attributeObject.value - The corresponding value to\n    * the css property, i.e 'red'.\n    * @return {function} - When used in Array.reduce,\n    * will return an array of Declaration objects\n    */\n  function filterDeclarations(selectedRule) {\n    return function (allowedDeclarationsList, attributeObject) {\n      // If this property is allowlisted...\n      if (has(selectedRule, attributeObject.prop)) {\n        const matchesRegex = selectedRule[attributeObject.prop]\n          .some(function(regularExpression) {\n            return regularExpression.test(attributeObject.value);\n          });\n\n        if (matchesRegex) {\n          allowedDeclarationsList.push(attributeObject);\n        }\n      }\n      return allowedDeclarationsList;\n    };\n  }\n\n  function filterClasses(classes, allowed, allowedGlobs) {\n    if (!allowed) {\n      // The class attribute is allowed without filtering on this tag\n      return classes;\n    }\n    classes = classes.split(/\\s+/);\n    return classes.filter(function(clss) {\n      return allowed.indexOf(clss) !== -1 || allowedGlobs.some(function(glob) {\n        return glob.test(clss);\n      });\n    }).join(' ');\n  }\n}\n\n// Defaults are accessible to you so that you can use them as a starting point\n// programmatically if you wish\n\nconst htmlParserDefaults = {\n  decodeEntities: true\n};\nsanitizeHtml.defaults = {\n  allowedTags: [\n    // Sections derived from MDN element categories and limited to the more\n    // benign categories.\n    // https://developer.mozilla.org/en-US/docs/Web/HTML/Element\n    // Content sectioning\n    'address', 'article', 'aside', 'footer', 'header',\n    'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hgroup',\n    'main', 'nav', 'section',\n    // Text content\n    'blockquote', 'dd', 'div', 'dl', 'dt', 'figcaption', 'figure',\n    'hr', 'li', 'menu', 'ol', 'p', 'pre', 'ul',\n    // Inline text semantics\n    'a', 'abbr', 'b', 'bdi', 'bdo', 'br', 'cite', 'code', 'data', 'dfn',\n    'em', 'i', 'kbd', 'mark', 'q',\n    'rb', 'rp', 'rt', 'rtc', 'ruby',\n    's', 'samp', 'small', 'span', 'strong', 'sub', 'sup', 'time', 'u', 'var', 'wbr',\n    // Table content\n    'caption', 'col', 'colgroup', 'table', 'tbody', 'td', 'tfoot', 'th',\n    'thead', 'tr'\n  ],\n  // Tags that cannot be boolean\n  nonBooleanAttributes: [\n    'abbr', 'accept', 'accept-charset', 'accesskey', 'action',\n    'allow', 'alt', 'as', 'autocapitalize', 'autocomplete',\n    'blocking', 'charset', 'cite', 'class', 'color', 'cols',\n    'colspan', 'content', 'contenteditable', 'coords', 'crossorigin',\n    'data', 'datetime', 'decoding', 'dir', 'dirname', 'download',\n    'draggable', 'enctype', 'enterkeyhint', 'fetchpriority', 'for',\n    'form', 'formaction', 'formenctype', 'formmethod', 'formtarget',\n    'headers', 'height', 'hidden', 'high', 'href', 'hreflang',\n    'http-equiv', 'id', 'imagesizes', 'imagesrcset', 'inputmode',\n    'integrity', 'is', 'itemid', 'itemprop', 'itemref', 'itemtype',\n    'kind', 'label', 'lang', 'list', 'loading', 'low', 'max',\n    'maxlength', 'media', 'method', 'min', 'minlength', 'name',\n    'nonce', 'optimum', 'pattern', 'ping', 'placeholder', 'popover',\n    'popovertarget', 'popovertargetaction', 'poster', 'preload',\n    'referrerpolicy', 'rel', 'rows', 'rowspan', 'sandbox', 'scope',\n    'shape', 'size', 'sizes', 'slot', 'span', 'spellcheck', 'src',\n    'srcdoc', 'srclang', 'srcset', 'start', 'step', 'style',\n    'tabindex', 'target', 'title', 'translate', 'type', 'usemap',\n    'value', 'width', 'wrap',\n    // Event handlers\n    'onauxclick', 'onafterprint', 'onbeforematch', 'onbeforeprint',\n    'onbeforeunload', 'onbeforetoggle', 'onblur', 'oncancel',\n    'oncanplay', 'oncanplaythrough', 'onchange', 'onclick', 'onclose',\n    'oncontextlost', 'oncontextmenu', 'oncontextrestored', 'oncopy',\n    'oncuechange', 'oncut', 'ondblclick', 'ondrag', 'ondragend',\n    'ondragenter', 'ondragleave', 'ondragover', 'ondragstart',\n    'ondrop', 'ondurationchange', 'onemptied', 'onended',\n    'onerror', 'onfocus', 'onformdata', 'onhashchange', 'oninput',\n    'oninvalid', 'onkeydown', 'onkeypress', 'onkeyup',\n    'onlanguagechange', 'onload', 'onloadeddata', 'onloadedmetadata',\n    'onloadstart', 'onmessage', 'onmessageerror', 'onmousedown',\n    'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout',\n    'onmouseover', 'onmouseup', 'onoffline', 'ononline', 'onpagehide',\n    'onpageshow', 'onpaste', 'onpause', 'onplay', 'onplaying',\n    'onpopstate', 'onprogress', 'onratechange', 'onreset', 'onresize',\n    'onrejectionhandled', 'onscroll', 'onscrollend',\n    'onsecuritypolicyviolation', 'onseeked', 'onseeking', 'onselect',\n    'onslotchange', 'onstalled', 'onstorage', 'onsubmit', 'onsuspend',\n    'ontimeupdate', 'ontoggle', 'onunhandledrejection', 'onunload',\n    'onvolumechange', 'onwaiting', 'onwheel'\n  ],\n  disallowedTagsMode: 'discard',\n  allowedAttributes: {\n    a: [ 'href', 'name', 'target' ],\n    // We don't currently allow img itself by default, but\n    // these attributes would make sense if we did.\n    img: [ 'src', 'srcset', 'alt', 'title', 'width', 'height', 'loading' ]\n  },\n  allowedEmptyAttributes: [\n    'alt'\n  ],\n  // Lots of these won't come up by default because we don't allow them\n  selfClosing: [ 'img', 'br', 'hr', 'area', 'base', 'basefont', 'input', 'link', 'meta', 'col' ],\n  // URL schemes we permit\n  allowedSchemes: [ 'http', 'https', 'ftp', 'mailto', 'tel' ],\n  allowedSchemesByTag: {},\n  allowedSchemesAppliedToAttributes: [\n    'href', 'src', 'cite',\n    'action', 'formaction', 'data', 'xlink:href',\n    'poster', 'background', 'ping',\n    'longdesc', 'usemap', 'codebase', 'classid', 'archive',\n    'profile', 'manifest', 'itemid',\n    'dynsrc', 'lowsrc'\n  ],\n  allowProtocolRelative: true,\n  enforceHtmlBoundary: false,\n  parseStyleAttributes: true,\n  preserveEscapedAttributes: false\n};\n\nsanitizeHtml.simpleTransform = function(newTagName, newAttribs, merge) {\n  merge = (merge === undefined) ? true : merge;\n  newAttribs = newAttribs || {};\n\n  return function(tagName, attribs) {\n    let attrib;\n    if (merge) {\n      for (attrib in newAttribs) {\n        attribs[attrib] = newAttribs[attrib];\n      }\n    } else {\n      attribs = newAttribs;\n    }\n\n    return {\n      tagName: newTagName,\n      attribs\n    };\n  };\n};\n","<template>\n    <div class=\"markdown\" v-html=\"html\"></div>\n</template>\n\n<script setup>\nimport { computed } from \"vue\";\nimport { marked } from \"marked\";\nimport sanitizeHtml from \"sanitize-html\";\n\nconst props = defineProps({\n    source: { default: \"\" },\n});\n\nconst renderer = new marked.Renderer();\nrenderer.link = function (href, title, text) {\n    return title\n        ? `<a href=\"${href}\" title=\"${title}\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">${text}</a>`\n        : `<a href=\"${href}\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">${text}</a>`;\n};\n\n// can be used to remove some tags during sanitization (after markdown conversion)\nconst allowedTags = [\n    ...sanitizeHtml.defaults.allowedTags,\n    \"img\",\n    \"details\",\n    \"summary\",\n];\n\n// automatically update the converted HTML when 'source' changes\nconst html = computed(() => {\n    try {\n        const rendered = marked(props.source, {\n            renderer,\n            breaks: true,\n            headerIds: false,\n        });\n        return sanitizeHtml(rendered, {\n            allowedTags: allowedTags,\n            allowedAttributes: {\n                ...sanitizeHtml.defaults.allowedAttributes,\n                a: [\"href\", \"name\", \"target\", \"title\", \"rel\"],\n                img: [\"src\", \"alt\", \"title\", \"width\", \"height\"],\n            },\n            exclusiveFilter: function (frame) {\n                // remove images with missing src attribute or non-HTTP(S) src attribute\n                return (\n                    frame.tag === \"img\" &&\n                    (!frame.attribs.src ||\n                        !frame.attribs.src.startsWith(\"http\"))\n                );\n            },\n            transformTags: {\n                a: (tagName, attribs) => {\n                    return {\n                        tagName: tagName,\n                        attribs: {\n                            ...attribs,\n                            target: \"_blank\",\n                            rel: \"nofollow noopener noreferrer\",\n                        },\n                    };\n                },\n                // tranform h tags to be one level smaller (h1 is reserved for page title)\n                h1: \"h2\",\n                h2: \"h3\",\n                h3: \"h4\",\n                h4: \"h5\",\n                h5: \"h6\",\n                h6: \"h6\", // keep h6 as h6\n            },\n        });\n    } catch (err) {\n        console.error(\"Failed to parse markdown\", err);\n        return `<p style=\"color: red;\">Sorry, there was a problem rendering the content.</p>`;\n    }\n});\n</script>\n","<template>\n    <form\n        v-if=\"params.is_authenticated\"\n        class=\"comment-form\"\n        method=\"post\"\n        :action=\"params.send_url\"\n        @submit.prevent=\"submit\"\n    >\n        <template v-if=\"!is_editing\">\n            <input\n                type=\"hidden\"\n                name=\"content_type\"\n                :value=\"params.default_form.content_type\"\n            />\n            <input\n                type=\"hidden\"\n                name=\"object_pk\"\n                :value=\"params.default_form.object_pk\"\n            />\n            <input\n                type=\"hidden\"\n                name=\"security_hash\"\n                :value=\"params.default_form.security_hash\"\n            />\n            <input\n                type=\"hidden\"\n                name=\"timestamp\"\n                :value=\"params.default_form.timestamp\"\n            />\n            <input type=\"hidden\" name=\"reply_to\" :value=\"reply_to\" />\n\n            <div style=\"display: none\">\n                <input type=\"text\" name=\"honeypot\" value=\"\" />\n            </div>\n        </template>\n\n        <div class=\"comment-form__frame\">\n            <!-- Deliberately not a full ARIA tabs pattern (roles, aria-controls,\n                 arrow-key focus): plain toggle buttons with aria-pressed promise\n                 exactly what they deliver. -->\n            <div class=\"comment-form__tabs\">\n                <button\n                    type=\"button\"\n                    :aria-pressed=\"activeTab === 'write'\"\n                    :class=\"tabClass('write')\"\n                    @click=\"showWrite\"\n                >\n                    Write\n                </button>\n                <button\n                    type=\"button\"\n                    :aria-pressed=\"activeTab === 'preview'\"\n                    :class=\"tabClass('preview')\"\n                    @click=\"showPreview\"\n                >\n                    Preview\n                </button>\n            </div>\n\n            <!-- The textarea stays mounted (v-show) while previewing so the\n                 draft, focus handling and Ctrl+Enter submit survive tab switches. -->\n            <textarea\n                v-show=\"activeTab === 'write'\"\n                ref=\"textareaRef\"\n                name=\"comment\"\n                id=\"id_comment\"\n                placeholder=\"Please write your comment in English\"\n                rows=\"5\"\n                maxlength=\"3000\"\n                required\n                class=\"comment-form__textarea\"\n                @keypress=\"onKeyPress\"\n                @keydown.esc=\"onKeyDownEscape\"\n                v-model=\"comment\"\n            ></textarea>\n\n            <div\n                v-if=\"activeTab === 'preview'\"\n                class=\"comment-form__preview\"\n                :style=\"{ minHeight: previewMinHeight }\"\n            >\n                <ProjectMarkdown v-if=\"comment.trim()\" :source=\"comment\" />\n                <p v-else class=\"comment-form__preview-empty\">\n                    Nothing to preview\n                </p>\n            </div>\n        </div>\n\n        <!-- Validators classify a new thread as validation on the root\n             form only - replies never re-classify the thread above them. -->\n        <div\n            v-if=\"!is_editing && !reply_to && params.user_is_validator\"\n            class=\"comments__toggle\"\n            :class=\"{ state_updating: sending }\"\n        >\n            <span class=\"comments__toggle-label\">validation</span>\n            <label class=\"switch xs\">\n                <input type=\"checkbox\" name=\"is_validation\" />\n                <span class=\"toggle-slider round\"></span>\n            </label>\n        </div>\n\n        <!-- Disabled while the draft is blank: submission is impossible with\n             nothing to say, so the browser never has to report the required\n             textarea invalid while Preview keeps it display:none (which would\n             block the submit with no visible feedback). Also disabled while\n             sending, so an impatient second click (or Ctrl+Enter) cannot\n             double-post the comment. -->\n        <button\n            type=\"submit\"\n            name=\"post\"\n            class=\"comment-form__submit\"\n            :class=\"{ 'comment-form__submit--sending': sending }\"\n            :disabled=\"sending || !comment.trim()\"\n            :aria-busy=\"sending\"\n        >\n            {{\n                is_editing\n                    ? sending\n                        ? \"Saving...\"\n                        : \"Save\"\n                    : sending\n                      ? \"Sending...\"\n                      : \"Comment\"\n            }}\n        </button>\n        <button\n            v-if=\"is_editing || show_cancel_button\"\n            type=\"button\"\n            class=\"comment-form__cancel\"\n            @click=\"emit('cancel')\"\n        >\n            Cancel\n        </button>\n\n        <p v-if=\"errorMessage\" class=\"comment-form__error\" role=\"alert\">\n            {{ errorMessage }}\n        </p>\n    </form>\n    <p v-else class=\"comment-form__logout-message\">\n        <a class=\"btn btn-secondary\" :href=\"login_url()\">Log in</a> to comment\n    </p>\n</template>\n\n<script setup>\nimport { ref, computed, nextTick, onMounted } from \"vue\";\nimport ProjectMarkdown from \"./ProjectMarkdown.vue\";\nimport { csrfHeader } from \"../lib\";\n\nconst props = defineProps({\n    params: { type: Object, required: true },\n    reply_to: { type: [Number, String], default: 0 },\n    autofocus: { type: Boolean, default: false },\n    show_cancel_button: { type: Boolean, default: false },\n    // When set ({id, comment}), the form edits that comment instead of\n    // posting a new one: the textarea is prefilled and submit PUTs to\n    // params.edit_comment_url. The whole create-only machinery (hidden\n    // security fields, honeypot, auto-like) is skipped.\n    edit_of: { type: Object, default: null },\n});\n\nconst emit = defineEmits([\"comment-sent\", \"comment-edited\", \"cancel\"]);\nconst ENTER = 13;\n\nconst is_editing = Boolean(props.edit_of);\nconst comment = ref(is_editing ? props.edit_of.comment : \"\");\nconst textareaRef = ref(/** @type {HTMLTextAreaElement | null} */ (null));\nconst errorMessage = ref(\"\");\nconst activeTab = ref(\"write\"); // write | preview\n// True while the POST is in flight; drives the button's Sending... label.\nconst sending = ref(false);\n// Freeze the preview pane's min-height to the textarea's current height so\n// the form doesn't jump when the (usually shorter) rendered markdown swaps in.\nconst previewMinHeight = ref(\"\");\n\n/** @param {string} tab */\nfunction tabClass(tab) {\n    return [\n        \"comment-form__tab\",\n        { \"comment-form__tab--active\": activeTab.value === tab },\n    ];\n}\n\nfunction showPreview() {\n    // Re-measuring on a repeat click would read the now-hidden textarea's\n    // offsetHeight (0) and collapse the frozen min-height below.\n    if (activeTab.value === \"preview\") return;\n    // The textarea is still visible here (v-show), so its height is\n    // available, including any manual resize.\n    // Include its vertical margins to preserve the frame height when the\n    // inset editor is replaced by the flush preview pane.\n    previewMinHeight.value = `calc(${textareaRef.value.offsetHeight}px + 0.8rem)`;\n    activeTab.value = \"preview\";\n}\n\nasync function showWrite() {\n    activeTab.value = \"write\";\n    await nextTick();\n    textareaRef.value?.focus();\n}\n\nconst extra_data = {\n    name: \"\",\n    email: \"\",\n    url: \"\",\n    followup: \"false\",\n};\n\n/** @typedef {Record<string, FormDataEntryValue>} FormFields */\n\nfunction login_url() {\n    const url = document.location;\n    return `${props.params.login_url}?next=${url.pathname}${url.search}`;\n}\n\n/** @param {FormFields} fields */\nfunction validate(fields) {\n    if (typeof fields.comment !== \"string\" || !fields.comment) return false;\n    if (typeof fields.honeypot !== \"string\" || fields.honeypot !== \"\") return false;\n    return true;\n}\n\n/** @param {Event} e */\nasync function submit(e) {\n    // A second submit (Enter held down, double Ctrl+Enter) while the first\n    // request is in flight must be a no-op, not a second comment.\n    if (sending.value) return;\n    errorMessage.value = \"\";\n    if (is_editing) {\n        if (!comment.value.trim()) return;\n        sending.value = true;\n        try {\n            if (!(await send_edit())) return;\n            emit(\"comment-edited\", { comment: comment.value });\n        } finally {\n            sending.value = false;\n        }\n        return;\n    }\n    const formEl = /** @type {HTMLFormElement} */ (e.target);\n    const fields = /** @type {FormFields} */ (Object.fromEntries(new FormData(formEl)));\n    if (!validate(fields)) return;\n    sending.value = true;\n    try {\n        const ok = await send(fields);\n        if (!ok) return;\n        emit(\"comment-sent\", { fields });\n        reset();\n    } finally {\n        // Cleared on success AND failure (including a thrown fetch), so the\n        // button never stays stuck on Sending... after a network error.\n        sending.value = false;\n    }\n}\n\nasync function send_edit() {\n    const headers = csrfHeader();\n    headers.append(\"Content-Type\", \"application/json\");\n    const body = { comment: comment.value };\n    const response = await fetch(\n        props.params.edit_comment_url + props.edit_of.id + \"/\",\n        {\n            method: \"PUT\",\n            headers: headers,\n            body: JSON.stringify(body),\n        }\n    );\n    if (!response || !response.ok) {\n        errorMessage.value = await errorMessageFor(response, \"save\");\n        return false;\n    }\n    return true;\n}\n\n/** @param {FormFields} fields */\nasync function send(fields) {\n    const headers = csrfHeader();\n    const body = new URLSearchParams({ ...extra_data, ...fields });\n    let response = await fetch(props.params.send_url, {\n        method: \"post\",\n        body,\n        headers,\n    });\n    if (!response || !response.ok) {\n        errorMessage.value = await errorMessageFor(response, \"post\");\n        return false;\n    }\n\n    const id = (await response.json()).id;\n    const like = new URLSearchParams({ comment: `${id}`, flag: \"like\" });\n    await fetch(props.params.feedback_url, {\n        method: \"post\",\n        body: like,\n        headers,\n    });\n    return response.ok;\n}\n\n/**\n * @param {Response | undefined} response\n * @param {\"post\" | \"save\"} mode\n */\nasync function errorMessageFor(response, mode) {\n    if (!response) {\n        return \"Network error. Please try again.\";\n    }\n\n    const fallback =\n        mode === \"save\"\n            ? \"Your comment couldn’t be saved. Please try again.\"\n            : \"Your comment couldn’t be posted. Please try again.\";\n\n    // A 403 with an HTML body comes from the Cloudflare WAF blocking the\n    // request at the edge (e.g. comment text that looks like <script>/onerror);\n    // the DRF endpoint's own errors are JSON.\n    const contentType = response?.headers?.get(\"content-type\") || \"\";\n    if (response?.status === 403 && contentType.includes(\"text/html\")) {\n        return \"Your comment looks like it was blocked by our security filter. Please remove any code or HTML from it and try again.\";\n    }\n\n    const detail = await readErrorDetail(response, contentType);\n    if (detail) {\n        return detail;\n    }\n\n    return fallback;\n}\n\n/**\n * @param {Response} response\n * @param {string} contentType\n */\nasync function readErrorDetail(response, contentType) {\n    try {\n        if (contentType.includes(\"application/json\")) {\n            const payload = await response.clone().json();\n            return extractErrorMessage(payload);\n        }\n    } catch {\n        return \"\";\n    }\n    return \"\";\n}\n\n/** @param {unknown} payload */\nfunction extractErrorMessage(payload) {\n    if (typeof payload === \"string\") {\n        return payload;\n    }\n    if (Array.isArray(payload)) {\n        const first = payload.find((item) => typeof item === \"string\");\n        return typeof first === \"string\" ? first : \"\";\n    }\n    if (!payload || typeof payload !== \"object\") {\n        return \"\";\n    }\n    const record = /** @type {Record<string, unknown>} */ (payload);\n    if (typeof record.detail === \"string\") {\n        return record.detail;\n    }\n    for (const value of Object.values(record)) {\n        if (typeof value === \"string\") {\n            return value;\n        }\n        if (Array.isArray(value) && typeof value[0] === \"string\") {\n            return value[0];\n        }\n    }\n    return \"\";\n}\n\n/** @param {KeyboardEvent} e */\nfunction onKeyPress(e) {\n    // Submit with Ctrl + Enter\n    if (e.ctrlKey && e.keyCode === ENTER) {\n        e.target.form.querySelector('button[type=\"submit\"]').click();\n    }\n}\n\n// Escape only means anything in edit mode (discard the draft); in create\n// mode the draft must survive an accidental Esc.\nfunction onKeyDownEscape() {\n    if (is_editing) emit(\"cancel\");\n}\n\nfunction reset() {\n    comment.value = \"\";\n    activeTab.value = \"write\";\n}\n\nonMounted(() => {\n    if (props.autofocus && textareaRef.value) {\n        textareaRef.value.focus();\n    }\n});\n</script>\n","!function(r,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(r=\"undefined\"!=typeof globalThis?globalThis:r||self).dayjs_plugin_relativeTime=e()}(this,(function(){\"use strict\";return function(r,e,t){r=r||{};var n=e.prototype,o={future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"};function i(r,e,t,o){return n.fromToBase(r,e,t,o)}t.en.relativeTime=o,n.fromToBase=function(e,n,i,d,u){for(var f,a,s,l=i.$locale().relativeTime||o,h=r.thresholds||[{l:\"s\",r:44,d:\"second\"},{l:\"m\",r:89},{l:\"mm\",r:44,d:\"minute\"},{l:\"h\",r:89},{l:\"hh\",r:21,d:\"hour\"},{l:\"d\",r:35},{l:\"dd\",r:25,d:\"day\"},{l:\"M\",r:45},{l:\"MM\",r:10,d:\"month\"},{l:\"y\",r:17},{l:\"yy\",d:\"year\"}],m=h.length,c=0;c<m;c+=1){var y=h[c];y.d&&(f=d?t(e).diff(i,y.d,!0):i.diff(e,y.d,!0));var p=(r.rounding||Math.round)(Math.abs(f));if(s=f>0,p<=y.r||!y.r){p<=1&&c>0&&(y=h[c-1]);var v=l[y.l];u&&(p=u(\"\"+p)),a=\"string\"==typeof v?v.replace(\"%d\",p):v(p,n,y.l,s);break}}if(n)return a;var M=s?l.future:l.past;return\"function\"==typeof M?M(a):M.replace(\"%s\",a)},n.to=function(r,e){return i(r,e,this,!0)},n.from=function(r,e){return i(r,e,this)};var d=function(r){return r.$u?t.utc():t()};n.toNow=function(r){return this.to(d(this),r)},n.fromNow=function(r){return this.from(d(this),r)}}}));","<template>\n    <button\n        class=\"comment__feedback dislike\"\n        :class=\"{ 'comment__feedback--active': disliked }\"\n        :disabled=\"sending || disliked\"\n        aria-label=\"Dislike comment\"\n        @click=\"toggle(ACTION.dislike)\"\n    >\n        <span class=\"fa-solid fa-thumbs-down\"></span>\n    </button>\n    <span class=\"comment__feedback-count\">{{ count }}</span>\n    <button\n        class=\"comment__feedback like\"\n        :class=\"{ 'comment__feedback--active': liked }\"\n        :disabled=\"sending || liked\"\n        aria-label=\"Like comment\"\n        @click=\"toggle(ACTION.like)\"\n    >\n        <span class=\"fa-solid fa-thumbs-up\"></span>\n    </button>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from \"vue\";\nimport { csrfHeader } from \"../lib\";\n\nconst props = defineProps({\n    feedbacks: { type: Array, required: true },\n    url: { type: String, default: \"\" },\n    id: { type: [Number, String], default: null },\n    current_user: { type: String, default: \"\" },\n    is_authenticated: { type: Boolean, default: false },\n});\n\nconst ACTION = { like: \"like\", dislike: \"dislike\" };\nconst user_id = Number.parseInt(props.current_user.split(\":\")[0], 10);\n\n// Props are read-only; keep a local mutable copy so the optimistic toggle can\n// update the counts and roll back just the in-flight change if the server\n// rejects it.\nconst feedbacks = ref(props.feedbacks.slice());\nconst sending = ref(false);\n\nwatch(\n    () => props.feedbacks,\n    (value) => {\n        feedbacks.value = value.slice();\n    }\n);\n\nconst likes = computed(() =>\n    feedbacks.value.filter((f) => f.flag === ACTION.like)\n);\nconst dislikes = computed(() =>\n    feedbacks.value.filter((f) => f.flag === ACTION.dislike)\n);\nconst liked = computed(() => likes.value.some((f) => f.id === user_id));\nconst disliked = computed(() => dislikes.value.some((f) => f.id === user_id));\nconst count = computed(() => Math.max(0, likes.value.length - dislikes.value.length));\n\nasync function toggle(action) {\n    if (!props.is_authenticated || sending.value) return;\n\n    const transition = get_transition(action);\n    const previous = feedbacks.value.slice();\n    update_feedbacks(transition.next_flag);\n    sending.value = true;\n    try {\n        const response = await send(transition.request_flag);\n        if (!response || !response.ok) {\n            feedbacks.value = previous;\n        }\n    } finally {\n        sending.value = false;\n    }\n}\n\n// The active action's button is disabled, so a click is always either a\n// first vote or the opposite of the current one.\nfunction get_transition(action) {\n    if (action === ACTION.like) {\n        if (disliked.value) {\n            // Opposite click first removes the current vote: net +1.\n            return { next_flag: null, request_flag: ACTION.dislike };\n        }\n        return { next_flag: ACTION.like, request_flag: ACTION.like };\n    }\n\n    if (liked.value) {\n        // Opposite click first removes the current vote: net -1.\n        return { next_flag: null, request_flag: ACTION.like };\n    }\n    return { next_flag: ACTION.dislike, request_flag: ACTION.dislike };\n}\n\nfunction update_feedbacks(next_flag) {\n    const others = feedbacks.value.filter((f) => f.id !== user_id);\n    feedbacks.value = next_flag\n        ? [...others, { flag: next_flag, user: \"\", id: user_id }]\n        : others;\n}\n\nasync function send(action) {\n    const body = new URLSearchParams({ comment: `${props.id}`, flag: action });\n    const headers = csrfHeader();\n    const response = await fetch(props.url, { method: \"post\", body, headers });\n    return response;\n}\n</script>\n","<template>\n    <div\n        class=\"comments__item\"\n        :class=\"comment_classes\"\n    >\n        <div\n            v-if=\"!is_removed\"\n            :id=\"`c${id}`\"\n            class=\"comment\"\n            :data-parent=\"parent_id\"\n            :data-level=\"level\"\n        >\n            <div class=\"_head\">\n                <span\n                    class=\"tree_node\"\n                    :class=\"node_classes\"\n                    :title=\"node_title\"\n                ></span>\n                <figure class=\"comment__avatar\">\n                    <img\n                        v-if=\"user_avatar\"\n                        :src=\"user_avatar\"\n                        alt=\"avatar\"\n                        class=\"comment__avatar-image\"\n                    />\n                    <div v-else class=\"comment__avatar-placeholder\"></div>\n                </figure>\n                <strong class=\"comment__username\">{{ user_name }}</strong>\n                <span\n                    v-if=\"posted_as_validator\"\n                    class=\"user-badge validator\"\n                    title=\"Blendkit's validators\"\n                    data-bs-toggle=\"tooltip\"\n                    >validator</span\n                >\n                <time\n                    :datetime=\"date.format()\"\n                    :data-timestamp=\"date.unix()\"\n                    :title=\"date_formatted\"\n                    class=\"comment__time\"\n                >\n                    <a :href=\"permalink\" target=\"_blank\">\n                        {{ relative_date }}\n                    </a>\n                </time>\n                <span\n                    v-if=\"is_private || validated\"\n                    class=\"comment__state-badges\"\n                >\n                    <!-- Validation threads are private by definition, so the\n                         lock only marks private comments outside them. -->\n                    <span\n                        v-if=\"is_private && !validated\"\n                        class=\"comment__state-badge comment__state-badge--private\"\n                    >\n                        <span class=\"fa-solid fa-lock\"></span>\n                        private\n                    </span>\n                    <span\n                        v-if=\"validated\"\n                        class=\"comment__state-badge comment__state-badge--validation\"\n                    >\n                        validation\n                    </span>\n                </span>\n            </div>\n            <div v-if=\"!edit_mode\" class=\"_body\">\n                <div class=\"comment__content\">\n                    <ProjectMarkdown :source=\"comment_now\" />\n                </div>\n\n                <div class=\"comment__actions\">\n                    <!-- Validators set the thread type on the root comment;\n                         replies inherit it and hide the toggle. -->\n                    <div\n                        v-if=\"can_toggle_validation\"\n                        class=\"comments__toggle\"\n                        :class=\"{ state_updating: validation_toggling }\"\n                        :title=\"thread_type_toggle_title\"\n                    >\n                        <span class=\"comments__toggle-label\">\n                            validation\n                        </span>\n                        <label class=\"switch\">\n                            <input\n                                type=\"checkbox\"\n                                :checked=\"validated\"\n                                :disabled=\"validation_toggling\"\n                                @click.prevent=\"toggle_validation\"\n                                @keydown=\"on_validation_toggle_keydown\"\n                            />\n                            <span class=\"toggle-slider round\"></span>\n                        </label>\n                    </div>\n                    <CommentFeedback\n                        :id=\"id\"\n                        :feedbacks=\"flags\"\n                        :url=\"params.feedback_url\"\n                        :current_user=\"params.current_user\"\n                        :is_authenticated=\"params.is_authenticated\"\n                    />\n\n                    <button\n                        v-if=\"can_edit\"\n                        class=\"comment__edit\"\n                        @click=\"start_edit\"\n                    >\n                        Edit\n                    </button>\n\n                    <button\n                        v-if=\"can_reply\"\n                        class=\"comment__reply\"\n                        @click=\"form_visible = !form_visible\"\n                    >\n                        Reply\n                    </button>\n                </div>\n            </div>\n            <CommentForm\n                v-else\n                :params=\"params\"\n                :edit_of=\"{ id: id, comment: comment_now }\"\n                :autofocus=\"true\"\n                @comment-edited=\"comment_edited\"\n                @cancel=\"cancel_edit\"\n            />\n            <div\n                v-if=\"can_reply && form_visible && !edit_mode\"\n                class=\"comment__reply-form\"\n            >\n                <CommentForm\n                    :params=\"params\"\n                    :reply_to=\"id\"\n                    :autofocus=\"true\"\n                    :show_cancel_button=\"true\"\n                    @comment-sent=\"comment_sent\"\n                    @cancel=\"cancel_reply\"\n                />\n            </div>\n        </div>\n\n        <div v-if=\"children_now.length\" class=\"comments\" :class=\"`d${depth + 1}`\">\n            <Comment\n                v-for=\"(child, index) in children_now\"\n                :key=\"child_key(child, index)\"\n                v-bind=\"child\"\n                :depth=\"depth + 1\"\n                :is_first=\"index === 0\"\n                :is_last=\"index === children_now.length - 1\"\n                :params=\"params\"\n                @refresh=\"emit('refresh')\"\n            />\n        </div>\n    </div>\n</template>\n\n<script setup>\nimport { ref, computed, watch, onMounted, onUnmounted } from \"vue\";\nimport dayjs from \"dayjs\";\nimport relativeTime from \"dayjs/plugin/relativeTime\";\nimport CommentForm from \"./CommentForm.vue\";\nimport CommentFeedback from \"./CommentFeedback.vue\";\nimport ProjectMarkdown from \"./ProjectMarkdown.vue\";\nimport { csrfHeader } from \"../lib\";\n\ndefineOptions({ name: \"Comment\" });\n\ndayjs.extend(relativeTime);\n\nconst props = defineProps({\n    allow_reply: { type: Boolean, default: false },\n    depth: { type: Number, default: 1 },\n    is_first: { type: Boolean, default: false },\n    is_last: { type: Boolean, default: false },\n    comment: { type: String, default: \"\" },\n    flags: { type: Array, default: () => [] },\n    id: { type: [Number, String], default: null },\n    is_removed: { type: Boolean, default: false },\n    level: { type: [Number, String], default: 0 },\n    parent_id: { default: null },\n    permalink: { type: String, default: \"\" },\n    submit_date: { type: String, default: \"\" },\n    user_avatar: { type: String, default: \"\" },\n    user_moderator: { type: Boolean, default: false },\n    user_id: { type: Number, default: null },\n    is_private: { type: Boolean, default: false },\n    can_change_is_private: { type: Boolean, default: false },\n    posted_as_validator: { type: Boolean, default: false },\n    thread_type: { type: String, default: \"discussion\" },\n    user_name: { type: String, default: \"\" },\n    children: { type: Array, default: () => [] },\n    params: { type: Object, required: true },\n});\n\nconst emit = defineEmits([\"refresh\"]);\n\nconst form_visible = ref(false);\nconst edit_mode = ref(false);\n\nconst date = computed(() => dayjs(props.submit_date));\nconst date_formatted = computed(() => date.value.format(\"D MMM YYYY H:mm\"));\nconst relative_date = ref(\"\");\nconst comment_now = ref(props.comment);\n\nwatch(\n    () => props.comment,\n    (value) => {\n        comment_now.value = value;\n    }\n);\n\nconst current_user_id = computed(() => {\n    const id_text = String(props.params.current_user || \"\").split(\":\")[0];\n    const parsed = Number.parseInt(id_text, 10);\n    return Number.isNaN(parsed) ? null : parsed;\n});\n\nconst now_ms = ref(Date.now());\n\nconst submit_date_ms = computed(() => date.value.valueOf());\nconst edit_time_limit_ms = computed(() => {\n    const seconds = Number.parseInt(String(props.params.edit_time_limit_seconds), 10);\n    if (Number.isNaN(seconds) || seconds <= 0) {\n        return null;\n    }\n    return seconds * 1000;\n});\n\nconst edit_window_open = computed(() => {\n    if (edit_time_limit_ms.value === null) {\n        return true;\n    }\n    if (!Number.isFinite(submit_date_ms.value)) {\n        return false;\n    }\n    return now_ms.value - submit_date_ms.value <= edit_time_limit_ms.value;\n});\n\nconst can_edit = computed(\n    () =>\n        Boolean(props.params.is_authenticated) &&\n        Boolean(props.params.edit_comment_url) &&\n        edit_window_open.value &&\n        current_user_id.value !== null &&\n        props.user_id === current_user_id.value\n);\n\nconst children_now = computed(\n    () => /** @type {Array<Record<string, unknown>>} */ (props.children)\n);\n\n// allow_reply comes from the API and already honours max_thread_level.\nconst can_reply = computed(\n    () => Boolean(props.params.is_authenticated) && props.allow_reply\n);\n\nconst is_root_comment = computed(\n    () =>\n        props.parent_id === null ||\n        props.parent_id === props.id ||\n        Number(props.level) === 0\n);\n\n// thread_type classifies the whole thread, and the API stamps it on every\n// comment in the list — so each comment renders purely from its own payload.\n// Nothing is derived from ancestors client-side; the switch lives on the\n// root only, and its toggle reloads the list so every comment re-reads its\n// authoritative state.\nconst thread_type_now = ref(props.thread_type || \"discussion\");\nwatch(\n    () => props.thread_type,\n    (value) => {\n        thread_type_now.value = value || \"discussion\";\n    }\n);\n\nconst validated = computed(() => thread_type_now.value === \"validation\");\nconst viewer_is_validator = computed(() => Boolean(props.params.user_is_validator));\nconst can_toggle_validation = computed(\n    () => viewer_is_validator.value && is_root_comment.value\n);\n\nconst node_classes = computed(() => ({\n    state_private: props.is_private,\n    state_validation: validated.value,\n}));\n\n// i_first / i_last / has_branch drive the tree lines; the state classes\n// colour the node.\nconst comment_classes = computed(() => ({\n    i_first: props.is_first,\n    i_last: props.is_last,\n    has_branch: Boolean(children_now.value.length),\n    state_private: props.is_private,\n    state_validation: validated.value,\n}));\n\nconst thread_type_toggle_title = computed(() =>\n    validated.value\n        ? \"Validation thread: this thread and everything below is marked. Click to switch the thread back to discussion.\"\n        : \"Click to mark this thread as validation (the thread becomes private).\"\n);\n\nconst validation_toggling = ref(false);\n\nasync function toggle_validation() {\n    if (\n        !viewer_is_validator.value ||\n        validation_toggling.value ||\n        !props.params.toggle_thread_type_url\n    ) {\n        return;\n    }\n    validation_toggling.value = true;\n    const headers = csrfHeader();\n    headers.append(\"Content-Type\", \"application/json\");\n    const next_type =\n        thread_type_now.value === \"validation\" ? \"discussion\" : \"validation\";\n    try {\n        const response = await fetch(props.params.toggle_thread_type_url + props.id + \"/\", {\n            method: \"POST\",\n            headers,\n            body: JSON.stringify({ thread_type: next_type }),\n        });\n        if (response.ok) {\n            // Flip the switch instantly, then reload. thread_type belongs to\n            // the whole thread, and the server also reflects it in the root's\n            // privacy — only the reloaded list is authoritative.\n            thread_type_now.value = next_type;\n            emit(\"refresh\");\n        }\n    } finally {\n        validation_toggling.value = false;\n    }\n}\n\n/** @param {KeyboardEvent} event */\nfunction on_validation_toggle_keydown(event) {\n    if (event.key !== \"Enter\" && event.key !== \" \") return;\n    event.preventDefault();\n    toggle_validation();\n}\n\nconst node_title = computed(() => {\n    if (validated.value) return \"validation\";\n    if (props.is_private) return \"private\";\n    return \"public\";\n});\n\nfunction comment_sent() {\n    emit(\"refresh\");\n    form_visible.value = false;\n}\n\nfunction cancel_reply() {\n    form_visible.value = false;\n}\n\nfunction start_edit() {\n    form_visible.value = false;\n    edit_mode.value = true;\n}\n\nfunction cancel_edit() {\n    edit_mode.value = false;\n}\n\n/** @param {{ comment: string, is_private?: boolean }} payload */\nfunction comment_edited(payload) {\n    comment_now.value = payload.comment;\n    edit_mode.value = false;\n}\n\n/**\n * @param {Record<string, unknown>} child\n * @param {number} fallback\n * @returns {string | number}\n */\nfunction child_key(child, fallback) {\n    const key = child.id;\n    if (typeof key === \"string\" || typeof key === \"number\") {\n        return key;\n    }\n    return fallback;\n}\n\n/** @type {ReturnType<typeof setInterval> | undefined} */\nlet interval;\nonMounted(() => {\n    relative_date.value = date.value.fromNow();\n    interval = setInterval(() => {\n        now_ms.value = Date.now();\n        relative_date.value = date.value.fromNow();\n    }, 5000);\n});\nonUnmounted(() => {\n    clearInterval(interval);\n});\n</script>\n","<template>\n    <div class=\"comments comments__root d1\">\n        <Comment\n            v-for=\"(comment, index) in comments\"\n            :key=\"comment.id\"\n            v-bind=\"comment\"\n            :depth=\"1\"\n            :is_first=\"index === 0\"\n            :is_last=\"index === comments.length - 1\"\n            :params=\"params\"\n            @refresh=\"emit('refresh')\"\n        />\n    </div>\n</template>\n\n<script setup>\nimport { ref, watch } from \"vue\";\nimport Comment from \"./Comment.vue\";\n\nconst props = defineProps({\n    comment_list: { type: Array, required: true },\n    params: { type: Object, required: true },\n});\n\nconst emit = defineEmits([\"refresh\"]);\n\nconst comments = ref([]);\n\nconst newest = (a, b) => b.id - a.id;\nconst oldest = (a, b) => a.id - b.id;\n\nfunction find_id(list, id) {\n    for (const comment of list) {\n        if (comment.id === id) return comment;\n        const found = find_id(comment.children || [], id);\n        if (found) return found;\n    }\n}\n\n// The list endpoint returns a flat list (parents before their replies); rebuild\n// the tree by attaching each comment under its parent. Newest roots first, but\n// oldest replies first within a thread, so a conversation reads top-down.\nfunction build(list) {\n    const roots = [];\n    list.forEach((comment) => {\n        const parent = find_id(roots, comment.parent_id);\n        if (parent) {\n            parent.children = [...(parent.children || []), comment].sort(\n                oldest\n            );\n        } else {\n            roots.push(comment);\n            roots.sort(newest);\n        }\n    });\n    return roots;\n}\n\nwatch(\n    () => props.comment_list,\n    (list) => {\n        comments.value = build(list);\n    },\n    { immediate: true }\n);\n</script>\n","<template>\n    <aside v-if=\"asset_id\" ref=\"rootEl\" class=\"asset-comments\">\n        <template v-if=\"inView\">\n            <p v-if=\"loadState === 'loading'\" class=\"asset-comments--loading\">\n                Loading comments…\n            </p>\n            <p\n                v-else-if=\"loadState === 'error'\"\n                class=\"asset-comments--error\"\n            >\n                Error loading comments\n            </p>\n            <template v-else-if=\"params\">\n                <h2 v-if=\"comment_count > 0\" class=\"comments__heading\">\n                    {{ comment_count }} comment{{\n                        comment_count === 1 ? \"\" : \"s\"\n                    }}\n                </h2>\n                <CommentForm :params=\"params\" @comment-sent=\"on_comment_sent\" />\n                <CommentTree\n                    v-if=\"comment_list.length\"\n                    :comment_list=\"comment_list\"\n                    :params=\"params\"\n                    @refresh=\"load_comments\"\n                />\n            </template>\n        </template>\n        <p v-else class=\"asset-comments--placeholder\" aria-hidden=\"true\">\n            &nbsp;\n        </p>\n    </aside>\n</template>\n\n<script setup>\nimport { ref, watch, onMounted, onUnmounted } from \"vue\";\nimport dayjs from \"dayjs\";\nimport CommentForm from \"./CommentForm.vue\";\nimport CommentTree from \"./CommentTree.vue\";\n\nconst props = defineProps({\n    asset_id: { type: String, default: \"\" },\n});\n\nconst overrides = {\n    allow_comments: true,\n    allow_feedback: true,\n    allow_flagging: true,\n    show_feedback: true,\n};\n\nconst params = ref(null);\nconst comment_count = ref(null);\nconst comment_list = ref([]);\nconst inView = ref(false);\nconst loadState = ref(\"loading\"); // loading | loaded | error\nconst rootEl = ref(null);\n\nlet pollHandle = null;\nlet initToken = 0; // only the highest value is relevant\nlet observer = null;\n\nfunction stopPolling() {\n    if (pollHandle) {\n        clearInterval(pollHandle);\n        pollHandle = null;\n    }\n}\n\nasync function init() {\n    loadState.value = \"loading\";\n    stopPolling();\n    const token = ++initToken;\n\n    let nextParams;\n    try {\n        nextParams = await fetch_params(props.asset_id);\n    } catch {\n        if (token === initToken) loadState.value = \"error\";\n        return;\n    }\n\n    // If in the meantime another init call has been made (fast switches,\n    // unmount), ignore this one.\n    if (token !== initToken) return;\n\n    params.value = nextParams;\n    comment_count.value = nextParams?.comment_count;\n    if (nextParams?.polling_interval) {\n        pollHandle = setInterval(poll_count, nextParams.polling_interval);\n    }\n    if (nextParams) {\n        await load_comments();\n    }\n    if (token === initToken) loadState.value = \"loaded\";\n}\n\nasync function fetch_params(asset_id) {\n    const response = await fetch(`/asset-comment/${asset_id}/`);\n    if (response.ok) {\n        const data = await response.json();\n        return Object.assign(data, overrides);\n    }\n}\n\nfunction timestamp_query() {\n    const timestamp = dayjs().subtract(10, \"minutes\").unix();\n    return new URLSearchParams({ _: timestamp.toString() });\n}\n\nasync function poll_count() {\n    if (document.hidden) return; // don't check on inactive tabs\n    await load_count();\n}\n\nasync function load_count() {\n    if (!params.value) return;\n    let response;\n    try {\n        response = await fetch(\n            `${params.value.count_url}?${timestamp_query()}`\n        );\n    } catch {\n        console.log(\"Error loading comment count, network down\");\n        return;\n    }\n    comment_count.value = (await response.json()).count;\n}\n\n// The count poll can land between the comment POST and the optimistic\n// increment, double-counting the new comment. Re-syncing both list and count\n// from the server settles the UI on the real state.\nasync function on_comment_sent() {\n    comment_count.value += 1; // optimistic, reconciled below\n    await load_comments();\n    await load_count();\n}\n\nasync function load_comments() {\n    const response = await fetch(params.value.list_url);\n    comment_list.value = await response.json();\n}\n\nfunction cleanup() {\n    initToken++;\n    stopPolling();\n    comment_list.value = [];\n    comment_count.value = null;\n    params.value = null;\n}\n\n// The comments section sits below the asset card, so for most users it starts\n// off-screen. Defer the params/list fetches until it scrolls into view (with a\n// 200px head-start) so the page load isn't blocked on data nobody is reading.\nonMounted(() => {\n    if (!rootEl.value) return;\n    if (typeof IntersectionObserver === \"undefined\") {\n        inView.value = true;\n        return;\n    }\n    observer = new IntersectionObserver(\n        (entries) => {\n            if (entries.some((entry) => entry.isIntersecting)) {\n                inView.value = true;\n                observer.disconnect();\n            }\n        },\n        { rootMargin: \"200px 0px\" }\n    );\n    observer.observe(rootEl.value);\n});\n\nonUnmounted(() => {\n    initToken++;\n    stopPolling();\n    if (observer) observer.disconnect();\n});\n\nwatch([inView, () => props.asset_id], ([nowInView, assetId]) => {\n    if (nowInView && assetId) init();\n});\n\nwatch(\n    () => props.asset_id,\n    (assetId) => {\n        if (!assetId) cleanup();\n    }\n);\n</script>\n","import { createApp } from \"vue\";\nimport Comments from \"./Comments.vue\";\n\nlet commentsApp;\n\nwindow.unmountComments = function () {\n    if (commentsApp) {\n        commentsApp.unmount();\n        commentsApp = undefined;\n    }\n};\n\n/* comments are used in:\n * - asset modal: my assets, gallery asset-detail, purchases, my orders > detail,\n *                cart, cart summary\n * - addon page: at the bottom of the page\n * - My Assets findings modal: the discussion under the validation findings\n */\nwindow.mountComments = function (assetId, targetEl) {\n    // An explicit element lets a host that is not the page (the My Assets\n    // findings modal) carry the island; otherwise the page's #comments.\n    const target = targetEl || document.getElementById(\"comments\");\n    if (!target) {\n        console.warn(\"#comments element not found. Can't mount comments.\");\n        return;\n    }\n\n    // Priority: 1) passed parameter, 2) data-asset-uuid on #comments element\n    const finalAssetId = assetId || target.dataset.assetUuid;\n\n    if (!finalAssetId) {\n        console.warn(\"No asset UUID available for comments\");\n        return;\n    }\n\n    window.unmountComments();\n\n    commentsApp = createApp(Comments, { asset_id: finalAssetId });\n    commentsApp.mount(target);\n\n    window.djangoCommentsXtd = commentsApp;\n};\n"],"names":["e","module","this","n","i","s","u","a","o","c","f","h","d","l","$","y","M","t","m","r","v","g","D","p","S","_","w","O","b","Y","getDefaults","defaults","changeDefaults","newDefaults","escapeTest","escapeReplace","escapeTestNoEncode","escapeReplaceNoEncode","escapeReplacements","getEscapeReplacement","ch","escape","html","encode","unescapeTest","unescape","caret","edit","regex","opt","obj","name","val","nonWordAndColonTest","originIndependentUrl","cleanUrl","sanitize","base","href","prot","resolveUrl","baseUrls","justDomain","protocol","domain","rtrim","relativeBase","noopTest","splitCells","tableRow","count","row","match","offset","str","escaped","curr","cells","invert","suffLen","currChar","findClosingBracket","level","checkDeprecations","callback","outputLink","cap","link","raw","lexer","title","text","token","indentCodeCompensation","matchIndentToCode","indentToCode","node","matchIndentInNode","indentInNode","Tokenizer$1","options","src","trimmed","top","tokens","istask","ischecked","indent","blankLine","endsWithBlankLine","line","nextLine","rawLine","itemContents","endEarly","bull","isordered","list","itemRegex","nextBulletRegex","hrRegex","fencesBeginRegex","headingBeginRegex","spacers","hasMultipleLineBreaks","tag","item","j","k","trimmedUrl","rtrimSlash","lastParenIndex","linkLen","links","maskedSrc","prevChar","lLength","rDelim","rLength","delimTotal","midDelimTotal","endReg","hasNonSpaceChars","hasSpaceCharsOnBothEnds","mangle","prevCapZero","smartypants","block","inline","out","Lexer","Tokenizer","rules","next","leading","tabs","lastToken","cutSrc","lastParagraphClipped","extTokenizer","startIndex","tempSrc","tempStart","getStartIndex","errMsg","keepPrevChar","Renderer","code","infostring","lang","quote","slugger","id","body","ordered","start","type","startatt","checked","header","content","flags","TextRenderer","Slugger","value","originalSlug","isDryRun","slug","occurenceAccumulator","Parser$1","Parser","l2","l3","cell","loose","itemBody","task","checkbox","ret","renderer","Hooks","markdown","__publicField","Marked","args","__privateAdd","_Marked_instances","__privateMethod","parseMarkdown_fn","values","childTokens","extensions","pack","opts","ext","prevRenderer","prop","tokenizer","prevTokenizer","hooks","prevHook","arg","walkTokens","parser","origOpt","throwError","onError_fn","highlight","done","err","pending","silent","async","msg","markedInstance","marked","decodeMap","replaceCodePoint","codePoint","decodeBase64","input","binary","evenLength","index","outIndex","lo","hi","htmlDecodeTree","xmlDecodeTree","BinTrieFlags","CharCodes","TO_LOWER_BIT","isNumber","isHexadecimalCharacter","isAsciiAlphaNumeric","isEntityInAttributeInvalidEnd","EntityDecoderState","DecodingMode","EntityDecoder","decodeTree","emitCodePoint","errors","decodeMode","char","digit","lastCp","expectedLength","_a","current","valueLength","runLength","firstChar","charIndexInPacked","packedWord","expectedChar","determineBranch","result","consumed","nodeIndex","branchCount","jumpOffset","packedKeySlots","mid","slot","midKey","State","isWhitespace","isEndOfTagSection","isASCIIAlpha","QuoteType","Sequences","specialStartSequences","xmlMode","decodeEntities","recognizeSelfClosing","cbs","cp","chunk","lower","endOfText","actualIndex","special","_b","indexInBuffer","length","endIndex","cdataStart","fromCodePoint","formTags","pTag","headingTags","tableSectionTags","ddtTags","rtpTags","openImpliesClose","DOCUMENT_TYPE","voidElements","foreignContextElements","htmlIntegrationElements","svgTagNameAdjustments","ForeignContext","reNameEnd","data","adjusted","impliesClose","isImplied","_d","_c","_f","_e","pos","implied","element","isOpenImplied","_h","_g","_j","_i","_l","_k","end","slice","ElementType","isTag","Root","Text","Directive","Comment","Script","Style","Tag","CDATA","Doctype","Node","parent","previous","recursive","cloneNode","DataNode","ProcessingInstruction","NodeWithChildren","children","Document","Element","attribs","isTagRaw","isCDATA","isText","isComment","isDirective","isDocument","hasChildren","cloneChildren","clone","child","instruction","childs","defaultOptions","DomHandler","elementCB","error","lastNode","previousSibling","filter","test","recurse","limit","find","nodes","nodeStack","indexStack","findOne","searchedNodes","found","existsOne","findAll","Checks","getAttribCheck","attrib","combineFuncs","compileTest","funcs","key","testElement","getElements","getElementById","getElementsByTagName","tagName","getElementsByClassName","className","getElementsByTagType","xmlCodeMap","getCodePoint","XML_BITSET_VALUE","encodeXML","last","getEscaper","map","lastIndex","escapeAttribute","escapeText","elementNames","attributeNames","unencodedElements","foreignElements","foreignModeIntegrationPoints","render","output","renderNode","renderChildren","ElementType.Root","ElementType.Directive","ElementType.Comment","ElementType.CDATA","ElementType.Script","ElementType.Style","ElementType.Tag","renderTag","ElementType.Text","isVoid","formatAttributes","replaceQuotes","attributes","isForeign","showEmpty","getOuterHTML","renderHTML","getInnerHTML","getText","textContent","innerText","getFeed","document","feedRoot","getOneElement","isValidFeed","getAtomFeed","getRssFeed","feed","entry","getMediaElements","addConditionally","description","fetch","pubDate","updated","MEDIA_KEYS_STRING","MEDIA_KEYS_INT","where","media","object","property","removeSubsets","ancestor","DocumentPosition","compareDocumentPosition","nodeA","nodeB","aParents","bParents","maxIndex","sharedParent","siblings","aSibling","bSibling","uniqueSort","array","relative","removeElement","childsIndex","replaceElement","replacement","elementIndex","appendChild","sibling","append","currentNext","prependChild","prepend","getChildren","getParent","getSiblings","prev","getAttributeValue","hasAttrib","getName","nextElementSibling","prevElementSibling","parseDocument","handler","createDocumentStream","elementCallback","parseFeedDefaultOptions","parseFeed","escapeStringRegexp","string","isObject","isPlainObject","ctor","isPlainObject_1","root","factory","isSpace","collectCharacters","regEx","chars","inputLength","regexLeadingSpaces","regexLeadingCommasOrSpaces","regexLeadingNotSpaces","regexTrailingCommas","regexNonNegativeInteger","regexFloatingPoint","url","descriptors","currentDescriptor","state","candidates","parseDescriptors","tokenize","pError","candidate","desc","lastChar","intVal","floatVal","x","create","picocolors_browserModule","pico","require$$0","terminalHighlight","require$$1","CssSyntaxError","message","column","source","file","plugin","color","css","aside","mark","bold","gray","red","lines","maxWidth","number","gutter","padding","subLineStart","subLineEnd","subLine","spacing","cssSyntaxError","AT_NAME_END","DEFAULT_RAW","capitalize","atruleStart","params","afterName","isCustomProperty","before","pushBody","stack","semicolon","childSemicolon","pushBlock","between","hasNodes","close","after","Stringifier","builder","detect","buf","depth","step","proto","expandable","method","left","right","raws","own","cache","parts","stringifier","STYLE_TAG","COMMENT_OPEN","escapeHTMLInCSS","cutEscaped","chunks","at","into","from","SafeStringifier","print","stringify","stringify_1","symbols","require$$2","isClean","my","require$$3","cloned","target","targetParent","childClone","valueClone","sourceOffset","inputCSS","position","add","overrides","keepBetween","inputString","defaultType","bookmark","foundSelf","inputs","emitInputs","holderOfRoot","queue","holder","fixed","fixedArray","inputId","comment","Declaration","declaration","AtRule","parse","Rule","cleanSource","markTreeDirty","Container","iterator","condition","cb","other","exist","existIndex","sample","pattern","decl","opened","selector","dependant","container","atRule","LazyResult","Processor","urlAlphabet","nonSecure","size","alphabet","defaultSize","existsSync","readFileSync","realpathSync","dirname","isAbsolute","join","sep","SourceMapConsumer","SourceMapGenerator","realPath","path","fromBase64","PreviousMap","baseCharsetUri","baseUri","charsetUri","uri","uriMatch","baseUriMatch","encoding","sourceMapString","comments","cssFile","trusted","rel","prevPath","unknown","previousMap","nanoid","resolve","fileURLToPath","pathToFileURL","require$$4","require$$5","require$$6","lineToIndexCache","sourceMapAvailable","pathAvailable","getLineToIndex","lineToIndex","prevIndex","Input","endColumn","endLine","endOffset","origin","lastLine","min","max","consumer","to","toPosition","fromUrl","json","keepBefore","ignore","spaces","separators","split","func","inQuote","prevQuote","inComment","letter","list_1","rule","hydrateInputs","inputHydrated","constructNode","fromJSON","frame","jsonNodes","childJson","fromJSON_1","MapGenerator","cssString","eol","annotation","cursor","noSource","mapping","cached","already","fileURL","mapGenerator","SINGLE_QUOTE","DOUBLE_QUOTE","BACKSLASH","SLASH","NEWLINE","SPACE","FEED","TAB","CR","OPEN_SQUARE","CLOSE_SQUARE","OPEN_PARENTHESES","CLOSE_PARENTHESES","OPEN_CURLY","CLOSE_CURLY","SEMICOLON","ASTERISK","COLON","AT","RE_AT_END","RE_WORD_END","RE_BAD_BRACKET","RE_HEX_ESCAPE","currentToken","escapePos","buffer","returned","lastBadParen","unclosed","what","endOfFile","nextToken","ignoreUnclosed","controlChar","back","SAFE_COMMENT_NEIGHBOR","findLastWithPosition","tokensToString","shift","open","brackets","colon","founded","customProperty","propStart","betweenStart","firstSpacesStart","firstSpaces","bracket","clean","all","lastTokenType","parse_1","Warning","range","warning","Result","processor","require$$7","TYPE_TO_CLASS_NAME","PLUGIN_PROPS","NOT_VISITORS","CHILDREN","isPromise","getEvents","toStack","events","cleanMarks","postcss","onRejected","onFinally","event","promise","visitor","roots","subRoot","rootSource","onFulfilled","visitors","visit","visitNode","descended","lazyResult","NoWorkResult","self","generatedCSS","generatedMap","noWorkResult","plugins","normalized","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","initializer","warningPrinted","creator","define_process_env_default","transformer","processOpts","pluginOpts","postcss_1","dayjs","cleanHref","firstIndex","naughtyHref","allowedSchemes","allowProtocolRelative","matches","scheme","launderModule","def","strings","places","httpsFix","fixUrl","choices","choice","criteria","date","now","components","returnDefault","nowYear","nowCentury","theirYear","time","hours","minutes","seconds","ampm","tags","ids","htmlparser","parseSrcset","postcssParse","launderNaughtyHref","mediaTags","vulnerableTags","svgAnimationTags","alwaysUrlAttributes","severities","loggerFor","logger","severity","each","has","mergeClasses","specific","wildcard","mergeStyles","merged","isEmptyObject","stringifySrcset","parsedSrcset","part","sanitizeHtml_1","sanitizeHtml","VALID_HTML_ATTRIBUTE_NAME","MAX_IFRAME_FALLBACK_DEPTH","_fallback","baseDepth","iframeFallbackDepth","tempResult","Frame","that","parentFrame","htmlParserDefaults","tagAllowed","nonTextTagsArray","allowedAttributesMap","allowedAttributesGlobMap","globRegex","allowedClassesMap","allowedClassesGlobMap","allowedClassesRegexMap","classes","transformTagsMap","transformTagsAll","transform","transFun","skipMap","transformMap","skipText","skipTextDepth","rawTextEnd","skipRawText","addedText","initializeState","updateRawTextRegion","skip","hasText","transformedTag","animatesUrlAttribute","findRawTextEnd","escapeHtml","passedAllowedAttributesMapCheck","newValue","splitStrArray","isRefresh","naughtyRefresh","allowed","parsed","parseUrl","allowedHostname","hostname","allowedDomain","allowedSpecificClasses","allowedWildcardClasses","allowedSpecificClassesGlob","allowedSpecificClassesRegex","allowedWildcardClassesRegex","allowedWildcardClassesGlob","allowedClassesGlobs","filterClasses","abstractSyntaxTree","filteredAST","filterCss","stringifyStyleAttributes","lastFrame","filterResult","lastParsedIndex","unparsed","re","skipWhitespace","lowerAt","timeStart","quoted","localPart","schemeCheckedAttributes","attributeName","localName","allowedStyles","astRules","selectedRule","filterDeclarations","extractedAttributes","attrObject","allowedDeclarationsList","attributeObject","regularExpression","allowedGlobs","clss","glob","newTagName","newAttribs","merge","props","__props","allowedTags","computed","rendered","_createElementBlock","ENTER","emit","__emit","is_editing","ref","textareaRef","errorMessage","activeTab","sending","previewMinHeight","tabClass","tab","showPreview","showWrite","nextTick","extra_data","login_url","validate","fields","submit","send_edit","formEl","send","reset","headers","csrfHeader","response","errorMessageFor","like","mode","fallback","contentType","detail","readErrorDetail","payload","extractErrorMessage","first","record","onKeyPress","onKeyDownEscape","onMounted","_unref","_Fragment","_createElementVNode","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","$event","_createBlock","ProjectMarkdown","_hoisted_11","_normalizeClass","_hoisted_13","_toDisplayString","_openBlock","_hoisted_14","_hoisted_15","ACTION","user_id","feedbacks","watch","likes","dislikes","liked","disliked","toggle","action","transition","get_transition","update_feedbacks","next_flag","others","_cache","_hoisted_2","relativeTime","form_visible","edit_mode","date_formatted","relative_date","comment_now","current_user_id","id_text","now_ms","submit_date_ms","edit_time_limit_ms","edit_window_open","can_edit","children_now","can_reply","is_root_comment","thread_type_now","validated","viewer_is_validator","can_toggle_validation","node_classes","comment_classes","thread_type_toggle_title","validation_toggling","toggle_validation","next_type","on_validation_toggle_keydown","node_title","comment_sent","cancel_reply","start_edit","cancel_edit","comment_edited","child_key","interval","onUnmounted","_hoisted_4","_hoisted_6","_hoisted_12","CommentForm","_createVNode","_hoisted_16","_hoisted_18","CommentFeedback","_hoisted_20","_renderList","_component_Comment","_mergeProps","newest","oldest","find_id","build","_hoisted_1","comment_count","comment_list","inView","loadState","rootEl","pollHandle","initToken","observer","stopPolling","init","nextParams","fetch_params","poll_count","load_comments","asset_id","timestamp_query","timestamp","load_count","on_comment_sent","cleanup","entries","nowInView","assetId","_hoisted_3","CommentTree","commentsApp","targetEl","finalAssetId","createApp","Comments"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,59]}