{"version":3,"file":"vue-dompurify-html-HpBrOM82.js","sources":["../../../node_modules/.pnpm/uc.micro@1.0.6/node_modules/uc.micro/properties/Any/regex.js","../../../node_modules/.pnpm/uc.micro@1.0.6/node_modules/uc.micro/categories/Cc/regex.js","../../../node_modules/.pnpm/uc.micro@1.0.6/node_modules/uc.micro/categories/Z/regex.js","../../../node_modules/.pnpm/uc.micro@1.0.6/node_modules/uc.micro/categories/P/regex.js","../../../node_modules/.pnpm/linkify-it@4.0.1/node_modules/linkify-it/lib/re.js","../../../node_modules/.pnpm/linkify-it@4.0.1/node_modules/linkify-it/index.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/common/entities.js","../../../node_modules/.pnpm/mdurl@1.0.1/node_modules/mdurl/encode.js","../../../node_modules/.pnpm/mdurl@1.0.1/node_modules/mdurl/decode.js","../../../node_modules/.pnpm/mdurl@1.0.1/node_modules/mdurl/format.js","../../../node_modules/.pnpm/mdurl@1.0.1/node_modules/mdurl/parse.js","../../../node_modules/.pnpm/mdurl@1.0.1/node_modules/mdurl/index.js","../../../node_modules/.pnpm/uc.micro@1.0.6/node_modules/uc.micro/categories/Cf/regex.js","../../../node_modules/.pnpm/uc.micro@1.0.6/node_modules/uc.micro/index.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/common/utils.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/helpers/parse_link_label.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/helpers/parse_link_destination.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/helpers/parse_link_title.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/helpers/index.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/renderer.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/ruler.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_core/normalize.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_core/block.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_core/inline.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_core/linkify.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_core/replacements.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_core/smartquotes.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_core/text_join.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/token.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_core/state_core.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/parser_core.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_block/table.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_block/code.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_block/fence.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_block/blockquote.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_block/hr.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_block/list.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_block/reference.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/common/html_blocks.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/common/html_re.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_block/html_block.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_block/heading.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_block/lheading.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_block/paragraph.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_block/state_block.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/parser_block.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/text.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/linkify.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/newline.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/escape.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/backticks.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/strikethrough.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/emphasis.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/link.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/image.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/autolink.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/html_inline.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/entity.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/balance_pairs.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/fragments_join.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/rules_inline/state_inline.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/parser_inline.js","../../../node_modules/.pnpm/punycode@2.3.1/node_modules/punycode/punycode.es6.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/presets/default.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/presets/zero.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/presets/commonmark.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/lib/index.js","../../../node_modules/.pnpm/markdown-it@13.0.2/node_modules/markdown-it/index.js","../../../node_modules/.pnpm/markdown-it-link-attributes@4.0.1/node_modules/markdown-it-link-attributes/index.js","../../../app/javascript/shared/helpers/markdownIt/link.js","../../../app/javascript/shared/helpers/MessageFormatter.js","../../../app/javascript/shared/composables/useMessageFormatter.js","../../../node_modules/.pnpm/dompurify@3.2.4/node_modules/dompurify/dist/purify.es.mjs","../../../node_modules/.pnpm/vue-dompurify-html@5.1.0_vue@3.5.12_typescript@5.6.2_/node_modules/vue-dompurify-html/dist/vue-dompurify-html.mjs"],"sourcesContent":["module.exports=/[\\0-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/","module.exports=/[\\0-\\x1F\\x7F-\\x9F]/","module.exports=/[ \\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]/","module.exports=/[!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u09FD\\u0A76\\u0AF0\\u0C84\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E4E\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD803[\\uDF55-\\uDF59]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC8\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD806[\\uDC3B\\uDE3F-\\uDE46\\uDE9A-\\uDE9C\\uDE9E-\\uDEA2]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71\\uDEF7\\uDEF8]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD81B[\\uDE97-\\uDE9A]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]/","'use strict';\n\n\nmodule.exports = function (opts) {\n  var re = {};\n  opts = opts || {};\n\n  // Use direct extract instead of `regenerate` to reduse browserified size\n  re.src_Any = require('uc.micro/properties/Any/regex').source;\n  re.src_Cc  = require('uc.micro/categories/Cc/regex').source;\n  re.src_Z   = require('uc.micro/categories/Z/regex').source;\n  re.src_P   = require('uc.micro/categories/P/regex').source;\n\n  // \\p{\\Z\\P\\Cc\\CF} (white spaces + control + format + punctuation)\n  re.src_ZPCc = [ re.src_Z, re.src_P, re.src_Cc ].join('|');\n\n  // \\p{\\Z\\Cc} (white spaces + control)\n  re.src_ZCc = [ re.src_Z, re.src_Cc ].join('|');\n\n  // Experimental. List of chars, completely prohibited in links\n  // because can separate it from other part of text\n  var text_separators = '[><\\uff5c]';\n\n  // All possible word characters (everything without punctuation, spaces & controls)\n  // Defined via punctuation & spaces to save space\n  // Should be something like \\p{\\L\\N\\S\\M} (\\w but without `_`)\n  re.src_pseudo_letter       = '(?:(?!' + text_separators + '|' + re.src_ZPCc + ')' + re.src_Any + ')';\n  // The same as abothe but without [0-9]\n  // var src_pseudo_letter_non_d = '(?:(?![0-9]|' + src_ZPCc + ')' + src_Any + ')';\n\n  ////////////////////////////////////////////////////////////////////////////////\n\n  re.src_ip4 =\n\n    '(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)';\n\n  // Prohibit any of \"@/[]()\" in user/pass to avoid wrong domain fetch.\n  re.src_auth    = '(?:(?:(?!' + re.src_ZCc + '|[@/\\\\[\\\\]()]).)+@)?';\n\n  re.src_port =\n\n    '(?::(?:6(?:[0-4]\\\\d{3}|5(?:[0-4]\\\\d{2}|5(?:[0-2]\\\\d|3[0-5])))|[1-5]?\\\\d{1,4}))?';\n\n  re.src_host_terminator =\n\n    '(?=$|' + text_separators + '|' + re.src_ZPCc + ')' +\n    '(?!' + (opts['---'] ? '-(?!--)|' : '-|') + '_|:\\\\d|\\\\.-|\\\\.(?!$|' + re.src_ZPCc + '))';\n\n  re.src_path =\n\n    '(?:' +\n      '[/?#]' +\n        '(?:' +\n          '(?!' + re.src_ZCc + '|' + text_separators + '|[()[\\\\]{}.,\"\\'?!\\\\-;]).|' +\n          '\\\\[(?:(?!' + re.src_ZCc + '|\\\\]).)*\\\\]|' +\n          '\\\\((?:(?!' + re.src_ZCc + '|[)]).)*\\\\)|' +\n          '\\\\{(?:(?!' + re.src_ZCc + '|[}]).)*\\\\}|' +\n          '\\\\\"(?:(?!' + re.src_ZCc + '|[\"]).)+\\\\\"|' +\n          \"\\\\'(?:(?!\" + re.src_ZCc + \"|[']).)+\\\\'|\" +\n          \"\\\\'(?=\" + re.src_pseudo_letter + '|[-])|' +  // allow `I'm_king` if no pair found\n          '\\\\.{2,}[a-zA-Z0-9%/&]|' + // google has many dots in \"google search\" links (#66, #81).\n                                     // github has ... in commit range links,\n                                     // Restrict to\n                                     // - english\n                                     // - percent-encoded\n                                     // - parts of file path\n                                     // - params separator\n                                     // until more examples found.\n          '\\\\.(?!' + re.src_ZCc + '|[.]|$)|' +\n          (opts['---'] ?\n            '\\\\-(?!--(?:[^-]|$))(?:-*)|' // `---` => long dash, terminate\n            :\n            '\\\\-+|'\n          ) +\n          ',(?!' + re.src_ZCc + '|$)|' +       // allow `,,,` in paths\n          ';(?!' + re.src_ZCc + '|$)|' +       // allow `;` if not followed by space-like char\n          '\\\\!+(?!' + re.src_ZCc + '|[!]|$)|' +  // allow `!!!` in paths, but not at the end\n          '\\\\?(?!' + re.src_ZCc + '|[?]|$)' +\n        ')+' +\n      '|\\\\/' +\n    ')?';\n\n  // Allow anything in markdown spec, forbid quote (\") at the first position\n  // because emails enclosed in quotes are far more common\n  re.src_email_name =\n\n    '[\\\\-;:&=\\\\+\\\\$,\\\\.a-zA-Z0-9_][\\\\-;:&=\\\\+\\\\$,\\\\\"\\\\.a-zA-Z0-9_]*';\n\n  re.src_xn =\n\n    'xn--[a-z0-9\\\\-]{1,59}';\n\n  // More to read about domain names\n  // http://serverfault.com/questions/638260/\n\n  re.src_domain_root =\n\n    // Allow letters & digits (http://test1)\n    '(?:' +\n      re.src_xn +\n      '|' +\n      re.src_pseudo_letter + '{1,63}' +\n    ')';\n\n  re.src_domain =\n\n    '(?:' +\n      re.src_xn +\n      '|' +\n      '(?:' + re.src_pseudo_letter + ')' +\n      '|' +\n      '(?:' + re.src_pseudo_letter + '(?:-|' + re.src_pseudo_letter + '){0,61}' + re.src_pseudo_letter + ')' +\n    ')';\n\n  re.src_host =\n\n    '(?:' +\n    // Don't need IP check, because digits are already allowed in normal domain names\n    //   src_ip4 +\n    // '|' +\n      '(?:(?:(?:' + re.src_domain + ')\\\\.)*' + re.src_domain/*_root*/ + ')' +\n    ')';\n\n  re.tpl_host_fuzzy =\n\n    '(?:' +\n      re.src_ip4 +\n    '|' +\n      '(?:(?:(?:' + re.src_domain + ')\\\\.)+(?:%TLDS%))' +\n    ')';\n\n  re.tpl_host_no_ip_fuzzy =\n\n    '(?:(?:(?:' + re.src_domain + ')\\\\.)+(?:%TLDS%))';\n\n  re.src_host_strict =\n\n    re.src_host + re.src_host_terminator;\n\n  re.tpl_host_fuzzy_strict =\n\n    re.tpl_host_fuzzy + re.src_host_terminator;\n\n  re.src_host_port_strict =\n\n    re.src_host + re.src_port + re.src_host_terminator;\n\n  re.tpl_host_port_fuzzy_strict =\n\n    re.tpl_host_fuzzy + re.src_port + re.src_host_terminator;\n\n  re.tpl_host_port_no_ip_fuzzy_strict =\n\n    re.tpl_host_no_ip_fuzzy + re.src_port + re.src_host_terminator;\n\n\n  ////////////////////////////////////////////////////////////////////////////////\n  // Main rules\n\n  // Rude test fuzzy links by host, for quick deny\n  re.tpl_host_fuzzy_test =\n\n    'localhost|www\\\\.|\\\\.\\\\d{1,3}\\\\.|(?:\\\\.(?:%TLDS%)(?:' + re.src_ZPCc + '|>|$))';\n\n  re.tpl_email_fuzzy =\n\n      '(^|' + text_separators + '|\"|\\\\(|' + re.src_ZCc + ')' +\n      '(' + re.src_email_name + '@' + re.tpl_host_fuzzy_strict + ')';\n\n  re.tpl_link_fuzzy =\n      // Fuzzy link can't be prepended with .:/\\- and non punctuation.\n      // but can start with > (markdown blockquote)\n      '(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uff5c]|' + re.src_ZPCc + '))' +\n      '((?![$+<=>^`|\\uff5c])' + re.tpl_host_port_fuzzy_strict + re.src_path + ')';\n\n  re.tpl_link_no_ip_fuzzy =\n      // Fuzzy link can't be prepended with .:/\\- and non punctuation.\n      // but can start with > (markdown blockquote)\n      '(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uff5c]|' + re.src_ZPCc + '))' +\n      '((?![$+<=>^`|\\uff5c])' + re.tpl_host_port_no_ip_fuzzy_strict + re.src_path + ')';\n\n  return re;\n};\n","'use strict';\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Helpers\n\n// Merge objects\n//\nfunction assign(obj /*from1, from2, from3, ...*/) {\n  var sources = Array.prototype.slice.call(arguments, 1);\n\n  sources.forEach(function (source) {\n    if (!source) { return; }\n\n    Object.keys(source).forEach(function (key) {\n      obj[key] = source[key];\n    });\n  });\n\n  return obj;\n}\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\nfunction isString(obj) { return _class(obj) === '[object String]'; }\nfunction isObject(obj) { return _class(obj) === '[object Object]'; }\nfunction isRegExp(obj) { return _class(obj) === '[object RegExp]'; }\nfunction isFunction(obj) { return _class(obj) === '[object Function]'; }\n\n\nfunction escapeRE(str) { return str.replace(/[.?*+^$[\\]\\\\(){}|-]/g, '\\\\$&'); }\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nvar defaultOptions = {\n  fuzzyLink: true,\n  fuzzyEmail: true,\n  fuzzyIP: false\n};\n\n\nfunction isOptionsObj(obj) {\n  return Object.keys(obj || {}).reduce(function (acc, k) {\n    return acc || defaultOptions.hasOwnProperty(k);\n  }, false);\n}\n\n\nvar defaultSchemas = {\n  'http:': {\n    validate: function (text, pos, self) {\n      var tail = text.slice(pos);\n\n      if (!self.re.http) {\n        // compile lazily, because \"host\"-containing variables can change on tlds update.\n        self.re.http =  new RegExp(\n          '^\\\\/\\\\/' + self.re.src_auth + self.re.src_host_port_strict + self.re.src_path, 'i'\n        );\n      }\n      if (self.re.http.test(tail)) {\n        return tail.match(self.re.http)[0].length;\n      }\n      return 0;\n    }\n  },\n  'https:':  'http:',\n  'ftp:':    'http:',\n  '//':      {\n    validate: function (text, pos, self) {\n      var tail = text.slice(pos);\n\n      if (!self.re.no_http) {\n      // compile lazily, because \"host\"-containing variables can change on tlds update.\n        self.re.no_http =  new RegExp(\n          '^' +\n          self.re.src_auth +\n          // Don't allow single-level domains, because of false positives like '//test'\n          // with code comments\n          '(?:localhost|(?:(?:' + self.re.src_domain + ')\\\\.)+' + self.re.src_domain_root + ')' +\n          self.re.src_port +\n          self.re.src_host_terminator +\n          self.re.src_path,\n\n          'i'\n        );\n      }\n\n      if (self.re.no_http.test(tail)) {\n        // should not be `://` & `///`, that protects from errors in protocol name\n        if (pos >= 3 && text[pos - 3] === ':') { return 0; }\n        if (pos >= 3 && text[pos - 3] === '/') { return 0; }\n        return tail.match(self.re.no_http)[0].length;\n      }\n      return 0;\n    }\n  },\n  'mailto:': {\n    validate: function (text, pos, self) {\n      var tail = text.slice(pos);\n\n      if (!self.re.mailto) {\n        self.re.mailto =  new RegExp(\n          '^' + self.re.src_email_name + '@' + self.re.src_host_strict, 'i'\n        );\n      }\n      if (self.re.mailto.test(tail)) {\n        return tail.match(self.re.mailto)[0].length;\n      }\n      return 0;\n    }\n  }\n};\n\n/*eslint-disable max-len*/\n\n// RE pattern for 2-character tlds (autogenerated by ./support/tlds_2char_gen.js)\nvar tlds_2ch_src_re = 'a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]';\n\n// DON'T try to make PRs with changes. Extend TLDs with LinkifyIt.tlds() instead\nvar tlds_default = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|');\n\n/*eslint-enable max-len*/\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction resetScanCache(self) {\n  self.__index__ = -1;\n  self.__text_cache__   = '';\n}\n\nfunction createValidator(re) {\n  return function (text, pos) {\n    var tail = text.slice(pos);\n\n    if (re.test(tail)) {\n      return tail.match(re)[0].length;\n    }\n    return 0;\n  };\n}\n\nfunction createNormalizer() {\n  return function (match, self) {\n    self.normalize(match);\n  };\n}\n\n// Schemas compiler. Build regexps.\n//\nfunction compile(self) {\n\n  // Load & clone RE patterns.\n  var re = self.re = require('./lib/re')(self.__opts__);\n\n  // Define dynamic patterns\n  var tlds = self.__tlds__.slice();\n\n  self.onCompile();\n\n  if (!self.__tlds_replaced__) {\n    tlds.push(tlds_2ch_src_re);\n  }\n  tlds.push(re.src_xn);\n\n  re.src_tlds = tlds.join('|');\n\n  function untpl(tpl) { return tpl.replace('%TLDS%', re.src_tlds); }\n\n  re.email_fuzzy      = RegExp(untpl(re.tpl_email_fuzzy), 'i');\n  re.link_fuzzy       = RegExp(untpl(re.tpl_link_fuzzy), 'i');\n  re.link_no_ip_fuzzy = RegExp(untpl(re.tpl_link_no_ip_fuzzy), 'i');\n  re.host_fuzzy_test  = RegExp(untpl(re.tpl_host_fuzzy_test), 'i');\n\n  //\n  // Compile each schema\n  //\n\n  var aliases = [];\n\n  self.__compiled__ = {}; // Reset compiled data\n\n  function schemaError(name, val) {\n    throw new Error('(LinkifyIt) Invalid schema \"' + name + '\": ' + val);\n  }\n\n  Object.keys(self.__schemas__).forEach(function (name) {\n    var val = self.__schemas__[name];\n\n    // skip disabled methods\n    if (val === null) { return; }\n\n    var compiled = { validate: null, link: null };\n\n    self.__compiled__[name] = compiled;\n\n    if (isObject(val)) {\n      if (isRegExp(val.validate)) {\n        compiled.validate = createValidator(val.validate);\n      } else if (isFunction(val.validate)) {\n        compiled.validate = val.validate;\n      } else {\n        schemaError(name, val);\n      }\n\n      if (isFunction(val.normalize)) {\n        compiled.normalize = val.normalize;\n      } else if (!val.normalize) {\n        compiled.normalize = createNormalizer();\n      } else {\n        schemaError(name, val);\n      }\n\n      return;\n    }\n\n    if (isString(val)) {\n      aliases.push(name);\n      return;\n    }\n\n    schemaError(name, val);\n  });\n\n  //\n  // Compile postponed aliases\n  //\n\n  aliases.forEach(function (alias) {\n    if (!self.__compiled__[self.__schemas__[alias]]) {\n      // Silently fail on missed schemas to avoid errons on disable.\n      // schemaError(alias, self.__schemas__[alias]);\n      return;\n    }\n\n    self.__compiled__[alias].validate =\n      self.__compiled__[self.__schemas__[alias]].validate;\n    self.__compiled__[alias].normalize =\n      self.__compiled__[self.__schemas__[alias]].normalize;\n  });\n\n  //\n  // Fake record for guessed links\n  //\n  self.__compiled__[''] = { validate: null, normalize: createNormalizer() };\n\n  //\n  // Build schema condition\n  //\n  var slist = Object.keys(self.__compiled__)\n                      .filter(function (name) {\n                        // Filter disabled & fake schemas\n                        return name.length > 0 && self.__compiled__[name];\n                      })\n                      .map(escapeRE)\n                      .join('|');\n  // (?!_) cause 1.5x slowdown\n  self.re.schema_test     = RegExp('(^|(?!_)(?:[><\\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'i');\n  self.re.schema_search   = RegExp('(^|(?!_)(?:[><\\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'ig');\n  self.re.schema_at_start = RegExp('^' + self.re.schema_search.source, 'i');\n\n  self.re.pretest = RegExp(\n    '(' + self.re.schema_test.source + ')|(' + self.re.host_fuzzy_test.source + ')|@',\n    'i'\n  );\n\n  //\n  // Cleanup\n  //\n\n  resetScanCache(self);\n}\n\n/**\n * class Match\n *\n * Match result. Single element of array, returned by [[LinkifyIt#match]]\n **/\nfunction Match(self, shift) {\n  var start = self.__index__,\n      end   = self.__last_index__,\n      text  = self.__text_cache__.slice(start, end);\n\n  /**\n   * Match#schema -> String\n   *\n   * Prefix (protocol) for matched string.\n   **/\n  this.schema    = self.__schema__.toLowerCase();\n  /**\n   * Match#index -> Number\n   *\n   * First position of matched string.\n   **/\n  this.index     = start + shift;\n  /**\n   * Match#lastIndex -> Number\n   *\n   * Next position after matched string.\n   **/\n  this.lastIndex = end + shift;\n  /**\n   * Match#raw -> String\n   *\n   * Matched string.\n   **/\n  this.raw       = text;\n  /**\n   * Match#text -> String\n   *\n   * Notmalized text of matched string.\n   **/\n  this.text      = text;\n  /**\n   * Match#url -> String\n   *\n   * Normalized url of matched string.\n   **/\n  this.url       = text;\n}\n\nfunction createMatch(self, shift) {\n  var match = new Match(self, shift);\n\n  self.__compiled__[match.schema].normalize(match, self);\n\n  return match;\n}\n\n\n/**\n * class LinkifyIt\n **/\n\n/**\n * new LinkifyIt(schemas, options)\n * - schemas (Object): Optional. Additional schemas to validate (prefix/validator)\n * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }\n *\n * Creates new linkifier instance with optional additional schemas.\n * Can be called without `new` keyword for convenience.\n *\n * By default understands:\n *\n * - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links\n * - \"fuzzy\" links and emails (example.com, foo@bar.com).\n *\n * `schemas` is an object, where each key/value describes protocol/rule:\n *\n * - __key__ - link prefix (usually, protocol name with `:` at the end, `skype:`\n *   for example). `linkify-it` makes shure that prefix is not preceeded with\n *   alphanumeric char and symbols. Only whitespaces and punctuation allowed.\n * - __value__ - rule to check tail after link prefix\n *   - _String_ - just alias to existing rule\n *   - _Object_\n *     - _validate_ - validator function (should return matched length on success),\n *       or `RegExp`.\n *     - _normalize_ - optional function to normalize text & url of matched result\n *       (for example, for @twitter mentions).\n *\n * `options`:\n *\n * - __fuzzyLink__ - recognige URL-s without `http(s):` prefix. Default `true`.\n * - __fuzzyIP__ - allow IPs in fuzzy links above. Can conflict with some texts\n *   like version numbers. Default `false`.\n * - __fuzzyEmail__ - recognize emails without `mailto:` prefix.\n *\n **/\nfunction LinkifyIt(schemas, options) {\n  if (!(this instanceof LinkifyIt)) {\n    return new LinkifyIt(schemas, options);\n  }\n\n  if (!options) {\n    if (isOptionsObj(schemas)) {\n      options = schemas;\n      schemas = {};\n    }\n  }\n\n  this.__opts__           = assign({}, defaultOptions, options);\n\n  // Cache last tested result. Used to skip repeating steps on next `match` call.\n  this.__index__          = -1;\n  this.__last_index__     = -1; // Next scan position\n  this.__schema__         = '';\n  this.__text_cache__     = '';\n\n  this.__schemas__        = assign({}, defaultSchemas, schemas);\n  this.__compiled__       = {};\n\n  this.__tlds__           = tlds_default;\n  this.__tlds_replaced__  = false;\n\n  this.re = {};\n\n  compile(this);\n}\n\n\n/** chainable\n * LinkifyIt#add(schema, definition)\n * - schema (String): rule name (fixed pattern prefix)\n * - definition (String|RegExp|Object): schema definition\n *\n * Add new rule definition. See constructor description for details.\n **/\nLinkifyIt.prototype.add = function add(schema, definition) {\n  this.__schemas__[schema] = definition;\n  compile(this);\n  return this;\n};\n\n\n/** chainable\n * LinkifyIt#set(options)\n * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }\n *\n * Set recognition options for links without schema.\n **/\nLinkifyIt.prototype.set = function set(options) {\n  this.__opts__ = assign(this.__opts__, options);\n  return this;\n};\n\n\n/**\n * LinkifyIt#test(text) -> Boolean\n *\n * Searches linkifiable pattern and returns `true` on success or `false` on fail.\n **/\nLinkifyIt.prototype.test = function test(text) {\n  // Reset scan cache\n  this.__text_cache__ = text;\n  this.__index__      = -1;\n\n  if (!text.length) { return false; }\n\n  var m, ml, me, len, shift, next, re, tld_pos, at_pos;\n\n  // try to scan for link with schema - that's the most simple rule\n  if (this.re.schema_test.test(text)) {\n    re = this.re.schema_search;\n    re.lastIndex = 0;\n    while ((m = re.exec(text)) !== null) {\n      len = this.testSchemaAt(text, m[2], re.lastIndex);\n      if (len) {\n        this.__schema__     = m[2];\n        this.__index__      = m.index + m[1].length;\n        this.__last_index__ = m.index + m[0].length + len;\n        break;\n      }\n    }\n  }\n\n  if (this.__opts__.fuzzyLink && this.__compiled__['http:']) {\n    // guess schemaless links\n    tld_pos = text.search(this.re.host_fuzzy_test);\n    if (tld_pos >= 0) {\n      // if tld is located after found link - no need to check fuzzy pattern\n      if (this.__index__ < 0 || tld_pos < this.__index__) {\n        if ((ml = text.match(this.__opts__.fuzzyIP ? this.re.link_fuzzy : this.re.link_no_ip_fuzzy)) !== null) {\n\n          shift = ml.index + ml[1].length;\n\n          if (this.__index__ < 0 || shift < this.__index__) {\n            this.__schema__     = '';\n            this.__index__      = shift;\n            this.__last_index__ = ml.index + ml[0].length;\n          }\n        }\n      }\n    }\n  }\n\n  if (this.__opts__.fuzzyEmail && this.__compiled__['mailto:']) {\n    // guess schemaless emails\n    at_pos = text.indexOf('@');\n    if (at_pos >= 0) {\n      // We can't skip this check, because this cases are possible:\n      // 192.168.1.1@gmail.com, my.in@example.com\n      if ((me = text.match(this.re.email_fuzzy)) !== null) {\n\n        shift = me.index + me[1].length;\n        next  = me.index + me[0].length;\n\n        if (this.__index__ < 0 || shift < this.__index__ ||\n            (shift === this.__index__ && next > this.__last_index__)) {\n          this.__schema__     = 'mailto:';\n          this.__index__      = shift;\n          this.__last_index__ = next;\n        }\n      }\n    }\n  }\n\n  return this.__index__ >= 0;\n};\n\n\n/**\n * LinkifyIt#pretest(text) -> Boolean\n *\n * Very quick check, that can give false positives. Returns true if link MAY BE\n * can exists. Can be used for speed optimization, when you need to check that\n * link NOT exists.\n **/\nLinkifyIt.prototype.pretest = function pretest(text) {\n  return this.re.pretest.test(text);\n};\n\n\n/**\n * LinkifyIt#testSchemaAt(text, name, position) -> Number\n * - text (String): text to scan\n * - name (String): rule (schema) name\n * - position (Number): text offset to check from\n *\n * Similar to [[LinkifyIt#test]] but checks only specific protocol tail exactly\n * at given position. Returns length of found pattern (0 on fail).\n **/\nLinkifyIt.prototype.testSchemaAt = function testSchemaAt(text, schema, pos) {\n  // If not supported schema check requested - terminate\n  if (!this.__compiled__[schema.toLowerCase()]) {\n    return 0;\n  }\n  return this.__compiled__[schema.toLowerCase()].validate(text, pos, this);\n};\n\n\n/**\n * LinkifyIt#match(text) -> Array|null\n *\n * Returns array of found link descriptions or `null` on fail. We strongly\n * recommend to use [[LinkifyIt#test]] first, for best speed.\n *\n * ##### Result match description\n *\n * - __schema__ - link schema, can be empty for fuzzy links, or `//` for\n *   protocol-neutral  links.\n * - __index__ - offset of matched text\n * - __lastIndex__ - index of next char after mathch end\n * - __raw__ - matched text\n * - __text__ - normalized text\n * - __url__ - link, generated from matched text\n **/\nLinkifyIt.prototype.match = function match(text) {\n  var shift = 0, result = [];\n\n  // Try to take previous element from cache, if .test() called before\n  if (this.__index__ >= 0 && this.__text_cache__ === text) {\n    result.push(createMatch(this, shift));\n    shift = this.__last_index__;\n  }\n\n  // Cut head if cache was used\n  var tail = shift ? text.slice(shift) : text;\n\n  // Scan string until end reached\n  while (this.test(tail)) {\n    result.push(createMatch(this, shift));\n\n    tail = tail.slice(this.__last_index__);\n    shift += this.__last_index__;\n  }\n\n  if (result.length) {\n    return result;\n  }\n\n  return null;\n};\n\n\n/**\n * LinkifyIt#matchAtStart(text) -> Match|null\n *\n * Returns fully-formed (not fuzzy) link if it starts at the beginning\n * of the string, and null otherwise.\n **/\nLinkifyIt.prototype.matchAtStart = function matchAtStart(text) {\n  // Reset scan cache\n  this.__text_cache__ = text;\n  this.__index__      = -1;\n\n  if (!text.length) return null;\n\n  var m = this.re.schema_at_start.exec(text);\n  if (!m) return null;\n\n  var len = this.testSchemaAt(text, m[2], m[0].length);\n  if (!len) return null;\n\n  this.__schema__     = m[2];\n  this.__index__      = m.index + m[1].length;\n  this.__last_index__ = m.index + m[0].length + len;\n\n  return createMatch(this, 0);\n};\n\n\n/** chainable\n * LinkifyIt#tlds(list [, keepOld]) -> this\n * - list (Array): list of tlds\n * - keepOld (Boolean): merge with current list if `true` (`false` by default)\n *\n * Load (or merge) new tlds list. Those are user for fuzzy links (without prefix)\n * to avoid false positives. By default this algorythm used:\n *\n * - hostname with any 2-letter root zones are ok.\n * - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф\n *   are ok.\n * - encoded (`xn--...`) root zones are ok.\n *\n * If list is replaced, then exact match for 2-chars root zones will be checked.\n **/\nLinkifyIt.prototype.tlds = function tlds(list, keepOld) {\n  list = Array.isArray(list) ? list : [ list ];\n\n  if (!keepOld) {\n    this.__tlds__ = list.slice();\n    this.__tlds_replaced__ = true;\n    compile(this);\n    return this;\n  }\n\n  this.__tlds__ = this.__tlds__.concat(list)\n                                  .sort()\n                                  .filter(function (el, idx, arr) {\n                                    return el !== arr[idx - 1];\n                                  })\n                                  .reverse();\n\n  compile(this);\n  return this;\n};\n\n/**\n * LinkifyIt#normalize(match)\n *\n * Default normalizer (if schema does not define it's own).\n **/\nLinkifyIt.prototype.normalize = function normalize(match) {\n\n  // Do minimal possible changes by default. Need to collect feedback prior\n  // to move forward https://github.com/markdown-it/linkify-it/issues/1\n\n  if (!match.schema) { match.url = 'http://' + match.url; }\n\n  if (match.schema === 'mailto:' && !/^mailto:/i.test(match.url)) {\n    match.url = 'mailto:' + match.url;\n  }\n};\n\n\n/**\n * LinkifyIt#onCompile()\n *\n * Override to modify basic RegExp-s.\n **/\nLinkifyIt.prototype.onCompile = function onCompile() {\n};\n\n\nmodule.exports = LinkifyIt;\n","// HTML5 entities map: { name -> utf16string }\n//\n'use strict';\n\n/*eslint quotes:0*/\nmodule.exports = require('entities/lib/maps/entities.json');\n","\n'use strict';\n\n\nvar encodeCache = {};\n\n\n// Create a lookup array where anything but characters in `chars` string\n// and alphanumeric chars is percent-encoded.\n//\nfunction getEncodeCache(exclude) {\n  var i, ch, cache = encodeCache[exclude];\n  if (cache) { return cache; }\n\n  cache = encodeCache[exclude] = [];\n\n  for (i = 0; i < 128; i++) {\n    ch = String.fromCharCode(i);\n\n    if (/^[0-9a-z]$/i.test(ch)) {\n      // always allow unencoded alphanumeric characters\n      cache.push(ch);\n    } else {\n      cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2));\n    }\n  }\n\n  for (i = 0; i < exclude.length; i++) {\n    cache[exclude.charCodeAt(i)] = exclude[i];\n  }\n\n  return cache;\n}\n\n\n// Encode unsafe characters with percent-encoding, skipping already\n// encoded sequences.\n//\n//  - string       - string to encode\n//  - exclude      - list of characters to ignore (in addition to a-zA-Z0-9)\n//  - keepEscaped  - don't encode '%' in a correct escape sequence (default: true)\n//\nfunction encode(string, exclude, keepEscaped) {\n  var i, l, code, nextCode, cache,\n      result = '';\n\n  if (typeof exclude !== 'string') {\n    // encode(string, keepEscaped)\n    keepEscaped  = exclude;\n    exclude = encode.defaultChars;\n  }\n\n  if (typeof keepEscaped === 'undefined') {\n    keepEscaped = true;\n  }\n\n  cache = getEncodeCache(exclude);\n\n  for (i = 0, l = string.length; i < l; i++) {\n    code = string.charCodeAt(i);\n\n    if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) {\n      if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {\n        result += string.slice(i, i + 3);\n        i += 2;\n        continue;\n      }\n    }\n\n    if (code < 128) {\n      result += cache[code];\n      continue;\n    }\n\n    if (code >= 0xD800 && code <= 0xDFFF) {\n      if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) {\n        nextCode = string.charCodeAt(i + 1);\n        if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {\n          result += encodeURIComponent(string[i] + string[i + 1]);\n          i++;\n          continue;\n        }\n      }\n      result += '%EF%BF%BD';\n      continue;\n    }\n\n    result += encodeURIComponent(string[i]);\n  }\n\n  return result;\n}\n\nencode.defaultChars   = \";/?:@&=+$,-_.!~*'()#\";\nencode.componentChars = \"-_.!~*'()\";\n\n\nmodule.exports = encode;\n","\n'use strict';\n\n\n/* eslint-disable no-bitwise */\n\nvar decodeCache = {};\n\nfunction getDecodeCache(exclude) {\n  var i, ch, cache = decodeCache[exclude];\n  if (cache) { return cache; }\n\n  cache = decodeCache[exclude] = [];\n\n  for (i = 0; i < 128; i++) {\n    ch = String.fromCharCode(i);\n    cache.push(ch);\n  }\n\n  for (i = 0; i < exclude.length; i++) {\n    ch = exclude.charCodeAt(i);\n    cache[ch] = '%' + ('0' + ch.toString(16).toUpperCase()).slice(-2);\n  }\n\n  return cache;\n}\n\n\n// Decode percent-encoded string.\n//\nfunction decode(string, exclude) {\n  var cache;\n\n  if (typeof exclude !== 'string') {\n    exclude = decode.defaultChars;\n  }\n\n  cache = getDecodeCache(exclude);\n\n  return string.replace(/(%[a-f0-9]{2})+/gi, function(seq) {\n    var i, l, b1, b2, b3, b4, chr,\n        result = '';\n\n    for (i = 0, l = seq.length; i < l; i += 3) {\n      b1 = parseInt(seq.slice(i + 1, i + 3), 16);\n\n      if (b1 < 0x80) {\n        result += cache[b1];\n        continue;\n      }\n\n      if ((b1 & 0xE0) === 0xC0 && (i + 3 < l)) {\n        // 110xxxxx 10xxxxxx\n        b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n\n        if ((b2 & 0xC0) === 0x80) {\n          chr = ((b1 << 6) & 0x7C0) | (b2 & 0x3F);\n\n          if (chr < 0x80) {\n            result += '\\ufffd\\ufffd';\n          } else {\n            result += String.fromCharCode(chr);\n          }\n\n          i += 3;\n          continue;\n        }\n      }\n\n      if ((b1 & 0xF0) === 0xE0 && (i + 6 < l)) {\n        // 1110xxxx 10xxxxxx 10xxxxxx\n        b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n        b3 = parseInt(seq.slice(i + 7, i + 9), 16);\n\n        if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {\n          chr = ((b1 << 12) & 0xF000) | ((b2 << 6) & 0xFC0) | (b3 & 0x3F);\n\n          if (chr < 0x800 || (chr >= 0xD800 && chr <= 0xDFFF)) {\n            result += '\\ufffd\\ufffd\\ufffd';\n          } else {\n            result += String.fromCharCode(chr);\n          }\n\n          i += 6;\n          continue;\n        }\n      }\n\n      if ((b1 & 0xF8) === 0xF0 && (i + 9 < l)) {\n        // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx\n        b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n        b3 = parseInt(seq.slice(i + 7, i + 9), 16);\n        b4 = parseInt(seq.slice(i + 10, i + 12), 16);\n\n        if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80 && (b4 & 0xC0) === 0x80) {\n          chr = ((b1 << 18) & 0x1C0000) | ((b2 << 12) & 0x3F000) | ((b3 << 6) & 0xFC0) | (b4 & 0x3F);\n\n          if (chr < 0x10000 || chr > 0x10FFFF) {\n            result += '\\ufffd\\ufffd\\ufffd\\ufffd';\n          } else {\n            chr -= 0x10000;\n            result += String.fromCharCode(0xD800 + (chr >> 10), 0xDC00 + (chr & 0x3FF));\n          }\n\n          i += 9;\n          continue;\n        }\n      }\n\n      result += '\\ufffd';\n    }\n\n    return result;\n  });\n}\n\n\ndecode.defaultChars   = ';/?:@&=+$,#';\ndecode.componentChars = '';\n\n\nmodule.exports = decode;\n","\n'use strict';\n\n\nmodule.exports = function format(url) {\n  var result = '';\n\n  result += url.protocol || '';\n  result += url.slashes ? '//' : '';\n  result += url.auth ? url.auth + '@' : '';\n\n  if (url.hostname && url.hostname.indexOf(':') !== -1) {\n    // ipv6 address\n    result += '[' + url.hostname + ']';\n  } else {\n    result += url.hostname || '';\n  }\n\n  result += url.port ? ':' + url.port : '';\n  result += url.pathname || '';\n  result += url.search || '';\n  result += url.hash || '';\n\n  return result;\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n//\n// Changes from joyent/node:\n//\n// 1. No leading slash in paths,\n//    e.g. in `url.parse('http://foo?bar')` pathname is ``, not `/`\n//\n// 2. Backslashes are not replaced with slashes,\n//    so `http:\\\\example.org\\` is treated like a relative path\n//\n// 3. Trailing colon is treated like a part of the path,\n//    i.e. in `http://example.org:foo` pathname is `:foo`\n//\n// 4. Nothing is URL-encoded in the resulting object,\n//    (in joyent/node some chars in auth and paths are encoded)\n//\n// 5. `url.parse()` does not have `parseQueryString` argument\n//\n// 6. Removed extraneous result properties: `host`, `path`, `query`, etc.,\n//    which can be constructed using other parts of the url.\n//\n\n\nfunction Url() {\n  this.protocol = null;\n  this.slashes = null;\n  this.auth = null;\n  this.port = null;\n  this.hostname = null;\n  this.hash = null;\n  this.search = null;\n  this.pathname = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n    portPattern = /:[0-9]*$/,\n\n    // Special case for a simple path URL\n    simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n    // RFC 2396: characters reserved for delimiting URLs.\n    // We actually just auto-escape these.\n    delims = [ '<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t' ],\n\n    // RFC 2396: characters not allowed for various reasons.\n    unwise = [ '{', '}', '|', '\\\\', '^', '`' ].concat(delims),\n\n    // Allowed by RFCs, but cause of XSS attacks.  Always escape these.\n    autoEscape = [ '\\'' ].concat(unwise),\n    // Characters that are never ever allowed in a hostname.\n    // Note that any invalid chars are also handled, but these\n    // are the ones that are *expected* to be seen, so we fast-path\n    // them.\n    nonHostChars = [ '%', '/', '?', ';', '#' ].concat(autoEscape),\n    hostEndingChars = [ '/', '?', '#' ],\n    hostnameMaxLen = 255,\n    hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n    hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n    // protocols that can allow \"unsafe\" and \"unwise\" chars.\n    /* eslint-disable no-script-url */\n    // protocols that never have a hostname.\n    hostlessProtocol = {\n      'javascript': true,\n      'javascript:': true\n    },\n    // protocols that always contain a // bit.\n    slashedProtocol = {\n      'http': true,\n      'https': true,\n      'ftp': true,\n      'gopher': true,\n      'file': true,\n      'http:': true,\n      'https:': true,\n      'ftp:': true,\n      'gopher:': true,\n      'file:': true\n    };\n    /* eslint-enable no-script-url */\n\nfunction urlParse(url, slashesDenoteHost) {\n  if (url && url instanceof Url) { return url; }\n\n  var u = new Url();\n  u.parse(url, slashesDenoteHost);\n  return u;\n}\n\nUrl.prototype.parse = function(url, slashesDenoteHost) {\n  var i, l, lowerProto, hec, slashes,\n      rest = url;\n\n  // trim before proceeding.\n  // This is to support parse stuff like \"  http://foo.com  \\n\"\n  rest = rest.trim();\n\n  if (!slashesDenoteHost && url.split('#').length === 1) {\n    // Try fast path regexp\n    var simplePath = simplePathPattern.exec(rest);\n    if (simplePath) {\n      this.pathname = simplePath[1];\n      if (simplePath[2]) {\n        this.search = simplePath[2];\n      }\n      return this;\n    }\n  }\n\n  var proto = protocolPattern.exec(rest);\n  if (proto) {\n    proto = proto[0];\n    lowerProto = proto.toLowerCase();\n    this.protocol = proto;\n    rest = rest.substr(proto.length);\n  }\n\n  // figure out if it's got a host\n  // user@server is *always* interpreted as a hostname, and url\n  // resolution will treat //foo/bar as host=foo,path=bar because that's\n  // how the browser resolves relative URLs.\n  if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n    slashes = rest.substr(0, 2) === '//';\n    if (slashes && !(proto && hostlessProtocol[proto])) {\n      rest = rest.substr(2);\n      this.slashes = true;\n    }\n  }\n\n  if (!hostlessProtocol[proto] &&\n      (slashes || (proto && !slashedProtocol[proto]))) {\n\n    // there's a hostname.\n    // the first instance of /, ?, ;, or # ends the host.\n    //\n    // If there is an @ in the hostname, then non-host chars *are* allowed\n    // to the left of the last @ sign, unless some host-ending character\n    // comes *before* the @-sign.\n    // URLs are obnoxious.\n    //\n    // ex:\n    // http://a@b@c/ => user:a@b host:c\n    // http://a@b?@c => user:a host:c path:/?@c\n\n    // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n    // Review our test case against browsers more comprehensively.\n\n    // find the first instance of any hostEndingChars\n    var hostEnd = -1;\n    for (i = 0; i < hostEndingChars.length; i++) {\n      hec = rest.indexOf(hostEndingChars[i]);\n      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n        hostEnd = hec;\n      }\n    }\n\n    // at this point, either we have an explicit point where the\n    // auth portion cannot go past, or the last @ char is the decider.\n    var auth, atSign;\n    if (hostEnd === -1) {\n      // atSign can be anywhere.\n      atSign = rest.lastIndexOf('@');\n    } else {\n      // atSign must be in auth portion.\n      // http://a@b/c@d => host:b auth:a path:/c@d\n      atSign = rest.lastIndexOf('@', hostEnd);\n    }\n\n    // Now we have a portion which is definitely the auth.\n    // Pull that off.\n    if (atSign !== -1) {\n      auth = rest.slice(0, atSign);\n      rest = rest.slice(atSign + 1);\n      this.auth = auth;\n    }\n\n    // the host is the remaining to the left of the first non-host char\n    hostEnd = -1;\n    for (i = 0; i < nonHostChars.length; i++) {\n      hec = rest.indexOf(nonHostChars[i]);\n      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n        hostEnd = hec;\n      }\n    }\n    // if we still have not hit it, then the entire thing is a host.\n    if (hostEnd === -1) {\n      hostEnd = rest.length;\n    }\n\n    if (rest[hostEnd - 1] === ':') { hostEnd--; }\n    var host = rest.slice(0, hostEnd);\n    rest = rest.slice(hostEnd);\n\n    // pull out port.\n    this.parseHost(host);\n\n    // we've indicated that there is a hostname,\n    // so even if it's empty, it has to be present.\n    this.hostname = this.hostname || '';\n\n    // if hostname begins with [ and ends with ]\n    // assume that it's an IPv6 address.\n    var ipv6Hostname = this.hostname[0] === '[' &&\n        this.hostname[this.hostname.length - 1] === ']';\n\n    // validate a little.\n    if (!ipv6Hostname) {\n      var hostparts = this.hostname.split(/\\./);\n      for (i = 0, l = hostparts.length; i < l; i++) {\n        var part = hostparts[i];\n        if (!part) { continue; }\n        if (!part.match(hostnamePartPattern)) {\n          var newpart = '';\n          for (var j = 0, k = part.length; j < k; j++) {\n            if (part.charCodeAt(j) > 127) {\n              // we replace non-ASCII char with a temporary placeholder\n              // we need this to make sure size of hostname is not\n              // broken by replacing non-ASCII by nothing\n              newpart += 'x';\n            } else {\n              newpart += part[j];\n            }\n          }\n          // we test again with ASCII char only\n          if (!newpart.match(hostnamePartPattern)) {\n            var validParts = hostparts.slice(0, i);\n            var notHost = hostparts.slice(i + 1);\n            var bit = part.match(hostnamePartStart);\n            if (bit) {\n              validParts.push(bit[1]);\n              notHost.unshift(bit[2]);\n            }\n            if (notHost.length) {\n              rest = notHost.join('.') + rest;\n            }\n            this.hostname = validParts.join('.');\n            break;\n          }\n        }\n      }\n    }\n\n    if (this.hostname.length > hostnameMaxLen) {\n      this.hostname = '';\n    }\n\n    // strip [ and ] from the hostname\n    // the host field still retains them, though\n    if (ipv6Hostname) {\n      this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n    }\n  }\n\n  // chop off from the tail first.\n  var hash = rest.indexOf('#');\n  if (hash !== -1) {\n    // got a fragment string.\n    this.hash = rest.substr(hash);\n    rest = rest.slice(0, hash);\n  }\n  var qm = rest.indexOf('?');\n  if (qm !== -1) {\n    this.search = rest.substr(qm);\n    rest = rest.slice(0, qm);\n  }\n  if (rest) { this.pathname = rest; }\n  if (slashedProtocol[lowerProto] &&\n      this.hostname && !this.pathname) {\n    this.pathname = '';\n  }\n\n  return this;\n};\n\nUrl.prototype.parseHost = function(host) {\n  var port = portPattern.exec(host);\n  if (port) {\n    port = port[0];\n    if (port !== ':') {\n      this.port = port.substr(1);\n    }\n    host = host.substr(0, host.length - port.length);\n  }\n  if (host) { this.hostname = host; }\n};\n\nmodule.exports = urlParse;\n","'use strict';\n\n\nmodule.exports.encode = require('./encode');\nmodule.exports.decode = require('./decode');\nmodule.exports.format = require('./format');\nmodule.exports.parse  = require('./parse');\n","module.exports=/[\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB]|\\uD804[\\uDCBD\\uDCCD]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]/","'use strict';\n\nexports.Any = require('./properties/Any/regex');\nexports.Cc  = require('./categories/Cc/regex');\nexports.Cf  = require('./categories/Cf/regex');\nexports.P   = require('./categories/P/regex');\nexports.Z   = require('./categories/Z/regex');\n","// Utilities\n//\n'use strict';\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction isString(obj) { return _class(obj) === '[object String]'; }\n\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction has(object, key) {\n  return _hasOwnProperty.call(object, key);\n}\n\n// Merge objects\n//\nfunction assign(obj /*from1, from2, from3, ...*/) {\n  var sources = Array.prototype.slice.call(arguments, 1);\n\n  sources.forEach(function (source) {\n    if (!source) { return; }\n\n    if (typeof source !== 'object') {\n      throw new TypeError(source + 'must be object');\n    }\n\n    Object.keys(source).forEach(function (key) {\n      obj[key] = source[key];\n    });\n  });\n\n  return obj;\n}\n\n// Remove element from array and put another array at those position.\n// Useful for some operations with tokens\nfunction arrayReplaceAt(src, pos, newElements) {\n  return [].concat(src.slice(0, pos), newElements, src.slice(pos + 1));\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction isValidEntityCode(c) {\n  /*eslint no-bitwise:0*/\n  // broken sequence\n  if (c >= 0xD800 && c <= 0xDFFF) { return false; }\n  // never used\n  if (c >= 0xFDD0 && c <= 0xFDEF) { return false; }\n  if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false; }\n  // control codes\n  if (c >= 0x00 && c <= 0x08) { return false; }\n  if (c === 0x0B) { return false; }\n  if (c >= 0x0E && c <= 0x1F) { return false; }\n  if (c >= 0x7F && c <= 0x9F) { return false; }\n  // out of range\n  if (c > 0x10FFFF) { return false; }\n  return true;\n}\n\nfunction fromCodePoint(c) {\n  /*eslint no-bitwise:0*/\n  if (c > 0xffff) {\n    c -= 0x10000;\n    var surrogate1 = 0xd800 + (c >> 10),\n        surrogate2 = 0xdc00 + (c & 0x3ff);\n\n    return String.fromCharCode(surrogate1, surrogate2);\n  }\n  return String.fromCharCode(c);\n}\n\n\nvar UNESCAPE_MD_RE  = /\\\\([!\"#$%&'()*+,\\-.\\/:;<=>?@[\\\\\\]^_`{|}~])/g;\nvar ENTITY_RE       = /&([a-z#][a-z0-9]{1,31});/gi;\nvar UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi');\n\nvar DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i;\n\nvar entities = require('./entities');\n\nfunction replaceEntityPattern(match, name) {\n  var code;\n\n  if (has(entities, name)) {\n    return entities[name];\n  }\n\n  if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {\n    code = name[1].toLowerCase() === 'x' ?\n      parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10);\n\n    if (isValidEntityCode(code)) {\n      return fromCodePoint(code);\n    }\n  }\n\n  return match;\n}\n\n/*function replaceEntities(str) {\n  if (str.indexOf('&') < 0) { return str; }\n\n  return str.replace(ENTITY_RE, replaceEntityPattern);\n}*/\n\nfunction unescapeMd(str) {\n  if (str.indexOf('\\\\') < 0) { return str; }\n  return str.replace(UNESCAPE_MD_RE, '$1');\n}\n\nfunction unescapeAll(str) {\n  if (str.indexOf('\\\\') < 0 && str.indexOf('&') < 0) { return str; }\n\n  return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {\n    if (escaped) { return escaped; }\n    return replaceEntityPattern(match, entity);\n  });\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar HTML_ESCAPE_TEST_RE = /[&<>\"]/;\nvar HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g;\nvar HTML_REPLACEMENTS = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;'\n};\n\nfunction replaceUnsafeChar(ch) {\n  return HTML_REPLACEMENTS[ch];\n}\n\nfunction escapeHtml(str) {\n  if (HTML_ESCAPE_TEST_RE.test(str)) {\n    return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar);\n  }\n  return str;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar REGEXP_ESCAPE_RE = /[.?*+^$[\\]\\\\(){}|-]/g;\n\nfunction escapeRE(str) {\n  return str.replace(REGEXP_ESCAPE_RE, '\\\\$&');\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction isSpace(code) {\n  switch (code) {\n    case 0x09:\n    case 0x20:\n      return true;\n  }\n  return false;\n}\n\n// Zs (unicode class) || [\\t\\f\\v\\r\\n]\nfunction isWhiteSpace(code) {\n  if (code >= 0x2000 && code <= 0x200A) { return true; }\n  switch (code) {\n    case 0x09: // \\t\n    case 0x0A: // \\n\n    case 0x0B: // \\v\n    case 0x0C: // \\f\n    case 0x0D: // \\r\n    case 0x20:\n    case 0xA0:\n    case 0x1680:\n    case 0x202F:\n    case 0x205F:\n    case 0x3000:\n      return true;\n  }\n  return false;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/*eslint-disable max-len*/\nvar UNICODE_PUNCT_RE = require('uc.micro/categories/P/regex');\n\n// Currently without astral characters support.\nfunction isPunctChar(ch) {\n  return UNICODE_PUNCT_RE.test(ch);\n}\n\n\n// Markdown ASCII punctuation characters.\n//\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\n//\n// Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.\n//\nfunction isMdAsciiPunct(ch) {\n  switch (ch) {\n    case 0x21/* ! */:\n    case 0x22/* \" */:\n    case 0x23/* # */:\n    case 0x24/* $ */:\n    case 0x25/* % */:\n    case 0x26/* & */:\n    case 0x27/* ' */:\n    case 0x28/* ( */:\n    case 0x29/* ) */:\n    case 0x2A/* * */:\n    case 0x2B/* + */:\n    case 0x2C/* , */:\n    case 0x2D/* - */:\n    case 0x2E/* . */:\n    case 0x2F/* / */:\n    case 0x3A/* : */:\n    case 0x3B/* ; */:\n    case 0x3C/* < */:\n    case 0x3D/* = */:\n    case 0x3E/* > */:\n    case 0x3F/* ? */:\n    case 0x40/* @ */:\n    case 0x5B/* [ */:\n    case 0x5C/* \\ */:\n    case 0x5D/* ] */:\n    case 0x5E/* ^ */:\n    case 0x5F/* _ */:\n    case 0x60/* ` */:\n    case 0x7B/* { */:\n    case 0x7C/* | */:\n    case 0x7D/* } */:\n    case 0x7E/* ~ */:\n      return true;\n    default:\n      return false;\n  }\n}\n\n// Hepler to unify [reference labels].\n//\nfunction normalizeReference(str) {\n  // Trim and collapse whitespace\n  //\n  str = str.trim().replace(/\\s+/g, ' ');\n\n  // In node v10 'ẞ'.toLowerCase() === 'Ṿ', which is presumed to be a bug\n  // fixed in v12 (couldn't find any details).\n  //\n  // So treat this one as a special case\n  // (remove this when node v10 is no longer supported).\n  //\n  if ('ẞ'.toLowerCase() === 'Ṿ') {\n    str = str.replace(/ẞ/g, 'ß');\n  }\n\n  // .toLowerCase().toUpperCase() should get rid of all differences\n  // between letter variants.\n  //\n  // Simple .toLowerCase() doesn't normalize 125 code points correctly,\n  // and .toUpperCase doesn't normalize 6 of them (list of exceptions:\n  // İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently\n  // uppercased versions).\n  //\n  // Here's an example showing how it happens. Lets take greek letter omega:\n  // uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ)\n  //\n  // Unicode entries:\n  // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;\n  // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398\n  // 03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398\n  // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;\n  //\n  // Case-insensitive comparison should treat all of them as equivalent.\n  //\n  // But .toLowerCase() doesn't change ϑ (it's already lowercase),\n  // and .toUpperCase() doesn't change ϴ (already uppercase).\n  //\n  // Applying first lower then upper case normalizes any character:\n  // '\\u0398\\u03f4\\u03b8\\u03d1'.toLowerCase().toUpperCase() === '\\u0398\\u0398\\u0398\\u0398'\n  //\n  // Note: this is equivalent to unicode case folding; unicode normalization\n  // is a different step that is not required here.\n  //\n  // Final result should be uppercased, because it's later stored in an object\n  // (this avoid a conflict with Object.prototype members,\n  // most notably, `__proto__`)\n  //\n  return str.toLowerCase().toUpperCase();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Re-export libraries commonly used in both markdown-it and its plugins,\n// so plugins won't have to depend on them explicitly, which reduces their\n// bundled size (e.g. a browser build).\n//\nexports.lib                 = {};\nexports.lib.mdurl           = require('mdurl');\nexports.lib.ucmicro         = require('uc.micro');\n\nexports.assign              = assign;\nexports.isString            = isString;\nexports.has                 = has;\nexports.unescapeMd          = unescapeMd;\nexports.unescapeAll         = unescapeAll;\nexports.isValidEntityCode   = isValidEntityCode;\nexports.fromCodePoint       = fromCodePoint;\n// exports.replaceEntities     = replaceEntities;\nexports.escapeHtml          = escapeHtml;\nexports.arrayReplaceAt      = arrayReplaceAt;\nexports.isSpace             = isSpace;\nexports.isWhiteSpace        = isWhiteSpace;\nexports.isMdAsciiPunct      = isMdAsciiPunct;\nexports.isPunctChar         = isPunctChar;\nexports.escapeRE            = escapeRE;\nexports.normalizeReference  = normalizeReference;\n","// Parse link label\n//\n// this function assumes that first character (\"[\") already matches;\n// returns the end of the label\n//\n'use strict';\n\nmodule.exports = function parseLinkLabel(state, start, disableNested) {\n  var level, found, marker, prevPos,\n      labelEnd = -1,\n      max = state.posMax,\n      oldPos = state.pos;\n\n  state.pos = start + 1;\n  level = 1;\n\n  while (state.pos < max) {\n    marker = state.src.charCodeAt(state.pos);\n    if (marker === 0x5D /* ] */) {\n      level--;\n      if (level === 0) {\n        found = true;\n        break;\n      }\n    }\n\n    prevPos = state.pos;\n    state.md.inline.skipToken(state);\n    if (marker === 0x5B /* [ */) {\n      if (prevPos === state.pos - 1) {\n        // increase level if we find text `[`, which is not a part of any token\n        level++;\n      } else if (disableNested) {\n        state.pos = oldPos;\n        return -1;\n      }\n    }\n  }\n\n  if (found) {\n    labelEnd = state.pos;\n  }\n\n  // restore old state\n  state.pos = oldPos;\n\n  return labelEnd;\n};\n","// Parse link destination\n//\n'use strict';\n\n\nvar unescapeAll = require('../common/utils').unescapeAll;\n\n\nmodule.exports = function parseLinkDestination(str, start, max) {\n  var code, level,\n      pos = start,\n      result = {\n        ok: false,\n        pos: 0,\n        lines: 0,\n        str: ''\n      };\n\n  if (str.charCodeAt(pos) === 0x3C /* < */) {\n    pos++;\n    while (pos < max) {\n      code = str.charCodeAt(pos);\n      if (code === 0x0A /* \\n */) { return result; }\n      if (code === 0x3C /* < */) { return result; }\n      if (code === 0x3E /* > */) {\n        result.pos = pos + 1;\n        result.str = unescapeAll(str.slice(start + 1, pos));\n        result.ok = true;\n        return result;\n      }\n      if (code === 0x5C /* \\ */ && pos + 1 < max) {\n        pos += 2;\n        continue;\n      }\n\n      pos++;\n    }\n\n    // no closing '>'\n    return result;\n  }\n\n  // this should be ... } else { ... branch\n\n  level = 0;\n  while (pos < max) {\n    code = str.charCodeAt(pos);\n\n    if (code === 0x20) { break; }\n\n    // ascii control characters\n    if (code < 0x20 || code === 0x7F) { break; }\n\n    if (code === 0x5C /* \\ */ && pos + 1 < max) {\n      if (str.charCodeAt(pos + 1) === 0x20) { break; }\n      pos += 2;\n      continue;\n    }\n\n    if (code === 0x28 /* ( */) {\n      level++;\n      if (level > 32) { return result; }\n    }\n\n    if (code === 0x29 /* ) */) {\n      if (level === 0) { break; }\n      level--;\n    }\n\n    pos++;\n  }\n\n  if (start === pos) { return result; }\n  if (level !== 0) { return result; }\n\n  result.str = unescapeAll(str.slice(start, pos));\n  result.pos = pos;\n  result.ok = true;\n  return result;\n};\n","// Parse link title\n//\n'use strict';\n\n\nvar unescapeAll = require('../common/utils').unescapeAll;\n\n\nmodule.exports = function parseLinkTitle(str, start, max) {\n  var code,\n      marker,\n      lines = 0,\n      pos = start,\n      result = {\n        ok: false,\n        pos: 0,\n        lines: 0,\n        str: ''\n      };\n\n  if (pos >= max) { return result; }\n\n  marker = str.charCodeAt(pos);\n\n  if (marker !== 0x22 /* \" */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { return result; }\n\n  pos++;\n\n  // if opening marker is \"(\", switch it to closing marker \")\"\n  if (marker === 0x28) { marker = 0x29; }\n\n  while (pos < max) {\n    code = str.charCodeAt(pos);\n    if (code === marker) {\n      result.pos = pos + 1;\n      result.lines = lines;\n      result.str = unescapeAll(str.slice(start + 1, pos));\n      result.ok = true;\n      return result;\n    } else if (code === 0x28 /* ( */ && marker === 0x29 /* ) */) {\n      return result;\n    } else if (code === 0x0A) {\n      lines++;\n    } else if (code === 0x5C /* \\ */ && pos + 1 < max) {\n      pos++;\n      if (str.charCodeAt(pos) === 0x0A) {\n        lines++;\n      }\n    }\n\n    pos++;\n  }\n\n  return result;\n};\n","// Just a shortcut for bulk export\n'use strict';\n\n\nexports.parseLinkLabel       = require('./parse_link_label');\nexports.parseLinkDestination = require('./parse_link_destination');\nexports.parseLinkTitle       = require('./parse_link_title');\n","/**\n * class Renderer\n *\n * Generates HTML from parsed token stream. Each instance has independent\n * copy of rules. Those can be rewritten with ease. Also, you can add new\n * rules if you create plugin and adds new token types.\n **/\n'use strict';\n\n\nvar assign          = require('./common/utils').assign;\nvar unescapeAll     = require('./common/utils').unescapeAll;\nvar escapeHtml      = require('./common/utils').escapeHtml;\n\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar default_rules = {};\n\n\ndefault_rules.code_inline = function (tokens, idx, options, env, slf) {\n  var token = tokens[idx];\n\n  return  '<code' + slf.renderAttrs(token) + '>' +\n          escapeHtml(token.content) +\n          '</code>';\n};\n\n\ndefault_rules.code_block = function (tokens, idx, options, env, slf) {\n  var token = tokens[idx];\n\n  return  '<pre' + slf.renderAttrs(token) + '><code>' +\n          escapeHtml(tokens[idx].content) +\n          '</code></pre>\\n';\n};\n\n\ndefault_rules.fence = function (tokens, idx, options, env, slf) {\n  var token = tokens[idx],\n      info = token.info ? unescapeAll(token.info).trim() : '',\n      langName = '',\n      langAttrs = '',\n      highlighted, i, arr, tmpAttrs, tmpToken;\n\n  if (info) {\n    arr = info.split(/(\\s+)/g);\n    langName = arr[0];\n    langAttrs = arr.slice(2).join('');\n  }\n\n  if (options.highlight) {\n    highlighted = options.highlight(token.content, langName, langAttrs) || escapeHtml(token.content);\n  } else {\n    highlighted = escapeHtml(token.content);\n  }\n\n  if (highlighted.indexOf('<pre') === 0) {\n    return highlighted + '\\n';\n  }\n\n  // If language exists, inject class gently, without modifying original token.\n  // May be, one day we will add .deepClone() for token and simplify this part, but\n  // now we prefer to keep things local.\n  if (info) {\n    i        = token.attrIndex('class');\n    tmpAttrs = token.attrs ? token.attrs.slice() : [];\n\n    if (i < 0) {\n      tmpAttrs.push([ 'class', options.langPrefix + langName ]);\n    } else {\n      tmpAttrs[i] = tmpAttrs[i].slice();\n      tmpAttrs[i][1] += ' ' + options.langPrefix + langName;\n    }\n\n    // Fake token just to render attributes\n    tmpToken = {\n      attrs: tmpAttrs\n    };\n\n    return  '<pre><code' + slf.renderAttrs(tmpToken) + '>'\n          + highlighted\n          + '</code></pre>\\n';\n  }\n\n\n  return  '<pre><code' + slf.renderAttrs(token) + '>'\n        + highlighted\n        + '</code></pre>\\n';\n};\n\n\ndefault_rules.image = function (tokens, idx, options, env, slf) {\n  var token = tokens[idx];\n\n  // \"alt\" attr MUST be set, even if empty. Because it's mandatory and\n  // should be placed on proper position for tests.\n  //\n  // Replace content with actual value\n\n  token.attrs[token.attrIndex('alt')][1] =\n    slf.renderInlineAsText(token.children, options, env);\n\n  return slf.renderToken(tokens, idx, options);\n};\n\n\ndefault_rules.hardbreak = function (tokens, idx, options /*, env */) {\n  return options.xhtmlOut ? '<br />\\n' : '<br>\\n';\n};\ndefault_rules.softbreak = function (tokens, idx, options /*, env */) {\n  return options.breaks ? (options.xhtmlOut ? '<br />\\n' : '<br>\\n') : '\\n';\n};\n\n\ndefault_rules.text = function (tokens, idx /*, options, env */) {\n  return escapeHtml(tokens[idx].content);\n};\n\n\ndefault_rules.html_block = function (tokens, idx /*, options, env */) {\n  return tokens[idx].content;\n};\ndefault_rules.html_inline = function (tokens, idx /*, options, env */) {\n  return tokens[idx].content;\n};\n\n\n/**\n * new Renderer()\n *\n * Creates new [[Renderer]] instance and fill [[Renderer#rules]] with defaults.\n **/\nfunction Renderer() {\n\n  /**\n   * Renderer#rules -> Object\n   *\n   * Contains render rules for tokens. Can be updated and extended.\n   *\n   * ##### Example\n   *\n   * ```javascript\n   * var md = require('markdown-it')();\n   *\n   * md.renderer.rules.strong_open  = function () { return '<b>'; };\n   * md.renderer.rules.strong_close = function () { return '</b>'; };\n   *\n   * var result = md.renderInline(...);\n   * ```\n   *\n   * Each rule is called as independent static function with fixed signature:\n   *\n   * ```javascript\n   * function my_token_render(tokens, idx, options, env, renderer) {\n   *   // ...\n   *   return renderedHTML;\n   * }\n   * ```\n   *\n   * See [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js)\n   * for more details and examples.\n   **/\n  this.rules = assign({}, default_rules);\n}\n\n\n/**\n * Renderer.renderAttrs(token) -> String\n *\n * Render token attributes to string.\n **/\nRenderer.prototype.renderAttrs = function renderAttrs(token) {\n  var i, l, result;\n\n  if (!token.attrs) { return ''; }\n\n  result = '';\n\n  for (i = 0, l = token.attrs.length; i < l; i++) {\n    result += ' ' + escapeHtml(token.attrs[i][0]) + '=\"' + escapeHtml(token.attrs[i][1]) + '\"';\n  }\n\n  return result;\n};\n\n\n/**\n * Renderer.renderToken(tokens, idx, options) -> String\n * - tokens (Array): list of tokens\n * - idx (Numbed): token index to render\n * - options (Object): params of parser instance\n *\n * Default token renderer. Can be overriden by custom function\n * in [[Renderer#rules]].\n **/\nRenderer.prototype.renderToken = function renderToken(tokens, idx, options) {\n  var nextToken,\n      result = '',\n      needLf = false,\n      token = tokens[idx];\n\n  // Tight list paragraphs\n  if (token.hidden) {\n    return '';\n  }\n\n  // Insert a newline between hidden paragraph and subsequent opening\n  // block-level tag.\n  //\n  // For example, here we should insert a newline before blockquote:\n  //  - a\n  //    >\n  //\n  if (token.block && token.nesting !== -1 && idx && tokens[idx - 1].hidden) {\n    result += '\\n';\n  }\n\n  // Add token name, e.g. `<img`\n  result += (token.nesting === -1 ? '</' : '<') + token.tag;\n\n  // Encode attributes, e.g. `<img src=\"foo\"`\n  result += this.renderAttrs(token);\n\n  // Add a slash for self-closing tags, e.g. `<img src=\"foo\" /`\n  if (token.nesting === 0 && options.xhtmlOut) {\n    result += ' /';\n  }\n\n  // Check if we need to add a newline after this tag\n  if (token.block) {\n    needLf = true;\n\n    if (token.nesting === 1) {\n      if (idx + 1 < tokens.length) {\n        nextToken = tokens[idx + 1];\n\n        if (nextToken.type === 'inline' || nextToken.hidden) {\n          // Block-level tag containing an inline tag.\n          //\n          needLf = false;\n\n        } else if (nextToken.nesting === -1 && nextToken.tag === token.tag) {\n          // Opening tag + closing tag of the same type. E.g. `<li></li>`.\n          //\n          needLf = false;\n        }\n      }\n    }\n  }\n\n  result += needLf ? '>\\n' : '>';\n\n  return result;\n};\n\n\n/**\n * Renderer.renderInline(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to render\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * The same as [[Renderer.render]], but for single token of `inline` type.\n **/\nRenderer.prototype.renderInline = function (tokens, options, env) {\n  var type,\n      result = '',\n      rules = this.rules;\n\n  for (var i = 0, len = tokens.length; i < len; i++) {\n    type = tokens[i].type;\n\n    if (typeof rules[type] !== 'undefined') {\n      result += rules[type](tokens, i, options, env, this);\n    } else {\n      result += this.renderToken(tokens, i, options);\n    }\n  }\n\n  return result;\n};\n\n\n/** internal\n * Renderer.renderInlineAsText(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to render\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Special kludge for image `alt` attributes to conform CommonMark spec.\n * Don't try to use it! Spec requires to show `alt` content with stripped markup,\n * instead of simple escaping.\n **/\nRenderer.prototype.renderInlineAsText = function (tokens, options, env) {\n  var result = '';\n\n  for (var i = 0, len = tokens.length; i < len; i++) {\n    if (tokens[i].type === 'text') {\n      result += tokens[i].content;\n    } else if (tokens[i].type === 'image') {\n      result += this.renderInlineAsText(tokens[i].children, options, env);\n    } else if (tokens[i].type === 'softbreak') {\n      result += '\\n';\n    }\n  }\n\n  return result;\n};\n\n\n/**\n * Renderer.render(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to render\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Takes token stream and generates HTML. Probably, you will never need to call\n * this method directly.\n **/\nRenderer.prototype.render = function (tokens, options, env) {\n  var i, len, type,\n      result = '',\n      rules = this.rules;\n\n  for (i = 0, len = tokens.length; i < len; i++) {\n    type = tokens[i].type;\n\n    if (type === 'inline') {\n      result += this.renderInline(tokens[i].children, options, env);\n    } else if (typeof rules[type] !== 'undefined') {\n      result += rules[type](tokens, i, options, env, this);\n    } else {\n      result += this.renderToken(tokens, i, options, env);\n    }\n  }\n\n  return result;\n};\n\nmodule.exports = Renderer;\n","/**\n * class Ruler\n *\n * Helper class, used by [[MarkdownIt#core]], [[MarkdownIt#block]] and\n * [[MarkdownIt#inline]] to manage sequences of functions (rules):\n *\n * - keep rules in defined order\n * - assign the name to each rule\n * - enable/disable rules\n * - add/replace rules\n * - allow assign rules to additional named chains (in the same)\n * - cacheing lists of active rules\n *\n * You will not need use this class directly until write plugins. For simple\n * rules control use [[MarkdownIt.disable]], [[MarkdownIt.enable]] and\n * [[MarkdownIt.use]].\n **/\n'use strict';\n\n\n/**\n * new Ruler()\n **/\nfunction Ruler() {\n  // List of added rules. Each element is:\n  //\n  // {\n  //   name: XXX,\n  //   enabled: Boolean,\n  //   fn: Function(),\n  //   alt: [ name2, name3 ]\n  // }\n  //\n  this.__rules__ = [];\n\n  // Cached rule chains.\n  //\n  // First level - chain name, '' for default.\n  // Second level - diginal anchor for fast filtering by charcodes.\n  //\n  this.__cache__ = null;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Helper methods, should not be used directly\n\n\n// Find rule index by name\n//\nRuler.prototype.__find__ = function (name) {\n  for (var i = 0; i < this.__rules__.length; i++) {\n    if (this.__rules__[i].name === name) {\n      return i;\n    }\n  }\n  return -1;\n};\n\n\n// Build rules lookup cache\n//\nRuler.prototype.__compile__ = function () {\n  var self = this;\n  var chains = [ '' ];\n\n  // collect unique names\n  self.__rules__.forEach(function (rule) {\n    if (!rule.enabled) { return; }\n\n    rule.alt.forEach(function (altName) {\n      if (chains.indexOf(altName) < 0) {\n        chains.push(altName);\n      }\n    });\n  });\n\n  self.__cache__ = {};\n\n  chains.forEach(function (chain) {\n    self.__cache__[chain] = [];\n    self.__rules__.forEach(function (rule) {\n      if (!rule.enabled) { return; }\n\n      if (chain && rule.alt.indexOf(chain) < 0) { return; }\n\n      self.__cache__[chain].push(rule.fn);\n    });\n  });\n};\n\n\n/**\n * Ruler.at(name, fn [, options])\n * - name (String): rule name to replace.\n * - fn (Function): new rule function.\n * - options (Object): new rule options (not mandatory).\n *\n * Replace rule by name with new function & options. Throws error if name not\n * found.\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * Replace existing typographer replacement rule with new one:\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.at('replacements', function replace(state) {\n *   //...\n * });\n * ```\n **/\nRuler.prototype.at = function (name, fn, options) {\n  var index = this.__find__(name);\n  var opt = options || {};\n\n  if (index === -1) { throw new Error('Parser rule not found: ' + name); }\n\n  this.__rules__[index].fn = fn;\n  this.__rules__[index].alt = opt.alt || [];\n  this.__cache__ = null;\n};\n\n\n/**\n * Ruler.before(beforeName, ruleName, fn [, options])\n * - beforeName (String): new rule will be added before this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain before one with given name. See also\n * [[Ruler.after]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.block.ruler.before('paragraph', 'my_rule', function replace(state) {\n *   //...\n * });\n * ```\n **/\nRuler.prototype.before = function (beforeName, ruleName, fn, options) {\n  var index = this.__find__(beforeName);\n  var opt = options || {};\n\n  if (index === -1) { throw new Error('Parser rule not found: ' + beforeName); }\n\n  this.__rules__.splice(index, 0, {\n    name: ruleName,\n    enabled: true,\n    fn: fn,\n    alt: opt.alt || []\n  });\n\n  this.__cache__ = null;\n};\n\n\n/**\n * Ruler.after(afterName, ruleName, fn [, options])\n * - afterName (String): new rule will be added after this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain after one with given name. See also\n * [[Ruler.before]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.inline.ruler.after('text', 'my_rule', function replace(state) {\n *   //...\n * });\n * ```\n **/\nRuler.prototype.after = function (afterName, ruleName, fn, options) {\n  var index = this.__find__(afterName);\n  var opt = options || {};\n\n  if (index === -1) { throw new Error('Parser rule not found: ' + afterName); }\n\n  this.__rules__.splice(index + 1, 0, {\n    name: ruleName,\n    enabled: true,\n    fn: fn,\n    alt: opt.alt || []\n  });\n\n  this.__cache__ = null;\n};\n\n/**\n * Ruler.push(ruleName, fn [, options])\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Push new rule to the end of chain. See also\n * [[Ruler.before]], [[Ruler.after]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.push('my_rule', function replace(state) {\n *   //...\n * });\n * ```\n **/\nRuler.prototype.push = function (ruleName, fn, options) {\n  var opt = options || {};\n\n  this.__rules__.push({\n    name: ruleName,\n    enabled: true,\n    fn: fn,\n    alt: opt.alt || []\n  });\n\n  this.__cache__ = null;\n};\n\n\n/**\n * Ruler.enable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to enable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.disable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.enable = function (list, ignoreInvalid) {\n  if (!Array.isArray(list)) { list = [ list ]; }\n\n  var result = [];\n\n  // Search by name and enable\n  list.forEach(function (name) {\n    var idx = this.__find__(name);\n\n    if (idx < 0) {\n      if (ignoreInvalid) { return; }\n      throw new Error('Rules manager: invalid rule name ' + name);\n    }\n    this.__rules__[idx].enabled = true;\n    result.push(name);\n  }, this);\n\n  this.__cache__ = null;\n  return result;\n};\n\n\n/**\n * Ruler.enableOnly(list [, ignoreInvalid])\n * - list (String|Array): list of rule names to enable (whitelist).\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names, and disable everything else. If any rule name\n * not found - throw Error. Errors can be disabled by second param.\n *\n * See also [[Ruler.disable]], [[Ruler.enable]].\n **/\nRuler.prototype.enableOnly = function (list, ignoreInvalid) {\n  if (!Array.isArray(list)) { list = [ list ]; }\n\n  this.__rules__.forEach(function (rule) { rule.enabled = false; });\n\n  this.enable(list, ignoreInvalid);\n};\n\n\n/**\n * Ruler.disable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Disable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.enable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.disable = function (list, ignoreInvalid) {\n  if (!Array.isArray(list)) { list = [ list ]; }\n\n  var result = [];\n\n  // Search by name and disable\n  list.forEach(function (name) {\n    var idx = this.__find__(name);\n\n    if (idx < 0) {\n      if (ignoreInvalid) { return; }\n      throw new Error('Rules manager: invalid rule name ' + name);\n    }\n    this.__rules__[idx].enabled = false;\n    result.push(name);\n  }, this);\n\n  this.__cache__ = null;\n  return result;\n};\n\n\n/**\n * Ruler.getRules(chainName) -> Array\n *\n * Return array of active functions (rules) for given chain name. It analyzes\n * rules configuration, compiles caches if not exists and returns result.\n *\n * Default chain name is `''` (empty string). It can't be skipped. That's\n * done intentionally, to keep signature monomorphic for high speed.\n **/\nRuler.prototype.getRules = function (chainName) {\n  if (this.__cache__ === null) {\n    this.__compile__();\n  }\n\n  // Chain can be empty, if rules disabled. But we still have to return Array.\n  return this.__cache__[chainName] || [];\n};\n\nmodule.exports = Ruler;\n","// Normalize input string\n\n'use strict';\n\n\n// https://spec.commonmark.org/0.29/#line-ending\nvar NEWLINES_RE  = /\\r\\n?|\\n/g;\nvar NULL_RE      = /\\0/g;\n\n\nmodule.exports = function normalize(state) {\n  var str;\n\n  // Normalize newlines\n  str = state.src.replace(NEWLINES_RE, '\\n');\n\n  // Replace NULL characters\n  str = str.replace(NULL_RE, '\\uFFFD');\n\n  state.src = str;\n};\n","'use strict';\n\n\nmodule.exports = function block(state) {\n  var token;\n\n  if (state.inlineMode) {\n    token          = new state.Token('inline', '', 0);\n    token.content  = state.src;\n    token.map      = [ 0, 1 ];\n    token.children = [];\n    state.tokens.push(token);\n  } else {\n    state.md.block.parse(state.src, state.md, state.env, state.tokens);\n  }\n};\n","'use strict';\n\nmodule.exports = function inline(state) {\n  var tokens = state.tokens, tok, i, l;\n\n  // Parse inlines\n  for (i = 0, l = tokens.length; i < l; i++) {\n    tok = tokens[i];\n    if (tok.type === 'inline') {\n      state.md.inline.parse(tok.content, state.md, state.env, tok.children);\n    }\n  }\n};\n","// Replace link-like texts with link nodes.\n//\n// Currently restricted by `md.validateLink()` to http/https/ftp\n//\n'use strict';\n\n\nvar arrayReplaceAt = require('../common/utils').arrayReplaceAt;\n\n\nfunction isLinkOpen(str) {\n  return /^<a[>\\s]/i.test(str);\n}\nfunction isLinkClose(str) {\n  return /^<\\/a\\s*>/i.test(str);\n}\n\n\nmodule.exports = function linkify(state) {\n  var i, j, l, tokens, token, currentToken, nodes, ln, text, pos, lastPos,\n      level, htmlLinkLevel, url, fullUrl, urlText,\n      blockTokens = state.tokens,\n      links;\n\n  if (!state.md.options.linkify) { return; }\n\n  for (j = 0, l = blockTokens.length; j < l; j++) {\n    if (blockTokens[j].type !== 'inline' ||\n        !state.md.linkify.pretest(blockTokens[j].content)) {\n      continue;\n    }\n\n    tokens = blockTokens[j].children;\n\n    htmlLinkLevel = 0;\n\n    // We scan from the end, to keep position when new tags added.\n    // Use reversed logic in links start/end match\n    for (i = tokens.length - 1; i >= 0; i--) {\n      currentToken = tokens[i];\n\n      // Skip content of markdown links\n      if (currentToken.type === 'link_close') {\n        i--;\n        while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') {\n          i--;\n        }\n        continue;\n      }\n\n      // Skip content of html tag links\n      if (currentToken.type === 'html_inline') {\n        if (isLinkOpen(currentToken.content) && htmlLinkLevel > 0) {\n          htmlLinkLevel--;\n        }\n        if (isLinkClose(currentToken.content)) {\n          htmlLinkLevel++;\n        }\n      }\n      if (htmlLinkLevel > 0) { continue; }\n\n      if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) {\n\n        text = currentToken.content;\n        links = state.md.linkify.match(text);\n\n        // Now split string to nodes\n        nodes = [];\n        level = currentToken.level;\n        lastPos = 0;\n\n        // forbid escape sequence at the start of the string,\n        // this avoids http\\://example.com/ from being linkified as\n        // http:<a href=\"//example.com/\">//example.com/</a>\n        if (links.length > 0 &&\n            links[0].index === 0 &&\n            i > 0 &&\n            tokens[i - 1].type === 'text_special') {\n          links = links.slice(1);\n        }\n\n        for (ln = 0; ln < links.length; ln++) {\n          url = links[ln].url;\n          fullUrl = state.md.normalizeLink(url);\n          if (!state.md.validateLink(fullUrl)) { continue; }\n\n          urlText = links[ln].text;\n\n          // Linkifier might send raw hostnames like \"example.com\", where url\n          // starts with domain name. So we prepend http:// in those cases,\n          // and remove it afterwards.\n          //\n          if (!links[ln].schema) {\n            urlText = state.md.normalizeLinkText('http://' + urlText).replace(/^http:\\/\\//, '');\n          } else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) {\n            urlText = state.md.normalizeLinkText('mailto:' + urlText).replace(/^mailto:/, '');\n          } else {\n            urlText = state.md.normalizeLinkText(urlText);\n          }\n\n          pos = links[ln].index;\n\n          if (pos > lastPos) {\n            token         = new state.Token('text', '', 0);\n            token.content = text.slice(lastPos, pos);\n            token.level   = level;\n            nodes.push(token);\n          }\n\n          token         = new state.Token('link_open', 'a', 1);\n          token.attrs   = [ [ 'href', fullUrl ] ];\n          token.level   = level++;\n          token.markup  = 'linkify';\n          token.info    = 'auto';\n          nodes.push(token);\n\n          token         = new state.Token('text', '', 0);\n          token.content = urlText;\n          token.level   = level;\n          nodes.push(token);\n\n          token         = new state.Token('link_close', 'a', -1);\n          token.level   = --level;\n          token.markup  = 'linkify';\n          token.info    = 'auto';\n          nodes.push(token);\n\n          lastPos = links[ln].lastIndex;\n        }\n        if (lastPos < text.length) {\n          token         = new state.Token('text', '', 0);\n          token.content = text.slice(lastPos);\n          token.level   = level;\n          nodes.push(token);\n        }\n\n        // replace current node\n        blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, nodes);\n      }\n    }\n  }\n};\n","// Simple typographic replacements\n//\n// (c) (C) → ©\n// (tm) (TM) → ™\n// (r) (R) → ®\n// +- → ±\n// ... → … (also ?.... → ?.., !.... → !..)\n// ???????? → ???, !!!!! → !!!, `,,` → `,`\n// -- → &ndash;, --- → &mdash;\n//\n'use strict';\n\n// TODO:\n// - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾\n// - multiplications 2 x 4 -> 2 × 4\n\nvar RARE_RE = /\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/;\n\n// Workaround for phantomjs - need regex without /g flag,\n// or root check will fail every second time\nvar SCOPED_ABBR_TEST_RE = /\\((c|tm|r)\\)/i;\n\nvar SCOPED_ABBR_RE = /\\((c|tm|r)\\)/ig;\nvar SCOPED_ABBR = {\n  c: '©',\n  r: '®',\n  tm: '™'\n};\n\nfunction replaceFn(match, name) {\n  return SCOPED_ABBR[name.toLowerCase()];\n}\n\nfunction replace_scoped(inlineTokens) {\n  var i, token, inside_autolink = 0;\n\n  for (i = inlineTokens.length - 1; i >= 0; i--) {\n    token = inlineTokens[i];\n\n    if (token.type === 'text' && !inside_autolink) {\n      token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn);\n    }\n\n    if (token.type === 'link_open' && token.info === 'auto') {\n      inside_autolink--;\n    }\n\n    if (token.type === 'link_close' && token.info === 'auto') {\n      inside_autolink++;\n    }\n  }\n}\n\nfunction replace_rare(inlineTokens) {\n  var i, token, inside_autolink = 0;\n\n  for (i = inlineTokens.length - 1; i >= 0; i--) {\n    token = inlineTokens[i];\n\n    if (token.type === 'text' && !inside_autolink) {\n      if (RARE_RE.test(token.content)) {\n        token.content = token.content\n          .replace(/\\+-/g, '±')\n          // .., ..., ....... -> …\n          // but ?..... & !..... -> ?.. & !..\n          .replace(/\\.{2,}/g, '…').replace(/([?!])…/g, '$1..')\n          .replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',')\n          // em-dash\n          .replace(/(^|[^-])---(?=[^-]|$)/mg, '$1\\u2014')\n          // en-dash\n          .replace(/(^|\\s)--(?=\\s|$)/mg, '$1\\u2013')\n          .replace(/(^|[^-\\s])--(?=[^-\\s]|$)/mg, '$1\\u2013');\n      }\n    }\n\n    if (token.type === 'link_open' && token.info === 'auto') {\n      inside_autolink--;\n    }\n\n    if (token.type === 'link_close' && token.info === 'auto') {\n      inside_autolink++;\n    }\n  }\n}\n\n\nmodule.exports = function replace(state) {\n  var blkIdx;\n\n  if (!state.md.options.typographer) { return; }\n\n  for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n\n    if (state.tokens[blkIdx].type !== 'inline') { continue; }\n\n    if (SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)) {\n      replace_scoped(state.tokens[blkIdx].children);\n    }\n\n    if (RARE_RE.test(state.tokens[blkIdx].content)) {\n      replace_rare(state.tokens[blkIdx].children);\n    }\n\n  }\n};\n","// Convert straight quotation marks to typographic ones\n//\n'use strict';\n\n\nvar isWhiteSpace   = require('../common/utils').isWhiteSpace;\nvar isPunctChar    = require('../common/utils').isPunctChar;\nvar isMdAsciiPunct = require('../common/utils').isMdAsciiPunct;\n\nvar QUOTE_TEST_RE = /['\"]/;\nvar QUOTE_RE = /['\"]/g;\nvar APOSTROPHE = '\\u2019'; /* ’ */\n\n\nfunction replaceAt(str, index, ch) {\n  return str.slice(0, index) + ch + str.slice(index + 1);\n}\n\nfunction process_inlines(tokens, state) {\n  var i, token, text, t, pos, max, thisLevel, item, lastChar, nextChar,\n      isLastPunctChar, isNextPunctChar, isLastWhiteSpace, isNextWhiteSpace,\n      canOpen, canClose, j, isSingle, stack, openQuote, closeQuote;\n\n  stack = [];\n\n  for (i = 0; i < tokens.length; i++) {\n    token = tokens[i];\n\n    thisLevel = tokens[i].level;\n\n    for (j = stack.length - 1; j >= 0; j--) {\n      if (stack[j].level <= thisLevel) { break; }\n    }\n    stack.length = j + 1;\n\n    if (token.type !== 'text') { continue; }\n\n    text = token.content;\n    pos = 0;\n    max = text.length;\n\n    /*eslint no-labels:0,block-scoped-var:0*/\n    OUTER:\n    while (pos < max) {\n      QUOTE_RE.lastIndex = pos;\n      t = QUOTE_RE.exec(text);\n      if (!t) { break; }\n\n      canOpen = canClose = true;\n      pos = t.index + 1;\n      isSingle = (t[0] === \"'\");\n\n      // Find previous character,\n      // default to space if it's the beginning of the line\n      //\n      lastChar = 0x20;\n\n      if (t.index - 1 >= 0) {\n        lastChar = text.charCodeAt(t.index - 1);\n      } else {\n        for (j = i - 1; j >= 0; j--) {\n          if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // lastChar defaults to 0x20\n          if (!tokens[j].content) continue; // should skip all tokens except 'text', 'html_inline' or 'code_inline'\n\n          lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1);\n          break;\n        }\n      }\n\n      // Find next character,\n      // default to space if it's the end of the line\n      //\n      nextChar = 0x20;\n\n      if (pos < max) {\n        nextChar = text.charCodeAt(pos);\n      } else {\n        for (j = i + 1; j < tokens.length; j++) {\n          if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // nextChar defaults to 0x20\n          if (!tokens[j].content) continue; // should skip all tokens except 'text', 'html_inline' or 'code_inline'\n\n          nextChar = tokens[j].content.charCodeAt(0);\n          break;\n        }\n      }\n\n      isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));\n      isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));\n\n      isLastWhiteSpace = isWhiteSpace(lastChar);\n      isNextWhiteSpace = isWhiteSpace(nextChar);\n\n      if (isNextWhiteSpace) {\n        canOpen = false;\n      } else if (isNextPunctChar) {\n        if (!(isLastWhiteSpace || isLastPunctChar)) {\n          canOpen = false;\n        }\n      }\n\n      if (isLastWhiteSpace) {\n        canClose = false;\n      } else if (isLastPunctChar) {\n        if (!(isNextWhiteSpace || isNextPunctChar)) {\n          canClose = false;\n        }\n      }\n\n      if (nextChar === 0x22 /* \" */ && t[0] === '\"') {\n        if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) {\n          // special case: 1\"\" - count first quote as an inch\n          canClose = canOpen = false;\n        }\n      }\n\n      if (canOpen && canClose) {\n        // Replace quotes in the middle of punctuation sequence, but not\n        // in the middle of the words, i.e.:\n        //\n        // 1. foo \" bar \" baz - not replaced\n        // 2. foo-\"-bar-\"-baz - replaced\n        // 3. foo\"bar\"baz     - not replaced\n        //\n        canOpen = isLastPunctChar;\n        canClose = isNextPunctChar;\n      }\n\n      if (!canOpen && !canClose) {\n        // middle of word\n        if (isSingle) {\n          token.content = replaceAt(token.content, t.index, APOSTROPHE);\n        }\n        continue;\n      }\n\n      if (canClose) {\n        // this could be a closing quote, rewind the stack to get a match\n        for (j = stack.length - 1; j >= 0; j--) {\n          item = stack[j];\n          if (stack[j].level < thisLevel) { break; }\n          if (item.single === isSingle && stack[j].level === thisLevel) {\n            item = stack[j];\n\n            if (isSingle) {\n              openQuote = state.md.options.quotes[2];\n              closeQuote = state.md.options.quotes[3];\n            } else {\n              openQuote = state.md.options.quotes[0];\n              closeQuote = state.md.options.quotes[1];\n            }\n\n            // replace token.content *before* tokens[item.token].content,\n            // because, if they are pointing at the same token, replaceAt\n            // could mess up indices when quote length != 1\n            token.content = replaceAt(token.content, t.index, closeQuote);\n            tokens[item.token].content = replaceAt(\n              tokens[item.token].content, item.pos, openQuote);\n\n            pos += closeQuote.length - 1;\n            if (item.token === i) { pos += openQuote.length - 1; }\n\n            text = token.content;\n            max = text.length;\n\n            stack.length = j;\n            continue OUTER;\n          }\n        }\n      }\n\n      if (canOpen) {\n        stack.push({\n          token: i,\n          pos: t.index,\n          single: isSingle,\n          level: thisLevel\n        });\n      } else if (canClose && isSingle) {\n        token.content = replaceAt(token.content, t.index, APOSTROPHE);\n      }\n    }\n  }\n}\n\n\nmodule.exports = function smartquotes(state) {\n  /*eslint max-depth:0*/\n  var blkIdx;\n\n  if (!state.md.options.typographer) { return; }\n\n  for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n\n    if (state.tokens[blkIdx].type !== 'inline' ||\n        !QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) {\n      continue;\n    }\n\n    process_inlines(state.tokens[blkIdx].children, state);\n  }\n};\n","// Join raw text tokens with the rest of the text\n//\n// This is set as a separate rule to provide an opportunity for plugins\n// to run text replacements after text join, but before escape join.\n//\n// For example, `\\:)` shouldn't be replaced with an emoji.\n//\n'use strict';\n\n\nmodule.exports = function text_join(state) {\n  var j, l, tokens, curr, max, last,\n      blockTokens = state.tokens;\n\n  for (j = 0, l = blockTokens.length; j < l; j++) {\n    if (blockTokens[j].type !== 'inline') continue;\n\n    tokens = blockTokens[j].children;\n    max = tokens.length;\n\n    for (curr = 0; curr < max; curr++) {\n      if (tokens[curr].type === 'text_special') {\n        tokens[curr].type = 'text';\n      }\n    }\n\n    for (curr = last = 0; curr < max; curr++) {\n      if (tokens[curr].type === 'text' &&\n          curr + 1 < max &&\n          tokens[curr + 1].type === 'text') {\n\n        // collapse two adjacent text nodes\n        tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content;\n      } else {\n        if (curr !== last) { tokens[last] = tokens[curr]; }\n\n        last++;\n      }\n    }\n\n    if (curr !== last) {\n      tokens.length = last;\n    }\n  }\n};\n","// Token class\n\n'use strict';\n\n\n/**\n * class Token\n **/\n\n/**\n * new Token(type, tag, nesting)\n *\n * Create new token and fill passed properties.\n **/\nfunction Token(type, tag, nesting) {\n  /**\n   * Token#type -> String\n   *\n   * Type of the token (string, e.g. \"paragraph_open\")\n   **/\n  this.type     = type;\n\n  /**\n   * Token#tag -> String\n   *\n   * html tag name, e.g. \"p\"\n   **/\n  this.tag      = tag;\n\n  /**\n   * Token#attrs -> Array\n   *\n   * Html attributes. Format: `[ [ name1, value1 ], [ name2, value2 ] ]`\n   **/\n  this.attrs    = null;\n\n  /**\n   * Token#map -> Array\n   *\n   * Source map info. Format: `[ line_begin, line_end ]`\n   **/\n  this.map      = null;\n\n  /**\n   * Token#nesting -> Number\n   *\n   * Level change (number in {-1, 0, 1} set), where:\n   *\n   * -  `1` means the tag is opening\n   * -  `0` means the tag is self-closing\n   * - `-1` means the tag is closing\n   **/\n  this.nesting  = nesting;\n\n  /**\n   * Token#level -> Number\n   *\n   * nesting level, the same as `state.level`\n   **/\n  this.level    = 0;\n\n  /**\n   * Token#children -> Array\n   *\n   * An array of child nodes (inline and img tokens)\n   **/\n  this.children = null;\n\n  /**\n   * Token#content -> String\n   *\n   * In a case of self-closing tag (code, html, fence, etc.),\n   * it has contents of this tag.\n   **/\n  this.content  = '';\n\n  /**\n   * Token#markup -> String\n   *\n   * '*' or '_' for emphasis, fence string for fence, etc.\n   **/\n  this.markup   = '';\n\n  /**\n   * Token#info -> String\n   *\n   * Additional information:\n   *\n   * - Info string for \"fence\" tokens\n   * - The value \"auto\" for autolink \"link_open\" and \"link_close\" tokens\n   * - The string value of the item marker for ordered-list \"list_item_open\" tokens\n   **/\n  this.info     = '';\n\n  /**\n   * Token#meta -> Object\n   *\n   * A place for plugins to store an arbitrary data\n   **/\n  this.meta     = null;\n\n  /**\n   * Token#block -> Boolean\n   *\n   * True for block-level tokens, false for inline tokens.\n   * Used in renderer to calculate line breaks\n   **/\n  this.block    = false;\n\n  /**\n   * Token#hidden -> Boolean\n   *\n   * If it's true, ignore this element when rendering. Used for tight lists\n   * to hide paragraphs.\n   **/\n  this.hidden   = false;\n}\n\n\n/**\n * Token.attrIndex(name) -> Number\n *\n * Search attribute index by name.\n **/\nToken.prototype.attrIndex = function attrIndex(name) {\n  var attrs, i, len;\n\n  if (!this.attrs) { return -1; }\n\n  attrs = this.attrs;\n\n  for (i = 0, len = attrs.length; i < len; i++) {\n    if (attrs[i][0] === name) { return i; }\n  }\n  return -1;\n};\n\n\n/**\n * Token.attrPush(attrData)\n *\n * Add `[ name, value ]` attribute to list. Init attrs if necessary\n **/\nToken.prototype.attrPush = function attrPush(attrData) {\n  if (this.attrs) {\n    this.attrs.push(attrData);\n  } else {\n    this.attrs = [ attrData ];\n  }\n};\n\n\n/**\n * Token.attrSet(name, value)\n *\n * Set `name` attribute to `value`. Override old value if exists.\n **/\nToken.prototype.attrSet = function attrSet(name, value) {\n  var idx = this.attrIndex(name),\n      attrData = [ name, value ];\n\n  if (idx < 0) {\n    this.attrPush(attrData);\n  } else {\n    this.attrs[idx] = attrData;\n  }\n};\n\n\n/**\n * Token.attrGet(name)\n *\n * Get the value of attribute `name`, or null if it does not exist.\n **/\nToken.prototype.attrGet = function attrGet(name) {\n  var idx = this.attrIndex(name), value = null;\n  if (idx >= 0) {\n    value = this.attrs[idx][1];\n  }\n  return value;\n};\n\n\n/**\n * Token.attrJoin(name, value)\n *\n * Join value to existing attribute via space. Or create new attribute if not\n * exists. Useful to operate with token classes.\n **/\nToken.prototype.attrJoin = function attrJoin(name, value) {\n  var idx = this.attrIndex(name);\n\n  if (idx < 0) {\n    this.attrPush([ name, value ]);\n  } else {\n    this.attrs[idx][1] = this.attrs[idx][1] + ' ' + value;\n  }\n};\n\n\nmodule.exports = Token;\n","// Core state object\n//\n'use strict';\n\nvar Token = require('../token');\n\n\nfunction StateCore(src, md, env) {\n  this.src = src;\n  this.env = env;\n  this.tokens = [];\n  this.inlineMode = false;\n  this.md = md; // link to parser instance\n}\n\n// re-export Token class to use in core rules\nStateCore.prototype.Token = Token;\n\n\nmodule.exports = StateCore;\n","/** internal\n * class Core\n *\n * Top-level rules executor. Glues block/inline parsers and does intermediate\n * transformations.\n **/\n'use strict';\n\n\nvar Ruler  = require('./ruler');\n\n\nvar _rules = [\n  [ 'normalize',      require('./rules_core/normalize')      ],\n  [ 'block',          require('./rules_core/block')          ],\n  [ 'inline',         require('./rules_core/inline')         ],\n  [ 'linkify',        require('./rules_core/linkify')        ],\n  [ 'replacements',   require('./rules_core/replacements')   ],\n  [ 'smartquotes',    require('./rules_core/smartquotes')    ],\n  // `text_join` finds `text_special` tokens (for escape sequences)\n  // and joins them with the rest of the text\n  [ 'text_join',      require('./rules_core/text_join')      ]\n];\n\n\n/**\n * new Core()\n **/\nfunction Core() {\n  /**\n   * Core#ruler -> Ruler\n   *\n   * [[Ruler]] instance. Keep configuration of core rules.\n   **/\n  this.ruler = new Ruler();\n\n  for (var i = 0; i < _rules.length; i++) {\n    this.ruler.push(_rules[i][0], _rules[i][1]);\n  }\n}\n\n\n/**\n * Core.process(state)\n *\n * Executes core chain rules.\n **/\nCore.prototype.process = function (state) {\n  var i, l, rules;\n\n  rules = this.ruler.getRules('');\n\n  for (i = 0, l = rules.length; i < l; i++) {\n    rules[i](state);\n  }\n};\n\nCore.prototype.State = require('./rules_core/state_core');\n\n\nmodule.exports = Core;\n","// GFM table, https://github.github.com/gfm/#tables-extension-\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nfunction getLine(state, line) {\n  var pos = state.bMarks[line] + state.tShift[line],\n      max = state.eMarks[line];\n\n  return state.src.slice(pos, max);\n}\n\nfunction escapedSplit(str) {\n  var result = [],\n      pos = 0,\n      max = str.length,\n      ch,\n      isEscaped = false,\n      lastPos = 0,\n      current = '';\n\n  ch  = str.charCodeAt(pos);\n\n  while (pos < max) {\n    if (ch === 0x7c/* | */) {\n      if (!isEscaped) {\n        // pipe separating cells, '|'\n        result.push(current + str.substring(lastPos, pos));\n        current = '';\n        lastPos = pos + 1;\n      } else {\n        // escaped pipe, '\\|'\n        current += str.substring(lastPos, pos - 1);\n        lastPos = pos;\n      }\n    }\n\n    isEscaped = (ch === 0x5c/* \\ */);\n    pos++;\n\n    ch = str.charCodeAt(pos);\n  }\n\n  result.push(current + str.substring(lastPos));\n\n  return result;\n}\n\n\nmodule.exports = function table(state, startLine, endLine, silent) {\n  var ch, lineText, pos, i, l, nextLine, columns, columnCount, token,\n      aligns, t, tableLines, tbodyLines, oldParentType, terminate,\n      terminatorRules, firstCh, secondCh;\n\n  // should have at least two lines\n  if (startLine + 2 > endLine) { return false; }\n\n  nextLine = startLine + 1;\n\n  if (state.sCount[nextLine] < state.blkIndent) { return false; }\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[nextLine] - state.blkIndent >= 4) { return false; }\n\n  // first character of the second line should be '|', '-', ':',\n  // and no other characters are allowed but spaces;\n  // basically, this is the equivalent of /^[-:|][-:|\\s]*$/ regexp\n\n  pos = state.bMarks[nextLine] + state.tShift[nextLine];\n  if (pos >= state.eMarks[nextLine]) { return false; }\n\n  firstCh = state.src.charCodeAt(pos++);\n  if (firstCh !== 0x7C/* | */ && firstCh !== 0x2D/* - */ && firstCh !== 0x3A/* : */) { return false; }\n\n  if (pos >= state.eMarks[nextLine]) { return false; }\n\n  secondCh = state.src.charCodeAt(pos++);\n  if (secondCh !== 0x7C/* | */ && secondCh !== 0x2D/* - */ && secondCh !== 0x3A/* : */ && !isSpace(secondCh)) {\n    return false;\n  }\n\n  // if first character is '-', then second character must not be a space\n  // (due to parsing ambiguity with list)\n  if (firstCh === 0x2D/* - */ && isSpace(secondCh)) { return false; }\n\n  while (pos < state.eMarks[nextLine]) {\n    ch = state.src.charCodeAt(pos);\n\n    if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */ && !isSpace(ch)) { return false; }\n\n    pos++;\n  }\n\n  lineText = getLine(state, startLine + 1);\n\n  columns = lineText.split('|');\n  aligns = [];\n  for (i = 0; i < columns.length; i++) {\n    t = columns[i].trim();\n    if (!t) {\n      // allow empty columns before and after table, but not in between columns;\n      // e.g. allow ` |---| `, disallow ` ---||--- `\n      if (i === 0 || i === columns.length - 1) {\n        continue;\n      } else {\n        return false;\n      }\n    }\n\n    if (!/^:?-+:?$/.test(t)) { return false; }\n    if (t.charCodeAt(t.length - 1) === 0x3A/* : */) {\n      aligns.push(t.charCodeAt(0) === 0x3A/* : */ ? 'center' : 'right');\n    } else if (t.charCodeAt(0) === 0x3A/* : */) {\n      aligns.push('left');\n    } else {\n      aligns.push('');\n    }\n  }\n\n  lineText = getLine(state, startLine).trim();\n  if (lineText.indexOf('|') === -1) { return false; }\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n  columns = escapedSplit(lineText);\n  if (columns.length && columns[0] === '') columns.shift();\n  if (columns.length && columns[columns.length - 1] === '') columns.pop();\n\n  // header row will define an amount of columns in the entire table,\n  // and align row should be exactly the same (the rest of the rows can differ)\n  columnCount = columns.length;\n  if (columnCount === 0 || columnCount !== aligns.length) { return false; }\n\n  if (silent) { return true; }\n\n  oldParentType = state.parentType;\n  state.parentType = 'table';\n\n  // use 'blockquote' lists for termination because it's\n  // the most similar to tables\n  terminatorRules = state.md.block.ruler.getRules('blockquote');\n\n  token     = state.push('table_open', 'table', 1);\n  token.map = tableLines = [ startLine, 0 ];\n\n  token     = state.push('thead_open', 'thead', 1);\n  token.map = [ startLine, startLine + 1 ];\n\n  token     = state.push('tr_open', 'tr', 1);\n  token.map = [ startLine, startLine + 1 ];\n\n  for (i = 0; i < columns.length; i++) {\n    token          = state.push('th_open', 'th', 1);\n    if (aligns[i]) {\n      token.attrs  = [ [ 'style', 'text-align:' + aligns[i] ] ];\n    }\n\n    token          = state.push('inline', '', 0);\n    token.content  = columns[i].trim();\n    token.children = [];\n\n    token          = state.push('th_close', 'th', -1);\n  }\n\n  token     = state.push('tr_close', 'tr', -1);\n  token     = state.push('thead_close', 'thead', -1);\n\n  for (nextLine = startLine + 2; nextLine < endLine; nextLine++) {\n    if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n    terminate = false;\n    for (i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true;\n        break;\n      }\n    }\n\n    if (terminate) { break; }\n    lineText = getLine(state, nextLine).trim();\n    if (!lineText) { break; }\n    if (state.sCount[nextLine] - state.blkIndent >= 4) { break; }\n    columns = escapedSplit(lineText);\n    if (columns.length && columns[0] === '') columns.shift();\n    if (columns.length && columns[columns.length - 1] === '') columns.pop();\n\n    if (nextLine === startLine + 2) {\n      token     = state.push('tbody_open', 'tbody', 1);\n      token.map = tbodyLines = [ startLine + 2, 0 ];\n    }\n\n    token     = state.push('tr_open', 'tr', 1);\n    token.map = [ nextLine, nextLine + 1 ];\n\n    for (i = 0; i < columnCount; i++) {\n      token          = state.push('td_open', 'td', 1);\n      if (aligns[i]) {\n        token.attrs  = [ [ 'style', 'text-align:' + aligns[i] ] ];\n      }\n\n      token          = state.push('inline', '', 0);\n      token.content  = columns[i] ? columns[i].trim() : '';\n      token.children = [];\n\n      token          = state.push('td_close', 'td', -1);\n    }\n    token = state.push('tr_close', 'tr', -1);\n  }\n\n  if (tbodyLines) {\n    token = state.push('tbody_close', 'tbody', -1);\n    tbodyLines[1] = nextLine;\n  }\n\n  token = state.push('table_close', 'table', -1);\n  tableLines[1] = nextLine;\n\n  state.parentType = oldParentType;\n  state.line = nextLine;\n  return true;\n};\n","// Code block (4 spaces padded)\n\n'use strict';\n\n\nmodule.exports = function code(state, startLine, endLine/*, silent*/) {\n  var nextLine, last, token;\n\n  if (state.sCount[startLine] - state.blkIndent < 4) { return false; }\n\n  last = nextLine = startLine + 1;\n\n  while (nextLine < endLine) {\n    if (state.isEmpty(nextLine)) {\n      nextLine++;\n      continue;\n    }\n\n    if (state.sCount[nextLine] - state.blkIndent >= 4) {\n      nextLine++;\n      last = nextLine;\n      continue;\n    }\n    break;\n  }\n\n  state.line = last;\n\n  token         = state.push('code_block', 'code', 0);\n  token.content = state.getLines(startLine, last, 4 + state.blkIndent, false) + '\\n';\n  token.map     = [ startLine, state.line ];\n\n  return true;\n};\n","// fences (``` lang, ~~~ lang)\n\n'use strict';\n\n\nmodule.exports = function fence(state, startLine, endLine, silent) {\n  var marker, len, params, nextLine, mem, token, markup,\n      haveEndMarker = false,\n      pos = state.bMarks[startLine] + state.tShift[startLine],\n      max = state.eMarks[startLine];\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n  if (pos + 3 > max) { return false; }\n\n  marker = state.src.charCodeAt(pos);\n\n  if (marker !== 0x7E/* ~ */ && marker !== 0x60 /* ` */) {\n    return false;\n  }\n\n  // scan marker length\n  mem = pos;\n  pos = state.skipChars(pos, marker);\n\n  len = pos - mem;\n\n  if (len < 3) { return false; }\n\n  markup = state.src.slice(mem, pos);\n  params = state.src.slice(pos, max);\n\n  if (marker === 0x60 /* ` */) {\n    if (params.indexOf(String.fromCharCode(marker)) >= 0) {\n      return false;\n    }\n  }\n\n  // Since start is found, we can report success here in validation mode\n  if (silent) { return true; }\n\n  // search end of block\n  nextLine = startLine;\n\n  for (;;) {\n    nextLine++;\n    if (nextLine >= endLine) {\n      // unclosed block should be autoclosed by end of document.\n      // also block seems to be autoclosed by end of parent\n      break;\n    }\n\n    pos = mem = state.bMarks[nextLine] + state.tShift[nextLine];\n    max = state.eMarks[nextLine];\n\n    if (pos < max && state.sCount[nextLine] < state.blkIndent) {\n      // non-empty line with negative indent should stop the list:\n      // - ```\n      //  test\n      break;\n    }\n\n    if (state.src.charCodeAt(pos) !== marker) { continue; }\n\n    if (state.sCount[nextLine] - state.blkIndent >= 4) {\n      // closing fence should be indented less than 4 spaces\n      continue;\n    }\n\n    pos = state.skipChars(pos, marker);\n\n    // closing code fence must be at least as long as the opening one\n    if (pos - mem < len) { continue; }\n\n    // make sure tail has spaces only\n    pos = state.skipSpaces(pos);\n\n    if (pos < max) { continue; }\n\n    haveEndMarker = true;\n    // found!\n    break;\n  }\n\n  // If a fence has heading spaces, they should be removed from its inner block\n  len = state.sCount[startLine];\n\n  state.line = nextLine + (haveEndMarker ? 1 : 0);\n\n  token         = state.push('fence', 'code', 0);\n  token.info    = params;\n  token.content = state.getLines(startLine + 1, nextLine, len, true);\n  token.markup  = markup;\n  token.map     = [ startLine, state.line ];\n\n  return true;\n};\n","// Block quotes\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function blockquote(state, startLine, endLine, silent) {\n  var adjustTab,\n      ch,\n      i,\n      initial,\n      l,\n      lastLineEmpty,\n      lines,\n      nextLine,\n      offset,\n      oldBMarks,\n      oldBSCount,\n      oldIndent,\n      oldParentType,\n      oldSCount,\n      oldTShift,\n      spaceAfterMarker,\n      terminate,\n      terminatorRules,\n      token,\n      isOutdented,\n      oldLineMax = state.lineMax,\n      pos = state.bMarks[startLine] + state.tShift[startLine],\n      max = state.eMarks[startLine];\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n  // check the block quote marker\n  if (state.src.charCodeAt(pos) !== 0x3E/* > */) { return false; }\n\n  // we know that it's going to be a valid blockquote,\n  // so no point trying to find the end of it in silent mode\n  if (silent) { return true; }\n\n  oldBMarks  = [];\n  oldBSCount = [];\n  oldSCount  = [];\n  oldTShift  = [];\n\n  terminatorRules = state.md.block.ruler.getRules('blockquote');\n\n  oldParentType = state.parentType;\n  state.parentType = 'blockquote';\n\n  // Search the end of the block\n  //\n  // Block ends with either:\n  //  1. an empty line outside:\n  //     ```\n  //     > test\n  //\n  //     ```\n  //  2. an empty line inside:\n  //     ```\n  //     >\n  //     test\n  //     ```\n  //  3. another tag:\n  //     ```\n  //     > test\n  //      - - -\n  //     ```\n  for (nextLine = startLine; nextLine < endLine; nextLine++) {\n    // check if it's outdented, i.e. it's inside list item and indented\n    // less than said list item:\n    //\n    // ```\n    // 1. anything\n    //    > current blockquote\n    // 2. checking this line\n    // ```\n    isOutdented = state.sCount[nextLine] < state.blkIndent;\n\n    pos = state.bMarks[nextLine] + state.tShift[nextLine];\n    max = state.eMarks[nextLine];\n\n    if (pos >= max) {\n      // Case 1: line is not inside the blockquote, and this line is empty.\n      break;\n    }\n\n    if (state.src.charCodeAt(pos++) === 0x3E/* > */ && !isOutdented) {\n      // This line is inside the blockquote.\n\n      // set offset past spaces and \">\"\n      initial = state.sCount[nextLine] + 1;\n\n      // skip one optional space after '>'\n      if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n        // ' >   test '\n        //     ^ -- position start of line here:\n        pos++;\n        initial++;\n        adjustTab = false;\n        spaceAfterMarker = true;\n      } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n        spaceAfterMarker = true;\n\n        if ((state.bsCount[nextLine] + initial) % 4 === 3) {\n          // '  >\\t  test '\n          //       ^ -- position start of line here (tab has width===1)\n          pos++;\n          initial++;\n          adjustTab = false;\n        } else {\n          // ' >\\t  test '\n          //    ^ -- position start of line here + shift bsCount slightly\n          //         to make extra space appear\n          adjustTab = true;\n        }\n      } else {\n        spaceAfterMarker = false;\n      }\n\n      offset = initial;\n      oldBMarks.push(state.bMarks[nextLine]);\n      state.bMarks[nextLine] = pos;\n\n      while (pos < max) {\n        ch = state.src.charCodeAt(pos);\n\n        if (isSpace(ch)) {\n          if (ch === 0x09) {\n            offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4;\n          } else {\n            offset++;\n          }\n        } else {\n          break;\n        }\n\n        pos++;\n      }\n\n      lastLineEmpty = pos >= max;\n\n      oldBSCount.push(state.bsCount[nextLine]);\n      state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n      oldSCount.push(state.sCount[nextLine]);\n      state.sCount[nextLine] = offset - initial;\n\n      oldTShift.push(state.tShift[nextLine]);\n      state.tShift[nextLine] = pos - state.bMarks[nextLine];\n      continue;\n    }\n\n    // Case 2: line is not inside the blockquote, and the last line was empty.\n    if (lastLineEmpty) { break; }\n\n    // Case 3: another tag found.\n    terminate = false;\n    for (i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true;\n        break;\n      }\n    }\n\n    if (terminate) {\n      // Quirk to enforce \"hard termination mode\" for paragraphs;\n      // normally if you call `tokenize(state, startLine, nextLine)`,\n      // paragraphs will look below nextLine for paragraph continuation,\n      // but if blockquote is terminated by another tag, they shouldn't\n      state.lineMax = nextLine;\n\n      if (state.blkIndent !== 0) {\n        // state.blkIndent was non-zero, we now set it to zero,\n        // so we need to re-calculate all offsets to appear as\n        // if indent wasn't changed\n        oldBMarks.push(state.bMarks[nextLine]);\n        oldBSCount.push(state.bsCount[nextLine]);\n        oldTShift.push(state.tShift[nextLine]);\n        oldSCount.push(state.sCount[nextLine]);\n        state.sCount[nextLine] -= state.blkIndent;\n      }\n\n      break;\n    }\n\n    oldBMarks.push(state.bMarks[nextLine]);\n    oldBSCount.push(state.bsCount[nextLine]);\n    oldTShift.push(state.tShift[nextLine]);\n    oldSCount.push(state.sCount[nextLine]);\n\n    // A negative indentation means that this is a paragraph continuation\n    //\n    state.sCount[nextLine] = -1;\n  }\n\n  oldIndent = state.blkIndent;\n  state.blkIndent = 0;\n\n  token        = state.push('blockquote_open', 'blockquote', 1);\n  token.markup = '>';\n  token.map    = lines = [ startLine, 0 ];\n\n  state.md.block.tokenize(state, startLine, nextLine);\n\n  token        = state.push('blockquote_close', 'blockquote', -1);\n  token.markup = '>';\n\n  state.lineMax = oldLineMax;\n  state.parentType = oldParentType;\n  lines[1] = state.line;\n\n  // Restore original tShift; this might not be necessary since the parser\n  // has already been here, but just to make sure we can do that.\n  for (i = 0; i < oldTShift.length; i++) {\n    state.bMarks[i + startLine] = oldBMarks[i];\n    state.tShift[i + startLine] = oldTShift[i];\n    state.sCount[i + startLine] = oldSCount[i];\n    state.bsCount[i + startLine] = oldBSCount[i];\n  }\n  state.blkIndent = oldIndent;\n\n  return true;\n};\n","// Horizontal rule\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function hr(state, startLine, endLine, silent) {\n  var marker, cnt, ch, token,\n      pos = state.bMarks[startLine] + state.tShift[startLine],\n      max = state.eMarks[startLine];\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n  marker = state.src.charCodeAt(pos++);\n\n  // Check hr marker\n  if (marker !== 0x2A/* * */ &&\n      marker !== 0x2D/* - */ &&\n      marker !== 0x5F/* _ */) {\n    return false;\n  }\n\n  // markers can be mixed with spaces, but there should be at least 3 of them\n\n  cnt = 1;\n  while (pos < max) {\n    ch = state.src.charCodeAt(pos++);\n    if (ch !== marker && !isSpace(ch)) { return false; }\n    if (ch === marker) { cnt++; }\n  }\n\n  if (cnt < 3) { return false; }\n\n  if (silent) { return true; }\n\n  state.line = startLine + 1;\n\n  token        = state.push('hr', 'hr', 0);\n  token.map    = [ startLine, state.line ];\n  token.markup = Array(cnt + 1).join(String.fromCharCode(marker));\n\n  return true;\n};\n","// Lists\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\n// Search `[-+*][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipBulletListMarker(state, startLine) {\n  var marker, pos, max, ch;\n\n  pos = state.bMarks[startLine] + state.tShift[startLine];\n  max = state.eMarks[startLine];\n\n  marker = state.src.charCodeAt(pos++);\n  // Check bullet\n  if (marker !== 0x2A/* * */ &&\n      marker !== 0x2D/* - */ &&\n      marker !== 0x2B/* + */) {\n    return -1;\n  }\n\n  if (pos < max) {\n    ch = state.src.charCodeAt(pos);\n\n    if (!isSpace(ch)) {\n      // \" -test \" - is not a list item\n      return -1;\n    }\n  }\n\n  return pos;\n}\n\n// Search `\\d+[.)][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipOrderedListMarker(state, startLine) {\n  var ch,\n      start = state.bMarks[startLine] + state.tShift[startLine],\n      pos = start,\n      max = state.eMarks[startLine];\n\n  // List marker should have at least 2 chars (digit + dot)\n  if (pos + 1 >= max) { return -1; }\n\n  ch = state.src.charCodeAt(pos++);\n\n  if (ch < 0x30/* 0 */ || ch > 0x39/* 9 */) { return -1; }\n\n  for (;;) {\n    // EOL -> fail\n    if (pos >= max) { return -1; }\n\n    ch = state.src.charCodeAt(pos++);\n\n    if (ch >= 0x30/* 0 */ && ch <= 0x39/* 9 */) {\n\n      // List marker should have no more than 9 digits\n      // (prevents integer overflow in browsers)\n      if (pos - start >= 10) { return -1; }\n\n      continue;\n    }\n\n    // found valid marker\n    if (ch === 0x29/* ) */ || ch === 0x2e/* . */) {\n      break;\n    }\n\n    return -1;\n  }\n\n\n  if (pos < max) {\n    ch = state.src.charCodeAt(pos);\n\n    if (!isSpace(ch)) {\n      // \" 1.test \" - is not a list item\n      return -1;\n    }\n  }\n  return pos;\n}\n\nfunction markTightParagraphs(state, idx) {\n  var i, l,\n      level = state.level + 2;\n\n  for (i = idx + 2, l = state.tokens.length - 2; i < l; i++) {\n    if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') {\n      state.tokens[i + 2].hidden = true;\n      state.tokens[i].hidden = true;\n      i += 2;\n    }\n  }\n}\n\n\nmodule.exports = function list(state, startLine, endLine, silent) {\n  var ch,\n      contentStart,\n      i,\n      indent,\n      indentAfterMarker,\n      initial,\n      isOrdered,\n      itemLines,\n      l,\n      listLines,\n      listTokIdx,\n      markerCharCode,\n      markerValue,\n      max,\n      offset,\n      oldListIndent,\n      oldParentType,\n      oldSCount,\n      oldTShift,\n      oldTight,\n      pos,\n      posAfterMarker,\n      prevEmptyEnd,\n      start,\n      terminate,\n      terminatorRules,\n      token,\n      nextLine = startLine,\n      isTerminatingParagraph = false,\n      tight = true;\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[nextLine] - state.blkIndent >= 4) { return false; }\n\n  // Special case:\n  //  - item 1\n  //   - item 2\n  //    - item 3\n  //     - item 4\n  //      - this one is a paragraph continuation\n  if (state.listIndent >= 0 &&\n      state.sCount[nextLine] - state.listIndent >= 4 &&\n      state.sCount[nextLine] < state.blkIndent) {\n    return false;\n  }\n\n  // limit conditions when list can interrupt\n  // a paragraph (validation mode only)\n  if (silent && state.parentType === 'paragraph') {\n    // Next list item should still terminate previous list item;\n    //\n    // This code can fail if plugins use blkIndent as well as lists,\n    // but I hope the spec gets fixed long before that happens.\n    //\n    if (state.sCount[nextLine] >= state.blkIndent) {\n      isTerminatingParagraph = true;\n    }\n  }\n\n  // Detect list type and position after marker\n  if ((posAfterMarker = skipOrderedListMarker(state, nextLine)) >= 0) {\n    isOrdered = true;\n    start = state.bMarks[nextLine] + state.tShift[nextLine];\n    markerValue = Number(state.src.slice(start, posAfterMarker - 1));\n\n    // If we're starting a new ordered list right after\n    // a paragraph, it should start with 1.\n    if (isTerminatingParagraph && markerValue !== 1) return false;\n\n  } else if ((posAfterMarker = skipBulletListMarker(state, nextLine)) >= 0) {\n    isOrdered = false;\n\n  } else {\n    return false;\n  }\n\n  // If we're starting a new unordered list right after\n  // a paragraph, first line should not be empty.\n  if (isTerminatingParagraph) {\n    if (state.skipSpaces(posAfterMarker) >= state.eMarks[nextLine]) return false;\n  }\n\n  // For validation mode we can terminate immediately\n  if (silent) { return true; }\n\n  // We should terminate list on style change. Remember first one to compare.\n  markerCharCode = state.src.charCodeAt(posAfterMarker - 1);\n\n  // Start list\n  listTokIdx = state.tokens.length;\n\n  if (isOrdered) {\n    token       = state.push('ordered_list_open', 'ol', 1);\n    if (markerValue !== 1) {\n      token.attrs = [ [ 'start', markerValue ] ];\n    }\n\n  } else {\n    token       = state.push('bullet_list_open', 'ul', 1);\n  }\n\n  token.map    = listLines = [ nextLine, 0 ];\n  token.markup = String.fromCharCode(markerCharCode);\n\n  //\n  // Iterate list items\n  //\n\n  prevEmptyEnd = false;\n  terminatorRules = state.md.block.ruler.getRules('list');\n\n  oldParentType = state.parentType;\n  state.parentType = 'list';\n\n  while (nextLine < endLine) {\n    pos = posAfterMarker;\n    max = state.eMarks[nextLine];\n\n    initial = offset = state.sCount[nextLine] + posAfterMarker - (state.bMarks[nextLine] + state.tShift[nextLine]);\n\n    while (pos < max) {\n      ch = state.src.charCodeAt(pos);\n\n      if (ch === 0x09) {\n        offset += 4 - (offset + state.bsCount[nextLine]) % 4;\n      } else if (ch === 0x20) {\n        offset++;\n      } else {\n        break;\n      }\n\n      pos++;\n    }\n\n    contentStart = pos;\n\n    if (contentStart >= max) {\n      // trimming space in \"-    \\n  3\" case, indent is 1 here\n      indentAfterMarker = 1;\n    } else {\n      indentAfterMarker = offset - initial;\n    }\n\n    // If we have more than 4 spaces, the indent is 1\n    // (the rest is just indented code block)\n    if (indentAfterMarker > 4) { indentAfterMarker = 1; }\n\n    // \"  -  test\"\n    //  ^^^^^ - calculating total length of this thing\n    indent = initial + indentAfterMarker;\n\n    // Run subparser & write tokens\n    token        = state.push('list_item_open', 'li', 1);\n    token.markup = String.fromCharCode(markerCharCode);\n    token.map    = itemLines = [ nextLine, 0 ];\n    if (isOrdered) {\n      token.info = state.src.slice(start, posAfterMarker - 1);\n    }\n\n    // change current state, then restore it after parser subcall\n    oldTight = state.tight;\n    oldTShift = state.tShift[nextLine];\n    oldSCount = state.sCount[nextLine];\n\n    //  - example list\n    // ^ listIndent position will be here\n    //   ^ blkIndent position will be here\n    //\n    oldListIndent = state.listIndent;\n    state.listIndent = state.blkIndent;\n    state.blkIndent = indent;\n\n    state.tight = true;\n    state.tShift[nextLine] = contentStart - state.bMarks[nextLine];\n    state.sCount[nextLine] = offset;\n\n    if (contentStart >= max && state.isEmpty(nextLine + 1)) {\n      // workaround for this case\n      // (list item is empty, list terminates before \"foo\"):\n      // ~~~~~~~~\n      //   -\n      //\n      //     foo\n      // ~~~~~~~~\n      state.line = Math.min(state.line + 2, endLine);\n    } else {\n      state.md.block.tokenize(state, nextLine, endLine, true);\n    }\n\n    // If any of list item is tight, mark list as tight\n    if (!state.tight || prevEmptyEnd) {\n      tight = false;\n    }\n    // Item become loose if finish with empty line,\n    // but we should filter last element, because it means list finish\n    prevEmptyEnd = (state.line - nextLine) > 1 && state.isEmpty(state.line - 1);\n\n    state.blkIndent = state.listIndent;\n    state.listIndent = oldListIndent;\n    state.tShift[nextLine] = oldTShift;\n    state.sCount[nextLine] = oldSCount;\n    state.tight = oldTight;\n\n    token        = state.push('list_item_close', 'li', -1);\n    token.markup = String.fromCharCode(markerCharCode);\n\n    nextLine = state.line;\n    itemLines[1] = nextLine;\n\n    if (nextLine >= endLine) { break; }\n\n    //\n    // Try to check if list is terminated or continued.\n    //\n    if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n    // if it's indented more than 3 spaces, it should be a code block\n    if (state.sCount[nextLine] - state.blkIndent >= 4) { break; }\n\n    // fail if terminating block found\n    terminate = false;\n    for (i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true;\n        break;\n      }\n    }\n    if (terminate) { break; }\n\n    // fail if list has another type\n    if (isOrdered) {\n      posAfterMarker = skipOrderedListMarker(state, nextLine);\n      if (posAfterMarker < 0) { break; }\n      start = state.bMarks[nextLine] + state.tShift[nextLine];\n    } else {\n      posAfterMarker = skipBulletListMarker(state, nextLine);\n      if (posAfterMarker < 0) { break; }\n    }\n\n    if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { break; }\n  }\n\n  // Finalize list\n  if (isOrdered) {\n    token = state.push('ordered_list_close', 'ol', -1);\n  } else {\n    token = state.push('bullet_list_close', 'ul', -1);\n  }\n  token.markup = String.fromCharCode(markerCharCode);\n\n  listLines[1] = nextLine;\n  state.line = nextLine;\n\n  state.parentType = oldParentType;\n\n  // mark paragraphs tight if needed\n  if (tight) {\n    markTightParagraphs(state, listTokIdx);\n  }\n\n  return true;\n};\n","'use strict';\n\n\nvar normalizeReference   = require('../common/utils').normalizeReference;\nvar isSpace              = require('../common/utils').isSpace;\n\n\nmodule.exports = function reference(state, startLine, _endLine, silent) {\n  var ch,\n      destEndPos,\n      destEndLineNo,\n      endLine,\n      href,\n      i,\n      l,\n      label,\n      labelEnd,\n      oldParentType,\n      res,\n      start,\n      str,\n      terminate,\n      terminatorRules,\n      title,\n      lines = 0,\n      pos = state.bMarks[startLine] + state.tShift[startLine],\n      max = state.eMarks[startLine],\n      nextLine = startLine + 1;\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n  if (state.src.charCodeAt(pos) !== 0x5B/* [ */) { return false; }\n\n  // Simple check to quickly interrupt scan on [link](url) at the start of line.\n  // Can be useful on practice: https://github.com/markdown-it/markdown-it/issues/54\n  while (++pos < max) {\n    if (state.src.charCodeAt(pos) === 0x5D /* ] */ &&\n        state.src.charCodeAt(pos - 1) !== 0x5C/* \\ */) {\n      if (pos + 1 === max) { return false; }\n      if (state.src.charCodeAt(pos + 1) !== 0x3A/* : */) { return false; }\n      break;\n    }\n  }\n\n  endLine = state.lineMax;\n\n  // jump line-by-line until empty one or EOF\n  terminatorRules = state.md.block.ruler.getRules('reference');\n\n  oldParentType = state.parentType;\n  state.parentType = 'reference';\n\n  for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n    // this would be a code block normally, but after paragraph\n    // it's considered a lazy continuation regardless of what's there\n    if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n    // quirk for blockquotes, this line should already be checked by that rule\n    if (state.sCount[nextLine] < 0) { continue; }\n\n    // Some tags can terminate paragraph without empty line.\n    terminate = false;\n    for (i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true;\n        break;\n      }\n    }\n    if (terminate) { break; }\n  }\n\n  str = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n  max = str.length;\n\n  for (pos = 1; pos < max; pos++) {\n    ch = str.charCodeAt(pos);\n    if (ch === 0x5B /* [ */) {\n      return false;\n    } else if (ch === 0x5D /* ] */) {\n      labelEnd = pos;\n      break;\n    } else if (ch === 0x0A /* \\n */) {\n      lines++;\n    } else if (ch === 0x5C /* \\ */) {\n      pos++;\n      if (pos < max && str.charCodeAt(pos) === 0x0A) {\n        lines++;\n      }\n    }\n  }\n\n  if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return false; }\n\n  // [label]:   destination   'title'\n  //         ^^^ skip optional whitespace here\n  for (pos = labelEnd + 2; pos < max; pos++) {\n    ch = str.charCodeAt(pos);\n    if (ch === 0x0A) {\n      lines++;\n    } else if (isSpace(ch)) {\n      /*eslint no-empty:0*/\n    } else {\n      break;\n    }\n  }\n\n  // [label]:   destination   'title'\n  //            ^^^^^^^^^^^ parse this\n  res = state.md.helpers.parseLinkDestination(str, pos, max);\n  if (!res.ok) { return false; }\n\n  href = state.md.normalizeLink(res.str);\n  if (!state.md.validateLink(href)) { return false; }\n\n  pos = res.pos;\n  lines += res.lines;\n\n  // save cursor state, we could require to rollback later\n  destEndPos = pos;\n  destEndLineNo = lines;\n\n  // [label]:   destination   'title'\n  //                       ^^^ skipping those spaces\n  start = pos;\n  for (; pos < max; pos++) {\n    ch = str.charCodeAt(pos);\n    if (ch === 0x0A) {\n      lines++;\n    } else if (isSpace(ch)) {\n      /*eslint no-empty:0*/\n    } else {\n      break;\n    }\n  }\n\n  // [label]:   destination   'title'\n  //                          ^^^^^^^ parse this\n  res = state.md.helpers.parseLinkTitle(str, pos, max);\n  if (pos < max && start !== pos && res.ok) {\n    title = res.str;\n    pos = res.pos;\n    lines += res.lines;\n  } else {\n    title = '';\n    pos = destEndPos;\n    lines = destEndLineNo;\n  }\n\n  // skip trailing spaces until the rest of the line\n  while (pos < max) {\n    ch = str.charCodeAt(pos);\n    if (!isSpace(ch)) { break; }\n    pos++;\n  }\n\n  if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n    if (title) {\n      // garbage at the end of the line after title,\n      // but it could still be a valid reference if we roll back\n      title = '';\n      pos = destEndPos;\n      lines = destEndLineNo;\n      while (pos < max) {\n        ch = str.charCodeAt(pos);\n        if (!isSpace(ch)) { break; }\n        pos++;\n      }\n    }\n  }\n\n  if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n    // garbage at the end of the line\n    return false;\n  }\n\n  label = normalizeReference(str.slice(1, labelEnd));\n  if (!label) {\n    // CommonMark 0.20 disallows empty labels\n    return false;\n  }\n\n  // Reference can not terminate anything. This check is for safety only.\n  /*istanbul ignore if*/\n  if (silent) { return true; }\n\n  if (typeof state.env.references === 'undefined') {\n    state.env.references = {};\n  }\n  if (typeof state.env.references[label] === 'undefined') {\n    state.env.references[label] = { title: title, href: href };\n  }\n\n  state.parentType = oldParentType;\n\n  state.line = startLine + lines + 1;\n  return true;\n};\n","// List of valid html blocks names, accorting to commonmark spec\n// http://jgm.github.io/CommonMark/spec.html#html-blocks\n\n'use strict';\n\n\nmodule.exports = [\n  'address',\n  'article',\n  'aside',\n  'base',\n  'basefont',\n  'blockquote',\n  'body',\n  'caption',\n  'center',\n  'col',\n  'colgroup',\n  'dd',\n  'details',\n  'dialog',\n  'dir',\n  'div',\n  'dl',\n  'dt',\n  'fieldset',\n  'figcaption',\n  'figure',\n  'footer',\n  'form',\n  'frame',\n  'frameset',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'head',\n  'header',\n  'hr',\n  'html',\n  'iframe',\n  'legend',\n  'li',\n  'link',\n  'main',\n  'menu',\n  'menuitem',\n  'nav',\n  'noframes',\n  'ol',\n  'optgroup',\n  'option',\n  'p',\n  'param',\n  'section',\n  'source',\n  'summary',\n  'table',\n  'tbody',\n  'td',\n  'tfoot',\n  'th',\n  'thead',\n  'title',\n  'tr',\n  'track',\n  'ul'\n];\n","// Regexps to match html elements\n\n'use strict';\n\nvar attr_name     = '[a-zA-Z_:][a-zA-Z0-9:._-]*';\n\nvar unquoted      = '[^\"\\'=<>`\\\\x00-\\\\x20]+';\nvar single_quoted = \"'[^']*'\";\nvar double_quoted = '\"[^\"]*\"';\n\nvar attr_value  = '(?:' + unquoted + '|' + single_quoted + '|' + double_quoted + ')';\n\nvar attribute   = '(?:\\\\s+' + attr_name + '(?:\\\\s*=\\\\s*' + attr_value + ')?)';\n\nvar open_tag    = '<[A-Za-z][A-Za-z0-9\\\\-]*' + attribute + '*\\\\s*\\\\/?>';\n\nvar close_tag   = '<\\\\/[A-Za-z][A-Za-z0-9\\\\-]*\\\\s*>';\nvar comment     = '<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->';\nvar processing  = '<[?][\\\\s\\\\S]*?[?]>';\nvar declaration = '<![A-Z]+\\\\s+[^>]*>';\nvar cdata       = '<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>';\n\nvar HTML_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + '|' + comment +\n                        '|' + processing + '|' + declaration + '|' + cdata + ')');\nvar HTML_OPEN_CLOSE_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + ')');\n\nmodule.exports.HTML_TAG_RE = HTML_TAG_RE;\nmodule.exports.HTML_OPEN_CLOSE_TAG_RE = HTML_OPEN_CLOSE_TAG_RE;\n","// HTML block\n\n'use strict';\n\n\nvar block_names = require('../common/html_blocks');\nvar HTML_OPEN_CLOSE_TAG_RE = require('../common/html_re').HTML_OPEN_CLOSE_TAG_RE;\n\n// An array of opening and corresponding closing sequences for html tags,\n// last argument defines whether it can terminate a paragraph or not\n//\nvar HTML_SEQUENCES = [\n  [ /^<(script|pre|style|textarea)(?=(\\s|>|$))/i, /<\\/(script|pre|style|textarea)>/i, true ],\n  [ /^<!--/,        /-->/,   true ],\n  [ /^<\\?/,         /\\?>/,   true ],\n  [ /^<![A-Z]/,     />/,     true ],\n  [ /^<!\\[CDATA\\[/, /\\]\\]>/, true ],\n  [ new RegExp('^</?(' + block_names.join('|') + ')(?=(\\\\s|/?>|$))', 'i'), /^$/, true ],\n  [ new RegExp(HTML_OPEN_CLOSE_TAG_RE.source + '\\\\s*$'),  /^$/, false ]\n];\n\n\nmodule.exports = function html_block(state, startLine, endLine, silent) {\n  var i, nextLine, token, lineText,\n      pos = state.bMarks[startLine] + state.tShift[startLine],\n      max = state.eMarks[startLine];\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n  if (!state.md.options.html) { return false; }\n\n  if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }\n\n  lineText = state.src.slice(pos, max);\n\n  for (i = 0; i < HTML_SEQUENCES.length; i++) {\n    if (HTML_SEQUENCES[i][0].test(lineText)) { break; }\n  }\n\n  if (i === HTML_SEQUENCES.length) { return false; }\n\n  if (silent) {\n    // true if this sequence can be a terminator, false otherwise\n    return HTML_SEQUENCES[i][2];\n  }\n\n  nextLine = startLine + 1;\n\n  // If we are here - we detected HTML block.\n  // Let's roll down till block end.\n  if (!HTML_SEQUENCES[i][1].test(lineText)) {\n    for (; nextLine < endLine; nextLine++) {\n      if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n      pos = state.bMarks[nextLine] + state.tShift[nextLine];\n      max = state.eMarks[nextLine];\n      lineText = state.src.slice(pos, max);\n\n      if (HTML_SEQUENCES[i][1].test(lineText)) {\n        if (lineText.length !== 0) { nextLine++; }\n        break;\n      }\n    }\n  }\n\n  state.line = nextLine;\n\n  token         = state.push('html_block', '', 0);\n  token.map     = [ startLine, nextLine ];\n  token.content = state.getLines(startLine, nextLine, state.blkIndent, true);\n\n  return true;\n};\n","// heading (#, ##, ...)\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function heading(state, startLine, endLine, silent) {\n  var ch, level, tmp, token,\n      pos = state.bMarks[startLine] + state.tShift[startLine],\n      max = state.eMarks[startLine];\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n  ch  = state.src.charCodeAt(pos);\n\n  if (ch !== 0x23/* # */ || pos >= max) { return false; }\n\n  // count heading level\n  level = 1;\n  ch = state.src.charCodeAt(++pos);\n  while (ch === 0x23/* # */ && pos < max && level <= 6) {\n    level++;\n    ch = state.src.charCodeAt(++pos);\n  }\n\n  if (level > 6 || (pos < max && !isSpace(ch))) { return false; }\n\n  if (silent) { return true; }\n\n  // Let's cut tails like '    ###  ' from the end of string\n\n  max = state.skipSpacesBack(max, pos);\n  tmp = state.skipCharsBack(max, 0x23, pos); // #\n  if (tmp > pos && isSpace(state.src.charCodeAt(tmp - 1))) {\n    max = tmp;\n  }\n\n  state.line = startLine + 1;\n\n  token        = state.push('heading_open', 'h' + String(level), 1);\n  token.markup = '########'.slice(0, level);\n  token.map    = [ startLine, state.line ];\n\n  token          = state.push('inline', '', 0);\n  token.content  = state.src.slice(pos, max).trim();\n  token.map      = [ startLine, state.line ];\n  token.children = [];\n\n  token        = state.push('heading_close', 'h' + String(level), -1);\n  token.markup = '########'.slice(0, level);\n\n  return true;\n};\n","// lheading (---, ===)\n\n'use strict';\n\n\nmodule.exports = function lheading(state, startLine, endLine/*, silent*/) {\n  var content, terminate, i, l, token, pos, max, level, marker,\n      nextLine = startLine + 1, oldParentType,\n      terminatorRules = state.md.block.ruler.getRules('paragraph');\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n  oldParentType = state.parentType;\n  state.parentType = 'paragraph'; // use paragraph to match terminatorRules\n\n  // jump line-by-line until empty one or EOF\n  for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n    // this would be a code block normally, but after paragraph\n    // it's considered a lazy continuation regardless of what's there\n    if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n    //\n    // Check for underline in setext header\n    //\n    if (state.sCount[nextLine] >= state.blkIndent) {\n      pos = state.bMarks[nextLine] + state.tShift[nextLine];\n      max = state.eMarks[nextLine];\n\n      if (pos < max) {\n        marker = state.src.charCodeAt(pos);\n\n        if (marker === 0x2D/* - */ || marker === 0x3D/* = */) {\n          pos = state.skipChars(pos, marker);\n          pos = state.skipSpaces(pos);\n\n          if (pos >= max) {\n            level = (marker === 0x3D/* = */ ? 1 : 2);\n            break;\n          }\n        }\n      }\n    }\n\n    // quirk for blockquotes, this line should already be checked by that rule\n    if (state.sCount[nextLine] < 0) { continue; }\n\n    // Some tags can terminate paragraph without empty line.\n    terminate = false;\n    for (i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true;\n        break;\n      }\n    }\n    if (terminate) { break; }\n  }\n\n  if (!level) {\n    // Didn't find valid underline\n    return false;\n  }\n\n  content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n\n  state.line = nextLine + 1;\n\n  token          = state.push('heading_open', 'h' + String(level), 1);\n  token.markup   = String.fromCharCode(marker);\n  token.map      = [ startLine, state.line ];\n\n  token          = state.push('inline', '', 0);\n  token.content  = content;\n  token.map      = [ startLine, state.line - 1 ];\n  token.children = [];\n\n  token          = state.push('heading_close', 'h' + String(level), -1);\n  token.markup   = String.fromCharCode(marker);\n\n  state.parentType = oldParentType;\n\n  return true;\n};\n","// Paragraph\n\n'use strict';\n\n\nmodule.exports = function paragraph(state, startLine, endLine) {\n  var content, terminate, i, l, token, oldParentType,\n      nextLine = startLine + 1,\n      terminatorRules = state.md.block.ruler.getRules('paragraph');\n\n  oldParentType = state.parentType;\n  state.parentType = 'paragraph';\n\n  // jump line-by-line until empty one or EOF\n  for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n    // this would be a code block normally, but after paragraph\n    // it's considered a lazy continuation regardless of what's there\n    if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n    // quirk for blockquotes, this line should already be checked by that rule\n    if (state.sCount[nextLine] < 0) { continue; }\n\n    // Some tags can terminate paragraph without empty line.\n    terminate = false;\n    for (i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true;\n        break;\n      }\n    }\n    if (terminate) { break; }\n  }\n\n  content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n\n  state.line = nextLine;\n\n  token          = state.push('paragraph_open', 'p', 1);\n  token.map      = [ startLine, state.line ];\n\n  token          = state.push('inline', '', 0);\n  token.content  = content;\n  token.map      = [ startLine, state.line ];\n  token.children = [];\n\n  token          = state.push('paragraph_close', 'p', -1);\n\n  state.parentType = oldParentType;\n\n  return true;\n};\n","// Parser state class\n\n'use strict';\n\nvar Token = require('../token');\nvar isSpace = require('../common/utils').isSpace;\n\n\nfunction StateBlock(src, md, env, tokens) {\n  var ch, s, start, pos, len, indent, offset, indent_found;\n\n  this.src = src;\n\n  // link to parser instance\n  this.md     = md;\n\n  this.env = env;\n\n  //\n  // Internal state vartiables\n  //\n\n  this.tokens = tokens;\n\n  this.bMarks = [];  // line begin offsets for fast jumps\n  this.eMarks = [];  // line end offsets for fast jumps\n  this.tShift = [];  // offsets of the first non-space characters (tabs not expanded)\n  this.sCount = [];  // indents for each line (tabs expanded)\n\n  // An amount of virtual spaces (tabs expanded) between beginning\n  // of each line (bMarks) and real beginning of that line.\n  //\n  // It exists only as a hack because blockquotes override bMarks\n  // losing information in the process.\n  //\n  // It's used only when expanding tabs, you can think about it as\n  // an initial tab length, e.g. bsCount=21 applied to string `\\t123`\n  // means first tab should be expanded to 4-21%4 === 3 spaces.\n  //\n  this.bsCount = [];\n\n  // block parser variables\n  this.blkIndent  = 0; // required block content indent (for example, if we are\n                       // inside a list, it would be positioned after list marker)\n  this.line       = 0; // line index in src\n  this.lineMax    = 0; // lines count\n  this.tight      = false;  // loose/tight mode for lists\n  this.ddIndent   = -1; // indent of the current dd block (-1 if there isn't any)\n  this.listIndent = -1; // indent of the current list block (-1 if there isn't any)\n\n  // can be 'blockquote', 'list', 'root', 'paragraph' or 'reference'\n  // used in lists to determine if they interrupt a paragraph\n  this.parentType = 'root';\n\n  this.level = 0;\n\n  // renderer\n  this.result = '';\n\n  // Create caches\n  // Generate markers.\n  s = this.src;\n  indent_found = false;\n\n  for (start = pos = indent = offset = 0, len = s.length; pos < len; pos++) {\n    ch = s.charCodeAt(pos);\n\n    if (!indent_found) {\n      if (isSpace(ch)) {\n        indent++;\n\n        if (ch === 0x09) {\n          offset += 4 - offset % 4;\n        } else {\n          offset++;\n        }\n        continue;\n      } else {\n        indent_found = true;\n      }\n    }\n\n    if (ch === 0x0A || pos === len - 1) {\n      if (ch !== 0x0A) { pos++; }\n      this.bMarks.push(start);\n      this.eMarks.push(pos);\n      this.tShift.push(indent);\n      this.sCount.push(offset);\n      this.bsCount.push(0);\n\n      indent_found = false;\n      indent = 0;\n      offset = 0;\n      start = pos + 1;\n    }\n  }\n\n  // Push fake entry to simplify cache bounds checks\n  this.bMarks.push(s.length);\n  this.eMarks.push(s.length);\n  this.tShift.push(0);\n  this.sCount.push(0);\n  this.bsCount.push(0);\n\n  this.lineMax = this.bMarks.length - 1; // don't count last fake line\n}\n\n// Push new token to \"stream\".\n//\nStateBlock.prototype.push = function (type, tag, nesting) {\n  var token = new Token(type, tag, nesting);\n  token.block = true;\n\n  if (nesting < 0) this.level--; // closing tag\n  token.level = this.level;\n  if (nesting > 0) this.level++; // opening tag\n\n  this.tokens.push(token);\n  return token;\n};\n\nStateBlock.prototype.isEmpty = function isEmpty(line) {\n  return this.bMarks[line] + this.tShift[line] >= this.eMarks[line];\n};\n\nStateBlock.prototype.skipEmptyLines = function skipEmptyLines(from) {\n  for (var max = this.lineMax; from < max; from++) {\n    if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) {\n      break;\n    }\n  }\n  return from;\n};\n\n// Skip spaces from given position.\nStateBlock.prototype.skipSpaces = function skipSpaces(pos) {\n  var ch;\n\n  for (var max = this.src.length; pos < max; pos++) {\n    ch = this.src.charCodeAt(pos);\n    if (!isSpace(ch)) { break; }\n  }\n  return pos;\n};\n\n// Skip spaces from given position in reverse.\nStateBlock.prototype.skipSpacesBack = function skipSpacesBack(pos, min) {\n  if (pos <= min) { return pos; }\n\n  while (pos > min) {\n    if (!isSpace(this.src.charCodeAt(--pos))) { return pos + 1; }\n  }\n  return pos;\n};\n\n// Skip char codes from given position\nStateBlock.prototype.skipChars = function skipChars(pos, code) {\n  for (var max = this.src.length; pos < max; pos++) {\n    if (this.src.charCodeAt(pos) !== code) { break; }\n  }\n  return pos;\n};\n\n// Skip char codes reverse from given position - 1\nStateBlock.prototype.skipCharsBack = function skipCharsBack(pos, code, min) {\n  if (pos <= min) { return pos; }\n\n  while (pos > min) {\n    if (code !== this.src.charCodeAt(--pos)) { return pos + 1; }\n  }\n  return pos;\n};\n\n// cut lines range from source.\nStateBlock.prototype.getLines = function getLines(begin, end, indent, keepLastLF) {\n  var i, lineIndent, ch, first, last, queue, lineStart,\n      line = begin;\n\n  if (begin >= end) {\n    return '';\n  }\n\n  queue = new Array(end - begin);\n\n  for (i = 0; line < end; line++, i++) {\n    lineIndent = 0;\n    lineStart = first = this.bMarks[line];\n\n    if (line + 1 < end || keepLastLF) {\n      // No need for bounds check because we have fake entry on tail.\n      last = this.eMarks[line] + 1;\n    } else {\n      last = this.eMarks[line];\n    }\n\n    while (first < last && lineIndent < indent) {\n      ch = this.src.charCodeAt(first);\n\n      if (isSpace(ch)) {\n        if (ch === 0x09) {\n          lineIndent += 4 - (lineIndent + this.bsCount[line]) % 4;\n        } else {\n          lineIndent++;\n        }\n      } else if (first - lineStart < this.tShift[line]) {\n        // patched tShift masked characters to look like spaces (blockquotes, list markers)\n        lineIndent++;\n      } else {\n        break;\n      }\n\n      first++;\n    }\n\n    if (lineIndent > indent) {\n      // partially expanding tabs in code blocks, e.g '\\t\\tfoobar'\n      // with indent=2 becomes '  \\tfoobar'\n      queue[i] = new Array(lineIndent - indent + 1).join(' ') + this.src.slice(first, last);\n    } else {\n      queue[i] = this.src.slice(first, last);\n    }\n  }\n\n  return queue.join('');\n};\n\n// re-export Token class to use in block rules\nStateBlock.prototype.Token = Token;\n\n\nmodule.exports = StateBlock;\n","/** internal\n * class ParserBlock\n *\n * Block-level tokenizer.\n **/\n'use strict';\n\n\nvar Ruler           = require('./ruler');\n\n\nvar _rules = [\n  // First 2 params - rule name & source. Secondary array - list of rules,\n  // which can be terminated by this one.\n  [ 'table',      require('./rules_block/table'),      [ 'paragraph', 'reference' ] ],\n  [ 'code',       require('./rules_block/code') ],\n  [ 'fence',      require('./rules_block/fence'),      [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n  [ 'blockquote', require('./rules_block/blockquote'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n  [ 'hr',         require('./rules_block/hr'),         [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n  [ 'list',       require('./rules_block/list'),       [ 'paragraph', 'reference', 'blockquote' ] ],\n  [ 'reference',  require('./rules_block/reference') ],\n  [ 'html_block', require('./rules_block/html_block'), [ 'paragraph', 'reference', 'blockquote' ] ],\n  [ 'heading',    require('./rules_block/heading'),    [ 'paragraph', 'reference', 'blockquote' ] ],\n  [ 'lheading',   require('./rules_block/lheading') ],\n  [ 'paragraph',  require('./rules_block/paragraph') ]\n];\n\n\n/**\n * new ParserBlock()\n **/\nfunction ParserBlock() {\n  /**\n   * ParserBlock#ruler -> Ruler\n   *\n   * [[Ruler]] instance. Keep configuration of block rules.\n   **/\n  this.ruler = new Ruler();\n\n  for (var i = 0; i < _rules.length; i++) {\n    this.ruler.push(_rules[i][0], _rules[i][1], { alt: (_rules[i][2] || []).slice() });\n  }\n}\n\n\n// Generate tokens for input range\n//\nParserBlock.prototype.tokenize = function (state, startLine, endLine) {\n  var ok, i, prevLine,\n      rules = this.ruler.getRules(''),\n      len = rules.length,\n      line = startLine,\n      hasEmptyLines = false,\n      maxNesting = state.md.options.maxNesting;\n\n  while (line < endLine) {\n    state.line = line = state.skipEmptyLines(line);\n    if (line >= endLine) { break; }\n\n    // Termination condition for nested calls.\n    // Nested calls currently used for blockquotes & lists\n    if (state.sCount[line] < state.blkIndent) { break; }\n\n    // If nesting level exceeded - skip tail to the end. That's not ordinary\n    // situation and we should not care about content.\n    if (state.level >= maxNesting) {\n      state.line = endLine;\n      break;\n    }\n\n    // Try all possible rules.\n    // On success, rule should:\n    //\n    // - update `state.line`\n    // - update `state.tokens`\n    // - return true\n    prevLine = state.line;\n\n    for (i = 0; i < len; i++) {\n      ok = rules[i](state, line, endLine, false);\n      if (ok) {\n        if (prevLine >= state.line) {\n          throw new Error(\"block rule didn't increment state.line\");\n        }\n        break;\n      }\n    }\n\n    // this can only happen if user disables paragraph rule\n    if (!ok) throw new Error('none of the block rules matched');\n\n    // set state.tight if we had an empty line before current tag\n    // i.e. latest empty line should not count\n    state.tight = !hasEmptyLines;\n\n    // paragraph might \"eat\" one newline after it in nested lists\n    if (state.isEmpty(state.line - 1)) {\n      hasEmptyLines = true;\n    }\n\n    line = state.line;\n\n    if (line < endLine && state.isEmpty(line)) {\n      hasEmptyLines = true;\n      line++;\n      state.line = line;\n    }\n  }\n};\n\n\n/**\n * ParserBlock.parse(str, md, env, outTokens)\n *\n * Process input string and push block tokens into `outTokens`\n **/\nParserBlock.prototype.parse = function (src, md, env, outTokens) {\n  var state;\n\n  if (!src) { return; }\n\n  state = new this.State(src, md, env, outTokens);\n\n  this.tokenize(state, state.line, state.lineMax);\n};\n\n\nParserBlock.prototype.State = require('./rules_block/state_block');\n\n\nmodule.exports = ParserBlock;\n","// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n\n'use strict';\n\n\n// Rule to skip pure text\n// '{}$%@~+=:' reserved for extentions\n\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n\n// !!!! Don't confuse with \"Markdown ASCII Punctuation\" chars\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\nfunction isTerminatorChar(ch) {\n  switch (ch) {\n    case 0x0A/* \\n */:\n    case 0x21/* ! */:\n    case 0x23/* # */:\n    case 0x24/* $ */:\n    case 0x25/* % */:\n    case 0x26/* & */:\n    case 0x2A/* * */:\n    case 0x2B/* + */:\n    case 0x2D/* - */:\n    case 0x3A/* : */:\n    case 0x3C/* < */:\n    case 0x3D/* = */:\n    case 0x3E/* > */:\n    case 0x40/* @ */:\n    case 0x5B/* [ */:\n    case 0x5C/* \\ */:\n    case 0x5D/* ] */:\n    case 0x5E/* ^ */:\n    case 0x5F/* _ */:\n    case 0x60/* ` */:\n    case 0x7B/* { */:\n    case 0x7D/* } */:\n    case 0x7E/* ~ */:\n      return true;\n    default:\n      return false;\n  }\n}\n\nmodule.exports = function text(state, silent) {\n  var pos = state.pos;\n\n  while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n    pos++;\n  }\n\n  if (pos === state.pos) { return false; }\n\n  if (!silent) { state.pending += state.src.slice(state.pos, pos); }\n\n  state.pos = pos;\n\n  return true;\n};\n\n// Alternative implementation, for memory.\n//\n// It costs 10% of performance, but allows extend terminators list, if place it\n// to `ParcerInline` property. Probably, will switch to it sometime, such\n// flexibility required.\n\n/*\nvar TERMINATOR_RE = /[\\n!#$%&*+\\-:<=>@[\\\\\\]^_`{}~]/;\n\nmodule.exports = function text(state, silent) {\n  var pos = state.pos,\n      idx = state.src.slice(pos).search(TERMINATOR_RE);\n\n  // first char is terminator -> empty text\n  if (idx === 0) { return false; }\n\n  // no terminator -> text till end of string\n  if (idx < 0) {\n    if (!silent) { state.pending += state.src.slice(pos); }\n    state.pos = state.src.length;\n    return true;\n  }\n\n  if (!silent) { state.pending += state.src.slice(pos, pos + idx); }\n\n  state.pos += idx;\n\n  return true;\n};*/\n","// Process links like https://example.org/\n\n'use strict';\n\n\n// RFC3986: scheme = ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\nvar SCHEME_RE = /(?:^|[^a-z0-9.+-])([a-z][a-z0-9.+-]*)$/i;\n\n\nmodule.exports = function linkify(state, silent) {\n  var pos, max, match, proto, link, url, fullUrl, token;\n\n  if (!state.md.options.linkify) return false;\n  if (state.linkLevel > 0) return false;\n\n  pos = state.pos;\n  max = state.posMax;\n\n  if (pos + 3 > max) return false;\n  if (state.src.charCodeAt(pos) !== 0x3A/* : */) return false;\n  if (state.src.charCodeAt(pos + 1) !== 0x2F/* / */) return false;\n  if (state.src.charCodeAt(pos + 2) !== 0x2F/* / */) return false;\n\n  match = state.pending.match(SCHEME_RE);\n  if (!match) return false;\n\n  proto = match[1];\n\n  link = state.md.linkify.matchAtStart(state.src.slice(pos - proto.length));\n  if (!link) return false;\n\n  url = link.url;\n\n  // invalid link, but still detected by linkify somehow;\n  // need to check to prevent infinite loop below\n  if (url.length <= proto.length) return false;\n\n  // disallow '*' at the end of the link (conflicts with emphasis)\n  url = url.replace(/\\*+$/, '');\n\n  fullUrl = state.md.normalizeLink(url);\n  if (!state.md.validateLink(fullUrl)) return false;\n\n  if (!silent) {\n    state.pending = state.pending.slice(0, -proto.length);\n\n    token         = state.push('link_open', 'a', 1);\n    token.attrs   = [ [ 'href', fullUrl ] ];\n    token.markup  = 'linkify';\n    token.info    = 'auto';\n\n    token         = state.push('text', '', 0);\n    token.content = state.md.normalizeLinkText(url);\n\n    token         = state.push('link_close', 'a', -1);\n    token.markup  = 'linkify';\n    token.info    = 'auto';\n  }\n\n  state.pos += url.length - proto.length;\n  return true;\n};\n","// Proceess '\\n'\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function newline(state, silent) {\n  var pmax, max, ws, pos = state.pos;\n\n  if (state.src.charCodeAt(pos) !== 0x0A/* \\n */) { return false; }\n\n  pmax = state.pending.length - 1;\n  max = state.posMax;\n\n  // '  \\n' -> hardbreak\n  // Lookup in pending chars is bad practice! Don't copy to other rules!\n  // Pending string is stored in concat mode, indexed lookups will cause\n  // convertion to flat mode.\n  if (!silent) {\n    if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) {\n      if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) {\n        // Find whitespaces tail of pending chars.\n        ws = pmax - 1;\n        while (ws >= 1 && state.pending.charCodeAt(ws - 1) === 0x20) ws--;\n\n        state.pending = state.pending.slice(0, ws);\n        state.push('hardbreak', 'br', 0);\n      } else {\n        state.pending = state.pending.slice(0, -1);\n        state.push('softbreak', 'br', 0);\n      }\n\n    } else {\n      state.push('softbreak', 'br', 0);\n    }\n  }\n\n  pos++;\n\n  // skip heading spaces for next line\n  while (pos < max && isSpace(state.src.charCodeAt(pos))) { pos++; }\n\n  state.pos = pos;\n  return true;\n};\n","// Process escaped chars and hardbreaks\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\nvar ESCAPED = [];\n\nfor (var i = 0; i < 256; i++) { ESCAPED.push(0); }\n\n'\\\\!\"#$%&\\'()*+,./:;<=>?@[]^_`{|}~-'\n  .split('').forEach(function (ch) { ESCAPED[ch.charCodeAt(0)] = 1; });\n\n\nmodule.exports = function escape(state, silent) {\n  var ch1, ch2, origStr, escapedStr, token, pos = state.pos, max = state.posMax;\n\n  if (state.src.charCodeAt(pos) !== 0x5C/* \\ */) return false;\n  pos++;\n\n  // '\\' at the end of the inline block\n  if (pos >= max) return false;\n\n  ch1 = state.src.charCodeAt(pos);\n\n  if (ch1 === 0x0A) {\n    if (!silent) {\n      state.push('hardbreak', 'br', 0);\n    }\n\n    pos++;\n    // skip leading whitespaces from next line\n    while (pos < max) {\n      ch1 = state.src.charCodeAt(pos);\n      if (!isSpace(ch1)) break;\n      pos++;\n    }\n\n    state.pos = pos;\n    return true;\n  }\n\n  escapedStr = state.src[pos];\n\n  if (ch1 >= 0xD800 && ch1 <= 0xDBFF && pos + 1 < max) {\n    ch2 = state.src.charCodeAt(pos + 1);\n\n    if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {\n      escapedStr += state.src[pos + 1];\n      pos++;\n    }\n  }\n\n  origStr = '\\\\' + escapedStr;\n\n  if (!silent) {\n    token = state.push('text_special', '', 0);\n\n    if (ch1 < 256 && ESCAPED[ch1] !== 0) {\n      token.content = escapedStr;\n    } else {\n      token.content = origStr;\n    }\n\n    token.markup = origStr;\n    token.info   = 'escape';\n  }\n\n  state.pos = pos + 1;\n  return true;\n};\n","// Parse backticks\n\n'use strict';\n\n\nmodule.exports = function backtick(state, silent) {\n  var start, max, marker, token, matchStart, matchEnd, openerLength, closerLength,\n      pos = state.pos,\n      ch = state.src.charCodeAt(pos);\n\n  if (ch !== 0x60/* ` */) { return false; }\n\n  start = pos;\n  pos++;\n  max = state.posMax;\n\n  // scan marker length\n  while (pos < max && state.src.charCodeAt(pos) === 0x60/* ` */) { pos++; }\n\n  marker = state.src.slice(start, pos);\n  openerLength = marker.length;\n\n  if (state.backticksScanned && (state.backticks[openerLength] || 0) <= start) {\n    if (!silent) state.pending += marker;\n    state.pos += openerLength;\n    return true;\n  }\n\n  matchEnd = pos;\n\n  // Nothing found in the cache, scan until the end of the line (or until marker is found)\n  while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) {\n    matchEnd = matchStart + 1;\n\n    // scan marker length\n    while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60/* ` */) { matchEnd++; }\n\n    closerLength = matchEnd - matchStart;\n\n    if (closerLength === openerLength) {\n      // Found matching closer length.\n      if (!silent) {\n        token     = state.push('code_inline', 'code', 0);\n        token.markup  = marker;\n        token.content = state.src.slice(pos, matchStart)\n          .replace(/\\n/g, ' ')\n          .replace(/^ (.+) $/, '$1');\n      }\n      state.pos = matchEnd;\n      return true;\n    }\n\n    // Some different length found, put it in cache as upper limit of where closer can be found\n    state.backticks[closerLength] = matchStart;\n  }\n\n  // Scanned through the end, didn't find anything\n  state.backticksScanned = true;\n\n  if (!silent) state.pending += marker;\n  state.pos += openerLength;\n  return true;\n};\n","// ~~strike through~~\n//\n'use strict';\n\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nmodule.exports.tokenize = function strikethrough(state, silent) {\n  var i, scanned, token, len, ch,\n      start = state.pos,\n      marker = state.src.charCodeAt(start);\n\n  if (silent) { return false; }\n\n  if (marker !== 0x7E/* ~ */) { return false; }\n\n  scanned = state.scanDelims(state.pos, true);\n  len = scanned.length;\n  ch = String.fromCharCode(marker);\n\n  if (len < 2) { return false; }\n\n  if (len % 2) {\n    token         = state.push('text', '', 0);\n    token.content = ch;\n    len--;\n  }\n\n  for (i = 0; i < len; i += 2) {\n    token         = state.push('text', '', 0);\n    token.content = ch + ch;\n\n    state.delimiters.push({\n      marker: marker,\n      length: 0,     // disable \"rule of 3\" length checks meant for emphasis\n      token:  state.tokens.length - 1,\n      end:    -1,\n      open:   scanned.can_open,\n      close:  scanned.can_close\n    });\n  }\n\n  state.pos += scanned.length;\n\n  return true;\n};\n\n\nfunction postProcess(state, delimiters) {\n  var i, j,\n      startDelim,\n      endDelim,\n      token,\n      loneMarkers = [],\n      max = delimiters.length;\n\n  for (i = 0; i < max; i++) {\n    startDelim = delimiters[i];\n\n    if (startDelim.marker !== 0x7E/* ~ */) {\n      continue;\n    }\n\n    if (startDelim.end === -1) {\n      continue;\n    }\n\n    endDelim = delimiters[startDelim.end];\n\n    token         = state.tokens[startDelim.token];\n    token.type    = 's_open';\n    token.tag     = 's';\n    token.nesting = 1;\n    token.markup  = '~~';\n    token.content = '';\n\n    token         = state.tokens[endDelim.token];\n    token.type    = 's_close';\n    token.tag     = 's';\n    token.nesting = -1;\n    token.markup  = '~~';\n    token.content = '';\n\n    if (state.tokens[endDelim.token - 1].type === 'text' &&\n        state.tokens[endDelim.token - 1].content === '~') {\n\n      loneMarkers.push(endDelim.token - 1);\n    }\n  }\n\n  // If a marker sequence has an odd number of characters, it's splitted\n  // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the\n  // start of the sequence.\n  //\n  // So, we have to move all those markers after subsequent s_close tags.\n  //\n  while (loneMarkers.length) {\n    i = loneMarkers.pop();\n    j = i + 1;\n\n    while (j < state.tokens.length && state.tokens[j].type === 's_close') {\n      j++;\n    }\n\n    j--;\n\n    if (i !== j) {\n      token = state.tokens[j];\n      state.tokens[j] = state.tokens[i];\n      state.tokens[i] = token;\n    }\n  }\n}\n\n\n// Walk through delimiter list and replace text tokens with tags\n//\nmodule.exports.postProcess = function strikethrough(state) {\n  var curr,\n      tokens_meta = state.tokens_meta,\n      max = state.tokens_meta.length;\n\n  postProcess(state, state.delimiters);\n\n  for (curr = 0; curr < max; curr++) {\n    if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n      postProcess(state, tokens_meta[curr].delimiters);\n    }\n  }\n};\n","// Process *this* and _that_\n//\n'use strict';\n\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nmodule.exports.tokenize = function emphasis(state, silent) {\n  var i, scanned, token,\n      start = state.pos,\n      marker = state.src.charCodeAt(start);\n\n  if (silent) { return false; }\n\n  if (marker !== 0x5F /* _ */ && marker !== 0x2A /* * */) { return false; }\n\n  scanned = state.scanDelims(state.pos, marker === 0x2A);\n\n  for (i = 0; i < scanned.length; i++) {\n    token         = state.push('text', '', 0);\n    token.content = String.fromCharCode(marker);\n\n    state.delimiters.push({\n      // Char code of the starting marker (number).\n      //\n      marker: marker,\n\n      // Total length of these series of delimiters.\n      //\n      length: scanned.length,\n\n      // A position of the token this delimiter corresponds to.\n      //\n      token:  state.tokens.length - 1,\n\n      // If this delimiter is matched as a valid opener, `end` will be\n      // equal to its position, otherwise it's `-1`.\n      //\n      end:    -1,\n\n      // Boolean flags that determine if this delimiter could open or close\n      // an emphasis.\n      //\n      open:   scanned.can_open,\n      close:  scanned.can_close\n    });\n  }\n\n  state.pos += scanned.length;\n\n  return true;\n};\n\n\nfunction postProcess(state, delimiters) {\n  var i,\n      startDelim,\n      endDelim,\n      token,\n      ch,\n      isStrong,\n      max = delimiters.length;\n\n  for (i = max - 1; i >= 0; i--) {\n    startDelim = delimiters[i];\n\n    if (startDelim.marker !== 0x5F/* _ */ && startDelim.marker !== 0x2A/* * */) {\n      continue;\n    }\n\n    // Process only opening markers\n    if (startDelim.end === -1) {\n      continue;\n    }\n\n    endDelim = delimiters[startDelim.end];\n\n    // If the previous delimiter has the same marker and is adjacent to this one,\n    // merge those into one strong delimiter.\n    //\n    // `<em><em>whatever</em></em>` -> `<strong>whatever</strong>`\n    //\n    isStrong = i > 0 &&\n               delimiters[i - 1].end === startDelim.end + 1 &&\n               // check that first two markers match and adjacent\n               delimiters[i - 1].marker === startDelim.marker &&\n               delimiters[i - 1].token === startDelim.token - 1 &&\n               // check that last two markers are adjacent (we can safely assume they match)\n               delimiters[startDelim.end + 1].token === endDelim.token + 1;\n\n    ch = String.fromCharCode(startDelim.marker);\n\n    token         = state.tokens[startDelim.token];\n    token.type    = isStrong ? 'strong_open' : 'em_open';\n    token.tag     = isStrong ? 'strong' : 'em';\n    token.nesting = 1;\n    token.markup  = isStrong ? ch + ch : ch;\n    token.content = '';\n\n    token         = state.tokens[endDelim.token];\n    token.type    = isStrong ? 'strong_close' : 'em_close';\n    token.tag     = isStrong ? 'strong' : 'em';\n    token.nesting = -1;\n    token.markup  = isStrong ? ch + ch : ch;\n    token.content = '';\n\n    if (isStrong) {\n      state.tokens[delimiters[i - 1].token].content = '';\n      state.tokens[delimiters[startDelim.end + 1].token].content = '';\n      i--;\n    }\n  }\n}\n\n\n// Walk through delimiter list and replace text tokens with tags\n//\nmodule.exports.postProcess = function emphasis(state) {\n  var curr,\n      tokens_meta = state.tokens_meta,\n      max = state.tokens_meta.length;\n\n  postProcess(state, state.delimiters);\n\n  for (curr = 0; curr < max; curr++) {\n    if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n      postProcess(state, tokens_meta[curr].delimiters);\n    }\n  }\n};\n","// Process [link](<to> \"stuff\")\n\n'use strict';\n\nvar normalizeReference   = require('../common/utils').normalizeReference;\nvar isSpace              = require('../common/utils').isSpace;\n\n\nmodule.exports = function link(state, silent) {\n  var attrs,\n      code,\n      label,\n      labelEnd,\n      labelStart,\n      pos,\n      res,\n      ref,\n      token,\n      href = '',\n      title = '',\n      oldPos = state.pos,\n      max = state.posMax,\n      start = state.pos,\n      parseReference = true;\n\n  if (state.src.charCodeAt(state.pos) !== 0x5B/* [ */) { return false; }\n\n  labelStart = state.pos + 1;\n  labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true);\n\n  // parser failed to find ']', so it's not a valid link\n  if (labelEnd < 0) { return false; }\n\n  pos = labelEnd + 1;\n  if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n    //\n    // Inline link\n    //\n\n    // might have found a valid shortcut link, disable reference parsing\n    parseReference = false;\n\n    // [link](  <href>  \"title\"  )\n    //        ^^ skipping these spaces\n    pos++;\n    for (; pos < max; pos++) {\n      code = state.src.charCodeAt(pos);\n      if (!isSpace(code) && code !== 0x0A) { break; }\n    }\n    if (pos >= max) { return false; }\n\n    // [link](  <href>  \"title\"  )\n    //          ^^^^^^ parsing link destination\n    start = pos;\n    res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);\n    if (res.ok) {\n      href = state.md.normalizeLink(res.str);\n      if (state.md.validateLink(href)) {\n        pos = res.pos;\n      } else {\n        href = '';\n      }\n\n      // [link](  <href>  \"title\"  )\n      //                ^^ skipping these spaces\n      start = pos;\n      for (; pos < max; pos++) {\n        code = state.src.charCodeAt(pos);\n        if (!isSpace(code) && code !== 0x0A) { break; }\n      }\n\n      // [link](  <href>  \"title\"  )\n      //                  ^^^^^^^ parsing link title\n      res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);\n      if (pos < max && start !== pos && res.ok) {\n        title = res.str;\n        pos = res.pos;\n\n        // [link](  <href>  \"title\"  )\n        //                         ^^ skipping these spaces\n        for (; pos < max; pos++) {\n          code = state.src.charCodeAt(pos);\n          if (!isSpace(code) && code !== 0x0A) { break; }\n        }\n      }\n    }\n\n    if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n      // parsing a valid shortcut link failed, fallback to reference\n      parseReference = true;\n    }\n    pos++;\n  }\n\n  if (parseReference) {\n    //\n    // Link reference\n    //\n    if (typeof state.env.references === 'undefined') { return false; }\n\n    if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n      start = pos + 1;\n      pos = state.md.helpers.parseLinkLabel(state, pos);\n      if (pos >= 0) {\n        label = state.src.slice(start, pos++);\n      } else {\n        pos = labelEnd + 1;\n      }\n    } else {\n      pos = labelEnd + 1;\n    }\n\n    // covers label === '' and label === undefined\n    // (collapsed reference link and shortcut reference link respectively)\n    if (!label) { label = state.src.slice(labelStart, labelEnd); }\n\n    ref = state.env.references[normalizeReference(label)];\n    if (!ref) {\n      state.pos = oldPos;\n      return false;\n    }\n    href = ref.href;\n    title = ref.title;\n  }\n\n  //\n  // We found the end of the link, and know for a fact it's a valid link;\n  // so all that's left to do is to call tokenizer.\n  //\n  if (!silent) {\n    state.pos = labelStart;\n    state.posMax = labelEnd;\n\n    token        = state.push('link_open', 'a', 1);\n    token.attrs  = attrs = [ [ 'href', href ] ];\n    if (title) {\n      attrs.push([ 'title', title ]);\n    }\n\n    state.linkLevel++;\n    state.md.inline.tokenize(state);\n    state.linkLevel--;\n\n    token        = state.push('link_close', 'a', -1);\n  }\n\n  state.pos = pos;\n  state.posMax = max;\n  return true;\n};\n","// Process ![image](<src> \"title\")\n\n'use strict';\n\nvar normalizeReference   = require('../common/utils').normalizeReference;\nvar isSpace              = require('../common/utils').isSpace;\n\n\nmodule.exports = function image(state, silent) {\n  var attrs,\n      code,\n      content,\n      label,\n      labelEnd,\n      labelStart,\n      pos,\n      ref,\n      res,\n      title,\n      token,\n      tokens,\n      start,\n      href = '',\n      oldPos = state.pos,\n      max = state.posMax;\n\n  if (state.src.charCodeAt(state.pos) !== 0x21/* ! */) { return false; }\n  if (state.src.charCodeAt(state.pos + 1) !== 0x5B/* [ */) { return false; }\n\n  labelStart = state.pos + 2;\n  labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false);\n\n  // parser failed to find ']', so it's not a valid link\n  if (labelEnd < 0) { return false; }\n\n  pos = labelEnd + 1;\n  if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n    //\n    // Inline link\n    //\n\n    // [link](  <href>  \"title\"  )\n    //        ^^ skipping these spaces\n    pos++;\n    for (; pos < max; pos++) {\n      code = state.src.charCodeAt(pos);\n      if (!isSpace(code) && code !== 0x0A) { break; }\n    }\n    if (pos >= max) { return false; }\n\n    // [link](  <href>  \"title\"  )\n    //          ^^^^^^ parsing link destination\n    start = pos;\n    res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);\n    if (res.ok) {\n      href = state.md.normalizeLink(res.str);\n      if (state.md.validateLink(href)) {\n        pos = res.pos;\n      } else {\n        href = '';\n      }\n    }\n\n    // [link](  <href>  \"title\"  )\n    //                ^^ skipping these spaces\n    start = pos;\n    for (; pos < max; pos++) {\n      code = state.src.charCodeAt(pos);\n      if (!isSpace(code) && code !== 0x0A) { break; }\n    }\n\n    // [link](  <href>  \"title\"  )\n    //                  ^^^^^^^ parsing link title\n    res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);\n    if (pos < max && start !== pos && res.ok) {\n      title = res.str;\n      pos = res.pos;\n\n      // [link](  <href>  \"title\"  )\n      //                         ^^ skipping these spaces\n      for (; pos < max; pos++) {\n        code = state.src.charCodeAt(pos);\n        if (!isSpace(code) && code !== 0x0A) { break; }\n      }\n    } else {\n      title = '';\n    }\n\n    if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n      state.pos = oldPos;\n      return false;\n    }\n    pos++;\n  } else {\n    //\n    // Link reference\n    //\n    if (typeof state.env.references === 'undefined') { return false; }\n\n    if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n      start = pos + 1;\n      pos = state.md.helpers.parseLinkLabel(state, pos);\n      if (pos >= 0) {\n        label = state.src.slice(start, pos++);\n      } else {\n        pos = labelEnd + 1;\n      }\n    } else {\n      pos = labelEnd + 1;\n    }\n\n    // covers label === '' and label === undefined\n    // (collapsed reference link and shortcut reference link respectively)\n    if (!label) { label = state.src.slice(labelStart, labelEnd); }\n\n    ref = state.env.references[normalizeReference(label)];\n    if (!ref) {\n      state.pos = oldPos;\n      return false;\n    }\n    href = ref.href;\n    title = ref.title;\n  }\n\n  //\n  // We found the end of the link, and know for a fact it's a valid link;\n  // so all that's left to do is to call tokenizer.\n  //\n  if (!silent) {\n    content = state.src.slice(labelStart, labelEnd);\n\n    state.md.inline.parse(\n      content,\n      state.md,\n      state.env,\n      tokens = []\n    );\n\n    token          = state.push('image', 'img', 0);\n    token.attrs    = attrs = [ [ 'src', href ], [ 'alt', '' ] ];\n    token.children = tokens;\n    token.content  = content;\n\n    if (title) {\n      attrs.push([ 'title', title ]);\n    }\n  }\n\n  state.pos = pos;\n  state.posMax = max;\n  return true;\n};\n","// Process autolinks '<protocol:...>'\n\n'use strict';\n\n\n/*eslint max-len:0*/\nvar EMAIL_RE    = /^([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/;\nvar AUTOLINK_RE = /^([a-zA-Z][a-zA-Z0-9+.\\-]{1,31}):([^<>\\x00-\\x20]*)$/;\n\n\nmodule.exports = function autolink(state, silent) {\n  var url, fullUrl, token, ch, start, max,\n      pos = state.pos;\n\n  if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }\n\n  start = state.pos;\n  max = state.posMax;\n\n  for (;;) {\n    if (++pos >= max) return false;\n\n    ch = state.src.charCodeAt(pos);\n\n    if (ch === 0x3C /* < */) return false;\n    if (ch === 0x3E /* > */) break;\n  }\n\n  url = state.src.slice(start + 1, pos);\n\n  if (AUTOLINK_RE.test(url)) {\n    fullUrl = state.md.normalizeLink(url);\n    if (!state.md.validateLink(fullUrl)) { return false; }\n\n    if (!silent) {\n      token         = state.push('link_open', 'a', 1);\n      token.attrs   = [ [ 'href', fullUrl ] ];\n      token.markup  = 'autolink';\n      token.info    = 'auto';\n\n      token         = state.push('text', '', 0);\n      token.content = state.md.normalizeLinkText(url);\n\n      token         = state.push('link_close', 'a', -1);\n      token.markup  = 'autolink';\n      token.info    = 'auto';\n    }\n\n    state.pos += url.length + 2;\n    return true;\n  }\n\n  if (EMAIL_RE.test(url)) {\n    fullUrl = state.md.normalizeLink('mailto:' + url);\n    if (!state.md.validateLink(fullUrl)) { return false; }\n\n    if (!silent) {\n      token         = state.push('link_open', 'a', 1);\n      token.attrs   = [ [ 'href', fullUrl ] ];\n      token.markup  = 'autolink';\n      token.info    = 'auto';\n\n      token         = state.push('text', '', 0);\n      token.content = state.md.normalizeLinkText(url);\n\n      token         = state.push('link_close', 'a', -1);\n      token.markup  = 'autolink';\n      token.info    = 'auto';\n    }\n\n    state.pos += url.length + 2;\n    return true;\n  }\n\n  return false;\n};\n","// Process html tags\n\n'use strict';\n\n\nvar HTML_TAG_RE = require('../common/html_re').HTML_TAG_RE;\n\n\nfunction isLinkOpen(str) {\n  return /^<a[>\\s]/i.test(str);\n}\nfunction isLinkClose(str) {\n  return /^<\\/a\\s*>/i.test(str);\n}\n\n\nfunction isLetter(ch) {\n  /*eslint no-bitwise:0*/\n  var lc = ch | 0x20; // to lower case\n  return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */);\n}\n\n\nmodule.exports = function html_inline(state, silent) {\n  var ch, match, max, token,\n      pos = state.pos;\n\n  if (!state.md.options.html) { return false; }\n\n  // Check start\n  max = state.posMax;\n  if (state.src.charCodeAt(pos) !== 0x3C/* < */ ||\n      pos + 2 >= max) {\n    return false;\n  }\n\n  // Quick fail on second char\n  ch = state.src.charCodeAt(pos + 1);\n  if (ch !== 0x21/* ! */ &&\n      ch !== 0x3F/* ? */ &&\n      ch !== 0x2F/* / */ &&\n      !isLetter(ch)) {\n    return false;\n  }\n\n  match = state.src.slice(pos).match(HTML_TAG_RE);\n  if (!match) { return false; }\n\n  if (!silent) {\n    token         = state.push('html_inline', '', 0);\n    token.content = match[0];\n\n    if (isLinkOpen(token.content))  state.linkLevel++;\n    if (isLinkClose(token.content)) state.linkLevel--;\n  }\n  state.pos += match[0].length;\n  return true;\n};\n","// Process html entity - &#123;, &#xAF;, &quot;, ...\n\n'use strict';\n\nvar entities          = require('../common/entities');\nvar has               = require('../common/utils').has;\nvar isValidEntityCode = require('../common/utils').isValidEntityCode;\nvar fromCodePoint     = require('../common/utils').fromCodePoint;\n\n\nvar DIGITAL_RE = /^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i;\nvar NAMED_RE   = /^&([a-z][a-z0-9]{1,31});/i;\n\n\nmodule.exports = function entity(state, silent) {\n  var ch, code, match, token, pos = state.pos, max = state.posMax;\n\n  if (state.src.charCodeAt(pos) !== 0x26/* & */) return false;\n\n  if (pos + 1 >= max) return false;\n\n  ch = state.src.charCodeAt(pos + 1);\n\n  if (ch === 0x23 /* # */) {\n    match = state.src.slice(pos).match(DIGITAL_RE);\n    if (match) {\n      if (!silent) {\n        code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10);\n\n        token         = state.push('text_special', '', 0);\n        token.content = isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD);\n        token.markup  = match[0];\n        token.info    = 'entity';\n      }\n      state.pos += match[0].length;\n      return true;\n    }\n  } else {\n    match = state.src.slice(pos).match(NAMED_RE);\n    if (match) {\n      if (has(entities, match[1])) {\n        if (!silent) {\n          token         = state.push('text_special', '', 0);\n          token.content = entities[match[1]];\n          token.markup  = match[0];\n          token.info    = 'entity';\n        }\n        state.pos += match[0].length;\n        return true;\n      }\n    }\n  }\n\n  return false;\n};\n","// For each opening emphasis-like marker find a matching closing one\n//\n'use strict';\n\n\nfunction processDelimiters(delimiters) {\n  var closerIdx, openerIdx, closer, opener, minOpenerIdx, newMinOpenerIdx,\n      isOddMatch, lastJump,\n      openersBottom = {},\n      max = delimiters.length;\n\n  if (!max) return;\n\n  // headerIdx is the first delimiter of the current (where closer is) delimiter run\n  var headerIdx = 0;\n  var lastTokenIdx = -2; // needs any value lower than -1\n  var jumps = [];\n\n  for (closerIdx = 0; closerIdx < max; closerIdx++) {\n    closer = delimiters[closerIdx];\n\n    jumps.push(0);\n\n    // markers belong to same delimiter run if:\n    //  - they have adjacent tokens\n    //  - AND markers are the same\n    //\n    if (delimiters[headerIdx].marker !== closer.marker || lastTokenIdx !== closer.token - 1) {\n      headerIdx = closerIdx;\n    }\n\n    lastTokenIdx = closer.token;\n\n    // Length is only used for emphasis-specific \"rule of 3\",\n    // if it's not defined (in strikethrough or 3rd party plugins),\n    // we can default it to 0 to disable those checks.\n    //\n    closer.length = closer.length || 0;\n\n    if (!closer.close) continue;\n\n    // Previously calculated lower bounds (previous fails)\n    // for each marker, each delimiter length modulo 3,\n    // and for whether this closer can be an opener;\n    // https://github.com/commonmark/cmark/commit/34250e12ccebdc6372b8b49c44fab57c72443460\n    if (!openersBottom.hasOwnProperty(closer.marker)) {\n      openersBottom[closer.marker] = [ -1, -1, -1, -1, -1, -1 ];\n    }\n\n    minOpenerIdx = openersBottom[closer.marker][(closer.open ? 3 : 0) + (closer.length % 3)];\n\n    openerIdx = headerIdx - jumps[headerIdx] - 1;\n\n    newMinOpenerIdx = openerIdx;\n\n    for (; openerIdx > minOpenerIdx; openerIdx -= jumps[openerIdx] + 1) {\n      opener = delimiters[openerIdx];\n\n      if (opener.marker !== closer.marker) continue;\n\n      if (opener.open && opener.end < 0) {\n\n        isOddMatch = false;\n\n        // from spec:\n        //\n        // If one of the delimiters can both open and close emphasis, then the\n        // sum of the lengths of the delimiter runs containing the opening and\n        // closing delimiters must not be a multiple of 3 unless both lengths\n        // are multiples of 3.\n        //\n        if (opener.close || closer.open) {\n          if ((opener.length + closer.length) % 3 === 0) {\n            if (opener.length % 3 !== 0 || closer.length % 3 !== 0) {\n              isOddMatch = true;\n            }\n          }\n        }\n\n        if (!isOddMatch) {\n          // If previous delimiter cannot be an opener, we can safely skip\n          // the entire sequence in future checks. This is required to make\n          // sure algorithm has linear complexity (see *_*_*_*_*_... case).\n          //\n          lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open ?\n            jumps[openerIdx - 1] + 1 :\n            0;\n\n          jumps[closerIdx] = closerIdx - openerIdx + lastJump;\n          jumps[openerIdx] = lastJump;\n\n          closer.open  = false;\n          opener.end   = closerIdx;\n          opener.close = false;\n          newMinOpenerIdx = -1;\n          // treat next token as start of run,\n          // it optimizes skips in **<...>**a**<...>** pathological case\n          lastTokenIdx = -2;\n          break;\n        }\n      }\n    }\n\n    if (newMinOpenerIdx !== -1) {\n      // If match for this delimiter run failed, we want to set lower bound for\n      // future lookups. This is required to make sure algorithm has linear\n      // complexity.\n      //\n      // See details here:\n      // https://github.com/commonmark/cmark/issues/178#issuecomment-270417442\n      //\n      openersBottom[closer.marker][(closer.open ? 3 : 0) + ((closer.length || 0) % 3)] = newMinOpenerIdx;\n    }\n  }\n}\n\n\nmodule.exports = function link_pairs(state) {\n  var curr,\n      tokens_meta = state.tokens_meta,\n      max = state.tokens_meta.length;\n\n  processDelimiters(state.delimiters);\n\n  for (curr = 0; curr < max; curr++) {\n    if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n      processDelimiters(tokens_meta[curr].delimiters);\n    }\n  }\n};\n","// Clean up tokens after emphasis and strikethrough postprocessing:\n// merge adjacent text nodes into one and re-calculate all token levels\n//\n// This is necessary because initially emphasis delimiter markers (*, _, ~)\n// are treated as their own separate text tokens. Then emphasis rule either\n// leaves them as text (needed to merge with adjacent text) or turns them\n// into opening/closing tags (which messes up levels inside).\n//\n'use strict';\n\n\nmodule.exports = function fragments_join(state) {\n  var curr, last,\n      level = 0,\n      tokens = state.tokens,\n      max = state.tokens.length;\n\n  for (curr = last = 0; curr < max; curr++) {\n    // re-calculate levels after emphasis/strikethrough turns some text nodes\n    // into opening/closing tags\n    if (tokens[curr].nesting < 0) level--; // closing tag\n    tokens[curr].level = level;\n    if (tokens[curr].nesting > 0) level++; // opening tag\n\n    if (tokens[curr].type === 'text' &&\n        curr + 1 < max &&\n        tokens[curr + 1].type === 'text') {\n\n      // collapse two adjacent text nodes\n      tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content;\n    } else {\n      if (curr !== last) { tokens[last] = tokens[curr]; }\n\n      last++;\n    }\n  }\n\n  if (curr !== last) {\n    tokens.length = last;\n  }\n};\n","// Inline parser state\n\n'use strict';\n\n\nvar Token          = require('../token');\nvar isWhiteSpace   = require('../common/utils').isWhiteSpace;\nvar isPunctChar    = require('../common/utils').isPunctChar;\nvar isMdAsciiPunct = require('../common/utils').isMdAsciiPunct;\n\n\nfunction StateInline(src, md, env, outTokens) {\n  this.src = src;\n  this.env = env;\n  this.md = md;\n  this.tokens = outTokens;\n  this.tokens_meta = Array(outTokens.length);\n\n  this.pos = 0;\n  this.posMax = this.src.length;\n  this.level = 0;\n  this.pending = '';\n  this.pendingLevel = 0;\n\n  // Stores { start: end } pairs. Useful for backtrack\n  // optimization of pairs parse (emphasis, strikes).\n  this.cache = {};\n\n  // List of emphasis-like delimiters for current tag\n  this.delimiters = [];\n\n  // Stack of delimiter lists for upper level tags\n  this._prev_delimiters = [];\n\n  // backtick length => last seen position\n  this.backticks = {};\n  this.backticksScanned = false;\n\n  // Counter used to disable inline linkify-it execution\n  // inside <a> and markdown links\n  this.linkLevel = 0;\n}\n\n\n// Flush pending text\n//\nStateInline.prototype.pushPending = function () {\n  var token = new Token('text', '', 0);\n  token.content = this.pending;\n  token.level = this.pendingLevel;\n  this.tokens.push(token);\n  this.pending = '';\n  return token;\n};\n\n\n// Push new token to \"stream\".\n// If pending text exists - flush it as text token\n//\nStateInline.prototype.push = function (type, tag, nesting) {\n  if (this.pending) {\n    this.pushPending();\n  }\n\n  var token = new Token(type, tag, nesting);\n  var token_meta = null;\n\n  if (nesting < 0) {\n    // closing tag\n    this.level--;\n    this.delimiters = this._prev_delimiters.pop();\n  }\n\n  token.level = this.level;\n\n  if (nesting > 0) {\n    // opening tag\n    this.level++;\n    this._prev_delimiters.push(this.delimiters);\n    this.delimiters = [];\n    token_meta = { delimiters: this.delimiters };\n  }\n\n  this.pendingLevel = this.level;\n  this.tokens.push(token);\n  this.tokens_meta.push(token_meta);\n  return token;\n};\n\n\n// Scan a sequence of emphasis-like markers, and determine whether\n// it can start an emphasis sequence or end an emphasis sequence.\n//\n//  - start - position to scan from (it should point at a valid marker);\n//  - canSplitWord - determine if these markers can be found inside a word\n//\nStateInline.prototype.scanDelims = function (start, canSplitWord) {\n  var pos = start, lastChar, nextChar, count, can_open, can_close,\n      isLastWhiteSpace, isLastPunctChar,\n      isNextWhiteSpace, isNextPunctChar,\n      left_flanking = true,\n      right_flanking = true,\n      max = this.posMax,\n      marker = this.src.charCodeAt(start);\n\n  // treat beginning of the line as a whitespace\n  lastChar = start > 0 ? this.src.charCodeAt(start - 1) : 0x20;\n\n  while (pos < max && this.src.charCodeAt(pos) === marker) { pos++; }\n\n  count = pos - start;\n\n  // treat end of the line as a whitespace\n  nextChar = pos < max ? this.src.charCodeAt(pos) : 0x20;\n\n  isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));\n  isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));\n\n  isLastWhiteSpace = isWhiteSpace(lastChar);\n  isNextWhiteSpace = isWhiteSpace(nextChar);\n\n  if (isNextWhiteSpace) {\n    left_flanking = false;\n  } else if (isNextPunctChar) {\n    if (!(isLastWhiteSpace || isLastPunctChar)) {\n      left_flanking = false;\n    }\n  }\n\n  if (isLastWhiteSpace) {\n    right_flanking = false;\n  } else if (isLastPunctChar) {\n    if (!(isNextWhiteSpace || isNextPunctChar)) {\n      right_flanking = false;\n    }\n  }\n\n  if (!canSplitWord) {\n    can_open  = left_flanking  && (!right_flanking || isLastPunctChar);\n    can_close = right_flanking && (!left_flanking  || isNextPunctChar);\n  } else {\n    can_open  = left_flanking;\n    can_close = right_flanking;\n  }\n\n  return {\n    can_open:  can_open,\n    can_close: can_close,\n    length:    count\n  };\n};\n\n\n// re-export Token class to use in block rules\nStateInline.prototype.Token = Token;\n\n\nmodule.exports = StateInline;\n","/** internal\n * class ParserInline\n *\n * Tokenizes paragraph content.\n **/\n'use strict';\n\n\nvar Ruler           = require('./ruler');\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Parser rules\n\nvar _rules = [\n  [ 'text',            require('./rules_inline/text') ],\n  [ 'linkify',         require('./rules_inline/linkify') ],\n  [ 'newline',         require('./rules_inline/newline') ],\n  [ 'escape',          require('./rules_inline/escape') ],\n  [ 'backticks',       require('./rules_inline/backticks') ],\n  [ 'strikethrough',   require('./rules_inline/strikethrough').tokenize ],\n  [ 'emphasis',        require('./rules_inline/emphasis').tokenize ],\n  [ 'link',            require('./rules_inline/link') ],\n  [ 'image',           require('./rules_inline/image') ],\n  [ 'autolink',        require('./rules_inline/autolink') ],\n  [ 'html_inline',     require('./rules_inline/html_inline') ],\n  [ 'entity',          require('./rules_inline/entity') ]\n];\n\n// `rule2` ruleset was created specifically for emphasis/strikethrough\n// post-processing and may be changed in the future.\n//\n// Don't use this for anything except pairs (plugins working with `balance_pairs`).\n//\nvar _rules2 = [\n  [ 'balance_pairs',   require('./rules_inline/balance_pairs') ],\n  [ 'strikethrough',   require('./rules_inline/strikethrough').postProcess ],\n  [ 'emphasis',        require('./rules_inline/emphasis').postProcess ],\n  // rules for pairs separate '**' into its own text tokens, which may be left unused,\n  // rule below merges unused segments back with the rest of the text\n  [ 'fragments_join',  require('./rules_inline/fragments_join') ]\n];\n\n\n/**\n * new ParserInline()\n **/\nfunction ParserInline() {\n  var i;\n\n  /**\n   * ParserInline#ruler -> Ruler\n   *\n   * [[Ruler]] instance. Keep configuration of inline rules.\n   **/\n  this.ruler = new Ruler();\n\n  for (i = 0; i < _rules.length; i++) {\n    this.ruler.push(_rules[i][0], _rules[i][1]);\n  }\n\n  /**\n   * ParserInline#ruler2 -> Ruler\n   *\n   * [[Ruler]] instance. Second ruler used for post-processing\n   * (e.g. in emphasis-like rules).\n   **/\n  this.ruler2 = new Ruler();\n\n  for (i = 0; i < _rules2.length; i++) {\n    this.ruler2.push(_rules2[i][0], _rules2[i][1]);\n  }\n}\n\n\n// Skip single token by running all rules in validation mode;\n// returns `true` if any rule reported success\n//\nParserInline.prototype.skipToken = function (state) {\n  var ok, i, pos = state.pos,\n      rules = this.ruler.getRules(''),\n      len = rules.length,\n      maxNesting = state.md.options.maxNesting,\n      cache = state.cache;\n\n\n  if (typeof cache[pos] !== 'undefined') {\n    state.pos = cache[pos];\n    return;\n  }\n\n  if (state.level < maxNesting) {\n    for (i = 0; i < len; i++) {\n      // Increment state.level and decrement it later to limit recursion.\n      // It's harmless to do here, because no tokens are created. But ideally,\n      // we'd need a separate private state variable for this purpose.\n      //\n      state.level++;\n      ok = rules[i](state, true);\n      state.level--;\n\n      if (ok) {\n        if (pos >= state.pos) { throw new Error(\"inline rule didn't increment state.pos\"); }\n        break;\n      }\n    }\n  } else {\n    // Too much nesting, just skip until the end of the paragraph.\n    //\n    // NOTE: this will cause links to behave incorrectly in the following case,\n    //       when an amount of `[` is exactly equal to `maxNesting + 1`:\n    //\n    //       [[[[[[[[[[[[[[[[[[[[[foo]()\n    //\n    // TODO: remove this workaround when CM standard will allow nested links\n    //       (we can replace it by preventing links from being parsed in\n    //       validation mode)\n    //\n    state.pos = state.posMax;\n  }\n\n  if (!ok) { state.pos++; }\n  cache[pos] = state.pos;\n};\n\n\n// Generate tokens for input range\n//\nParserInline.prototype.tokenize = function (state) {\n  var ok, i, prevPos,\n      rules = this.ruler.getRules(''),\n      len = rules.length,\n      end = state.posMax,\n      maxNesting = state.md.options.maxNesting;\n\n  while (state.pos < end) {\n    // Try all possible rules.\n    // On success, rule should:\n    //\n    // - update `state.pos`\n    // - update `state.tokens`\n    // - return true\n    prevPos = state.pos;\n\n    if (state.level < maxNesting) {\n      for (i = 0; i < len; i++) {\n        ok = rules[i](state, false);\n        if (ok) {\n          if (prevPos >= state.pos) { throw new Error(\"inline rule didn't increment state.pos\"); }\n          break;\n        }\n      }\n    }\n\n    if (ok) {\n      if (state.pos >= end) { break; }\n      continue;\n    }\n\n    state.pending += state.src[state.pos++];\n  }\n\n  if (state.pending) {\n    state.pushPending();\n  }\n};\n\n\n/**\n * ParserInline.parse(str, md, env, outTokens)\n *\n * Process input string and push inline tokens into `outTokens`\n **/\nParserInline.prototype.parse = function (str, md, env, outTokens) {\n  var i, rules, len;\n  var state = new this.State(str, md, env, outTokens);\n\n  this.tokenize(state);\n\n  rules = this.ruler2.getRules('');\n  len = rules.length;\n\n  for (i = 0; i < len; i++) {\n    rules[i](state);\n  }\n};\n\n\nParserInline.prototype.State = require('./rules_inline/state_inline');\n\n\nmodule.exports = ParserInline;\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7F]/; // Note: U+007F DEL is excluded too.\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, callback) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = callback(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {String} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(domain, callback) {\n\tconst parts = domain.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tdomain = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tdomain = domain.replace(regexSeparators, '\\x2E');\n\tconst labels = domain.split('.');\n\tconst encoded = map(labels, callback).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = codePoints => String.fromCodePoint(...codePoints);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint >= 0x30 && codePoint < 0x3A) {\n\t\treturn 26 + (codePoint - 0x30);\n\t}\n\tif (codePoint >= 0x41 && codePoint < 0x5B) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint >= 0x61 && codePoint < 0x7B) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t//  0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tconst oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\t\t\tif (digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tconst inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tconst basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue === n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.3.1',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport { ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode };\nexport default punycode;\n","// markdown-it default options\n\n'use strict';\n\n\nmodule.exports = {\n  options: {\n    html:         false,        // Enable HTML tags in source\n    xhtmlOut:     false,        // Use '/' to close single tags (<br />)\n    breaks:       false,        // Convert '\\n' in paragraphs into <br>\n    langPrefix:   'language-',  // CSS language prefix for fenced blocks\n    linkify:      false,        // autoconvert URL-like texts to links\n\n    // Enable some language-neutral replacements + quotes beautification\n    typographer:  false,\n\n    // Double + single quotes replacement pairs, when typographer enabled,\n    // and smartquotes on. Could be either a String or an Array.\n    //\n    // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n    // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n    quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n    // Highlighter function. Should return escaped HTML,\n    // or '' if the source string is not changed and should be escaped externaly.\n    // If result starts with <pre... internal wrapper is skipped.\n    //\n    // function (/*str, lang*/) { return ''; }\n    //\n    highlight: null,\n\n    maxNesting:   100            // Internal protection, recursion limit\n  },\n\n  components: {\n\n    core: {},\n    block: {},\n    inline: {}\n  }\n};\n","// \"Zero\" preset, with nothing enabled. Useful for manual configuring of simple\n// modes. For example, to parse bold/italic only.\n\n'use strict';\n\n\nmodule.exports = {\n  options: {\n    html:         false,        // Enable HTML tags in source\n    xhtmlOut:     false,        // Use '/' to close single tags (<br />)\n    breaks:       false,        // Convert '\\n' in paragraphs into <br>\n    langPrefix:   'language-',  // CSS language prefix for fenced blocks\n    linkify:      false,        // autoconvert URL-like texts to links\n\n    // Enable some language-neutral replacements + quotes beautification\n    typographer:  false,\n\n    // Double + single quotes replacement pairs, when typographer enabled,\n    // and smartquotes on. Could be either a String or an Array.\n    //\n    // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n    // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n    quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n    // Highlighter function. Should return escaped HTML,\n    // or '' if the source string is not changed and should be escaped externaly.\n    // If result starts with <pre... internal wrapper is skipped.\n    //\n    // function (/*str, lang*/) { return ''; }\n    //\n    highlight: null,\n\n    maxNesting:   20            // Internal protection, recursion limit\n  },\n\n  components: {\n\n    core: {\n      rules: [\n        'normalize',\n        'block',\n        'inline',\n        'text_join'\n      ]\n    },\n\n    block: {\n      rules: [\n        'paragraph'\n      ]\n    },\n\n    inline: {\n      rules: [\n        'text'\n      ],\n      rules2: [\n        'balance_pairs',\n        'fragments_join'\n      ]\n    }\n  }\n};\n","// Commonmark default options\n\n'use strict';\n\n\nmodule.exports = {\n  options: {\n    html:         true,         // Enable HTML tags in source\n    xhtmlOut:     true,         // Use '/' to close single tags (<br />)\n    breaks:       false,        // Convert '\\n' in paragraphs into <br>\n    langPrefix:   'language-',  // CSS language prefix for fenced blocks\n    linkify:      false,        // autoconvert URL-like texts to links\n\n    // Enable some language-neutral replacements + quotes beautification\n    typographer:  false,\n\n    // Double + single quotes replacement pairs, when typographer enabled,\n    // and smartquotes on. Could be either a String or an Array.\n    //\n    // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n    // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n    quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n    // Highlighter function. Should return escaped HTML,\n    // or '' if the source string is not changed and should be escaped externaly.\n    // If result starts with <pre... internal wrapper is skipped.\n    //\n    // function (/*str, lang*/) { return ''; }\n    //\n    highlight: null,\n\n    maxNesting:   20            // Internal protection, recursion limit\n  },\n\n  components: {\n\n    core: {\n      rules: [\n        'normalize',\n        'block',\n        'inline',\n        'text_join'\n      ]\n    },\n\n    block: {\n      rules: [\n        'blockquote',\n        'code',\n        'fence',\n        'heading',\n        'hr',\n        'html_block',\n        'lheading',\n        'list',\n        'reference',\n        'paragraph'\n      ]\n    },\n\n    inline: {\n      rules: [\n        'autolink',\n        'backticks',\n        'emphasis',\n        'entity',\n        'escape',\n        'html_inline',\n        'image',\n        'link',\n        'newline',\n        'text'\n      ],\n      rules2: [\n        'balance_pairs',\n        'emphasis',\n        'fragments_join'\n      ]\n    }\n  }\n};\n","// Main parser class\n\n'use strict';\n\n\nvar utils        = require('./common/utils');\nvar helpers      = require('./helpers');\nvar Renderer     = require('./renderer');\nvar ParserCore   = require('./parser_core');\nvar ParserBlock  = require('./parser_block');\nvar ParserInline = require('./parser_inline');\nvar LinkifyIt    = require('linkify-it');\nvar mdurl        = require('mdurl');\nvar punycode     = require('punycode');\n\n\nvar config = {\n  default: require('./presets/default'),\n  zero: require('./presets/zero'),\n  commonmark: require('./presets/commonmark')\n};\n\n////////////////////////////////////////////////////////////////////////////////\n//\n// This validator can prohibit more than really needed to prevent XSS. It's a\n// tradeoff to keep code simple and to be secure by default.\n//\n// If you need different setup - override validator method as you wish. Or\n// replace it with dummy function and use external sanitizer.\n//\n\nvar BAD_PROTO_RE = /^(vbscript|javascript|file|data):/;\nvar GOOD_DATA_RE = /^data:image\\/(gif|png|jpeg|webp);/;\n\nfunction validateLink(url) {\n  // url should be normalized at this point, and existing entities are decoded\n  var str = url.trim().toLowerCase();\n\n  return BAD_PROTO_RE.test(str) ? (GOOD_DATA_RE.test(str) ? true : false) : true;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nvar RECODE_HOSTNAME_FOR = [ 'http:', 'https:', 'mailto:' ];\n\nfunction normalizeLink(url) {\n  var parsed = mdurl.parse(url, true);\n\n  if (parsed.hostname) {\n    // Encode hostnames in urls like:\n    // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n    //\n    // We don't encode unknown schemas, because it's likely that we encode\n    // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n    //\n    if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n      try {\n        parsed.hostname = punycode.toASCII(parsed.hostname);\n      } catch (er) { /**/ }\n    }\n  }\n\n  return mdurl.encode(mdurl.format(parsed));\n}\n\nfunction normalizeLinkText(url) {\n  var parsed = mdurl.parse(url, true);\n\n  if (parsed.hostname) {\n    // Encode hostnames in urls like:\n    // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n    //\n    // We don't encode unknown schemas, because it's likely that we encode\n    // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n    //\n    if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n      try {\n        parsed.hostname = punycode.toUnicode(parsed.hostname);\n      } catch (er) { /**/ }\n    }\n  }\n\n  // add '%' to exclude list because of https://github.com/markdown-it/markdown-it/issues/720\n  return mdurl.decode(mdurl.format(parsed), mdurl.decode.defaultChars + '%');\n}\n\n\n/**\n * class MarkdownIt\n *\n * Main parser/renderer class.\n *\n * ##### Usage\n *\n * ```javascript\n * // node.js, \"classic\" way:\n * var MarkdownIt = require('markdown-it'),\n *     md = new MarkdownIt();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // node.js, the same, but with sugar:\n * var md = require('markdown-it')();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // browser without AMD, added to \"window\" on script load\n * // Note, there are no dash.\n * var md = window.markdownit();\n * var result = md.render('# markdown-it rulezz!');\n * ```\n *\n * Single line rendering, without paragraph wrap:\n *\n * ```javascript\n * var md = require('markdown-it')();\n * var result = md.renderInline('__markdown-it__ rulezz!');\n * ```\n **/\n\n/**\n * new MarkdownIt([presetName, options])\n * - presetName (String): optional, `commonmark` / `zero`\n * - options (Object)\n *\n * Creates parser instanse with given config. Can be called without `new`.\n *\n * ##### presetName\n *\n * MarkdownIt provides named presets as a convenience to quickly\n * enable/disable active syntax rules and options for common use cases.\n *\n * - [\"commonmark\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/commonmark.js) -\n *   configures parser to strict [CommonMark](http://commonmark.org/) mode.\n * - [default](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/default.js) -\n *   similar to GFM, used when no preset name given. Enables all available rules,\n *   but still without html, typographer & autolinker.\n * - [\"zero\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/zero.js) -\n *   all rules disabled. Useful to quickly setup your config via `.enable()`.\n *   For example, when you need only `bold` and `italic` markup and nothing else.\n *\n * ##### options:\n *\n * - __html__ - `false`. Set `true` to enable HTML tags in source. Be careful!\n *   That's not safe! You may need external sanitizer to protect output from XSS.\n *   It's better to extend features via plugins, instead of enabling HTML.\n * - __xhtmlOut__ - `false`. Set `true` to add '/' when closing single tags\n *   (`<br />`). This is needed only for full CommonMark compatibility. In real\n *   world you will need HTML output.\n * - __breaks__ - `false`. Set `true` to convert `\\n` in paragraphs into `<br>`.\n * - __langPrefix__ - `language-`. CSS language class prefix for fenced blocks.\n *   Can be useful for external highlighters.\n * - __linkify__ - `false`. Set `true` to autoconvert URL-like text to links.\n * - __typographer__  - `false`. Set `true` to enable [some language-neutral\n *   replacement](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.js) +\n *   quotes beautification (smartquotes).\n * - __quotes__ - `“”‘’`, String or Array. Double + single quotes replacement\n *   pairs, when typographer enabled and smartquotes on. For example, you can\n *   use `'«»„“'` for Russian, `'„“‚‘'` for German, and\n *   `['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›']` for French (including nbsp).\n * - __highlight__ - `null`. Highlighter function for fenced code blocks.\n *   Highlighter `function (str, lang)` should return escaped HTML. It can also\n *   return empty string if the source was not changed and should be escaped\n *   externaly. If result starts with <pre... internal wrapper is skipped.\n *\n * ##### Example\n *\n * ```javascript\n * // commonmark mode\n * var md = require('markdown-it')('commonmark');\n *\n * // default mode\n * var md = require('markdown-it')();\n *\n * // enable everything\n * var md = require('markdown-it')({\n *   html: true,\n *   linkify: true,\n *   typographer: true\n * });\n * ```\n *\n * ##### Syntax highlighting\n *\n * ```js\n * var hljs = require('highlight.js') // https://highlightjs.org/\n *\n * var md = require('markdown-it')({\n *   highlight: function (str, lang) {\n *     if (lang && hljs.getLanguage(lang)) {\n *       try {\n *         return hljs.highlight(str, { language: lang, ignoreIllegals: true }).value;\n *       } catch (__) {}\n *     }\n *\n *     return ''; // use external default escaping\n *   }\n * });\n * ```\n *\n * Or with full wrapper override (if you need assign class to `<pre>`):\n *\n * ```javascript\n * var hljs = require('highlight.js') // https://highlightjs.org/\n *\n * // Actual default values\n * var md = require('markdown-it')({\n *   highlight: function (str, lang) {\n *     if (lang && hljs.getLanguage(lang)) {\n *       try {\n *         return '<pre class=\"hljs\"><code>' +\n *                hljs.highlight(str, { language: lang, ignoreIllegals: true }).value +\n *                '</code></pre>';\n *       } catch (__) {}\n *     }\n *\n *     return '<pre class=\"hljs\"><code>' + md.utils.escapeHtml(str) + '</code></pre>';\n *   }\n * });\n * ```\n *\n **/\nfunction MarkdownIt(presetName, options) {\n  if (!(this instanceof MarkdownIt)) {\n    return new MarkdownIt(presetName, options);\n  }\n\n  if (!options) {\n    if (!utils.isString(presetName)) {\n      options = presetName || {};\n      presetName = 'default';\n    }\n  }\n\n  /**\n   * MarkdownIt#inline -> ParserInline\n   *\n   * Instance of [[ParserInline]]. You may need it to add new rules when\n   * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n   * [[MarkdownIt.enable]].\n   **/\n  this.inline = new ParserInline();\n\n  /**\n   * MarkdownIt#block -> ParserBlock\n   *\n   * Instance of [[ParserBlock]]. You may need it to add new rules when\n   * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n   * [[MarkdownIt.enable]].\n   **/\n  this.block = new ParserBlock();\n\n  /**\n   * MarkdownIt#core -> Core\n   *\n   * Instance of [[Core]] chain executor. You may need it to add new rules when\n   * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n   * [[MarkdownIt.enable]].\n   **/\n  this.core = new ParserCore();\n\n  /**\n   * MarkdownIt#renderer -> Renderer\n   *\n   * Instance of [[Renderer]]. Use it to modify output look. Or to add rendering\n   * rules for new token types, generated by plugins.\n   *\n   * ##### Example\n   *\n   * ```javascript\n   * var md = require('markdown-it')();\n   *\n   * function myToken(tokens, idx, options, env, self) {\n   *   //...\n   *   return result;\n   * };\n   *\n   * md.renderer.rules['my_token'] = myToken\n   * ```\n   *\n   * See [[Renderer]] docs and [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js).\n   **/\n  this.renderer = new Renderer();\n\n  /**\n   * MarkdownIt#linkify -> LinkifyIt\n   *\n   * [linkify-it](https://github.com/markdown-it/linkify-it) instance.\n   * Used by [linkify](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/linkify.js)\n   * rule.\n   **/\n  this.linkify = new LinkifyIt();\n\n  /**\n   * MarkdownIt#validateLink(url) -> Boolean\n   *\n   * Link validation function. CommonMark allows too much in links. By default\n   * we disable `javascript:`, `vbscript:`, `file:` schemas, and almost all `data:...` schemas\n   * except some embedded image types.\n   *\n   * You can change this behaviour:\n   *\n   * ```javascript\n   * var md = require('markdown-it')();\n   * // enable everything\n   * md.validateLink = function () { return true; }\n   * ```\n   **/\n  this.validateLink = validateLink;\n\n  /**\n   * MarkdownIt#normalizeLink(url) -> String\n   *\n   * Function used to encode link url to a machine-readable format,\n   * which includes url-encoding, punycode, etc.\n   **/\n  this.normalizeLink = normalizeLink;\n\n  /**\n   * MarkdownIt#normalizeLinkText(url) -> String\n   *\n   * Function used to decode link url to a human-readable format`\n   **/\n  this.normalizeLinkText = normalizeLinkText;\n\n\n  // Expose utils & helpers for easy acces from plugins\n\n  /**\n   * MarkdownIt#utils -> utils\n   *\n   * Assorted utility functions, useful to write plugins. See details\n   * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/common/utils.js).\n   **/\n  this.utils = utils;\n\n  /**\n   * MarkdownIt#helpers -> helpers\n   *\n   * Link components parser functions, useful to write plugins. See details\n   * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/helpers).\n   **/\n  this.helpers = utils.assign({}, helpers);\n\n\n  this.options = {};\n  this.configure(presetName);\n\n  if (options) { this.set(options); }\n}\n\n\n/** chainable\n * MarkdownIt.set(options)\n *\n * Set parser options (in the same format as in constructor). Probably, you\n * will never need it, but you can change options after constructor call.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n *             .set({ html: true, breaks: true })\n *             .set({ typographer, true });\n * ```\n *\n * __Note:__ To achieve the best possible performance, don't modify a\n * `markdown-it` instance options on the fly. If you need multiple configurations\n * it's best to create multiple instances and initialize each with separate\n * config.\n **/\nMarkdownIt.prototype.set = function (options) {\n  utils.assign(this.options, options);\n  return this;\n};\n\n\n/** chainable, internal\n * MarkdownIt.configure(presets)\n *\n * Batch load of all options and compenent settings. This is internal method,\n * and you probably will not need it. But if you will - see available presets\n * and data structure [here](https://github.com/markdown-it/markdown-it/tree/master/lib/presets)\n *\n * We strongly recommend to use presets instead of direct config loads. That\n * will give better compatibility with next versions.\n **/\nMarkdownIt.prototype.configure = function (presets) {\n  var self = this, presetName;\n\n  if (utils.isString(presets)) {\n    presetName = presets;\n    presets = config[presetName];\n    if (!presets) { throw new Error('Wrong `markdown-it` preset \"' + presetName + '\", check name'); }\n  }\n\n  if (!presets) { throw new Error('Wrong `markdown-it` preset, can\\'t be empty'); }\n\n  if (presets.options) { self.set(presets.options); }\n\n  if (presets.components) {\n    Object.keys(presets.components).forEach(function (name) {\n      if (presets.components[name].rules) {\n        self[name].ruler.enableOnly(presets.components[name].rules);\n      }\n      if (presets.components[name].rules2) {\n        self[name].ruler2.enableOnly(presets.components[name].rules2);\n      }\n    });\n  }\n  return this;\n};\n\n\n/** chainable\n * MarkdownIt.enable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to enable\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable list or rules. It will automatically find appropriate components,\n * containing rules with given names. If rule not found, and `ignoreInvalid`\n * not set - throws exception.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n *             .enable(['sub', 'sup'])\n *             .disable('smartquotes');\n * ```\n **/\nMarkdownIt.prototype.enable = function (list, ignoreInvalid) {\n  var result = [];\n\n  if (!Array.isArray(list)) { list = [ list ]; }\n\n  [ 'core', 'block', 'inline' ].forEach(function (chain) {\n    result = result.concat(this[chain].ruler.enable(list, true));\n  }, this);\n\n  result = result.concat(this.inline.ruler2.enable(list, true));\n\n  var missed = list.filter(function (name) { return result.indexOf(name) < 0; });\n\n  if (missed.length && !ignoreInvalid) {\n    throw new Error('MarkdownIt. Failed to enable unknown rule(s): ' + missed);\n  }\n\n  return this;\n};\n\n\n/** chainable\n * MarkdownIt.disable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * The same as [[MarkdownIt.enable]], but turn specified rules off.\n **/\nMarkdownIt.prototype.disable = function (list, ignoreInvalid) {\n  var result = [];\n\n  if (!Array.isArray(list)) { list = [ list ]; }\n\n  [ 'core', 'block', 'inline' ].forEach(function (chain) {\n    result = result.concat(this[chain].ruler.disable(list, true));\n  }, this);\n\n  result = result.concat(this.inline.ruler2.disable(list, true));\n\n  var missed = list.filter(function (name) { return result.indexOf(name) < 0; });\n\n  if (missed.length && !ignoreInvalid) {\n    throw new Error('MarkdownIt. Failed to disable unknown rule(s): ' + missed);\n  }\n  return this;\n};\n\n\n/** chainable\n * MarkdownIt.use(plugin, params)\n *\n * Load specified plugin with given params into current parser instance.\n * It's just a sugar to call `plugin(md, params)` with curring.\n *\n * ##### Example\n *\n * ```javascript\n * var iterator = require('markdown-it-for-inline');\n * var md = require('markdown-it')()\n *             .use(iterator, 'foo_replace', 'text', function (tokens, idx) {\n *               tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar');\n *             });\n * ```\n **/\nMarkdownIt.prototype.use = function (plugin /*, params, ... */) {\n  var args = [ this ].concat(Array.prototype.slice.call(arguments, 1));\n  plugin.apply(plugin, args);\n  return this;\n};\n\n\n/** internal\n * MarkdownIt.parse(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Parse input string and return list of block tokens (special token type\n * \"inline\" will contain list of inline tokens). You should not call this\n * method directly, until you write custom renderer (for example, to produce\n * AST).\n *\n * `env` is used to pass data between \"distributed\" rules and return additional\n * metadata like reference info, needed for the renderer. It also can be used to\n * inject data in specific cases. Usually, you will be ok to pass `{}`,\n * and then pass updated object to renderer.\n **/\nMarkdownIt.prototype.parse = function (src, env) {\n  if (typeof src !== 'string') {\n    throw new Error('Input data should be a String');\n  }\n\n  var state = new this.core.State(src, this, env);\n\n  this.core.process(state);\n\n  return state.tokens;\n};\n\n\n/**\n * MarkdownIt.render(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Render markdown string into html. It does all magic for you :).\n *\n * `env` can be used to inject additional metadata (`{}` by default).\n * But you will not need it with high probability. See also comment\n * in [[MarkdownIt.parse]].\n **/\nMarkdownIt.prototype.render = function (src, env) {\n  env = env || {};\n\n  return this.renderer.render(this.parse(src, env), this.options, env);\n};\n\n\n/** internal\n * MarkdownIt.parseInline(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * The same as [[MarkdownIt.parse]] but skip all block rules. It returns the\n * block tokens list with the single `inline` element, containing parsed inline\n * tokens in `children` property. Also updates `env` object.\n **/\nMarkdownIt.prototype.parseInline = function (src, env) {\n  var state = new this.core.State(src, this, env);\n\n  state.inlineMode = true;\n  this.core.process(state);\n\n  return state.tokens;\n};\n\n\n/**\n * MarkdownIt.renderInline(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Similar to [[MarkdownIt.render]] but for single paragraph content. Result\n * will NOT be wrapped into `<p>` tags.\n **/\nMarkdownIt.prototype.renderInline = function (src, env) {\n  env = env || {};\n\n  return this.renderer.render(this.parseInline(src, env), this.options, env);\n};\n\n\nmodule.exports = MarkdownIt;\n","'use strict';\n\n\nmodule.exports = require('./lib/');\n","\"use strict\";\n\n// Adapted from https://github.com/markdown-it/markdown-it/blob/fbc6b0fed563ba7c00557ab638fd19752f8e759d/docs/architecture.md\n\nfunction findFirstMatchingConfig(link, configs) {\n  var i, config;\n  var href = link.attrs[link.attrIndex(\"href\")][1];\n\n  for (i = 0; i < configs.length; ++i) {\n    config = configs[i];\n\n    // If there is a matcher function defined then call it\n    // Matcher Function should return a boolean indicating\n    // whether or not it matched. If it matched, use that\n    // configuration, otherwise, try the next one.\n    if (typeof config.matcher === \"function\") {\n      if (config.matcher(href, config)) {\n        return config;\n      } else {\n        continue;\n      }\n    }\n\n    return config;\n  }\n}\n\nfunction applyAttributes(idx, tokens, attributes) {\n  Object.keys(attributes).forEach(function (attr) {\n    var attrIndex;\n    var value = attributes[attr];\n\n    if (attr === \"className\") {\n      // when dealing with applying classes\n      // programatically, some programmers\n      // may prefer to use the className syntax\n      attr = \"class\";\n    }\n\n    attrIndex = tokens[idx].attrIndex(attr);\n\n    if (attrIndex < 0) {\n      // attr doesn't exist, add new attribute\n      tokens[idx].attrPush([attr, value]);\n    } else {\n      // attr already exists, overwrite it\n      tokens[idx].attrs[attrIndex][1] = value; // replace value of existing attr\n    }\n  });\n}\n\nfunction markdownitLinkAttributes(md, configs) {\n  if (!configs) {\n    configs = [];\n  } else {\n    configs = Array.isArray(configs) ? configs : [configs];\n  }\n\n  Object.freeze(configs);\n\n  var defaultRender = md.renderer.rules.link_open || this.defaultRender;\n\n  md.renderer.rules.link_open = function (tokens, idx, options, env, self) {\n    var config = findFirstMatchingConfig(tokens[idx], configs);\n    var attributes = config && config.attrs;\n\n    if (attributes) {\n      applyAttributes(idx, tokens, attributes);\n    }\n\n    // pass token to default renderer.\n    return defaultRender(tokens, idx, options, env, self);\n  };\n}\n\nmarkdownitLinkAttributes.defaultRender = function (\n  tokens,\n  idx,\n  options,\n  env,\n  self\n) {\n  return self.renderToken(tokens, idx, options);\n};\n\nmodule.exports = markdownitLinkAttributes;\n","// Process [@mention](mention://user/1/Pranav)\nconst USER_MENTIONS_REGEX = /mention:\\/\\/(user|team)\\/(\\d+)\\/(.+)/gm;\n\nconst buildMentionTokens = () => (state, silent) => {\n  var label;\n  var labelEnd;\n  var labelStart;\n  var pos;\n  var res;\n  var token;\n  var href = '';\n  var max = state.posMax;\n\n  if (state.src.charCodeAt(state.pos) !== 0x5b /* [ */) {\n    return false;\n  }\n\n  labelStart = state.pos + 1;\n  labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true);\n\n  // parser failed to find ']', so it's not a valid link\n  if (labelEnd < 0) {\n    return false;\n  }\n\n  label = state.src.slice(labelStart, labelEnd);\n  pos = labelEnd + 1;\n\n  if (pos < max && state.src.charCodeAt(pos) === 0x28 /* ( */) {\n    pos += 1;\n    res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);\n    if (res.ok) {\n      href = state.md.normalizeLink(res.str);\n      if (state.md.validateLink(href)) {\n        pos = res.pos;\n      } else {\n        href = '';\n      }\n    }\n    pos += 1;\n  }\n\n  if (!href.match(new RegExp(USER_MENTIONS_REGEX))) {\n    return false;\n  }\n\n  if (!silent) {\n    state.pos = labelStart;\n    state.posMax = labelEnd;\n\n    token = state.push('mention', '');\n    token.href = href;\n    token.content = label;\n  }\n\n  state.pos = pos;\n  state.posMax = max;\n\n  return true;\n};\n\nconst renderMentions = () => (tokens, idx) => {\n  return `<span class=\"prosemirror-mention-node\">${tokens[idx].content}</span>`;\n};\n\nexport default function mentionPlugin(md) {\n  md.renderer.rules.mention = renderMentions(md);\n  md.inline.ruler.before('link', 'mention', buildMentionTokens(md));\n}\n","import mila from 'markdown-it-link-attributes';\nimport mentionPlugin from './markdownIt/link';\nimport MarkdownIt from 'markdown-it';\n\nconst setImageHeight = inlineToken => {\n  const imgSrc = inlineToken.attrGet('src');\n  if (!imgSrc) return;\n  const url = new URL(imgSrc);\n  const height = url.searchParams.get('cw_image_height');\n  if (!height) return;\n  inlineToken.attrSet('style', `height: ${height};`);\n};\n\nconst processInlineToken = blockToken => {\n  blockToken.children.forEach(inlineToken => {\n    if (inlineToken.type === 'image') {\n      setImageHeight(inlineToken);\n    }\n  });\n};\n\nconst imgResizeManager = md => {\n  // Custom rule for image resize in markdown\n  // If the image url has a query param cw_image_height, then add a style attribute to the image\n  md.core.ruler.after('inline', 'add-image-height', state => {\n    state.tokens.forEach(blockToken => {\n      if (blockToken.type === 'inline') {\n        processInlineToken(blockToken);\n      }\n    });\n  });\n};\n\nconst createMarkdownInstance = (linkify = true) => {\n  return MarkdownIt({\n    html: false,\n    xhtmlOut: true,\n    breaks: true,\n    langPrefix: 'language-',\n    linkify,\n    typographer: true,\n    quotes: '\\u201c\\u201d\\u2018\\u2019',\n    maxNesting: 20,\n  })\n    .use(mentionPlugin)\n    .use(imgResizeManager)\n    .use(mila, {\n      attrs: {\n        class: 'link',\n        rel: 'noreferrer noopener nofollow',\n        target: '_blank',\n      },\n    });\n};\n\nconst TWITTER_USERNAME_REGEX = /(^|[^@\\w])@(\\w{1,15})\\b/g;\nconst TWITTER_USERNAME_REPLACEMENT = '$1[@$2](http://twitter.com/$2)';\nconst TWITTER_HASH_REGEX = /(^|\\s)#(\\w+)/g;\nconst TWITTER_HASH_REPLACEMENT = '$1[#$2](https://twitter.com/hashtag/$2)';\n\nclass MessageFormatter {\n  constructor(\n    message,\n    isATweet = false,\n    isAPrivateNote = false,\n    linkify = true\n  ) {\n    this.message = message || '';\n    this.isAPrivateNote = isAPrivateNote;\n    this.isATweet = isATweet;\n    this.linkify = linkify;\n    this.md = createMarkdownInstance(linkify);\n  }\n\n  formatMessage() {\n    let updatedMessage = this.message;\n    if (this.isATweet && !this.isAPrivateNote) {\n      updatedMessage = updatedMessage.replace(\n        TWITTER_USERNAME_REGEX,\n        TWITTER_USERNAME_REPLACEMENT\n      );\n      updatedMessage = updatedMessage.replace(\n        TWITTER_HASH_REGEX,\n        TWITTER_HASH_REPLACEMENT\n      );\n    }\n    return this.md.render(updatedMessage);\n  }\n\n  get formattedMessage() {\n    return this.formatMessage();\n  }\n\n  get plainText() {\n    const strippedOutHtml = new DOMParser().parseFromString(\n      this.formattedMessage,\n      'text/html'\n    );\n    return strippedOutHtml.body.textContent || '';\n  }\n}\n\nexport default MessageFormatter;\n","import MessageFormatter from '../helpers/MessageFormatter';\n\n/**\n * A composable providing utility functions for message formatting.\n *\n * @returns {Object} A set of functions for message formatting.\n */\nexport const useMessageFormatter = () => {\n  /**\n   * Formats a message based on specified conditions.\n   *\n   * @param {string} message - The message to be formatted.\n   * @param {boolean} isATweet - Whether the message is a tweet.\n   * @param {boolean} isAPrivateNote - Whether the message is a private note.\n   * @returns {string} - The formatted message.\n   */\n  // TODO: ref:https://github.com/chatwoot/chatwoot/pull/10725#discussion_r1925300874\n  const formatMessage = (message, isATweet, isAPrivateNote, linkify) => {\n    const messageFormatter = new MessageFormatter(\n      message,\n      isATweet,\n      isAPrivateNote,\n      linkify\n    );\n    return messageFormatter.formattedMessage;\n  };\n\n  /**\n   * Converts a message to plain text.\n   *\n   * @param {string} message - The message to be converted.\n   * @param {boolean} isATweet - Whether the message is a tweet.\n   * @returns {string} - The plain text message.\n   */\n  const getPlainText = (message, isATweet) => {\n    const messageFormatter = new MessageFormatter(message, isATweet);\n    return messageFormatter.plainText;\n  };\n\n  /**\n   * Truncates a description to a maximum length of 100 characters.\n   *\n   * @param {string} [description=''] - The description to be truncated.\n   * @returns {string} - The truncated description.\n   */\n  const truncateMessage = (description = '') => {\n    if (description.length < 100) {\n      return description;\n    }\n\n    return `${description.slice(0, 97)}...`;\n  };\n\n  /**\n   * Highlights occurrences of a search term within given content.\n   *\n   * @param {string} [content=''] - The content in which to search.\n   * @param {string} [searchTerm=''] - The term to search for.\n   * @param {string} [highlightClass=''] - The CSS class to apply to the highlighted term.\n   * @returns {string} - The content with highlighted terms.\n   */\n  const highlightContent = (\n    content = '',\n    searchTerm = '',\n    highlightClass = ''\n  ) => {\n    const plainTextContent = getPlainText(content);\n\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping\n    const escapedSearchTerm = searchTerm.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n    return plainTextContent.replace(\n      new RegExp(`(${escapedSearchTerm})`, 'ig'),\n      `<span class=\"${highlightClass}\">$1</span>`\n    );\n  };\n\n  return {\n    formatMessage,\n    getPlainText,\n    truncateMessage,\n    highlightContent,\n  };\n};\n","/*! @license DOMPurify 3.2.4 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.4/LICENSE */\n\nconst {\n  entries,\n  setPrototypeOf,\n  isFrozen,\n  getPrototypeOf,\n  getOwnPropertyDescriptor\n} = Object;\nlet {\n  freeze,\n  seal,\n  create\n} = Object; // eslint-disable-line import/no-mutable-exports\nlet {\n  apply,\n  construct\n} = typeof Reflect !== 'undefined' && Reflect;\nif (!freeze) {\n  freeze = function freeze(x) {\n    return x;\n  };\n}\nif (!seal) {\n  seal = function seal(x) {\n    return x;\n  };\n}\nif (!apply) {\n  apply = function apply(fun, thisValue, args) {\n    return fun.apply(thisValue, args);\n  };\n}\nif (!construct) {\n  construct = function construct(Func, args) {\n    return new Func(...args);\n  };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n  return function (thisArg) {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n    return apply(func, thisArg, args);\n  };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(func) {\n  return function () {\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n    return construct(func, args);\n  };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n  let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n  if (setPrototypeOf) {\n    // Make 'in' and truthy checks like Boolean(set.constructor)\n    // independent of any properties defined on Object.prototype.\n    // Prevent prototype setters from intercepting set as a this value.\n    setPrototypeOf(set, null);\n  }\n  let l = array.length;\n  while (l--) {\n    let element = array[l];\n    if (typeof element === 'string') {\n      const lcElement = transformCaseFunc(element);\n      if (lcElement !== element) {\n        // Config presets (e.g. tags.js, attrs.js) are immutable.\n        if (!isFrozen(array)) {\n          array[l] = lcElement;\n        }\n        element = lcElement;\n      }\n    }\n    set[element] = true;\n  }\n  return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n  for (let index = 0; index < array.length; index++) {\n    const isPropertyExist = objectHasOwnProperty(array, index);\n    if (!isPropertyExist) {\n      array[index] = null;\n    }\n  }\n  return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n  const newObject = create(null);\n  for (const [property, value] of entries(object)) {\n    const isPropertyExist = objectHasOwnProperty(object, property);\n    if (isPropertyExist) {\n      if (Array.isArray(value)) {\n        newObject[property] = cleanArray(value);\n      } else if (value && typeof value === 'object' && value.constructor === Object) {\n        newObject[property] = clone(value);\n      } else {\n        newObject[property] = value;\n      }\n    }\n  }\n  return newObject;\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n  while (object !== null) {\n    const desc = getOwnPropertyDescriptor(object, prop);\n    if (desc) {\n      if (desc.get) {\n        return unapply(desc.get);\n      }\n      if (typeof desc.value === 'function') {\n        return unapply(desc.value);\n      }\n    }\n    object = getPrototypeOf(object);\n  }\n  function fallbackValue() {\n    return null;\n  }\n  return fallbackValue;\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['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']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  ARIA_ATTR: ARIA_ATTR,\n  ATTR_WHITESPACE: ATTR_WHITESPACE,\n  CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n  DATA_ATTR: DATA_ATTR,\n  DOCTYPE_NAME: DOCTYPE_NAME,\n  ERB_EXPR: ERB_EXPR,\n  IS_ALLOWED_URI: IS_ALLOWED_URI,\n  IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n  MUSTACHE_EXPR: MUSTACHE_EXPR,\n  TMPLIT_EXPR: TMPLIT_EXPR\n});\n\n/* eslint-disable @typescript-eslint/indent */\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n  element: 1,\n  attribute: 2,\n  text: 3,\n  cdataSection: 4,\n  entityReference: 5,\n  // Deprecated\n  entityNode: 6,\n  // Deprecated\n  progressingInstruction: 7,\n  comment: 8,\n  document: 9,\n  documentType: 10,\n  documentFragment: 11,\n  notation: 12 // Deprecated\n};\nconst getGlobal = function getGlobal() {\n  return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n  if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n    return null;\n  }\n  // Allow the callers to control the unique policy name\n  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n  // Policy creation with duplicate names throws in Trusted Types.\n  let suffix = null;\n  const ATTR_NAME = 'data-tt-policy-suffix';\n  if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n    suffix = purifyHostElement.getAttribute(ATTR_NAME);\n  }\n  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n  try {\n    return trustedTypes.createPolicy(policyName, {\n      createHTML(html) {\n        return html;\n      },\n      createScriptURL(scriptUrl) {\n        return scriptUrl;\n      }\n    });\n  } catch (_) {\n    // Policy creation failed (most likely another DOMPurify script has\n    // already run). Skip creating the policy, as this will only cause errors\n    // if TT are enforced.\n    console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n    return null;\n  }\n};\nconst _createHooksMap = function _createHooksMap() {\n  return {\n    afterSanitizeAttributes: [],\n    afterSanitizeElements: [],\n    afterSanitizeShadowDOM: [],\n    beforeSanitizeAttributes: [],\n    beforeSanitizeElements: [],\n    beforeSanitizeShadowDOM: [],\n    uponSanitizeAttribute: [],\n    uponSanitizeElement: [],\n    uponSanitizeShadowNode: []\n  };\n};\nfunction createDOMPurify() {\n  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n  const DOMPurify = root => createDOMPurify(root);\n  DOMPurify.version = '3.2.4';\n  DOMPurify.removed = [];\n  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n    // Not running in a browser, provide a factory function\n    // so that you can pass your own Window\n    DOMPurify.isSupported = false;\n    return DOMPurify;\n  }\n  let {\n    document\n  } = window;\n  const originalDocument = document;\n  const currentScript = originalDocument.currentScript;\n  const {\n    DocumentFragment,\n    HTMLTemplateElement,\n    Node,\n    Element,\n    NodeFilter,\n    NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n    HTMLFormElement,\n    DOMParser,\n    trustedTypes\n  } = window;\n  const ElementPrototype = Element.prototype;\n  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n  const remove = lookupGetter(ElementPrototype, 'remove');\n  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n  const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n  // As per issue #47, the web-components registry is inherited by a\n  // new document created via createHTMLDocument. As per the spec\n  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n  // a new empty registry is used when creating a template contents owner\n  // document, so we use that as our parent document to ensure nothing\n  // is inherited.\n  if (typeof HTMLTemplateElement === 'function') {\n    const template = document.createElement('template');\n    if (template.content && template.content.ownerDocument) {\n      document = template.content.ownerDocument;\n    }\n  }\n  let trustedTypesPolicy;\n  let emptyHTML = '';\n  const {\n    implementation,\n    createNodeIterator,\n    createDocumentFragment,\n    getElementsByTagName\n  } = document;\n  const {\n    importNode\n  } = originalDocument;\n  let hooks = _createHooksMap();\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n  const {\n    MUSTACHE_EXPR,\n    ERB_EXPR,\n    TMPLIT_EXPR,\n    DATA_ATTR,\n    ARIA_ATTR,\n    IS_SCRIPT_OR_DATA,\n    ATTR_WHITESPACE,\n    CUSTOM_ELEMENT\n  } = EXPRESSIONS;\n  let {\n    IS_ALLOWED_URI: IS_ALLOWED_URI$1\n  } = EXPRESSIONS;\n  /**\n   * We consider the elements and attributes below to be safe. Ideally\n   * don't add any new ones but feel free to remove unwanted ones.\n   */\n  /* allowed element names */\n  let ALLOWED_TAGS = null;\n  const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n  /* Allowed attribute names */\n  let ALLOWED_ATTR = null;\n  const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n  /*\n   * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n   */\n  let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    allowCustomizedBuiltInElements: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: false\n    }\n  }));\n  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n  let FORBID_TAGS = null;\n  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n  let FORBID_ATTR = null;\n  /* Decide if ARIA attributes are okay */\n  let ALLOW_ARIA_ATTR = true;\n  /* Decide if custom data attributes are okay */\n  let ALLOW_DATA_ATTR = true;\n  /* Decide if unknown protocols are okay */\n  let ALLOW_UNKNOWN_PROTOCOLS = false;\n  /* Decide if self-closing tags in attributes are allowed.\n   * Usually removed due to a mXSS issue in jQuery 3.0 */\n  let ALLOW_SELF_CLOSE_IN_ATTR = true;\n  /* Output should be safe for common template engines.\n   * This means, DOMPurify removes data attributes, mustaches and ERB\n   */\n  let SAFE_FOR_TEMPLATES = false;\n  /* Output should be safe even for XML used within HTML and alike.\n   * This means, DOMPurify removes comments when containing risky content.\n   */\n  let SAFE_FOR_XML = true;\n  /* Decide if document with <html>... should be returned */\n  let WHOLE_DOCUMENT = false;\n  /* Track whether config is already set on this instance of DOMPurify. */\n  let SET_CONFIG = false;\n  /* Decide if all elements (e.g. style, script) must be children of\n   * document.body. By default, browsers might move them to document.head */\n  let FORCE_BODY = false;\n  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n   * string (or a TrustedHTML object if Trusted Types are supported).\n   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n   */\n  let RETURN_DOM = false;\n  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n   * string  (or a TrustedHTML object if Trusted Types are supported) */\n  let RETURN_DOM_FRAGMENT = false;\n  /* Try to return a Trusted Type object instead of a string, return a string in\n   * case Trusted Types are not supported  */\n  let RETURN_TRUSTED_TYPE = false;\n  /* Output should be free from DOM clobbering attacks?\n   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n   */\n  let SANITIZE_DOM = true;\n  /* Achieve full DOM Clobbering protection by isolating the namespace of named\n   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n   *\n   * HTML/DOM spec rules that enable DOM Clobbering:\n   *   - Named Access on Window (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.2.10.2)\n   *\n   * Namespace isolation is implemented by prefixing `id` and `name` attributes\n   * with a constant string, i.e., `user-content-`\n   */\n  let SANITIZE_NAMED_PROPS = false;\n  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n  /* Keep element content when removing element? */\n  let KEEP_CONTENT = true;\n  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n   * of importing it into a new Document and returning a sanitized copy */\n  let IN_PLACE = false;\n  /* Allow usage of profiles like html, svg and mathMl */\n  let USE_PROFILES = {};\n  /* Tags to ignore content of when KEEP_CONTENT is true */\n  let FORBID_CONTENTS = null;\n  const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n  /* Tags that are safe for data: URIs */\n  let DATA_URI_TAGS = null;\n  const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n  /* Attributes safe for values like \"javascript:\" */\n  let URI_SAFE_ATTRIBUTES = null;\n  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  /* Document namespace */\n  let NAMESPACE = HTML_NAMESPACE;\n  let IS_EMPTY_INPUT = false;\n  /* Allowed XHTML+XML namespaces */\n  let ALLOWED_NAMESPACES = null;\n  const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n  let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n  let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n  // Certain elements are allowed in both SVG and HTML\n  // namespace. We need to specify them explicitly\n  // so that they don't get erroneously deleted from\n  // HTML namespace.\n  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n  /* Parsing of strict XHTML documents */\n  let PARSER_MEDIA_TYPE = null;\n  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n  let transformCaseFunc = null;\n  /* Keep a reference to config to pass to hooks */\n  let CONFIG = null;\n  /* Ideally, do not touch anything below this line */\n  /* ______________________________________________ */\n  const formElement = document.createElement('form');\n  const isRegexOrFunction = function isRegexOrFunction(testValue) {\n    return testValue instanceof RegExp || testValue instanceof Function;\n  };\n  /**\n   * _parseConfig\n   *\n   * @param cfg optional config literal\n   */\n  // eslint-disable-next-line complexity\n  const _parseConfig = function _parseConfig() {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    if (CONFIG && CONFIG === cfg) {\n      return;\n    }\n    /* Shield configuration object from tampering */\n    if (!cfg || typeof cfg !== 'object') {\n      cfg = {};\n    }\n    /* Shield configuration object from prototype pollution */\n    cfg = clone(cfg);\n    PARSER_MEDIA_TYPE =\n    // eslint-disable-next-line unicorn/prefer-includes\n    SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n    // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n    transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n    /* Set configuration parameters */\n    ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n    ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n    ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n    URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n    DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n    FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n    FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};\n    FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};\n    USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\n    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n    SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n    RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n    FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n    IN_PLACE = cfg.IN_PLACE || false; // Default false\n    IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n    MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS;\n    HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS;\n    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n    }\n    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n    }\n    if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n    }\n    if (SAFE_FOR_TEMPLATES) {\n      ALLOW_DATA_ATTR = false;\n    }\n    if (RETURN_DOM_FRAGMENT) {\n      RETURN_DOM = true;\n    }\n    /* Parse profile info */\n    if (USE_PROFILES) {\n      ALLOWED_TAGS = addToSet({}, text);\n      ALLOWED_ATTR = [];\n      if (USE_PROFILES.html === true) {\n        addToSet(ALLOWED_TAGS, html$1);\n        addToSet(ALLOWED_ATTR, html);\n      }\n      if (USE_PROFILES.svg === true) {\n        addToSet(ALLOWED_TAGS, svg$1);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.svgFilters === true) {\n        addToSet(ALLOWED_TAGS, svgFilters);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.mathMl === true) {\n        addToSet(ALLOWED_TAGS, mathMl$1);\n        addToSet(ALLOWED_ATTR, mathMl);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n    }\n    /* Merge configuration parameters */\n    if (cfg.ADD_TAGS) {\n      if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n        ALLOWED_TAGS = clone(ALLOWED_TAGS);\n      }\n      addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n    }\n    if (cfg.ADD_ATTR) {\n      if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n        ALLOWED_ATTR = clone(ALLOWED_ATTR);\n      }\n      addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n    }\n    if (cfg.ADD_URI_SAFE_ATTR) {\n      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n    }\n    if (cfg.FORBID_CONTENTS) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n    }\n    /* Add #text in case KEEP_CONTENT is set to true */\n    if (KEEP_CONTENT) {\n      ALLOWED_TAGS['#text'] = true;\n    }\n    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n    if (WHOLE_DOCUMENT) {\n      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n    }\n    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n    if (ALLOWED_TAGS.table) {\n      addToSet(ALLOWED_TAGS, ['tbody']);\n      delete FORBID_TAGS.tbody;\n    }\n    if (cfg.TRUSTED_TYPES_POLICY) {\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n      }\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n      }\n      // Overwrite existing TrustedTypes policy.\n      trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n      // Sign local variables required by `sanitize`.\n      emptyHTML = trustedTypesPolicy.createHTML('');\n    } else {\n      // Uninitialized policy, attempt to initialize the internal dompurify policy.\n      if (trustedTypesPolicy === undefined) {\n        trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n      }\n      // If creating the internal policy succeeded sign internal variables.\n      if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n        emptyHTML = trustedTypesPolicy.createHTML('');\n      }\n    }\n    // Prevent further manipulation of configuration.\n    // Not available in IE8, Safari 5, etc.\n    if (freeze) {\n      freeze(cfg);\n    }\n    CONFIG = cfg;\n  };\n  /* Keep track of all possible SVG and MathML tags\n   * so that we can perform the namespace checks\n   * correctly. */\n  const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n  const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n  /**\n   * @param element a DOM element whose namespace is being checked\n   * @returns Return false if the element has a\n   *  namespace that a spec-compliant parser would never\n   *  return. Return true otherwise.\n   */\n  const _checkValidNamespace = function _checkValidNamespace(element) {\n    let parent = getParentNode(element);\n    // In JSDOM, if we're inside shadow DOM, then parentNode\n    // can be null. We just simulate parent in this case.\n    if (!parent || !parent.tagName) {\n      parent = {\n        namespaceURI: NAMESPACE,\n        tagName: 'template'\n      };\n    }\n    const tagName = stringToLowerCase(element.tagName);\n    const parentTagName = stringToLowerCase(parent.tagName);\n    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return false;\n    }\n    if (element.namespaceURI === SVG_NAMESPACE) {\n      // The only way to switch from HTML namespace to SVG\n      // is via <svg>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === 'svg';\n      }\n      // The only way to switch from MathML to SVG is via`\n      // svg if parent is either <annotation-xml> or MathML\n      // text integration points.\n      if (parent.namespaceURI === MATHML_NAMESPACE) {\n        return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n      }\n      // We only allow elements that are defined in SVG\n      // spec. All others are disallowed in SVG namespace.\n      return Boolean(ALL_SVG_TAGS[tagName]);\n    }\n    if (element.namespaceURI === MATHML_NAMESPACE) {\n      // The only way to switch from HTML namespace to MathML\n      // is via <math>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === 'math';\n      }\n      // The only way to switch from SVG to MathML is via\n      // <math> and HTML integration points\n      if (parent.namespaceURI === SVG_NAMESPACE) {\n        return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n      }\n      // We only allow elements that are defined in MathML\n      // spec. All others are disallowed in MathML namespace.\n      return Boolean(ALL_MATHML_TAGS[tagName]);\n    }\n    if (element.namespaceURI === HTML_NAMESPACE) {\n      // The only way to switch from SVG to HTML is via\n      // HTML integration points, and from MathML to HTML\n      // is via MathML text integration points\n      if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n        return false;\n      }\n      if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n        return false;\n      }\n      // We disallow tags that are specific for MathML\n      // or SVG and should never appear in HTML namespace\n      return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n    }\n    // For XHTML and XML documents that support custom namespaces\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return true;\n    }\n    // The code should never reach this place (this means\n    // that the element somehow got namespace that is not\n    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n    // Return false just in case.\n    return false;\n  };\n  /**\n   * _forceRemove\n   *\n   * @param node a DOM node\n   */\n  const _forceRemove = function _forceRemove(node) {\n    arrayPush(DOMPurify.removed, {\n      element: node\n    });\n    try {\n      // eslint-disable-next-line unicorn/prefer-dom-node-remove\n      getParentNode(node).removeChild(node);\n    } catch (_) {\n      remove(node);\n    }\n  };\n  /**\n   * _removeAttribute\n   *\n   * @param name an Attribute name\n   * @param element a DOM node\n   */\n  const _removeAttribute = function _removeAttribute(name, element) {\n    try {\n      arrayPush(DOMPurify.removed, {\n        attribute: element.getAttributeNode(name),\n        from: element\n      });\n    } catch (_) {\n      arrayPush(DOMPurify.removed, {\n        attribute: null,\n        from: element\n      });\n    }\n    element.removeAttribute(name);\n    // We void attribute values for unremovable \"is\" attributes\n    if (name === 'is') {\n      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n        try {\n          _forceRemove(element);\n        } catch (_) {}\n      } else {\n        try {\n          element.setAttribute(name, '');\n        } catch (_) {}\n      }\n    }\n  };\n  /**\n   * _initDocument\n   *\n   * @param dirty - a string of dirty markup\n   * @return a DOM, filled with the dirty markup\n   */\n  const _initDocument = function _initDocument(dirty) {\n    /* Create a HTML document */\n    let doc = null;\n    let leadingWhitespace = null;\n    if (FORCE_BODY) {\n      dirty = '<remove></remove>' + dirty;\n    } else {\n      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n      const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n      leadingWhitespace = matches && matches[0];\n    }\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n      dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n    }\n    const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n    /*\n     * Use the DOMParser API by default, fallback later if needs be\n     * DOMParser not work for svg when has multiple root element.\n     */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      try {\n        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n      } catch (_) {}\n    }\n    /* Use createHTMLDocument in case DOMParser is not available */\n    if (!doc || !doc.documentElement) {\n      doc = implementation.createDocument(NAMESPACE, 'template', null);\n      try {\n        doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n      } catch (_) {\n        // Syntax error if dirtyPayload is invalid xml\n      }\n    }\n    const body = doc.body || doc.documentElement;\n    if (dirty && leadingWhitespace) {\n      body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n    }\n    /* Work on whole document or just its body */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n    }\n    return WHOLE_DOCUMENT ? doc.documentElement : body;\n  };\n  /**\n   * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n   *\n   * @param root The root element or node to start traversing on.\n   * @return The created NodeIterator\n   */\n  const _createNodeIterator = function _createNodeIterator(root) {\n    return createNodeIterator.call(root.ownerDocument || root, root,\n    // eslint-disable-next-line no-bitwise\n    NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n  };\n  /**\n   * _isClobbered\n   *\n   * @param element element to check for clobbering attacks\n   * @return true if clobbered, false if safe\n   */\n  const _isClobbered = function _isClobbered(element) {\n    return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n  };\n  /**\n   * Checks whether the given object is a DOM node.\n   *\n   * @param value object to check whether it's a DOM node\n   * @return true is object is a DOM node\n   */\n  const _isNode = function _isNode(value) {\n    return typeof Node === 'function' && value instanceof Node;\n  };\n  function _executeHooks(hooks, currentNode, data) {\n    arrayForEach(hooks, hook => {\n      hook.call(DOMPurify, currentNode, data, CONFIG);\n    });\n  }\n  /**\n   * _sanitizeElements\n   *\n   * @protect nodeName\n   * @protect textContent\n   * @protect removeChild\n   * @param currentNode to check for permission to exist\n   * @return true if node was killed, false if left alive\n   */\n  const _sanitizeElements = function _sanitizeElements(currentNode) {\n    let content = null;\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n    /* Check if element is clobbered or can clobber */\n    if (_isClobbered(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Now let's check the element's type and name */\n    const tagName = transformCaseFunc(currentNode.nodeName);\n    /* Execute a hook if present */\n    _executeHooks(hooks.uponSanitizeElement, currentNode, {\n      tagName,\n      allowedTags: ALLOWED_TAGS\n    });\n    /* Detect mXSS attempts abusing namespace confusion */\n    if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w]/g, currentNode.innerHTML) && regExpTest(/<[/\\w]/g, currentNode.textContent)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any occurrence of processing instructions */\n    if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any kind of possibly harmful comments */\n    if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove element if anything forbids its presence */\n    if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n      /* Check if we have a custom element to handle */\n      if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n          return false;\n        }\n        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n          return false;\n        }\n      }\n      /* Keep content except for bad-listed elements */\n      if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n        const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n        const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n        if (childNodes && parentNode) {\n          const childCount = childNodes.length;\n          for (let i = childCount - 1; i >= 0; --i) {\n            const childClone = cloneNode(childNodes[i], true);\n            childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n            parentNode.insertBefore(childClone, getNextSibling(currentNode));\n          }\n        }\n      }\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Check whether element has a valid namespace */\n    if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Make sure that older browsers don't get fallback-tag mXSS */\n    if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Sanitize element content to be template-safe */\n    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n      /* Get the element's text content */\n      content = currentNode.textContent;\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n        content = stringReplace(content, expr, ' ');\n      });\n      if (currentNode.textContent !== content) {\n        arrayPush(DOMPurify.removed, {\n          element: currentNode.cloneNode()\n        });\n        currentNode.textContent = content;\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n    return false;\n  };\n  /**\n   * _isValidAttribute\n   *\n   * @param lcTag Lowercase tag name of containing element.\n   * @param lcName Lowercase attribute name.\n   * @param value Attribute value.\n   * @return Returns true if `value` is valid, otherwise false.\n   */\n  // eslint-disable-next-line complexity\n  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n    /* Make sure attribute cannot clobber */\n    if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n      return false;\n    }\n    /* Allow valid data-* attributes: At least one character after \"-\"\n        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n        We don't need to check the value; it's always URI safe. */\n    if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n      if (\n      // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n      // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n      _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) ||\n      // Alternative, second condition checks if it's an `is`-attribute, AND\n      // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n        return false;\n      }\n      /* Check value is safe. First, is attr inert? If so, is safe */\n    } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n      return false;\n    } else ;\n    return true;\n  };\n  /**\n   * _isBasicCustomElement\n   * checks if at least one dash is included in tagName, and it's not the first char\n   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n   *\n   * @param tagName name of the tag of the node to sanitize\n   * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n   */\n  const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n    return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);\n  };\n  /**\n   * _sanitizeAttributes\n   *\n   * @protect attributes\n   * @protect nodeName\n   * @protect removeAttribute\n   * @protect setAttribute\n   *\n   * @param currentNode to sanitize\n   */\n  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n    const {\n      attributes\n    } = currentNode;\n    /* Check if we have attributes; if not we might have a text node */\n    if (!attributes || _isClobbered(currentNode)) {\n      return;\n    }\n    const hookEvent = {\n      attrName: '',\n      attrValue: '',\n      keepAttr: true,\n      allowedAttributes: ALLOWED_ATTR,\n      forceKeepAttr: undefined\n    };\n    let l = attributes.length;\n    /* Go backwards over all attributes; safely remove bad ones */\n    while (l--) {\n      const attr = attributes[l];\n      const {\n        name,\n        namespaceURI,\n        value: attrValue\n      } = attr;\n      const lcName = transformCaseFunc(name);\n      let value = name === 'value' ? attrValue : stringTrim(attrValue);\n      /* Execute a hook if present */\n      hookEvent.attrName = lcName;\n      hookEvent.attrValue = value;\n      hookEvent.keepAttr = true;\n      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n      _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n      value = hookEvent.attrValue;\n      /* Full DOM Clobbering protection via namespace isolation,\n       * Prefix id and name attributes with `user-content-`\n       */\n      if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n        // Remove the attribute with this value\n        _removeAttribute(name, currentNode);\n        // Prefix the value and later re-create the attribute with the sanitized value\n        value = SANITIZE_NAMED_PROPS_PREFIX + value;\n      }\n      /* Work around a security issue with comments inside attributes */\n      if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title)/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (hookEvent.forceKeepAttr) {\n        continue;\n      }\n      /* Remove attribute */\n      _removeAttribute(name, currentNode);\n      /* Did the hooks approve of the attribute? */\n      if (!hookEvent.keepAttr) {\n        continue;\n      }\n      /* Work around a security issue in jQuery 3.0 */\n      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Sanitize attribute content to be template-safe */\n      if (SAFE_FOR_TEMPLATES) {\n        arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n          value = stringReplace(value, expr, ' ');\n        });\n      }\n      /* Is `value` valid for this attribute? */\n      const lcTag = transformCaseFunc(currentNode.nodeName);\n      if (!_isValidAttribute(lcTag, lcName, value)) {\n        continue;\n      }\n      /* Handle attributes that require Trusted Types */\n      if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n        if (namespaceURI) ; else {\n          switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n            case 'TrustedHTML':\n              {\n                value = trustedTypesPolicy.createHTML(value);\n                break;\n              }\n            case 'TrustedScriptURL':\n              {\n                value = trustedTypesPolicy.createScriptURL(value);\n                break;\n              }\n          }\n        }\n      }\n      /* Handle invalid data-* attribute set by try-catching it */\n      try {\n        if (namespaceURI) {\n          currentNode.setAttributeNS(namespaceURI, name, value);\n        } else {\n          /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n          currentNode.setAttribute(name, value);\n        }\n        if (_isClobbered(currentNode)) {\n          _forceRemove(currentNode);\n        } else {\n          arrayPop(DOMPurify.removed);\n        }\n      } catch (_) {}\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n  };\n  /**\n   * _sanitizeShadowDOM\n   *\n   * @param fragment to iterate over recursively\n   */\n  const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n    let shadowNode = null;\n    const shadowIterator = _createNodeIterator(fragment);\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n    while (shadowNode = shadowIterator.nextNode()) {\n      /* Execute a hook if present */\n      _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n      /* Sanitize tags and elements */\n      _sanitizeElements(shadowNode);\n      /* Check attributes next */\n      _sanitizeAttributes(shadowNode);\n      /* Deep shadow DOM detected */\n      if (shadowNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM(shadowNode.content);\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n  };\n  // eslint-disable-next-line complexity\n  DOMPurify.sanitize = function (dirty) {\n    let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let body = null;\n    let importedNode = null;\n    let currentNode = null;\n    let returnNode = null;\n    /* Make sure we have a string to sanitize.\n      DO NOT return early, as this will return the wrong type if\n      the user has requested a DOM object rather than a string */\n    IS_EMPTY_INPUT = !dirty;\n    if (IS_EMPTY_INPUT) {\n      dirty = '<!-->';\n    }\n    /* Stringify, in case dirty is an object */\n    if (typeof dirty !== 'string' && !_isNode(dirty)) {\n      if (typeof dirty.toString === 'function') {\n        dirty = dirty.toString();\n        if (typeof dirty !== 'string') {\n          throw typeErrorCreate('dirty is not a string, aborting');\n        }\n      } else {\n        throw typeErrorCreate('toString is not a function');\n      }\n    }\n    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\n      return dirty;\n    }\n    /* Assign config vars */\n    if (!SET_CONFIG) {\n      _parseConfig(cfg);\n    }\n    /* Clean up removed elements */\n    DOMPurify.removed = [];\n    /* Check if dirty is correctly typed for IN_PLACE */\n    if (typeof dirty === 'string') {\n      IN_PLACE = false;\n    }\n    if (IN_PLACE) {\n      /* Do some early pre-sanitization to avoid unsafe root nodes */\n      if (dirty.nodeName) {\n        const tagName = transformCaseFunc(dirty.nodeName);\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n        }\n      }\n    } else if (dirty instanceof Node) {\n      /* If dirty is a DOM element, append to an empty document to avoid\n         elements being stripped by the parser */\n      body = _initDocument('<!---->');\n      importedNode = body.ownerDocument.importNode(dirty, true);\n      if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n        /* Node is already a body, use as is */\n        body = importedNode;\n      } else if (importedNode.nodeName === 'HTML') {\n        body = importedNode;\n      } else {\n        // eslint-disable-next-line unicorn/prefer-dom-node-append\n        body.appendChild(importedNode);\n      }\n    } else {\n      /* Exit directly if we have nothing to do */\n      if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n      // eslint-disable-next-line unicorn/prefer-includes\n      dirty.indexOf('<') === -1) {\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n      }\n      /* Initialize the document to work on */\n      body = _initDocument(dirty);\n      /* Check we have a DOM node from the data */\n      if (!body) {\n        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n      }\n    }\n    /* Remove first element node (ours) if FORCE_BODY is set */\n    if (body && FORCE_BODY) {\n      _forceRemove(body.firstChild);\n    }\n    /* Get node iterator */\n    const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n    /* Now start iterating over the created document */\n    while (currentNode = nodeIterator.nextNode()) {\n      /* Sanitize tags and elements */\n      _sanitizeElements(currentNode);\n      /* Check attributes next */\n      _sanitizeAttributes(currentNode);\n      /* Shadow DOM detected, sanitize it */\n      if (currentNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM(currentNode.content);\n      }\n    }\n    /* If we sanitized `dirty` in-place, return it. */\n    if (IN_PLACE) {\n      return dirty;\n    }\n    /* Return sanitized string or DOM */\n    if (RETURN_DOM) {\n      if (RETURN_DOM_FRAGMENT) {\n        returnNode = createDocumentFragment.call(body.ownerDocument);\n        while (body.firstChild) {\n          // eslint-disable-next-line unicorn/prefer-dom-node-append\n          returnNode.appendChild(body.firstChild);\n        }\n      } else {\n        returnNode = body;\n      }\n      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n        /*\n          AdoptNode() is not used because internal state is not reset\n          (e.g. the past names map of a HTMLFormElement), this is safe\n          in theory but we would rather not risk another attack vector.\n          The state that is cloned by importNode() is explicitly defined\n          by the specs.\n        */\n        returnNode = importNode.call(originalDocument, returnNode, true);\n      }\n      return returnNode;\n    }\n    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n    /* Serialize doctype if allowed */\n    if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n      serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n    }\n    /* Sanitize final string template-safe */\n    if (SAFE_FOR_TEMPLATES) {\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n        serializedHTML = stringReplace(serializedHTML, expr, ' ');\n      });\n    }\n    return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n  };\n  DOMPurify.setConfig = function () {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    _parseConfig(cfg);\n    SET_CONFIG = true;\n  };\n  DOMPurify.clearConfig = function () {\n    CONFIG = null;\n    SET_CONFIG = false;\n  };\n  DOMPurify.isValidAttribute = function (tag, attr, value) {\n    /* Initialize shared config vars if necessary. */\n    if (!CONFIG) {\n      _parseConfig({});\n    }\n    const lcTag = transformCaseFunc(tag);\n    const lcName = transformCaseFunc(attr);\n    return _isValidAttribute(lcTag, lcName, value);\n  };\n  DOMPurify.addHook = function (entryPoint, hookFunction) {\n    if (typeof hookFunction !== 'function') {\n      return;\n    }\n    arrayPush(hooks[entryPoint], hookFunction);\n  };\n  DOMPurify.removeHook = function (entryPoint, hookFunction) {\n    if (hookFunction !== undefined) {\n      const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n      return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n    }\n    return arrayPop(hooks[entryPoint]);\n  };\n  DOMPurify.removeHooks = function (entryPoint) {\n    hooks[entryPoint] = [];\n  };\n  DOMPurify.removeAllHooks = function () {\n    hooks = _createHooksMap();\n  };\n  return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n","import l from \"dompurify\";\nfunction m(t, e) {\n  const o = t.hooks ?? {};\n  let n;\n  for (n in o) {\n    const u = o[n];\n    u !== void 0 && e.addHook(n, u);\n  }\n}\nfunction c() {\n  return l();\n}\nfunction p(t = {}, e = c) {\n  const o = e();\n  m(t, o);\n  const n = function(u, i) {\n    const r = i.value;\n    if (i.oldValue === r)\n      return;\n    const a = `${r}`, s = i.arg, d = t.namedConfigurations, f = t.default ?? {};\n    if (d && s !== void 0) {\n      u.innerHTML = o.sanitize(\n        a,\n        d[s] ?? f\n      );\n      return;\n    }\n    u.innerHTML = o.sanitize(\n      a,\n      f\n    );\n  };\n  return {\n    mounted: n,\n    updated: n\n  };\n}\nconst k = {\n  install(t, e = {}, o = c) {\n    t.directive(\n      \"dompurify-html\",\n      p(e, o)\n    );\n  }\n};\nexport {\n  p as buildVueDompurifyHTMLDirective,\n  k as default,\n  k as vueDompurifyHTMLPlugin\n};\n"],"names":["regex","re","opts","require$$0","require$$1","require$$2","require$$3","text_separators","assign","obj","sources","source","key","_class","isString","isObject","isRegExp","isFunction","escapeRE","str","defaultOptions","isOptionsObj","acc","k","defaultSchemas","text","pos","self","tail","tlds_2ch_src_re","tlds_default","resetScanCache","createValidator","createNormalizer","match","compile","tlds","untpl","tpl","aliases","schemaError","name","val","compiled","alias","slist","Match","shift","start","end","createMatch","LinkifyIt","schemas","options","schema","definition","m","ml","me","len","next","tld_pos","at_pos","result","list","keepOld","el","idx","arr","linkifyIt","entities","encodeCache","getEncodeCache","exclude","i","ch","cache","encode","string","keepEscaped","l","code","nextCode","encode_1","decodeCache","getDecodeCache","decode","seq","b1","b2","b3","b4","chr","decode_1","format","url","Url","protocolPattern","portPattern","simplePathPattern","delims","unwise","autoEscape","nonHostChars","hostEndingChars","hostnameMaxLen","hostnamePartPattern","hostnamePartStart","hostlessProtocol","slashedProtocol","urlParse","slashesDenoteHost","u","lowerProto","hec","slashes","rest","simplePath","proto","hostEnd","auth","atSign","host","ipv6Hostname","hostparts","part","newpart","j","validParts","notHost","bit","hash","qm","port","parse","mdurl","uc_micro","require$$4","_hasOwnProperty","has","object","arrayReplaceAt","src","newElements","isValidEntityCode","c","fromCodePoint","surrogate1","surrogate2","UNESCAPE_MD_RE","ENTITY_RE","UNESCAPE_ALL_RE","DIGITAL_ENTITY_TEST_RE","replaceEntityPattern","unescapeMd","unescapeAll","escaped","entity","HTML_ESCAPE_TEST_RE","HTML_ESCAPE_REPLACE_RE","HTML_REPLACEMENTS","replaceUnsafeChar","escapeHtml","REGEXP_ESCAPE_RE","isSpace","isWhiteSpace","UNICODE_PUNCT_RE","isPunctChar","isMdAsciiPunct","normalizeReference","exports","parse_link_label","state","disableNested","level","found","marker","prevPos","labelEnd","max","oldPos","parse_link_destination","parse_link_title","lines","helpers","default_rules","tokens","env","slf","token","info","langName","langAttrs","highlighted","tmpAttrs","tmpToken","Renderer","nextToken","needLf","type","rules","renderer","Ruler","chains","rule","altName","chain","fn","index","opt","beforeName","ruleName","afterName","ignoreInvalid","chainName","ruler","NEWLINES_RE","NULL_RE","normalize","block","inline","tok","isLinkOpen","isLinkClose","linkify","currentToken","nodes","ln","lastPos","htmlLinkLevel","fullUrl","urlText","blockTokens","links","RARE_RE","SCOPED_ABBR_TEST_RE","SCOPED_ABBR_RE","SCOPED_ABBR","replaceFn","replace_scoped","inlineTokens","inside_autolink","replace_rare","replacements","blkIdx","QUOTE_TEST_RE","QUOTE_RE","APOSTROPHE","replaceAt","process_inlines","t","thisLevel","item","lastChar","nextChar","isLastPunctChar","isNextPunctChar","isLastWhiteSpace","isNextWhiteSpace","canOpen","canClose","isSingle","stack","openQuote","closeQuote","OUTER","smartquotes","text_join","curr","last","Token","tag","nesting","attrs","attrData","value","StateCore","md","state_core","_rules","require$$5","require$$6","require$$7","Core","require$$8","parser_core","getLine","line","escapedSplit","isEscaped","current","table","startLine","endLine","silent","lineText","nextLine","columns","columnCount","aligns","tableLines","tbodyLines","oldParentType","terminate","terminatorRules","firstCh","secondCh","fence","params","mem","markup","haveEndMarker","blockquote","adjustTab","initial","lastLineEmpty","offset","oldBMarks","oldBSCount","oldIndent","oldSCount","oldTShift","spaceAfterMarker","isOutdented","oldLineMax","hr","cnt","skipBulletListMarker","skipOrderedListMarker","markTightParagraphs","contentStart","indent","indentAfterMarker","isOrdered","itemLines","listLines","listTokIdx","markerCharCode","markerValue","oldListIndent","oldTight","posAfterMarker","prevEmptyEnd","isTerminatingParagraph","tight","reference","_endLine","destEndPos","destEndLineNo","href","label","res","title","html_blocks","attr_name","unquoted","single_quoted","double_quoted","attr_value","attribute","open_tag","close_tag","comment","processing","declaration","cdata","HTML_TAG_RE","HTML_OPEN_CLOSE_TAG_RE","html_re","block_names","HTML_SEQUENCES","html_block","heading","tmp","lheading","content","paragraph","StateBlock","indent_found","from","min","begin","keepLastLF","lineIndent","first","queue","lineStart","state_block","require$$9","require$$10","require$$11","ParserBlock","ok","prevLine","hasEmptyLines","maxNesting","outTokens","require$$12","parser_block","isTerminatorChar","SCHEME_RE","link","newline","pmax","ws","ESCAPED","_escape","ch1","ch2","origStr","escapedStr","backticks","matchStart","matchEnd","openerLength","closerLength","strikethrough","scanned","postProcess","delimiters","startDelim","endDelim","loneMarkers","tokens_meta","emphasis","isStrong","labelStart","ref","parseReference","image","EMAIL_RE","AUTOLINK_RE","autolink","isLetter","lc","html_inline","DIGITAL_RE","NAMED_RE","processDelimiters","closerIdx","openerIdx","closer","opener","minOpenerIdx","newMinOpenerIdx","isOddMatch","lastJump","openersBottom","headerIdx","lastTokenIdx","jumps","balance_pairs","fragments_join","StateInline","token_meta","canSplitWord","count","can_open","can_close","left_flanking","right_flanking","state_inline","_rules2","require$$13","require$$14","ParserInline","require$$15","parser_inline","maxInt","base","tMin","tMax","skew","damp","initialBias","initialN","delimiter","regexPunycode","regexNonASCII","regexSeparators","errors","baseMinusTMin","floor","stringFromCharCode","error","map","array","callback","length","mapDomain","domain","parts","labels","encoded","ucs2decode","output","counter","extra","ucs2encode","codePoints","basicToDigit","codePoint","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","input","inputLength","n","bias","basic","oldi","w","baseMinusT","out","currentValue","basicLength","handledCPCount","handledCPCountPlusOne","q","qMinusT","toUnicode","toASCII","punycode","_default","zero","commonmark","utils","ParserCore","config","BAD_PROTO_RE","GOOD_DATA_RE","validateLink","RECODE_HOSTNAME_FOR","normalizeLink","parsed","normalizeLinkText","MarkdownIt","presetName","presets","missed","plugin","args","lib","markdownIt","findFirstMatchingConfig","configs","applyAttributes","attributes","attr","attrIndex","markdownitLinkAttributes","defaultRender","markdownItLinkAttributes","USER_MENTIONS_REGEX","buildMentionTokens","renderMentions","mentionPlugin","setImageHeight","inlineToken","imgSrc","height","processInlineToken","blockToken","imgResizeManager","createMarkdownInstance","mila","TWITTER_USERNAME_REGEX","TWITTER_USERNAME_REPLACEMENT","TWITTER_HASH_REGEX","TWITTER_HASH_REPLACEMENT","MessageFormatter","message","isATweet","isAPrivateNote","updatedMessage","useMessageFormatter","formatMessage","getPlainText","description","searchTerm","highlightClass","plainTextContent","escapedSearchTerm","entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","freeze","seal","create","apply","construct","x","fun","thisValue","Func","arrayForEach","unapply","arrayLastIndexOf","arrayPop","arrayPush","arraySplice","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","objectHasOwnProperty","regExpTest","typeErrorCreate","unconstruct","func","thisArg","_len","_key","_len2","_key2","addToSet","set","transformCaseFunc","element","lcElement","cleanArray","clone","newObject","property","lookupGetter","prop","desc","fallbackValue","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","html","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","EXPRESSIONS","NODE_TYPE","getGlobal","_createTrustedTypesPolicy","trustedTypes","purifyHostElement","suffix","ATTR_NAME","policyName","scriptUrl","_createHooksMap","createDOMPurify","window","DOMPurify","root","document","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","remove","getNextSibling","getChildNodes","getParentNode","template","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","FORBID_TAGS","FORBID_ATTR","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","_parseConfig","cfg","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parent","tagName","parentTagName","_forceRemove","node","_removeAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","body","_createNodeIterator","_isClobbered","_isNode","_executeHooks","currentNode","data","hook","_sanitizeElements","_isBasicCustomElement","parentNode","childNodes","childCount","childClone","expr","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","hookEvent","namespaceURI","attrValue","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","importedNode","returnNode","nodeIterator","serializedHTML","entryPoint","hookFunction","purify","e","o","p","r","a","s","d"],"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,57,58,59,60,61,62,63,64,65,66,67,68,72,73]}