]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: entities parsing in browser
authorEvan You <yyx990803@gmail.com>
Sat, 18 Nov 2023 13:39:31 +0000 (21:39 +0800)
committerEvan You <yyx990803@gmail.com>
Sat, 25 Nov 2023 08:18:29 +0000 (16:18 +0800)
packages/compiler-core/src/options.ts
packages/compiler-core/src/parser/Tokenizer.ts
packages/compiler-core/src/parser/index.ts
packages/compiler-dom/src/decodeHtml.ts [deleted file]
packages/compiler-dom/src/namedChars.json [deleted file]
packages/compiler-dom/src/parserOptions.ts
rollup.config.js

index 491d1eafaabf2076ceeb5d6a23711c6148db8048..a85842754de72a6d62ae03dfb9cef339b5771e68 100644 (file)
@@ -50,7 +50,8 @@ export interface ParserOptions
    */
   whitespace?: 'preserve' | 'condense'
   /**
-   * Only needed for DOM compilers
+   * Only used for DOM compilers that runs in the browser.
+   * In non-browser builds, this option is ignored.
    */
   decodeEntities?: (rawText: string, asAttr: boolean) => string
   /**
index 536de3a61e2af338eca4581a9ee4e92617257d4c..2c128a6700d1ed533753e58de73feb71425bfc36 100644 (file)
@@ -22,12 +22,20 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 IN THE SOFTWARE.
  */
 
+import { ElementNode, Position } from '../ast'
+
+/**
+ * Note: entities is a non-browser-build-only dependency.
+ * In the browser, we use an HTML element to do the decoding.
+ * Make sure all imports from entities are only used in non-browser branches
+ * so that it can be properly treeshaken.
+ */
 import {
   EntityDecoder,
   DecodingMode,
-  htmlDecodeTree
+  htmlDecodeTree,
+  fromCodePoint
 } from 'entities/lib/decode.js'
