{"version":3,"file":"index.mjs","names":[],"sources":["../../src/legacy/index.ts"],"sourcesContent":["/**\n * sanitize-html: zero-dependency TypeScript rewrite.\n * Public API matches the original (apostrophecms/sanitize-html).\n */\n\n// =============================================================================\n// Public types\n// =============================================================================\n\nexport type Attributes = Record<string, string>;\n\nexport interface AllowedAttributeObject {\n  name: string;\n  multiple?: boolean;\n  values: string[];\n}\n\nexport type AllowedAttribute = string | AllowedAttributeObject;\n\nexport type DisallowedTagsMode =\n  | 'discard'\n  | 'escape'\n  | 'recursiveEscape'\n  | 'completelyDiscard';\n\nexport interface IFrame {\n  tag: string;\n  attribs: Attributes;\n  text: string;\n  tagPosition: number;\n  mediaChildren: string[];\n  /** Set by transformTags when the transformer returns `text`. */\n  innerText?: string;\n  /** Set when the transformer changed the tag name. */\n  name?: string;\n}\n\nexport interface TransformResult {\n  tagName: string;\n  attribs: Attributes;\n  text?: string;\n}\n\nexport type Transformer = (\n  tagName: string,\n  attribs: Attributes\n) => TransformResult;\n\nexport interface ParserOptions {\n  decodeEntities?: boolean;\n  lowerCaseTags?: boolean;\n  lowerCaseAttributeNames?: boolean;\n}\n\nexport interface AllowedStyles {\n  [tagOrStar: string]: { [property: string]: RegExp[] };\n}\n\nexport interface IOptions {\n  allowedTags?: string[] | false | null;\n  disallowedTagsMode?: DisallowedTagsMode;\n  allowedAttributes?: Record<string, AllowedAttribute[]> | false | null;\n  allowedClasses?: Record<string, Array<string | RegExp> | false>;\n  allowedStyles?: AllowedStyles;\n  allowedSchemes?: string[];\n  allowedSchemesByTag?: Record<string, string[]>;\n  allowedSchemesAppliedToAttributes?: string[];\n  allowProtocolRelative?: boolean;\n  allowedIframeHostnames?: string[];\n  allowedIframeDomains?: string[];\n  allowIframeRelativeUrls?: boolean;\n  allowedScriptHostnames?: string[];\n  allowedScriptDomains?: string[];\n  allowVulnerableTags?: boolean;\n  enforceHtmlBoundary?: boolean;\n  parseStyleAttributes?: boolean;\n  preserveEscapedAttributes?: boolean;\n  selfClosing?: string[];\n  nonTextTags?: string[];\n  nonBooleanAttributes?: string[];\n  allowedEmptyAttributes?: string[];\n  transformTags?: Record<string, string | Transformer>;\n  textFilter?: (text: string, tagName?: string) => string;\n  exclusiveFilter?: (frame: IFrame) => boolean | 'excludeTag';\n  onOpenTag?: (name: string, attribs: Attributes) => void;\n  onCloseTag?: (name: string, isImplied: boolean) => void;\n  nestingLimit?: number;\n  parser?: ParserOptions;\n}\n\nexport interface Defaults {\n  allowedTags: string[];\n  nonBooleanAttributes: string[];\n  disallowedTagsMode: DisallowedTagsMode;\n  allowedAttributes: Record<string, AllowedAttribute[]>;\n  allowedEmptyAttributes: string[];\n  selfClosing: string[];\n  allowedSchemes: string[];\n  allowedSchemesByTag: Record<string, string[]>;\n  allowedSchemesAppliedToAttributes: string[];\n  allowProtocolRelative: boolean;\n  enforceHtmlBoundary: boolean;\n  parseStyleAttributes: boolean;\n  preserveEscapedAttributes: boolean;\n}\n\nexport interface SanitizeHtml {\n  (\n    html: string | number | null | undefined,\n    options?: IOptions,\n    _recursing?: boolean\n  ): string;\n  defaults: Defaults;\n  simpleTransform: (\n    newTagName: string,\n    newAttribs?: Attributes,\n    merge?: boolean\n  ) => Transformer;\n}\n\n// =============================================================================\n// Small helpers\n// =============================================================================\n\nfunction escapeStringRegexp(s: string): string {\n  return s.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n}\n\nfunction isPlainObject(obj: unknown): obj is Record<string, unknown> {\n  if (obj === null || typeof obj !== 'object') return false;\n  const proto = Object.getPrototypeOf(obj);\n  return proto === null || proto === Object.prototype;\n}\n\nfunction deepmerge<A, B>(a: A, b: B): A | B | (A & B) {\n  if (Array.isArray(a) && Array.isArray(b)) {\n    return (a as unknown[]).concat(b as unknown[]) as unknown as A & B;\n  }\n  if (a && b && typeof a === 'object' && typeof b === 'object') {\n    const out: Record<string, unknown> = {};\n    for (const k of Object.keys(a as object)) out[k] = (a as Record<string, unknown>)[k];\n    for (const k of Object.keys(b as object)) {\n      if (k in out) out[k] = deepmerge(out[k], (b as Record<string, unknown>)[k]);\n      else out[k] = (b as Record<string, unknown>)[k];\n    }\n    return out as unknown as A & B;\n  }\n  return (b === undefined ? a : b) as A | B;\n}\n\nfunction each<T>(\n  obj: Record<string, T> | undefined | null,\n  cb: (value: T, key: string) => void\n): void {\n  if (obj) {\n    Object.keys(obj).forEach((key) => cb(obj[key], key));\n  }\n}\n\nfunction has(obj: object, key: string): boolean {\n  return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction filter<T>(a: T[], cb: (v: T) => boolean): T[] {\n  const n: T[] = [];\n  for (const v of a) if (cb(v)) n.push(v);\n  return n;\n}\n\nfunction isEmptyObject(obj: object): boolean {\n  for (const key in obj) {\n    if (has(obj, key)) return false;\n  }\n  return true;\n}\n\n// =============================================================================\n// HTML entity decoding\n// =============================================================================\n\n// The full WHATWG HTML5 named character reference table lives inline below so\n// the library stays a single zero-dependency, isomorphic file. Regenerate with\n// `node scripts/gen-entities.mjs` (rewrites the block between the markers).\n// <generated-entities> — do not edit by hand\n// Full WHATWG HTML5 named character reference table: 2231 entries\n// (106 legacy no-semicolon forms). Source: scripts/entities-whatwg.json.\n// A Map built from a JSON.parse()'d pair array — fast cold start + fast lookups.\n/** Longest entity name in letters (excluding any trailing \";\"). */\nconst MAX_ENTITY_NAME_LENGTH = 31;\nconst NAMED_ENTITIES: Map<string, string> = new Map(JSON.parse(\n  '[[\"AElig\",\"Æ\"],[\"AElig;\",\"Æ\"],[\"AMP\",\"&\"],[\"AMP;\",\"&\"],[\"Aacute\",\"Á\"],[\"Aacute;\",\"Á\"],[\"Abreve;\",\"Ă\"],[\"Acirc\",\"Â\"],[\"Acirc;\",\"Â\"],[\"Acy;\",\"А\"],[\"Afr;\",\"𝔄\"],[\"Agrave\",\"À\"],[\"Agrave;\",\"À\"],[\"Alpha;\",\"Α\"],[\"Amacr;\",\"Ā\"],[\"And;\",\"⩓\"],[\"Aogon;\",\"Ą\"],[\"Aopf;\",\"𝔸\"],[\"ApplyFunction;\",\"⁡\"],[\"Aring\",\"Å\"],[\"Aring;\",\"Å\"],[\"Ascr;\",\"𝒜\"],[\"Assign;\",\"≔\"],[\"Atilde\",\"Ã\"],[\"Atilde;\",\"Ã\"],[\"Auml\",\"Ä\"],[\"Auml;\",\"Ä\"],[\"Backslash;\",\"∖\"],[\"Barv;\",\"⫧\"],[\"Barwed;\",\"⌆\"],[\"Bcy;\",\"Б\"],[\"Because;\",\"∵\"],[\"Bernoullis;\",\"ℬ\"],[\"Beta;\",\"Β\"],[\"Bfr;\",\"𝔅\"],[\"Bopf;\",\"𝔹\"],[\"Breve;\",\"˘\"],[\"Bscr;\",\"ℬ\"],[\"Bumpeq;\",\"≎\"],[\"CHcy;\",\"Ч\"],[\"COPY\",\"©\"],[\"COPY;\",\"©\"],[\"Cacute;\",\"Ć\"],[\"Cap;\",\"⋒\"],[\"CapitalDifferentialD;\",\"ⅅ\"],[\"Cayleys;\",\"ℭ\"],[\"Ccaron;\",\"Č\"],[\"Ccedil\",\"Ç\"],[\"Ccedil;\",\"Ç\"],[\"Ccirc;\",\"Ĉ\"],[\"Cconint;\",\"∰\"],[\"Cdot;\",\"Ċ\"],[\"Cedilla;\",\"¸\"],[\"CenterDot;\",\"·\"],[\"Cfr;\",\"ℭ\"],[\"Chi;\",\"Χ\"],[\"CircleDot;\",\"⊙\"],[\"CircleMinus;\",\"⊖\"],[\"CirclePlus;\",\"⊕\"],[\"CircleTimes;\",\"⊗\"],[\"ClockwiseContourIntegral;\",\"∲\"],[\"CloseCurlyDoubleQuote;\",\"”\"],[\"CloseCurlyQuote;\",\"’\"],[\"Colon;\",\"∷\"],[\"Colone;\",\"⩴\"],[\"Congruent;\",\"≡\"],[\"Conint;\",\"∯\"],[\"ContourIntegral;\",\"∮\"],[\"Copf;\",\"ℂ\"],[\"Coproduct;\",\"∐\"],[\"CounterClockwiseContourIntegral;\",\"∳\"],[\"Cross;\",\"⨯\"],[\"Cscr;\",\"𝒞\"],[\"Cup;\",\"⋓\"],[\"CupCap;\",\"≍\"],[\"DD;\",\"ⅅ\"],[\"DDotrahd;\",\"⤑\"],[\"DJcy;\",\"Ђ\"],[\"DScy;\",\"Ѕ\"],[\"DZcy;\",\"Џ\"],[\"Dagger;\",\"‡\"],[\"Darr;\",\"↡\"],[\"Dashv;\",\"⫤\"],[\"Dcaron;\",\"Ď\"],[\"Dcy;\",\"Д\"],[\"Del;\",\"∇\"],[\"Delta;\",\"Δ\"],[\"Dfr;\",\"𝔇\"],[\"DiacriticalAcute;\",\"´\"],[\"DiacriticalDot;\",\"˙\"],[\"DiacriticalDoubleAcute;\",\"˝\"],[\"DiacriticalGrave;\",\"`\"],[\"DiacriticalTilde;\",\"˜\"],[\"Diamond;\",\"⋄\"],[\"DifferentialD;\",\"ⅆ\"],[\"Dopf;\",\"𝔻\"],[\"Dot;\",\"¨\"],[\"DotDot;\",\"⃜\"],[\"DotEqual;\",\"≐\"],[\"DoubleContourIntegral;\",\"∯\"],[\"DoubleDot;\",\"¨\"],[\"DoubleDownArrow;\",\"⇓\"],[\"DoubleLeftArrow;\",\"⇐\"],[\"DoubleLeftRightArrow;\",\"⇔\"],[\"DoubleLeftTee;\",\"⫤\"],[\"DoubleLongLeftArrow;\",\"⟸\"],[\"DoubleLongLeftRightArrow;\",\"⟺\"],[\"DoubleLongRightArrow;\",\"⟹\"],[\"DoubleRightArrow;\",\"⇒\"],[\"DoubleRightTee;\",\"⊨\"],[\"DoubleUpArrow;\",\"⇑\"],[\"DoubleUpDownArrow;\",\"⇕\"],[\"DoubleVerticalBar;\",\"∥\"],[\"DownArrow;\",\"↓\"],[\"DownArrowBar;\",\"⤓\"],[\"DownArrowUpArrow;\",\"⇵\"],[\"DownBreve;\",\"̑\"],[\"DownLeftRightVector;\",\"⥐\"],[\"DownLeftTeeVector;\",\"⥞\"],[\"DownLeftVector;\",\"↽\"],[\"DownLeftVectorBar;\",\"⥖\"],[\"DownRightTeeVector;\",\"⥟\"],[\"DownRightVector;\",\"⇁\"],[\"DownRightVectorBar;\",\"⥗\"],[\"DownTee;\",\"⊤\"],[\"DownTeeArrow;\",\"↧\"],[\"Downarrow;\",\"⇓\"],[\"Dscr;\",\"𝒟\"],[\"Dstrok;\",\"Đ\"],[\"ENG;\",\"Ŋ\"],[\"ETH\",\"Ð\"],[\"ETH;\",\"Ð\"],[\"Eacute\",\"É\"],[\"Eacute;\",\"É\"],[\"Ecaron;\",\"Ě\"],[\"Ecirc\",\"Ê\"],[\"Ecirc;\",\"Ê\"],[\"Ecy;\",\"Э\"],[\"Edot;\",\"Ė\"],[\"Efr;\",\"𝔈\"],[\"Egrave\",\"È\"],[\"Egrave;\",\"È\"],[\"Element;\",\"∈\"],[\"Emacr;\",\"Ē\"],[\"EmptySmallSquare;\",\"◻\"],[\"EmptyVerySmallSquare;\",\"▫\"],[\"Eogon;\",\"Ę\"],[\"Eopf;\",\"𝔼\"],[\"Epsilon;\",\"Ε\"],[\"Equal;\",\"⩵\"],[\"EqualTilde;\",\"≂\"],[\"Equilibrium;\",\"⇌\"],[\"Escr;\",\"ℰ\"],[\"Esim;\",\"⩳\"],[\"Eta;\",\"Η\"],[\"Euml\",\"Ë\"],[\"Euml;\",\"Ë\"],[\"Exists;\",\"∃\"],[\"ExponentialE;\",\"ⅇ\"],[\"Fcy;\",\"Ф\"],[\"Ffr;\",\"𝔉\"],[\"FilledSmallSquare;\",\"◼\"],[\"FilledVerySmallSquare;\",\"▪\"],[\"Fopf;\",\"𝔽\"],[\"ForAll;\",\"∀\"],[\"Fouriertrf;\",\"ℱ\"],[\"Fscr;\",\"ℱ\"],[\"GJcy;\",\"Ѓ\"],[\"GT\",\">\"],[\"GT;\",\">\"],[\"Gamma;\",\"Γ\"],[\"Gammad;\",\"Ϝ\"],[\"Gbreve;\",\"Ğ\"],[\"Gcedil;\",\"Ģ\"],[\"Gcirc;\",\"Ĝ\"],[\"Gcy;\",\"Г\"],[\"Gdot;\",\"Ġ\"],[\"Gfr;\",\"𝔊\"],[\"Gg;\",\"⋙\"],[\"Gopf;\",\"𝔾\"],[\"GreaterEqual;\",\"≥\"],[\"GreaterEqualLess;\",\"⋛\"],[\"GreaterFullEqual;\",\"≧\"],[\"GreaterGreater;\",\"⪢\"],[\"GreaterLess;\",\"≷\"],[\"GreaterSlantEqual;\",\"⩾\"],[\"GreaterTilde;\",\"≳\"],[\"Gscr;\",\"𝒢\"],[\"Gt;\",\"≫\"],[\"HARDcy;\",\"Ъ\"],[\"Hacek;\",\"ˇ\"],[\"Hat;\",\"^\"],[\"Hcirc;\",\"Ĥ\"],[\"Hfr;\",\"ℌ\"],[\"HilbertSpace;\",\"ℋ\"],[\"Hopf;\",\"ℍ\"],[\"HorizontalLine;\",\"─\"],[\"Hscr;\",\"ℋ\"],[\"Hstrok;\",\"Ħ\"],[\"HumpDownHump;\",\"≎\"],[\"HumpEqual;\",\"≏\"],[\"IEcy;\",\"Е\"],[\"IJlig;\",\"Ĳ\"],[\"IOcy;\",\"Ё\"],[\"Iacute\",\"Í\"],[\"Iacute;\",\"Í\"],[\"Icirc\",\"Î\"],[\"Icirc;\",\"Î\"],[\"Icy;\",\"И\"],[\"Idot;\",\"İ\"],[\"Ifr;\",\"ℑ\"],[\"Igrave\",\"Ì\"],[\"Igrave;\",\"Ì\"],[\"Im;\",\"ℑ\"],[\"Imacr;\",\"Ī\"],[\"ImaginaryI;\",\"ⅈ\"],[\"Implies;\",\"⇒\"],[\"Int;\",\"∬\"],[\"Integral;\",\"∫\"],[\"Intersection;\",\"⋂\"],[\"InvisibleComma;\",\"⁣\"],[\"InvisibleTimes;\",\"⁢\"],[\"Iogon;\",\"Į\"],[\"Iopf;\",\"𝕀\"],[\"Iota;\",\"Ι\"],[\"Iscr;\",\"ℐ\"],[\"Itilde;\",\"Ĩ\"],[\"Iukcy;\",\"І\"],[\"Iuml\",\"Ï\"],[\"Iuml;\",\"Ï\"],[\"Jcirc;\",\"Ĵ\"],[\"Jcy;\",\"Й\"],[\"Jfr;\",\"𝔍\"],[\"Jopf;\",\"𝕁\"],[\"Jscr;\",\"𝒥\"],[\"Jsercy;\",\"Ј\"],[\"Jukcy;\",\"Є\"],[\"KHcy;\",\"Х\"],[\"KJcy;\",\"Ќ\"],[\"Kappa;\",\"Κ\"],[\"Kcedil;\",\"Ķ\"],[\"Kcy;\",\"К\"],[\"Kfr;\",\"𝔎\"],[\"Kopf;\",\"𝕂\"],[\"Kscr;\",\"𝒦\"],[\"LJcy;\",\"Љ\"],[\"LT\",\"<\"],[\"LT;\",\"<\"],[\"Lacute;\",\"Ĺ\"],[\"Lambda;\",\"Λ\"],[\"Lang;\",\"⟪\"],[\"Laplacetrf;\",\"ℒ\"],[\"Larr;\",\"↞\"],[\"Lcaron;\",\"Ľ\"],[\"Lcedil;\",\"Ļ\"],[\"Lcy;\",\"Л\"],[\"LeftAngleBracket;\",\"⟨\"],[\"LeftArrow;\",\"←\"],[\"LeftArrowBar;\",\"⇤\"],[\"LeftArrowRightArrow;\",\"⇆\"],[\"LeftCeiling;\",\"⌈\"],[\"LeftDoubleBracket;\",\"⟦\"],[\"LeftDownTeeVector;\",\"⥡\"],[\"LeftDownVector;\",\"⇃\"],[\"LeftDownVectorBar;\",\"⥙\"],[\"LeftFloor;\",\"⌊\"],[\"LeftRightArrow;\",\"↔\"],[\"LeftRightVector;\",\"⥎\"],[\"LeftTee;\",\"⊣\"],[\"LeftTeeArrow;\",\"↤\"],[\"LeftTeeVector;\",\"⥚\"],[\"LeftTriangle;\",\"⊲\"],[\"LeftTriangleBar;\",\"⧏\"],[\"LeftTriangleEqual;\",\"⊴\"],[\"LeftUpDownVector;\",\"⥑\"],[\"LeftUpTeeVector;\",\"⥠\"],[\"LeftUpVector;\",\"↿\"],[\"LeftUpVectorBar;\",\"⥘\"],[\"LeftVector;\",\"↼\"],[\"LeftVectorBar;\",\"⥒\"],[\"Leftarrow;\",\"⇐\"],[\"Leftrightarrow;\",\"⇔\"],[\"LessEqualGreater;\",\"⋚\"],[\"LessFullEqual;\",\"≦\"],[\"LessGreater;\",\"≶\"],[\"LessLess;\",\"⪡\"],[\"LessSlantEqual;\",\"⩽\"],[\"LessTilde;\",\"≲\"],[\"Lfr;\",\"𝔏\"],[\"Ll;\",\"⋘\"],[\"Lleftarrow;\",\"⇚\"],[\"Lmidot;\",\"Ŀ\"],[\"LongLeftArrow;\",\"⟵\"],[\"LongLeftRightArrow;\",\"⟷\"],[\"LongRightArrow;\",\"⟶\"],[\"Longleftarrow;\",\"⟸\"],[\"Longleftrightarrow;\",\"⟺\"],[\"Longrightarrow;\",\"⟹\"],[\"Lopf;\",\"𝕃\"],[\"LowerLeftArrow;\",\"↙\"],[\"LowerRightArrow;\",\"↘\"],[\"Lscr;\",\"ℒ\"],[\"Lsh;\",\"↰\"],[\"Lstrok;\",\"Ł\"],[\"Lt;\",\"≪\"],[\"Map;\",\"⤅\"],[\"Mcy;\",\"М\"],[\"MediumSpace;\",\" \"],[\"Mellintrf;\",\"ℳ\"],[\"Mfr;\",\"𝔐\"],[\"MinusPlus;\",\"∓\"],[\"Mopf;\",\"𝕄\"],[\"Mscr;\",\"ℳ\"],[\"Mu;\",\"Μ\"],[\"NJcy;\",\"Њ\"],[\"Nacute;\",\"Ń\"],[\"Ncaron;\",\"Ň\"],[\"Ncedil;\",\"Ņ\"],[\"Ncy;\",\"Н\"],[\"NegativeMediumSpace;\",\"​\"],[\"NegativeThickSpace;\",\"​\"],[\"NegativeThinSpace;\",\"​\"],[\"NegativeVeryThinSpace;\",\"​\"],[\"NestedGreaterGreater;\",\"≫\"],[\"NestedLessLess;\",\"≪\"],[\"NewLine;\",\"\\\\n\"],[\"Nfr;\",\"𝔑\"],[\"NoBreak;\",\"⁠\"],[\"NonBreakingSpace;\",\" \"],[\"Nopf;\",\"ℕ\"],[\"Not;\",\"⫬\"],[\"NotCongruent;\",\"≢\"],[\"NotCupCap;\",\"≭\"],[\"NotDoubleVerticalBar;\",\"∦\"],[\"NotElement;\",\"∉\"],[\"NotEqual;\",\"≠\"],[\"NotEqualTilde;\",\"≂̸\"],[\"NotExists;\",\"∄\"],[\"NotGreater;\",\"≯\"],[\"NotGreaterEqual;\",\"≱\"],[\"NotGreaterFullEqual;\",\"≧̸\"],[\"NotGreaterGreater;\",\"≫̸\"],[\"NotGreaterLess;\",\"≹\"],[\"NotGreaterSlantEqual;\",\"⩾̸\"],[\"NotGreaterTilde;\",\"≵\"],[\"NotHumpDownHump;\",\"≎̸\"],[\"NotHumpEqual;\",\"≏̸\"],[\"NotLeftTriangle;\",\"⋪\"],[\"NotLeftTriangleBar;\",\"⧏̸\"],[\"NotLeftTriangleEqual;\",\"⋬\"],[\"NotLess;\",\"≮\"],[\"NotLessEqual;\",\"≰\"],[\"NotLessGreater;\",\"≸\"],[\"NotLessLess;\",\"≪̸\"],[\"NotLessSlantEqual;\",\"⩽̸\"],[\"NotLessTilde;\",\"≴\"],[\"NotNestedGreaterGreater;\",\"⪢̸\"],[\"NotNestedLessLess;\",\"⪡̸\"],[\"NotPrecedes;\",\"⊀\"],[\"NotPrecedesEqual;\",\"⪯̸\"],[\"NotPrecedesSlantEqual;\",\"⋠\"],[\"NotReverseElement;\",\"∌\"],[\"NotRightTriangle;\",\"⋫\"],[\"NotRightTriangleBar;\",\"⧐̸\"],[\"NotRightTriangleEqual;\",\"⋭\"],[\"NotSquareSubset;\",\"⊏̸\"],[\"NotSquareSubsetEqual;\",\"⋢\"],[\"NotSquareSuperset;\",\"⊐̸\"],[\"NotSquareSupersetEqual;\",\"⋣\"],[\"NotSubset;\",\"⊂⃒\"],[\"NotSubsetEqual;\",\"⊈\"],[\"NotSucceeds;\",\"⊁\"],[\"NotSucceedsEqual;\",\"⪰̸\"],[\"NotSucceedsSlantEqual;\",\"⋡\"],[\"NotSucceedsTilde;\",\"≿̸\"],[\"NotSuperset;\",\"⊃⃒\"],[\"NotSupersetEqual;\",\"⊉\"],[\"NotTilde;\",\"≁\"],[\"NotTildeEqual;\",\"≄\"],[\"NotTildeFullEqual;\",\"≇\"],[\"NotTildeTilde;\",\"≉\"],[\"NotVerticalBar;\",\"∤\"],[\"Nscr;\",\"𝒩\"],[\"Ntilde\",\"Ñ\"],[\"Ntilde;\",\"Ñ\"],[\"Nu;\",\"Ν\"],[\"OElig;\",\"Œ\"],[\"Oacute\",\"Ó\"],[\"Oacute;\",\"Ó\"],[\"Ocirc\",\"Ô\"],[\"Ocirc;\",\"Ô\"],[\"Ocy;\",\"О\"],[\"Odblac;\",\"Ő\"],[\"Ofr;\",\"𝔒\"],[\"Ograve\",\"Ò\"],[\"Ograve;\",\"Ò\"],[\"Omacr;\",\"Ō\"],[\"Omega;\",\"Ω\"],[\"Omicron;\",\"Ο\"],[\"Oopf;\",\"𝕆\"],[\"OpenCurlyDoubleQuote;\",\"“\"],[\"OpenCurlyQuote;\",\"‘\"],[\"Or;\",\"⩔\"],[\"Oscr;\",\"𝒪\"],[\"Oslash\",\"Ø\"],[\"Oslash;\",\"Ø\"],[\"Otilde\",\"Õ\"],[\"Otilde;\",\"Õ\"],[\"Otimes;\",\"⨷\"],[\"Ouml\",\"Ö\"],[\"Ouml;\",\"Ö\"],[\"OverBar;\",\"‾\"],[\"OverBrace;\",\"⏞\"],[\"OverBracket;\",\"⎴\"],[\"OverParenthesis;\",\"⏜\"],[\"PartialD;\",\"∂\"],[\"Pcy;\",\"П\"],[\"Pfr;\",\"𝔓\"],[\"Phi;\",\"Φ\"],[\"Pi;\",\"Π\"],[\"PlusMinus;\",\"±\"],[\"Poincareplane;\",\"ℌ\"],[\"Popf;\",\"ℙ\"],[\"Pr;\",\"⪻\"],[\"Precedes;\",\"≺\"],[\"PrecedesEqual;\",\"⪯\"],[\"PrecedesSlantEqual;\",\"≼\"],[\"PrecedesTilde;\",\"≾\"],[\"Prime;\",\"″\"],[\"Product;\",\"∏\"],[\"Proportion;\",\"∷\"],[\"Proportional;\",\"∝\"],[\"Pscr;\",\"𝒫\"],[\"Psi;\",\"Ψ\"],[\"QUOT\",\"\\\\\"\"],[\"QUOT;\",\"\\\\\"\"],[\"Qfr;\",\"𝔔\"],[\"Qopf;\",\"ℚ\"],[\"Qscr;\",\"𝒬\"],[\"RBarr;\",\"⤐\"],[\"REG\",\"®\"],[\"REG;\",\"®\"],[\"Racute;\",\"Ŕ\"],[\"Rang;\",\"⟫\"],[\"Rarr;\",\"↠\"],[\"Rarrtl;\",\"⤖\"],[\"Rcaron;\",\"Ř\"],[\"Rcedil;\",\"Ŗ\"],[\"Rcy;\",\"Р\"],[\"Re;\",\"ℜ\"],[\"ReverseElement;\",\"∋\"],[\"ReverseEquilibrium;\",\"⇋\"],[\"ReverseUpEquilibrium;\",\"⥯\"],[\"Rfr;\",\"ℜ\"],[\"Rho;\",\"Ρ\"],[\"RightAngleBracket;\",\"⟩\"],[\"RightArrow;\",\"→\"],[\"RightArrowBar;\",\"⇥\"],[\"RightArrowLeftArrow;\",\"⇄\"],[\"RightCeiling;\",\"⌉\"],[\"RightDoubleBracket;\",\"⟧\"],[\"RightDownTeeVector;\",\"⥝\"],[\"RightDownVector;\",\"⇂\"],[\"RightDownVectorBar;\",\"⥕\"],[\"RightFloor;\",\"⌋\"],[\"RightTee;\",\"⊢\"],[\"RightTeeArrow;\",\"↦\"],[\"RightTeeVector;\",\"⥛\"],[\"RightTriangle;\",\"⊳\"],[\"RightTriangleBar;\",\"⧐\"],[\"RightTriangleEqual;\",\"⊵\"],[\"RightUpDownVector;\",\"⥏\"],[\"RightUpTeeVector;\",\"⥜\"],[\"RightUpVector;\",\"↾\"],[\"RightUpVectorBar;\",\"⥔\"],[\"RightVector;\",\"⇀\"],[\"RightVectorBar;\",\"⥓\"],[\"Rightarrow;\",\"⇒\"],[\"Ropf;\",\"ℝ\"],[\"RoundImplies;\",\"⥰\"],[\"Rrightarrow;\",\"⇛\"],[\"Rscr;\",\"ℛ\"],[\"Rsh;\",\"↱\"],[\"RuleDelayed;\",\"⧴\"],[\"SHCHcy;\",\"Щ\"],[\"SHcy;\",\"Ш\"],[\"SOFTcy;\",\"Ь\"],[\"Sacute;\",\"Ś\"],[\"Sc;\",\"⪼\"],[\"Scaron;\",\"Š\"],[\"Scedil;\",\"Ş\"],[\"Scirc;\",\"Ŝ\"],[\"Scy;\",\"С\"],[\"Sfr;\",\"𝔖\"],[\"ShortDownArrow;\",\"↓\"],[\"ShortLeftArrow;\",\"←\"],[\"ShortRightArrow;\",\"→\"],[\"ShortUpArrow;\",\"↑\"],[\"Sigma;\",\"Σ\"],[\"SmallCircle;\",\"∘\"],[\"Sopf;\",\"𝕊\"],[\"Sqrt;\",\"√\"],[\"Square;\",\"□\"],[\"SquareIntersection;\",\"⊓\"],[\"SquareSubset;\",\"⊏\"],[\"SquareSubsetEqual;\",\"⊑\"],[\"SquareSuperset;\",\"⊐\"],[\"SquareSupersetEqual;\",\"⊒\"],[\"SquareUnion;\",\"⊔\"],[\"Sscr;\",\"𝒮\"],[\"Star;\",\"⋆\"],[\"Sub;\",\"⋐\"],[\"Subset;\",\"⋐\"],[\"SubsetEqual;\",\"⊆\"],[\"Succeeds;\",\"≻\"],[\"SucceedsEqual;\",\"⪰\"],[\"SucceedsSlantEqual;\",\"≽\"],[\"SucceedsTilde;\",\"≿\"],[\"SuchThat;\",\"∋\"],[\"Sum;\",\"∑\"],[\"Sup;\",\"⋑\"],[\"Superset;\",\"⊃\"],[\"SupersetEqual;\",\"⊇\"],[\"Supset;\",\"⋑\"],[\"THORN\",\"Þ\"],[\"THORN;\",\"Þ\"],[\"TRADE;\",\"™\"],[\"TSHcy;\",\"Ћ\"],[\"TScy;\",\"Ц\"],[\"Tab;\",\"\\\\t\"],[\"Tau;\",\"Τ\"],[\"Tcaron;\",\"Ť\"],[\"Tcedil;\",\"Ţ\"],[\"Tcy;\",\"Т\"],[\"Tfr;\",\"𝔗\"],[\"Therefore;\",\"∴\"],[\"Theta;\",\"Θ\"],[\"ThickSpace;\",\"  \"],[\"ThinSpace;\",\" \"],[\"Tilde;\",\"∼\"],[\"TildeEqual;\",\"≃\"],[\"TildeFullEqual;\",\"≅\"],[\"TildeTilde;\",\"≈\"],[\"Topf;\",\"𝕋\"],[\"TripleDot;\",\"⃛\"],[\"Tscr;\",\"𝒯\"],[\"Tstrok;\",\"Ŧ\"],[\"Uacute\",\"Ú\"],[\"Uacute;\",\"Ú\"],[\"Uarr;\",\"↟\"],[\"Uarrocir;\",\"⥉\"],[\"Ubrcy;\",\"Ў\"],[\"Ubreve;\",\"Ŭ\"],[\"Ucirc\",\"Û\"],[\"Ucirc;\",\"Û\"],[\"Ucy;\",\"У\"],[\"Udblac;\",\"Ű\"],[\"Ufr;\",\"𝔘\"],[\"Ugrave\",\"Ù\"],[\"Ugrave;\",\"Ù\"],[\"Umacr;\",\"Ū\"],[\"UnderBar;\",\"_\"],[\"UnderBrace;\",\"⏟\"],[\"UnderBracket;\",\"⎵\"],[\"UnderParenthesis;\",\"⏝\"],[\"Union;\",\"⋃\"],[\"UnionPlus;\",\"⊎\"],[\"Uogon;\",\"Ų\"],[\"Uopf;\",\"𝕌\"],[\"UpArrow;\",\"↑\"],[\"UpArrowBar;\",\"⤒\"],[\"UpArrowDownArrow;\",\"⇅\"],[\"UpDownArrow;\",\"↕\"],[\"UpEquilibrium;\",\"⥮\"],[\"UpTee;\",\"⊥\"],[\"UpTeeArrow;\",\"↥\"],[\"Uparrow;\",\"⇑\"],[\"Updownarrow;\",\"⇕\"],[\"UpperLeftArrow;\",\"↖\"],[\"UpperRightArrow;\",\"↗\"],[\"Upsi;\",\"ϒ\"],[\"Upsilon;\",\"Υ\"],[\"Uring;\",\"Ů\"],[\"Uscr;\",\"𝒰\"],[\"Utilde;\",\"Ũ\"],[\"Uuml\",\"Ü\"],[\"Uuml;\",\"Ü\"],[\"VDash;\",\"⊫\"],[\"Vbar;\",\"⫫\"],[\"Vcy;\",\"В\"],[\"Vdash;\",\"⊩\"],[\"Vdashl;\",\"⫦\"],[\"Vee;\",\"⋁\"],[\"Verbar;\",\"‖\"],[\"Vert;\",\"‖\"],[\"VerticalBar;\",\"∣\"],[\"VerticalLine;\",\"|\"],[\"VerticalSeparator;\",\"❘\"],[\"VerticalTilde;\",\"≀\"],[\"VeryThinSpace;\",\" \"],[\"Vfr;\",\"𝔙\"],[\"Vopf;\",\"𝕍\"],[\"Vscr;\",\"𝒱\"],[\"Vvdash;\",\"⊪\"],[\"Wcirc;\",\"Ŵ\"],[\"Wedge;\",\"⋀\"],[\"Wfr;\",\"𝔚\"],[\"Wopf;\",\"𝕎\"],[\"Wscr;\",\"𝒲\"],[\"Xfr;\",\"𝔛\"],[\"Xi;\",\"Ξ\"],[\"Xopf;\",\"𝕏\"],[\"Xscr;\",\"𝒳\"],[\"YAcy;\",\"Я\"],[\"YIcy;\",\"Ї\"],[\"YUcy;\",\"Ю\"],[\"Yacute\",\"Ý\"],[\"Yacute;\",\"Ý\"],[\"Ycirc;\",\"Ŷ\"],[\"Ycy;\",\"Ы\"],[\"Yfr;\",\"𝔜\"],[\"Yopf;\",\"𝕐\"],[\"Yscr;\",\"𝒴\"],[\"Yuml;\",\"Ÿ\"],[\"ZHcy;\",\"Ж\"],[\"Zacute;\",\"Ź\"],[\"Zcaron;\",\"Ž\"],[\"Zcy;\",\"З\"],[\"Zdot;\",\"Ż\"],[\"ZeroWidthSpace;\",\"​\"],[\"Zeta;\",\"Ζ\"],[\"Zfr;\",\"ℨ\"],[\"Zopf;\",\"ℤ\"],[\"Zscr;\",\"𝒵\"],[\"aacute\",\"á\"],[\"aacute;\",\"á\"],[\"abreve;\",\"ă\"],[\"ac;\",\"∾\"],[\"acE;\",\"∾̳\"],[\"acd;\",\"∿\"],[\"acirc\",\"â\"],[\"acirc;\",\"â\"],[\"acute\",\"´\"],[\"acute;\",\"´\"],[\"acy;\",\"а\"],[\"aelig\",\"æ\"],[\"aelig;\",\"æ\"],[\"af;\",\"⁡\"],[\"afr;\",\"𝔞\"],[\"agrave\",\"à\"],[\"agrave;\",\"à\"],[\"alefsym;\",\"ℵ\"],[\"aleph;\",\"ℵ\"],[\"alpha;\",\"α\"],[\"amacr;\",\"ā\"],[\"amalg;\",\"⨿\"],[\"amp\",\"&\"],[\"amp;\",\"&\"],[\"and;\",\"∧\"],[\"andand;\",\"⩕\"],[\"andd;\",\"⩜\"],[\"andslope;\",\"⩘\"],[\"andv;\",\"⩚\"],[\"ang;\",\"∠\"],[\"ange;\",\"⦤\"],[\"angle;\",\"∠\"],[\"angmsd;\",\"∡\"],[\"angmsdaa;\",\"⦨\"],[\"angmsdab;\",\"⦩\"],[\"angmsdac;\",\"⦪\"],[\"angmsdad;\",\"⦫\"],[\"angmsdae;\",\"⦬\"],[\"angmsdaf;\",\"⦭\"],[\"angmsdag;\",\"⦮\"],[\"angmsdah;\",\"⦯\"],[\"angrt;\",\"∟\"],[\"angrtvb;\",\"⊾\"],[\"angrtvbd;\",\"⦝\"],[\"angsph;\",\"∢\"],[\"angst;\",\"Å\"],[\"angzarr;\",\"⍼\"],[\"aogon;\",\"ą\"],[\"aopf;\",\"𝕒\"],[\"ap;\",\"≈\"],[\"apE;\",\"⩰\"],[\"apacir;\",\"⩯\"],[\"ape;\",\"≊\"],[\"apid;\",\"≋\"],[\"apos;\",\"\\'\"],[\"approx;\",\"≈\"],[\"approxeq;\",\"≊\"],[\"aring\",\"å\"],[\"aring;\",\"å\"],[\"ascr;\",\"𝒶\"],[\"ast;\",\"*\"],[\"asymp;\",\"≈\"],[\"asympeq;\",\"≍\"],[\"atilde\",\"ã\"],[\"atilde;\",\"ã\"],[\"auml\",\"ä\"],[\"auml;\",\"ä\"],[\"awconint;\",\"∳\"],[\"awint;\",\"⨑\"],[\"bNot;\",\"⫭\"],[\"backcong;\",\"≌\"],[\"backepsilon;\",\"϶\"],[\"backprime;\",\"‵\"],[\"backsim;\",\"∽\"],[\"backsimeq;\",\"⋍\"],[\"barvee;\",\"⊽\"],[\"barwed;\",\"⌅\"],[\"barwedge;\",\"⌅\"],[\"bbrk;\",\"⎵\"],[\"bbrktbrk;\",\"⎶\"],[\"bcong;\",\"≌\"],[\"bcy;\",\"б\"],[\"bdquo;\",\"„\"],[\"becaus;\",\"∵\"],[\"because;\",\"∵\"],[\"bemptyv;\",\"⦰\"],[\"bepsi;\",\"϶\"],[\"bernou;\",\"ℬ\"],[\"beta;\",\"β\"],[\"beth;\",\"ℶ\"],[\"between;\",\"≬\"],[\"bfr;\",\"𝔟\"],[\"bigcap;\",\"⋂\"],[\"bigcirc;\",\"◯\"],[\"bigcup;\",\"⋃\"],[\"bigodot;\",\"⨀\"],[\"bigoplus;\",\"⨁\"],[\"bigotimes;\",\"⨂\"],[\"bigsqcup;\",\"⨆\"],[\"bigstar;\",\"★\"],[\"bigtriangledown;\",\"▽\"],[\"bigtriangleup;\",\"△\"],[\"biguplus;\",\"⨄\"],[\"bigvee;\",\"⋁\"],[\"bigwedge;\",\"⋀\"],[\"bkarow;\",\"⤍\"],[\"blacklozenge;\",\"⧫\"],[\"blacksquare;\",\"▪\"],[\"blacktriangle;\",\"▴\"],[\"blacktriangledown;\",\"▾\"],[\"blacktriangleleft;\",\"◂\"],[\"blacktriangleright;\",\"▸\"],[\"blank;\",\"␣\"],[\"blk12;\",\"▒\"],[\"blk14;\",\"░\"],[\"blk34;\",\"▓\"],[\"block;\",\"█\"],[\"bne;\",\"=⃥\"],[\"bnequiv;\",\"≡⃥\"],[\"bnot;\",\"⌐\"],[\"bopf;\",\"𝕓\"],[\"bot;\",\"⊥\"],[\"bottom;\",\"⊥\"],[\"bowtie;\",\"⋈\"],[\"boxDL;\",\"╗\"],[\"boxDR;\",\"╔\"],[\"boxDl;\",\"╖\"],[\"boxDr;\",\"╓\"],[\"boxH;\",\"═\"],[\"boxHD;\",\"╦\"],[\"boxHU;\",\"╩\"],[\"boxHd;\",\"╤\"],[\"boxHu;\",\"╧\"],[\"boxUL;\",\"╝\"],[\"boxUR;\",\"╚\"],[\"boxUl;\",\"╜\"],[\"boxUr;\",\"╙\"],[\"boxV;\",\"║\"],[\"boxVH;\",\"╬\"],[\"boxVL;\",\"╣\"],[\"boxVR;\",\"╠\"],[\"boxVh;\",\"╫\"],[\"boxVl;\",\"╢\"],[\"boxVr;\",\"╟\"],[\"boxbox;\",\"⧉\"],[\"boxdL;\",\"╕\"],[\"boxdR;\",\"╒\"],[\"boxdl;\",\"┐\"],[\"boxdr;\",\"┌\"],[\"boxh;\",\"─\"],[\"boxhD;\",\"╥\"],[\"boxhU;\",\"╨\"],[\"boxhd;\",\"┬\"],[\"boxhu;\",\"┴\"],[\"boxminus;\",\"⊟\"],[\"boxplus;\",\"⊞\"],[\"boxtimes;\",\"⊠\"],[\"boxuL;\",\"╛\"],[\"boxuR;\",\"╘\"],[\"boxul;\",\"┘\"],[\"boxur;\",\"└\"],[\"boxv;\",\"│\"],[\"boxvH;\",\"╪\"],[\"boxvL;\",\"╡\"],[\"boxvR;\",\"╞\"],[\"boxvh;\",\"┼\"],[\"boxvl;\",\"┤\"],[\"boxvr;\",\"├\"],[\"bprime;\",\"‵\"],[\"breve;\",\"˘\"],[\"brvbar\",\"¦\"],[\"brvbar;\",\"¦\"],[\"bscr;\",\"𝒷\"],[\"bsemi;\",\"⁏\"],[\"bsim;\",\"∽\"],[\"bsime;\",\"⋍\"],[\"bsol;\",\"\\\\\\\\\"],[\"bsolb;\",\"⧅\"],[\"bsolhsub;\",\"⟈\"],[\"bull;\",\"•\"],[\"bullet;\",\"•\"],[\"bump;\",\"≎\"],[\"bumpE;\",\"⪮\"],[\"bumpe;\",\"≏\"],[\"bumpeq;\",\"≏\"],[\"cacute;\",\"ć\"],[\"cap;\",\"∩\"],[\"capand;\",\"⩄\"],[\"capbrcup;\",\"⩉\"],[\"capcap;\",\"⩋\"],[\"capcup;\",\"⩇\"],[\"capdot;\",\"⩀\"],[\"caps;\",\"∩︀\"],[\"caret;\",\"⁁\"],[\"caron;\",\"ˇ\"],[\"ccaps;\",\"⩍\"],[\"ccaron;\",\"č\"],[\"ccedil\",\"ç\"],[\"ccedil;\",\"ç\"],[\"ccirc;\",\"ĉ\"],[\"ccups;\",\"⩌\"],[\"ccupssm;\",\"⩐\"],[\"cdot;\",\"ċ\"],[\"cedil\",\"¸\"],[\"cedil;\",\"¸\"],[\"cemptyv;\",\"⦲\"],[\"cent\",\"¢\"],[\"cent;\",\"¢\"],[\"centerdot;\",\"·\"],[\"cfr;\",\"𝔠\"],[\"chcy;\",\"ч\"],[\"check;\",\"✓\"],[\"checkmark;\",\"✓\"],[\"chi;\",\"χ\"],[\"cir;\",\"○\"],[\"cirE;\",\"⧃\"],[\"circ;\",\"ˆ\"],[\"circeq;\",\"≗\"],[\"circlearrowleft;\",\"↺\"],[\"circlearrowright;\",\"↻\"],[\"circledR;\",\"®\"],[\"circledS;\",\"Ⓢ\"],[\"circledast;\",\"⊛\"],[\"circledcirc;\",\"⊚\"],[\"circleddash;\",\"⊝\"],[\"cire;\",\"≗\"],[\"cirfnint;\",\"⨐\"],[\"cirmid;\",\"⫯\"],[\"cirscir;\",\"⧂\"],[\"clubs;\",\"♣\"],[\"clubsuit;\",\"♣\"],[\"colon;\",\":\"],[\"colone;\",\"≔\"],[\"coloneq;\",\"≔\"],[\"comma;\",\",\"],[\"commat;\",\"@\"],[\"comp;\",\"∁\"],[\"compfn;\",\"∘\"],[\"complement;\",\"∁\"],[\"complexes;\",\"ℂ\"],[\"cong;\",\"≅\"],[\"congdot;\",\"⩭\"],[\"conint;\",\"∮\"],[\"copf;\",\"𝕔\"],[\"coprod;\",\"∐\"],[\"copy\",\"©\"],[\"copy;\",\"©\"],[\"copysr;\",\"℗\"],[\"crarr;\",\"↵\"],[\"cross;\",\"✗\"],[\"cscr;\",\"𝒸\"],[\"csub;\",\"⫏\"],[\"csube;\",\"⫑\"],[\"csup;\",\"⫐\"],[\"csupe;\",\"⫒\"],[\"ctdot;\",\"⋯\"],[\"cudarrl;\",\"⤸\"],[\"cudarrr;\",\"⤵\"],[\"cuepr;\",\"⋞\"],[\"cuesc;\",\"⋟\"],[\"cularr;\",\"↶\"],[\"cularrp;\",\"⤽\"],[\"cup;\",\"∪\"],[\"cupbrcap;\",\"⩈\"],[\"cupcap;\",\"⩆\"],[\"cupcup;\",\"⩊\"],[\"cupdot;\",\"⊍\"],[\"cupor;\",\"⩅\"],[\"cups;\",\"∪︀\"],[\"curarr;\",\"↷\"],[\"curarrm;\",\"⤼\"],[\"curlyeqprec;\",\"⋞\"],[\"curlyeqsucc;\",\"⋟\"],[\"curlyvee;\",\"⋎\"],[\"curlywedge;\",\"⋏\"],[\"curren\",\"¤\"],[\"curren;\",\"¤\"],[\"curvearrowleft;\",\"↶\"],[\"curvearrowright;\",\"↷\"],[\"cuvee;\",\"⋎\"],[\"cuwed;\",\"⋏\"],[\"cwconint;\",\"∲\"],[\"cwint;\",\"∱\"],[\"cylcty;\",\"⌭\"],[\"dArr;\",\"⇓\"],[\"dHar;\",\"⥥\"],[\"dagger;\",\"†\"],[\"daleth;\",\"ℸ\"],[\"darr;\",\"↓\"],[\"dash;\",\"‐\"],[\"dashv;\",\"⊣\"],[\"dbkarow;\",\"⤏\"],[\"dblac;\",\"˝\"],[\"dcaron;\",\"ď\"],[\"dcy;\",\"д\"],[\"dd;\",\"ⅆ\"],[\"ddagger;\",\"‡\"],[\"ddarr;\",\"⇊\"],[\"ddotseq;\",\"⩷\"],[\"deg\",\"°\"],[\"deg;\",\"°\"],[\"delta;\",\"δ\"],[\"demptyv;\",\"⦱\"],[\"dfisht;\",\"⥿\"],[\"dfr;\",\"𝔡\"],[\"dharl;\",\"⇃\"],[\"dharr;\",\"⇂\"],[\"diam;\",\"⋄\"],[\"diamond;\",\"⋄\"],[\"diamondsuit;\",\"♦\"],[\"diams;\",\"♦\"],[\"die;\",\"¨\"],[\"digamma;\",\"ϝ\"],[\"disin;\",\"⋲\"],[\"div;\",\"÷\"],[\"divide\",\"÷\"],[\"divide;\",\"÷\"],[\"divideontimes;\",\"⋇\"],[\"divonx;\",\"⋇\"],[\"djcy;\",\"ђ\"],[\"dlcorn;\",\"⌞\"],[\"dlcrop;\",\"⌍\"],[\"dollar;\",\"$\"],[\"dopf;\",\"𝕕\"],[\"dot;\",\"˙\"],[\"doteq;\",\"≐\"],[\"doteqdot;\",\"≑\"],[\"dotminus;\",\"∸\"],[\"dotplus;\",\"∔\"],[\"dotsquare;\",\"⊡\"],[\"doublebarwedge;\",\"⌆\"],[\"downarrow;\",\"↓\"],[\"downdownarrows;\",\"⇊\"],[\"downharpoonleft;\",\"⇃\"],[\"downharpoonright;\",\"⇂\"],[\"drbkarow;\",\"⤐\"],[\"drcorn;\",\"⌟\"],[\"drcrop;\",\"⌌\"],[\"dscr;\",\"𝒹\"],[\"dscy;\",\"ѕ\"],[\"dsol;\",\"⧶\"],[\"dstrok;\",\"đ\"],[\"dtdot;\",\"⋱\"],[\"dtri;\",\"▿\"],[\"dtrif;\",\"▾\"],[\"duarr;\",\"⇵\"],[\"duhar;\",\"⥯\"],[\"dwangle;\",\"⦦\"],[\"dzcy;\",\"џ\"],[\"dzigrarr;\",\"⟿\"],[\"eDDot;\",\"⩷\"],[\"eDot;\",\"≑\"],[\"eacute\",\"é\"],[\"eacute;\",\"é\"],[\"easter;\",\"⩮\"],[\"ecaron;\",\"ě\"],[\"ecir;\",\"≖\"],[\"ecirc\",\"ê\"],[\"ecirc;\",\"ê\"],[\"ecolon;\",\"≕\"],[\"ecy;\",\"э\"],[\"edot;\",\"ė\"],[\"ee;\",\"ⅇ\"],[\"efDot;\",\"≒\"],[\"efr;\",\"𝔢\"],[\"eg;\",\"⪚\"],[\"egrave\",\"è\"],[\"egrave;\",\"è\"],[\"egs;\",\"⪖\"],[\"egsdot;\",\"⪘\"],[\"el;\",\"⪙\"],[\"elinters;\",\"⏧\"],[\"ell;\",\"ℓ\"],[\"els;\",\"⪕\"],[\"elsdot;\",\"⪗\"],[\"emacr;\",\"ē\"],[\"empty;\",\"∅\"],[\"emptyset;\",\"∅\"],[\"emptyv;\",\"∅\"],[\"emsp13;\",\" \"],[\"emsp14;\",\" \"],[\"emsp;\",\" \"],[\"eng;\",\"ŋ\"],[\"ensp;\",\" \"],[\"eogon;\",\"ę\"],[\"eopf;\",\"𝕖\"],[\"epar;\",\"⋕\"],[\"eparsl;\",\"⧣\"],[\"eplus;\",\"⩱\"],[\"epsi;\",\"ε\"],[\"epsilon;\",\"ε\"],[\"epsiv;\",\"ϵ\"],[\"eqcirc;\",\"≖\"],[\"eqcolon;\",\"≕\"],[\"eqsim;\",\"≂\"],[\"eqslantgtr;\",\"⪖\"],[\"eqslantless;\",\"⪕\"],[\"equals;\",\"=\"],[\"equest;\",\"≟\"],[\"equiv;\",\"≡\"],[\"equivDD;\",\"⩸\"],[\"eqvparsl;\",\"⧥\"],[\"erDot;\",\"≓\"],[\"erarr;\",\"⥱\"],[\"escr;\",\"ℯ\"],[\"esdot;\",\"≐\"],[\"esim;\",\"≂\"],[\"eta;\",\"η\"],[\"eth\",\"ð\"],[\"eth;\",\"ð\"],[\"euml\",\"ë\"],[\"euml;\",\"ë\"],[\"euro;\",\"€\"],[\"excl;\",\"!\"],[\"exist;\",\"∃\"],[\"expectation;\",\"ℰ\"],[\"exponentiale;\",\"ⅇ\"],[\"fallingdotseq;\",\"≒\"],[\"fcy;\",\"ф\"],[\"female;\",\"♀\"],[\"ffilig;\",\"ﬃ\"],[\"fflig;\",\"ﬀ\"],[\"ffllig;\",\"ﬄ\"],[\"ffr;\",\"𝔣\"],[\"filig;\",\"ﬁ\"],[\"fjlig;\",\"fj\"],[\"flat;\",\"♭\"],[\"fllig;\",\"ﬂ\"],[\"fltns;\",\"▱\"],[\"fnof;\",\"ƒ\"],[\"fopf;\",\"𝕗\"],[\"forall;\",\"∀\"],[\"fork;\",\"⋔\"],[\"forkv;\",\"⫙\"],[\"fpartint;\",\"⨍\"],[\"frac12\",\"½\"],[\"frac12;\",\"½\"],[\"frac13;\",\"⅓\"],[\"frac14\",\"¼\"],[\"frac14;\",\"¼\"],[\"frac15;\",\"⅕\"],[\"frac16;\",\"⅙\"],[\"frac18;\",\"⅛\"],[\"frac23;\",\"⅔\"],[\"frac25;\",\"⅖\"],[\"frac34\",\"¾\"],[\"frac34;\",\"¾\"],[\"frac35;\",\"⅗\"],[\"frac38;\",\"⅜\"],[\"frac45;\",\"⅘\"],[\"frac56;\",\"⅚\"],[\"frac58;\",\"⅝\"],[\"frac78;\",\"⅞\"],[\"frasl;\",\"⁄\"],[\"frown;\",\"⌢\"],[\"fscr;\",\"𝒻\"],[\"gE;\",\"≧\"],[\"gEl;\",\"⪌\"],[\"gacute;\",\"ǵ\"],[\"gamma;\",\"γ\"],[\"gammad;\",\"ϝ\"],[\"gap;\",\"⪆\"],[\"gbreve;\",\"ğ\"],[\"gcirc;\",\"ĝ\"],[\"gcy;\",\"г\"],[\"gdot;\",\"ġ\"],[\"ge;\",\"≥\"],[\"gel;\",\"⋛\"],[\"geq;\",\"≥\"],[\"geqq;\",\"≧\"],[\"geqslant;\",\"⩾\"],[\"ges;\",\"⩾\"],[\"gescc;\",\"⪩\"],[\"gesdot;\",\"⪀\"],[\"gesdoto;\",\"⪂\"],[\"gesdotol;\",\"⪄\"],[\"gesl;\",\"⋛︀\"],[\"gesles;\",\"⪔\"],[\"gfr;\",\"𝔤\"],[\"gg;\",\"≫\"],[\"ggg;\",\"⋙\"],[\"gimel;\",\"ℷ\"],[\"gjcy;\",\"ѓ\"],[\"gl;\",\"≷\"],[\"glE;\",\"⪒\"],[\"gla;\",\"⪥\"],[\"glj;\",\"⪤\"],[\"gnE;\",\"≩\"],[\"gnap;\",\"⪊\"],[\"gnapprox;\",\"⪊\"],[\"gne;\",\"⪈\"],[\"gneq;\",\"⪈\"],[\"gneqq;\",\"≩\"],[\"gnsim;\",\"⋧\"],[\"gopf;\",\"𝕘\"],[\"grave;\",\"`\"],[\"gscr;\",\"ℊ\"],[\"gsim;\",\"≳\"],[\"gsime;\",\"⪎\"],[\"gsiml;\",\"⪐\"],[\"gt\",\">\"],[\"gt;\",\">\"],[\"gtcc;\",\"⪧\"],[\"gtcir;\",\"⩺\"],[\"gtdot;\",\"⋗\"],[\"gtlPar;\",\"⦕\"],[\"gtquest;\",\"⩼\"],[\"gtrapprox;\",\"⪆\"],[\"gtrarr;\",\"⥸\"],[\"gtrdot;\",\"⋗\"],[\"gtreqless;\",\"⋛\"],[\"gtreqqless;\",\"⪌\"],[\"gtrless;\",\"≷\"],[\"gtrsim;\",\"≳\"],[\"gvertneqq;\",\"≩︀\"],[\"gvnE;\",\"≩︀\"],[\"hArr;\",\"⇔\"],[\"hairsp;\",\" \"],[\"half;\",\"½\"],[\"hamilt;\",\"ℋ\"],[\"hardcy;\",\"ъ\"],[\"harr;\",\"↔\"],[\"harrcir;\",\"⥈\"],[\"harrw;\",\"↭\"],[\"hbar;\",\"ℏ\"],[\"hcirc;\",\"ĥ\"],[\"hearts;\",\"♥\"],[\"heartsuit;\",\"♥\"],[\"hellip;\",\"…\"],[\"hercon;\",\"⊹\"],[\"hfr;\",\"𝔥\"],[\"hksearow;\",\"⤥\"],[\"hkswarow;\",\"⤦\"],[\"hoarr;\",\"⇿\"],[\"homtht;\",\"∻\"],[\"hookleftarrow;\",\"↩\"],[\"hookrightarrow;\",\"↪\"],[\"hopf;\",\"𝕙\"],[\"horbar;\",\"―\"],[\"hscr;\",\"𝒽\"],[\"hslash;\",\"ℏ\"],[\"hstrok;\",\"ħ\"],[\"hybull;\",\"⁃\"],[\"hyphen;\",\"‐\"],[\"iacute\",\"í\"],[\"iacute;\",\"í\"],[\"ic;\",\"⁣\"],[\"icirc\",\"î\"],[\"icirc;\",\"î\"],[\"icy;\",\"и\"],[\"iecy;\",\"е\"],[\"iexcl\",\"¡\"],[\"iexcl;\",\"¡\"],[\"iff;\",\"⇔\"],[\"ifr;\",\"𝔦\"],[\"igrave\",\"ì\"],[\"igrave;\",\"ì\"],[\"ii;\",\"ⅈ\"],[\"iiiint;\",\"⨌\"],[\"iiint;\",\"∭\"],[\"iinfin;\",\"⧜\"],[\"iiota;\",\"℩\"],[\"ijlig;\",\"ĳ\"],[\"imacr;\",\"ī\"],[\"image;\",\"ℑ\"],[\"imagline;\",\"ℐ\"],[\"imagpart;\",\"ℑ\"],[\"imath;\",\"ı\"],[\"imof;\",\"⊷\"],[\"imped;\",\"Ƶ\"],[\"in;\",\"∈\"],[\"incare;\",\"℅\"],[\"infin;\",\"∞\"],[\"infintie;\",\"⧝\"],[\"inodot;\",\"ı\"],[\"int;\",\"∫\"],[\"intcal;\",\"⊺\"],[\"integers;\",\"ℤ\"],[\"intercal;\",\"⊺\"],[\"intlarhk;\",\"⨗\"],[\"intprod;\",\"⨼\"],[\"iocy;\",\"ё\"],[\"iogon;\",\"į\"],[\"iopf;\",\"𝕚\"],[\"iota;\",\"ι\"],[\"iprod;\",\"⨼\"],[\"iquest\",\"¿\"],[\"iquest;\",\"¿\"],[\"iscr;\",\"𝒾\"],[\"isin;\",\"∈\"],[\"isinE;\",\"⋹\"],[\"isindot;\",\"⋵\"],[\"isins;\",\"⋴\"],[\"isinsv;\",\"⋳\"],[\"isinv;\",\"∈\"],[\"it;\",\"⁢\"],[\"itilde;\",\"ĩ\"],[\"iukcy;\",\"і\"],[\"iuml\",\"ï\"],[\"iuml;\",\"ï\"],[\"jcirc;\",\"ĵ\"],[\"jcy;\",\"й\"],[\"jfr;\",\"𝔧\"],[\"jmath;\",\"ȷ\"],[\"jopf;\",\"𝕛\"],[\"jscr;\",\"𝒿\"],[\"jsercy;\",\"ј\"],[\"jukcy;\",\"є\"],[\"kappa;\",\"κ\"],[\"kappav;\",\"ϰ\"],[\"kcedil;\",\"ķ\"],[\"kcy;\",\"к\"],[\"kfr;\",\"𝔨\"],[\"kgreen;\",\"ĸ\"],[\"khcy;\",\"х\"],[\"kjcy;\",\"ќ\"],[\"kopf;\",\"𝕜\"],[\"kscr;\",\"𝓀\"],[\"lAarr;\",\"⇚\"],[\"lArr;\",\"⇐\"],[\"lAtail;\",\"⤛\"],[\"lBarr;\",\"⤎\"],[\"lE;\",\"≦\"],[\"lEg;\",\"⪋\"],[\"lHar;\",\"⥢\"],[\"lacute;\",\"ĺ\"],[\"laemptyv;\",\"⦴\"],[\"lagran;\",\"ℒ\"],[\"lambda;\",\"λ\"],[\"lang;\",\"⟨\"],[\"langd;\",\"⦑\"],[\"langle;\",\"⟨\"],[\"lap;\",\"⪅\"],[\"laquo\",\"«\"],[\"laquo;\",\"«\"],[\"larr;\",\"←\"],[\"larrb;\",\"⇤\"],[\"larrbfs;\",\"⤟\"],[\"larrfs;\",\"⤝\"],[\"larrhk;\",\"↩\"],[\"larrlp;\",\"↫\"],[\"larrpl;\",\"⤹\"],[\"larrsim;\",\"⥳\"],[\"larrtl;\",\"↢\"],[\"lat;\",\"⪫\"],[\"latail;\",\"⤙\"],[\"late;\",\"⪭\"],[\"lates;\",\"⪭︀\"],[\"lbarr;\",\"⤌\"],[\"lbbrk;\",\"❲\"],[\"lbrace;\",\"{\"],[\"lbrack;\",\"[\"],[\"lbrke;\",\"⦋\"],[\"lbrksld;\",\"⦏\"],[\"lbrkslu;\",\"⦍\"],[\"lcaron;\",\"ľ\"],[\"lcedil;\",\"ļ\"],[\"lceil;\",\"⌈\"],[\"lcub;\",\"{\"],[\"lcy;\",\"л\"],[\"ldca;\",\"⤶\"],[\"ldquo;\",\"“\"],[\"ldquor;\",\"„\"],[\"ldrdhar;\",\"⥧\"],[\"ldrushar;\",\"⥋\"],[\"ldsh;\",\"↲\"],[\"le;\",\"≤\"],[\"leftarrow;\",\"←\"],[\"leftarrowtail;\",\"↢\"],[\"leftharpoondown;\",\"↽\"],[\"leftharpoonup;\",\"↼\"],[\"leftleftarrows;\",\"⇇\"],[\"leftrightarrow;\",\"↔\"],[\"leftrightarrows;\",\"⇆\"],[\"leftrightharpoons;\",\"⇋\"],[\"leftrightsquigarrow;\",\"↭\"],[\"leftthreetimes;\",\"⋋\"],[\"leg;\",\"⋚\"],[\"leq;\",\"≤\"],[\"leqq;\",\"≦\"],[\"leqslant;\",\"⩽\"],[\"les;\",\"⩽\"],[\"lescc;\",\"⪨\"],[\"lesdot;\",\"⩿\"],[\"lesdoto;\",\"⪁\"],[\"lesdotor;\",\"⪃\"],[\"lesg;\",\"⋚︀\"],[\"lesges;\",\"⪓\"],[\"lessapprox;\",\"⪅\"],[\"lessdot;\",\"⋖\"],[\"lesseqgtr;\",\"⋚\"],[\"lesseqqgtr;\",\"⪋\"],[\"lessgtr;\",\"≶\"],[\"lesssim;\",\"≲\"],[\"lfisht;\",\"⥼\"],[\"lfloor;\",\"⌊\"],[\"lfr;\",\"𝔩\"],[\"lg;\",\"≶\"],[\"lgE;\",\"⪑\"],[\"lhard;\",\"↽\"],[\"lharu;\",\"↼\"],[\"lharul;\",\"⥪\"],[\"lhblk;\",\"▄\"],[\"ljcy;\",\"љ\"],[\"ll;\",\"≪\"],[\"llarr;\",\"⇇\"],[\"llcorner;\",\"⌞\"],[\"llhard;\",\"⥫\"],[\"lltri;\",\"◺\"],[\"lmidot;\",\"ŀ\"],[\"lmoust;\",\"⎰\"],[\"lmoustache;\",\"⎰\"],[\"lnE;\",\"≨\"],[\"lnap;\",\"⪉\"],[\"lnapprox;\",\"⪉\"],[\"lne;\",\"⪇\"],[\"lneq;\",\"⪇\"],[\"lneqq;\",\"≨\"],[\"lnsim;\",\"⋦\"],[\"loang;\",\"⟬\"],[\"loarr;\",\"⇽\"],[\"lobrk;\",\"⟦\"],[\"longleftarrow;\",\"⟵\"],[\"longleftrightarrow;\",\"⟷\"],[\"longmapsto;\",\"⟼\"],[\"longrightarrow;\",\"⟶\"],[\"looparrowleft;\",\"↫\"],[\"looparrowright;\",\"↬\"],[\"lopar;\",\"⦅\"],[\"lopf;\",\"𝕝\"],[\"loplus;\",\"⨭\"],[\"lotimes;\",\"⨴\"],[\"lowast;\",\"∗\"],[\"lowbar;\",\"_\"],[\"loz;\",\"◊\"],[\"lozenge;\",\"◊\"],[\"lozf;\",\"⧫\"],[\"lpar;\",\"(\"],[\"lparlt;\",\"⦓\"],[\"lrarr;\",\"⇆\"],[\"lrcorner;\",\"⌟\"],[\"lrhar;\",\"⇋\"],[\"lrhard;\",\"⥭\"],[\"lrm;\",\"‎\"],[\"lrtri;\",\"⊿\"],[\"lsaquo;\",\"‹\"],[\"lscr;\",\"𝓁\"],[\"lsh;\",\"↰\"],[\"lsim;\",\"≲\"],[\"lsime;\",\"⪍\"],[\"lsimg;\",\"⪏\"],[\"lsqb;\",\"[\"],[\"lsquo;\",\"‘\"],[\"lsquor;\",\"‚\"],[\"lstrok;\",\"ł\"],[\"lt\",\"<\"],[\"lt;\",\"<\"],[\"ltcc;\",\"⪦\"],[\"ltcir;\",\"⩹\"],[\"ltdot;\",\"⋖\"],[\"lthree;\",\"⋋\"],[\"ltimes;\",\"⋉\"],[\"ltlarr;\",\"⥶\"],[\"ltquest;\",\"⩻\"],[\"ltrPar;\",\"⦖\"],[\"ltri;\",\"◃\"],[\"ltrie;\",\"⊴\"],[\"ltrif;\",\"◂\"],[\"lurdshar;\",\"⥊\"],[\"luruhar;\",\"⥦\"],[\"lvertneqq;\",\"≨︀\"],[\"lvnE;\",\"≨︀\"],[\"mDDot;\",\"∺\"],[\"macr\",\"¯\"],[\"macr;\",\"¯\"],[\"male;\",\"♂\"],[\"malt;\",\"✠\"],[\"maltese;\",\"✠\"],[\"map;\",\"↦\"],[\"mapsto;\",\"↦\"],[\"mapstodown;\",\"↧\"],[\"mapstoleft;\",\"↤\"],[\"mapstoup;\",\"↥\"],[\"marker;\",\"▮\"],[\"mcomma;\",\"⨩\"],[\"mcy;\",\"м\"],[\"mdash;\",\"—\"],[\"measuredangle;\",\"∡\"],[\"mfr;\",\"𝔪\"],[\"mho;\",\"℧\"],[\"micro\",\"µ\"],[\"micro;\",\"µ\"],[\"mid;\",\"∣\"],[\"midast;\",\"*\"],[\"midcir;\",\"⫰\"],[\"middot\",\"·\"],[\"middot;\",\"·\"],[\"minus;\",\"−\"],[\"minusb;\",\"⊟\"],[\"minusd;\",\"∸\"],[\"minusdu;\",\"⨪\"],[\"mlcp;\",\"⫛\"],[\"mldr;\",\"…\"],[\"mnplus;\",\"∓\"],[\"models;\",\"⊧\"],[\"mopf;\",\"𝕞\"],[\"mp;\",\"∓\"],[\"mscr;\",\"𝓂\"],[\"mstpos;\",\"∾\"],[\"mu;\",\"μ\"],[\"multimap;\",\"⊸\"],[\"mumap;\",\"⊸\"],[\"nGg;\",\"⋙̸\"],[\"nGt;\",\"≫⃒\"],[\"nGtv;\",\"≫̸\"],[\"nLeftarrow;\",\"⇍\"],[\"nLeftrightarrow;\",\"⇎\"],[\"nLl;\",\"⋘̸\"],[\"nLt;\",\"≪⃒\"],[\"nLtv;\",\"≪̸\"],[\"nRightarrow;\",\"⇏\"],[\"nVDash;\",\"⊯\"],[\"nVdash;\",\"⊮\"],[\"nabla;\",\"∇\"],[\"nacute;\",\"ń\"],[\"nang;\",\"∠⃒\"],[\"nap;\",\"≉\"],[\"napE;\",\"⩰̸\"],[\"napid;\",\"≋̸\"],[\"napos;\",\"ŉ\"],[\"napprox;\",\"≉\"],[\"natur;\",\"♮\"],[\"natural;\",\"♮\"],[\"naturals;\",\"ℕ\"],[\"nbsp\",\" \"],[\"nbsp;\",\" \"],[\"nbump;\",\"≎̸\"],[\"nbumpe;\",\"≏̸\"],[\"ncap;\",\"⩃\"],[\"ncaron;\",\"ň\"],[\"ncedil;\",\"ņ\"],[\"ncong;\",\"≇\"],[\"ncongdot;\",\"⩭̸\"],[\"ncup;\",\"⩂\"],[\"ncy;\",\"н\"],[\"ndash;\",\"–\"],[\"ne;\",\"≠\"],[\"neArr;\",\"⇗\"],[\"nearhk;\",\"⤤\"],[\"nearr;\",\"↗\"],[\"nearrow;\",\"↗\"],[\"nedot;\",\"≐̸\"],[\"nequiv;\",\"≢\"],[\"nesear;\",\"⤨\"],[\"nesim;\",\"≂̸\"],[\"nexist;\",\"∄\"],[\"nexists;\",\"∄\"],[\"nfr;\",\"𝔫\"],[\"ngE;\",\"≧̸\"],[\"nge;\",\"≱\"],[\"ngeq;\",\"≱\"],[\"ngeqq;\",\"≧̸\"],[\"ngeqslant;\",\"⩾̸\"],[\"nges;\",\"⩾̸\"],[\"ngsim;\",\"≵\"],[\"ngt;\",\"≯\"],[\"ngtr;\",\"≯\"],[\"nhArr;\",\"⇎\"],[\"nharr;\",\"↮\"],[\"nhpar;\",\"⫲\"],[\"ni;\",\"∋\"],[\"nis;\",\"⋼\"],[\"nisd;\",\"⋺\"],[\"niv;\",\"∋\"],[\"njcy;\",\"њ\"],[\"nlArr;\",\"⇍\"],[\"nlE;\",\"≦̸\"],[\"nlarr;\",\"↚\"],[\"nldr;\",\"‥\"],[\"nle;\",\"≰\"],[\"nleftarrow;\",\"↚\"],[\"nleftrightarrow;\",\"↮\"],[\"nleq;\",\"≰\"],[\"nleqq;\",\"≦̸\"],[\"nleqslant;\",\"⩽̸\"],[\"nles;\",\"⩽̸\"],[\"nless;\",\"≮\"],[\"nlsim;\",\"≴\"],[\"nlt;\",\"≮\"],[\"nltri;\",\"⋪\"],[\"nltrie;\",\"⋬\"],[\"nmid;\",\"∤\"],[\"nopf;\",\"𝕟\"],[\"not\",\"¬\"],[\"not;\",\"¬\"],[\"notin;\",\"∉\"],[\"notinE;\",\"⋹̸\"],[\"notindot;\",\"⋵̸\"],[\"notinva;\",\"∉\"],[\"notinvb;\",\"⋷\"],[\"notinvc;\",\"⋶\"],[\"notni;\",\"∌\"],[\"notniva;\",\"∌\"],[\"notnivb;\",\"⋾\"],[\"notnivc;\",\"⋽\"],[\"npar;\",\"∦\"],[\"nparallel;\",\"∦\"],[\"nparsl;\",\"⫽⃥\"],[\"npart;\",\"∂̸\"],[\"npolint;\",\"⨔\"],[\"npr;\",\"⊀\"],[\"nprcue;\",\"⋠\"],[\"npre;\",\"⪯̸\"],[\"nprec;\",\"⊀\"],[\"npreceq;\",\"⪯̸\"],[\"nrArr;\",\"⇏\"],[\"nrarr;\",\"↛\"],[\"nrarrc;\",\"⤳̸\"],[\"nrarrw;\",\"↝̸\"],[\"nrightarrow;\",\"↛\"],[\"nrtri;\",\"⋫\"],[\"nrtrie;\",\"⋭\"],[\"nsc;\",\"⊁\"],[\"nsccue;\",\"⋡\"],[\"nsce;\",\"⪰̸\"],[\"nscr;\",\"𝓃\"],[\"nshortmid;\",\"∤\"],[\"nshortparallel;\",\"∦\"],[\"nsim;\",\"≁\"],[\"nsime;\",\"≄\"],[\"nsimeq;\",\"≄\"],[\"nsmid;\",\"∤\"],[\"nspar;\",\"∦\"],[\"nsqsube;\",\"⋢\"],[\"nsqsupe;\",\"⋣\"],[\"nsub;\",\"⊄\"],[\"nsubE;\",\"⫅̸\"],[\"nsube;\",\"⊈\"],[\"nsubset;\",\"⊂⃒\"],[\"nsubseteq;\",\"⊈\"],[\"nsubseteqq;\",\"⫅̸\"],[\"nsucc;\",\"⊁\"],[\"nsucceq;\",\"⪰̸\"],[\"nsup;\",\"⊅\"],[\"nsupE;\",\"⫆̸\"],[\"nsupe;\",\"⊉\"],[\"nsupset;\",\"⊃⃒\"],[\"nsupseteq;\",\"⊉\"],[\"nsupseteqq;\",\"⫆̸\"],[\"ntgl;\",\"≹\"],[\"ntilde\",\"ñ\"],[\"ntilde;\",\"ñ\"],[\"ntlg;\",\"≸\"],[\"ntriangleleft;\",\"⋪\"],[\"ntrianglelefteq;\",\"⋬\"],[\"ntriangleright;\",\"⋫\"],[\"ntrianglerighteq;\",\"⋭\"],[\"nu;\",\"ν\"],[\"num;\",\"#\"],[\"numero;\",\"№\"],[\"numsp;\",\" \"],[\"nvDash;\",\"⊭\"],[\"nvHarr;\",\"⤄\"],[\"nvap;\",\"≍⃒\"],[\"nvdash;\",\"⊬\"],[\"nvge;\",\"≥⃒\"],[\"nvgt;\",\">⃒\"],[\"nvinfin;\",\"⧞\"],[\"nvlArr;\",\"⤂\"],[\"nvle;\",\"≤⃒\"],[\"nvlt;\",\"<⃒\"],[\"nvltrie;\",\"⊴⃒\"],[\"nvrArr;\",\"⤃\"],[\"nvrtrie;\",\"⊵⃒\"],[\"nvsim;\",\"∼⃒\"],[\"nwArr;\",\"⇖\"],[\"nwarhk;\",\"⤣\"],[\"nwarr;\",\"↖\"],[\"nwarrow;\",\"↖\"],[\"nwnear;\",\"⤧\"],[\"oS;\",\"Ⓢ\"],[\"oacute\",\"ó\"],[\"oacute;\",\"ó\"],[\"oast;\",\"⊛\"],[\"ocir;\",\"⊚\"],[\"ocirc\",\"ô\"],[\"ocirc;\",\"ô\"],[\"ocy;\",\"о\"],[\"odash;\",\"⊝\"],[\"odblac;\",\"ő\"],[\"odiv;\",\"⨸\"],[\"odot;\",\"⊙\"],[\"odsold;\",\"⦼\"],[\"oelig;\",\"œ\"],[\"ofcir;\",\"⦿\"],[\"ofr;\",\"𝔬\"],[\"ogon;\",\"˛\"],[\"ograve\",\"ò\"],[\"ograve;\",\"ò\"],[\"ogt;\",\"⧁\"],[\"ohbar;\",\"⦵\"],[\"ohm;\",\"Ω\"],[\"oint;\",\"∮\"],[\"olarr;\",\"↺\"],[\"olcir;\",\"⦾\"],[\"olcross;\",\"⦻\"],[\"oline;\",\"‾\"],[\"olt;\",\"⧀\"],[\"omacr;\",\"ō\"],[\"omega;\",\"ω\"],[\"omicron;\",\"ο\"],[\"omid;\",\"⦶\"],[\"ominus;\",\"⊖\"],[\"oopf;\",\"𝕠\"],[\"opar;\",\"⦷\"],[\"operp;\",\"⦹\"],[\"oplus;\",\"⊕\"],[\"or;\",\"∨\"],[\"orarr;\",\"↻\"],[\"ord;\",\"⩝\"],[\"order;\",\"ℴ\"],[\"orderof;\",\"ℴ\"],[\"ordf\",\"ª\"],[\"ordf;\",\"ª\"],[\"ordm\",\"º\"],[\"ordm;\",\"º\"],[\"origof;\",\"⊶\"],[\"oror;\",\"⩖\"],[\"orslope;\",\"⩗\"],[\"orv;\",\"⩛\"],[\"oscr;\",\"ℴ\"],[\"oslash\",\"ø\"],[\"oslash;\",\"ø\"],[\"osol;\",\"⊘\"],[\"otilde\",\"õ\"],[\"otilde;\",\"õ\"],[\"otimes;\",\"⊗\"],[\"otimesas;\",\"⨶\"],[\"ouml\",\"ö\"],[\"ouml;\",\"ö\"],[\"ovbar;\",\"⌽\"],[\"par;\",\"∥\"],[\"para\",\"¶\"],[\"para;\",\"¶\"],[\"parallel;\",\"∥\"],[\"parsim;\",\"⫳\"],[\"parsl;\",\"⫽\"],[\"part;\",\"∂\"],[\"pcy;\",\"п\"],[\"percnt;\",\"%\"],[\"period;\",\".\"],[\"permil;\",\"‰\"],[\"perp;\",\"⊥\"],[\"pertenk;\",\"‱\"],[\"pfr;\",\"𝔭\"],[\"phi;\",\"φ\"],[\"phiv;\",\"ϕ\"],[\"phmmat;\",\"ℳ\"],[\"phone;\",\"☎\"],[\"pi;\",\"π\"],[\"pitchfork;\",\"⋔\"],[\"piv;\",\"ϖ\"],[\"planck;\",\"ℏ\"],[\"planckh;\",\"ℎ\"],[\"plankv;\",\"ℏ\"],[\"plus;\",\"+\"],[\"plusacir;\",\"⨣\"],[\"plusb;\",\"⊞\"],[\"pluscir;\",\"⨢\"],[\"plusdo;\",\"∔\"],[\"plusdu;\",\"⨥\"],[\"pluse;\",\"⩲\"],[\"plusmn\",\"±\"],[\"plusmn;\",\"±\"],[\"plussim;\",\"⨦\"],[\"plustwo;\",\"⨧\"],[\"pm;\",\"±\"],[\"pointint;\",\"⨕\"],[\"popf;\",\"𝕡\"],[\"pound\",\"£\"],[\"pound;\",\"£\"],[\"pr;\",\"≺\"],[\"prE;\",\"⪳\"],[\"prap;\",\"⪷\"],[\"prcue;\",\"≼\"],[\"pre;\",\"⪯\"],[\"prec;\",\"≺\"],[\"precapprox;\",\"⪷\"],[\"preccurlyeq;\",\"≼\"],[\"preceq;\",\"⪯\"],[\"precnapprox;\",\"⪹\"],[\"precneqq;\",\"⪵\"],[\"precnsim;\",\"⋨\"],[\"precsim;\",\"≾\"],[\"prime;\",\"′\"],[\"primes;\",\"ℙ\"],[\"prnE;\",\"⪵\"],[\"prnap;\",\"⪹\"],[\"prnsim;\",\"⋨\"],[\"prod;\",\"∏\"],[\"profalar;\",\"⌮\"],[\"profline;\",\"⌒\"],[\"profsurf;\",\"⌓\"],[\"prop;\",\"∝\"],[\"propto;\",\"∝\"],[\"prsim;\",\"≾\"],[\"prurel;\",\"⊰\"],[\"pscr;\",\"𝓅\"],[\"psi;\",\"ψ\"],[\"puncsp;\",\" \"],[\"qfr;\",\"𝔮\"],[\"qint;\",\"⨌\"],[\"qopf;\",\"𝕢\"],[\"qprime;\",\"⁗\"],[\"qscr;\",\"𝓆\"],[\"quaternions;\",\"ℍ\"],[\"quatint;\",\"⨖\"],[\"quest;\",\"?\"],[\"questeq;\",\"≟\"],[\"quot\",\"\\\\\"\"],[\"quot;\",\"\\\\\"\"],[\"rAarr;\",\"⇛\"],[\"rArr;\",\"⇒\"],[\"rAtail;\",\"⤜\"],[\"rBarr;\",\"⤏\"],[\"rHar;\",\"⥤\"],[\"race;\",\"∽̱\"],[\"racute;\",\"ŕ\"],[\"radic;\",\"√\"],[\"raemptyv;\",\"⦳\"],[\"rang;\",\"⟩\"],[\"rangd;\",\"⦒\"],[\"range;\",\"⦥\"],[\"rangle;\",\"⟩\"],[\"raquo\",\"»\"],[\"raquo;\",\"»\"],[\"rarr;\",\"→\"],[\"rarrap;\",\"⥵\"],[\"rarrb;\",\"⇥\"],[\"rarrbfs;\",\"⤠\"],[\"rarrc;\",\"⤳\"],[\"rarrfs;\",\"⤞\"],[\"rarrhk;\",\"↪\"],[\"rarrlp;\",\"↬\"],[\"rarrpl;\",\"⥅\"],[\"rarrsim;\",\"⥴\"],[\"rarrtl;\",\"↣\"],[\"rarrw;\",\"↝\"],[\"ratail;\",\"⤚\"],[\"ratio;\",\"∶\"],[\"rationals;\",\"ℚ\"],[\"rbarr;\",\"⤍\"],[\"rbbrk;\",\"❳\"],[\"rbrace;\",\"}\"],[\"rbrack;\",\"]\"],[\"rbrke;\",\"⦌\"],[\"rbrksld;\",\"⦎\"],[\"rbrkslu;\",\"⦐\"],[\"rcaron;\",\"ř\"],[\"rcedil;\",\"ŗ\"],[\"rceil;\",\"⌉\"],[\"rcub;\",\"}\"],[\"rcy;\",\"р\"],[\"rdca;\",\"⤷\"],[\"rdldhar;\",\"⥩\"],[\"rdquo;\",\"”\"],[\"rdquor;\",\"”\"],[\"rdsh;\",\"↳\"],[\"real;\",\"ℜ\"],[\"realine;\",\"ℛ\"],[\"realpart;\",\"ℜ\"],[\"reals;\",\"ℝ\"],[\"rect;\",\"▭\"],[\"reg\",\"®\"],[\"reg;\",\"®\"],[\"rfisht;\",\"⥽\"],[\"rfloor;\",\"⌋\"],[\"rfr;\",\"𝔯\"],[\"rhard;\",\"⇁\"],[\"rharu;\",\"⇀\"],[\"rharul;\",\"⥬\"],[\"rho;\",\"ρ\"],[\"rhov;\",\"ϱ\"],[\"rightarrow;\",\"→\"],[\"rightarrowtail;\",\"↣\"],[\"rightharpoondown;\",\"⇁\"],[\"rightharpoonup;\",\"⇀\"],[\"rightleftarrows;\",\"⇄\"],[\"rightleftharpoons;\",\"⇌\"],[\"rightrightarrows;\",\"⇉\"],[\"rightsquigarrow;\",\"↝\"],[\"rightthreetimes;\",\"⋌\"],[\"ring;\",\"˚\"],[\"risingdotseq;\",\"≓\"],[\"rlarr;\",\"⇄\"],[\"rlhar;\",\"⇌\"],[\"rlm;\",\"‏\"],[\"rmoust;\",\"⎱\"],[\"rmoustache;\",\"⎱\"],[\"rnmid;\",\"⫮\"],[\"roang;\",\"⟭\"],[\"roarr;\",\"⇾\"],[\"robrk;\",\"⟧\"],[\"ropar;\",\"⦆\"],[\"ropf;\",\"𝕣\"],[\"roplus;\",\"⨮\"],[\"rotimes;\",\"⨵\"],[\"rpar;\",\")\"],[\"rpargt;\",\"⦔\"],[\"rppolint;\",\"⨒\"],[\"rrarr;\",\"⇉\"],[\"rsaquo;\",\"›\"],[\"rscr;\",\"𝓇\"],[\"rsh;\",\"↱\"],[\"rsqb;\",\"]\"],[\"rsquo;\",\"’\"],[\"rsquor;\",\"’\"],[\"rthree;\",\"⋌\"],[\"rtimes;\",\"⋊\"],[\"rtri;\",\"▹\"],[\"rtrie;\",\"⊵\"],[\"rtrif;\",\"▸\"],[\"rtriltri;\",\"⧎\"],[\"ruluhar;\",\"⥨\"],[\"rx;\",\"℞\"],[\"sacute;\",\"ś\"],[\"sbquo;\",\"‚\"],[\"sc;\",\"≻\"],[\"scE;\",\"⪴\"],[\"scap;\",\"⪸\"],[\"scaron;\",\"š\"],[\"sccue;\",\"≽\"],[\"sce;\",\"⪰\"],[\"scedil;\",\"ş\"],[\"scirc;\",\"ŝ\"],[\"scnE;\",\"⪶\"],[\"scnap;\",\"⪺\"],[\"scnsim;\",\"⋩\"],[\"scpolint;\",\"⨓\"],[\"scsim;\",\"≿\"],[\"scy;\",\"с\"],[\"sdot;\",\"⋅\"],[\"sdotb;\",\"⊡\"],[\"sdote;\",\"⩦\"],[\"seArr;\",\"⇘\"],[\"searhk;\",\"⤥\"],[\"searr;\",\"↘\"],[\"searrow;\",\"↘\"],[\"sect\",\"§\"],[\"sect;\",\"§\"],[\"semi;\",\";\"],[\"seswar;\",\"⤩\"],[\"setminus;\",\"∖\"],[\"setmn;\",\"∖\"],[\"sext;\",\"✶\"],[\"sfr;\",\"𝔰\"],[\"sfrown;\",\"⌢\"],[\"sharp;\",\"♯\"],[\"shchcy;\",\"щ\"],[\"shcy;\",\"ш\"],[\"shortmid;\",\"∣\"],[\"shortparallel;\",\"∥\"],[\"shy\",\"­\"],[\"shy;\",\"­\"],[\"sigma;\",\"σ\"],[\"sigmaf;\",\"ς\"],[\"sigmav;\",\"ς\"],[\"sim;\",\"∼\"],[\"simdot;\",\"⩪\"],[\"sime;\",\"≃\"],[\"simeq;\",\"≃\"],[\"simg;\",\"⪞\"],[\"simgE;\",\"⪠\"],[\"siml;\",\"⪝\"],[\"simlE;\",\"⪟\"],[\"simne;\",\"≆\"],[\"simplus;\",\"⨤\"],[\"simrarr;\",\"⥲\"],[\"slarr;\",\"←\"],[\"smallsetminus;\",\"∖\"],[\"smashp;\",\"⨳\"],[\"smeparsl;\",\"⧤\"],[\"smid;\",\"∣\"],[\"smile;\",\"⌣\"],[\"smt;\",\"⪪\"],[\"smte;\",\"⪬\"],[\"smtes;\",\"⪬︀\"],[\"softcy;\",\"ь\"],[\"sol;\",\"/\"],[\"solb;\",\"⧄\"],[\"solbar;\",\"⌿\"],[\"sopf;\",\"𝕤\"],[\"spades;\",\"♠\"],[\"spadesuit;\",\"♠\"],[\"spar;\",\"∥\"],[\"sqcap;\",\"⊓\"],[\"sqcaps;\",\"⊓︀\"],[\"sqcup;\",\"⊔\"],[\"sqcups;\",\"⊔︀\"],[\"sqsub;\",\"⊏\"],[\"sqsube;\",\"⊑\"],[\"sqsubset;\",\"⊏\"],[\"sqsubseteq;\",\"⊑\"],[\"sqsup;\",\"⊐\"],[\"sqsupe;\",\"⊒\"],[\"sqsupset;\",\"⊐\"],[\"sqsupseteq;\",\"⊒\"],[\"squ;\",\"□\"],[\"square;\",\"□\"],[\"squarf;\",\"▪\"],[\"squf;\",\"▪\"],[\"srarr;\",\"→\"],[\"sscr;\",\"𝓈\"],[\"ssetmn;\",\"∖\"],[\"ssmile;\",\"⌣\"],[\"sstarf;\",\"⋆\"],[\"star;\",\"☆\"],[\"starf;\",\"★\"],[\"straightepsilon;\",\"ϵ\"],[\"straightphi;\",\"ϕ\"],[\"strns;\",\"¯\"],[\"sub;\",\"⊂\"],[\"subE;\",\"⫅\"],[\"subdot;\",\"⪽\"],[\"sube;\",\"⊆\"],[\"subedot;\",\"⫃\"],[\"submult;\",\"⫁\"],[\"subnE;\",\"⫋\"],[\"subne;\",\"⊊\"],[\"subplus;\",\"⪿\"],[\"subrarr;\",\"⥹\"],[\"subset;\",\"⊂\"],[\"subseteq;\",\"⊆\"],[\"subseteqq;\",\"⫅\"],[\"subsetneq;\",\"⊊\"],[\"subsetneqq;\",\"⫋\"],[\"subsim;\",\"⫇\"],[\"subsub;\",\"⫕\"],[\"subsup;\",\"⫓\"],[\"succ;\",\"≻\"],[\"succapprox;\",\"⪸\"],[\"succcurlyeq;\",\"≽\"],[\"succeq;\",\"⪰\"],[\"succnapprox;\",\"⪺\"],[\"succneqq;\",\"⪶\"],[\"succnsim;\",\"⋩\"],[\"succsim;\",\"≿\"],[\"sum;\",\"∑\"],[\"sung;\",\"♪\"],[\"sup1\",\"¹\"],[\"sup1;\",\"¹\"],[\"sup2\",\"²\"],[\"sup2;\",\"²\"],[\"sup3\",\"³\"],[\"sup3;\",\"³\"],[\"sup;\",\"⊃\"],[\"supE;\",\"⫆\"],[\"supdot;\",\"⪾\"],[\"supdsub;\",\"⫘\"],[\"supe;\",\"⊇\"],[\"supedot;\",\"⫄\"],[\"suphsol;\",\"⟉\"],[\"suphsub;\",\"⫗\"],[\"suplarr;\",\"⥻\"],[\"supmult;\",\"⫂\"],[\"supnE;\",\"⫌\"],[\"supne;\",\"⊋\"],[\"supplus;\",\"⫀\"],[\"supset;\",\"⊃\"],[\"supseteq;\",\"⊇\"],[\"supseteqq;\",\"⫆\"],[\"supsetneq;\",\"⊋\"],[\"supsetneqq;\",\"⫌\"],[\"supsim;\",\"⫈\"],[\"supsub;\",\"⫔\"],[\"supsup;\",\"⫖\"],[\"swArr;\",\"⇙\"],[\"swarhk;\",\"⤦\"],[\"swarr;\",\"↙\"],[\"swarrow;\",\"↙\"],[\"swnwar;\",\"⤪\"],[\"szlig\",\"ß\"],[\"szlig;\",\"ß\"],[\"target;\",\"⌖\"],[\"tau;\",\"τ\"],[\"tbrk;\",\"⎴\"],[\"tcaron;\",\"ť\"],[\"tcedil;\",\"ţ\"],[\"tcy;\",\"т\"],[\"tdot;\",\"⃛\"],[\"telrec;\",\"⌕\"],[\"tfr;\",\"𝔱\"],[\"there4;\",\"∴\"],[\"therefore;\",\"∴\"],[\"theta;\",\"θ\"],[\"thetasym;\",\"ϑ\"],[\"thetav;\",\"ϑ\"],[\"thickapprox;\",\"≈\"],[\"thicksim;\",\"∼\"],[\"thinsp;\",\" \"],[\"thkap;\",\"≈\"],[\"thksim;\",\"∼\"],[\"thorn\",\"þ\"],[\"thorn;\",\"þ\"],[\"tilde;\",\"˜\"],[\"times\",\"×\"],[\"times;\",\"×\"],[\"timesb;\",\"⊠\"],[\"timesbar;\",\"⨱\"],[\"timesd;\",\"⨰\"],[\"tint;\",\"∭\"],[\"toea;\",\"⤨\"],[\"top;\",\"⊤\"],[\"topbot;\",\"⌶\"],[\"topcir;\",\"⫱\"],[\"topf;\",\"𝕥\"],[\"topfork;\",\"⫚\"],[\"tosa;\",\"⤩\"],[\"tprime;\",\"‴\"],[\"trade;\",\"™\"],[\"triangle;\",\"▵\"],[\"triangledown;\",\"▿\"],[\"triangleleft;\",\"◃\"],[\"trianglelefteq;\",\"⊴\"],[\"triangleq;\",\"≜\"],[\"triangleright;\",\"▹\"],[\"trianglerighteq;\",\"⊵\"],[\"tridot;\",\"◬\"],[\"trie;\",\"≜\"],[\"triminus;\",\"⨺\"],[\"triplus;\",\"⨹\"],[\"trisb;\",\"⧍\"],[\"tritime;\",\"⨻\"],[\"trpezium;\",\"⏢\"],[\"tscr;\",\"𝓉\"],[\"tscy;\",\"ц\"],[\"tshcy;\",\"ћ\"],[\"tstrok;\",\"ŧ\"],[\"twixt;\",\"≬\"],[\"twoheadleftarrow;\",\"↞\"],[\"twoheadrightarrow;\",\"↠\"],[\"uArr;\",\"⇑\"],[\"uHar;\",\"⥣\"],[\"uacute\",\"ú\"],[\"uacute;\",\"ú\"],[\"uarr;\",\"↑\"],[\"ubrcy;\",\"ў\"],[\"ubreve;\",\"ŭ\"],[\"ucirc\",\"û\"],[\"ucirc;\",\"û\"],[\"ucy;\",\"у\"],[\"udarr;\",\"⇅\"],[\"udblac;\",\"ű\"],[\"udhar;\",\"⥮\"],[\"ufisht;\",\"⥾\"],[\"ufr;\",\"𝔲\"],[\"ugrave\",\"ù\"],[\"ugrave;\",\"ù\"],[\"uharl;\",\"↿\"],[\"uharr;\",\"↾\"],[\"uhblk;\",\"▀\"],[\"ulcorn;\",\"⌜\"],[\"ulcorner;\",\"⌜\"],[\"ulcrop;\",\"⌏\"],[\"ultri;\",\"◸\"],[\"umacr;\",\"ū\"],[\"uml\",\"¨\"],[\"uml;\",\"¨\"],[\"uogon;\",\"ų\"],[\"uopf;\",\"𝕦\"],[\"uparrow;\",\"↑\"],[\"updownarrow;\",\"↕\"],[\"upharpoonleft;\",\"↿\"],[\"upharpoonright;\",\"↾\"],[\"uplus;\",\"⊎\"],[\"upsi;\",\"υ\"],[\"upsih;\",\"ϒ\"],[\"upsilon;\",\"υ\"],[\"upuparrows;\",\"⇈\"],[\"urcorn;\",\"⌝\"],[\"urcorner;\",\"⌝\"],[\"urcrop;\",\"⌎\"],[\"uring;\",\"ů\"],[\"urtri;\",\"◹\"],[\"uscr;\",\"𝓊\"],[\"utdot;\",\"⋰\"],[\"utilde;\",\"ũ\"],[\"utri;\",\"▵\"],[\"utrif;\",\"▴\"],[\"uuarr;\",\"⇈\"],[\"uuml\",\"ü\"],[\"uuml;\",\"ü\"],[\"uwangle;\",\"⦧\"],[\"vArr;\",\"⇕\"],[\"vBar;\",\"⫨\"],[\"vBarv;\",\"⫩\"],[\"vDash;\",\"⊨\"],[\"vangrt;\",\"⦜\"],[\"varepsilon;\",\"ϵ\"],[\"varkappa;\",\"ϰ\"],[\"varnothing;\",\"∅\"],[\"varphi;\",\"ϕ\"],[\"varpi;\",\"ϖ\"],[\"varpropto;\",\"∝\"],[\"varr;\",\"↕\"],[\"varrho;\",\"ϱ\"],[\"varsigma;\",\"ς\"],[\"varsubsetneq;\",\"⊊︀\"],[\"varsubsetneqq;\",\"⫋︀\"],[\"varsupsetneq;\",\"⊋︀\"],[\"varsupsetneqq;\",\"⫌︀\"],[\"vartheta;\",\"ϑ\"],[\"vartriangleleft;\",\"⊲\"],[\"vartriangleright;\",\"⊳\"],[\"vcy;\",\"в\"],[\"vdash;\",\"⊢\"],[\"vee;\",\"∨\"],[\"veebar;\",\"⊻\"],[\"veeeq;\",\"≚\"],[\"vellip;\",\"⋮\"],[\"verbar;\",\"|\"],[\"vert;\",\"|\"],[\"vfr;\",\"𝔳\"],[\"vltri;\",\"⊲\"],[\"vnsub;\",\"⊂⃒\"],[\"vnsup;\",\"⊃⃒\"],[\"vopf;\",\"𝕧\"],[\"vprop;\",\"∝\"],[\"vrtri;\",\"⊳\"],[\"vscr;\",\"𝓋\"],[\"vsubnE;\",\"⫋︀\"],[\"vsubne;\",\"⊊︀\"],[\"vsupnE;\",\"⫌︀\"],[\"vsupne;\",\"⊋︀\"],[\"vzigzag;\",\"⦚\"],[\"wcirc;\",\"ŵ\"],[\"wedbar;\",\"⩟\"],[\"wedge;\",\"∧\"],[\"wedgeq;\",\"≙\"],[\"weierp;\",\"℘\"],[\"wfr;\",\"𝔴\"],[\"wopf;\",\"𝕨\"],[\"wp;\",\"℘\"],[\"wr;\",\"≀\"],[\"wreath;\",\"≀\"],[\"wscr;\",\"𝓌\"],[\"xcap;\",\"⋂\"],[\"xcirc;\",\"◯\"],[\"xcup;\",\"⋃\"],[\"xdtri;\",\"▽\"],[\"xfr;\",\"𝔵\"],[\"xhArr;\",\"⟺\"],[\"xharr;\",\"⟷\"],[\"xi;\",\"ξ\"],[\"xlArr;\",\"⟸\"],[\"xlarr;\",\"⟵\"],[\"xmap;\",\"⟼\"],[\"xnis;\",\"⋻\"],[\"xodot;\",\"⨀\"],[\"xopf;\",\"𝕩\"],[\"xoplus;\",\"⨁\"],[\"xotime;\",\"⨂\"],[\"xrArr;\",\"⟹\"],[\"xrarr;\",\"⟶\"],[\"xscr;\",\"𝓍\"],[\"xsqcup;\",\"⨆\"],[\"xuplus;\",\"⨄\"],[\"xutri;\",\"△\"],[\"xvee;\",\"⋁\"],[\"xwedge;\",\"⋀\"],[\"yacute\",\"ý\"],[\"yacute;\",\"ý\"],[\"yacy;\",\"я\"],[\"ycirc;\",\"ŷ\"],[\"ycy;\",\"ы\"],[\"yen\",\"¥\"],[\"yen;\",\"¥\"],[\"yfr;\",\"𝔶\"],[\"yicy;\",\"ї\"],[\"yopf;\",\"𝕪\"],[\"yscr;\",\"𝓎\"],[\"yucy;\",\"ю\"],[\"yuml\",\"ÿ\"],[\"yuml;\",\"ÿ\"],[\"zacute;\",\"ź\"],[\"zcaron;\",\"ž\"],[\"zcy;\",\"з\"],[\"zdot;\",\"ż\"],[\"zeetrf;\",\"ℨ\"],[\"zeta;\",\"ζ\"],[\"zfr;\",\"𝔷\"],[\"zhcy;\",\"ж\"],[\"zigrarr;\",\"⇝\"],[\"zopf;\",\"𝕫\"],[\"zscr;\",\"𝓏\"],[\"zwj;\",\"‍\"],[\"zwnj;\",\"‌\"]]'\n));\n// </generated-entities>\n\nconst NUMERIC_REMAP: Record<number, number> = {\n  0x00: 0xfffd,\n  0x80: 0x20ac, 0x82: 0x201a, 0x83: 0x0192, 0x84: 0x201e, 0x85: 0x2026,\n  0x86: 0x2020, 0x87: 0x2021, 0x88: 0x02c6, 0x89: 0x2030, 0x8a: 0x0160,\n  0x8b: 0x2039, 0x8c: 0x0152, 0x8e: 0x017d, 0x91: 0x2018, 0x92: 0x2019,\n  0x93: 0x201c, 0x94: 0x201d, 0x95: 0x2022, 0x96: 0x2013, 0x97: 0x2014,\n  0x98: 0x02dc, 0x99: 0x2122, 0x9a: 0x0161, 0x9b: 0x203a, 0x9c: 0x0153,\n  0x9e: 0x017e, 0x9f: 0x0178\n};\n\nfunction codePointToString(cp: number): string {\n  // All NUMERIC_REMAP keys are 0 or in [0x80, 0x9f], so skip the hash probe for\n  // the overwhelmingly common in-range code points.\n  if (cp === 0 || (cp >= 0x80 && cp <= 0x9f)) {\n    const remapped = NUMERIC_REMAP[cp];\n    if (remapped !== undefined) cp = remapped;\n  }\n  if (cp > 0x10ffff || (cp >= 0xd800 && cp <= 0xdfff)) return '�';\n  try {\n    return String.fromCodePoint(cp);\n  } catch {\n    return '�';\n  }\n}\n\ninterface EntityMatch {\n  value: string;\n  length: number;\n}\n\nconst CC_AMP = 38; // &\nconst CC_HASH = 35; // #\nconst CC_SEMI = 59; // ;\nconst CC_EQ = 61; // =\n\nfunction isAsciiDigit(cc: number): boolean {\n  return cc >= 48 && cc <= 57;\n}\n\nfunction isAsciiAlphaNum(cc: number): boolean {\n  return (\n    (cc >= 48 && cc <= 57) || // 0-9\n    (cc >= 65 && cc <= 90) || // A-Z\n    (cc >= 97 && cc <= 122) // a-z\n  );\n}\n\n// Sorted entity names (keys include any trailing ';') for prefix queries during\n// the trie walk — lets us know whether the input can keep descending toward a\n// longer entity, which the attribute ambiguous-ampersand rule depends on.\nconst ENTITY_KEYS_SORTED = [...NAMED_ENTITIES.keys()].sort();\n\n/** True if `s` is a prefix of (or equal to) some entity key. */\nfunction isEntityPrefix(s: string): boolean {\n  let lo = 0;\n  let hi = ENTITY_KEYS_SORTED.length;\n  while (lo < hi) {\n    const mid = (lo + hi) >> 1;\n    if (ENTITY_KEYS_SORTED[mid] < s) lo = mid + 1;\n    else hi = mid;\n  }\n  return lo < ENTITY_KEYS_SORTED.length && ENTITY_KEYS_SORTED[lo].startsWith(s);\n}\n\n/**\n * Decode a single character reference starting at `&` (index `i`), matching the\n * WHATWG HTML algorithm as implemented by the `entities` package (which the\n * original sanitize-html uses via htmlparser2):\n *\n *   - Numeric refs (`&#233;`, `&#x1F600;`) decode regardless of context, with\n *     the Windows-1252 remap and surrogate/out-of-range → U+FFFD.\n *   - Named refs use longest-match; a semicolon-terminated form wins when the\n *     `;` is present, otherwise a legacy no-semicolon form may match.\n *   - In attribute context, a legacy (no-`;`) match is treated as an ambiguous\n *     ampersand and left undecoded when followed by `=` or an ASCII alphanumeric\n *     (so `?a=1&copy=2` is preserved rather than mangled).\n *\n * Returns `null` when no valid reference is present (caller emits a literal `&`).\n */\nfunction decodeEntity(\n  input: string,\n  i: number,\n  inAttribute: boolean\n): EntityMatch | null {\n  if (input.charCodeAt(i) !== CC_AMP) return null;\n\n  // --- numeric character reference -----------------------------------------\n  if (input.charCodeAt(i + 1) === CC_HASH) {\n    let j = i + 2;\n    const xc = input.charCodeAt(j);\n    const hex = xc === 120 || xc === 88; // x / X\n    if (hex) j++;\n    const start = j;\n    let num = 0;\n    while (j < input.length) {\n      const cc = input.charCodeAt(j);\n      let digit: number;\n      if (isAsciiDigit(cc)) digit = cc - 48;\n      else if (hex && cc >= 97 && cc <= 102) digit = cc - 87; // a-f\n      else if (hex && cc >= 65 && cc <= 70) digit = cc - 55; // A-F\n      else break;\n      // Stop accumulating once out of range; anything past U+10FFFF maps to the\n      // replacement character regardless, and this prevents Number overflow.\n      if (num <= 0x10ffff) num = num * (hex ? 16 : 10) + digit;\n      j++;\n    }\n    if (j === start) return null;\n    let length = j - i;\n    if (input.charCodeAt(j) === CC_SEMI) length++;\n    return { value: codePointToString(num), length };\n  }\n\n  // --- named character reference -------------------------------------------\n  const len = input.length;\n  let resultValue: string | null = null;\n  let resultLen = 0; // chars from i (incl. '&') consumed by the legacy result\n  let name = '';\n  let j = i + 1;\n\n  if (!inAttribute) {\n    // Fast path for the common semicolon-terminated entity (`&amp;`, `&eacute;`):\n    // scan the name extent and look up `name;` in ONE Map.get, skipping the\n    // per-prefix probes. A `;`-terminated form is always the longest match, so\n    // a hit is final. (k stops at the `;` even for the 31-char max entity.)\n    let k = j;\n    while (k < len && k - j < MAX_ENTITY_NAME_LENGTH && isAsciiAlphaNum(input.charCodeAt(k))) k++;\n    if (k < len && input.charCodeAt(k) === CC_SEMI) {\n      const full = NAMED_ENTITIES.get(input.substring(j, k + 1));\n      if (full !== undefined) return { value: full, length: k + 1 - i };\n    }\n    // Fallback: longest legacy (no-`;`) match, or a `;` entity the fast path\n    // missed. Scans ASCII alphanumerics, probing each prefix.\n    while (j < len) {\n      const cc = input.charCodeAt(j);\n      if (cc === CC_SEMI) {\n        const semi = NAMED_ENTITIES.get(name + ';');\n        if (semi !== undefined) return { value: semi, length: j - i + 1 };\n        break;\n      }\n      if (name.length >= MAX_ENTITY_NAME_LENGTH || !isAsciiAlphaNum(cc)) break;\n      name += input[j];\n      j++;\n      const legacy = NAMED_ENTITIES.get(name);\n      if (legacy !== undefined) {\n        resultValue = legacy;\n        resultLen = j - i;\n      }\n    }\n    return resultValue === null ? null : { value: resultValue, length: resultLen };\n  }\n\n  // Fast path: a `;`-terminated form wins outright and is NOT subject to the\n  // ambiguous-ampersand rule, so look it up in one Map.get and skip the trie\n  // descent (the costly per-char isEntityPrefix binary search).\n  {\n    let k = j;\n    while (k < len && k - j < MAX_ENTITY_NAME_LENGTH && isAsciiAlphaNum(input.charCodeAt(k))) k++;\n    if (k < len && input.charCodeAt(k) === CC_SEMI) {\n      const full = NAMED_ENTITIES.get(input.substring(j, k + 1));\n      if (full !== undefined) return { value: full, length: k + 1 - i };\n    }\n  }\n\n  // Attribute mode: walk the entity trie like the `entities` package. A\n  // semicolon-terminated form wins outright; otherwise we keep the longest\n  // legacy (no-`;`) match, but leave it undecoded (\"ambiguous ampersand\") when\n  // the trie breaks on `=` / an ASCII alphanumeric, OR breaks at a node that\n  // itself holds no value — which is why `&timesbar` decodes (descends to\n  // `timesbar`, breaks on `\"`) but `&ampere` does not (breaks on `e` after `amp`).\n  while (j < len) {\n    const c = input[j];\n    if (c === ';') {\n      const semi = NAMED_ENTITIES.get(name + ';');\n      if (semi !== undefined) return { value: semi, length: j - i + 1 };\n      break; // ';' never extends the trie further\n    }\n    if (name.length >= MAX_ENTITY_NAME_LENGTH) break;\n    const cand = name + c;\n    if (!isEntityPrefix(cand)) break;\n    name = cand;\n    j++;\n    const legacy = NAMED_ENTITIES.get(name);\n    if (legacy !== undefined) {\n      resultValue = legacy;\n      resultLen = j - i;\n    }\n  }\n  if (resultValue === null) return null;\n\n  if (j < len) {\n    const breakCc = input.charCodeAt(j);\n    const nodeHasValue = NAMED_ENTITIES.has(name) || NAMED_ENTITIES.has(name + ';');\n    if (!nodeHasValue || breakCc === CC_EQ || isAsciiAlphaNum(breakCc)) return null;\n  }\n  return { value: resultValue, length: resultLen };\n}\n\nfunction decodeEntitiesString(s: string, inAttribute: boolean): string {\n  let i = s.indexOf('&');\n  if (i === -1) return s;\n  let out = '';\n  let last = 0;\n  while (i !== -1) {\n    const r = decodeEntity(s, i, inAttribute);\n    if (r) {\n      out += s.slice(last, i) + r.value;\n      i += r.length;\n      last = i;\n    } else {\n      i++;\n    }\n    i = s.indexOf('&', i);\n  }\n  return out + s.slice(last);\n}\n\n// =============================================================================\n// Minimal HTML parser\n// =============================================================================\n\nconst VOID_TAGS = new Set<string>([\n  'area', 'base', 'basefont', 'br', 'col', 'command', 'embed', 'frame', 'hr',\n  'img', 'input', 'isindex', 'keygen', 'link', 'meta', 'param', 'source',\n  'track', 'wbr'\n]);\n\n// htmlparser2's special raw-text tags. Only <title> has its entities decoded\n// (it is RCDATA in htmlparser2; the rest are consumed verbatim).\nconst RAW_TEXT_TAGS = new Set<string>([\n  'script', 'style', 'title', 'textarea', 'xmp'\n]);\nconst RCDATA_DECODE_TAGS = new Set<string>([ 'title' ]);\n\n// Ported verbatim from htmlparser2's `openImpliesClose` map so implicit tag\n// closing matches the original parser exactly.\nconst OPEN_IMPLIES_CLOSE: Record<string, Set<string>> = (() => {\n  const m: Record<string, Set<string>> = {};\n  const pTag = [ 'p' ];\n  const formTags = [ 'input', 'option', 'optgroup', 'select', 'button', 'datalist', 'textarea' ];\n  const tableSectionTags = [ 'thead', 'tbody' ];\n  const ddtTags = [ 'dd', 'dt' ];\n  const rtpTags = [ 'rt', 'rp' ];\n  m.tr = new Set([ 'tr', 'th', 'td' ]);\n  m.th = new Set([ 'th' ]);\n  m.td = new Set([ 'thead', 'th', 'td' ]);\n  m.body = new Set([ 'head', 'link', 'script' ]);\n  m.li = new Set([ 'li' ]);\n  for (const t of [ 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' ]) m[t] = new Set(pTag);\n  for (const t of [ 'select', 'input', 'output', 'button', 'datalist', 'textarea' ]) {\n    m[t] = new Set(formTags);\n  }\n  m.option = new Set([ 'option' ]);\n  m.optgroup = new Set([ 'optgroup', 'option' ]);\n  m.dd = new Set(ddtTags);\n  m.dt = new Set(ddtTags);\n  for (const t of [\n    'address', 'article', 'aside', 'blockquote', 'details', 'div', 'dl',\n    'fieldset', 'figcaption', 'figure', 'footer', 'form', 'header', 'hr',\n    'main', 'nav', 'ol', 'pre', 'section', 'table', 'ul'\n  ]) m[t] = new Set(pTag);\n  m.rt = new Set(rtpTags);\n  m.rp = new Set(rtpTags);\n  m.tbody = new Set(tableSectionTags);\n  m.tfoot = new Set(tableSectionTags);\n  return m;\n})();\n\nconst WS_RE = /\\s/;\n\n// charCode predicates for the tokenizer hot loop — these avoid the per-character\n// string allocation of `input[j]` and the regex-engine call. `isWhitespaceCC`\n// reproduces JS `/\\s/` EXACTLY (ASCII ws incl. VT, plus the Unicode space\n// separators and NBSP/BOM), so the conversions stay byte-identical.\nfunction isWhitespaceCC(cc: number): boolean {\n  if (cc === 0x20 || (cc >= 0x09 && cc <= 0x0d)) return true;\n  if (cc < 0xa0) return false;\n  return cc === 0xa0 || cc === 0x1680 || (cc >= 0x2000 && cc <= 0x200a) ||\n    cc === 0x2028 || cc === 0x2029 || cc === 0x202f || cc === 0x205f ||\n    cc === 0x3000 || cc === 0xfeff;\n}\nfunction isNameStartCC(cc: number): boolean { // /[A-Za-z]/\n  return (cc >= 0x41 && cc <= 0x5a) || (cc >= 0x61 && cc <= 0x7a);\n}\nfunction isTagNameEndCC(cc: number): boolean { // /[\\s/>]/\n  return cc === 0x2f || cc === 0x3e || isWhitespaceCC(cc);\n}\nfunction isAttrNameEndCC(cc: number): boolean { // /[\\s/>=]/\n  return cc === 0x2f || cc === 0x3e || cc === 0x3d || isWhitespaceCC(cc);\n}\n\ninterface ParserHandlers {\n  onopentag?: (name: string, attribs: Attributes) => void;\n  ontext?: (text: string, clean?: boolean) => void;\n  onclosetag?: (name: string, isImplied: boolean) => void;\n  oncomment?: (text: string) => void;\n}\n\ninterface RawAttribute {\n  name: string;\n  value: string;\n}\n\n// Shared, never-mutated empty attribute list — lets attribute-less tags (the\n// majority: <p>, <li>, <strong>, …) skip allocating a fresh array each.\nconst EMPTY_RAW_ATTRS: RawAttribute[] = [];\n\n/**\n * Find the end of an HTML comment opened at `openIdx` (`<!--` at openIdx).\n * Mirrors htmlparser2's InCommentLike with sequenceIndex=2 after the opening\n * `--` — supports short comments like `<!-->` as well as `-->`, `--->`, etc.\n * Returns [contentStart, closeGtIdx] or null if unclosed.\n */\nfunction findCommentEnd(input: string, openIdx: number): [number, number] | null {\n  const contentStart = openIdx + 4;\n  const seq = '-->';\n  let seqIdx = 2;\n  for (let j = contentStart; j < input.length; j++) {\n    const c = input[j];\n    if (c === seq[seqIdx]) {\n      if (++seqIdx === seq.length) {\n        return [contentStart, j];\n      }\n    } else if (seqIdx === 0) {\n      const dash = input.indexOf('-', j);\n      if (dash === -1) return null;\n      j = dash;\n      seqIdx = 1;\n    } else if (c !== seq[seqIdx - 1]) {\n      seqIdx = 0;\n    }\n  }\n  return null;\n}\n\nclass Parser {\n  private h: ParserHandlers;\n  private lowerCaseTags: boolean;\n  private lowerCaseAttribs: boolean;\n  private decode: boolean;\n  private input = '';\n  endIndex = -1;\n  private stack: string[] = [];\n\n  constructor(handlers: ParserHandlers, opts: ParserOptions = {}) {\n    this.h = handlers;\n    this.lowerCaseTags = opts.lowerCaseTags !== false;\n    this.lowerCaseAttribs = typeof opts.lowerCaseAttributeNames === 'boolean'\n      ? opts.lowerCaseAttributeNames\n      : this.lowerCaseTags;\n    this.decode = opts.decodeEntities !== false;\n  }\n\n  private emitText(text: string, decodeOverride?: boolean): void {\n    if (!text) return;\n    // Clean fast-path: text containing none of `& < >` is untouched by BOTH\n    // entity decoding and HTML escaping, so emit it verbatim and tell the\n    // handler to skip escapeHtml — one scan instead of decode+escape's two.\n    if (!ESCAPE_SCAN.test(text)) {\n      if (this.h.ontext) this.h.ontext(text, true);\n      return;\n    }\n    if (this.decode && decodeOverride !== false) text = decodeEntitiesString(text, false);\n    if (this.h.ontext) this.h.ontext(text, false);\n  }\n\n  private emitOpen(rawName: string, attribs: RawAttribute[], selfClosing: boolean): void {\n    const name = this.lowerCaseTags ? rawName.toLowerCase() : rawName;\n    if (has(OPEN_IMPLIES_CLOSE, name)) {\n      const closers = OPEN_IMPLIES_CLOSE[name];\n      while (this.stack.length && closers.has(this.stack[this.stack.length - 1])) {\n        const top = this.stack.pop()!;\n        if (this.h.onclosetag) this.h.onclosetag(top, true);\n      }\n    }\n    const attrObj: Attributes = {};\n    for (const a of attribs) {\n      const key = this.lowerCaseAttribs ? a.name.toLowerCase() : a.name;\n      if (!(key in attrObj)) {\n        // Skip the decode call entirely when there's no `&` to decode.\n        const v = a.value;\n        attrObj[key] = (this.decode && v.indexOf('&') !== -1)\n          ? decodeEntitiesString(v, true) : v;\n      }\n    }\n    if (this.h.onopentag) this.h.onopentag(name, attrObj);\n    // Per HTML5, only void tags auto-close on `/>`; the slash on a non-void\n    // tag is silently ignored.\n    if (VOID_TAGS.has(name)) {\n      if (this.h.onclosetag) this.h.onclosetag(name, true);\n      return;\n    }\n    // Inside SVG/MathML (foreign content), `/>` self-closes any element\n    // (e.g. `<animate />`), unlike in the HTML namespace.\n    if (\n      selfClosing &&\n      (name === 'svg' || name === 'math' ||\n        this.stack.indexOf('svg') !== -1 || this.stack.indexOf('math') !== -1)\n    ) {\n      if (this.h.onclosetag) this.h.onclosetag(name, false);\n      return;\n    }\n    this.stack.push(name);\n  }\n\n  private emitClose(rawName: string, isImplied: boolean): void {\n    const name = this.lowerCaseTags ? rawName.toLowerCase() : rawName;\n    for (let i = this.stack.length - 1; i >= 0; i--) {\n      if (this.stack[i] === name) {\n        while (this.stack.length > i + 1) {\n          const top = this.stack.pop()!;\n          if (this.h.onclosetag) this.h.onclosetag(top, true);\n        }\n        this.stack.pop();\n        if (this.h.onclosetag) this.h.onclosetag(name, !!isImplied);\n        return;\n      }\n    }\n    // Tag not on stack. htmlparser2 synthesizes an element for two cases:\n    //   </p>  with no open <p>  → an empty <p></p>\n    //   </br>                   → <br />\n    if (name === 'p') {\n      this.emitOpen('p', [], false); // opens & pushes <p>\n      this.emitClose('p', true); // immediately closes it\n    } else if (name === 'br') {\n      this.emitOpen('br', [], false); // br is void → emits <br /> and self-closes\n    }\n    // Any other unmatched close tag is dropped.\n  }\n\n  write(chunk: string): void {\n    this.input += chunk;\n  }\n\n  end(): void {\n    this.parse();\n    while (this.stack.length) {\n      const top = this.stack.pop()!;\n      if (this.h.onclosetag) this.h.onclosetag(top, true);\n    }\n  }\n\n  /** Single-pass tokenizer. Sets `endIndex` as it goes. */\n  private parse(): void {\n    const input = this.input;\n    const len = input.length;\n    let i = 0;\n    let textStart = 0;\n    this.endIndex = -1;\n    // Lazily lower-cased copy of the whole input, used only to find raw-text\n    // close tags. Computed at most once per parse (not once per <script>/<style>).\n    let lowerInputCache: string | null = null;\n\n    const flushText = (until: number, decode?: boolean) => {\n      if (until > textStart) {\n        const text = input.substring(textStart, until);\n        this.emitText(text, decode);\n        this.endIndex = until;\n      }\n      textStart = until;\n    };\n\n    while (i < len) {\n      // Jump to the next `<` with a native (SIMD-optimized) indexOf instead of a\n      // manual per-char loop — a big win for long plain-text runs.\n      if (input.charCodeAt(i) !== 0x3c) {\n        const lt = input.indexOf('<', i + 1);\n        if (lt === -1) break;\n        i = lt;\n      }\n      const nextCC = input.charCodeAt(i + 1); // 0x21=! 0x3f=? 0x2f=/ 0x2d=-\n      // Comment <!-- ... --> — htmlparser2 sequence match (not naive indexOf).\n      if (nextCC === 0x21 && input.charCodeAt(i + 2) === 0x2d && input.charCodeAt(i + 3) === 0x2d) {\n        flushText(i);\n        const end = findCommentEnd(input, i);\n        if (!end) return;\n        const [contentStart, closeGt] = end;\n        if (this.h.oncomment) this.h.oncomment(input.substring(contentStart, closeGt - 2));\n        i = closeGt + 1;\n        textStart = i;\n        this.endIndex = i;\n        continue;\n      }\n      // CDATA section <![CDATA[ ... ]]> — discarded in HTML mode (htmlparser2\n      // treats it like a comment ending at ]]>, so its contents never leak).\n      if (nextCC === 0x21 && input.substring(i + 2, i + 9) === '[CDATA[') {\n        flushText(i);\n        const end = input.indexOf(']]>', i + 9);\n        if (end === -1) return;\n        i = end + 3;\n        textStart = i;\n        this.endIndex = i;\n        continue;\n      }\n      // DOCTYPE / processing instruction / bogus <!…> declarations.\n      // Mirrors htmlparser2: `<!--` is handled above; a lone `<!-` (not `<!--`)\n      // emits the tail as text; `<!>` emits `>`; `<!-x>` is a silent declaration.\n      if (nextCC === 0x21 || nextCC === 0x3f) {\n        flushText(i);\n        if (nextCC === 0x3f) {\n          const end = input.indexOf('>', i + 2);\n          if (end === -1) { i += 2; textStart = i; continue; }\n          i = end + 1;\n          textStart = i;\n          this.endIndex = i;\n          continue;\n        }\n        const c2 = input.charCodeAt(i + 2);\n        if (c2 === 0x2d) {\n          const c3 = input.charCodeAt(i + 3);\n          if (c3 === 0x3e || c3 === undefined || Number.isNaN(c3)) {\n            i += 2;\n            textStart = i;\n            this.endIndex = i;\n            continue;\n          }\n          const end = input.indexOf('>', i + 2);\n          if (end === -1) { i += 2; textStart = i; continue; }\n          i = end + 1;\n          textStart = i;\n          this.endIndex = i;\n          continue;\n        }\n        if (c2 === 0x3e) {\n          i += 2;\n          textStart = i;\n          this.endIndex = i;\n          continue;\n        }\n        const end = input.indexOf('>', i + 2);\n        if (end === -1) { i += 2; textStart = i; continue; }\n        i = end + 1;\n        textStart = i;\n        this.endIndex = i;\n        continue;\n      }\n      // Closing tag </name>. Mirror htmlparser2's \"before closing tag name\":\n      // skip whitespace, then `>` emits the run as text, a letter starts the\n      // name, and anything else is a bogus comment (discarded to `>`).\n      if (nextCC === 0x2f) {\n        flushText(i);\n        let j = i + 2;\n        while (j < len && isWhitespaceCC(input.charCodeAt(j))) j++;\n        const c = input[j];\n        if (c === undefined) {\n          this.emitText(input.substring(i), false); // `</` at EOF → literal text\n          this.endIndex = len;\n          textStart = len;\n          return;\n        }\n        if (c === '>') {\n          // `</>` / `</ >` → the whole run is emitted as literal text.\n          this.emitText(input.substring(i, j + 1), false);\n          i = j + 1;\n          textStart = i;\n          this.endIndex = i;\n          continue;\n        }\n        if (!isNameStartCC(c.charCodeAt(0))) {\n          // Bogus comment (e.g. `</1>`, `</!>`) — discard through `>`.\n          const end = input.indexOf('>', j);\n          if (end === -1) return;\n          i = end + 1;\n          textStart = i;\n          this.endIndex = i;\n          continue;\n        }\n        const nameStart = j;\n        while (j < len && !isTagNameEndCC(input.charCodeAt(j))) j++;\n        const nameEnd = j;\n        while (j < len && input[j] !== '>') j++;\n        if (j >= len) return;\n        const rawName = input.substring(nameStart, nameEnd);\n        this.emitClose(rawName, false);\n        i = j + 1;\n        textStart = i;\n        this.endIndex = i;\n        continue;\n      }\n      // Opening tag <name ...>  (charCodeAt is NaN past EOF, so a trailing `<`\n      // falls through to the stray-`<` handler, matching the old undefined check)\n      if (isNameStartCC(input.charCodeAt(i + 1))) {\n        flushText(i);\n        const tokenStart = i;\n        let j = i + 1;\n        const nameStart = j;\n        // Tag name runs until whitespace, `/`, or `>` (matching htmlparser2);\n        // it may contain `:`, `-`, `<`, etc. (e.g. `media:content`, `rdf:RDF`).\n        while (j < len && !isTagNameEndCC(input.charCodeAt(j))) j++;\n        const rawName = input.substring(nameStart, j);\n        let attribs: RawAttribute[] = EMPTY_RAW_ATTRS; // lazily allocated on first attr\n        let selfClosing = false;\n        let finished = false;\n        while (j < len) {\n          while (j < len && isWhitespaceCC(input.charCodeAt(j))) j++;\n          if (j >= len) break;\n          const c = input[j];\n          if (c === '>') { j++; finished = true; break; }\n          if (c === '/') {\n            j++;\n            while (j < len && isWhitespaceCC(input.charCodeAt(j))) j++;\n            if (input[j] === '>') {\n              selfClosing = true; j++; finished = true; break;\n            }\n            continue;\n          }\n          const attrNameStart = j;\n          while (j < len && !isAttrNameEndCC(input.charCodeAt(j))) j++;\n          let attrName = input.substring(attrNameStart, j);\n          // htmlparser2 treats a lone `=` as an attribute name (`<a ==b>` → { '=': 'b' }).\n          if (!attrName && input[j] === '=') {\n            attrName = '=';\n            j++;\n          }\n          if (!attrName) {\n            j++;\n            continue;\n          }\n          while (j < len && isWhitespaceCC(input.charCodeAt(j))) j++;\n          let attrValue = '';\n          if (input[j] === '=') {\n            j++;\n            while (j < len && isWhitespaceCC(input.charCodeAt(j))) j++;\n            if (input[j] === '\"' || input[j] === \"'\") {\n              const q = input[j];\n              j++;\n              const valStart = j;\n              // Native scan to the closing quote (faster than a manual loop for\n              // long values like URLs / data URIs).\n              const close = input.indexOf(q, j);\n              j = close === -1 ? len : close;\n              attrValue = input.substring(valStart, j);\n              if (j < len) j++; // skip the closing quote\n            } else {\n              const valStart = j;\n              let vcc: number;\n              while (j < len && (vcc = input.charCodeAt(j)) !== 0x3e && !isWhitespaceCC(vcc)) j++;\n              attrValue = input.substring(valStart, j);\n            }\n          }\n          if (attribs === EMPTY_RAW_ATTRS) attribs = [];\n          attribs.push({ name: attrName, value: attrValue });\n        }\n        if (!finished) {\n          // Match htmlparser2 quirk: emit any `/` chars in the unfinished tag\n          // as text. (e.g. `<div/` produces a `/` text event.)\n          const unfinished = input.substring(tokenStart, len);\n          if (unfinished.indexOf('/') !== -1) {\n            const slashCount = (unfinished.match(/\\//g) || []).length;\n            for (let s = 0; s < slashCount; s++) this.emitText('/', false);\n            this.endIndex = len;\n            textStart = len;\n            return;\n          }\n          textStart = tokenStart;\n          return;\n        }\n        this.emitOpen(rawName, attribs, selfClosing);\n        i = j;\n        textStart = i;\n        this.endIndex = i;\n\n        const rawNameLower = rawName.toLowerCase();\n        const tagNameNorm = this.lowerCaseTags ? rawNameLower : rawName;\n        if (!selfClosing && !VOID_TAGS.has(tagNameNorm) && RAW_TEXT_TAGS.has(rawNameLower)) {\n          // htmlparser2 decodes entities inside <title> (RCDATA) only.\n          const decodeRaw = RCDATA_DECODE_TAGS.has(rawNameLower);\n          const lowerInput = lowerInputCache ?? (lowerInputCache = input.toLowerCase());\n          const closeNeedle = '</' + rawNameLower;\n          let searchFrom = i;\n          let found = -1;\n          while (true) {\n            const idx = lowerInput.indexOf(closeNeedle, searchFrom);\n            if (idx === -1) break;\n            const after = input.charAt(idx + closeNeedle.length);\n            if (after === '' || after === '>' || after === '/' || WS_RE.test(after)) {\n              found = idx;\n              break;\n            }\n            searchFrom = idx + 1;\n          }\n          if (found === -1) {\n            const raw = input.substring(i);\n            if (raw) this.emitText(raw, decodeRaw);\n            this.endIndex = len;\n            if (this.stack[this.stack.length - 1] === tagNameNorm) {\n              this.stack.pop();\n              if (this.h.onclosetag) this.h.onclosetag(tagNameNorm, true);\n            }\n            i = len;\n            textStart = i;\n            continue;\n          }\n          if (found > i) {\n            const raw = input.substring(i, found);\n            this.emitText(raw, decodeRaw);\n          }\n          let k = found + closeNeedle.length;\n          while (k < len && input[k] !== '>') k++;\n          if (k >= len) {\n            textStart = found;\n            return;\n          }\n          this.emitClose(rawNameLower, false);\n          i = k + 1;\n          textStart = i;\n          this.endIndex = i;\n          continue;\n        }\n        continue;\n      }\n      // Stray `<` — emit as text, advance one char, keep parsing.\n      flushText(i);\n      this.emitText('<', false);\n      i++;\n      textStart = i;\n      this.endIndex = i;\n    }\n    if (textStart < len) {\n      const text = input.substring(textStart);\n      this.emitText(text);\n      this.endIndex = len;\n    } else if (this.endIndex < 0) {\n      this.endIndex = textStart;\n    }\n  }\n}\n\n// =============================================================================\n// URL safety helper (replaces launder.naughtyHref)\n// =============================================================================\n\n// Fast-path scans for escapeHtml: only allocate when something needs escaping.\nconst ESCAPE_SCAN = /[&<>]/;\nconst ESCAPE_SCAN_Q = /[&<>\"]/;\n\n// Base URL for parseUrl's relative-URL detection. The long, constant path-segment\n// list is built once at module load instead of on every parseUrl call.\nconst PARSE_URL_BASE = (() => {\n  let base = 'relative://relative-site';\n  for (let i = 0; i < 100; i++) base += `/${i}`;\n  return base;\n})();\n\n// eslint-disable-next-line no-control-regex\nconst HREF_CONTROL_CHARS_G = /[\\x00-\\x20]+/g;\n// Hoisted (like HREF_CONTROL_CHARS_G) so naughtyHrefImpl doesn't re-create a\n// RegExp wrapper per href. Both non-global → no lastIndex state to share.\nconst HREF_SCHEME_RE = /^([a-zA-Z][a-zA-Z0-9.\\-+]*):/;\nconst HREF_PROTOCOL_REL_RE = /^[/\\\\]{2}/;\n\nfunction cleanHref(href: string): string {\n  href = href.replace(HREF_CONTROL_CHARS_G, '');\n  let firstIndex = href.indexOf('<!--');\n  while (firstIndex !== -1) {\n    const lastIndex = href.indexOf('-->', firstIndex + 4);\n    if (lastIndex === -1) break;\n    href = href.substring(0, firstIndex) + href.substring(lastIndex + 3);\n    firstIndex = href.indexOf('<!--');\n  }\n  return href;\n}\n\ninterface NaughtyHrefOptions {\n  allowedSchemes?: string[];\n  allowProtocolRelative?: boolean;\n}\n\nfunction naughtyHrefImpl(\n  href: unknown,\n  options: NaughtyHrefOptions = {}\n): boolean {\n  const allowedSchemes = options.allowedSchemes ||\n    [ 'http', 'https', 'ftp', 'mailto', 'tel', 'sms' ];\n  const allowProtocolRelative = options.allowProtocolRelative !== false;\n  if (typeof href !== 'string') return false;\n  href = cleanHref(href);\n  const matches = (href as string).match(HREF_SCHEME_RE);\n  if (!matches) {\n    if (HREF_PROTOCOL_REL_RE.test(href as string)) return !allowProtocolRelative;\n    return false;\n  }\n  const scheme = matches[1].toLowerCase();\n  return allowedSchemes.indexOf(scheme) === -1;\n}\n\n// =============================================================================\n// srcset parser (replaces parse-srcset)\n// =============================================================================\n\ninterface SrcsetEntry {\n  url: string;\n  w?: number;\n  h?: number;\n  d?: number;\n  evil?: boolean;\n}\n\n// parse-srcset uses the WHATWG ASCII whitespace set, NOT JS `\\s` (which also\n// matches U+00A0 etc.) — so e.g. `&nbsp;` stays part of a candidate URL.\nconst SRCSET_WS = /[\\t\\n\\f\\r ]/;\n// Mirrors parse-srcset@1.0.2 descriptor validation exactly.\nconst SRCSET_NON_NEG_INT = /^\\d+$/;\nconst SRCSET_FLOAT = /^-?(?:[0-9]+|[0-9]*\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/;\n\nfunction parseSrcset(input: string): SrcsetEntry[] {\n  // Faithful port of parse-srcset@1.0.2 (used by sanitize-html).\n  const candidates: SrcsetEntry[] = [];\n  const inputLength = input.length;\n  let pos = 0;\n\n  const isSpace = (c: string) =>\n    c === '\\u0020' || c === '\\u0009' || c === '\\u000A' || c === '\\u000C' || c === '\\u000D';\n\n  const collectLeading = (re: RegExp): string => {\n    const m = re.exec(input.substring(pos));\n    if (m) {\n      const chars = m[0];\n      pos += chars.length;\n      return chars;\n    }\n    return '';\n  };\n\n  const parseDescriptors = (url: string, descriptors: string[]): void => {\n    let pError = false;\n    let w: number | undefined;\n    let d: number | undefined;\n    let h: number | undefined;\n    const entry: SrcsetEntry = { url };\n\n    for (let di = 0; di < descriptors.length; di++) {\n      const desc = descriptors[di];\n      const lastChar = desc[desc.length - 1];\n      const value = desc.substring(0, desc.length - 1);\n      const intVal = parseInt(value, 10);\n      const floatVal = parseFloat(value);\n      if (SRCSET_NON_NEG_INT.test(value) && lastChar === 'w') {\n        if (w != null || d != null) pError = true;\n        else if (intVal === 0) pError = true;\n        else w = intVal;\n      } else if (SRCSET_FLOAT.test(value) && lastChar === 'x') {\n        if (w != null || d != null || h != null) pError = true;\n        else if (floatVal < 0) pError = true;\n        else d = floatVal;\n      } else if (SRCSET_NON_NEG_INT.test(value) && lastChar === 'h') {\n        if (h != null || d != null) pError = true;\n        else if (intVal === 0) pError = true;\n        else h = intVal;\n      } else {\n        pError = true;\n      }\n    }\n\n    if (!pError) {\n      if (w != null) entry.w = w;\n      if (d != null) entry.d = d;\n      if (h != null) entry.h = h;\n      candidates.push(entry);\n    } else if (typeof console !== 'undefined' && console.log) {\n      const bad = descriptors.find((desc) => {\n        const lastChar = desc[desc.length - 1];\n        const value = desc.substring(0, desc.length - 1);\n        const intVal = parseInt(value, 10);\n        const floatVal = parseFloat(value);\n        if (SRCSET_NON_NEG_INT.test(value) && lastChar === 'w') return intVal === 0;\n        if (SRCSET_FLOAT.test(value) && lastChar === 'x') return floatVal < 0;\n        if (SRCSET_NON_NEG_INT.test(value) && lastChar === 'h') return intVal === 0;\n        return true;\n      }) ?? descriptors[descriptors.length - 1];\n      console.log(`Invalid srcset descriptor found in '${input}' at '${bad}'.`);\n    }\n  };\n\n  const tokenize = (url: string): void => {\n    const descriptors: string[] = [];\n    let currentDescriptor = '';\n    let state: 'in descriptor' | 'in parens' | 'after descriptor' = 'in descriptor';\n\n    while (true) {\n      const c = pos < inputLength ? input[pos] : '';\n      if (state === 'in descriptor') {\n        if (isSpace(c)) {\n          if (currentDescriptor) {\n            descriptors.push(currentDescriptor);\n            currentDescriptor = '';\n            state = 'after descriptor';\n          }\n        } else if (c === ',') {\n          pos++;\n          if (currentDescriptor) descriptors.push(currentDescriptor);\n          parseDescriptors(url, descriptors);\n          return;\n        } else if (c === '(') {\n          currentDescriptor += c;\n          state = 'in parens';\n        } else if (c === '') {\n          if (currentDescriptor) descriptors.push(currentDescriptor);\n          parseDescriptors(url, descriptors);\n          return;\n        } else {\n          currentDescriptor += c;\n        }\n      } else if (state === 'in parens') {\n        if (c === ')') {\n          currentDescriptor += c;\n          state = 'in descriptor';\n        } else if (c === '') {\n          descriptors.push(currentDescriptor);\n          parseDescriptors(url, descriptors);\n          return;\n        } else {\n          currentDescriptor += c;\n        }\n      } else if (state === 'after descriptor') {\n        if (isSpace(c)) {\n          // stay\n        } else if (c === '') {\n          parseDescriptors(url, descriptors);\n          return;\n        } else {\n          state = 'in descriptor';\n          pos--;\n        }\n      }\n      pos++;\n    }\n  };\n\n  while (true) {\n    collectLeading(/^[, \\t\\n\\r\\u000c]+/);\n    if (pos >= inputLength) return candidates;\n\n    const urlMatch = /^[^ \\t\\n\\r\\u000c]+/.exec(input.substring(pos));\n    if (!urlMatch) return candidates;\n    let url = urlMatch[0];\n    pos += url.length;\n\n    const descriptors: string[] = [];\n    if (url.endsWith(',')) {\n      url = url.replace(/,+$/, '');\n      parseDescriptors(url, descriptors);\n    } else {\n      tokenize(url);\n    }\n  }\n}\n\nfunction stringifySrcset(parsed: SrcsetEntry[]): string {\n  return parsed.map((part) => {\n    if (!part.url) throw new Error('URL missing');\n    return (\n      part.url +\n      (part.w ? ` ${part.w}w` : '') +\n      (part.h ? ` ${part.h}h` : '') +\n      (part.d ? ` ${part.d}x` : '')\n    );\n  }).join(', ');\n}\n\n// =============================================================================\n// Style attribute parser (replaces postcss)\n// =============================================================================\n\ninterface StyleDecl {\n  // `undefined` for postcss comment nodes, which stringify as `undefined:undefined`.\n  prop?: string;\n  value?: string;\n  important: boolean;\n}\n\ninterface StyleRule {\n  selector: string;\n  nodes: StyleDecl[];\n}\n\ninterface StyleAst {\n  nodes: StyleRule[];\n}\n\n/** Remove `/* ... *​/` comments from a string, leaving quoted strings intact. */\nfunction stripStyleComments(s: string): string {\n  if (s.indexOf('/*') === -1) return s;\n  let out = '';\n  let k = 0;\n  let str: string | null = null;\n  while (k < s.length) {\n    const c = s[k];\n    if (str) {\n      if (c === '\\\\') { out += s.slice(k, k + 2); k += 2; continue; }\n      if (c === str) str = null;\n      out += c; k++;\n      continue;\n    }\n    if (c === '\"' || c === \"'\") { str = c; out += c; k++; continue; }\n    if (c === '/' && s[k + 1] === '*') {\n      const end = s.indexOf('*/', k + 2);\n      k = (end === -1 ? s.length : end + 2);\n    } else {\n      out += c; k++;\n    }\n  }\n  return out;\n}\n\n/**\n * Parse an inline `style` value into declarations, reproducing the observable\n * behaviour of the original sanitize-html's postcss-based parser:\n *   - property names keep their original case (so case-sensitive `allowedStyles`\n *     allowlists are honoured — `COLOR` does not match a `color` rule);\n *   - `/* *​/` comments are stripped; `!important` is recognised with flexible\n *     whitespace; empty values (`color:`) are preserved;\n *   - malformed CSS that postcss rejects (unterminated string/comment/paren,\n *     a trailing `\\`, or stray braces) throws, so the caller drops the whole\n *     attribute rather than keeping a partial parse.\n */\nfunction parseStyleAst(name: string, value: string): StyleAst {\n  const decls: StyleDecl[] = [];\n  const len = value.length;\n  let i = 0;\n  while (i < len) {\n    // Scan one declaration up to the next top-level `;`, tracking strings,\n    // parentheses, escapes and comments. Record the first top-level `:`, the\n    // top-level comment ranges, and the bounds of the \"real\" (non-comment,\n    // non-whitespace) content so we can reproduce postcss's comment nodes.\n    let depth = 0;\n    let str: string | null = null;\n    let colon = -1;\n    let firstReal = -1;\n    let lastReal = -1;\n    const comments: Array<[number, number]> = [];\n    const markReal = (from: number, to: number) => {\n      if (firstReal === -1) firstReal = from;\n      lastReal = to;\n    };\n    while (i < len) {\n      const c = value[i];\n      if (str) {\n        if (c === '\\\\') { markReal(i, i + 2); i += 2; continue; }\n        if (c === str) str = null;\n        markReal(i, i + 1);\n        i++;\n        continue;\n      }\n      if (c === '\\\\') {\n        if (i + 1 >= len) throw new Error('Unexpected trailing backslash');\n        markReal(i, i + 2);\n        i += 2; // escaped char is part of the value (e.g. `\\;`)\n        continue;\n      }\n      if (c === '\"' || c === \"'\") { str = c; markReal(i, i + 1); i++; continue; }\n      if (c === '/' && value[i + 1] === '*') {\n        const end = value.indexOf('*/', i + 2);\n        if (end === -1) throw new Error('Unclosed comment');\n        comments.push([i, end + 2]);\n        i = end + 2;\n        continue;\n      }\n      if (c === '(') { depth++; markReal(i, i + 1); i++; continue; }\n      if (c === ')') { if (depth > 0) depth--; markReal(i, i + 1); i++; continue; }\n      // Real inline styles never contain braces; postcss treats these as rule\n      // boundaries (and throws on a stray `}`). Dropping the attribute is the\n      // safe, simplest match.\n      if (c === '{' || c === '}') throw new Error('Unexpected brace in style');\n      if (c === ';' && depth === 0) break;\n      if (c === ':' && depth === 0 && colon === -1) {\n        // The first top-level `:` separates prop from value; it is not \"real\"\n        // content, so an empty value (`color:`) is detected correctly. Later\n        // colons (e.g. IE `filter: progid:…`) are part of the value.\n        colon = i;\n        i++;\n        continue;\n      }\n      if (!WS_RE.test(c)) markReal(i, i + 1);\n      i++;\n    }\n    if (str !== null) throw new Error('Unclosed string');\n    if (depth > 0) throw new Error('Unclosed bracket');\n    if (i < len) i++; // consume `;`\n\n    // A segment with no real content is just comments/whitespace: postcss emits\n    // a comment node for each comment (rendered as `undefined:undefined`).\n    if (firstReal === -1) {\n      for (let n = 0; n < comments.length; n++) decls.push({ important: false });\n      continue;\n    }\n    // Comments before the first real char are standalone leading comment nodes.\n    for (const [s] of comments) if (s < firstReal) decls.push({ important: false });\n\n    if (colon === -1 || colon < firstReal) throw new Error('Missing colon in declaration');\n\n    const prop = stripStyleComments(value.substring(firstReal, colon)).trim();\n    if (prop === '' || /\\s/.test(prop)) throw new Error('Invalid property name');\n\n    // Value spans to the last real char (empty when the only content after the\n    // colon is comments/whitespace). Internal comments are stripped; trailing\n    // comments after a non-empty value become their own nodes.\n    const hasValue = lastReal > colon;\n    let val = stripStyleComments(value.substring(colon + 1, hasValue ? lastReal : colon + 1))\n      .replace(/^\\s+|\\s+$/g, '');\n    let important = false;\n    const impMatch = val.match(/!\\s*important\\s*$/i);\n    if (impMatch) {\n      important = true;\n      val = val.slice(0, impMatch.index).replace(/\\s+$/, '');\n    }\n    decls.push({ prop, value: val, important });\n\n    if (hasValue) {\n      for (const [s] of comments) if (s >= lastReal) decls.push({ important: false });\n    }\n  }\n  return { nodes: [ { selector: name, nodes: decls } ] };\n}\n\n// =============================================================================\n// Main sanitizer\n// =============================================================================\n\nconst mediaTags = [\n  'img', 'audio', 'video', 'picture', 'svg',\n  'object', 'map', 'iframe', 'embed'\n];\nconst vulnerableTags = [ 'script', 'style' ];\n\nconst VALID_HTML_ATTRIBUTE_NAME = /^[^\\0\\t\\n\\f\\r /<=>]+$/;\n/**\n * Fast equivalent of `VALID_HTML_ATTRIBUTE_NAME.test(a)`, valid ONLY for names\n * produced by this file's parser. The parser's attr-name scan (`isAttrNameEndCC`)\n * already stops at `/ > =` and every whitespace char, so a parser name can never\n * contain 8 of the regex's 10 forbidden chars — only `\\0` and `<` remain to\n * reject (plus the non-empty requirement). One charCode pass with two compares\n * beats entering the regex engine. MUST NOT be used on names that bypass the\n * parser scan (transform- or onOpenTag-injected) — `compileOptions` gates this\n * behind `parserCleanAttrNames`, and `test/attr-name-fast.test.ts` fuzz-proves\n * the equivalence end-to-end against the original.\n */\nfunction isAttrNameParserClean(a: string): boolean {\n  if (a.length === 0) return false;\n  for (let i = 0; i < a.length; i++) {\n    const c = a.charCodeAt(i);\n    // Mirror VALID_HTML_ATTRIBUTE_NAME — parser now allows `=` in names (htmlparser2\n    // parity) but the sanitizer must still reject them.\n    if (c === 0 || c === 9 || c === 10 || c === 12 || c === 13 || c === 32 ||\n        c === 47 || c === 60 || c === 61 || c === 62) return false;\n  }\n  return true;\n}\n\nconst htmlParserDefaults: ParserOptions = {\n  decodeEntities: true\n};\n\n// Stateless helpers (no per-document state) — hoisted to module scope so they\n// are defined once rather than recreated on every sanitize() call.\n\ninterface ParsedUrlResult {\n  isRelativeUrl: boolean;\n  url: URL;\n}\n\nfunction parseUrl(value: string): ParsedUrlResult {\n  value = value.replace(/^(\\w+:)?\\s*[\\\\/]\\s*[\\\\/]/, '$1//');\n  if (value.startsWith('relative:')) {\n    throw new Error('relative: exploit attempt');\n  }\n  const parsed = new URL(value, PARSE_URL_BASE);\n  const isRelativeUrl = !!parsed && parsed.hostname === 'relative-site' && parsed.protocol === 'relative:';\n  return { isRelativeUrl, url: parsed };\n}\n\nfunction filterDeclarations(selectedRule: Record<string, RegExp[]>) {\n  return (acc: StyleDecl[], decl: StyleDecl): StyleDecl[] => {\n    // Comment nodes (undefined prop) are dropped once an allowlist applies.\n    if (decl.prop !== undefined && has(selectedRule, decl.prop)) {\n      const matchesRegex = selectedRule[decl.prop].some((re) => re.test(decl.value ?? ''));\n      if (matchesRegex) acc.push(decl);\n    }\n    return acc;\n  };\n}\n\nfunction filterCss(ast: StyleAst, allowedStyles: AllowedStyles | undefined): StyleAst {\n  if (!allowedStyles) return ast;\n  const astRules = ast.nodes[0];\n  let selectedRule: Record<string, RegExp[]> | undefined;\n  if (allowedStyles[astRules.selector] && allowedStyles['*']) {\n    selectedRule = deepmerge(\n      allowedStyles[astRules.selector],\n      allowedStyles['*']\n    ) as Record<string, RegExp[]>;\n  } else {\n    selectedRule = allowedStyles[astRules.selector] || allowedStyles['*'];\n  }\n  if (selectedRule) {\n    ast.nodes[0].nodes = astRules.nodes.reduce(filterDeclarations(selectedRule), [] as StyleDecl[]);\n  }\n  return ast;\n}\n\nfunction stringifyStyleAttributes(filteredAst: StyleAst): string {\n  return filteredAst.nodes[0].nodes\n    .reduce<string[]>((acc, decl) => {\n      acc.push(`${decl.prop}:${decl.value}${decl.important ? ' !important' : ''}`);\n      return acc;\n    }, [])\n    .join(';');\n}\n\nfunction filterClasses(\n  classes: string,\n  allowed: string[] | false | undefined,\n  allowedGlobs: RegExp[]\n): string {\n  if (!allowed) return classes;\n  return classes.split(/\\s+/).filter((clss) => {\n    return allowed.indexOf(clss) !== -1 ||\n      allowedGlobs.some((glob) => glob.test(clss));\n  }).join(' ');\n}\n\ninterface Frame {\n  tag: string;\n  attribs: Attributes;\n  tagPosition: number;\n  text: string;\n  openingTagLength: number;\n  mediaChildren: string[];\n  innerText?: string;\n  name?: string;\n}\n\n// Hoisted out of `makeFrame` so each frame stays a closure-free plain object.\nfunction updateParentNodeText(stack: Frame[], frame: Frame): void {\n  if (stack.length) {\n    stack[stack.length - 1].text += frame.text;\n  }\n}\nfunction updateParentNodeMediaChildren(stack: Frame[], frame: Frame): void {\n  if (stack.length && mediaTags.includes(frame.tag)) {\n    stack[stack.length - 1].mediaChildren.push(frame.tag);\n  }\n}\n\n/**\n * Everything derived purely from `options` — resolved option set plus the\n * compiled allow-list maps. Building this is the expensive part, so a `Sanitizer`\n * does it once and reuses it across every `sanitize()` call.\n */\ninterface CompiledOptions {\n  opts: Required<Defaults> & IOptions;\n  nonTextTagsArray: string[];\n  allowedAttributesMap: Record<string, AllowedAttribute[]> | undefined;\n  allowedAttributesGlobMap: Record<string, RegExp> | undefined;\n  allowedClassesMap: Record<string, string[] | false>;\n  allowedClassesGlobMap: Record<string, RegExp>;\n  allowedClassesRegexMap: Record<string, RegExp[]>;\n  transformTagsMap: Record<string, Transformer>;\n  transformTagsAll: Transformer | undefined;\n  hasTransformTags: boolean;\n  // Precompiled membership sets (built once) to replace per-tag/per-attribute\n  // linear array scans. `allowedTagsSet` is null when allowedTags is `false` or\n  // a string (the latter keeps the original substring `indexOf` semantics).\n  allowedTagsSet: Set<string> | null;\n  schemeAttrSet: Set<string>;\n  emptyAttrSet: Set<string>;\n  nonBooleanAttrSet: Set<string>;\n  nonBooleanAttrStar: boolean;\n  selfClosingSet: Set<string>;\n  // `disallowedTagsMode` is a per-run constant, yet the handlers compared it\n  // against string literals on every tag/text node. Resolve those compares once\n  // here so the hot paths read a boolean. (`modeEscapeOrRecursive` also kills a\n  // per-close-tag `['escape','recursiveEscape'].indexOf(...)` array allocation.)\n  modeDiscardOrCompletely: boolean;\n  modeCompletelyDiscard: boolean;\n  modeEscapeOrRecursive: boolean;\n  modeRecursiveEscape: boolean;\n  // True when every attribute name reaching validation is parser-produced (no\n  // transform/onOpenTag injection), so the fast `isAttrNameParserClean` may\n  // replace the `VALID_HTML_ATTRIBUTE_NAME` regex byte-identically.\n  parserCleanAttrNames: boolean;\n}\n\nfunction compileOptions(options?: IOptions): CompiledOptions {\n  const opts: Required<Defaults> & IOptions =\n    Object.assign({}, sanitizeHtmlFn.defaults, options) as Required<Defaults> & IOptions;\n  opts.parser = Object.assign({}, htmlParserDefaults, opts.parser);\n\n  const nonTextTagsArray = opts.nonTextTags || [\n    'script', 'style', 'textarea', 'option', 'xmp'\n  ];\n\n  let allowedAttributesMap: Record<string, AllowedAttribute[]> | undefined;\n  let allowedAttributesGlobMap: Record<string, RegExp> | undefined;\n  if (opts.allowedAttributes) {\n    allowedAttributesMap = {};\n    allowedAttributesGlobMap = {};\n    each(opts.allowedAttributes as Record<string, AllowedAttribute[]>, (attributes, tag) => {\n      allowedAttributesMap![tag] = [];\n      const globRegex: string[] = [];\n      attributes.forEach((obj) => {\n        if (typeof obj === 'string' && obj.indexOf('*') >= 0) {\n          globRegex.push(escapeStringRegexp(obj).replace(/\\\\\\*/g, '.*'));\n        } else {\n          allowedAttributesMap![tag].push(obj);\n        }\n      });\n      if (globRegex.length) {\n        allowedAttributesGlobMap![tag] = new RegExp('^(' + globRegex.join('|') + ')$');\n      }\n    });\n  }\n\n  const allowedClassesMap: Record<string, string[] | false> = {};\n  const allowedClassesGlobMap: Record<string, RegExp> = {};\n  const allowedClassesRegexMap: Record<string, RegExp[]> = {};\n  each(opts.allowedClasses, (classes, tag) => {\n    if (allowedAttributesMap) {\n      if (!has(allowedAttributesMap, tag)) {\n        allowedAttributesMap[tag] = [];\n      }\n      allowedAttributesMap[tag].push('class');\n    }\n    allowedClassesMap[tag] = classes as string[] | false;\n    if (Array.isArray(classes)) {\n      const globRegex: string[] = [];\n      allowedClassesMap[tag] = [];\n      allowedClassesRegexMap[tag] = [];\n      classes.forEach((obj) => {\n        if (typeof obj === 'string' && obj.indexOf('*') >= 0) {\n          globRegex.push(escapeStringRegexp(obj).replace(/\\\\\\*/g, '.*'));\n        } else if (obj instanceof RegExp) {\n          allowedClassesRegexMap[tag].push(obj);\n        } else {\n          (allowedClassesMap[tag] as string[]).push(obj as string);\n        }\n      });\n      if (globRegex.length) {\n        allowedClassesGlobMap[tag] = new RegExp('^(' + globRegex.join('|') + ')$');\n      }\n    }\n  });\n\n  const transformTagsMap: Record<string, Transformer> = {};\n  let transformTagsAll: Transformer | undefined;\n  each(opts.transformTags, (transform, tag) => {\n    let transFun: Transformer | undefined;\n    if (typeof transform === 'function') {\n      transFun = transform as Transformer;\n    } else if (typeof transform === 'string') {\n      transFun = sanitizeHtmlFn.simpleTransform(transform);\n    }\n    if (!transFun) return;\n    if (tag === '*') transformTagsAll = transFun;\n    else transformTagsMap[tag] = transFun;\n  });\n\n  const allowedTagsSet = Array.isArray(opts.allowedTags) ? new Set(opts.allowedTags) : null;\n  const schemeAttrSet = new Set(opts.allowedSchemesAppliedToAttributes);\n  const emptyAttrSet = new Set(opts.allowedEmptyAttributes);\n  const nonBooleanAttrSet = new Set(opts.nonBooleanAttributes);\n  const nonBooleanAttrStar = nonBooleanAttrSet.has('*');\n  const selfClosingSet = new Set(opts.selfClosing);\n  const hasTransformTags = Object.keys(transformTagsMap).length > 0;\n\n  const dm = opts.disallowedTagsMode;\n  const modeCompletelyDiscard = dm === 'completelyDiscard';\n  const modeDiscardOrCompletely = dm === 'discard' || modeCompletelyDiscard;\n  const modeRecursiveEscape = dm === 'recursiveEscape';\n  const modeEscapeOrRecursive = dm === 'escape' || modeRecursiveEscape;\n\n  // The fast attr-name validator is only sound when no callback can inject an\n  // attribute name that skipped the parser's scan: `transformTags` (per-tag or\n  // `*`) returning fresh attribs, or `onOpenTag` mutating them. None present →\n  // every validated name is parser-clean.\n  const parserCleanAttrNames = !opts.onOpenTag && !hasTransformTags && !transformTagsAll;\n\n  return {\n    opts, nonTextTagsArray,\n    allowedAttributesMap, allowedAttributesGlobMap,\n    allowedClassesMap, allowedClassesGlobMap, allowedClassesRegexMap,\n    transformTagsMap, transformTagsAll, hasTransformTags,\n    allowedTagsSet, schemeAttrSet, emptyAttrSet, nonBooleanAttrSet, nonBooleanAttrStar,\n    selfClosingSet,\n    modeDiscardOrCompletely, modeCompletelyDiscard, modeEscapeOrRecursive, modeRecursiveEscape,\n    parserCleanAttrNames\n  };\n}\n\n/**\n * A sanitizer bound to a fixed set of options. Compile the options once, then\n * call `sanitize()` as many times as you like — ideal for hot paths that reuse\n * the same configuration across many documents.\n */\nclass Sanitizer {\n  private readonly compiled: CompiledOptions;\n\n  constructor(options?: IOptions) {\n    this.compiled = compileOptions(options);\n  }\n\n  sanitize(html: string | number | null | undefined): string {\n  if (html == null) return '';\n  if (typeof html === 'number') html = html.toString();\n  const inputHtml = html as string;\n\n  let result = '';\n  let tempResult = '';\n\n  const {\n    opts, nonTextTagsArray,\n    allowedAttributesMap, allowedAttributesGlobMap,\n    allowedClassesMap, allowedClassesGlobMap, allowedClassesRegexMap,\n    transformTagsMap, transformTagsAll, hasTransformTags,\n    allowedTagsSet, schemeAttrSet, emptyAttrSet, nonBooleanAttrSet, nonBooleanAttrStar,\n    selfClosingSet,\n    modeDiscardOrCompletely, modeCompletelyDiscard, modeEscapeOrRecursive, modeRecursiveEscape,\n    parserCleanAttrNames\n  } = this.compiled;\n\n  function makeFrame(tag: string, attribs: Attributes): Frame {\n    // Plain data object with a stable shape and NO per-frame closures (the\n    // parent-update helpers are hoisted to module scope) — much less GC churn\n    // on tag-dense documents.\n    return {\n      tag,\n      attribs: attribs || {},\n      tagPosition: result.length,\n      text: '',\n      openingTagLength: 0,\n      mediaChildren: []\n    };\n  }\n\n  const tagAllowed = (name: string | undefined): boolean => {\n    if (opts.allowedTags === false) return true;\n    if (allowedTagsSet) return allowedTagsSet.has(name as string);\n    // Non-array allowedTags (e.g. a string) keeps the original indexOf behaviour.\n    return ((opts.allowedTags as string[] | undefined) || []).indexOf(name as string) > -1;\n  };\n\n  vulnerableTags.forEach((tag) => {\n    if (tagAllowed(tag) && !opts.allowVulnerableTags) {\n      // eslint-disable-next-line no-console\n      console.warn(`\\n\\n⚠️ Your \\`allowedTags\\` option includes, \\`${tag}\\`, which is inherently\\nvulnerable to XSS attacks. Please remove it from \\`allowedTags\\`.\\nOr, to disable this warning, add the \\`allowVulnerableTags\\` option\\nand ensure you are accounting for this risk.\\n\\n`);\n    }\n  });\n\n  let depth = 0;\n  let stack: Frame[] = [];\n  let skipMap: Record<number, boolean> = {};\n  let transformMap: Record<number, string> = {};\n  let skipText = false;\n  let skipTextDepth = 0;\n  let addedText = false;\n\n  function initializeState(): void {\n    result = '';\n    depth = 0;\n    stack = [];\n    skipMap = {};\n    transformMap = {};\n    skipText = false;\n    skipTextDepth = 0;\n  }\n\n  initializeState();\n\n  function escapeHtml(s: string | number | undefined, quote?: boolean): string {\n    let str = typeof s !== 'string' ? '' + s : s;\n    if (opts.parser?.decodeEntities) {\n      // Fast path: most text/attribute values contain nothing to escape, so a\n      // single scan lets us return the original string with zero allocation.\n      if (quote ? !ESCAPE_SCAN_Q.test(str) : !ESCAPE_SCAN.test(str)) return str;\n      // Entities were decoded at parse time, so every `&` is literal — escape\n      // all of them. Chained native-string `.replace()` passes (callback-free)\n      // beat a single-pass `/[&<>]/g` + function replacer in the full pipeline:\n      // A/B showed the latter flat-to-slightly-worse (its per-match callback cost\n      // on dense decoded-entity text outweighs the fewer-scans win on sparse text).\n      str = str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n      return quote ? str.replace(/\"/g, '&quot;') : str;\n    }\n    // decodeEntities off: preserve already-encoded entities (`&amp;` etc.).\n    str = str.replace(/&(?![a-zA-Z0-9#]{1,20};)/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;');\n    return quote ? str.replace(/\"/g, '&quot;') : str;\n  }\n\n  function naughtyHref(name: string, href: string): boolean {\n    const allowedSchemes = has(opts.allowedSchemesByTag, name)\n      ? opts.allowedSchemesByTag[name]\n      : (opts.allowedSchemes || []);\n    return naughtyHrefImpl(href, {\n      allowedSchemes,\n      allowProtocolRelative: opts.allowProtocolRelative\n    });\n  }\n\n  const parser = new Parser({\n    onopentag(name, attribs) {\n      if (opts.onOpenTag) opts.onOpenTag(name, attribs);\n\n      if (opts.enforceHtmlBoundary && name === 'html') {\n        initializeState();\n      }\n\n      if (skipText) {\n        skipTextDepth++;\n        return;\n      }\n\n      const frame = makeFrame(name, attribs);\n      stack.push(frame);\n\n      let skip = false;\n      // (frame.text is always '' here — text only arrives via later ontext calls.)\n      let transformedTag: TransformResult | undefined;\n      if (hasTransformTags && has(transformTagsMap, name)) {\n        transformedTag = transformTagsMap[name](name, attribs);\n        frame.attribs = attribs = transformedTag.attribs;\n        if (transformedTag.text !== undefined) {\n          frame.innerText = transformedTag.text;\n        }\n        if (name !== transformedTag.tagName) {\n          frame.name = name = transformedTag.tagName;\n          transformMap[depth] = transformedTag.tagName;\n        }\n      }\n      if (transformTagsAll) {\n        transformedTag = transformTagsAll(name, attribs);\n        frame.attribs = attribs = transformedTag.attribs;\n        if (name !== transformedTag.tagName) {\n          frame.name = name = transformedTag.tagName;\n          transformMap[depth] = transformedTag.tagName;\n        }\n      }\n\n      if (!tagAllowed(name) ||\n        (modeRecursiveEscape && !isEmptyObject(skipMap)) ||\n        (opts.nestingLimit != null && depth >= opts.nestingLimit)) {\n        skip = true;\n        skipMap[depth] = true;\n        if (modeDiscardOrCompletely) {\n          if (nonTextTagsArray.indexOf(name) !== -1) {\n            skipText = true;\n            skipTextDepth = 1;\n          }\n        }\n      }\n      depth++;\n      if (skip) {\n        if (modeDiscardOrCompletely) {\n          if (frame.innerText) {\n            const escaped = escapeHtml(frame.innerText);\n            if (opts.textFilter) result += opts.textFilter(escaped, name);\n            else result += escaped;\n            addedText = true;\n          }\n          return;\n        }\n        tempResult = result;\n        result = '';\n      }\n      result += '<' + name;\n\n      if (name === 'script') {\n        if (opts.allowedScriptHostnames || opts.allowedScriptDomains) {\n          frame.innerText = '';\n        }\n      }\n\n      const isBeingEscaped = skip && modeEscapeOrRecursive;\n      const shouldPreserveEscapedAttributes = isBeingEscaped && opts.preserveEscapedAttributes;\n      // Resolve `name`'s membership in the attribute allow-map ONCE — it gates the\n      // branch below AND selects this tag's allowed-attr list (was two has() calls).\n      const tagInAttrMap = allowedAttributesMap !== undefined && has(allowedAttributesMap, name);\n\n      if (shouldPreserveEscapedAttributes) {\n        each(attribs, (value, a) => {\n          result += ' ' + a + '=\"' + escapeHtml(value || '', true) + '\"';\n        });\n      } else if (!allowedAttributesMap || tagInAttrMap || allowedAttributesMap['*']) {\n        // Skip all of this when the tag has no attributes (the common case for\n        // <p>/<li>/<strong>/… — avoids 4 map lookups per attribute-less tag).\n        const attrKeys = Object.keys(attribs);\n        if (attrKeys.length) {\n        // These lookups are constant across all of this tag's attributes, so\n        // resolve them once instead of re-doing has()/property access per attr.\n        const tagAttrList = tagInAttrMap\n          ? (allowedAttributesMap![name] as AllowedAttribute[]) : undefined;\n        const starAttrList = allowedAttributesMap\n          ? (allowedAttributesMap['*'] as AllowedAttribute[] | undefined) : undefined;\n        const tagGlob = (allowedAttributesGlobMap && has(allowedAttributesGlobMap, name))\n          ? allowedAttributesGlobMap[name] : undefined;\n        const starGlob = allowedAttributesGlobMap ? allowedAttributesGlobMap['*'] : undefined;\n        for (const a of attrKeys) {\n          let value = attribs[a];\n          if (!(parserCleanAttrNames ? isAttrNameParserClean(a) : VALID_HTML_ATTRIBUTE_NAME.test(a))) {\n            delete frame.attribs[a];\n            continue;\n          }\n          if (value === '' && !emptyAttrSet.has(a) &&\n            (nonBooleanAttrStar || nonBooleanAttrSet.has(a))) {\n            delete frame.attribs[a];\n            continue;\n          }\n          let passedAllowedAttributesMapCheck = false;\n          if (!allowedAttributesMap ||\n            (tagAttrList && tagAttrList.indexOf(a) !== -1) ||\n            (starAttrList && starAttrList.indexOf(a) !== -1) ||\n            (tagGlob && tagGlob.test(a)) ||\n            (starGlob && starGlob.test(a))) {\n            passedAllowedAttributesMapCheck = true;\n          } else if (allowedAttributesMap && allowedAttributesMap[name]) {\n            for (const o of allowedAttributesMap[name]) {\n              if (isPlainObject(o)) {\n                const obj = o as unknown as AllowedAttributeObject;\n                if (obj.name && obj.name === a) {\n                  passedAllowedAttributesMapCheck = true;\n                  let newValue = '';\n                  if (obj.multiple === true) {\n                    const parts = value.split(' ');\n                    for (const s of parts) {\n                      if (obj.values.indexOf(s) !== -1) {\n                        newValue = newValue === '' ? s : newValue + ' ' + s;\n                      }\n                    }\n                  } else if (obj.values.indexOf(value) >= 0) {\n                    newValue = value;\n                  }\n                  value = newValue;\n                }\n              }\n            }\n          }\n          if (passedAllowedAttributesMapCheck) {\n            if (schemeAttrSet.has(a)) {\n              if (naughtyHref(name, value)) {\n                delete frame.attribs[a];\n                continue;\n              }\n            }\n\n            if (name === 'script' && a === 'src') {\n              let allowed: unknown = true;\n              try {\n                const parsed = parseUrl(value);\n                if (opts.allowedScriptHostnames || opts.allowedScriptDomains) {\n                  const allowedHostname = (opts.allowedScriptHostnames || [])\n                    .find((hostname) => hostname === parsed.url.hostname);\n                  const allowedDomain = (opts.allowedScriptDomains || [])\n                    .find((domain) => parsed.url.hostname === domain || parsed.url.hostname.endsWith(`.${domain}`));\n                  allowed = allowedHostname || allowedDomain;\n                }\n              } catch {\n                allowed = false;\n              }\n              if (!allowed) {\n                delete frame.attribs[a];\n                continue;\n              }\n            }\n\n            if (name === 'iframe' && a === 'src') {\n              let allowed: unknown = true;\n              try {\n                const parsed = parseUrl(value);\n                if (parsed.isRelativeUrl) {\n                  allowed = has(opts, 'allowIframeRelativeUrls')\n                    ? opts.allowIframeRelativeUrls\n                    : (!opts.allowedIframeHostnames && !opts.allowedIframeDomains);\n                } else if (opts.allowedIframeHostnames || opts.allowedIframeDomains) {\n                  const allowedHostname = (opts.allowedIframeHostnames || [])\n                    .find((hostname) => hostname === parsed.url.hostname);\n                  const allowedDomain = (opts.allowedIframeDomains || [])\n                    .find((domain) => parsed.url.hostname === domain || parsed.url.hostname.endsWith(`.${domain}`));\n                  allowed = allowedHostname || allowedDomain;\n                }\n              } catch {\n                allowed = false;\n              }\n              if (!allowed) {\n                delete frame.attribs[a];\n                continue;\n              }\n            }\n\n            if (a === 'srcset' || a === 'imagesrcset') {\n              try {\n                let parsed = parseSrcset(value);\n                parsed.forEach((v) => {\n                  if (naughtyHref(a, v.url)) v.evil = true;\n                });\n                parsed = filter(parsed, (v) => !v.evil);\n                if (!parsed.length) {\n                  delete frame.attribs[a];\n                  continue;\n                } else {\n                  value = stringifySrcset(filter(parsed, (v) => !v.evil));\n                  frame.attribs[a] = value;\n                }\n              } catch {\n                delete frame.attribs[a];\n                continue;\n              }\n            }\n\n            if (a === 'class') {\n              const allowedSpecificClasses = allowedClassesMap[name];\n              const allowedWildcardClasses = allowedClassesMap['*'];\n              const allowedSpecificClassesGlob = allowedClassesGlobMap[name];\n              const allowedSpecificClassesRegex = allowedClassesRegexMap[name];\n              const allowedWildcardClassesRegex = allowedClassesRegexMap['*'];\n              const allowedWildcardClassesGlob = allowedClassesGlobMap['*'];\n              const allowedClassesGlobs: RegExp[] = [\n                allowedSpecificClassesGlob,\n                allowedWildcardClassesGlob\n              ]\n                .concat(allowedSpecificClassesRegex, allowedWildcardClassesRegex)\n                .filter((t): t is RegExp => !!t);\n              if (allowedSpecificClasses && allowedWildcardClasses) {\n                value = filterClasses(\n                  value,\n                  deepmerge(allowedSpecificClasses as string[], allowedWildcardClasses as string[]) as string[],\n                  allowedClassesGlobs\n                );\n              } else {\n                value = filterClasses(\n                  value,\n                  (allowedSpecificClasses || allowedWildcardClasses) as string[] | false | undefined,\n                  allowedClassesGlobs\n                );\n              }\n              if (!value.length) {\n                delete frame.attribs[a];\n                continue;\n              }\n            }\n\n            if (a === 'style') {\n              if (opts.parseStyleAttributes) {\n                try {\n                  const ast = parseStyleAst(name, value);\n                  const filteredAst = filterCss(ast, opts.allowedStyles);\n                  value = stringifyStyleAttributes(filteredAst);\n                  if (value.length === 0) {\n                    delete frame.attribs[a];\n                    continue;\n                  }\n                } catch {\n                  delete frame.attribs[a];\n                  continue;\n                }\n              } else if (opts.allowedStyles) {\n                throw new Error('allowedStyles option cannot be used together with parseStyleAttributes: false.');\n              }\n            }\n\n            // One concatenation per attribute (fewer intermediate rope nodes).\n            if (value && value.length) {\n              result += ' ' + a + '=\"' + escapeHtml(value, true) + '\"';\n            } else if (emptyAttrSet.has(a)) {\n              result += ' ' + a + '=\"\"';\n            } else {\n              result += ' ' + a;\n            }\n          } else {\n            delete frame.attribs[a];\n          }\n        }\n        }\n      }\n      if (selfClosingSet.has(name)) {\n        result += ' />';\n      } else {\n        result += '>';\n        if (frame.innerText && !opts.textFilter) {\n          result += escapeHtml(frame.innerText);\n          addedText = true;\n        }\n      }\n      if (skip) {\n        result = tempResult + escapeHtml(result);\n        tempResult = '';\n      }\n      frame.openingTagLength = result.length - frame.tagPosition;\n    },\n    ontext(text, clean) {\n      if (skipText) return;\n      const lastFrame = stack[stack.length - 1];\n      let tag: string | undefined;\n      if (lastFrame) {\n        tag = lastFrame.tag;\n        if (lastFrame.innerText !== undefined) {\n          text = lastFrame.innerText;\n          clean = false; // innerText overrides the source text → re-check on escape\n        }\n      }\n      if (modeCompletelyDiscard && !tagAllowed(tag)) {\n        text = '';\n      } else if (modeDiscardOrCompletely && (tag === 'script' || tag === 'style')) {\n        result += text;\n      } else if (modeDiscardOrCompletely && (tag === 'textarea' || tag === 'xmp')) {\n        result += text;\n      } else if (!addedText) {\n        // `clean` (set by emitText) means the text has no &/</> → escapeHtml is a no-op.\n        const escaped = clean ? text : escapeHtml(text, false);\n        if (opts.textFilter) result += opts.textFilter(escaped, tag);\n        else result += escaped;\n      }\n      // lastFrame is already stack[stack.length - 1] (the stack is unchanged here).\n      if (lastFrame) {\n        lastFrame.text += text;\n      }\n    },\n    onclosetag(name, isImplied) {\n      if (opts.onCloseTag) opts.onCloseTag(name, isImplied);\n\n      if (skipText) {\n        skipTextDepth--;\n        if (!skipTextDepth) {\n          skipText = false;\n        } else {\n          return;\n        }\n      }\n\n      const frame = stack.pop();\n      if (!frame) return;\n      if (frame.tag !== name) {\n        stack.push(frame);\n        return;\n      }\n\n      skipText = opts.enforceHtmlBoundary ? name === 'html' : false;\n      depth--;\n      const skip = skipMap[depth];\n      if (skip) {\n        delete skipMap[depth];\n        if (modeDiscardOrCompletely) {\n          updateParentNodeText(stack, frame);\n          return;\n        }\n        tempResult = result;\n        result = '';\n      }\n\n      if (transformMap[depth]) {\n        name = transformMap[depth];\n        delete transformMap[depth];\n      }\n\n      if (opts.exclusiveFilter) {\n        const filterResult = opts.exclusiveFilter(frame as unknown as IFrame);\n        if (filterResult === 'excludeTag') {\n          if (skip) {\n            result = tempResult;\n            tempResult = '';\n          }\n          result = result.substring(0, frame.tagPosition) +\n            result.substring(frame.tagPosition + frame.openingTagLength);\n          return;\n        } else if (filterResult) {\n          result = result.substring(0, frame.tagPosition);\n          return;\n        }\n      }\n\n      updateParentNodeMediaChildren(stack, frame);\n      updateParentNodeText(stack, frame);\n\n      if (\n        selfClosingSet.has(name) ||\n        (isImplied && !tagAllowed(name) && modeEscapeOrRecursive)\n      ) {\n        if (skip) {\n          result = tempResult;\n          tempResult = '';\n        }\n        return;\n      }\n\n      result += '</' + name + '>';\n      if (skip) {\n        result = tempResult + escapeHtml(result);\n        tempResult = '';\n      }\n      addedText = false;\n    }\n  }, opts.parser);\n\n  parser.write(inputHtml);\n  parser.end();\n\n  if (modeEscapeOrRecursive) {\n    const lastParsedIndex = parser.endIndex;\n    if (lastParsedIndex != null && lastParsedIndex >= 0 && lastParsedIndex < inputHtml.length) {\n      const unparsed = inputHtml.substring(lastParsedIndex);\n      result += escapeHtml(unparsed);\n    } else if ((lastParsedIndex == null || lastParsedIndex < 0) && inputHtml.length > 0 && result === '') {\n      result = escapeHtml(inputHtml);\n    }\n  }\n\n  return result;\n  }\n}\n\nconst sanitizerCache = new WeakMap<object, Sanitizer>();\nlet defaultSanitizer: Sanitizer | undefined;\n\n/**\n * Functional API — a thin, drop-in-compatible wrapper over `Sanitizer`. The\n * compiled options are cached per options object, so repeated calls that reuse\n * the same configuration skip recompilation.\n */\nconst sanitizeHtmlFn = function sanitizeHtml(\n  html: string | number | null | undefined,\n  options?: IOptions,\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  _recursing?: boolean\n): string {\n  let sanitizer: Sanitizer;\n  if (options == null) {\n    sanitizer = (defaultSanitizer ??= new Sanitizer());\n  } else {\n    let cached = sanitizerCache.get(options);\n    if (cached === undefined) {\n      cached = new Sanitizer(options);\n      sanitizerCache.set(options, cached);\n    }\n    sanitizer = cached;\n  }\n  return sanitizer.sanitize(html);\n} as SanitizeHtml;\n\n// =============================================================================\n// Defaults & static helpers\n// =============================================================================\n\nsanitizeHtmlFn.defaults = {\n  allowedTags: [\n    'address', 'article', 'aside', 'footer', 'header',\n    'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hgroup',\n    'main', 'nav', 'section',\n    'blockquote', 'dd', 'div', 'dl', 'dt', 'figcaption', 'figure',\n    'hr', 'li', 'menu', 'ol', 'p', 'pre', 'ul',\n    'a', 'abbr', 'b', 'bdi', 'bdo', 'br', 'cite', 'code', 'data', 'dfn',\n    'em', 'i', 'kbd', 'mark', 'q',\n    'rb', 'rp', 'rt', 'rtc', 'ruby',\n    's', 'samp', 'small', 'span', 'strong', 'sub', 'sup', 'time', 'u', 'var', 'wbr',\n    'caption', 'col', 'colgroup', 'table', 'tbody', 'td', 'tfoot', 'th',\n    'thead', 'tr'\n  ],\n  nonBooleanAttributes: [\n    'abbr', 'accept', 'accept-charset', 'accesskey', 'action',\n    'allow', 'alt', 'as', 'autocapitalize', 'autocomplete',\n    'blocking', 'charset', 'cite', 'class', 'color', 'cols',\n    'colspan', 'content', 'contenteditable', 'coords', 'crossorigin',\n    'data', 'datetime', 'decoding', 'dir', 'dirname', 'download',\n    'draggable', 'enctype', 'enterkeyhint', 'fetchpriority', 'for',\n    'form', 'formaction', 'formenctype', 'formmethod', 'formtarget',\n    'headers', 'height', 'hidden', 'high', 'href', 'hreflang',\n    'http-equiv', 'id', 'imagesizes', 'imagesrcset', 'inputmode',\n    'integrity', 'is', 'itemid', 'itemprop', 'itemref', 'itemtype',\n    'kind', 'label', 'lang', 'list', 'loading', 'low', 'max',\n    'maxlength', 'media', 'method', 'min', 'minlength', 'name',\n    'nonce', 'optimum', 'pattern', 'ping', 'placeholder', 'popover',\n    'popovertarget', 'popovertargetaction', 'poster', 'preload',\n    'referrerpolicy', 'rel', 'rows', 'rowspan', 'sandbox', 'scope',\n    'shape', 'size', 'sizes', 'slot', 'span', 'spellcheck', 'src',\n    'srcdoc', 'srclang', 'srcset', 'start', 'step', 'style',\n    'tabindex', 'target', 'title', 'translate', 'type', 'usemap',\n    'value', 'width', 'wrap',\n    'onauxclick', 'onafterprint', 'onbeforematch', 'onbeforeprint',\n    'onbeforeunload', 'onbeforetoggle', 'onblur', 'oncancel',\n    'oncanplay', 'oncanplaythrough', 'onchange', 'onclick', 'onclose',\n    'oncontextlost', 'oncontextmenu', 'oncontextrestored', 'oncopy',\n    'oncuechange', 'oncut', 'ondblclick', 'ondrag', 'ondragend',\n    'ondragenter', 'ondragleave', 'ondragover', 'ondragstart',\n    'ondrop', 'ondurationchange', 'onemptied', 'onended',\n    'onerror', 'onfocus', 'onformdata', 'onhashchange', 'oninput',\n    'oninvalid', 'onkeydown', 'onkeypress', 'onkeyup',\n    'onlanguagechange', 'onload', 'onloadeddata', 'onloadedmetadata',\n    'onloadstart', 'onmessage', 'onmessageerror', 'onmousedown',\n    'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout',\n    'onmouseover', 'onmouseup', 'onoffline', 'ononline', 'onpagehide',\n    'onpageshow', 'onpaste', 'onpause', 'onplay', 'onplaying',\n    'onpopstate', 'onprogress', 'onratechange', 'onreset', 'onresize',\n    'onrejectionhandled', 'onscroll', 'onscrollend',\n    'onsecuritypolicyviolation', 'onseeked', 'onseeking', 'onselect',\n    'onslotchange', 'onstalled', 'onstorage', 'onsubmit', 'onsuspend',\n    'ontimeupdate', 'ontoggle', 'onunhandledrejection', 'onunload',\n    'onvolumechange', 'onwaiting', 'onwheel'\n  ],\n  disallowedTagsMode: 'discard',\n  allowedAttributes: {\n    a: [ 'href', 'name', 'target' ],\n    img: [ 'src', 'srcset', 'alt', 'title', 'width', 'height', 'loading' ]\n  },\n  allowedEmptyAttributes: [ 'alt' ],\n  selfClosing: [ 'img', 'br', 'hr', 'area', 'base', 'basefont', 'input', 'link', 'meta' ],\n  allowedSchemes: [ 'http', 'https', 'ftp', 'mailto', 'tel' ],\n  allowedSchemesByTag: {},\n  allowedSchemesAppliedToAttributes: [\n    'href', 'src', 'cite',\n    'action', 'formaction', 'data', 'xlink:href',\n    'poster', 'background', 'ping',\n    'longdesc', 'usemap', 'codebase', 'classid', 'archive',\n    'profile', 'manifest', 'itemid',\n    'dynsrc', 'lowsrc'\n  ],\n  allowProtocolRelative: true,\n  enforceHtmlBoundary: false,\n  parseStyleAttributes: true,\n  preserveEscapedAttributes: false\n};\n\nsanitizeHtmlFn.simpleTransform = function (newTagName: string, newAttribs?: Attributes, merge?: boolean): Transformer {\n  const doMerge = merge === undefined ? true : merge;\n  const attribsToAdd = newAttribs || {};\n  return function (_tagName: string, attribs: Attributes): TransformResult {\n    let outAttribs: Attributes;\n    if (doMerge) {\n      outAttribs = attribs;\n      for (const k of Object.keys(attribsToAdd)) outAttribs[k] = attribsToAdd[k];\n    } else {\n      outAttribs = attribsToAdd;\n    }\n    return { tagName: newTagName, attribs: outAttribs };\n  };\n};\n\nconst sanitizeHtml = sanitizeHtmlFn;\n\nexport default sanitizeHtml;\n\n/**\n * @internal Test-only. The published build entry (`./entry.ts`) re-exports ONLY\n * the default, so this named export never reaches the bundle — that keeps the\n * CommonJS output a bare `module.exports = sanitize` (a true drop-in for\n * `sanitize-html`, whose `.defaults` / `.simpleTransform` are likewise hung off\n * the function above). The suite imports it to prove `isAttrNameParserClean` is\n * byte-for-byte equivalent to `VALID_HTML_ATTRIBUTE_NAME`.\n */\nexport const __internal = { isAttrNameParserClean, VALID_HTML_ATTRIBUTE_NAME };\n"],"mappings":"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"}