-import { ElementNode, Position } from '../ast'
 
 export const enum ParseMode {
   BASE,
@@ -170,7 +178,7 @@ export enum QuoteType {
 
 export interface Callbacks {
   ontext(start: number, endIndex: number): void
-  ontextentity(codepoint: number, endIndex: number): void
+  ontextentity(char: string, endIndex: number): void
 
   oninterpolation(start: number, endIndex: number): void
 
@@ -180,7 +188,7 @@ export interface Callbacks {
   onclosetag(start: number, endIndex: number): void
 
   onattribdata(start: number, endIndex: number): void
-  onattribentity(codepoint: number): void
+  onattribentity(char: string): void
   onattribend(quote: QuoteType, endIndex: number): void
   onattribname(start: number, endIndex: number): void
   onattribnameend(endIndex: number): void
@@ -233,15 +241,17 @@ export default class Tokenizer {
   /** Reocrd newline positions for fast line / column calculation */
   private newlines: number[] = []
 
-  private readonly entityDecoder: EntityDecoder
+  private readonly entityDecoder?: EntityDecoder
 
   constructor(
     private readonly stack: ElementNode[],
     private readonly cbs: Callbacks
   ) {
-    this.entityDecoder = new EntityDecoder(htmlDecodeTree, (cp, consumed) =>
-      this.emitCodePoint(cp, consumed)
-    )
+    if (!__BROWSER__) {
+      this.entityDecoder = new EntityDecoder(htmlDecodeTree, (cp, consumed) =>
+        this.emitCodePoint(cp, consumed)
+      )
+    }
   }
 
   public mode = ParseMode.BASE
@@ -290,7 +300,7 @@ export default class Tokenizer {
       }
       this.state = State.BeforeTagName
       this.sectionStart = this.index
-    } else if (c === CharCodes.Amp) {
+    } else if (!__BROWSER__ && c === CharCodes.Amp) {
       this.startEntity()
     } else if (c === this.delimiterOpen[0]) {
       this.state = State.InterpolationOpen
@@ -398,7 +408,7 @@ export default class Tokenizer {
           !(this.mode === ParseMode.SFC && this.stack.length === 0))
       ) {
         // We have to parse entities in <title> and <textarea> tags.
-        if (c === CharCodes.Amp) {
+        if (!__BROWSER__ && c === CharCodes.Amp) {
           this.startEntity()
         }
       } else if (this.fastForwardTo(CharCodes.Lt)) {
@@ -702,7 +712,7 @@ export default class Tokenizer {
     }
   }
   private handleInAttributeValue(c: number, quote: number) {
-    if (c === quote) {
+    if (c === quote || (__BROWSER__ && this.fastForwardTo(quote))) {
       this.cbs.onattribdata(this.sectionStart, this.index)
       this.sectionStart = -1
       this.cbs.onattribend(
@@ -710,7 +720,7 @@ export default class Tokenizer {
         this.index + 1
       )
       this.state = State.BeforeAttributeName
-    } else if (c === CharCodes.Amp) {
+    } else if (!__BROWSER__ && c === CharCodes.Amp) {
       this.startEntity()
     }
   }
@@ -727,7 +737,7 @@ export default class Tokenizer {
       this.cbs.onattribend(QuoteType.Unquoted, this.index)
       this.state = State.BeforeAttributeName
       this.stateBeforeAttributeName(c)
-    } else if (c === CharCodes.Amp) {
+    } else if (!__BROWSER__ && c === CharCodes.Amp) {
       this.startEntity()
     }
   }
@@ -796,29 +806,33 @@ export default class Tokenizer {
   }
 
   private startEntity() {
-    this.baseState = this.state
-    this.state = State.InEntity
-    this.entityStart = this.index
-    this.entityDecoder.startEntity(
-      this.baseState === State.Text || this.baseState === State.InSpecialTag
-        ? DecodingMode.Legacy
-        : DecodingMode.Attribute
-    )
+    if (!__BROWSER__) {
+      this.baseState = this.state
+      this.state = State.InEntity
+      this.entityStart = this.index
+      this.entityDecoder!.startEntity(
+        this.baseState === State.Text || this.baseState === State.InSpecialTag
+          ? DecodingMode.Legacy
+          : DecodingMode.Attribute
+      )
+    }
   }
 
   private stateInEntity(): void {
-    const length = this.entityDecoder.write(this.buffer, this.index)
+    if (!__BROWSER__) {
+      const length = this.entityDecoder!.write(this.buffer, this.index)
 
-    // If `length` is positive, we are done with the entity.
-    if (length >= 0) {
-      this.state = this.baseState
+      // If `length` is positive, we are done with the entity.
+      if (length >= 0) {
+        this.state = this.baseState
 
-      if (length === 0) {
-        this.index = this.entityStart
+        if (length === 0) {
+          this.index = this.entityStart
+        }
+      } else {
+        // Mark buffer as consumed.
+        this.index = this.buffer.length - 1
       }
-    } else {
-      // Mark buffer as consumed.
-      this.index = this.buffer.length - 1
     }
   }
 
@@ -1002,8 +1016,8 @@ export default class Tokenizer {
   }
 
   private finish() {
-    if (this.state === State.InEntity) {
-      this.entityDecoder.end()
+    if (!__BROWSER__ && this.state === State.InEntity) {
+      this.entityDecoder!.end()
       this.state = this.baseState
     }
 
@@ -1052,25 +1066,27 @@ export default class Tokenizer {
   }
 
   private emitCodePoint(cp: number, consumed: number): void {
-    if (
-      this.baseState !== State.Text &&
-      this.baseState !== State.InSpecialTag
-    ) {
-      if (this.sectionStart < this.entityStart) {
-        this.cbs.onattribdata(this.sectionStart, this.entityStart)
-      }
-      this.sectionStart = this.entityStart + consumed
-      this.index = this.sectionStart - 1
+    if (!__BROWSER__) {
+      if (
+        this.baseState !== State.Text &&
+        this.baseState !== State.InSpecialTag
+      ) {
+        if (this.sectionStart < this.entityStart) {
+          this.cbs.onattribdata(this.sectionStart, this.entityStart)
+        }
+        this.sectionStart = this.entityStart + consumed
+        this.index = this.sectionStart - 1
 
-      this.cbs.onattribentity(cp)
-    } else {
-      if (this.sectionStart < this.entityStart) {
-        this.cbs.ontext(this.sectionStart, this.entityStart)
-      }
-      this.sectionStart = this.entityStart + consumed
-      this.index = this.sectionStart - 1
+        this.cbs.onattribentity(fromCodePoint(cp))
+      } else {
+        if (this.sectionStart < this.entityStart) {
+          this.cbs.ontext(this.sectionStart, this.entityStart)
+        }
+        this.sectionStart = this.entityStart + consumed
+        this.index = this.sectionStart - 1
 
-      this.cbs.ontextentity(cp, this.sectionStart)
+        this.cbs.ontextentity(fromCodePoint(cp), this.sectionStart)
+      }
     }
   }
 }
index cb8e26ab45a9d93d9879979d63e801f320564b50..858c4aafff34ba1ce4fc5a0bf9a7910f39a0c3ab 100644 (file)
@@ -1,4 +1,3 @@
-import { fromCodePoint } from 'entities/lib/decode.js'
 import {
   AttributeNode,
   ConstantTypes,
@@ -29,6 +28,7 @@ import { defaultOnError, defaultOnWarn } from '../errors'
 import { forAliasRE, isCoreComponent } from '../utils'
 
 type OptionalOptions =
+  | 'decodeEntities'
   | 'whitespace'
   | 'isNativeTag'
   | 'isBuiltInComponent'
@@ -37,18 +37,6 @@ type OptionalOptions =
 type MergedParserOptions = Omit<Required<ParserOptions>, OptionalOptions> &
   Pick<ParserOptions, OptionalOptions>
 
-// The default decoder only provides escapes for characters reserved as part of
-// the template syntax, and is only used if the custom renderer did not provide
-// a platform-specific decoder.
-const decodeRE = /&(gt|lt|amp|apos|quot);/g
-const decodeMap: Record<string, string> = {
-  gt: '>',
-  lt: '<',
-  amp: '&',
-  apos: "'",
-  quot: '"'
-}
-
 export const defaultParserOptions: MergedParserOptions = {
   parseMode: 'base',
   delimiters: [`{{`, `}}`],
@@ -56,9 +44,6 @@ export const defaultParserOptions: MergedParserOptions = {
   isVoidTag: NO,
   isPreTag: NO,
   isCustomElement: NO,
-  // TODO handle entities
-  decodeEntities: (rawText: string): string =>
-    rawText.replace(decodeRE, (_, p1) => decodeMap[p1]),
   onError: defaultOnError,
   onWarn: defaultOnWarn,
   comments: __DEV__
@@ -84,8 +69,8 @@ const tokenizer = new Tokenizer(stack, {
     onText(getSlice(start, end), start, end)
   },
 
-  ontextentity(cp, end) {
-    onText(fromCodePoint(cp), end - 1, end)
+  ontextentity(char, end) {
+    onText(char, end - 1, end)
   },
 
   oninterpolation(start, end) {
@@ -242,8 +227,8 @@ const tokenizer = new Tokenizer(stack, {
     currentAttrEndIndex = end
   },
 
-  onattribentity(codepoint) {
-    currentAttrValue += fromCodePoint(codepoint)
+  onattribentity(char) {
+    currentAttrValue += char
   },
 
   onattribnameend(end) {
@@ -265,6 +250,13 @@ const tokenizer = new Tokenizer(stack, {
   onattribend(quote, end) {
     if (currentElement && currentProp) {
       if (quote !== QuoteType.NoValue) {
+        if (__BROWSER__ && currentAttrValue.includes('&')) {
+          // TODO should not do this in <script> or <style>
+          currentAttrValue = currentOptions.decodeEntities!(
+            currentAttrValue,
+            true
+          )
+        }
         if (currentProp.type === NodeTypes.ATTRIBUTE) {
           // assign value
 
@@ -422,6 +414,10 @@ function closeCurrentTag(end: number) {
 }
 
 function onText(content: string, start: number, end: number) {
+  if (__BROWSER__ && content.includes('&')) {
+    // TODO do not do this in <script> or <style>
+    content = currentOptions.decodeEntities!(content, false)
+  }
   const parent = getParent()
   const lastNode = parent.children[parent.children.length - 1]
   if (lastNode?.type === NodeTypes.TEXT) {
@@ -697,6 +693,19 @@ export function baseParse(input: string, options?: ParserOptions): RootNode {
   currentInput = input
   currentOptions = extend({}, defaultParserOptions, options)
 
+  if (__DEV__) {
+    if (!__BROWSER__ && currentOptions.decodeEntities) {
+      console.warn(
+        `[@vue/compiler-core] decodeEntities option is passed but will be ` +
+          `ignored in non-browser builds.`
+      )
+    } else if (__BROWSER__ && !currentOptions.decodeEntities) {
+      throw new Error(
+        `[@vue/compiler-core] decodeEntities option is required in browser builds.`
+      )
+    }
+  }
+
   tokenizer.mode =
     currentOptions.parseMode === 'html'
       ? ParseMode.HTML
diff --git a/packages/compiler-dom/src/decodeHtml.ts b/packages/compiler-dom/src/decodeHtml.ts
deleted file mode 100644 (file)
index 68b0277..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-import { ParserOptions } from '@vue/compiler-core'
-import namedCharacterReferences from './namedChars.json'
-
-// lazy compute this to make this file tree-shakable for browser
-let maxCRNameLength: number
-
-export const decodeHtml: ParserOptions['decodeEntities'] = (
-  rawText,
-  asAttr
-) => {
-  let offset = 0
-  const end = rawText.length
-  let decodedText = ''
-
-  function advance(length: number) {
-    offset += length
-    rawText = rawText.slice(length)
-  }
-
-  while (offset < end) {
-    const head = /&(?:#x?)?/i.exec(rawText)
-    if (!head || offset + head.index >= end) {
-      const remaining = end - offset
-      decodedText += rawText.slice(0, remaining)
-      advance(remaining)
-      break
-    }
-
-    // Advance to the "&".
-    decodedText += rawText.slice(0, head.index)
-    advance(head.index)
-
-    if (head[0] === '&') {
-      // Named character reference.
-      let name = ''
-      let value: string | undefined = undefined
-      if (/[0-9a-z]/i.test(rawText[1])) {
-        if (!maxCRNameLength) {
-          maxCRNameLength = Object.keys(namedCharacterReferences).reduce(
-            (max, name) => Math.max(max, name.length),
-            0
-          )
-        }
-        for (let length = maxCRNameLength; !value && length > 0; --length) {
-          name = rawText.slice(1, 1 + length)
-          value = (namedCharacterReferences as Record<string, string>)[name]
-        }
-        if (value) {
-          const semi = name.endsWith(';')
-          if (
-            asAttr &&
-            !semi &&
-            /[=a-z0-9]/i.test(rawText[name.length + 1] || '')
-          ) {
-            decodedText += '&' + name
-            advance(1 + name.length)
-          } else {
-            decodedText += value
-            advance(1 + name.length)
-          }
-        } else {
-          decodedText += '&' + name
-          advance(1 + name.length)
-        }
-      } else {
-        decodedText += '&'
-        advance(1)
-      }
-    } else {
-      // Numeric character reference.
-      const hex = head[0] === '&#x'
-      const pattern = hex ? /^&#x([0-9a-f]+);?/i : /^&#([0-9]+);?/
-      const body = pattern.exec(rawText)
-      if (!body) {
-        decodedText += head[0]
-        advance(head[0].length)
-      } else {
-        // https://html.spec.whatwg.org/multipage/parsing.html#numeric-character-reference-end-state
-        let cp = Number.parseInt(body[1], hex ? 16 : 10)
-        if (cp === 0) {
-          cp = 0xfffd
-        } else if (cp > 0x10ffff) {
-          cp = 0xfffd
-        } else if (cp >= 0xd800 && cp <= 0xdfff) {
-          cp = 0xfffd
-        } else if ((cp >= 0xfdd0 && cp <= 0xfdef) || (cp & 0xfffe) === 0xfffe) {
-          // noop
-        } else if (
-          (cp >= 0x01 && cp <= 0x08) ||
-          cp === 0x0b ||
-          (cp >= 0x0d && cp <= 0x1f) ||
-          (cp >= 0x7f && cp <= 0x9f)
-        ) {
-          cp = CCR_REPLACEMENTS[cp] || cp
-        }
-        decodedText += String.fromCodePoint(cp)
-        advance(body[0].length)
-      }
-    }
-  }
-  return decodedText
-}
-
-// https://html.spec.whatwg.org/multipage/parsing.html#numeric-character-reference-end-state
-const CCR_REPLACEMENTS: Record<number, number | undefined> = {
-  0x80: 0x20ac,
-  0x82: 0x201a,
-  0x83: 0x0192,
-  0x84: 0x201e,
-  0x85: 0x2026,
-  0x86: 0x2020,
-  0x87: 0x2021,
-  0x88: 0x02c6,
-  0x89: 0x2030,
-  0x8a: 0x0160,
-  0x8b: 0x2039,
-  0x8c: 0x0152,
-  0x8e: 0x017d,
-  0x91: 0x2018,
-  0x92: 0x2019,
-  0x93: 0x201c,
-  0x94: 0x201d,
-  0x95: 0x2022,
-  0x96: 0x2013,
-  0x97: 0x2014,
-  0x98: 0x02dc,
-  0x99: 0x2122,
-  0x9a: 0x0161,
-  0x9b: 0x203a,
-  0x9c: 0x0153,
-  0x9e: 0x017e,
-  0x9f: 0x0178
-}
diff --git a/packages/compiler-dom/src/namedChars.json b/packages/compiler-dom/src/namedChars.json
deleted file mode 100644 (file)
index 0bda5db..0000000
+++ /dev/null
@@ -1,2233 +0,0 @@
-{
-  "GT": ">",
-  "gt": ">",
-  "LT": "<",
-  "lt": "<",
-  "ac;": "∾",
-  "af;": "⁡",
-  "AMP": "&",
-  "amp": "&",
-  "ap;": "≈",
-  "DD;": "ⅅ",
-  "dd;": "ⅆ",
-  "deg": "°",
-  "ee;": "ⅇ",
-  "eg;": "⪚",
-  "el;": "⪙",
-  "ETH": "Ð",
-  "eth": "ð",
-  "gE;": "≧",
-  "ge;": "≥",
-  "Gg;": "⋙",
-  "gg;": "≫",
-  "gl;": "≷",
-  "GT;": ">",
-  "Gt;": "≫",
-  "gt;": ">",
-  "ic;": "⁣",
-  "ii;": "ⅈ",
-  "Im;": "ℑ",
-  "in;": "∈",
-  "it;": "⁢",
-  "lE;": "≦",
-  "le;": "≤",
-  "lg;": "≶",
-  "Ll;": "⋘",
-  "ll;": "≪",
-  "LT;": "<",
-  "Lt;": "≪",
-  "lt;": "<",
-  "mp;": "∓",
-  "Mu;": "Μ",
-  "mu;": "μ",
-  "ne;": "≠",
-  "ni;": "∋",
-  "not": "¬",
-  "Nu;": "Ν",
-  "nu;": "ν",
-  "Or;": "⩔",
-  "or;": "∨",
-  "oS;": "Ⓢ",
-  "Pi;": "Π",
-  "pi;": "π",
-  "pm;": "±",
-  "Pr;": "⪻",
-  "pr;": "≺",
-  "Re;": "ℜ",
-  "REG": "®",
-  "reg": "®",
-  "rx;": "℞",
-  "Sc;": "⪼",
-  "sc;": "≻",
-  "shy": "­",
-  "uml": "¨",
-  "wp;": "℘",
-  "wr;": "≀",
-  "Xi;": "Ξ",
-  "xi;": "ξ",
-  "yen": "¥",
-  "acd;": "∿",
-  "acE;": "∾̳",
-  "Acy;": "А",
-  "acy;": "а",
-  "Afr;": "𝔄",
-  "afr;": "𝔞",
-  "AMP;": "&",
-  "amp;": "&",
-  "And;": "⩓",
-  "and;": "∧",
-  "ang;": "∠",
-  "apE;": "⩰",
-  "ape;": "≊",
-  "ast;": "*",
-  "Auml": "Ä",
-  "auml": "ä",
-  "Bcy;": "Б",
-  "bcy;": "б",
-  "Bfr;": "𝔅",
-  "bfr;": "𝔟",
-  "bne;": "=⃥",
-  "bot;": "⊥",
-  "Cap;": "⋒",
-  "cap;": "∩",
-  "cent": "¢",
-  "Cfr;": "ℭ",
-  "cfr;": "𝔠",
-  "Chi;": "Χ",
-  "chi;": "χ",
-  "cir;": "○",
-  "COPY": "©",
-  "copy": "©",
-  "Cup;": "⋓",
-  "cup;": "∪",
-  "Dcy;": "Д",
-  "dcy;": "д",
-  "deg;": "°",
-  "Del;": "∇",
-  "Dfr;": "𝔇",
-  "dfr;": "𝔡",
-  "die;": "¨",
-  "div;": "÷",
-  "Dot;": "¨",
-  "dot;": "˙",
-  "Ecy;": "Э",
-  "ecy;": "э",
-  "Efr;": "𝔈",
-  "efr;": "𝔢",
-  "egs;": "⪖",
-  "ell;": "ℓ",
-  "els;": "⪕",
-  "ENG;": "Ŋ",
-  "eng;": "ŋ",
-  "Eta;": "Η",
-  "eta;": "η",
-  "ETH;": "Ð",
-  "eth;": "ð",
-  "Euml": "Ë",
-  "euml": "ë",
-  "Fcy;": "Ф",
-  "fcy;": "ф",
-  "Ffr;": "𝔉",
-  "ffr;": "𝔣",
-  "gap;": "⪆",
-  "Gcy;": "Г",
-  "gcy;": "г",
-  "gEl;": "⪌",
-  "gel;": "⋛",
-  "geq;": "≥",
-  "ges;": "⩾",
-  "Gfr;": "𝔊",
-  "gfr;": "𝔤",
-  "ggg;": "⋙",
-  "gla;": "⪥",
-  "glE;": "⪒",
-  "glj;": "⪤",
-  "gnE;": "≩",
-  "gne;": "⪈",
-  "Hat;": "^",
-  "Hfr;": "ℌ",
-  "hfr;": "𝔥",
-  "Icy;": "И",
-  "icy;": "и",
-  "iff;": "⇔",
-  "Ifr;": "ℑ",
-  "ifr;": "𝔦",
-  "Int;": "∬",
-  "int;": "∫",
-  "Iuml": "Ï",
-  "iuml": "ï",
-  "Jcy;": "Й",
-  "jcy;": "й",
-  "Jfr;": "𝔍",
-  "jfr;": "𝔧",
-  "Kcy;": "К",
-  "kcy;": "к",
-  "Kfr;": "𝔎",
-  "kfr;": "𝔨",
-  "lap;": "⪅",
-  "lat;": "⪫",
-  "Lcy;": "Л",
-  "lcy;": "л",
-  "lEg;": "⪋",
-  "leg;": "⋚",
-  "leq;": "≤",
-  "les;": "⩽",
-  "Lfr;": "𝔏",
-  "lfr;": "𝔩",
-  "lgE;": "⪑",
-  "lnE;": "≨",
-  "lne;": "⪇",
-  "loz;": "◊",
-  "lrm;": "‎",
-  "Lsh;": "↰",
-  "lsh;": "↰",
-  "macr": "¯",
-  "Map;": "⤅",
-  "map;": "↦",
-  "Mcy;": "М",
-  "mcy;": "м",
-  "Mfr;": "𝔐",
-  "mfr;": "𝔪",
-  "mho;": "℧",
-  "mid;": "∣",
-  "nap;": "≉",
-  "nbsp": " ",
-  "Ncy;": "Н",
-  "ncy;": "н",
-  "Nfr;": "𝔑",
-  "nfr;": "𝔫",
-  "ngE;": "≧̸",
-  "nge;": "≱",
-  "nGg;": "⋙̸",
-  "nGt;": "≫⃒",
-  "ngt;": "≯",
-  "nis;": "⋼",
-  "niv;": "∋",
-  "nlE;": "≦̸",
-  "nle;": "≰",
-  "nLl;": "⋘̸",
-  "nLt;": "≪⃒",
-  "nlt;": "≮",
-  "Not;": "⫬",
-  "not;": "¬",
-  "npr;": "⊀",
-  "nsc;": "⊁",
-  "num;": "#",
-  "Ocy;": "О",
-  "ocy;": "о",
-  "Ofr;": "𝔒",
-  "ofr;": "𝔬",
-  "ogt;": "⧁",
-  "ohm;": "Ω",
-  "olt;": "⧀",
-  "ord;": "⩝",
-  "ordf": "ª",
-  "ordm": "º",
-  "orv;": "⩛",
-  "Ouml": "Ö",
-  "ouml": "ö",
-  "par;": "∥",
-  "para": "¶",
-  "Pcy;": "П",
-  "pcy;": "п",
-  "Pfr;": "𝔓",
-  "pfr;": "𝔭",
-  "Phi;": "Φ",
-  "phi;": "φ",
-  "piv;": "ϖ",
-  "prE;": "⪳",
-  "pre;": "⪯",
-  "Psi;": "Ψ",
-  "psi;": "ψ",
-  "Qfr;": "𝔔",
-  "qfr;": "𝔮",
-  "QUOT": "\"",
-  "quot": "\"",
-  "Rcy;": "Р",
-  "rcy;": "р",
-  "REG;": "®",
-  "reg;": "®",
-  "Rfr;": "ℜ",
-  "rfr;": "𝔯",
-  "Rho;": "Ρ",
-  "rho;": "ρ",
-  "rlm;": "‏",
-  "Rsh;": "↱",
-  "rsh;": "↱",
-  "scE;": "⪴",
-  "sce;": "⪰",
-  "Scy;": "С",
-  "scy;": "с",
-  "sect": "§",
-  "Sfr;": "𝔖",
-  "sfr;": "𝔰",
-  "shy;": "­",
-  "sim;": "∼",
-  "smt;": "⪪",
-  "sol;": "/",
-  "squ;": "□",
-  "Sub;": "⋐",
-  "sub;": "⊂",
-  "Sum;": "∑",
-  "sum;": "∑",
-  "Sup;": "⋑",
-  "sup;": "⊃",
-  "sup1": "¹",
-  "sup2": "²",
-  "sup3": "³",
-  "Tab;": "\t",
-  "Tau;": "Τ",
-  "tau;": "τ",
-  "Tcy;": "Т",
-  "tcy;": "т",
-  "Tfr;": "𝔗",
-  "tfr;": "𝔱",
-  "top;": "⊤",
-  "Ucy;": "У",
-  "ucy;": "у",
-  "Ufr;": "𝔘",
-  "ufr;": "𝔲",
-  "uml;": "¨",
-  "Uuml": "Ü",
-  "uuml": "ü",
-  "Vcy;": "В",
-  "vcy;": "в",
-  "Vee;": "⋁",
-  "vee;": "∨",
-  "Vfr;": "𝔙",
-  "vfr;": "𝔳",
-  "Wfr;": "𝔚",
-  "wfr;": "𝔴",
-  "Xfr;": "𝔛",
-  "xfr;": "𝔵",
-  "Ycy;": "Ы",
-  "ycy;": "ы",
-  "yen;": "¥",
-  "Yfr;": "𝔜",
-  "yfr;": "𝔶",
-  "yuml": "ÿ",
-  "Zcy;": "З",
-  "zcy;": "з",
-  "Zfr;": "ℨ",
-  "zfr;": "𝔷",
-  "zwj;": "‍",
-  "Acirc": "Â",
-  "acirc": "â",
-  "acute": "´",
-  "AElig": "Æ",
-  "aelig": "æ",
-  "andd;": "⩜",
-  "andv;": "⩚",
-  "ange;": "⦤",
-  "Aopf;": "𝔸",
-  "aopf;": "𝕒",
-  "apid;": "≋",
-  "apos;": "'",
-  "Aring": "Å",
-  "aring": "å",
-  "Ascr;": "𝒜",
-  "ascr;": "𝒶",
-  "Auml;": "Ä",
-  "auml;": "ä",
-  "Barv;": "⫧",
-  "bbrk;": "⎵",
-  "Beta;": "Β",
-  "beta;": "β",
-  "beth;": "ℶ",
-  "bNot;": "⫭",
-  "bnot;": "⌐",
-  "Bopf;": "𝔹",
-  "bopf;": "𝕓",
-  "boxH;": "═",
-  "boxh;": "─",
-  "boxV;": "║",
-  "boxv;": "│",
-  "Bscr;": "ℬ",
-  "bscr;": "𝒷",
-  "bsim;": "∽",
-  "bsol;": "\\",
-  "bull;": "•",
-  "bump;": "≎",
-  "caps;": "∩︀",
-  "Cdot;": "Ċ",
-  "cdot;": "ċ",
-  "cedil": "¸",
-  "cent;": "¢",
-  "CHcy;": "Ч",
-  "chcy;": "ч",
-  "circ;": "ˆ",
-  "cirE;": "⧃",
-  "cire;": "≗",
-  "comp;": "∁",
-  "cong;": "≅",
-  "Copf;": "ℂ",
-  "copf;": "𝕔",
-  "COPY;": "©",
-  "copy;": "©",
-  "Cscr;": "𝒞",
-  "cscr;": "𝒸",
-  "csub;": "⫏",
-  "csup;": "⫐",
-  "cups;": "∪︀",
-  "Darr;": "↡",
-  "dArr;": "⇓",
-  "darr;": "↓",
-  "dash;": "‐",
-  "dHar;": "⥥",
-  "diam;": "⋄",
-  "DJcy;": "Ђ",
-  "djcy;": "ђ",
-  "Dopf;": "𝔻",
-  "dopf;": "𝕕",
-  "Dscr;": "𝒟",
-  "dscr;": "𝒹",
-  "DScy;": "Ѕ",
-  "dscy;": "ѕ",
-  "dsol;": "⧶",
-  "dtri;": "▿",
-  "DZcy;": "Џ",
-  "dzcy;": "џ",
-  "ecir;": "≖",
-  "Ecirc": "Ê",
-  "ecirc": "ê",
-  "Edot;": "Ė",
-  "eDot;": "≑",
-  "edot;": "ė",
-  "emsp;": " ",
-  "ensp;": " ",
-  "Eopf;": "𝔼",
-  "eopf;": "𝕖",
-  "epar;": "⋕",
-  "epsi;": "ε",
-  "Escr;": "ℰ",
-  "escr;": "ℯ",
-  "Esim;": "⩳",
-  "esim;": "≂",
-  "Euml;": "Ë",
-  "euml;": "ë",
-  "euro;": "€",
-  "excl;": "!",
-  "flat;": "♭",
-  "fnof;": "ƒ",
-  "Fopf;": "𝔽",
-  "fopf;": "𝕗",
-  "fork;": "⋔",
-  "Fscr;": "ℱ",
-  "fscr;": "𝒻",
-  "Gdot;": "Ġ",
-  "gdot;": "ġ",
-  "geqq;": "≧",
-  "gesl;": "⋛︀",
-  "GJcy;": "Ѓ",
-  "gjcy;": "ѓ",
-  "gnap;": "⪊",
-  "gneq;": "⪈",
-  "Gopf;": "𝔾",
-  "gopf;": "𝕘",
-  "Gscr;": "𝒢",
-  "gscr;": "ℊ",
-  "gsim;": "≳",
-  "gtcc;": "⪧",
-  "gvnE;": "≩︀",
-  "half;": "½",
-  "hArr;": "⇔",
-  "harr;": "↔",
-  "hbar;": "ℏ",
-  "Hopf;": "ℍ",
-  "hopf;": "𝕙",
-  "Hscr;": "ℋ",
-  "hscr;": "𝒽",
-  "Icirc": "Î",
-  "icirc": "î",
-  "Idot;": "İ",
-  "IEcy;": "Е",
-  "iecy;": "е",
-  "iexcl": "¡",
-  "imof;": "⊷",
-  "IOcy;": "Ё",
-  "iocy;": "ё",
-  "Iopf;": "𝕀",
-  "iopf;": "𝕚",
-  "Iota;": "Ι",
-  "iota;": "ι",
-  "Iscr;": "ℐ",
-  "iscr;": "𝒾",
-  "isin;": "∈",
-  "Iuml;": "Ï",
-  "iuml;": "ï",
-  "Jopf;": "𝕁",
-  "jopf;": "𝕛",
-  "Jscr;": "𝒥",
-  "jscr;": "𝒿",
-  "KHcy;": "Х",
-  "khcy;": "х",
-  "KJcy;": "Ќ",
-  "kjcy;": "ќ",
-  "Kopf;": "𝕂",
-  "kopf;": "𝕜",
-  "Kscr;": "𝒦",
-  "kscr;": "𝓀",
-  "Lang;": "⟪",
-  "lang;": "⟨",
-  "laquo": "«",
-  "Larr;": "↞",
-  "lArr;": "⇐",
-  "larr;": "←",
-  "late;": "⪭",
-  "lcub;": "{",
-  "ldca;": "⤶",
-  "ldsh;": "↲",
-  "leqq;": "≦",
-  "lesg;": "⋚︀",
-  "lHar;": "⥢",
-  "LJcy;": "Љ",
-  "ljcy;": "љ",
-  "lnap;": "⪉",
-  "lneq;": "⪇",
-  "Lopf;": "𝕃",
-  "lopf;": "𝕝",
-  "lozf;": "⧫",
-  "lpar;": "(",
-  "Lscr;": "ℒ",
-  "lscr;": "𝓁",
-  "lsim;": "≲",
-  "lsqb;": "[",
-  "ltcc;": "⪦",
-  "ltri;": "◃",
-  "lvnE;": "≨︀",
-  "macr;": "¯",
-  "male;": "♂",
-  "malt;": "✠",
-  "micro": "µ",
-  "mlcp;": "⫛",
-  "mldr;": "…",
-  "Mopf;": "𝕄",
-  "mopf;": "𝕞",
-  "Mscr;": "ℳ",
-  "mscr;": "𝓂",
-  "nang;": "∠⃒",
-  "napE;": "⩰̸",
-  "nbsp;": " ",
-  "ncap;": "⩃",
-  "ncup;": "⩂",
-  "ngeq;": "≱",
-  "nges;": "⩾̸",
-  "ngtr;": "≯",
-  "nGtv;": "≫̸",
-  "nisd;": "⋺",
-  "NJcy;": "Њ",
-  "njcy;": "њ",
-  "nldr;": "‥",
-  "nleq;": "≰",
-  "nles;": "⩽̸",
-  "nLtv;": "≪̸",
-  "nmid;": "∤",
-  "Nopf;": "ℕ",
-  "nopf;": "𝕟",
-  "npar;": "∦",
-  "npre;": "⪯̸",
-  "nsce;": "⪰̸",
-  "Nscr;": "𝒩",
-  "nscr;": "𝓃",
-  "nsim;": "≁",
-  "nsub;": "⊄",
-  "nsup;": "⊅",
-  "ntgl;": "≹",
-  "ntlg;": "≸",
-  "nvap;": "≍⃒",
-  "nvge;": "≥⃒",
-  "nvgt;": ">⃒",
-  "nvle;": "≤⃒",
-  "nvlt;": "<⃒",
-  "oast;": "⊛",
-  "ocir;": "⊚",
-  "Ocirc": "Ô",
-  "ocirc": "ô",
-  "odiv;": "⨸",
-  "odot;": "⊙",
-  "ogon;": "˛",
-  "oint;": "∮",
-  "omid;": "⦶",
-  "Oopf;": "𝕆",
-  "oopf;": "𝕠",
-  "opar;": "⦷",
-  "ordf;": "ª",
-  "ordm;": "º",
-  "oror;": "⩖",
-  "Oscr;": "𝒪",
-  "oscr;": "ℴ",
-  "osol;": "⊘",
-  "Ouml;": "Ö",
-  "ouml;": "ö",
-  "para;": "¶",
-  "part;": "∂",
-  "perp;": "⊥",
-  "phiv;": "ϕ",
-  "plus;": "+",
-  "Popf;": "ℙ",
-  "popf;": "𝕡",
-  "pound": "£",
-  "prap;": "⪷",
-  "prec;": "≺",
-  "prnE;": "⪵",
-  "prod;": "∏",
-  "prop;": "∝",
-  "Pscr;": "𝒫",
-  "pscr;": "𝓅",
-  "qint;": "⨌",
-  "Qopf;": "ℚ",
-  "qopf;": "𝕢",
-  "Qscr;": "𝒬",
-  "qscr;": "𝓆",
-  "QUOT;": "\"",
-  "quot;": "\"",
-  "race;": "∽̱",
-  "Rang;": "⟫",
-  "rang;": "⟩",
-  "raquo": "»",
-  "Rarr;": "↠",
-  "rArr;": "⇒",
-  "rarr;": "→",
-  "rcub;": "}",
-  "rdca;": "⤷",
-  "rdsh;": "↳",
-  "real;": "ℜ",
-  "rect;": "▭",
-  "rHar;": "⥤",
-  "rhov;": "ϱ",
-  "ring;": "˚",
-  "Ropf;": "ℝ",
-  "ropf;": "𝕣",
-  "rpar;": ")",
-  "Rscr;": "ℛ",
-  "rscr;": "𝓇",
-  "rsqb;": "]",
-  "rtri;": "▹",
-  "scap;": "⪸",
-  "scnE;": "⪶",
-  "sdot;": "⋅",
-  "sect;": "§",
-  "semi;": ";",
-  "sext;": "✶",
-  "SHcy;": "Ш",
-  "shcy;": "ш",
-  "sime;": "≃",
-  "simg;": "⪞",
-  "siml;": "⪝",
-  "smid;": "∣",
-  "smte;": "⪬",
-  "solb;": "⧄",
-  "Sopf;": "𝕊",
-  "sopf;": "𝕤",
-  "spar;": "∥",
-  "Sqrt;": "√",
-  "squf;": "▪",
-  "Sscr;": "𝒮",
-  "sscr;": "𝓈",
-  "Star;": "⋆",
-  "star;": "☆",
-  "subE;": "⫅",
-  "sube;": "⊆",
-  "succ;": "≻",
-  "sung;": "♪",
-  "sup1;": "¹",
-  "sup2;": "²",
-  "sup3;": "³",
-  "supE;": "⫆",
-  "supe;": "⊇",
-  "szlig": "ß",
-  "tbrk;": "⎴",
-  "tdot;": "⃛",
-  "THORN": "Þ",
-  "thorn": "þ",
-  "times": "×",
-  "tint;": "∭",
-  "toea;": "⤨",
-  "Topf;": "𝕋",
-  "topf;": "𝕥",
-  "tosa;": "⤩",
-  "trie;": "≜",
-  "Tscr;": "𝒯",
-  "tscr;": "𝓉",
-  "TScy;": "Ц",
-  "tscy;": "ц",
-  "Uarr;": "↟",
-  "uArr;": "⇑",
-  "uarr;": "↑",
-  "Ucirc": "Û",
-  "ucirc": "û",
-  "uHar;": "⥣",
-  "Uopf;": "𝕌",
-  "uopf;": "𝕦",
-  "Upsi;": "ϒ",
-  "upsi;": "υ",
-  "Uscr;": "𝒰",
-  "uscr;": "𝓊",
-  "utri;": "▵",
-  "Uuml;": "Ü",
-  "uuml;": "ü",
-  "vArr;": "⇕",
-  "varr;": "↕",
-  "Vbar;": "⫫",
-  "vBar;": "⫨",
-  "Vert;": "‖",
-  "vert;": "|",
-  "Vopf;": "𝕍",
-  "vopf;": "𝕧",
-  "Vscr;": "𝒱",
-  "vscr;": "𝓋",
-  "Wopf;": "𝕎",
-  "wopf;": "𝕨",
-  "Wscr;": "𝒲",
-  "wscr;": "𝓌",
-  "xcap;": "⋂",
-  "xcup;": "⋃",
-  "xmap;": "⟼",
-  "xnis;": "⋻",
-  "Xopf;": "𝕏",
-  "xopf;": "𝕩",
-  "Xscr;": "𝒳",
-  "xscr;": "𝓍",
-  "xvee;": "⋁",
-  "YAcy;": "Я",
-  "yacy;": "я",
-  "YIcy;": "Ї",
-  "yicy;": "ї",
-  "Yopf;": "𝕐",
-  "yopf;": "𝕪",
-  "Yscr;": "𝒴",
-  "yscr;": "𝓎",
-  "YUcy;": "Ю",
-  "yucy;": "ю",
-  "Yuml;": "Ÿ",
-  "yuml;": "ÿ",
-  "Zdot;": "Ż",
-  "zdot;": "ż",
-  "Zeta;": "Ζ",
-  "zeta;": "ζ",
-  "ZHcy;": "Ж",
-  "zhcy;": "ж",
-  "Zopf;": "ℤ",
-  "zopf;": "𝕫",
-  "Zscr;": "𝒵",
-  "zscr;": "𝓏",
-  "zwnj;": "‌",
-  "Aacute": "Á",
-  "aacute": "á",
-  "Acirc;": "Â",
-  "acirc;": "â",
-  "acute;": "´",
-  "AElig;": "Æ",
-  "aelig;": "æ",
-  "Agrave": "À",
-  "agrave": "à",
-  "aleph;": "ℵ",
-  "Alpha;": "Α",
-  "alpha;": "α",
-  "Amacr;": "Ā",
-  "amacr;": "ā",
-  "amalg;": "⨿",
-  "angle;": "∠",
-  "angrt;": "∟",
-  "angst;": "Å",
-  "Aogon;": "Ą",
-  "aogon;": "ą",
-  "Aring;": "Å",
-  "aring;": "å",
-  "asymp;": "≈",
-  "Atilde": "Ã",
-  "atilde": "ã",
-  "awint;": "⨑",
-  "bcong;": "≌",
-  "bdquo;": "„",
-  "bepsi;": "϶",
-  "blank;": "␣",
-  "blk12;": "▒",
-  "blk14;": "░",
-  "blk34;": "▓",
-  "block;": "█",
-  "boxDL;": "╗",
-  "boxDl;": "╖",
-  "boxdL;": "╕",
-  "boxdl;": "┐",
-  "boxDR;": "╔",
-  "boxDr;": "╓",
-  "boxdR;": "╒",
-  "boxdr;": "┌",
-  "boxHD;": "╦",
-  "boxHd;": "╤",
-  "boxhD;": "╥",
-  "boxhd;": "┬",
-  "boxHU;": "╩",
-  "boxHu;": "╧",
-  "boxhU;": "╨",
-  "boxhu;": "┴",
-  "boxUL;": "╝",
-  "boxUl;": "╜",
-  "boxuL;": "╛",
-  "boxul;": "┘",
-  "boxUR;": "╚",
-  "boxUr;": "╙",
-  "boxuR;": "╘",
-  "boxur;": "└",
-  "boxVH;": "╬",
-  "boxVh;": "╫",
-  "boxvH;": "╪",
-  "boxvh;": "┼",
-  "boxVL;": "╣",
-  "boxVl;": "╢",
-  "boxvL;": "╡",
-  "boxvl;": "┤",
-  "boxVR;": "╠",
-  "boxVr;": "╟",
-  "boxvR;": "╞",
-  "boxvr;": "├",
-  "Breve;": "˘",
-  "breve;": "˘",
-  "brvbar": "¦",
-  "bsemi;": "⁏",
-  "bsime;": "⋍",
-  "bsolb;": "⧅",
-  "bumpE;": "⪮",
-  "bumpe;": "≏",
-  "caret;": "⁁",
-  "caron;": "ˇ",
-  "ccaps;": "⩍",
-  "Ccedil": "Ç",
-  "ccedil": "ç",
-  "Ccirc;": "Ĉ",
-  "ccirc;": "ĉ",
-  "ccups;": "⩌",
-  "cedil;": "¸",
-  "check;": "✓",
-  "clubs;": "♣",
-  "Colon;": "∷",
-  "colon;": ":",
-  "comma;": ",",
-  "crarr;": "↵",
-  "Cross;": "⨯",
-  "cross;": "✗",
-  "csube;": "⫑",
-  "csupe;": "⫒",
-  "ctdot;": "⋯",
-  "cuepr;": "⋞",
-  "cuesc;": "⋟",
-  "cupor;": "⩅",
-  "curren": "¤",
-  "cuvee;": "⋎",
-  "cuwed;": "⋏",
-  "cwint;": "∱",
-  "Dashv;": "⫤",
-  "dashv;": "⊣",
-  "dblac;": "˝",
-  "ddarr;": "⇊",
-  "Delta;": "Δ",
-  "delta;": "δ",
-  "dharl;": "⇃",
-  "dharr;": "⇂",
-  "diams;": "♦",
-  "disin;": "⋲",
-  "divide": "÷",
-  "doteq;": "≐",
-  "dtdot;": "⋱",
-  "dtrif;": "▾",
-  "duarr;": "⇵",
-  "duhar;": "⥯",
-  "Eacute": "É",
-  "eacute": "é",
-  "Ecirc;": "Ê",
-  "ecirc;": "ê",
-  "eDDot;": "⩷",
-  "efDot;": "≒",
-  "Egrave": "È",
-  "egrave": "è",
-  "Emacr;": "Ē",
-  "emacr;": "ē",
-  "empty;": "∅",
-  "Eogon;": "Ę",
-  "eogon;": "ę",
-  "eplus;": "⩱",
-  "epsiv;": "ϵ",
-  "eqsim;": "≂",
-  "Equal;": "⩵",
-  "equiv;": "≡",
-  "erarr;": "⥱",
-  "erDot;": "≓",
-  "esdot;": "≐",
-  "exist;": "∃",
-  "fflig;": "ff",
-  "filig;": "fi",
-  "fjlig;": "fj",
-  "fllig;": "fl",
-  "fltns;": "▱",
-  "forkv;": "⫙",
-  "frac12": "½",
-  "frac14": "¼",
-  "frac34": "¾",
-  "frasl;": "⁄",
-  "frown;": "⌢",
-  "Gamma;": "Γ",
-  "gamma;": "γ",
-  "Gcirc;": "Ĝ",
-  "gcirc;": "ĝ",
-  "gescc;": "⪩",
-  "gimel;": "ℷ",
-  "gneqq;": "≩",
-  "gnsim;": "⋧",
-  "grave;": "`",
-  "gsime;": "⪎",
-  "gsiml;": "⪐",
-  "gtcir;": "⩺",
-  "gtdot;": "⋗",
-  "Hacek;": "ˇ",
-  "harrw;": "↭",
-  "Hcirc;": "Ĥ",
-  "hcirc;": "ĥ",
-  "hoarr;": "⇿",
-  "Iacute": "Í",
-  "iacute": "í",
-  "Icirc;": "Î",
-  "icirc;": "î",
-  "iexcl;": "¡",
-  "Igrave": "Ì",
-  "igrave": "ì",
-  "iiint;": "∭",
-  "iiota;": "℩",
-  "IJlig;": "IJ",
-  "ijlig;": "ij",
-  "Imacr;": "Ī",
-  "imacr;": "ī",
-  "image;": "ℑ",
-  "imath;": "ı",
-  "imped;": "Ƶ",
-  "infin;": "∞",
-  "Iogon;": "Į",
-  "iogon;": "į",
-  "iprod;": "⨼",
-  "iquest": "¿",
-  "isinE;": "⋹",
-  "isins;": "⋴",
-  "isinv;": "∈",
-  "Iukcy;": "І",
-  "iukcy;": "і",
-  "Jcirc;": "Ĵ",
-  "jcirc;": "ĵ",
-  "jmath;": "ȷ",
-  "Jukcy;": "Є",
-  "jukcy;": "є",
-  "Kappa;": "Κ",
-  "kappa;": "κ",
-  "lAarr;": "⇚",
-  "langd;": "⦑",
-  "laquo;": "«",
-  "larrb;": "⇤",
-  "lates;": "⪭︀",
-  "lBarr;": "⤎",
-  "lbarr;": "⤌",
-  "lbbrk;": "❲",
-  "lbrke;": "⦋",
-  "lceil;": "⌈",
-  "ldquo;": "“",
-  "lescc;": "⪨",
-  "lhard;": "↽",
-  "lharu;": "↼",
-  "lhblk;": "▄",
-  "llarr;": "⇇",
-  "lltri;": "◺",
-  "lneqq;": "≨",
-  "lnsim;": "⋦",
-  "loang;": "⟬",
-  "loarr;": "⇽",
-  "lobrk;": "⟦",
-  "lopar;": "⦅",
-  "lrarr;": "⇆",
-  "lrhar;": "⇋",
-  "lrtri;": "⊿",
-  "lsime;": "⪍",
-  "lsimg;": "⪏",
-  "lsquo;": "‘",
-  "ltcir;": "⩹",
-  "ltdot;": "⋖",
-  "ltrie;": "⊴",
-  "ltrif;": "◂",
-  "mdash;": "—",
-  "mDDot;": "∺",
-  "micro;": "µ",
-  "middot": "·",
-  "minus;": "−",
-  "mumap;": "⊸",
-  "nabla;": "∇",
-  "napid;": "≋̸",
-  "napos;": "ʼn",
-  "natur;": "♮",
-  "nbump;": "≎̸",
-  "ncong;": "≇",
-  "ndash;": "–",
-  "neArr;": "⇗",
-  "nearr;": "↗",
-  "nedot;": "≐̸",
-  "nesim;": "≂̸",
-  "ngeqq;": "≧̸",
-  "ngsim;": "≵",
-  "nhArr;": "⇎",
-  "nharr;": "↮",
-  "nhpar;": "⫲",
-  "nlArr;": "⇍",
-  "nlarr;": "↚",
-  "nleqq;": "≦̸",
-  "nless;": "≮",
-  "nlsim;": "≴",
-  "nltri;": "⋪",
-  "notin;": "∉",
-  "notni;": "∌",
-  "npart;": "∂̸",
-  "nprec;": "⊀",
-  "nrArr;": "⇏",
-  "nrarr;": "↛",
-  "nrtri;": "⋫",
-  "nsime;": "≄",
-  "nsmid;": "∤",
-  "nspar;": "∦",
-  "nsubE;": "⫅̸",
-  "nsube;": "⊈",
-  "nsucc;": "⊁",
-  "nsupE;": "⫆̸",
-  "nsupe;": "⊉",
-  "Ntilde": "Ñ",
-  "ntilde": "ñ",
-  "numsp;": " ",
-  "nvsim;": "∼⃒",
-  "nwArr;": "⇖",
-  "nwarr;": "↖",
-  "Oacute": "Ó",
-  "oacute": "ó",
-  "Ocirc;": "Ô",
-  "ocirc;": "ô",
-  "odash;": "⊝",
-  "OElig;": "Œ",
-  "oelig;": "œ",
-  "ofcir;": "⦿",
-  "Ograve": "Ò",
-  "ograve": "ò",
-  "ohbar;": "⦵",
-  "olarr;": "↺",
-  "olcir;": "⦾",
-  "oline;": "‾",
-  "Omacr;": "Ō",
-  "omacr;": "ō",
-  "Omega;": "Ω",
-  "omega;": "ω",
-  "operp;": "⦹",
-  "oplus;": "⊕",
-  "orarr;": "↻",
-  "order;": "ℴ",
-  "Oslash": "Ø",
-  "oslash": "ø",
-  "Otilde": "Õ",
-  "otilde": "õ",
-  "ovbar;": "⌽",
-  "parsl;": "⫽",
-  "phone;": "☎",
-  "plusb;": "⊞",
-  "pluse;": "⩲",
-  "plusmn": "±",
-  "pound;": "£",
-  "prcue;": "≼",
-  "Prime;": "″",
-  "prime;": "′",
-  "prnap;": "⪹",
-  "prsim;": "≾",
-  "quest;": "?",
-  "rAarr;": "⇛",
-  "radic;": "√",
-  "rangd;": "⦒",
-  "range;": "⦥",
-  "raquo;": "»",
-  "rarrb;": "⇥",
-  "rarrc;": "⤳",
-  "rarrw;": "↝",
-  "ratio;": "∶",
-  "RBarr;": "⤐",
-  "rBarr;": "⤏",
-  "rbarr;": "⤍",
-  "rbbrk;": "❳",
-  "rbrke;": "⦌",
-  "rceil;": "⌉",
-  "rdquo;": "”",
-  "reals;": "ℝ",
-  "rhard;": "⇁",
-  "rharu;": "⇀",
-  "rlarr;": "⇄",
-  "rlhar;": "⇌",
-  "rnmid;": "⫮",
-  "roang;": "⟭",
-  "roarr;": "⇾",
-  "robrk;": "⟧",
-  "ropar;": "⦆",
-  "rrarr;": "⇉",
-  "rsquo;": "’",
-  "rtrie;": "⊵",
-  "rtrif;": "▸",
-  "sbquo;": "‚",
-  "sccue;": "≽",
-  "Scirc;": "Ŝ",
-  "scirc;": "ŝ",
-  "scnap;": "⪺",
-  "scsim;": "≿",
-  "sdotb;": "⊡",
-  "sdote;": "⩦",
-  "seArr;": "⇘",
-  "searr;": "↘",
-  "setmn;": "∖",
-  "sharp;": "♯",
-  "Sigma;": "Σ",
-  "sigma;": "σ",
-  "simeq;": "≃",
-  "simgE;": "⪠",
-  "simlE;": "⪟",
-  "simne;": "≆",
-  "slarr;": "←",
-  "smile;": "⌣",
-  "smtes;": "⪬︀",
-  "sqcap;": "⊓",
-  "sqcup;": "⊔",
-  "sqsub;": "⊏",
-  "sqsup;": "⊐",
-  "srarr;": "→",
-  "starf;": "★",
-  "strns;": "¯",
-  "subnE;": "⫋",
-  "subne;": "⊊",
-  "supnE;": "⫌",
-  "supne;": "⊋",
-  "swArr;": "⇙",
-  "swarr;": "↙",
-  "szlig;": "ß",
-  "Theta;": "Θ",
-  "theta;": "θ",
-  "thkap;": "≈",
-  "THORN;": "Þ",
-  "thorn;": "þ",
-  "Tilde;": "∼",
-  "tilde;": "˜",
-  "times;": "×",
-  "TRADE;": "™",
-  "trade;": "™",
-  "trisb;": "⧍",
-  "TSHcy;": "Ћ",
-  "tshcy;": "ћ",
-  "twixt;": "≬",
-  "Uacute": "Ú",
-  "uacute": "ú",
-  "Ubrcy;": "Ў",
-  "ubrcy;": "ў",
-  "Ucirc;": "Û",
-  "ucirc;": "û",
-  "udarr;": "⇅",
-  "udhar;": "⥮",
-  "Ugrave": "Ù",
-  "ugrave": "ù",
-  "uharl;": "↿",
-  "uharr;": "↾",
-  "uhblk;": "▀",
-  "ultri;": "◸",
-  "Umacr;": "Ū",
-  "umacr;": "ū",
-  "Union;": "⋃",
-  "Uogon;": "Ų",
-  "uogon;": "ų",
-  "uplus;": "⊎",
-  "upsih;": "ϒ",
-  "UpTee;": "⊥",
-  "Uring;": "Ů",
-  "uring;": "ů",
-  "urtri;": "◹",
-  "utdot;": "⋰",
-  "utrif;": "▴",
-  "uuarr;": "⇈",
-  "varpi;": "ϖ",
-  "vBarv;": "⫩",
-  "VDash;": "⊫",
-  "Vdash;": "⊩",
-  "vDash;": "⊨",
-  "vdash;": "⊢",
-  "veeeq;": "≚",
-  "vltri;": "⊲",
-  "vnsub;": "⊂⃒",
-  "vnsup;": "⊃⃒",
-  "vprop;": "∝",
-  "vrtri;": "⊳",
-  "Wcirc;": "Ŵ",
-  "wcirc;": "ŵ",
-  "Wedge;": "⋀",
-  "wedge;": "∧",
-  "xcirc;": "◯",
-  "xdtri;": "▽",
-  "xhArr;": "⟺",
-  "xharr;": "⟷",
-  "xlArr;": "⟸",
-  "xlarr;": "⟵",
-  "xodot;": "⨀",
-  "xrArr;": "⟹",
-  "xrarr;": "⟶",
-  "xutri;": "△",
-  "Yacute": "Ý",
-  "yacute": "ý",
-  "Ycirc;": "Ŷ",
-  "ycirc;": "ŷ",
-  "Aacute;": "Á",
-  "aacute;": "á",
-  "Abreve;": "Ă",
-  "abreve;": "ă",
-  "Agrave;": "À",
-  "agrave;": "à",
-  "andand;": "⩕",
-  "angmsd;": "∡",
-  "angsph;": "∢",
-  "apacir;": "⩯",
-  "approx;": "≈",
-  "Assign;": "≔",
-  "Atilde;": "Ã",
-  "atilde;": "ã",
-  "barvee;": "⊽",
-  "Barwed;": "⌆",
-  "barwed;": "⌅",
-  "becaus;": "∵",
-  "bernou;": "ℬ",
-  "bigcap;": "⋂",
-  "bigcup;": "⋃",
-  "bigvee;": "⋁",
-  "bkarow;": "⤍",
-  "bottom;": "⊥",
-  "bowtie;": "⋈",
-  "boxbox;": "⧉",
-  "bprime;": "‵",
-  "brvbar;": "¦",
-  "bullet;": "•",
-  "Bumpeq;": "≎",
-  "bumpeq;": "≏",
-  "Cacute;": "Ć",
-  "cacute;": "ć",
-  "capand;": "⩄",
-  "capcap;": "⩋",
-  "capcup;": "⩇",
-  "capdot;": "⩀",
-  "Ccaron;": "Č",
-  "ccaron;": "č",
-  "Ccedil;": "Ç",
-  "ccedil;": "ç",
-  "circeq;": "≗",
-  "cirmid;": "⫯",
-  "Colone;": "⩴",
-  "colone;": "≔",
-  "commat;": "@",
-  "compfn;": "∘",
-  "Conint;": "∯",
-  "conint;": "∮",
-  "coprod;": "∐",
-  "copysr;": "℗",
-  "cularr;": "↶",
-  "CupCap;": "≍",
-  "cupcap;": "⩆",
-  "cupcup;": "⩊",
-  "cupdot;": "⊍",
-  "curarr;": "↷",
-  "curren;": "¤",
-  "cylcty;": "⌭",
-  "Dagger;": "‡",
-  "dagger;": "†",
-  "daleth;": "ℸ",
-  "Dcaron;": "Ď",
-  "dcaron;": "ď",
-  "dfisht;": "⥿",
-  "divide;": "÷",
-  "divonx;": "⋇",
-  "dlcorn;": "⌞",
-  "dlcrop;": "⌍",
-  "dollar;": "$",
-  "DotDot;": "⃜",
-  "drcorn;": "⌟",
-  "drcrop;": "⌌",
-  "Dstrok;": "Đ",
-  "dstrok;": "đ",
-  "Eacute;": "É",
-  "eacute;": "é",
-  "easter;": "⩮",
-  "Ecaron;": "Ě",
-  "ecaron;": "ě",
-  "ecolon;": "≕",
-  "Egrave;": "È",
-  "egrave;": "è",
-  "egsdot;": "⪘",
-  "elsdot;": "⪗",
-  "emptyv;": "∅",
-  "emsp13;": " ",
-  "emsp14;": " ",
-  "eparsl;": "⧣",
-  "eqcirc;": "≖",
-  "equals;": "=",
-  "equest;": "≟",
-  "Exists;": "∃",
-  "female;": "♀",
-  "ffilig;": "ffi",
-  "ffllig;": "ffl",
-  "ForAll;": "∀",
-  "forall;": "∀",
-  "frac12;": "½",
-  "frac13;": "⅓",
-  "frac14;": "¼",
-  "frac15;": "⅕",
-  "frac16;": "⅙",
-  "frac18;": "⅛",
-  "frac23;": "⅔",
-  "frac25;": "⅖",
-  "frac34;": "¾",
-  "frac35;": "⅗",
-  "frac38;": "⅜",
-  "frac45;": "⅘",
-  "frac56;": "⅚",
-  "frac58;": "⅝",
-  "frac78;": "⅞",
-  "gacute;": "ǵ",
-  "Gammad;": "Ϝ",
-  "gammad;": "ϝ",
-  "Gbreve;": "Ğ",
-  "gbreve;": "ğ",
-  "Gcedil;": "Ģ",
-  "gesdot;": "⪀",
-  "gesles;": "⪔",
-  "gtlPar;": "⦕",
-  "gtrarr;": "⥸",
-  "gtrdot;": "⋗",
-  "gtrsim;": "≳",
-  "hairsp;": " ",
-  "hamilt;": "ℋ",
-  "HARDcy;": "Ъ",
-  "hardcy;": "ъ",
-  "hearts;": "♥",
-  "hellip;": "…",
-  "hercon;": "⊹",
-  "homtht;": "∻",
-  "horbar;": "―",
-  "hslash;": "ℏ",
-  "Hstrok;": "Ħ",
-  "hstrok;": "ħ",
-  "hybull;": "⁃",
-  "hyphen;": "‐",
-  "Iacute;": "Í",
-  "iacute;": "í",
-  "Igrave;": "Ì",
-  "igrave;": "ì",
-  "iiiint;": "⨌",
-  "iinfin;": "⧜",
-  "incare;": "℅",
-  "inodot;": "ı",
-  "intcal;": "⊺",
-  "iquest;": "¿",
-  "isinsv;": "⋳",
-  "Itilde;": "Ĩ",
-  "itilde;": "ĩ",
-  "Jsercy;": "Ј",
-  "jsercy;": "ј",
-  "kappav;": "ϰ",
-  "Kcedil;": "Ķ",
-  "kcedil;": "ķ",
-  "kgreen;": "ĸ",
-  "Lacute;": "Ĺ",
-  "lacute;": "ĺ",
-  "lagran;": "ℒ",
-  "Lambda;": "Λ",
-  "lambda;": "λ",
-  "langle;": "⟨",
-  "larrfs;": "⤝",
-  "larrhk;": "↩",
-  "larrlp;": "↫",
-  "larrpl;": "⤹",
-  "larrtl;": "↢",
-  "lAtail;": "⤛",
-  "latail;": "⤙",
-  "lbrace;": "{",
-  "lbrack;": "[",
-  "Lcaron;": "Ľ",
-  "lcaron;": "ľ",
-  "Lcedil;": "Ļ",
-  "lcedil;": "ļ",
-  "ldquor;": "„",
-  "lesdot;": "⩿",
-  "lesges;": "⪓",
-  "lfisht;": "⥼",
-  "lfloor;": "⌊",
-  "lharul;": "⥪",
-  "llhard;": "⥫",
-  "Lmidot;": "Ŀ",
-  "lmidot;": "ŀ",
-  "lmoust;": "⎰",
-  "loplus;": "⨭",
-  "lowast;": "∗",
-  "lowbar;": "_",
-  "lparlt;": "⦓",
-  "lrhard;": "⥭",
-  "lsaquo;": "‹",
-  "lsquor;": "‚",
-  "Lstrok;": "Ł",
-  "lstrok;": "ł",
-  "lthree;": "⋋",
-  "ltimes;": "⋉",
-  "ltlarr;": "⥶",
-  "ltrPar;": "⦖",
-  "mapsto;": "↦",
-  "marker;": "▮",
-  "mcomma;": "⨩",
-  "midast;": "*",
-  "midcir;": "⫰",
-  "middot;": "·",
-  "minusb;": "⊟",
-  "minusd;": "∸",
-  "mnplus;": "∓",
-  "models;": "⊧",
-  "mstpos;": "∾",
-  "Nacute;": "Ń",
-  "nacute;": "ń",
-  "nbumpe;": "≏̸",
-  "Ncaron;": "Ň",
-  "ncaron;": "ň",
-  "Ncedil;": "Ņ",
-  "ncedil;": "ņ",
-  "nearhk;": "⤤",
-  "nequiv;": "≢",
-  "nesear;": "⤨",
-  "nexist;": "∄",
-  "nltrie;": "⋬",
-  "notinE;": "⋹̸",
-  "nparsl;": "⫽⃥",
-  "nprcue;": "⋠",
-  "nrarrc;": "⤳̸",
-  "nrarrw;": "↝̸",
-  "nrtrie;": "⋭",
-  "nsccue;": "⋡",
-  "nsimeq;": "≄",
-  "Ntilde;": "Ñ",
-  "ntilde;": "ñ",
-  "numero;": "№",
-  "nVDash;": "⊯",
-  "nVdash;": "⊮",
-  "nvDash;": "⊭",
-  "nvdash;": "⊬",
-  "nvHarr;": "⤄",
-  "nvlArr;": "⤂",
-  "nvrArr;": "⤃",
-  "nwarhk;": "⤣",
-  "nwnear;": "⤧",
-  "Oacute;": "Ó",
-  "oacute;": "ó",
-  "Odblac;": "Ő",
-  "odblac;": "ő",
-  "odsold;": "⦼",
-  "Ograve;": "Ò",
-  "ograve;": "ò",
-  "ominus;": "⊖",
-  "origof;": "⊶",
-  "Oslash;": "Ø",
-  "oslash;": "ø",
-  "Otilde;": "Õ",
-  "otilde;": "õ",
-  "Otimes;": "⨷",
-  "otimes;": "⊗",
-  "parsim;": "⫳",
-  "percnt;": "%",
-  "period;": ".",
-  "permil;": "‰",
-  "phmmat;": "ℳ",
-  "planck;": "ℏ",
-  "plankv;": "ℏ",
-  "plusdo;": "∔",
-  "plusdu;": "⨥",
-  "plusmn;": "±",
-  "preceq;": "⪯",
-  "primes;": "ℙ",
-  "prnsim;": "⋨",
-  "propto;": "∝",
-  "prurel;": "⊰",
-  "puncsp;": " ",
-  "qprime;": "⁗",
-  "Racute;": "Ŕ",
-  "racute;": "ŕ",
-  "rangle;": "⟩",
-  "rarrap;": "⥵",
-  "rarrfs;": "⤞",
-  "rarrhk;": "↪",
-  "rarrlp;": "↬",
-  "rarrpl;": "⥅",
-  "Rarrtl;": "⤖",
-  "rarrtl;": "↣",
-  "rAtail;": "⤜",
-  "ratail;": "⤚",
-  "rbrace;": "}",
-  "rbrack;": "]",
-  "Rcaron;": "Ř",
-  "rcaron;": "ř",
-  "Rcedil;": "Ŗ",
-  "rcedil;": "ŗ",
-  "rdquor;": "”",
-  "rfisht;": "⥽",
-  "rfloor;": "⌋",
-  "rharul;": "⥬",
-  "rmoust;": "⎱",
-  "roplus;": "⨮",
-  "rpargt;": "⦔",
-  "rsaquo;": "›",
-  "rsquor;": "’",
-  "rthree;": "⋌",
-  "rtimes;": "⋊",
-  "Sacute;": "Ś",
-  "sacute;": "ś",
-  "Scaron;": "Š",
-  "scaron;": "š",
-  "Scedil;": "Ş",
-  "scedil;": "ş",
-  "scnsim;": "⋩",
-  "searhk;": "⤥",
-  "seswar;": "⤩",
-  "sfrown;": "⌢",
-  "SHCHcy;": "Щ",
-  "shchcy;": "щ",
-  "sigmaf;": "ς",
-  "sigmav;": "ς",
-  "simdot;": "⩪",
-  "smashp;": "⨳",
-  "SOFTcy;": "Ь",
-  "softcy;": "ь",
-  "solbar;": "⌿",
-  "spades;": "♠",
-  "sqcaps;": "⊓︀",
-  "sqcups;": "⊔︀",
-  "sqsube;": "⊑",
-  "sqsupe;": "⊒",
-  "Square;": "□",
-  "square;": "□",
-  "squarf;": "▪",
-  "ssetmn;": "∖",
-  "ssmile;": "⌣",
-  "sstarf;": "⋆",
-  "subdot;": "⪽",
-  "Subset;": "⋐",
-  "subset;": "⊂",
-  "subsim;": "⫇",
-  "subsub;": "⫕",
-  "subsup;": "⫓",
-  "succeq;": "⪰",
-  "supdot;": "⪾",
-  "Supset;": "⋑",
-  "supset;": "⊃",
-  "supsim;": "⫈",
-  "supsub;": "⫔",
-  "supsup;": "⫖",
-  "swarhk;": "⤦",
-  "swnwar;": "⤪",
-  "target;": "⌖",
-  "Tcaron;": "Ť",
-  "tcaron;": "ť",
-  "Tcedil;": "Ţ",
-  "tcedil;": "ţ",
-  "telrec;": "⌕",
-  "there4;": "∴",
-  "thetav;": "ϑ",
-  "thinsp;": " ",
-  "thksim;": "∼",
-  "timesb;": "⊠",
-  "timesd;": "⨰",
-  "topbot;": "⌶",
-  "topcir;": "⫱",
-  "tprime;": "‴",
-  "tridot;": "◬",
-  "Tstrok;": "Ŧ",
-  "tstrok;": "ŧ",
-  "Uacute;": "Ú",
-  "uacute;": "ú",
-  "Ubreve;": "Ŭ",
-  "ubreve;": "ŭ",
-  "Udblac;": "Ű",
-  "udblac;": "ű",
-  "ufisht;": "⥾",
-  "Ugrave;": "Ù",
-  "ugrave;": "ù",
-  "ulcorn;": "⌜",
-  "ulcrop;": "⌏",
-  "urcorn;": "⌝",
-  "urcrop;": "⌎",
-  "Utilde;": "Ũ",
-  "utilde;": "ũ",
-  "vangrt;": "⦜",
-  "varphi;": "ϕ",
-  "varrho;": "ϱ",
-  "Vdashl;": "⫦",
-  "veebar;": "⊻",
-  "vellip;": "⋮",
-  "Verbar;": "‖",
-  "verbar;": "|",
-  "vsubnE;": "⫋︀",
-  "vsubne;": "⊊︀",
-  "vsupnE;": "⫌︀",
-  "vsupne;": "⊋︀",
-  "Vvdash;": "⊪",
-  "wedbar;": "⩟",
-  "wedgeq;": "≙",
-  "weierp;": "℘",
-  "wreath;": "≀",
-  "xoplus;": "⨁",
-  "xotime;": "⨂",
-  "xsqcup;": "⨆",
-  "xuplus;": "⨄",
-  "xwedge;": "⋀",
-  "Yacute;": "Ý",
-  "yacute;": "ý",
-  "Zacute;": "Ź",
-  "zacute;": "ź",
-  "Zcaron;": "Ž",
-  "zcaron;": "ž",
-  "zeetrf;": "ℨ",
-  "alefsym;": "ℵ",
-  "angrtvb;": "⊾",
-  "angzarr;": "⍼",
-  "asympeq;": "≍",
-  "backsim;": "∽",
-  "Because;": "∵",
-  "because;": "∵",
-  "bemptyv;": "⦰",
-  "between;": "≬",
-  "bigcirc;": "◯",
-  "bigodot;": "⨀",
-  "bigstar;": "★",
-  "bnequiv;": "≡⃥",
-  "boxplus;": "⊞",
-  "Cayleys;": "ℭ",
-  "Cconint;": "∰",
-  "ccupssm;": "⩐",
-  "Cedilla;": "¸",
-  "cemptyv;": "⦲",
-  "cirscir;": "⧂",
-  "coloneq;": "≔",
-  "congdot;": "⩭",
-  "cudarrl;": "⤸",
-  "cudarrr;": "⤵",
-  "cularrp;": "⤽",
-  "curarrm;": "⤼",
-  "dbkarow;": "⤏",
-  "ddagger;": "‡",
-  "ddotseq;": "⩷",
-  "demptyv;": "⦱",
-  "Diamond;": "⋄",
-  "diamond;": "⋄",
-  "digamma;": "ϝ",
-  "dotplus;": "∔",
-  "DownTee;": "⊤",
-  "dwangle;": "⦦",
-  "Element;": "∈",
-  "Epsilon;": "Ε",
-  "epsilon;": "ε",
-  "eqcolon;": "≕",
-  "equivDD;": "⩸",
-  "gesdoto;": "⪂",
-  "gtquest;": "⩼",
-  "gtrless;": "≷",
-  "harrcir;": "⥈",
-  "Implies;": "⇒",
-  "intprod;": "⨼",
-  "isindot;": "⋵",
-  "larrbfs;": "⤟",
-  "larrsim;": "⥳",
-  "lbrksld;": "⦏",
-  "lbrkslu;": "⦍",
-  "ldrdhar;": "⥧",
-  "LeftTee;": "⊣",
-  "lesdoto;": "⪁",
-  "lessdot;": "⋖",
-  "lessgtr;": "≶",
-  "lesssim;": "≲",
-  "lotimes;": "⨴",
-  "lozenge;": "◊",
-  "ltquest;": "⩻",
-  "luruhar;": "⥦",
-  "maltese;": "✠",
-  "minusdu;": "⨪",
-  "napprox;": "≉",
-  "natural;": "♮",
-  "nearrow;": "↗",
-  "NewLine;": "\n",
-  "nexists;": "∄",
-  "NoBreak;": "⁠",
-  "notinva;": "∉",
-  "notinvb;": "⋷",
-  "notinvc;": "⋶",
-  "NotLess;": "≮",
-  "notniva;": "∌",
-  "notnivb;": "⋾",
-  "notnivc;": "⋽",
-  "npolint;": "⨔",
-  "npreceq;": "⪯̸",
-  "nsqsube;": "⋢",
-  "nsqsupe;": "⋣",
-  "nsubset;": "⊂⃒",
-  "nsucceq;": "⪰̸",
-  "nsupset;": "⊃⃒",
-  "nvinfin;": "⧞",
-  "nvltrie;": "⊴⃒",
-  "nvrtrie;": "⊵⃒",
-  "nwarrow;": "↖",
-  "olcross;": "⦻",
-  "Omicron;": "Ο",
-  "omicron;": "ο",
-  "orderof;": "ℴ",
-  "orslope;": "⩗",
-  "OverBar;": "‾",
-  "pertenk;": "‱",
-  "planckh;": "ℎ",
-  "pluscir;": "⨢",
-  "plussim;": "⨦",
-  "plustwo;": "⨧",
-  "precsim;": "≾",
-  "Product;": "∏",
-  "quatint;": "⨖",
-  "questeq;": "≟",
-  "rarrbfs;": "⤠",
-  "rarrsim;": "⥴",
-  "rbrksld;": "⦎",
-  "rbrkslu;": "⦐",
-  "rdldhar;": "⥩",
-  "realine;": "ℛ",
-  "rotimes;": "⨵",
-  "ruluhar;": "⥨",
-  "searrow;": "↘",
-  "simplus;": "⨤",
-  "simrarr;": "⥲",
-  "subedot;": "⫃",
-  "submult;": "⫁",
-  "subplus;": "⪿",
-  "subrarr;": "⥹",
-  "succsim;": "≿",
-  "supdsub;": "⫘",
-  "supedot;": "⫄",
-  "suphsol;": "⟉",
-  "suphsub;": "⫗",
-  "suplarr;": "⥻",
-  "supmult;": "⫂",
-  "supplus;": "⫀",
-  "swarrow;": "↙",
-  "topfork;": "⫚",
-  "triplus;": "⨹",
-  "tritime;": "⨻",
-  "UpArrow;": "↑",
-  "Uparrow;": "⇑",
-  "uparrow;": "↑",
-  "Upsilon;": "Υ",
-  "upsilon;": "υ",
-  "uwangle;": "⦧",
-  "vzigzag;": "⦚",
-  "zigrarr;": "⇝",
-  "andslope;": "⩘",
-  "angmsdaa;": "⦨",
-  "angmsdab;": "⦩",
-  "angmsdac;": "⦪",
-  "angmsdad;": "⦫",
-  "angmsdae;": "⦬",
-  "angmsdaf;": "⦭",
-  "angmsdag;": "⦮",
-  "angmsdah;": "⦯",
-  "angrtvbd;": "⦝",
-  "approxeq;": "≊",
-  "awconint;": "∳",
-  "backcong;": "≌",
-  "barwedge;": "⌅",
-  "bbrktbrk;": "⎶",
-  "bigoplus;": "⨁",
-  "bigsqcup;": "⨆",
-  "biguplus;": "⨄",
-  "bigwedge;": "⋀",
-  "boxminus;": "⊟",
-  "boxtimes;": "⊠",
-  "bsolhsub;": "⟈",
-  "capbrcup;": "⩉",
-  "circledR;": "®",
-  "circledS;": "Ⓢ",
-  "cirfnint;": "⨐",
-  "clubsuit;": "♣",
-  "cupbrcap;": "⩈",
-  "curlyvee;": "⋎",
-  "cwconint;": "∲",
-  "DDotrahd;": "⤑",
-  "doteqdot;": "≑",
-  "DotEqual;": "≐",
-  "dotminus;": "∸",
-  "drbkarow;": "⤐",
-  "dzigrarr;": "⟿",
-  "elinters;": "⏧",
-  "emptyset;": "∅",
-  "eqvparsl;": "⧥",
-  "fpartint;": "⨍",
-  "geqslant;": "⩾",
-  "gesdotol;": "⪄",
-  "gnapprox;": "⪊",
-  "hksearow;": "⤥",
-  "hkswarow;": "⤦",
-  "imagline;": "ℐ",
-  "imagpart;": "ℑ",
-  "infintie;": "⧝",
-  "integers;": "ℤ",
-  "Integral;": "∫",
-  "intercal;": "⊺",
-  "intlarhk;": "⨗",
-  "laemptyv;": "⦴",
-  "ldrushar;": "⥋",
-  "leqslant;": "⩽",
-  "lesdotor;": "⪃",
-  "LessLess;": "⪡",
-  "llcorner;": "⌞",
-  "lnapprox;": "⪉",
-  "lrcorner;": "⌟",
-  "lurdshar;": "⥊",
-  "mapstoup;": "↥",
-  "multimap;": "⊸",
-  "naturals;": "ℕ",
-  "ncongdot;": "⩭̸",
-  "NotEqual;": "≠",
-  "notindot;": "⋵̸",
-  "NotTilde;": "≁",
-  "otimesas;": "⨶",
-  "parallel;": "∥",
-  "PartialD;": "∂",
-  "plusacir;": "⨣",
-  "pointint;": "⨕",
-  "Precedes;": "≺",
-  "precneqq;": "⪵",
-  "precnsim;": "⋨",
-  "profalar;": "⌮",
-  "profline;": "⌒",
-  "profsurf;": "⌓",
-  "raemptyv;": "⦳",
-  "realpart;": "ℜ",
-  "RightTee;": "⊢",
-  "rppolint;": "⨒",
-  "rtriltri;": "⧎",
-  "scpolint;": "⨓",
-  "setminus;": "∖",
-  "shortmid;": "∣",
-  "smeparsl;": "⧤",
-  "sqsubset;": "⊏",
-  "sqsupset;": "⊐",
-  "subseteq;": "⊆",
-  "Succeeds;": "≻",
-  "succneqq;": "⪶",
-  "succnsim;": "⋩",
-  "SuchThat;": "∋",
-  "Superset;": "⊃",
-  "supseteq;": "⊇",
-  "thetasym;": "ϑ",
-  "thicksim;": "∼",
-  "timesbar;": "⨱",
-  "triangle;": "▵",
-  "triminus;": "⨺",
-  "trpezium;": "⏢",
-  "Uarrocir;": "⥉",
-  "ulcorner;": "⌜",
-  "UnderBar;": "_",
-  "urcorner;": "⌝",
-  "varkappa;": "ϰ",
-  "varsigma;": "ς",
-  "vartheta;": "ϑ",
-  "backprime;": "‵",
-  "backsimeq;": "⋍",
-  "Backslash;": "∖",
-  "bigotimes;": "⨂",
-  "CenterDot;": "·",
-  "centerdot;": "·",
-  "checkmark;": "✓",
-  "CircleDot;": "⊙",
-  "complexes;": "ℂ",
-  "Congruent;": "≡",
-  "Coproduct;": "∐",
-  "dotsquare;": "⊡",
-  "DoubleDot;": "¨",
-  "DownArrow;": "↓",
-  "Downarrow;": "⇓",
-  "downarrow;": "↓",
-  "DownBreve;": "̑",
-  "gtrapprox;": "⪆",
-  "gtreqless;": "⋛",
-  "gvertneqq;": "≩︀",
-  "heartsuit;": "♥",
-  "HumpEqual;": "≏",
-  "LeftArrow;": "←",
-  "Leftarrow;": "⇐",
-  "leftarrow;": "←",
-  "LeftFloor;": "⌊",
-  "lesseqgtr;": "⋚",
-  "LessTilde;": "≲",
-  "lvertneqq;": "≨︀",
-  "Mellintrf;": "ℳ",
-  "MinusPlus;": "∓",
-  "ngeqslant;": "⩾̸",
-  "nleqslant;": "⩽̸",
-  "NotCupCap;": "≭",
-  "NotExists;": "∄",
-  "NotSubset;": "⊂⃒",
-  "nparallel;": "∦",
-  "nshortmid;": "∤",
-  "nsubseteq;": "⊈",
-  "nsupseteq;": "⊉",
-  "OverBrace;": "⏞",
-  "pitchfork;": "⋔",
-  "PlusMinus;": "±",
-  "rationals;": "ℚ",
-  "spadesuit;": "♠",
-  "subseteqq;": "⫅",
-  "subsetneq;": "⊊",
-  "supseteqq;": "⫆",
-  "supsetneq;": "⊋",
-  "Therefore;": "∴",
-  "therefore;": "∴",
-  "ThinSpace;": " ",
-  "triangleq;": "≜",
-  "TripleDot;": "⃛",
-  "UnionPlus;": "⊎",
-  "varpropto;": "∝",
-  "Bernoullis;": "ℬ",
-  "circledast;": "⊛",
-  "CirclePlus;": "⊕",
-  "complement;": "∁",
-  "curlywedge;": "⋏",
-  "eqslantgtr;": "⪖",
-  "EqualTilde;": "≂",
-  "Fouriertrf;": "ℱ",
-  "gtreqqless;": "⪌",
-  "ImaginaryI;": "ⅈ",
-  "Laplacetrf;": "ℒ",
-  "LeftVector;": "↼",
-  "lessapprox;": "⪅",
-  "lesseqqgtr;": "⪋",
-  "Lleftarrow;": "⇚",
-  "lmoustache;": "⎰",
-  "longmapsto;": "⟼",
-  "mapstodown;": "↧",
-  "mapstoleft;": "↤",
-  "nLeftarrow;": "⇍",
-  "nleftarrow;": "↚",
-  "NotElement;": "∉",
-  "NotGreater;": "≯",
-  "nsubseteqq;": "⫅̸",
-  "nsupseteqq;": "⫆̸",
-  "precapprox;": "⪷",
-  "Proportion;": "∷",
-  "RightArrow;": "→",
-  "Rightarrow;": "⇒",
-  "rightarrow;": "→",
-  "RightFloor;": "⌋",
-  "rmoustache;": "⎱",
-  "sqsubseteq;": "⊑",
-  "sqsupseteq;": "⊒",
-  "subsetneqq;": "⫋",
-  "succapprox;": "⪸",
-  "supsetneqq;": "⫌",
-  "ThickSpace;": "  ",
-  "TildeEqual;": "≃",
-  "TildeTilde;": "≈",
-  "UnderBrace;": "⏟",
-  "UpArrowBar;": "⤒",
-  "UpTeeArrow;": "↥",
-  "upuparrows;": "⇈",
-  "varepsilon;": "ϵ",
-  "varnothing;": "∅",
-  "backepsilon;": "϶",
-  "blacksquare;": "▪",
-  "circledcirc;": "⊚",
-  "circleddash;": "⊝",
-  "CircleMinus;": "⊖",
-  "CircleTimes;": "⊗",
-  "curlyeqprec;": "⋞",
-  "curlyeqsucc;": "⋟",
-  "diamondsuit;": "♦",
-  "eqslantless;": "⪕",
-  "Equilibrium;": "⇌",
-  "expectation;": "ℰ",
-  "GreaterLess;": "≷",
-  "LeftCeiling;": "⌈",
-  "LessGreater;": "≶",
-  "MediumSpace;": " ",
-  "NotLessLess;": "≪̸",
-  "NotPrecedes;": "⊀",
-  "NotSucceeds;": "⊁",
-  "NotSuperset;": "⊃⃒",
-  "nRightarrow;": "⇏",
-  "nrightarrow;": "↛",
-  "OverBracket;": "⎴",
-  "preccurlyeq;": "≼",
-  "precnapprox;": "⪹",
-  "quaternions;": "ℍ",
-  "RightVector;": "⇀",
-  "Rrightarrow;": "⇛",
-  "RuleDelayed;": "⧴",
-  "SmallCircle;": "∘",
-  "SquareUnion;": "⊔",
-  "straightphi;": "ϕ",
-  "SubsetEqual;": "⊆",
-  "succcurlyeq;": "≽",
-  "succnapprox;": "⪺",
-  "thickapprox;": "≈",
-  "UpDownArrow;": "↕",
-  "Updownarrow;": "⇕",
-  "updownarrow;": "↕",
-  "VerticalBar;": "∣",
-  "blacklozenge;": "⧫",
-  "DownArrowBar;": "⤓",
-  "DownTeeArrow;": "↧",
-  "ExponentialE;": "ⅇ",
-  "exponentiale;": "ⅇ",
-  "GreaterEqual;": "≥",
-  "GreaterTilde;": "≳",
-  "HilbertSpace;": "ℋ",
-  "HumpDownHump;": "≎",
-  "Intersection;": "⋂",
-  "LeftArrowBar;": "⇤",
-  "LeftTeeArrow;": "↤",
-  "LeftTriangle;": "⊲",
-  "LeftUpVector;": "↿",
-  "NotCongruent;": "≢",
-  "NotHumpEqual;": "≏̸",
-  "NotLessEqual;": "≰",
-  "NotLessTilde;": "≴",
-  "Proportional;": "∝",
-  "RightCeiling;": "⌉",
-  "risingdotseq;": "≓",
-  "RoundImplies;": "⥰",
-  "ShortUpArrow;": "↑",
-  "SquareSubset;": "⊏",
-  "triangledown;": "▿",
-  "triangleleft;": "◃",
-  "UnderBracket;": "⎵",
-  "varsubsetneq;": "⊊︀",
-  "varsupsetneq;": "⊋︀",
-  "VerticalLine;": "|",
-  "ApplyFunction;": "⁡",
-  "bigtriangleup;": "△",
-  "blacktriangle;": "▴",
-  "DifferentialD;": "ⅆ",
-  "divideontimes;": "⋇",
-  "DoubleLeftTee;": "⫤",
-  "DoubleUpArrow;": "⇑",
-  "fallingdotseq;": "≒",
-  "hookleftarrow;": "↩",
-  "leftarrowtail;": "↢",
-  "leftharpoonup;": "↼",
-  "LeftTeeVector;": "⥚",
-  "LeftVectorBar;": "⥒",
-  "LessFullEqual;": "≦",
-  "LongLeftArrow;": "⟵",
-  "Longleftarrow;": "⟸",
-  "longleftarrow;": "⟵",
-  "looparrowleft;": "↫",
-  "measuredangle;": "∡",
-  "NotEqualTilde;": "≂̸",
-  "NotTildeEqual;": "≄",
-  "NotTildeTilde;": "≉",
-  "ntriangleleft;": "⋪",
-  "Poincareplane;": "ℌ",
-  "PrecedesEqual;": "⪯",
-  "PrecedesTilde;": "≾",
-  "RightArrowBar;": "⇥",
-  "RightTeeArrow;": "↦",
-  "RightTriangle;": "⊳",
-  "RightUpVector;": "↾",
-  "shortparallel;": "∥",
-  "smallsetminus;": "∖",
-  "SucceedsEqual;": "⪰",
-  "SucceedsTilde;": "≿",
-  "SupersetEqual;": "⊇",
-  "triangleright;": "▹",
-  "UpEquilibrium;": "⥮",
-  "upharpoonleft;": "↿",
-  "varsubsetneqq;": "⫋︀",
-  "varsupsetneqq;": "⫌︀",
-  "VerticalTilde;": "≀",
-  "VeryThinSpace;": " ",
-  "curvearrowleft;": "↶",
-  "DiacriticalDot;": "˙",
-  "doublebarwedge;": "⌆",
-  "DoubleRightTee;": "⊨",
-  "downdownarrows;": "⇊",
-  "DownLeftVector;": "↽",
-  "GreaterGreater;": "⪢",
-  "hookrightarrow;": "↪",
-  "HorizontalLine;": "─",
-  "InvisibleComma;": "⁣",
-  "InvisibleTimes;": "⁢",
-  "LeftDownVector;": "⇃",
-  "leftleftarrows;": "⇇",
-  "LeftRightArrow;": "↔",
-  "Leftrightarrow;": "⇔",
-  "leftrightarrow;": "↔",
-  "leftthreetimes;": "⋋",
-  "LessSlantEqual;": "⩽",
-  "LongRightArrow;": "⟶",
-  "Longrightarrow;": "⟹",
-  "longrightarrow;": "⟶",
-  "looparrowright;": "↬",
-  "LowerLeftArrow;": "↙",
-  "NestedLessLess;": "≪",
-  "NotGreaterLess;": "≹",
-  "NotLessGreater;": "≸",
-  "NotSubsetEqual;": "⊈",
-  "NotVerticalBar;": "∤",
-  "nshortparallel;": "∦",
-  "ntriangleright;": "⋫",
-  "OpenCurlyQuote;": "‘",
-  "ReverseElement;": "∋",
-  "rightarrowtail;": "↣",
-  "rightharpoonup;": "⇀",
-  "RightTeeVector;": "⥛",
-  "RightVectorBar;": "⥓",
-  "ShortDownArrow;": "↓",
-  "ShortLeftArrow;": "←",
-  "SquareSuperset;": "⊐",
-  "TildeFullEqual;": "≅",
-  "trianglelefteq;": "⊴",
-  "upharpoonright;": "↾",
-  "UpperLeftArrow;": "↖",
-  "ZeroWidthSpace;": "​",
-  "bigtriangledown;": "▽",
-  "circlearrowleft;": "↺",
-  "CloseCurlyQuote;": "’",
-  "ContourIntegral;": "∮",
-  "curvearrowright;": "↷",
-  "DoubleDownArrow;": "⇓",
-  "DoubleLeftArrow;": "⇐",
-  "downharpoonleft;": "⇃",
-  "DownRightVector;": "⇁",
-  "leftharpoondown;": "↽",
-  "leftrightarrows;": "⇆",
-  "LeftRightVector;": "⥎",
-  "LeftTriangleBar;": "⧏",
-  "LeftUpTeeVector;": "⥠",
-  "LeftUpVectorBar;": "⥘",
-  "LowerRightArrow;": "↘",
-  "nLeftrightarrow;": "⇎",
-  "nleftrightarrow;": "↮",
-  "NotGreaterEqual;": "≱",
-  "NotGreaterTilde;": "≵",
-  "NotHumpDownHump;": "≎̸",
-  "NotLeftTriangle;": "⋪",
-  "NotSquareSubset;": "⊏̸",
-  "ntrianglelefteq;": "⋬",
-  "OverParenthesis;": "⏜",
-  "RightDownVector;": "⇂",
-  "rightleftarrows;": "⇄",
-  "rightsquigarrow;": "↝",
-  "rightthreetimes;": "⋌",
-  "ShortRightArrow;": "→",
-  "straightepsilon;": "ϵ",
-  "trianglerighteq;": "⊵",
-  "UpperRightArrow;": "↗",
-  "vartriangleleft;": "⊲",
-  "circlearrowright;": "↻",
-  "DiacriticalAcute;": "´",
-  "DiacriticalGrave;": "`",
-  "DiacriticalTilde;": "˜",
-  "DoubleRightArrow;": "⇒",
-  "DownArrowUpArrow;": "⇵",
-  "downharpoonright;": "⇂",
-  "EmptySmallSquare;": "◻",
-  "GreaterEqualLess;": "⋛",
-  "GreaterFullEqual;": "≧",
-  "LeftAngleBracket;": "⟨",
-  "LeftUpDownVector;": "⥑",
-  "LessEqualGreater;": "⋚",
-  "NonBreakingSpace;": " ",
-  "NotPrecedesEqual;": "⪯̸",
-  "NotRightTriangle;": "⋫",
-  "NotSucceedsEqual;": "⪰̸",
-  "NotSucceedsTilde;": "≿̸",
-  "NotSupersetEqual;": "⊉",
-  "ntrianglerighteq;": "⋭",
-  "rightharpoondown;": "⇁",
-  "rightrightarrows;": "⇉",
-  "RightTriangleBar;": "⧐",
-  "RightUpTeeVector;": "⥜",
-  "RightUpVectorBar;": "⥔",
-  "twoheadleftarrow;": "↞",
-  "UnderParenthesis;": "⏝",
-  "UpArrowDownArrow;": "⇅",
-  "vartriangleright;": "⊳",
-  "blacktriangledown;": "▾",
-  "blacktriangleleft;": "◂",
-  "DoubleUpDownArrow;": "⇕",
-  "DoubleVerticalBar;": "∥",
-  "DownLeftTeeVector;": "⥞",
-  "DownLeftVectorBar;": "⥖",
-  "FilledSmallSquare;": "◼",
-  "GreaterSlantEqual;": "⩾",
-  "LeftDoubleBracket;": "⟦",
-  "LeftDownTeeVector;": "⥡",
-  "LeftDownVectorBar;": "⥙",
-  "leftrightharpoons;": "⇋",
-  "LeftTriangleEqual;": "⊴",
-  "NegativeThinSpace;": "​",
-  "NotGreaterGreater;": "≫̸",
-  "NotLessSlantEqual;": "⩽̸",
-  "NotNestedLessLess;": "⪡̸",
-  "NotReverseElement;": "∌",
-  "NotSquareSuperset;": "⊐̸",
-  "NotTildeFullEqual;": "≇",
-  "RightAngleBracket;": "⟩",
-  "rightleftharpoons;": "⇌",
-  "RightUpDownVector;": "⥏",
-  "SquareSubsetEqual;": "⊑",
-  "twoheadrightarrow;": "↠",
-  "VerticalSeparator;": "❘",
-  "blacktriangleright;": "▸",
-  "DownRightTeeVector;": "⥟",
-  "DownRightVectorBar;": "⥗",
-  "LongLeftRightArrow;": "⟷",
-  "Longleftrightarrow;": "⟺",
-  "longleftrightarrow;": "⟷",
-  "NegativeThickSpace;": "​",
-  "NotLeftTriangleBar;": "⧏̸",
-  "PrecedesSlantEqual;": "≼",
-  "ReverseEquilibrium;": "⇋",
-  "RightDoubleBracket;": "⟧",
-  "RightDownTeeVector;": "⥝",
-  "RightDownVectorBar;": "⥕",
-  "RightTriangleEqual;": "⊵",
-  "SquareIntersection;": "⊓",
-  "SucceedsSlantEqual;": "≽",
-  "DoubleLongLeftArrow;": "⟸",
-  "DownLeftRightVector;": "⥐",
-  "LeftArrowRightArrow;": "⇆",
-  "leftrightsquigarrow;": "↭",
-  "NegativeMediumSpace;": "​",
-  "NotGreaterFullEqual;": "≧̸",
-  "NotRightTriangleBar;": "⧐̸",
-  "RightArrowLeftArrow;": "⇄",
-  "SquareSupersetEqual;": "⊒",
-  "CapitalDifferentialD;": "ⅅ",
-  "DoubleLeftRightArrow;": "⇔",
-  "DoubleLongRightArrow;": "⟹",
-  "EmptyVerySmallSquare;": "▫",
-  "NestedGreaterGreater;": "≫",
-  "NotDoubleVerticalBar;": "∦",
-  "NotGreaterSlantEqual;": "⩾̸",
-  "NotLeftTriangleEqual;": "⋬",
-  "NotSquareSubsetEqual;": "⋢",
-  "OpenCurlyDoubleQuote;": "“",
-  "ReverseUpEquilibrium;": "⥯",
-  "CloseCurlyDoubleQuote;": "”",
-  "DoubleContourIntegral;": "∯",
-  "FilledVerySmallSquare;": "▪",
-  "NegativeVeryThinSpace;": "​",
-  "NotPrecedesSlantEqual;": "⋠",
-  "NotRightTriangleEqual;": "⋭",
-  "NotSucceedsSlantEqual;": "⋡",
-  "DiacriticalDoubleAcute;": "˝",
-  "NotSquareSupersetEqual;": "⋣",
-  "NotNestedGreaterGreater;": "⪢̸",
-  "ClockwiseContourIntegral;": "∲",
-  "DoubleLongLeftRightArrow;": "⟺",
-  "CounterClockwiseContourIntegral;": "∳"
-}
index 3a298835d06e161b06f9bfe4bb8438ee57fd2993..29f76b7fde6291d6c436d562677d34bfd92c34e0 100644 (file)
@@ -1,7 +1,6 @@
 import { ParserOptions, ElementNode, NodeTypes } from '@vue/compiler-core'
 import { isVoidTag, isHTMLTag, isSVGTag } from '@vue/shared'
 import { TRANSITION, TRANSITION_GROUP } from './runtimeHelpers'
-import { decodeHtml } from './decodeHtml'
 import { decodeHtmlBrowser } from './decodeHtmlBrowser'
 
 export const enum DOMNamespaces {
@@ -15,7 +14,7 @@ export const parserOptions: ParserOptions = {
   isVoidTag,
   isNativeTag: tag => isHTMLTag(tag) || isSVGTag(tag),
   isPreTag: tag => tag === 'pre',
-  decodeEntities: __BROWSER__ ? decodeHtmlBrowser : decodeHtml,
+  decodeEntities: __BROWSER__ ? decodeHtmlBrowser : undefined,
 
   isBuiltInComponent: (tag: string): symbol | undefined => {
     if (tag === 'Transition' || tag === 'transition') {
index d8dfc98a3915bb205cd67fad9fad07f53991fc93..44d01861da20cbf5d79ac88cde9dcae9ee80e4e3 100644 (file)
@@ -215,7 +215,12 @@ function createConfig(format, output, plugins = []) {
   }
 
   function resolveExternal() {
-    const treeShakenDeps = ['source-map-js', '@babel/parser', 'estree-walker']
+    const treeShakenDeps = [
+      'source-map-js',
+      '@babel/parser',
+      'estree-walker',
+      'entities/lib/decode.js'
+    ]
 
     if (isGlobalBuild || isBrowserESMBuild || isCompatPackage) {
       if (!packageOptions.enableNonBrowserBranches) {